La tecla de inicio actúa de forma extraña en bash (tty y X) en cadenas de entrada largas

11

Cuando presiono Homesi mi entrada actual es lo suficientemente corta (por ejemplo, <36 caracteres), funciona bien. Sin embargo, cuando escribí un comando más largo y luego quiero volver al principio, parece que hace su trabajo, pero el comando ya no se muestra correctamente. Parece que no estoy al principio, pero tengo unos 10 caracteres de distancia. Aunque si escribo "a ciegas", funciona bien, pero parece un desastre total, como si toda la entrada se desplaza hacia la derecha, pero no se vuelve a dibujar. Entonces escribo sobre él, pero "de hecho" no, porque el lugar que estoy "borrando" es "en realidad" 10 caracteres a la derecha. En consecuencia, si trato de borrar el comando, los primeros 10 caracteres todavía se muestran, pero si lo presiono Enter, solo aparece 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.

Reproduzco esto tanto en tty como en una terminal en una sesión X. Cuando presiono Ctrl+ Vy luego Homeveo diferentes secuencias ( ^[OHen 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 $TERMse muestra linuxen tty y xtermen la sesión X.

Sus

GNU bash, versión 4.2.24 (2) -release (i686-pc-linux-gnu)

¿Alguien tiene pistas sobre esto?

Lev Levitsky
fuente
1
¿Cuánto dura tu aviso? ¿Escribir una línea de comando de unos 36 caracteres de largo llena una línea de su terminal y, por lo tanto, causa desplazamiento lateral? ¿Sigue sucediendo si usa este aviso? PS1='$ '
Mikel
@Mikel No sé lo que tienes en mente, pero probablemente estés cerca del camino correcto. No parece suceder cuando uso el indicador minimalista. El que yo utilicé fue un poco modificada, en comparación con la opción por defecto: PS1="\e[0;36m[\u@\h \W]\$ \e[m". ¿Hay algo malo en ello? Escribir 36 caracteres no llena una línea (de lejos). Además, no tengo desplazamiento lateral en tty :)
Lev Levitsky
@Mikel Seguí el consejo de jw013 y ajusté el mensaje, eso parece resolverlo. Tal vez podría explicar cuál era el problema para poder recompensarlo con algún representante como el primero en resolverlo :)
Lev Levitsky

Respuestas:

13

Debe rodear las partes que no se imprimen de su solicitud (incluidas, entre otras, las secuencias de escape para cambiar los colores) con \[y \].

Su mensaje original: \e[0;36m[\u@\h \W]\$ \e[m
Mensaje fijo:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

El \[y \]decir bashque todo en el medio no se imprime en la pantalla, es decir, tiene longitud cero. La longitud de solicitud calculada es necesaria para saber dónde hacer eco de los caracteres que escribe. Dejar de lado \[ \]hace bashque se calcule una longitud de solicitud incorrecta, lo que a menudo conduce a un comportamiento extraño dependiente de la geometría del terminal debido a bashla idea de dónde el cursor no coincide con la realidad.

jw013
fuente
Gracias, esto resuelve el problema. Sin embargo, agradecería alguna explicación: cuál fue la razón de ese comportamiento, qué hacen los corchetes, etc. Sería bueno tenerlo todo en una página y podría ayudar a alguien más en el futuro.
Lev Levitsky
@LevLevitsky Agregué una breve explicación a la respuesta.
jw013
¡Muchas gracias! Eso tiene más sentido para mí ahora.
Lev Levitsky