vi モードでの状態を表示

zshell を vi モードで使う場合に,今どのモードで作業してるか分からなくなるときがあります.
ノーマルモード (vicmd) にいるときに, RPROMPT になにやら表示するようにしてみました.

参考: oh-my-zsh/vi-mode.plugin.zsh at master · robbyrussell/oh-my-zsh · GitHub

function zle-line-init zle-keymap-select {
  zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

function vi_mode_prompt_info() {
  [[ $KEYMAP == 'vicmd' ]] && echo "%{e[33;1m%}NORMAL%{e[0m%} "
}

RPROMPT='$(vi_mode_prompt_info)'

参考とほぼ一緒です.表示される原理としては

  • 何からの方法で zle-line-init, zle-keymap-select が呼ばれる.
  • zle-line-init, zle-keymap-select から reset-prompt が呼ばれる(上の2行目).
  • reset-prompt により RPROMPT の再描画が起こる.
  • RPROMT の $(vi_mode_prompt_info) から vi_mode_prompt_info() が呼ばれる.
  • $KEYMAP が 'vicmd' なら 黄色字で NORMAL と表示される(上の9行目).

といった具合でしょうか.インサートモードやノーマルモードに変わったときは,おそらく zle-keymap-select が呼ばれるのでは無いかと思ってます.


ところで最近 zsh 5 がリリースされてましたね.何が変わったかよく分かってないですけどとりあえず入れてみました.便利な機能が追加されてると良いですね.