如何在 ZSH 的 vi 模式中执行反向历史搜索?

如何在 ZSH 的 vi 模式中执行反向历史搜索?

vim基本上用它来满足我所有的编辑需求,所以我决定再次尝试我的 shell 的 vi 模式(目前 OS X 上是 ZSH w/oh-my-zsh),但我发现自己不断地尝试(但失败了)Ctrl-R。等效的键绑定是什么?为了将来的参考,我自己该如何解决这个问题?我很确定我可以bind -P在 bash 中使用。

答案1

您可以bindkey不带参数运行来获取现有绑定的列表,例如:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

在 emacs 模式下,您想要的绑定是history-incremental-search-backward,但在 vi 模式下默认不绑定。要自己绑定 Ctrl-R,您可以运行此命令,或将其添加到您的~/.zshrc

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

联机帮助页zshzle( man zshzle) 包含有关 zsh 行编辑器、bindkey 和 emacs/vi 模式的更多信息。

答案2

这是一个古老的问题,但唯一(也是公认的)答案基本上告诉人们如何将“emacs-like”移植history-incremental-search-backward到 vi 模式。虽然这是完全可行的,并且可能是适合您的正确解决方案,但有点奇怪的是,没有人提到搜索历史记录的“vi 方式”。

zsh 中的 vi 模式支持使用标准 vi/vim 键搜索历史记录: /?,这两个键在命令模式下都可用。(点击<Esc>可从插入模式切换到命令模式,就像在 vi 或 vim 中一样。)

不过,它们的含义是相反的:由于您通常希望反向搜索 shell 的历史记录,因此/进行反向搜索而?进行正向搜索。

显示第一个匹配项后,您可以(就像在 vi/vim 中一样)n继续查找同一方向上的更多匹配项,或N反转搜索方向。

键映射中的相关默认键绑定vicmd是:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search

答案3

在 的底部添加以下内容~/.zshrc,然后source ~/.zshrc

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

相关内容