如何在我的zsh提示符下放置换行符而不引起终端重画问题?


12

我正在尝试通过zsh提示符修复一个小问题(但很烦人)。我看到的问题是,当我在GUI OS环境中使用终端(例如,OS X 10.7.2上的Terminal.app或iTerm 2)并调整终端窗口的大小时,会使用额外的提示重新绘制终端。

我已经在包含以下内容的干净的.zshrc上重现了该问题:

export PROMPT=">
"

要明确的是,这是两行文件。字符串中有一个文字换行符,我已经在几个(公认的是旧的)地方读过,这是解决之道。这一直有效,直到我调整终端窗口的大小为止,这时我得到了重复的提示字符串。例如,如果我打开一个新窗口,则会看到(*被用作游标的占位符):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

然后,当我调整窗口大小,使其更短时,最终得到:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

额外的即时打印输出的数量似乎与我改变窗口大小(通常是垂直方向)的大小成正比。如果我从提示字符串中删除换行符,问题就消失了。

我已经尝试过各种方法,例如$(print ">\n")或尝试将换行符包装在中%{%}。我假设这与以下事实有关:换行符混淆了绘制提示字符串实际上是多长时间的东西。这个问题可以解决吗?还是我只需要忍受?

Answers:


13

此问题是由于ZSH如何在调整大小事件上重印提示,并且之前也让我感到烦恼。解决方案是使$PROMPT单行显示并使用precmd打印提示的第一行。

因此,在您的示例中,将简单地是:

precmd() { print ">" }
export PROMPT=""

或者对于在print语句中迅速扩展的更复杂的示例,请使用以下-rP参数:

precmd() { print -rP "%~" }
export PROMPT="%# "

如果您注册了多个precmd,则需要使用add-zsh-hook precmd(请参阅参考资料man zshcontrib)。


1
对于像我这样的新手,您可以在这里查看-rP的含义: cs.elte.hu/zsh-manual/zsh_17.html。看来这print是ZSH特有的命令,而Google搜索“ linux print”不会给您很好的效果。
MikeWyatt 2012年

print是zsh的一部分。您可以在中查看帮助man zshbuiltins。Bash有它自己的等效项,但是我不确定它们是否兼容。
Jim Stewart

10

这样的事情怎么样:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

我比接受的答案更喜欢这种解决方案。它更便于移植,并允许我在zsh和bash环境之间维护相同的脚本
2015年
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.