【问题标题】:Why doesn't my 'jk' zsh vi-cmd-mode binding not work为什么我的 'jk' zsh vi-cmd-mode 绑定不起作用
【发布时间】:2014-11-29 13:16:31
【问题描述】:

我将 oh-my-zsh 与 Zsh 一起使用,我希望在命令行上绑定 Vim。在我的 .zshrc 中,我有以下几行(完整的 .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

现在,我只是能够通过在命令行上按“jk”切换回命令模式,但它不起作用。不过逃生确实有效。

我哪里出错了?

【问题讨论】:

    标签: vim command-line zsh command-line-interface oh-my-zsh


    【解决方案1】:
    export KEYTIMEOUT=1
    

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

    【讨论】:

    • 发现它here是公平的。
    【解决方案2】:

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

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

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

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

    这个插件解决了你的顾虑,具有以下特点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2011-09-29
      • 2020-05-21
      • 2021-09-29
      • 1970-01-01
      • 2016-10-06
      • 2021-09-23
      相关资源
      最近更新 更多