7

I use oh-my-zsh with Zsh and I want Vim bindings on the command line. In my .zshrc, I have the following lines (full .zshrc here):

# terminal vim
bindkey -v
export KEYTIMEOUT=1
bindkey -M viins 'jk' vi-cmd-mode  # @todo - THIS DOES NOT WORK?
bindkey -M viins '^k' kill-line
bindkey '^?' backward-delete-char
bindkey '^h' backward-delete-char
bindkey '^w' backward-kill-word
bindkey '^r' history-incremental-search-backward

# show which vim mode we are in
precmd() {
  RPROMPT=""
}
zle-keymap-select() {
  RPROMPT=""
  [[ $KEYMAP = vicmd ]] && RPROMPT="(COMMAND MODE)"
  () { return $__prompt_status }
  zle reset-prompt
}
zle-line-init() {
  typeset -g __prompt_status="$?"
}
zle -N zle-keymap-select
zle -N zle-line-init

Now, I just to be able to switch back to command mode by pressing 'jk' on the command line, but it won't work. Escape does work though.

Where am I going wrong?

4

2 回答 2

14
export KEYTIMEOUT=1

是这里通常的嫌疑人,默认为 40(0.4 秒)。我使用 10,与 'kj' 无缝协作(我更喜欢向内)。

于 2014-10-18T16:25:27.737 回答
0

确实,当你设置的KEYTIMEOUT太小比如KEYTIMEOUT=1,会引入额外的问题,否则你需要继续容忍密钥延迟。

虽然你可以通过去掉前缀键来临时解决,也就是bindkey -r 'j',但是j有它的功能,你可能也知道这样的解决方案并不完美。

但如果你不介意使用插件,我认为下面的插件可以完美地帮助你,还有在 vi 模式下更好的体验等额外奖励。

zsh-vi-mode : ZSH 的更好和友好的 vi(vim) 模式插件。
https://github.com/jeffreytse/zsh-vi-mode

该插件解决了您的担忧,并具有以下功能:

  • 使用近乎原生的 vi(vim) 模式获得更好的体验。
  • ⌛ 更低的延迟和更好的响应(模式切换、小部件调用)。
  • ✏️ 具有不同光标样式的模式指示。
  • 光标移动(导航)。
  • 插入和替换(插入模式)。
  • 文本对象(一个词、内部词等)。
  • 搜索历史。
  • ❇️ 撤消、重做、剪切、复制、粘贴和删除。
  • 更好的环绕功能(添加、替换、删除、移动和突出显示)。
  • 切换关键字(增加/减少数字、布尔值、工作日、月份等)。
  • ...
于 2021-02-10T03:45:47.973 回答