La búsqueda del historial inverso en bash seguido de las teclas de flecha hace que el cursor se muestre en la ubicación incorrecta

10

Me he dado cuenta de que muchas veces cuando busco en el historial inverso desde la línea de comando a través de CTRL+ r, si quiero editar el comando, a veces el cursor salta a la posición incorrecta cuando presiono una tecla de flecha o ingreso CTRL+ ao CTRL+ e. La posición específica a la que salta parece ser un desplazamiento igual al tamaño de mi línea de comando como se establece PS1.

Esto causa dificultades porque la ubicación real del cursor es diferente de la que se muestra en la pantalla; Las ediciones futuras del comando se representan como si el cursor estuviera donde saltó, pero el comando real conserva la ubicación correcta sin ningún salto.

¿Alguien sabe qué está causando esto o cómo solucionarlo?

EDITAR: si agrego una nueva línea al final del PS1problema parece desaparecer. Sin embargo, preferiría ingresar el comando en la misma línea que el indicador.

jonderry
fuente

Respuestas:

6

Esto a menudo es causado por comandos en su historial que son más largos que 1 línea. Cuando selecciona un elemento más corto del historial, no parece tener en cuenta el ancho de la solicitud al volver a representar la línea de comando, por lo que todo después de ese comando largo es incorrecto.

La solución fácil que he encontrado es presionar la tecla de inicio, insertar "echo" y presionar enter. Luego recupera el último comando y edita desde allí. (Primero eliminando el eco. :)

cabbey
fuente
Gracias, en realidad lo intenté hace un momento. En mi caso, fui descuidado y volé un archivo porque había una tubería en el comando que se tragó el eco. Tienes razón, esto parece afectar solo los comandos largos de acuerdo con mi experimentación.
jonderry
Una solución mejor que el eco que acabo de encontrar: agregue un '#' al comienzo de la línea en lugar de un eco. De esta manera, bash trata toda la línea como un comentario.
jonderry
1
Aún mejor: el problema parece desaparecer si la línea actual se vuelve a dibujar. Ya sea Cl para borrar la pantalla y volver a dibujar la línea actual o crear un enlace de teclas para la función independiente redraw-current-line.
jonderry
Olvidé mencionar la solución Cl, ya que realmente odio perder el búfer de desplazamiento, pero sí, es una falla de representación temporal de la navegación del historial, por lo que forzar una nueva actualización lo solucionará. ¡redraw-current-line suena como una solución aún mejor!
cabbey
13

Tal vez tenga secuencias de escape sin impresión en PS1 no incluidas en \ [y \].

Asegúrese de incluirlos a todos de esta manera:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Aleksandr Somov
fuente
1
Funciona muy bien si encierra solo las secuencias que no se imprimen \[y \](por lo que necesita múltiples grupos de estas comillas)
Andomar