我在使用 zsh/oh-my-zsh 时遇到了自定义 PS1 提示符(从 bash 中引入)的问题。
当我使用内置的 zsh/oh-my-zsh 提示符和 tab 进行自动完成时,它可以按预期工作。
当我使用自己的 PS1 提示时,整个输入区域会移动大约 8 个空格并停留在那里,直到我发送一个断行/新行。
例子:
我输入了一个并带有标签
内置主题,羅比羅素使用默认提示:
同一主题,自定义 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
。后者不是动态的,但在您的特定情况下已经足够了。