我可以在命令行上使用 Vim 编辑模式而不丢失递归历史搜索吗?

Nat*_*ong 10 vim zsh history

我正在使用 zsh,并且因为我是一个狂热的 Vim 用户,所以我只是切换到在命令行上使用 Vim 风格的编辑。(这意味着如果我输入ls foo/bar并决定我想要cd,我可以点击Esc ^跳回开头并cw cd更改lscd.

这都是花花公子,但问题是我不能再使用Ctrl+R递归历史搜索。有没有另一种方法可以做到这一点,或者我可以以某种方式覆盖 Vim 键绑定以取回它?

Jde*_*eBP 6

当然,您不能再使用Ctrl+ R。如果您查阅 Z Shell 手册,您将看到键盘映射中的history-incremental-search-backward小部件只有一个键绑定emacs。vi 键盘映射中没有它的键绑定。

但是,正如您在阅读手册(第 18 章)中也会发现的那样,添加键绑定是使用该bindkey命令的一个相当简单的练习:

bindkey "^R" history-incremental-search-backward
Run Code Online (Sandbox Code Playgroud)

您甚至不必使用该zle命令将小部件映射到 shell 函数,因为这是一个标准小部件。

如果您查阅Z Shell wiki 上相同问题的答案,您将看到专门将其添加到 vi“命令”和“插入模式”键映射的命令:

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward
Run Code Online (Sandbox Code Playgroud)

另请注意,正如 garyjohn 指出的那样,在 vi“命令”键盘映射中,/字符绑定到vi-history-search-backward小部件。此小部件和history-incremental-search-backward小部件之间的区别在于小部件行为一旦进入历史搜索模式就会应用。以下是您会注意到的一些差异:

  • 切换vi模式:
    • 当您调用小部件同时仍处于搜索模式时,搜索模式history-incremental-search-backward会在main和 键vicmd映射之间切换vi-cmd-mode。即从emacsmodeEsc按下键或Ctrl+ XCtrl+V键在emacs和键vicmd映射之间切换搜索模式。(因此history-incremental-search-backward从键vicmd映射调用很麻烦,除非您vi-cmd-mode也在键vicmd映射中绑定了一些东西。)
    • 中的搜索模式vi-history-search-backwardvi-cmd-mode小部件视为accept-line并将结束搜索,重新进入您从中输入搜索的命令模式。即(使用默认绑定)/从命令模式进入搜索模式并Esc返回到命令模式。
  • 重复搜索:
    • 在 中history-incremental-search-backward,可以识别history-incremental-search-backwardvi-rev-repeat-search小部件。即(假设您已按上述方式更改了绑定)Ctrl+RN都将搜索前面的匹配行。
    • 在 中vi-history-search-backward,仅vi-rev-repeat-search识别小部件。即(假设您已按上述方式更改了绑定)Ctrl+R将导致发出哔声并被忽略。