¿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?

Por cierto, esto parece ser posible en ZSH :


fuente
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.  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;)

eMPee584
fuente
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.
studgeek
20

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:

ingrese la descripción de la imagen aquí

Más detalles, incluido cómo instalar, están disponibles en https://github.com/calid/bash

Dylan Cali
fuente
19

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.

Jeremy Heslop
fuente
7

Indicación multilínea y .inputrc

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.

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 -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 _

Avance (Fuente)

usuario 3034472
fuente
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.

Jetchisel
fuente
0

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.

Andrew_1510
fuente
2
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)
wom
0

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

marca
fuente
0

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.

El indicador en sí se verá así según el modo:

(cmd)$ ... 
(ins)$ ...
winklerrr
fuente