再帰的な履歴検索を失うことなく、コマンドラインでVim編集モードを使用できますか?


8

私はzshを使用していますが、私は熱心なVimユーザーなので、コマンドラインでVimスタイルの編集を使用するように切り替えました。(つまり、入力ls foo/barしてcd代わりに入力したい場合は、ヒットEsc ^して最初に戻り、cw cdに変更lsできcdます。

それはすべて厄介ですが、問題は、Ctrl+R再帰的な履歴検索を実行するために使用できなくなったことです。それを行う別の方法はありますか、それともそれを取り戻すためにどういうわけかVimキーバインドをオーバーライドできますか?


難しい選択です!garyjohnVimがそれを行う方法を示し、JdeBPCtrl + Rのキーバインドを元に戻す方法を示します!両方の方法を試して、後で回答を受け入れます。1)どちらの方法が私にとってより簡単に見えるか、2)どちらがより多くの投票を獲得するかに基づいて決定します。二人ともありがとう!
ネイサンロング

回答:


6

もちろん、Ctrl+ はもう使用できませんR。Z Shellのマニュアルを参照するhistory-incremental-search-backwardと、emacsキーマップにウィジェットのキーバインディングしかないことがわかります。viのキーマップには、そのキーバインディングはありません。

しかし、マニュアル(18章)を読んでもわかるように、キーバインディングを追加することは、bindkeyコマンドを使用する上で非常に単純な練習です。

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

zleこれは標準のウィジェットなので、コマンドを使用してウィジェットをシェル関数にマップする必要はありません。

あなたが相談した場合はZシェルウィキにあり、これと同じ質問に対する答えを、あなたは特にviの「コマンド」と「挿入モード」キーマップにこれを追加するためのコマンドが表示されます:

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

また、garyjohnが指摘しているように、vi「コマンド」キーマップでは、/キャラクターはvi-history-search-backwardウィジェットにバインドされています。このウィジェットとウィジェットの違いは、履歴検索モードになるhistory-incremental-search-backwardと適用されるウィジェットの動作です。気づく違いは次のとおりです。

  • viモードの切り替え:
    • で検索モードhistory-incremental-search-backwardを切り替えますmainvicmd、あなたが呼び出しキーマップvi-cmd-modeまだ検索モードに滞在しながらウィジェットを。すなわちからemacspresssingモードEscキーまたはCtrl+ XCtrl+ Vキーの間に検索モードを切り替えますemacsvicmdキーマップを。(起動history-incremental-search-backwardからvicmdあなたが何かに結合していない限り、キーマップは、煩雑であるvi-cmd-modevicmdにもキーマップを。)
    • の検索モードvi-history-search-backwardは、vi-cmd-modeウィジェットをとして扱い、accept-line検索を終了し、検索を入力したコマンドモードを再入力します。つまり、(デフォルトのバインディングを使用して)/コマンドモードから検索モードに入り、コマンドモードEscに戻ります。
  • 検索を繰り返す:
    • ではhistory-incremental-search-backward、ウィジェットhistory-incremental-search-backwardvi-rev-repeat-searchウィジェットの両方が認識されます。つまり、(上記のようにバインディングを変更したと仮定して)Ctrl+ Rとの両方Nで、先行する一致する行を検索します。
    • ではvi-history-search-backwardvi-rev-repeat-searchウィジェットのみが認識されます。つまり、(上記のようにバインディングを変更したと想定)Ctrl+ Rビープ音が発生し、無視されます。

私の筋肉の記憶はあなたを祝福します!
ネイサンロング

4

bashのviモードでは、入力<Esc>/<string><Enter>するとコマンド履歴でが検索され<string>ます。n履歴をさらに検索します。N前方に検索します。zshellは同じかもしれません。


1
それは興味深いですが、私は検索をVimの動きとして頻繁に使用しています。検索履歴に固定されているため、現在編集中のコマンド内で移動することはできないと思います。
ネイサンロング

正しい。しかし、(少なくともbashでは)f、F、t、T、 ';'を使用できます。(セミコロン)、および '、'(コンマ)コマンドを使用して、行の特定の文字に前後に移動します。
garyjohn 2011

1

私は使用することを好む:

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

これによりESC /text、コマンドラインを入力して表示できます。次の試合に行きたい場合は、ESC n

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.