2010-04-14 11 views
8

Me gustaría poder cambiar temporalmente del modo emacs al modo vi, ya que el modo vi es a veces mejor, pero normalmente estoy a la mitad escribiendo algo antes de darme cuenta de que quiero usar el modo vi.¿Hay alguna manera de cambiar Bash o zsh del modo Emacs al modo vi con una pulsación de tecla?

No quiero cambiar permanentemente al modo vi, porque normalmente prefiero el modo emacs en la línea de comandos, sobre todo porque es a lo que estoy acostumbrado, y con los años muchas de las teclas se han convertido en algo natural. (Como editor, generalmente uso emacs en el modo víbora, para poder usar ambos vi y emacs teclas, ya que me encontré accidentalmente usándolos en vi todo el tiempo, y arruinando cosas, y porque en algunos casos encuentro vi pulsaciones de teclas más memorables y útiles, y en otros casos emacs.)

Respuesta

10

Puede crear un alternar ya que los enlaces de teclas están separados entre el modo vi y el modo emacs.

$ set -o emacs 
$ bind '"\ee": vi-editing-mode' 
$ set -o vi 
$ bind '"\ee": emacs-editing-mode' 

Ahora Alt-e (o Esc e) alternará entre los modos.

Agregue esto en alguna parte de su definición para PS1, de modo que tenga un indicador en su indicador de qué modo está. No mostrará el cambio inmediatamente cuando cambie de modo, pero se actualizará cuando aparezca una nueva solicitud. emitido.

$(set -o | grep emacs.*on >/dev/null 2>&1 && echo E || echo V) 
+0

Usted señor, es brillante. Sin embargo, todavía no funciona en zsh. Con algunos pequeños ajustes, puedo hacer que el indicador de modo funcione desde la línea de comandos: conjunto -o | grep 'vi. * on'> |/dev/null 2> & 1 && echo '[vi]' || echo '' Pero mi solicitud solo cambia cuando obtengo mi archivo .zshrc. (Todavía no he probado el indicador de modo en bash). – iconoclast

+1

El editor de líneas Zsh no parece ser compatible con 'vi-editing-mode', solo 'vi-cmd-mode'. (Sin embargo, puede utilizar 'set -o vi' o 'bindkey -v' para obtener un modo vi completo). ^ xv está vinculado al modo vi-cmd en zsh de forma predeterminada. Solo dura la línea en la que se ejecuta, y solo presiona 'i' para salir, lo que lo vuelve a poner en modo emacs. Por el contrario, la solución bash dura hasta que cambie los modos explícitamente, y presionar 'i' lo pondrá en el modo de inserción vi. – iconoclast

+0

Si coloca el '$ (comando)' en la definición de su variable 'PS1', el comando se evaluará inmediatamente; por lo tanto, su solicitud está estáticamente definida, y debe obtener su' ~/.zshrc' para regenerar el rápido. Si desea que su mensaje muestre dinámicamente una variable/comando, debe modificar la función 'precmd' que Zsh ejecuta antes de que se muestre el mensaje. Pon esto en tu zshrc para arreglar el indicador de modo: – jabirali

5

Aha! Miré a la fuente de readline, y descubrí que se puede hacer esto:

"\M-v": vi-editing-mode 
"\M-e": emacs-editing-mode 

No parece ser una palanca, pero eso es probablemente lo suficientemente bueno!

Para la posteridad, esta es mi respuesta original, que podría ser útil para personas que intentan hacer cosas para las cuales no hay una función de lectura.

Aquí hay una forma de configurarlo, borrando la línea de comando actual en el proceso. No es lo que quiere, lo sé, pero tal vez ayudará a alguien más a encontrar esta pregunta. En ~/.inputrc:

"\M-v": "\C-k\C-uset -o vi\C-j" # alt (meta)-v: set vi mode 
"\M-e": "\C-k\C-uset -o vi\C-j" # alt (meta)-e: set emacs mode 

o para alternar ... esto debería funcionar:

"\M-t": "\C-k\C-u[[ \"$SHELLOPTS\" =~ '\\bemacs\\b' ]] && set -o vi || set -o emacs\C-j" 

Estas son esencialmente los alias, toman un paso más para asignar a teclas de readline de modo que usted don' t tiene que escribir un nombre de alias y presionar enter.

1

Las siguientes líneas .inputrc permiten Meta/Alt +E para cambiar entre los modos emacs y vi-insert.

Mooshing tanto j y k al mismo tiempo le llevará a vi-command modo.

Nota: La única palabra en Inglés con "kj" es "blackjack", las palabras no contienen "jk")

set keymap emacs 
"\ee": vi-editing-mode 
"jk": "\eejk" 
"kj": "\eejk" 

set keymap vi-insert 
"\ee": emacs-editing-mode 
"jk": vi-movement-mode 
"kj": vi-movement-mode 

set keymap vi-command 
"\ee": emacs-editing-mode 

Nota: Si se agrega una unión bajo keymap emacs a vi-movement-mode para tratar de cambiar directamente a vi-command modo, el aviso no se actualiza si tiene show-mode-in-prompt on, por lo tanto, se necesita la solución de problemas anterior.

Cuestiones relacionadas