Cambie la forma (o color) del cursor para indicar el modo vi en bash

30

Para aclarar: no estoy preguntando cómo cambiar el cursor cuando uso vim dentro de un terminal . Quiero que el cursor cambie al cambiar entre los modos de entrada y comando dentro del modo vi de Bash:

set -o vi <CR> type some text <ESC> (the cursor changes shape/color)
i (cursor change back) etc... 

Encontré un script que hace posible cambiar el color del cursor en los cambios de modo en zsh , pero no quiero cambiar los shells solo por esta característica.

¿Hay alguna manera de hacer que el cursor cambie de forma, como en gvim, (o incluso solo en color) al cambiar entre los modos de comando e inserción en la línea de comando Bash?

joecan
fuente
Misma pregunta en SO para Putty, sin respuesta aunque :( - stackoverflow.com/questions/2393383/…
studgeek

Respuestas:

5

agregue estas dos líneas a ~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
Holytrousers
fuente
44
Esta respuesta sería mucho más útil si explica lo que hacen y proporciona algún contexto, por ejemplo, si la configuración requiere que el usuario tenga una versión particular de Readline.
Anthony G - justicia para Monica
:) aquí está la entrada manual: gnu.org/software/bash/manual/html_node/…
holytrousers
1
Esto solo funcionará en terminales y emuladores de terminal que entiendan DECSCUSR.
JdeBP
He tenido que añadir set show-mode-in-prompt onen ~/.inputrctambién para hacer este trabajo.
ronakg
4

Copiado desde aquí: estilo vim de edición de línea de comandos

Debería estar disponible en bash4.3 - ver el registro de cambios -

j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

bash4.3 se encuentra actualmente en la rcetapa, debería poder obtener paquetes para la mayoría de las distribuciones sin compilar desde la fuente, aunque no en los repositorios principales. P.ej. Ubuntu (amd64) aquí y Debian (repositorio experimental) aquí .

Graeme
fuente
Tenga en cuenta que: la solicitud no se actualizará si utiliza una PS1 personalizada que contiene un carácter de nueva línea. encontrado aquí
pgericson
@pgericson Parece funcionar con una PS1 personalizada que contiene una nueva línea para mí en bash 4.4.12.
DuBistKomisch
2

No he encontrado una solución real, pero quizás esto podría ayudarlo a usted (oa otra persona) a encontrar una mejor.

Tienes que crear un script (por ejemplo, kmtest.sh)

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
   echo -ne "\033]12;Green\007"
else
   echo -ne "\033]12;Red\007"
fi

y después de agregarlo a tu PS1, algo como:

export PS1="\u@\h \$(kmtest.sh)> "

pero como dije, no es lo que quieres, porque cambia el color del cursor solo después de un cr. Buena suerte

gb

gogolb
fuente
¿Esto realmente funcionó para ti? No funciono para mí; solo puso el cursor en rojo. No creo que kmtest.sh se ejecute cada vez que cambio entre los modos de inserción y comando. Parece que solo se ejecutará en la creación de la solicitud.
joecan
1

Parece que puede haber una manera de hacerlo a través de hackear readline. ¿Quizás podríamos presionar para que se incorpore?

Aquí está mi respuesta en SO https://stackoverflow.com/a/12201092/255961 que actualizaré si obtengo más información.

studgeek
fuente
1

Si bien no es exactamente lo que desea (cambiar dinámicamente el cursor), bash 4.4 / readline 7.0 agregará soporte para cambiar dinámicamente el indicador . Podrá especificar indicadores de modo personalizado para los modos de inserción / comando (Esto es diferente de la show-mode-in-promptopción actual que está codificada para usar +y :).

Desafortunadamente, estas versiones están actualmente en beta y no parecen tener todos los errores resueltos todavía. También les falta la capacidad de especificar en qué parte del mensaje desea que aparezca el indicador de modo.

Mientras tanto, he publicado versiones parcheadas de bash 4.3 / readline 6.3 en github con esta funcionalidad.

Dylan Cali
fuente
0

Hice la misma pregunta hace un tiempo en AskUbuntu cuando estaba haciendo la transición de Gvim a Console Vim.

Recibí una respuesta, pero involucraba alternar la configuración del terminal gnome, y esta configuración se aplicaba en todos los terminales. Por lo tanto, era posible que el cursor del terminal gnome se atascara en el estado incorrecto a veces.

Todavía estoy interesado en saber si obtienes una solución satisfactoria, pero con el tiempo me he ajustado a la falta de información del estado del modo en el cursor. Tal vez solo presiono escape con más frecuencia (por ejemplo, escpara asegurarme de que estoy en modo comando; esc ipara asegurarme de que estoy en modo inserción); tal vez miro el estado que se muestra en la parte inferior de la pantalla; Quizás acabo de internalizar el modo.

Jeromy Anglim
fuente
3
Solo para aclarar, tu pregunta no es lo mismo que la mía. Preguntó cómo cambiar el cursor dentro de Vim en la consola. Esto está bien documentado en la wiki de Vim . Quiero saber cómo hacer esto en el modo vi de Bash .
joecan