Come personalizzare la modalità vim di zsh?

Ok, così ho finalmente fatto il grande cambiamento. Nel mio .zshenv, ho cambiato il mio EDITORE:

export EDITOR=vim 

Ci sono un paio di domande che sono così minori che non ho voluto avviare domande separate per loro. Eccoli:

  1. Come posso get zsh per distinguere tra modalità di inserimento e modalità di command come in vim? Preferibilmente questo cambierebbe il cursore da una sottolineatura a un block come in vim, ma la visualizzazione di text in fondo functionrebbe pure.

  2. Come faccio ad agire più come vim? Ad esempio, preferirei di essere in modalità di command per impostazione predefinita e non uscire dopo un command.

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

 function zle-line-init zle-keymap-select {
     RPS1 = "$ {$ {KEYMAP / vicmd / - NORMAL -} / (principale | viins) / - INSERT -}"
     RPS2 = $ RPS1
     richiesto di resettazione zle
 }
 zle-zle-line-init
 zle-zle-keymap-select

Dove:

  • "RPS" indica la string di destra e definisce il prompt che appare sul lato destro del terminal e la syntax $ {variable / pattern / replacement} è quella dell'espansione del parametro, vedere: http: // mywiki .wooledge.org / BashSheet # Parameter_Operations .

  • 'zle -N' provoca l'associazione degli elementi definiti dall'utente 'zle-line-init' e 'zle-keymap-select' (alle funzioni shell degli stessi nomi), in modo che siano chiamati quando viene inizializzato l'editor di linea e il keymap è cambiato rispettivamente, vedere: http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC125 .

2. ) Sospetto di wherer scrivere un altro widget zsh per farlo, ispirato al primo dei due link per il primo problema.

La soluzione di akira ha il seguente problema quando si utilizzano prompt multilinea: quando si va da ins a cmd, il prompt redraw causa alcune righe da eliminare dall'output precedente (e il nuovo prompt viene visualizzato in poche righe di seguito). Quante righe dipendono da quante righe hai nel tuo prompt.

Il modo per far fronte a questo è quello di utilizzare zle-line-finish , senza utilizzare il zle reset-prompt lì. Un esempio:

 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 

E poi puoi aggiungerlo al tuo prompt destro, ad esempio:

 RPROMPT='${vim_mode}' 

Questo è dritto dal mio post sul blog su di esso:

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

queste due righe assicurano che inizia in modalità di command