Home-Taste verhält sich in Bash (tty und X) bei langen Eingabezeichenfolgen seltsam

Home-Taste verhält sich in Bash (tty und X) bei langen Eingabezeichenfolgen seltsam

Wenn ich drücke Home, ob meine aktuelle Eingabe kurz genug ist (sagen wir, <36 Zeichen), funktioniert es einwandfrei. Wenn ich jedoch einen längeren Befehl eingegeben habe und dann zum Anfang zurückkehren möchte, scheint es zwar zu funktionieren, aber der Befehl funktioniert nicht.angezeigtmehr richtig. Es sieht so aus, als wäre ich nicht am Anfang, sondern etwa 10 Zeichen daneben. Wenn ich zwar "blind" tippe, klappt es zwar einwandfrei, aber es sieht aus wie ein totales Durcheinander, als würde die ganze Eingabe nach rechts verschoben, aber nicht neu gezeichnet. Ich tippe also drüber, aber "eigentlich" nicht, denn die Stelle, die ich "lösche", liegt "eigentlich" 10 Zeichen weiter rechts. Wenn ich also versuche, den Befehl zu löschen, werden zwar noch die ersten 10 Zeichen angezeigt, wenn ich aber drücke, wird Enternur eine weitere Eingabeaufforderung angezeigt, als wäre die vorherige Eingabe leer gewesen.

Ich weiß, das ist nicht die beste Erklärung, aber der Punkt ist, dass Bash es erkennt und versucht, das Richtige zu tun, was aber oft fehlschlägt.

Ich reproduziere dies sowohl in tty als auch in einem Terminal in einer X-Sitzung. Wenn ich Ctrl+ Vund dann drücke Home, sehe ich unterschiedliche Sequenzen ( ^[OHin X, ^[[1~in tty), aber beide scheinen in meinem zu sein /etc/inputrc:

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

echo $TERMlinuxwird im TTY und in der X-Sitzung angezeigt xterm.

Es ist

GNU Bash, Version 4.2.24(2)-Release (i686-PC-Linux-Gnu)

Hat jemand Hinweise dazu?

Antwort1

Sie müssen die nicht druckbaren Teile Ihrer Eingabeaufforderung (einschließlich, aber nicht beschränkt auf Escape-Sequenzen zum Ändern von Farben) mit \[und umgeben \].

Ihre ursprüngliche Eingabeaufforderung: \e[0;36m[\u@\h \W]\$ \e[m
Behobene Eingabeaufforderung:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

Die \[und \]zeigen an bash, dass alles dazwischen nicht wirklich auf dem Bildschirm gedruckt wird, also eine Länge von Null hat. Die berechnete Eingabeaufforderungslänge wird benötigt, um zu wissen, wo die eingegebenen Zeichen wiedergegeben werden sollen. Das Weglassen \[ \]führt dazu bash, dass eine falsche Eingabeaufforderungslänge berechnet wird, was häufig zu einem merkwürdigen, von der Terminalgeometrie abhängigen Verhalten führt, da bashdie Vorstellung von , wo sich der Cursor befindet, nicht mit der Realität übereinstimmt.

verwandte Informationen