🐶
zshにviのモードを表示する
zshでキーバインドをviライクにする設定はご存じな方もいるのではないかと思います。
以下の通りですね。
bindkey -v
そして、シェルのプロンプトに現在のviのモードを表示する方法があるんです。
まず、モードごとのプロンプトを変数に格納しておきます。
PROMPT_INS="[INS]"
PROMPT_NOR="[NOR]"
PROMPT_VIS="[VIS]"
これがプロンプトの表示となるので、例えば複数行のプロンプトにしたい場合は、以下のようにします。
PROMPT_INS="[%n@%m]
[INS]"
PROMPT_NOR="[%n@%m]
[NOR]"
PROMPT_VIS="[%n@%m]
[VIS]"
モードごとに同じ記述をすることになるのは、ご了承ください。
ここからが本題です。
再描画される直前に呼び出される関数zle-line-pre-redraw
を定義します。
function zle-line-pre-redraw {
if [[ $REGION_ACTIVE -ne 0 ]]; then
NEW_PROMPT=$PROMPT_VIS
elif [[ $KEYMAP = vicmd ]]; then
NEW_PROMPT=$PROMPT_NOR
elif [[ $KEYMAP = main ]]; then
NEW_PROMPT=$PROMPT_INS
fi
if [[ $PROMPT = $NEW_PROMPT ]]; then
return
fi
PROMPT=$NEW_PROMPT
zle reset-prompt
}
3行目のvicmd
がノーマルモードを表し、5行目のmain
がインサートモードをあらわします。
そしてビジュアルモードは$REGION_ACTIVE -ne 0
で判定できます。
以上の設定を.zshrc
ファイルなどに記述してみてください。
初期モードがインサートモード、エスケープするとノーマルモード、v
キーでビジュアルモードになり、それぞれで現在のモードがプロンプトに表示されます。
完全な設定は、私のdotfilesをご覧ください。
Discussion