我有一个奇怪的行为,似乎是 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 颜色代码来修复它(当然,为此我需要加载颜色模块)。