Linux: раскраска bash заставит сломать возврат каретки


24

Когда я пытаюсь раскрасить bashподсказку так:

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

он прерывает возврат каретки (вместо перехода на новую строку, когда строка заполнена, он начинается с той же строки и стирает введенный текст).

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


Странный. Это работает без каких-либо проблем на RedHat 5 и Mac OS X
Matteo

Ответы:


43

Вы должны обернуть все escape-последовательности между \[и \]для того, чтобы readline правильно вычислял видимую длину подсказки. Без них readline думает, что подсказка длиннее, и не знает, когда текст достигает поля.

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

4
Благодаря тонну!! я пытался найти некоторую документацию по нему в официальных документах, но не смог - цветовая подсказка «сток» действительно использует этот «трюк», и мне было трудно сначала выяснить, для чего именно он нужен, так что спасибо за очистку этого up --- Кстати, я действительно нашел источник документации в 'man readline 3' вокруг строки 684, и он говорит, что это на самом деле называется 'skip-csi-sequence' для тех, кто хочет знать, где находится документация по этому вопросу. Я не думаю, что нашел бы это, если бы вы не указали мне на readline (3), хотя я знал об этом раньше - не смог установить соединение.
osirisgothra

Что значит "обернуть"? Вы имеете в виду обернуть все это В\[ , \]? Я думаю, но это, похоже, не работает для меня.
Макс Хауэлл

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

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

Спасибо. В моем случае я просто заменил \e[39mна, \[\e[;39m\]и он отлично работает
Херрготт

1

[и] совет работал на bash и в OS X 10.8.2.

Я использую:

PS1 = "[\ e [0; 37 м \ W \ $ (ветвь git 2> / dev / null | grep -e '*' | sed 's / ^ .. (. *) / {\ 1} /') \ $ \ e [м] "

который показывает мне мою текущую используемую ветку git.


Знаете ли вы о "__git_ps1"?
Рафак

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