Linux: kolorowanie zachęty przerywa powrót karetki


24

Kiedy próbuję pokolorować bashmonit w następujący sposób:

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

przerywa powrót karetki (zamiast przejścia do nowego wiersza, gdy wiersz jest pełny, zaczyna się w tym samym wierszu i usuwa tekst wejściowy).

Jeśli usunę sekwencję kolorów, będzie działać dobrze.
Używam Ubuntu 11.10 i terminala (guake ma również ten sam błąd).


Dziwne. Działa bez żadnych problemów w RedHat 5 i Mac OS X
Matteo,

możliwe duplikat problemu PS1, cmd
zapętla się

Odpowiedzi:


43

Musisz owinąć wszystkie sekwencje specjalne między \[i \], aby „readline” poprawnie obliczył widoczną długość monitu. Bez nich „readline” uważa, że ​​podpowiedź jest dłuższa niż jest w rzeczywistości i nie wie, kiedy tekst osiągnie margines.

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

4
Wielkie dzięki !! starałem się znaleźć dokumentację na ten temat w oficjalnych dokumentach, ale nie mogłem - podpowiedź koloru „zapasowego” wykorzystuje tę „sztuczkę” i na początku miałem problem z ustaleniem, po co to dokładnie było, więc dziękuję za wyjaśnienie, że w górę --- btw faktycznie znalazłem źródło dokumentacji w 'man readline 3' wokół linii 684 i mówi, że tak naprawdę nazywa się to 'skip-csi-sekwencja' dla tych, którzy chcą wiedzieć, gdzie znajduje się dokumentacja na ten temat. Nie sądzę, żebym go znalazł, gdybyś nie wskazał mi na readline (3), chociaż wiedziałem o tym wcześniej - nie udało mi się nawiązać połączenia.
osirisgothra

Co oznacza „zawijanie”? Czy chodziło Ci owinąć całość IN\[ , \]? Chyba tak, ale wydaje mi się, że to nie działa.
Max Howell,

2
@osirisgothra: Dokumentacja faktycznie mówi o innej rzeczy - skip-csi-sequencema na celu tłumienie sekwencji wejściowych generowanych przez specjalne klucze.
grawitacja

1
@ MaxHowell musisz owinąć każdą \e[xxmsekwencję, a nie cały ciąg.
Enrico

Dzięki. W moim przypadku po prostu zastąpić \e[39mz \[\e[;39m\]i działa dobrze
Herrgott

1

wskazówka [i] działała również w bash na OS X 10.8.2.

Używam:

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

co pokazuje mi moją aktualnie używaną gałąź git.


Czy wiesz o „__git_ps1”?
rafak

nie co to magiczne zrobi?
kamienne owoce
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.