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

Han*_*Gay 64 command-history zsh vi-mode

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

mrb*_*mrb 71

您可以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
Run Code Online (Sandbox Code Playgroud)

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

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

该zshzle手册页(man zshzle)对的zsh的行编辑器,bindkey,和emacs / VI模式的更多信息。

  • 谢谢,特别是`zshzle`。这是非常有用的信息。 (3认同)

wjv*_*wjv 45

这是一个古老的问题,但唯一(并被接受)的答案基本上是告诉人们如何将“类 emacs”移植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
Run Code Online (Sandbox Code Playgroud)

  • 使用 `"^P" history-beginning-search-backward` 和 `"^N" history-beginning-search-forward` 进行类似 vim 的自动补全(你开始输入,然后按 `ctrl+p` 或`ctrl+n`)。 (6认同)