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

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

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

桀骜

桀骜

巴什

在此输入图像描述

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

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

答案1

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

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

答案2

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让您禁用该功能:

set +o prompt_cr +o prompt_sp

这样,zsh其行为就更像传统的 shell。

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

答案3

解释:

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

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

如何删除百分号( %):

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

例子:

# Issue
$ print -n "foo"
foo%

# Solution
$ print -n "foo"; echo
foo

相关内容