我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