web-dev-qa-db-ja.com

ZSHのviモードで逆履歴検索を実行するにはどうすればよいですか?

私は基本的にすべての編集ニーズにvimを使用しているので、シェル(現在はOS Xのoh-my-zshを使用したZSH)で再びviモードを試すことにしましたが、失敗する)Ctrl-R常に。同等のキーバインドとは何ですか?そして、今後の参考のために、これを自分でどのように理解できるでしょうか? bind -P bashで。

49
Hank Gay

引数なしで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モードに関する詳細情報があります。

59
mrb

これは古代の質問ですが、唯一の(そして受け入れられた)答えは、基本的に「emacsのような」history-incremental-search-backwardからviモードへ。これは完全に実行可能であり、あなたにとって正しい解決策かもしれませんが、誰も歴史を検索する「viの方法」について言及していないのは少し奇妙です。

zshのviモードは、標準のvi/vimキーを使用した履歴の検索をサポートしています:/および?、どちらもコマンドモードで使用できます。 (ヒット<Esc>は、viまたはvimと同様に、挿入モードからコマンドモードに切り替えます。

ただし、その意味は逆になります。通常、シェルの履歴を逆に検索したいので、/は逆検索を行いますが、?は前方検索を行います。

最初のヒットが表示されたら、(vi/vimと同じように)nを使用して同じ方向でさらにヒットを検索するか、Nを使用して検索方向を逆にすることができます。

vicmdキーマップの関連するデフォルトのキーバインディングは次のとおりです。

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