ZSH PS1 在制表时添加间距

ZSH PS1 在制表时添加间距

我在使用 zsh/oh-my-zsh 时遇到了自定义 PS1 提示符(从 bash 中引入)的问题。

当我使用内置的 zsh/oh-my-zsh 提示符和 tab 进行自动完成时,它可以按预期工作。

当我使用自己的 PS1 提示时,整个输入区域会移动大约 8 个空格并停留在那里,直到我发送一个断行/新行。

例子:

我输入了一个并带有标签

内置主题,羅比羅素使用默认提示:

内置主题,*robbyrussell* 带有默认提示:

同一主题,自定义 PS1 提示:

同一主题,自定义 PS1 提示:

.zshrc中的PS1字符串和变量定义:

# Monokai colours
D=$'\e[37;40m'
PINK=$'\e[35;40m'
GREEN=$'\e[32;40m'
ORANGE=$'\e[33;40m'    

export PS1='${PINK}andrew${D}@${ORANGE}macbook${D}:%~$ '

作为测试,我尝试了没有颜色变量的提示,它确实有效

答案1

看来 ANSI 代码正在干扰您的终端,可能是由于与其他内容的某些交互PS1或因为您没有重置为默认值。

幸运的是,在 中zsh不需要使用 ANSI 转义码。您可以使用%F{color}%K{color}分别设置前景色和背景色,以及%f%k重置默认值(请参阅Zsh 手册了解更多信息)

以下任何一种方法都可以:

PS1='%5Fandrew%f@%3Fmacbook%f:%~$ '
PS1='%F{5}andrew%f@%F{3}macbook%f:%~$ '
PS1='%F{magenta}andrew%f@%F{yellow}macbook%f:%~$ '

我使用了%f而不是%7F%F{white},假设您确实只想禁用该位置的颜色(因此将变量命名D为 而不是WHITE)。如果您想使用%F{white},则应%f在 的末尾放置PS1

如果您使用 88 色或 256 色终端,您甚至可以使用这些颜色的索引。例如,%F{221}会得到深黄色。


还请注意,通常没有必要这样做export PS1-zsh或者bash就此而言。

答案2

清洁解决方案由@Adaephon 的回答,我强烈推荐。不过,我也想告诉你造成你烦恼的原因:

问题产生的原因是将转义码计入提示符的长度。这是错误的,因为这些代码由终端仿真器处理,不会显示,并且在提示符部分重绘时会导致偏移。

但对于这种情况,可以在提示字符串中使用特殊语法。引用自man zshmisc

%{...%} 将字符串作为文字转义序列包含在内。括号内的字符串不应改变光标位置。括号对可以嵌套。

因此,在你的例子中,你最终会得到

PS1='%{${PINK}%}andrew%{${D}%}@%{${ORANGE}%}macbook%{${D}%}:%~$ '

它看起来很丑陋并且难以阅读,但是可以按预期工作。

最后还要说明一下:如果使用PS1='...'(单引号),则需要选项提示替换激活,这样每次显示提示时,颜色转义码都会被替换。如果使用PS1="..."(双引号),则定义时会替换一次转义码PS1。后者不是动态的,但在您的特定情况下已经足够了。

相关内容