Verwendung von \ r in der bash PS1

603
asmeurer

Ich war ein wenig müde von meinen Typenköpfen in Bash, weil ich die PS1 durcheinander gebracht hatte. Zum Beispiel würde ich einen Befehl ausführen, wie ls, und während er ausgeführt wird, den nächsten Befehl eingeben echo, und der Typenkopf für echoerscheint vor der PS1, wie

/$ls ... ec/$echo 

(hier /$ist das PS1). Meine Lösung für dieses Problem bestand darin \r, die Vorderseite der PS1 zu erweitern, damit zuerst die Zeile gelöscht wurde.

Dies scheint einigermaßen gut zu funktionieren, aber es scheint ein seltsames Problem zu sein. In meinem .inputrchabe ich

"\ep": history-search-backward 

Lassen Sie mich tippen M-p, um rückwärts zu gehen (iTerm 2-Maps-Option, um korrekt zu entkommen).

Das Problem ist, dass manchmal, wenn ich etwas eintippe und dann M-pzum Abrufen des vorherigen Befehls komme C-u C-k, die Zeile PS1gelöscht wird. Das erste Zeichen bleibt erhalten und wird Teil des Befehls (es wird aus der ausgeführten Zeile gelöscht, aber es wird angezeigt auf der PS1). Wenn der Befehl ausgeführt wird, wird der Befehl nicht mehr ausgeführt. Wenn Sie jedoch dieses Element in der Historie treffen, bleibt der erste Charakter selbst mit dem normalen Aufwärtspfeil wieder stecken. Dies scheint nur bei Befehlen zu passieren, die eine bestimmte Länge haben. Es spielt keine Rolle, ob der \rText tatsächlich gelöscht wird.

Trete ich in Bash und / oder iTerm einen seltsamen Fehler an? Ist das Hinzufügen \rzu der Vorderseite PS1der richtigen Art und Weise cruft bevor es löschen?

0

1 Antwort auf die Frage

1
chepner

Signal an bashdas das \rist ein nicht druckendes Zeichen, so dass die korrekte Länge der Eingabeaufforderungszeichenfolge berechnet wird, d. H

PS1='\rstuff' 

benutzen

PS1='\[\r\]stuff' 

Ich denke, da \res sich am Anfang der Eingabeaufforderung befindet, handelt es sich immer um ein Zeichen mit der Länge Null und nicht um ein Zeichen mit negativer Breite mit variabler Länge, wie es in Betracht gezogen werden könnte, wenn es in der Mitte der Eingabeaufforderung irgendwo erscheint Arbeit.

Ahh, ich wusste nicht, dass bash eine schnelle Längenberechnung durchführt. asmeurer vor 10 Jahren 0