如何配置 ZSH 的 vi 模式以在命令之间保持状态?

Cal*_*leb 7 shell zsh vi-mode zle

我知道如何将 ZSH 的默认行编辑器设置为使用类似 vi 的键绑定...

bindkeys -v
Run Code Online (Sandbox Code Playgroud)

...甚至默认每个新提示都处于命令模式而不是默认插入 mod ...

zle-line-init() { zle -K vicmd; }
zle -N zle-line-init
Run Code Online (Sandbox Code Playgroud)

...大多数时候我更喜欢这种行为。然而,这让一些事情变得非常尴尬。例如,将多行命令粘贴到终端中以立即执行几乎是不可能的。

我如何配置它以便模式是持久的?我希望我执行一行时的任何模式都应该是下一行的默认模式。

Sté*_*las 6

也许像:

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
Run Code Online (Sandbox Code Playgroud)

或者更简单:

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
Run Code Online (Sandbox Code Playgroud)