Linux: підказка забарвлення bash порушить повернення каретки


24

Коли я намагаюся розфарбувати bashпідказку так:

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

він порушує повернення каретки (замість того, щоб переходити до нового рядка, коли рядок заповнений, він починається в тому ж рядку та стирає вхідний текст).

Якщо я видаляю кольорову послідовність, він працює добре.
Я використовую Ubuntu 11.10 і термінал (у guake теж є така ж помилка).


Дивно. Він працює без будь-яких проблем на RedHat 5 і Mac OS X
Matteo

можливий дублікат проблеми PS1, cmd є циклічним
grawity

Відповіді:


43

Ви повинні обернути всі послідовності проходження між \[і \]для того, щоб "readline" правильно розрахував видиму довжину підказки. Без них "readline" вважає, що підказка довша, ніж є, і не знає, коли текст досягне поля.

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

4
Дякую тони !! Я намагався знайти деяку документацію про це в офіційних документах, але не міг - кольоровий рядок "запас" використовує цей "трюк", і я спершу важко розібрався, для чого саме це потрібно, тому дякую, що очистив це вгору --- btw я фактично знайшов джерело документації в "man readline 3" навколо рядка 684, і в ньому йдеться про те, що це насправді називається "skip-csi-послідовність" для тих, хто хоче знати, де знаходиться документація на це. Я не думаю, що я знайшов би це, якби ти не вказав мені на перечитати (3), хоча я знав про це раніше - не вдалося встановити з'єднання.
osirisgothra

Що означає "обгортання"? Ви маєте в виду обернути все це В\[ , \]? Я думаю, що так, але це, здається, не працює для мене.
Макс Хоуелл

2
@osirisgothra: Документація насправді говорить про іншу річ - skip-csi-sequenceпризначена для придушення вхідних послідовностей, створених спеціальними клавішами.
grawity

1
@MaxHowell вам потрібно обернути кожну \e[xxmпослідовність, а не всю рядку.
Енріко

Спасибі. У моєму випадку я просто замінити \e[39mз \[\e[;39m\]і вона відмінно працює
Herrgott

1

підказка [and] також працювала над bash на OS X 10.8.2.

Я використовую:

PS1 = "[\ e [0; 37m \ W \ $ (git гілка 2> / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [м] "

що показує мені мою поточну гілку git у використанні.


Чи знаєте ви про "__git_ps1"?
rafak

ніс. яка магічна річ це зробить?
кісточковий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.