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?
Por cierto, esto parece ser posible en ZSH :
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?
Por cierto, esto parece ser posible en ZSH :
Respuestas:
Fresh bash 4.3 y readline 6.3 tienen algo para ustedes ... del registro de cambios:
4. New Features in Readline
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;)
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
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
Inputrc tiene una opción para mostrar una +
de inserción y :
para el modo normal, añadiendo set 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 llama PROMPT_COMMAND
.
function prompt {
PS1=' > '
echo -e "$(date +%R) $PWD"
}
PROMPT_COMMAND='prompt'
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 :
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 _
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 tty
significado, 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 mensajes multilínea como esta imagen
mi trabajo alrededor es así
mi indicador de bash
export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "
.inputrc
set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"
espero que esto te haya ayudado
.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.
El indicador en sí se verá así según el modo:
(cmd)$ ...
(ins)$ ...