web-dev-qa-db-ja.com

コマンド間で状態を保持するようにZSHのviモードを構成するにはどうすればよいですか?

Viのようなキーバインディングを使用するようにZSHのデフォルトのラインエディタを設定する方法を知っています...

bindkeys -v

...そして、デフォルトでmodを挿入する代わりに、新しい各プロンプトをコマンドモードにすることもできます...

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

...そしてほとんどの場合、私はこの振る舞いを好みます。しかし、それはいくつかのことを非常に厄介にします。たとえば、複数行のコマンドを端末に貼り付けてすぐに実行することはほぼ不可能になります。

モードが永続的になるように構成するにはどうすればよいですか? 1行を実行したときのモードを次の行のデフォルトモードにします。

7
Caleb

多分次のように:

vicmd-accept() { prev_mode=vicmd; zle .accept-line }
viins-accept() { prev_mode=viins; zle .accept-line }
zle-line-init() { zle -K ${prev_mode:-viins} }
zle -N viins-accept
zle -N vicmd-accept
zle -N zle-line-init
bindkey -M viins \\r viins-accept
bindkey -M vicmd \\r vicmd-accept

またはさらに簡単:

accept-line() { prev_mode=$KEYMAP; zle .accept-line }
zle-line-init() { zle -K ${prev_mode:-viins} }
zle -N accept-line
zle -N zle-line-init
6