Durch die Suche nach dem umgekehrten Verlauf in Bash gefolgt von den Pfeiltasten wird der Cursor an der falschen Stelle angezeigt

10

Ich habe festgestellt, dass der Cursor bei der Reverse-History-Suche über die Befehlszeile über CTRL+ roft, wenn ich den Befehl bearbeiten möchte, manchmal an die falsche Position springt, wenn ich eine Pfeiltaste drücke oder CTRL+ aoder CTRL+ eingebe e. Die spezifische Position, zu der es springt, scheint ein Versatz zu sein, der der Größe meiner Eingabeaufforderung entspricht, wie in festgelegt PS1.

Dies führt zu Schwierigkeiten, da sich die tatsächliche Position des Cursors von der auf dem Bildschirm gerenderten unterscheidet. Zukünftige Änderungen am Befehl werden so gerendert, als ob sich der Cursor dort befindet, wo er gesprungen ist, aber der eigentliche Befehl behält die richtige Position ohne Sprung bei.

Weiß jemand, was dies verursacht oder wie man es behebt?

EDIT: Wenn ich am Ende des PS1Problems eine neue Zeile hinzufüge, scheint das Problem zu verschwinden . Ich würde es jedoch vorziehen, den Befehl in derselben Zeile wie die Eingabeaufforderung einzugeben.

Jonderry
quelle

Antworten:

6

Dies wird häufig durch Befehle in Ihrem Verlauf verursacht, die länger als eine Zeile sind. Wenn Sie ein kürzeres Element aus dem Verlauf auswählen, scheint es die Breite der Eingabeaufforderung beim erneuten Rendern der Befehlszeile nicht zu berücksichtigen, sodass alles nach diesem langen Befehl fehlerhaft ist.

Die einfache Lösung, die ich gefunden habe, besteht darin, die Home-Taste zu drücken, "Echo" einzufügen und die Eingabetaste zu drücken. Rufen Sie dann den letzten Befehl auf und bearbeiten Sie ihn von dort aus. (Zuerst das Echo entfernen. :)

cabbey
quelle
Danke, das habe ich erst vor einiger Zeit versucht. In meinem Fall war ich nachlässig und habe eine Datei weggeblasen, weil der Befehl eine Pipe enthielt, die das Echo verschluckte. Sie haben Recht, dies scheint nach meinen Experimenten nur lange Befehle zu beeinflussen.
Jonderry
Eine bessere Lösung als das Echo, das ich gerade gefunden habe: Fügen Sie ein '#' an den Zeilenanfang an und nicht ein Echo. Auf diese Weise behandelt bash die gesamte Zeile wie einen Kommentar.
Jonderry
1
Noch besser: Das Problem scheint zu verschwinden, wenn die aktuelle Linie neu gezeichnet wird. Entweder Cl, um den Bildschirm zu löschen und die aktuelle Zeile neu zu zeichnen, oder eine Tastenkombination für die ungebundene Funktion Redraw-current-line erstellen.
Jonderry
Ich habe vergessen, die Cl-Lösung zu erwähnen, da ich es wirklich hasse, den Bildlaufpuffer zu verlieren, aber ja, es ist ein vorübergehender Rendering-Fehler in der Verlaufsnavigation. Wenn Sie also ein Neuzeichnen erzwingen, wird dies behoben. Redraw-Current-Line klingt nach einer noch besseren Lösung!
Cabbey
13

Möglicherweise haben Sie nicht druckbare Escape-Sequenzen in PS1, die nicht in \ [und \] enthalten sind.

Stellen Sie sicher, dass Sie alle wie folgt beigefügt haben:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somov
quelle
1
Funktioniert hervorragend, wenn Sie nur die nicht \[\]
druckbaren