我正在使用 zsh,因为我是 Vim 的狂热用户,所以我刚刚切换到在命令行上使用 Vim 风格的编辑。(这意味着如果我输入ls foo/bar
并决定改为cd
这样,我可以点击Esc ^
跳回到开头并cw cd
更改ls
为cd
。
一切都很好,但问题是我不能再使用它Ctrl+R
进行递归历史搜索了。还有其他方法吗?或者我能以某种方式覆盖 Vim 键绑定来恢复它吗?
答案1
当然,您不能再使用Ctrl+ 。如果您查阅 Z Shell 手册,您会发现键盘映射中R只有一个小部件的键绑定。vi 键盘映射中没有它的键绑定。history-incremental-search-backward
emacs
但是正如您从阅读手册(第 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
之间切换。即,在模式下按下键或+ +键会在和键盘映射之间切换搜索模式。(因此,从键盘映射调用很麻烦,除非您也在键盘映射中绑定了某些东西。)main
vicmd
vi-cmd-mode
emacs
EscCtrlXCtrlVemacs
vicmd
history-incremental-search-backward
vicmd
vi-cmd-mode
vicmd
- 搜索模式将
vi-history-search-backward
小vi-cmd-mode
部件视为accept-line
并将结束搜索,重新进入您从中输入搜索的命令模式。ie(使用默认绑定)/从命令模式进入搜索模式并Esc返回命令模式。
- 当您在搜索模式下调用小部件时,搜索模式会在和键盘映射
- 重复搜索:
- 在 中
history-incremental-search-backward
,history-incremental-search-backward
和vi-rev-repeat-search
小部件均能被识别。即(假设您已经按照上述方式更改了绑定)Ctrl+R和N都会搜索前面的匹配行。 - 在 中
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