自定义终端提示会覆盖自身,并且通常在 OS X Terminal.app 上表现不正常

Jak*_*les 4 terminal bash macos

我在 bash_profile 中设置了以下提示:

export PS1='\[\e[1;94m\h:\W \u\e[1;93m\$\e[0m \]'
# default = '\h:\W \u\$ '
Run Code Online (Sandbox Code Playgroud)

不幸的是,在某些情况下我遇到了问题:

  • 在空白提示下,我输入一个字符,然后按退格键 - 提示被完全删除,光标移到终端的左边缘,而不是简单地删除该字符

  • 如果我使用向上和向下箭头键自动完成跨越多行的命令,则只有当前行更改,但上面的行(在提示之后)保持不变

我如何更正我的提示,使其在所有情况下都像默认提示一样正常运行?

Gor*_*son 6

您需要\[ ... \]提示的非打印部分(即转义序列),而不是整个内容。由于您在整个事物周围都有它们,因此 bash 无法确定提示在屏幕上占用了多少空间,并且会在错误的位置重绘命令。它应该是这样的:

export PS1='\[\e[1;94m\]\h:\W \u\[\e[1;93m\]\$\[\e[0m\] '
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清 Gordons 的答案,如果您使用原始问题中的颜色,您需要用 \\[ 和 \\] 包装颜色代码。这适用于未打印在屏幕上的任何代码。 (2认同)