¿Cómo mostrar el modo Vi actual cuando se usan las combinaciones de teclas Vi en el shell?


15

Yo uso las combinaciones de teclas vi en mi shell tcsh.

Ahora, no sé en qué modo vi estoy ( insertmodo o commandmodo), lo que genera mucha frustración.

¿Alguien sabe de una manera de mostrar el modo vi actual en el shell? (al incluir en el aviso o algo)

Respuestas:


4

No creo que haya ninguna manera de determinar visualmente en qué modo estás, pero si modificas un poco tu comportamiento, no importará.

Si desea estar en modo comando, presione ESC antes de escribir un comando.

Si desea estar en modo de inserción, presione ESC e i antes de escribir contenido.

Terminarás presionando ESC mucho, pero todos los usuarios de vi que he conocido lo hacen de todos modos.


1
El problema es que, en el shell, no se ignoran los ESC adicionales: cuando doy un ESC adicional, luego escribo un comando (digamos h para mover hacia la izquierda), simplemente emite un pitido y no hace nada.
sundar - Restablecer Monica

2
Por "ESC adicional", me refiero a presionar ESC cuando ya estoy en modo comando, lo que hago mucho ya que no sé en qué modo estoy.
sundar - Reinstalar Monica

Estás en lo correcto. Lo he usado tanto tiempo que ya ni siquiera noto ese comportamiento. De nuevo, la respuesta más simple. Si presiona ESC y h y no sucede nada, presione h nuevamente. Creo que eso abre otra pregunta. ¿Por qué presionar ESC mientras está en el modo 'comando' de las combinaciones de teclas vi hace que el siguiente carácter no se interprete correctamente? vi en sí no hace esto. Puedo escribir ESC 10 veces y el siguiente comando todavía funciona como se esperaba.
Bob Weber

Otro consejo, apaga el timbre. Es increíblemente molesto solo por el motivo que describe, y porque emite un pitido al completar la pestaña. Hay varias formas de hacerlo dependiendo de su entorno.
Bob Weber

1
Ok, actualmente estoy probando esta solución. La asignación de Bloqueo de mayúsculas a Escape ha facilitado la implementación de esto, pero aún no me he acostumbrado a ESC-i para el modo de inserción. Espero que lo haga pronto. > Si presiona ESC y h y no sucede nada, presione h nuevamente. El problema con esto es que es bastante frustrante y rompe mucho el flujo. Es algo adicional en lo que tengo que pensar además del comando que estoy formando. Yo prefiero vi combinaciones de teclas para la sencilla razón de que estés en mi memoria muscular y dan una cosa menos que pensar - este tipo de roturas tal fin en sí ...
Sundar - Restablecer Mónica

3

He echado un vistazo a la documentación y debo decir que no pude encontrar ninguna forma de detectar y mostrar el modo vi actual. Espero que tengas una sorpresa agradable y alguien encuentre una solución, pero ciertamente no puedo ver una manera de hacer lo que pides.

Creo que hay una manera de hacer esto, pero es una exageración masiva para una pequeña molestia, y no creo que eso sea lo que tenías en mente cuando planteaste esta pregunta. Si esto es cierto, deja de leer ahora y disfruta de tu vida.

OTOH, si este es realmente tu motivo favorito, y te está volviendo loco, y realmente quieres desesperadamente resolver este problema, aquí está mi idea de cómo solucionarlo:

  1. Obtenga una copia de Programación avanzada en el entorno UNIX (R) de W. Richard Stevens.
  2. Lea los capítulos sobre Streams y Terminal I / O.
  3. Descargue el código fuente en el libro mencionado anteriormente, que incluye un ejemplo de una secuencia que puede colocarse en una terminal.
  4. Implemente su manejo para la combinación de teclas Esc (o ambas pulsaciones de tecla de cambio de modo) e indíquelo mediante una campana o manipulación de fondo de la línea actual.

En resumen, Unix implementa la E / S del terminal como un flujo de E / S dúplex completo entre el controlador del dispositivo y el proceso del usuario, en el que se pueden insertar los módulos. Está organizado como una pila, por lo que puede superponer tantas secuencias como desee. La suma de las corrientes inyectadas crea su comportamiento de E / S terminal.

Cuando se ingresa un carácter, el primer módulo lo inspecciona y lo pasa (si lo desea). Cuando la respuesta llega en la dirección opuesta, nuevamente tiene la oportunidad de inspeccionarla y transmitirla. Así es como se maneja un Ctrl-C en un nivel superior a una tecla de carácter normal.

Puede crear un archivo binario implementando un módulo de flujo, que cuando se invoca se ejecuta silenciosamente en primer plano, inspeccionando y pasando todas las pulsaciones de teclas, realizando su acción preferida en las pulsaciones de teclas que le interesan. Para todos los efectos, aparecerá como si estuvieras trabajando en el shell. Oooh Puedes invocar este binario en la última (o primera, o cualquier) línea de tu .tcshrc y ni siquiera sabrías que está allí.

Hay una buena imprimación aquí , pero no pude encontrar mucho sobre este tema, probablemente porque es pasado su apogeo.


2

Esta página tiene un script bastante detallado que configura lo que desea (y más) en zsh . Quizás podría adaptarse para trabajar con tcsh (no estoy muy familiarizado con ese shell).


Tampoco estoy familiarizado con tcsh, pero creo que la página que mostraste usa widgets zsh (con zle). No creo que otros proyectiles tengan eso, pero si lo tienen, eso definitivamente funcionaría.
BrianH

1

Para cualquiera que tenga este problema exacto (como yo): encontré una solución en stackoverflow . Aparentemente hay soporte nativo para esto en readline, por lo que puede agregar lo siguiente a su ~/.inputrc:

set show-mode-in-prompt on

Y para personalizar el uso real del personaje:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

Edición de línea de comandos con tcsh

Hay dos modos principales para editar la línea de comandos,
basados ​​en los dos editores de texto más utilizados, Emacs y vi.

Con los enlaces vi , debe cambiar entre los modos de inserción y comando ;
diferentes comandos son útiles en cada modo.

El modo vi tiene dos modos secundarios, insertar ymodo de comando .

  • El modo predeterminado es insertar .
  • Puede alternar entre los modos presionandoEsc .
  • Alternativamente, en el modo de comando , al
    escribir 'a' (agregar) o 'i' (insertar) volverá al modo de inserción
    .

Más notas en la página de tcshpersonalización ya vinculadas anteriormente.


2
Sus enlaces van a libros con derechos de autor de O'Reilly ...
BrianH

0

Tuve exactamente el mismo problema y por accidente he encontrado la solución. Aunque este hilo es antiguo, no pude encontrar ningún otro sitio web que ofreciera una solución, así que supongo que publicar en este hilo está bien.

Simplemente restablezca la configuración de su programa de terminal o shell. Actualmente estoy usando PuTTY, y acabo de eliminar mi configuración guardada para mi conexión guardada, y recreé una sesión guardada. Trabajado como un encanto.

¡Espero que esto ayude!


0

Por favor vea mi respuesta en SO . Bash 4.4 / Readline 7.0 agregará soporte para esta funcionalidad, y mientras tanto he publicado versiones parcheadas de Bash 4.3 / Readline 6.3 en github .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.