将 ANSI 颜色转义序列添加到 bash 提示符会导致在调用/编辑命令时出现错误的光标位置。

19
如果我将命令提示符设置为:
export PS1='\033[0;33m[\u@\h \w]\$ \033[00m'

提示符的颜色将是黄色的,'$'字符后面的所有内容都将是默认终端颜色。这是我期望的。然而,如果我回忆起一个命令行并尝试编辑它,移动光标--无论是UpArrow/Ctrl-A(set -o emacs)还是ESC K(set -o vi),如果我正在尝试编辑的命令行足够长,光标不会定位在命令的开头。键入Ctrl-A(set -o emacs)或^(set -o vi)将不会将光标移动到屏幕上看到的已召回行的开头。同样,尝试将光标定位到行末(Ctrl-E或$,取决于)会导致它被放置在看起来是行末几个字符之后的位置。看起来bash被我添加到提示符中的转义字符所困扰。这只是我必须处理的事情吗?当我想要编辑已召回的行时,改变我的提示符为单色的,还是有一种方法可以让bash正确地允许使用彩色提示符编辑已召回的命令?
1个回答

29
你需要用\[ ... \]将非打印字符括起来,这样bash在计算提示符长度时就会忽略它们。
export PS1='\[\033[0;33m\][\u@\h \w]\$ \[\033[00m\]'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接