如何在 zsh 提示符中放置换行符而不导致终端重绘问题?

如何在 zsh 提示符中放置换行符而不导致终端重绘问题?

我正在尝试修复 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"),或者尝试将换行符换行%{%}。我猜想这与换行符混淆了正在绘制的内容以及提示字符串的实际长度有关,或者其他原因。这个问题可以解决吗?还是我只能忍受它?

答案1

此问题是由于 ZSH 在调整大小事件时重新打印提示符的方式造成的,以前也困扰过我。解决方案是将其设为$PROMPT单行并使用 precmd 打印提示符的第一行。

因此在您的示例中,这将简单为:

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

或者对于更复杂的例子,在打印语句中使用提示扩展,使用以下-rP参数:

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

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

答案2

那么像这样的事情怎么样:

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

相关内容