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

10

Wenn ich drücke, Homewenn meine aktuelle Eingabe kurz genug ist (z. B. <36 Zeichen), funktioniert es einwandfrei. Wenn ich jedoch einen längeren Befehl eingegeben habe und dann zum Anfang zurückkehren möchte, scheint es, als ob es seine Aufgabe erfüllt, aber der Befehl wird nicht mehr richtig angezeigt . Es sieht so aus, als wäre ich nicht am Anfang, aber ungefähr 10 Zeichen entfernt. Wenn ich "blind" tippe, funktioniert es zwar gut, aber es sieht aus wie ein totales Durcheinander, als ob die gesamte Eingabe nach rechts verschoben, aber nicht neu gezeichnet wird. Also tippe ich darüber, aber "tatsächlich" nicht, weil der Ort, den ich "lösche", "tatsächlich" 10 Zeichen rechts ist. Wenn ich versuche, den Befehl zu löschen, werden die ersten 10 Zeichen weiterhin angezeigt. Wenn ich jedoch darauf drücke Enter, wird nur eine weitere Eingabeaufforderung angezeigt, als ob die vorherige Eingabe leer wäre.

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

Ich reproduziere dies sowohl in tty als auch in einem Terminal in einer X-Sitzung. Wenn ich Ctrl+ drücke Vund dann Homesehe ich verschiedene 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 $TERMzeigt linuxin tty und xtermin X Sitzung.

Es ist

GNU Bash, Version 4.2.24 (2) -Veröffentlichung (i686-pc-linux-gnu)

Hat jemand Hinweise dazu?

Lev Levitsky
quelle
1
Wie lange dauert Ihre Eingabeaufforderung? Füllt die Eingabe einer etwa 36 Zeichen langen Befehlszeile eine Zeile Ihres Terminals aus und führt somit zu einem seitlichen Bildlauf? Kommt es immer noch vor, wenn Sie diese Eingabeaufforderung verwenden? PS1='$ '
Mikel
@Mikel Ich weiß nicht, was du vorhast, aber du bist höchstwahrscheinlich in der Nähe des richtigen Weges. Es scheint nicht zu passieren, wenn ich die minimalistische Eingabeaufforderung verwende. Die von mir verwendete wurde im Vergleich zur Standardversion ein wenig modifiziert : PS1="\e[0;36m[\u@\h \W]\$ \e[m". Ist irgendetwas falsch daran? Die Eingabe von 36 Zeichen füllt (bei weitem) keine Zeile. Außerdem habe ich kein Side-Scrolling in tty :)
Lev Levitsky
@Mikel Ich habe den Rat von jw013 befolgt und die Eingabeaufforderung angepasst, die es zu lösen scheint. Vielleicht könnten Sie näher auf das Problem eingehen, damit ich Sie mit einem Mitarbeiter belohnen kann, der es zuerst herausfindet :)
Lev Levitsky

Antworten:

12

Sie müssen die nicht druckenden Teile Ihrer Eingabeaufforderung (einschließlich, aber nicht beschränkt auf Escape-Sequenzen zum Ändern der 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\]

Das \[und \]sagen, bashdass nicht alles dazwischen tatsächlich auf dem Bildschirm gedruckt wird, dh keine Länge hat. Die berechnete Eingabeaufforderungslänge wird benötigt, um zu wissen, wo die von Ihnen eingegebenen Zeichen wiedergegeben werden sollen. Das Weglassen von \[ \]Ursachen führt bashzur Berechnung einer falschen Eingabeaufforderungslänge, was häufig zu einem seltsamen, von der Geometrie des Terminals abhängigen Verhalten führt, bashda der Cursor nicht mit der Realität übereinstimmt.

jw013
quelle
Danke, das löst das Problem. Ich würde mich jedoch über eine Erklärung freuen: Was war der Grund für dieses Verhalten, was machen eckige Klammern usw. Es wäre schön, alles auf einer Seite zu haben und könnte in Zukunft jemand anderem helfen.
Lev Levitsky
@ LevLevitsky Ich habe der Antwort eine kurze Erklärung hinzugefügt.
jw013
Vielen Dank! Das macht für mich jetzt mehr Sinn.
Lev Levitsky