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


8

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

这全都是花花公子,但问题是我再也无法Ctrl+R用于执行递归历史搜索。还有另一种方法可以执行此操作,还是可以以某种方式覆盖Vim键盘绑定以将其取回?


艰难的选择!garyjohn展示了一种Vim的方法,并JdeBP展示了如何获取Ctrl + R的快捷键!我将使用这两种方法并在以后接受答案。我将根据1)哪种方法对我来说更容易,以及2)哪种方法获得更多投票来做出决定。感谢你们俩!
内森·朗

Answers:


6

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

但是,您也可以从阅读手册(第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会在mainvicmd映射之间切换vi-cmd-mode。即从emacs模式下,Esc按键或Ctrl+ XCtrl+ V键可在emacs和键图之间切换搜索模式vicmd。(调用history-incremental-search-backwardvicmd键盘映射这样麻烦,除非你绑定的东西vi-cmd-modevicmd键盘映射为好。)
    • 中的搜索模式vi-history-search-backwardvi-cmd-mode小部件视为accept-line,并将结束搜索,然后重新输入您从中输入搜索的命令模式。即(使用默认绑定)/从命令模式进入搜索模式,Esc然后返回命令模式。
  • 重复搜索:
    • 在中history-incremental-search-backwardhistory-incremental-search-backwardvi-rev-repeat-search都可以识别。即(假设您已按上述方式更改了绑定)两个Ctrl+ RN会搜索前一个匹配行。
    • 在中vi-history-search-backward,仅vi-rev-repeat-search可识别小部件。即(假设您已如上所述更改绑定)Ctrl+ R将导致发出哔声并被忽略。

我的肌肉记忆祝福您!
内森·朗

4

在bash的vi模式下,键入<Esc>/<string><Enter>将在命令历史记录中搜索<string>n将进一步追溯历史;N将向前搜索。zshell可能相同。


1
不过,这很有趣-我经常将搜索作为Vim中的一种动作。我想我不能用它在我当前正在编辑的命令中移动,因为它与搜索历史挂钩,是吗?
内森·朗

对。但是您可以(至少以bash格式)使用f,F,t,T,';' (分号)和','(逗号)命令向前和向后移动到该行中的特定字符。
garyjohn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.