为什么当窗口太窄时我的 zsh 提示符会向上移动?

为什么当窗口太窄时我的 zsh 提示符会向上移动?

我有一个奇怪的行为,似乎是 zsh 和 urxvt 的组合(?)我的设置是这样的:我开始为自己获取一个作为默认 shellurxvt -e 'tmux'启动的终端。zsh

然后我开始定制我的$PROMPT,它现在看起来像这样:

 zstyle ':vcs_info:*' enable git svn hg bzr
 zstyle ':vcs_info:*' formats $' \e[0;33m(%s:%b)\e[0m'
 precmd () { vcs_info }
 PROMPT+=$'\e[0;31m%n\e[0m'
 PROMPT+="@"
 PROMPT+=$'\e[0;34m%m\e[0m'
 PROMPT+=":"
 PROMPT+=$'\e[0;36m%3c\e[0m'
 PROMPT+=$'\e[0;33m%c\e[0m'
 PROMPT+='${vcs_info_msg_0_}'
 export PROMPT

您可能会注意到第二%c行,这当然是为了测试。

提示符的正常行为是在按下 Enter 后创建新行,并可选择执行可能存在的命令。新行会被打印出来。但是,我注意到在某些情况下会出现不同的行为:按下 Enter 后,命令会被执行并显示输出。然而,当前一个提示符不在终端顶部时,前一个输出的最后一行将被覆盖,因为整个新输出向上移动了一行。

也许需要举个例子。从一个空的终端和一个新提示开始:

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

现在我们进入ls -la此目录(示例输出):

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

请注意缺少了一些东西,实际上.git这里有一个目录:

drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .git

这里发生的事情很容易描述:命令输出正确生成,但提示行向上移动了一行并覆盖了最后一行输出。所以如果我再次执行相同的操作,我的输出将如下所示:

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

正如您所见,所有内容再次被向上移动,这次替换了..来自上一个输出的和.git来自这个输出的。

但并非所有设置都会发生这种情况。只有当窗口太窄时才会发生这种情况。此外,我还通过调整打开的 urxvt 窗口的大小(其中包含 zsh)对此进行了测试。当我将其调得太窄时。据我所知,一旦提示符占据窗口宽度的三分之二左右,它就会启动。但是,我不知道为什么这次就发生了这种情况。

需要注意的是: - 在 bash 中不会发生这种情况(即使提示符本身是多行的) -RPROMPT并且RPROMPT2为空 - 它似乎与显示的信息类型无关(即,vcs_info只有当提示符再次变得足够短时,禁用才有帮助) - 在提示符是多行时不会发生这种情况(并且第二行未达到三分之二的标记) - 在控制台(tty)中不会发生这种情况,但在 xterm 中会发生这种情况urxvt。

概括:如果提示行大约占窗口长度的三分之二,我的 zsh 提示符就会向上移动。

答案1

我似乎已经通过使用%{fg[color]%}bash 颜色代码来修复它(当然,为此我需要加载颜色模块)。

相关内容