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

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

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

一切都很好,但问题是我不能再使用它Ctrl+R进行递归历史搜索了。还有其他方法吗?或者我能以某种方式覆盖 Vim 键绑定来恢复它吗?

答案1

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

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

bindkey "^R" history-incremental-search-backward

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

如果你咨询Z Shell wiki 上也有这个问题的答案,您将看到专门将其添加到 vi“命令”和“插入模式”键盘映射的命令:

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

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

  • 切换 vi 模式:
    • 当您在搜索模式下调用小部件时,搜索模式会在和键盘映射history-incremental-search-backward之间切换。即,在模式下按下键或+ +键会在和键盘映射之间切换搜索模式。(因此,从键盘映射调用很麻烦,除非您也在键盘映射中绑定了某些东西。)mainvicmdvi-cmd-modeemacsEscCtrlXCtrlVemacsvicmdhistory-incremental-search-backwardvicmdvi-cmd-modevicmd
    • 搜索模式将vi-history-search-backwardvi-cmd-mode部件视为accept-line并将结束搜索,重新进入您从中输入搜索的命令模式。ie(使用默认绑定)/从命令模式进入搜索模式并Esc返回命令模式。
  • 重复搜索:
    • 在 中history-incremental-search-backwardhistory-incremental-search-backwardvi-rev-repeat-search小部件均能被识别。即(假设您已经按照上述方式更改了绑定)Ctrl+RN都会搜索前面的匹配行。
    • 在 中vi-history-search-backward,只有vi-rev-repeat-search小部件可以被识别。即(假设您已经按照上述方式更改了绑定)Ctrl+R将发出哔声并被忽略。

答案2

在 bash 的 vi 模式下,输入<Esc>/<string><Enter>将在命令历史记录中搜索<string>n将在历史记录中进一步向前搜索;N将会向前搜索。zshell 可能也是一样。

答案3

我更喜欢使用:

bindkey -M vicmd '/' history-incremental-search-backward

这样我就可以输入ESC /text并查看命令行。如果我想转到下一场比赛,我输入ESC n

相关内容