2009-06-24 15 views
102

Al usar el modo vi (establecer -o vi) con Bash, sería bueno tener un aviso que dependa del modo en el que se encuentra actualmente (insertar o comando). ¿Cómo puede uno descubrir este modo de edición?¿Indicador bash diferente para el modo de edición vi diferente?

Por cierto, esto parece ser posible en ZSH:

+0

Tengo curiosidad acerca de esto también. He estado buscando documentación de bash, pero no he encontrado nada. –

Respuesta

0

Aunque no es una solución de un solo paso, de una manera que podría lograr esto es mediante la escritura de un guión que cambia tanto en el modo de edición y el símbolo simultáneamente & uso de dicho guión de exclusivamente cuando se cambian los modos.

IE: Tener un script llamado bash-VI que ejecuta "set -o vi; PS1='desired vi mode prompt';"


Editar: (no puedo hacer ningún comentario todavía) veo, supongo que no he leído la pregunta con suficiente cuidado & pasado por alto la referencia para insertar el modo de comando &. No estoy seguro de cómo configurar eso tampoco. Por lo general, no ha sido un problema para mí, ya que solo uso el modo de comando para operaciones breves; no obstante, puedo ver por qué sería útil.

+1

No, lo que Thomas está pidiendo es diferente. Con 'set -o vi' activado, él quiere un aviso visiblemente diferente cuando presiona , y luego el indicador original nuevamente cuando presiona . – ephemient

19

Después de buscar en Google, mirar a través de la página bash man y luego mirar el código fuente bash (lib/readline/vi_mode.c) parece que no hay una manera fácil de cambiar el indicador al pasar del modo insertar a modo de comando. Parece que podría haber una oportunidad aquí para que alguien parchee la fuente bash, ya que hay llamadas para iniciar y detener los modos en la fuente.

Al ver su publicación, me interesó la configuración del modo bash vi. Me encanta vi y 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 (por lo que decimos muchas publicaciones en el foro). Por lo que valen, siempre estarán en modo de inserción a menos que presionen ESC. Lo hace un poco más fácil, pero no siempre tan intuitivo.

Estoy subiendo su pregunta ya que estoy interesado en ver a dónde va esto.

0

Intento obtener un indicador para el modo BASH vi también, y todos ustedes aprendieron que es muy simple y que no hay forma de hacerlo todavía.

Mi enfoque actual es: presionar 'a' cuando no estoy seguro de qué modo es. SI aparece 'a' después de BASH PROMOT, me entero de que estoy en modo 'INSERT'. ENTONCES, presiono 'RETORNO' y continúo. Esta es una manera fácil para mí de resolver la pequeña molestia.

Por cierto, 'alias a =' cal ', o algo más para dar al hit vacío' una 'poca utilidad.

+2

Tendría más sentido para mí simplemente presionar "esc || c- [" en lugar de a. Entonces no tienes que mirar para saber en qué modo estás; o inserte los caracteres no deseados que tiene que eliminar (o presione regresar) – wom

54

fiesta dulce 4,3 y 6,3 readline tienen algo para ustedes .. a partir de la lista 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. 

Así que poner

set show-mode-in-prompt on 

en/etc/inputrc o ~/.inputrc (stooj THX) debería afectar a todos sus programas readline-enabled;)

+0

cualquier estado sobre esto? Estoy tratando de encontrar algo como esto (no para bash sino para otras instrucciones basadas en readline que uso). He estado buscando en Google y no he encontrado ninguna otra actualización (aparte de esto y el artículo [al que se hace referencia] (http://cnswww.cns.cwru.edu/php/chet/readline/CHANGES)) –

+3

Solo agregando desde eMPee584: si está ejecutando bash 4.3 o una versión superior, agregue lo siguiente a su archivo ~/.inputrc show-mode-in-prompt Esto agrega un + a la izquierda del aviso si se encuentra en modo de edición, y un : si estás en modo comando. – stooj

+3

Entonces mientras esto funciona; ¿Hay alguna manera de mover dónde se encuentra este personaje de modo vi en el momento? Si tiene indicaciones de líneas múltiples (personalizadas), no funciona demasiado bien :) –

16

Bash 4.4/Readline 7.0 will add support for user-settable mode strings.

Puede probar las versiones beta, pero parecen un poco defectuosas en este momento. Tampoco son compatibles con la especificación de en qué momento del indicador desea que aparezca el indicador de modo (que creo que es la característica más importante).

Si no quiere esperar y no tiene miedo de una pequeña compilación, he publicado versiones parcheadas de bash 4.3 y readline 6.3 para github que admiten esta funcionalidad.

Con las versiones parcheadas que puede hacer cosas como esta:

enter image description here

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

6

Multilínea pronta y .inputrc

inputrc tiene una opción para mostrar un + para insertar y : para el modo normal, agregando set show-mode-in-prompt on en el ~/.inputrc como eMPee584 escribió, pero esto no funciona bien con el indicador multilínea.

Una solución tiene una sola línea PS1 (>), y una función que repite algo antes del aviso. Está integrado en bash y se llama PROMPT_COMMAND.

function prompt { 
    PS1=' > ' 
    echo -e "$(date +%R) $PWD" 
} 

PROMPT_COMMAND='prompt' 

Las cadenas de aviso habituales no están disponibles en echo of printf. El -e es para interpretar códigos de color, y no es necesario agregar \[ o \], que no funciona de todos modos.

Insertar modo:

20:57 /home/sshbio/dotfiles/bash 
+ > _ 

normal modo:

20:57 /home/sshbio/dotfiles/bash 
: > _ 

pestaña presionar, sólo el PS1 se repite, que tiene sentido para mí:

20:57 /home/sshbio/dotfiles/bash 
+ > ls _ 
bashrc  bash_profile  inputrc 
+ > ls _ 

Preview (Source)

+0

Si usas colores en' vi-cmd-mode-string' o 'vi-ins-mode-string', estos deberían ser prefijado por '\ 1' y postfijo por' \ 2'. Ver [aquí] (https://www.gnu.org/software/bash/manual/bash.html#Readline-Init-File). Además, '\ ['y' \ ['aún se deben emitir, pero necesitará' \\ ['y' \\] 'dentro de printf. –

Cuestiones relacionadas