🐶

zshにviのモードを表示する

2024/04/28に公開

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をご覧ください。

https://github.com/nabezokodaikon/dotfiles/blob/main/zsh/extension/prompt.sh

Discussion