如何自定义 zsh 的 vim 模式?

Jas*_*ker 25 vim zsh

好的,所以我终于做出了巨大的改变。在我的 .zshenv 中,我更改了我的 EDITOR:

export EDITOR=vim
Run Code Online (Sandbox Code Playgroud)

我有几个问题非常小,以至于我不想为他们开始单独的问题。他们来了:

  1. 如何让 zsh 像 vim 一样区分插入模式和命令模式?最好将光标从下划线更改为像 vim 中的块,但在底部显示文本也可以。

  2. 我如何让它表现得更像 vim?例如,我宁愿它默认处于命令模式,而不是在一个命令后退出。

aki*_*ira 27

1. )(见http://zshwiki.org/home/examples/zlewidgetshttp://pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-prompt/) :

函数 zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/-- NORMAL --}/(main|viins)/-- INSERT --}"
    RPS2=$RPS1
    zle 重置提示
}
zle -N zle-line-init
zle -N zle-keymap-select

在哪里:

2. ) 我怀疑你必须写另一个 zsh-widget 来做到这一点,从第一个问题的两个链接中的第一个中得到启发。


Paw*_*cki 23

akira的解决方案在使用多行提示时存在以下问题:从ins到cmd模式时,提示重绘导致从之前的输出中删除了几行(并且新提示显示在上面几行)。多少行取决于您的提示中有多少行。

处理这个问题的方法是使用zle-line-finish,而不使用zle reset-prompt那里。一个例子:

# perform parameter expansion/command substitution in prompt
setopt PROMPT_SUBST

vim_ins_mode="[INS]"
vim_cmd_mode="[CMD]"
vim_mode=$vim_ins_mode

function zle-keymap-select {
  vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
  zle reset-prompt
}
zle -N zle-keymap-select

function zle-line-finish {
  vim_mode=$vim_ins_mode
}
zle -N zle-line-finish
Run Code Online (Sandbox Code Playgroud)

然后您可以将其添加到您的右侧提示中,例如:

RPROMPT='${vim_mode}'
Run Code Online (Sandbox Code Playgroud)

这是直接来自我的博客文章:


小智 5

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

这两行确保它以命令模式启动