VIMで対話的に検索/ grepする方法は?


12

プロジェクト全体のすべてのファイル内をインタラクティブに検索するようにVIMを構成する方法はありますか?

することで、インタラクティブ、私は、各キーストロークを更新する意味します。

Emacs counsel-git-grepのようなものは、サンプルデモを参照してください。


私は個人的にそれを使用しないので、私は100%確信していませんが、私ctrl-pはあなたが探しているものだと思うか、同様のプラグインです。それunite.vimもできるはずですが、私の意見ではかなり重くてバグを作成するプラグインなのでお勧めしません。
statox

DOESは、ctrl-p対話形式で、ファイルの内容を検索する方法がありますか?名前に基づいてファイルをインタラクティブに検索するためだけに使用したことがあります。
ideasman42

私はそれが可能だと思うが、私は、私はそれを使用していないと述べたように多分私は間違っている
statox

回答:


14

これがあなたが探しているものかどうかはわかりませんが、おそらくfzffzf.vimを試すことができます。

プラグインマネージャとしてvim-plugを使用する場合、それらをインストールするために必要な作業は、次の行をに追加するだけvimrcです:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

...行間のどこか:

call plug#begin('~/.vim/plugged')

そして:

call plug#end()

次にを実行し:PlugInstallます。


によって提供されるさまざまなコマンドとマッピングfzf.vim(その唯一の目的は、fzf定義済みのソースを介したファジー検索を要求するマッピングとコマンドをインストールすることであると思われる)には、コマンドがあり:Agます。

使用するには、シェルコマンドagをインストールする必要があります。Debianベースのディストリビューションでは、次のコマンドで実行できます。

apt-get install silversearcher-ag

githubのプロジェクトでは、MacOSにインストールする方法を説明しています。

brew install the_silver_searcher

:Agは、のラッパー$ agであり、現在のディレクトリ(を入力したときに表示されるディレクトリ)のファイル内のパターンをファジー検索できます:pwd。一致は、キーストロークごとに更新されます。

あなたはできる:

  • サイクル前後で一致してC-nC-p
  • 現在のマッチを選択し、で次/前の1に移動Tab/S-Tab
  • 選択または選択解除すべての一致をしM-aたりM-d

1つまたは複数の一致を選択した場合、Enterキーを押すと、クイックフィックスリストに入力されます。そこから次のような、デフォルトのVimのコマンド/マッピングでそれらをナビゲートできるようになります:cnext:cprevious

ここに画像の説明を入力してください

によってインストールされたすべてのコマンドにプレフィックスを追加し、fzf.vim既存のコマンドを上書きしないようにする場合は、これをに追加できますvimrc

let g:fzf_command_prefix = 'your_prefix'

Fzfは接頭辞として使用します。だから私はタイプしませんでした:Ag:FzfAg


git grep代わりに使用する場合はag、次のように、独自のカスタムラッパーをインストールできるようです:GGrep

command! -bang -nargs=* GGrep
  \ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)

で説明されてい:h fzf-vim-customizationます。

また、場合はfzftmuxの中にペインを開き、あなたはそれではなく、画面全体を取る好むだろう、あなたはすべてのコマンドに強打を追加することができます(:Ag!:GGrep!、...)。


最後のコメントで述べたように、デフォルトでfzfはシェルの構成を変更します。たとえば、を使用する場合bash、次の行がに追加されます~/.bashrc

[ -f ~/.fzf.bash ] && source ~/.fzf.bash

これにより、ファイルが取得されます~/.fzf.bash。後者にはいくつかのコードが含まれています。

# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
  export PATH="$PATH:/home/user/.fzf/bin"
fi

# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null

# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"

このコードは、環境変数にパスを追加します$PATH/home/user/.fzf/bin; これは、fzfプログラムを含むフォルダーです。

また、他の2つのファイルも取得します。

/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash

最初のものは補完機能を定義しているようですが、2番目のものはキーバインディングをインストールします。

残念ながら、キーバインディングはデフォルトのreadline機能をオーバーライドする場合があります。
たとえばfzf、関数fzf-file-widgetをにバインドしますC-t。このキーは通常、transpose-chars関数を実行するためにreadlineによって使用されます。

これが望ましくない場合、可能な解決策の1つは、構成のソースを取得した~/.bashrcfzfに、内のキーバインディングを復元することです。たとえばC-t、カーソルの周りの2文字を転置し、fzf-file-widget別のキーにバインドするという古い動作を維持したいC-x C-t場合は、次の行の最後にこれらの行を追加できます~/.bashrc

bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'

同じことがzshシェルにも当てはまりますが、キーバインディングをインストールする構文は少し異なります。

bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars

使用していたシェルキーバインディングの1つがによってオーバーライドされたfzf場合、それを復元したいが、実行された関数の正確な名前がわからない場合は、次のことを試すことができます。

まず、の内部で~/.bashrcfzf構成のソースとなる行を一時的にコメント化します。次に、ターミナルを再度開き、bind -Pコマンドの出力を確認します。出力はVimバッファーで読み取ることができます。

bind -P | vim -R -

よくわかりませんが、ほとんどまたはすべてのreadlineキーバインディングが表示されるはずです。C-tキーにバインドされたreadline関数の名前をVimバッファーで探して\\C-tいる場合は、を検索します。M-c(meta / altキー)にバインドされているものを探している場合、検索します\\ec\eエスケープキーを表しM-c、と同じキーコードを生成するようですescape + c)。

コマンドのzsh出力を見ると、同じことができますbindkey。ただし、今回^[は、meta / alt修飾子キーを^表し、単一のキャレット()文字はコントロールキーを表します。


現在、fzf名前にキーワードを含む関数を実行する4つのキーバインディングが見つかりました。彼らは、キーシーケンスを使用C-i(と同じTab)、 C-rC-tM-c。これらは、次の機能にバインドされています。

C-i    fzf-completion
C-r    fzf-history-widget
C-t    fzf-file-widget
M-c    fzf-cd-widget

私のシステムでは、元々readlinebashコマンドラインの編集に使用されるライブラリ)がこれらのキーを次の機能にバインドしていました。

C-i     complete
C-r     reverse-search-history
C-t     transpose-chars
M-c     capitalize-word

そしてzle(で使用される行エディタzsh)、それらを次のようにバインドします:

C-i     expand-or-complete
C-r     history-incremental-search-backward
C-t     transpose-chars
M-c     capitalize-word

1
あるagニーズがインストールされていることを、別のプラグイン/ツール?
ideasman42 16

@ ideasman42はい、申し訳ありませんが、シェルコマンドagも必要であることを忘れていました。答えを更新しました。
user9433424 16

1
これらのツールはかなり煩わしく、デフォルトでbashとzshの構成を置き換えることに注意してください。
-ideasman42

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