¿Diferente indicador de bash para diferentes modos de edición vi?
113
Al usar el modo vi (set -o vi) con Bash, sería bueno tener un indicador que dependa del modo en el que se encuentre actualmente (insertar o comando). ¿Cómo se descubre este modo de edición?
También tengo curiosidad por esto. He estado buscando en la documentación de bash, pero no he encontrado nada.
Andrew Ferrier
Respuestas:
67
Fresh bash 4.3 y readline 6.3 tienen algo para ustedes ... del registro de cambios:
4.NewFeaturesinReadline
j.New user-settable variable, show-mode-in-prompt, adds a characters to the
beginning of the prompt indicating the current editing mode.
Tan poniendo
set show-mode-in-prompt on
en / etc / inputrc o ~ / .inputrc (gracias stooj) debería afectar a todos sus programas habilitados para readline;)
algún estado en esto? Estoy tratando de encontrar algo como esto (no para bash sino para otras indicaciones basadas en readline que uso). He estado buscando en Google y no he encontrado ninguna otra actualización (aparte de este y el artículo al que hizo referencia )
Mike HR
4
Simplemente agregando desde eMPee584: si está ejecutando bash 4.3 o superior, agregue lo siguiente a su conjunto de archivos ~ / .inputrc show-mode-in-prompt Esto agrega un + al extremo izquierdo de su indicador si está en modo de edición y a: si está en modo de comando.
stooj
3
Así que mientras esto funciona; ¿Hay alguna manera de moverse donde se encuentra este personaje en modo vi en el indicador? Si tiene indicaciones de varias líneas (personalizadas), no funciona del todo bien :)
James Mills
Para 4.3 está siempre al comienzo del indicador y, desafortunadamente, readline solo volverá a dibujar la última línea de un indicador de varias líneas. Vea la respuesta "Multiline prompt and .inputrc" para una solución alternativa o vea la respuesta sobre parchear bash 4.3 con la solución de 4.4 para esto.
Puede probar las versiones beta, pero parecen un poco defectuosas en este momento. Tampoco admiten aún especificar en qué lugar del indicador desea que aparezca el indicador de modo (que creo que es la característica principal).
Si no quiere esperar y no tiene miedo de una pequeña compilación, publiqué versiones parcheadas de bash 4.3 y readline 6.3 en github que admiten esta funcionalidad.
Con las versiones parcheadas puedes hacer cosas como esta:
Después de buscar en Google, mirar la página del manual de bash y luego mirar el código fuente de bash (lib / readline / vi_mode.c), parece que no hay una manera fácil de cambiar el indicador al pasar del modo de inserción al modo de comando. Parece que aquí podría haber una oportunidad para que alguien parchee la fuente de bash, ya que hay llamadas para iniciar y detener los modos en la fuente.
Al ver tu publicación, me interesé en la configuración del modo bash vi. Me encanta vi y lo haría por qué no en la línea de comandos. Sin embargo, parece que tendremos que hacer un seguimiento de si estamos en el modo de inserción sin un cambio rápido (eso dice muchas publicaciones en el foro). Por lo que vale la pena, siempre está en el modo de inserción a menos que presione ESC. Lo hace un poco más fácil, pero no siempre tan intuitivo.
Estoy aumentando su pregunta porque estoy interesado en ver a dónde va esto.
Inputrc tiene una opción para mostrar una +de inserción y :para el modo normal, añadiendo set show-mode-in-prompt onen el ~/.inputrcque escribió eMPee584, pero esto no funciona bien con líneas múltiples rápida (con versiones anteriores de bash y readline).
Una solución es tener una sola línea PS1( >) y una función que haga eco de algo antes del indicador. Está integrado en bash y se llama PROMPT_COMMAND.
Las cadenas de mensajes habituales no están disponibles en echo de printf. Sirve -epara interpretar códigos de color, y no es necesario agregar \[o \], que de todos modos no funciona.
Modo de inserción :
20:57/home/sshbio/dotfiles/bash
+> _
Modo normal :
20:57/home/sshbio/dotfiles/bash
:> _
Al presionar la pestaña , solo se repite la PS1, lo que tiene sentido para mí:
20:57/home/sshbio/dotfiles/bash
+> ls _
bashrc bash_profile inputrc
+> ls _
Si usa colores en vi-cmd-mode-stringo vi-ins-mode-string, estos deben tener el prefijo \1y el prefijo \2. Vea aquí . Además, \[y \[aún debería emitirse, pero necesitará \\[y \\]dentro de printf.
Tom Hale
1
Esto es lo que tengo en ~/.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2
Modo de inserción es de color azul.
└──[ins]
El modo de comando es de color amarillo.
└──[cmd]
La desventaja es que no se muestra en un ttysignificado, solo funciona en un emulador de terminal solo los colores.
También trato de obtener un indicador para el modo BASH vi, y todos aprendieron que suena simple y que todavía no hay forma de hacerlo.
Mi enfoque actual es: presionar 'a' cuando no estoy seguro de cuál es el modo. SI aparece 'a' después de BASH PROMOT, me entero de que estoy en modo 'INSERTAR'. ENTONCES, presiono 'RETORNO' y continúo. Esta es una manera fácil para mí de resolver la pequeña molestia.
Por cierto, yo 'alias a =' cal ', o algo más para darle al hit vacío' un 'poco de utilidad.
Para mí, tendría más sentido presionar "esc || c- [" en lugar de a. Entonces no tienes que mirar para saber en qué modo estás; o inserte caracteres no deseados que debe eliminar (o presione retorno)
Diferente estilo de indicador y cursor a través de .inputrc
Primero debe asegurarse de que está ejecutando una versión de bash superior a 4.3:
$ bash --version
GNU bash, version 4.4
Luego ponga las siguientes líneas en su ~/.inputrc:
#################### VIM ##################### FOR MORE INFORMATION CHECK:# https://wiki.archlinux.org/index.php/Readline# TURN ON VIM (E.G. FOR READLINE)set editing-mode vi
# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE# FOR THE NUMBER AFTER `\e[`:# 0: blinking block# 1: blinking block (default)# 2: steady block# 3: blinking underline# 4: steady underline# 5: blinking bar (xterm)# 6: steady bar (xterm)set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
En el modo de comando, el cursor se muestra como bloque.
En el modo de inserción, el cursor se muestra como una barra vertical.
Respuestas:
Fresh bash 4.3 y readline 6.3 tienen algo para ustedes ... del registro de cambios:
Tan poniendo
en / etc / inputrc o ~ / .inputrc (gracias stooj) debería afectar a todos sus programas habilitados para readline;)
fuente
Bash 4.4 / Readline 7.0 agregará soporte para cadenas de modo configurables por el usuario .
Puede probar las versiones beta, pero parecen un poco defectuosas en este momento. Tampoco admiten aún especificar en qué lugar del indicador desea que aparezca el indicador de modo (que creo que es la característica principal).
Si no quiere esperar y no tiene miedo de una pequeña compilación, publiqué versiones parcheadas de bash 4.3 y readline 6.3 en github que admiten esta funcionalidad.
Con las versiones parcheadas puedes hacer cosas como esta:
Más detalles, incluido cómo instalar, están disponibles en https://github.com/calid/bash
fuente
Después de buscar en Google, mirar la página del manual de bash y luego mirar el código fuente de bash (lib / readline / vi_mode.c), parece que no hay una manera fácil de cambiar el indicador al pasar del modo de inserción al modo de comando. Parece que aquí podría haber una oportunidad para que alguien parchee la fuente de bash, ya que hay llamadas para iniciar y detener los modos en la fuente.
Al ver tu publicación, me interesé en la configuración del modo bash vi. Me encanta vi y lo haría por qué no en la línea de comandos. Sin embargo, parece que tendremos que hacer un seguimiento de si estamos en el modo de inserción sin un cambio rápido (eso dice muchas publicaciones en el foro). Por lo que vale la pena, siempre está en el modo de inserción a menos que presione ESC. Lo hace un poco más fácil, pero no siempre tan intuitivo.
Estoy aumentando su pregunta porque estoy interesado en ver a dónde va esto.
fuente
Indicación multilínea y
.inputrc
Inputrc tiene una opción para mostrar una
+
de inserción y:
para el modo normal, añadiendoset show-mode-in-prompt on
en el~/.inputrc
que escribió eMPee584, pero esto no funciona bien con líneas múltiples rápida (con versiones anteriores de bash y readline).Una solución es tener una sola línea
PS1
(>
) y una función que haga eco de algo antes del indicador. Está integrado en bash y se llamaPROMPT_COMMAND
.Las cadenas de mensajes habituales no están disponibles en echo de printf. Sirve
-e
para interpretar códigos de color, y no es necesario agregar\[
o\]
, que de todos modos no funciona.Modo de inserción :
Modo normal :
Al presionar la pestaña , solo se repite la PS1, lo que tiene sentido para mí:
(Fuente)
fuente
vi-cmd-mode-string
ovi-ins-mode-string
, estos deben tener el prefijo\1
y el prefijo\2
. Vea aquí . Además,\[
y\[
aún debería emitirse, pero necesitará\\[
y\\]
dentro de printf.Esto es lo que tengo en
~/.inputrc
Modo de inserción es de color azul.
El modo de comando es de color amarillo.
La desventaja es que no se muestra en un
tty
significado, solo funciona en un emulador de terminal solo los colores.fuente
También trato de obtener un indicador para el modo BASH vi, y todos aprendieron que suena simple y que todavía no hay forma de hacerlo.
Mi enfoque actual es: presionar 'a' cuando no estoy seguro de cuál es el modo. SI aparece 'a' después de BASH PROMOT, me entero de que estoy en modo 'INSERTAR'. ENTONCES, presiono 'RETORNO' y continúo. Esta es una manera fácil para mí de resolver la pequeña molestia.
Por cierto, yo 'alias a =' cal ', o algo más para darle al hit vacío' un 'poco de utilidad.
fuente
para mensajes multilínea como esta imagen
mi trabajo alrededor es así
mi indicador de bash
.inputrc
espero que esto te haya ayudado
fuente
Diferente estilo de indicador y cursor a través de
.inputrc
Primero debe asegurarse de que está ejecutando una versión de bash superior a
4.3
:Luego ponga las siguientes líneas en su
~/.inputrc
:En el modo de comando, el cursor se muestra como bloque.
En el modo de inserción, el cursor se muestra como una barra vertical.
El indicador en sí se verá así según el modo:
fuente