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

7760
Abonec

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

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

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

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

21
Странный. Это работает без каких-либо проблем на RedHat 5 и Mac OS X Matteo 12 лет назад 0
возможный дубликат [проблема PS1, cmd зацикливается] (http://superuser.com/questions/311511/ps1-problem-cmd-is-looping) grawity 12 лет назад 0

2 ответа на вопрос

37
grawity

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

PS1 = " \ [ \ e [; 31 м \] [\ u @ \ h \ W] \ $ \ [ \ e [м \] " 
Благодаря тонну!! я пытался найти некоторую документацию по нему в официальных документах, но не смог - цветовая подсказка «сток» действительно использует этот «трюк», и мне было трудно сначала выяснить, для чего именно он был нужен, так что спасибо за очистку этого up --- кстати, я действительно нашел источник документации в 'man readline 3' вокруг строки 684, и он говорит, что это на самом деле называется 'skip-csi-sequence' для тех, кто хочет знать, где находится документация по этому вопросу. Я не думаю, что нашел бы это, если бы вы не указали мне на readline (3), хотя я знал об этом раньше - не смог установить соединение. osirisgothra 11 лет назад 3
Что значит "обернуть"? Ты имеешь в виду завернуть все это * IN * a `\ [`, `\]`? Я думаю, но это, похоже, не работает для меня. Max Howell 10 лет назад 0
@osirisgothra: документация на самом деле говорит о другом - skip-csi-sequence` предназначена для подавления ** входных ** последовательностей, генерируемых специальными ключами. grawity 9 лет назад 1
@MaxHowell вы должны обернуть каждую последовательность `\ e [xxm`, а не всю строку. Enrico 7 лет назад 1
Благодарю. В моем случае я просто заменил `\ e [39m` на` \ [\ e [; 39m \] `, и он отлично работает Herrgott 5 лет назад 0
Обратите внимание, что `\ e [; 39m` расширяется до` \ e [0; 39m`, что означает "сбросить все форматирование, _then_ установить цвет на 39". Это хорошо в подсказках, но это никак не связано с моим постом о `\ [\]`. grawity 5 лет назад 0
1
stonefruit

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

Я использую:

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

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

Знаете ли вы о "__git_ps1"? rafak 10 лет назад 0
nopes. какую волшебную вещь он будет делать? stonefruit 10 лет назад 0

Похожие вопросы