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


47

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


2
'man zshzle'によると、history-incremental-search-backwardはデフォルトではViモード(vicmd、viins)にバインドされていません。
ポール

回答:


56

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

zshzlemanページには、( man zshzle)のzshのラインエディタ、バインドキー、およびemacsの/ viのモードの詳細情報を持っています。


3
特にありがとうzshzle。これは非常に有益で便利です。
ハンクゲイ

わたしは、あなたを愛しています。真剣に。OSX El Capitanにアップグレードした後、逆検索はなくなり、毎日のワークフローで他の何よりもそれを逃しました。
クリスチャン

24

これは古くからの質問ですが、唯一の(そして受け入れられている)答えは、基本的に「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

2
それは使用することも良いことだ"^P" history-beginning-search-backward"^N" history-beginning-search-forwardvimのような自動補完のために(あなたが押して、入力を開始しますctrl+pctrl+n)。
cprn

私にとっては、?を表示しますbck-i-search。これはまさに私が探していたものです。ありがとうございました。
geowa4

@wjv history-incremental-search-backwardの利点は、globパターンをサポートしていることです。デフォルト/または「?」しない:coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989

@ alpha_989参照するブログ投稿は正しくありません。作成者に、^Rキーバインドをオーバーロードするzsh「フレームワーク」がインストールされている可能性があります。との両方history-search-backwardでサポートされる唯一の「正規表現のような」文字history-incremental-search-backward^、検索文字列を行の先頭に固定するためです。その本当の力はhistory-incremental-search-backward、その名前が示すように、インクリメンタル検索を行うことです。vicmdその理由から、キーマップでバインドしたいと思うかもしれません。
wjv

@wjv、あなたは右..私は書かれている必要がありますされているhistory-incremental-pattern-search-backward、ではありませんhistory-incremental-search-backwardhistory-incremental-pattern-search-backwardsウィジェットかもしれませんが、zshにはデフォルトでインストールされていると思います。正しく指摘されてglobいないパターンをサポートしregexています:zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators。投稿に間違いがあります
。– alpha_989
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.