为什么ZSH用高亮的百分比符号结束一行?


46

我有时会在各种应用程序中注意到这一点。我经常以为这是因为输出被提前取消(例如ctrl + c)或类似的操作,而zsh则填充了新的换行符。但是现在,好奇心已经成为我最好的,因为它似乎并没有做到那么快。

sh

sh

重击

在此处输入图片说明

Sequence程序是我在阅读Java认证时从书中摘录的,只是想看看它是否可以编译和运行。我确实注意到它没有使用包/类中的println()方法System.out。相反,它使用普通old print()

缺少换行符是我得到此符号的原因吗?

Answers:


57

是的,发生这种情况是因为这是“分界线”。默认情况下,zsh转到下一行,以避免被提示覆盖

保留部分行后,默认情况下,您将在部分行的末尾看到反斜杠和粗体字符:普通用户为“%”,root用户为“#”。如果设置了该参数,则可以使用shell参数PROMPT_EOL_MARK来定制如何显示分行的结尾。


3
为了进行测试,请执行以下操作: print -n "this is a test"然后print "this is a test"
SergioAraujo

5
现在,我已将PROMPT_EOL_MARK=''.zshrc 放入以隐藏尾随换行符或不在命令输出中的区别。
geekQ

14

zsh(现在fish也是)的特定功能是让您清楚地看到命令输出中的未终止行。

在传统的shell中,如果命令在最后一个换行符之后输出一些数据,或者换句话说,如果该命令使终端光标不在该行的开头,则该shell的下一个提示符将附加到最后一个未终止的行如:

bash-4.4$ printf XXX
XXXbash-4.4$

那会弄乱提示,很容易错过XXX那里,特别是如果您有这样一个更好的提示。它还会影响光标的位置,当您四处移动光标时会导致显示故障。

zsh解决该问题的方法是,通过显示输出具有不终止行的%粗体和反向视频字符,并在下一行的开始处发出下一个提示:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

它通过%每个命令的末尾(在每个提示之前)输出反向视频来实现这一点,但是在其后跟随79个空格(假设终端的字符宽度为80个字符),CR字符(导致光标返回第一个字符的字符)列)和要擦除到行尾的序列(然后是提示)。

这样,如果存在未终止的行,则由于光标不在第一位置,这80个字符将使光标移至下一行(并且%将保持不变)。如果不是,那么那%和那79个空格将在一行上,此后将被删除。

现在,这仅在终端机确实进行换行时才有效(例如,不能在之后换行tput rmam)。如果您的终端运行缓慢(例如9600波特串行线路上的终端),则实际上您可能会看到这些%显示内容,然后在每个命令之后将其删除,因此zsh可以禁用该功能:

unsetopt prompt_cr prompt_sp

这样,zsh行为就更像传统的外壳。

您也可以使用$PROMPT_EOL_MARK变量更改该标记。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.