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 ( ^[OH
in 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 $TERM
zeigt linux
in tty und xterm
in X Sitzung.
Es ist
GNU Bash, Version 4.2.24 (2) -Veröffentlichung (i686-pc-linux-gnu)
Hat jemand Hinweise dazu?
quelle
PS1='$ '
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 :)Antworten:
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,bash
dass 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ührtbash
zur Berechnung einer falschen Eingabeaufforderungslänge, was häufig zu einem seltsamen, von der Geometrie des Terminals abhängigen Verhalten führt,bash
da der Cursor nicht mit der Realität übereinstimmt.quelle