Lorsque je frappe Homesi mon entrée actuelle est suffisamment courte (disons <36 caractères), cela fonctionne bien. Cependant, lorsque j'ai tapé une commande plus longue et que je veux revenir au début, il semble que cela fasse son travail, mais la commande ne s'affiche plus correctement. Il semble que je ne sois pas au début, mais à environ 10 caractères de moins. Bien que si je tape "aveuglément", cela fonctionne très bien, mais cela ressemble à un gâchis total, comme si l'entrée entière était décalée vers la droite, mais pas redessinée. Donc je tape dessus, mais "en fait" non, car l'endroit que je "gomme" est "en fait" 10 caractères à droite. Par conséquent, si j'essaie d'effacer la commande, les 10 premiers caractères sont toujours affichés, mais si je la frappe, Entercela affiche simplement une autre invite comme si l'entrée précédente était vide.
Je sais que ce n'est pas la meilleure explication jamais, mais le fait est que bash le reconnaît et essaie de faire la bonne chose, mais échoue souvent.
Je reproduis cela à la fois en tty et dans un terminal dans une session X. Quand je tape Ctrl+ Vet puis Homeje vois différentes séquences ( ^[OH
en X, ^[[1~
en tty), mais les deux semblent être dans mon /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
montre linux
en tty et xterm
en session X.
Ses
GNU bash, version 4.2.24 (2) -release (i686-pc-linux-gnu)
Quelqu'un a des indices à ce sujet?
la source
PS1='$ '
PS1="\e[0;36m[\u@\h \W]\$ \e[m"
. Y a-t-il quelque chose qui cloche? Taper 36 caractères ne remplit pas une ligne (de loin). De plus, je n'ai pas de défilement latéral en tty :)Réponses:
Vous devez entourer les parties non imprimables de votre invite (y compris, mais sans s'y limiter, les séquences d'échappement pour changer les couleurs) avec
\[
et\]
.Votre invite d'origine:
\e[0;36m[\u@\h \W]\$ \e[m
invite fixe:
\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
Le
\[
et\]
indiquebash
que tout ce qui se trouve entre les deux ne s'imprime pas réellement à l'écran, c'est-à-dire qu'il n'a aucune longueur. La longueur de l'invite calculée est nécessaire pour savoir où faire écho aux caractères que vous tapez. Laisser de côté\[ \]
entraînebash
le calcul d'une longueur d'invite incorrecte, ce qui conduit souvent à un comportement étrange dépendant de la géométrie du terminal en raison debash
l'idée de l'endroit où le curseur ne correspond pas à la réalité.la source