修改终端提示后文字不清晰

Text doesn't clear after modifying terminal prompt

注意:我是 运行 Mac OS X Sierra 但是 Ubuntu 也出现了这个问题。

我已经自定义了终端提示:

export PS1="\n\[3[1;31m\]\u   \[3[1;32m\]@ \[3[1;32m\]\h \[3[0;35m\]in \[3[0;36m\]\w\n\[3[0;34m\]> \[3[1;37m\] \e[0m"

请注意,我在末尾放置了换行符,因此我在 > 之后的新行中开始键入命令。我在很多机器上都这样做过,我注意到每当我添加换行符时,终端都会表现得很奇怪。

奇怪的是,我指的确切行为是这样的(如果您使用我提到的 PS1 值,这包括复制错误的步骤):

  1. 按向上箭头键访问旧命令。

  2. 当我在历史中遇到一个多于1个单词的命令,并且第一个单词长度超过4个字符,那么这个单词的前4个字符'stick' 到提示的初始部分。

  3. 这个'sticky part'我删不掉,再按几次上方向键也不行

例如,如果我输入的最后 4 个命令是(从最近到最近):clearman manthis thathelp

然后,当我逐渐按向上键查看之前的命令时:

help 正确可见。

this that 正确可见。

请注意 this 是如何附加在开头的。如果我尝试删除它,我将无法删除它。

在我按下向上键时继续停留。

我该如何解决这个问题?

提示中的每个转义序列都必须用 \[\] 括起来告诉 bash 为了计算列数应该忽略这些字符。你的例子中的最后一个没有被括起来:

export PS1="\n\[3[1;31m\]\u   \[3[1;32m\]@ \[3[1;32m\]\h \[3[0;35m\]in \[3[0;36m\]\w\n\[3[0;34m\]> \[3[1;37m\] \e[0m"

\e[0m

如果您修复错误,bash 可能会提供更好的结果。这显示了建议的更正;

export PS1="\n\[3[1;31m\]\u   \[3[1;32m\]@ \[3[1;32m\]\h \[3[0;35m\]in \[3[0;36m\]\w\n\[3[0;34m\]> \[3[1;37m\] \[\e[0m\]"