Answers:
是的,发生这种情况是因为这是“分界线”。默认情况下,zsh转到下一行,以避免被提示覆盖。
保留部分行后,默认情况下,您将在部分行的末尾看到反斜杠和粗体字符:普通用户为“%”,root用户为“#”。如果设置了该参数,则可以使用shell参数PROMPT_EOL_MARK来定制如何显示分行的结尾。
PROMPT_EOL_MARK=''
.zshrc 放入以隐藏尾随换行符或不在命令输出中的区别。
这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
变量更改该标记。
print -n "this is a test"
然后print "this is a test"