¿Cómo personalizo el modo vim de zsh?

Ok, así que finalmente hice el gran cambio. En mi. Zshenv, cambié mi EDITOR:

export EDITOR=vim 

Hay un par de preguntas que tengo que son tan menores que no quería iniciar preguntas separadas para ellos. Aquí están:

  1. ¿Cómo puedo obtener zsh para distinguir entre el modo de inserción y el modo de comando como en vim? Preferiblemente esto cambiaría el cursor de un subrayado a un bloque como en vim, pero mostrar texto en la parte inferior funcionaría también.

  2. ¿Cómo puedo conseguir que actúe más como vim? Por ejemplo, prefiero estar en modo de comando por defecto y no salir de él después de un comando.

1. ) (ver http://zshwiki.org/home/examples/zlewidgets y http://pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-prompt/ ) :

 Función zle-line-init zle-keymap-select {
     RPS1 = "$ {$ {KEYMAP / vicmd / - NORMAL -} / (main | viins) / - INSERT -}"
     RPS2 = $ RPS1
     Zle reset-prompt
 }
 Zle-zle-line-init
 Zle -N zle-keymap-select

Dónde:

  • "RPS" significa "cadena de prompt derecha" y define el prompt que aparece en el lado derecho del terminal, y la sintaxis $ {variable / pattern / replacement} es la de "expansion de parámetros", ver: http: // mywiki .wooledge.org / BashSheet # Parameter_Operations .

  • 'Zle-N' hace que los widgets definibles por el usuario 'zle-line-init' y 'zle-keymap-select' estén enlazados (a las funciones shell de los mismos nombres), de modo que serán llamados cuando el line editor sea inicializado Y el mapa de claves se cambia respectivamente, consulte: http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC125 .

2. ) sospecho que usted tiene que escribir otro zsh-widget para hacer eso, se inspiran en el primero de los dos enlaces para el primer problema.

La solución de akira tiene el siguiente problema al usar avisos de varias líneas: al pasar de ins al modo cmd, el nuevo redibujo hace que pocas líneas sean eliminadas de la salida anterior (y el nuevo indicador se muestra pocas líneas arriba). La cantidad de líneas depende de cuántas líneas tenga en su solicitud.

La manera de lidiar con eso es usar zle-line-finish , sin usar zle reset-prompt . Un ejemplo:

 vim_ins_mode="[INS]" vim_cmd_mode="[CMD]" vim_mode=$vim_ins_mode function zle-keymap-select { vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}" zle reset-prompt } zle -N zle-keymap-select function zle-line-finish { vim_mode=$vim_ins_mode } zle -N zle-line-finish 

Y luego puede agregarlo a su solicitud de la derecha, por ejemplo:

 RPROMPT='${vim_mode}' 

Esto es directamente de mi blog sobre el tema:

 zle-line-init() { zle -K vicmd; } zle -N zle-line-init 

Estas dos líneas asegurarse de que se inicia en el modo de comando