Cuando presiono Homesi mi entrada actual es lo suficientemente corta (digamos, <36 caracteres), funciona bien. Sin embargo, cuando escribo un comando más largo y luego quiero volver al principio, parece que hace su trabajo, pero el comando no.desplegadoya no está bien. Parece como si no estuviera al principio sino a unos 10 caracteres de distancia. Aunque si escribo "a ciegas", funciona bien, pero parece un desastre total, como si toda la entrada se desplazara hacia la derecha, pero no se volviera a dibujar. Así que escribo sobre él, pero "de hecho" no, porque el lugar que estoy "borrando" está "en realidad" 10 caracteres a la derecha. En consecuencia, si intento borrar el comando, los primeros 10 caracteres todavía se muestran, pero si lo presiono, Entersimplemente muestra otro mensaje como si la entrada anterior estuviera vacía.
Sé que no es la mejor explicación, pero el punto es que bash lo reconoce e intenta hacer lo correcto, pero a menudo falla.
Esto lo reproduzco tanto en tty como en una terminal en una sesión X. Cuando presiono Ctrl+ Vy luego Homeveo diferentes secuencias ( ^[OH
en X, ^[[1~
en tty), pero ambas parecen estar en mi /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
se muestra linux
en tty y xterm
en la sesión X.
Es
GNU bash, versión 4.2.24(2) (i686-pc-linux-gnu)
¿Alguien tiene pistas sobre esto?
Respuesta1
Debe rodear las partes que no se imprimen de su mensaje (incluidas, entre otras, las secuencias de escape para cambiar colores) con \[
y \]
.
Su mensaje original: \e[0;36m[\u@\h \W]\$ \e[m
Mensaje fijo:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
Los \[
y \]
dicen bash
que todo lo que hay en el medio en realidad no se imprime en la pantalla, es decir, tiene una longitud cero. La longitud calculada del mensaje es necesaria para saber dónde repetir los caracteres que escribe. Omitir \[ \]
hace bash
que se calcule una longitud de mensaje incorrecta, lo que a menudo conduce a un comportamiento extraño dependiente de la geometría del terminal debido a bash
la idea de dónde el cursor no coincide con la realidad.