在终端PS1中如何换行修复

13

我有这个代码来给我的终端着色:

export PS1="\e[1;30m\][\e[\e[1;30m\]\e[1;33m\] \u@\H \[\e[1;32m\]\w\[\e[0m\] \e[1;30m\]]\n[\[ \e[1;31m\]\T\[\e[0m\]\e[1;30m\] ] > \e[37m\]"

但我有一个问题,当文本应该在新行时,它会覆盖第一行。
例如:
1个回答

20
为了让bash计算出您的提示符占用了多少屏幕空间(从而确定实际命令行的起始位置),您需要用\[...\]括起提示符中不可打印的部分。大多数情况下,这意味着需要将转义序列(如\e[1;30m)写成\[\e[1;30m\]。您的提示符中有一些\[\],但它们的位置不正确,这让bash非常困惑。找到您的提示符中所有可打印和不可打印的部分是很复杂的,但我认为以下内容是正确的:
export PS1='\[\e[1;30m[\e[\e[1;30m\e[1;33m\] \u@\H \[\e[1;32m\]\w\[\e[0m\] \[\e[1;30m\]]\n[ \[\e[1;31m\]\T\[\e[0m\e[1;30m\] ] > \[\e[37m\]'

2
我曾经遇到过同样的问题,感谢您指出需要将每个非打印部分包含在 \[ ... \] 中。 - pbojinov
1
太棒了 - 如果不像你所说的那样在PS1中使用\[\]来包围颜色转义序列,当使用向上箭头选择之前的命令时,光标位置会失去同步。 - Brent Faust

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