为什么 ZSH 以突出显示的百分比符号结束一行?

jkt*_*vis 106 bash prompt zsh newlines

我有时会在各种应用程序中注意到这一点。我经常认为这是因为输出被提前取消(例如 ctrl+c)或类似的东西,而 zsh 正在填充一个新行字符。但是现在好奇心占据了我的心,因为它在 bash 中似乎没有做到这一点。

zsh

zsh

猛击

在此处输入图片说明

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

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

Lei*_*iaz 101

是的,发生这种情况是因为它是“部分行”。并且默认情况下zsh 转到下一行以避免被 prompt 覆盖

保留部分行时,默认情况下,您将在部分行的末尾看到一个反加粗体字符:普通用户为“%”,root 用户为“#”。如果设置,shell 参数 PROMPT_EOL_MARK 可用于自定义部分行结尾的显示方式。

  • 我现在已经将 `PROMPT_EOL_MARK=''` 放入我的 .zshrc 以隐藏命令输出中尾随换行符与否之间的差异。 (20认同)
  • 为了测试这样做:`print -n "this is a test"` 然后`print "this is a test"` (9认同)

Sté*_*las 38

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

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

bash-4.4$ printf XXX
XXXbash-4.4$
Run Code Online (Sandbox Code Playgroud)

这会破坏提示,而且很容易错过XXX那里,特别是如果您有这样一个更高级的提示。它还会影响光标定位,从而在您四处移动光标时导致显示故障。

zsh解决这个问题,通过显示输出有一个带有%粗体和反向视频字符的未终止行,并在下一行的开头发出下一个提示:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$
Run Code Online (Sandbox Code Playgroud)

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

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

现在,这仅在终端确实换行时才有效(例如,在 之后将无法正常工作tput rmam)。如果你有一个慢速终端(比如在 9600 波特串行线上),你实际上可能会看到那些%被显示出来然后在每个命令之后被删除,所以zsh让你禁用该功能:

unsetopt prompt_cr prompt_sp
Run Code Online (Sandbox Code Playgroud)

这样,zsh表现得更像传统的 shell。

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


小智 12

解释:

行尾的百分号 ( %) 表示缺少换行符 ( \n)。

例如,printf "foo"结果为foo%. 将换行符添加到字符串 中printf "foo\n"会产生foo

如何删除百分号( %):

要删除百分号,请在代码后附加; echo.

例子:

# Issue
$ print -n "foo"
foo%

# Solution
$ print -n "foo"; echo
foo
Run Code Online (Sandbox Code Playgroud)