Linux:着色bash提示将打破回车符


24

当我尝试bash像这样使提示变色时:

export PS1="\e[0;31m[\u@\h \W]\$ \e[m "

它破坏了回车符(而不是在行已满时转到新行,而是从同一行开始并擦除输入文本)。

如果我删除颜色序列,则效果很好。
我使用Ubuntu 11.10和终端(guake也有相同的错误)。


奇怪。它的工作原理W / O任何问题,在RedHat 5和Mac OS X
利玛窦

Answers:


43

您必须在\[和之间包装所有转义序列\],以使“ readline”能够正确计算提示的可见长度。没有它们,“ readline”会认为提示的时间长于提示,并且不知道文本何时到达空白处。

PS1 =“ \ [ \ e [; 31m \] [\ u @ \ h \ W] \ $ \ [ \ e [m \]

4
万分感谢!!我试图在官方文档中找到一些文档,但无法-“ stock”(彩色)提示确实采用了“ trick”(技巧),我一开始很难弄清楚它的确切用途,因此感谢您清除向上-顺便说一句,我确实在684行的“ man readline 3”中找到了文档来源,它说对于那些想知道此文档在哪里的人来说,这实际上称为“ skip-csi-sequence”。我想如果没有您将我指向readline(3),即使我在未能建立连接之前就知道它,我也不会找到它。
osirisgothra

“包装”是什么意思?你的意思是包住整个事情\[\]?我想是的,但似乎对我没有用。
Max Howell

2
@osirisgothra:文档实际上是在讨论另一件事– skip-csi-sequence意图是抑制由特殊键生成的输入序列。
grawity 2014年

1
@MaxHowell您必须包装每个\e[xxm序列,而不是整个字符串。
恩里科

谢谢。就我而言,我只是替换\e[39m\[\e[;39m\]它,并且效果很好
Herrgott

1

[and]技巧也适用于OS X 10.8.2上的bash。

我用:

PS1 =“ [\ e [0; 37m \ W \ $(git branch 2> / dev / null | grep -e'*'| sed's / ^ ..(。*)/ {\ 1} /') \ $ \ e [m]“

这显示了我当前正在使用的git分支。


您知道“ __git_ps1”吗?
拉夫

不。它会做什么神奇的事情?
核果
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.