Linux: Coloring-Bash-Prompt unterbricht den Wagenrücklauf

24

Wenn ich versuche, die bashEingabeaufforderung wie folgt einzufärben:

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

Es unterbricht den Zeilenumbruch (anstatt zu einer neuen Zeile zu wechseln, wenn die Zeile voll ist, beginnt es in derselben Zeile und löscht den eingegebenen Text).

Wenn ich die Farbfolge entferne, funktioniert es gut.
Ich benutze Ubuntu 11.10 und Terminal (guake hat auch den gleichen Fehler).

Abonec
quelle
Seltsam. Es funktioniert ohne Probleme auf RedHat 5 und Mac OS X
Matteo
Mögliches Duplikat des PS1-Problems, cmd wird
geloopt

Antworten:

42

Sie müssen alle Escape-Sequenzen zwischen \[und \]umbrechen, damit 'readline' die sichtbare Länge der Eingabeaufforderung korrekt berechnet. Ohne sie glaubt 'readline', dass die Eingabeaufforderung länger ist als sie ist, und weiß nicht, wann der Text den Rand erreicht.

PS1 = " \ [ \ e [; 31m \] [\ u @ \ h \ w] \ $ \ [ \ e [m \] "
Grawity
quelle
4
Danke vielmals!! Ich habe versucht, eine Dokumentation in den offiziellen Dokumenten zu finden, konnte diese aber nicht finden. Die Farbaufforderung "Stock" verwendet diesen "Trick", und es fiel mir zunächst schwer, herauszufinden, wofür sie genau gedacht war. Vielen Dank, dass Sie das behoben haben up --- Übrigens habe ich die Dokumentationsquelle in 'man readline 3' um Zeile 684 gefunden und es heißt, dass dies tatsächlich 'skip-csi-sequence' für diejenigen heißt, die wissen wollen, wo sich die Dokumentation dazu befindet. Ich glaube nicht, dass ich es gefunden hätte, ohne dass Sie mich auf readline (3) verwiesen hätten, obwohl ich vorher davon wusste - die Verbindung konnte nicht hergestellt werden.
Osirisgothra
Was bedeutet "wickeln"? Meinst du das Ganze wickeln IN ein \[, \]? Ich denke schon, aber es scheint nicht für mich zu funktionieren.
Max Howell
2
@osirisgothra: In der Dokumentation geht es eigentlich um eine andere Sache - sie skip-csi-sequencesoll Eingabesequenzen unterdrücken , die von Sondertasten generiert werden.
Grawity
1
@MaxHowell Sie müssen jede \e[xxmSequenz umbrechen , nicht die gesamte Zeichenfolge.
Enrico
Vielen Dank. In meinem Fall habe ich nur ersetzt \e[39mmit \[\e[;39m\]und es funktioniert gut
Herrgott
1

Der [und] Tipp funktionierte auch unter OS X 10.8.2.

Ich benutze:

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

das zeigt mir meinen aktuellen git ast im einsatz.

Steinfrucht
quelle
Kennst du schon "__git_ps1"?
Rafak
Nein. Was für eine magische Sache wird es tun?
Steinobst