すべての開いているバッファーの検索結果を表示する方法


17

私がよくすることの1つ(ただし、コマンドラインを使用すること)は、複数のファイルの検索/取得です。

すべての開いているバッファの検索結果を表示する方法はありますか?

理想的には、結果の場所とスニペットを含む新しいスプリットバッファが欲しいのgrepです。例(/statistics):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

ボーナスとして、カーソルの下にある用語を検索できるようにしたいと思いますgd


回答:


15

を使用:vimgrep /pattern/ {files}して、一致するパターンをクイックフィックスリストに追加できます。問題は、:vimgrepファイルオプションが直接バッファを許可しないことです。次を使用できます。

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

別のオプションは、からファイルリストを生成するスクリプトを書くこと:buffersです。パーこのSOポスト我々が得るわずかなtweekと:

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

これで、代わりにバッファを使用して:GrepBufs <expression>、標準:vimgrep出力を呼び出して取得できます。

更新GrepBuffersカーソルの下の値を使用して呼び出したい場合は、この新しいマッピングを追加します。

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

あなたはノーマルモードタイプである場合<leader>z、あなたはよ:vimgrep、あなたの開いているバッファ上にカーソルを単語を。


2
単一行形式:command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')。使用法::Bufgrep/foo/
ピーターリンカー

8

開いているバッファのみを検索するのは便利ですが、プロジェクト全体を検索したい場合があります。思ったよりも速くて簡単です!

プロジェクト全体を検索する

  • grepUnix標準の検索ツールです。その遍在のために言及する価値があります。すでに:grepコマンドでVimに統合されています。例えば:grep -r 'foo'。をご覧ください:h :grep
  • Ackは、VCSディレクトリ、バイナリファイルをスキップし、などの特定の種類のファイルタイプを検索できるため、通常のgrepよりも高速です--perl。Vimの統合については、Ack.vimを参照してください
  • Ag the Silver Surferは、ackに似たコード検索ツールですが、高速です。Vimプラグイン:Ag.vim
  • git grepリポジトリを非常に迅速に検索します。Fugitive.vimが提供します:Ggrep
  • RipgrepはAgやgit grep:grep同様に使用できます。

ripgrepとAgの両方をお勧めしgit grepます。これらはすべて非常に高速です。1700秒以上で4700以上を検索しました。ripgrepを倒すのはかなり難しいです。

プラグインなしでこれらの選択肢のいずれかをテストするか、単にプラグインが必要ない場合は、'grepprg'それに応じてオプションを設定できます。例set grepprg=ag\ --vimgrepまたはset grepprg=rg\ --vimgrep:h 'grepprg'および:h 'grepformat'を参照してください。で検索できるようになりました:grep。例えば:grep 'foo'

:vimgrepVimが利用可能なすべてのシステムで利用可能な最終フォールバックとして使用できます。詳細について:h :vimgは、を参照してください。

クイックフィックスリスト

これらのオプションのほとんどはクイックフィックスリストを使用するため、クイックフィックスリストを横断するために、よりわかりやすいマッピングを使用することをお勧めします。私はティム教皇の使用健常使用するプラグイン]q[qのために:cnext:cprev、それぞれを。一部の人々は、検索の実行後にクイックフィックスを開き、次を~/.vimrcファイルに追加することを好みますautocmd QuickFixCmdPost *grep* cwindow。を使用して、QuickFixリストを手動で開くこともでき:copenます。

さらに高速な「検索」が必要ですか?

ctagscscopeGNU globalなどの事前に作成されたインデックスを使用するツールを使用する必要があります。

  • Vimはを経由してCTAGのサポートが組み込まれています:tag<c-]>および他の多くのコマンドとオプション。をご覧ください:h tags。また、GitでEffortless Ctagsを読むか、Gutentagsプラグインを調べることもできます。
  • Cscopeサポートも組み込まれており、:cscopeコマンドで使用できます。見る:h cscope

さらにヘルプ

私はこの素敵なVimcastエピソードから始めます:vimgrep:で複数のファイルを検索します

Vimヘルプの詳細については、ドキュメントを参照してください。

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

私のGrepCommandsプラグイン:vimgrep、すべての引数、リストされたバッファー、現在のタブページのウィンドウ、またはその検索のすべてのタブページを対象とする組み込みコマンドのバリアントを定義します。基本的に、@ jecxjoの答えの堅牢なプラグイン実装です。


1

コマンド:bufdo:vimgrepadd

この回答は/programming//a/11976158/1057593に基づいています

しかし、私はいくつかのビットを追加したかった。繰り返しますが、基本的なコマンドは

:bufdo vimgrepadd pattern %

クイックフィックスリストが空でない場合は、最初にそれをクリアすることをお勧めします(/programming//q/27385970/1057593を参照)。これは

:cexpr []

vim-unimpairedはマッピング]qを提供[qし、マッチを循環します。

cmdline-history

で検索パターンを個別に入力するのは良いワークフロー/patternです。これにより、現在の検索パターンを使用して、コマンドライン履歴から汎用コマンドを使用できます。これは次のようになります

/pattern
:bufdo vimgrepadd // %

典型的な新しいバッファ全体の検索は

/pattern2
:bufdo<up><up>...

私が使用するために私のvimrcに次のマッピングを追加している<C-N>と、<C-P>代わりに矢印キーの

cmap <C-P> <Up>
cmap <C-N> <Down>

コマンド履歴を検索するq:には/bufdo<CR>、を使用し、でコマンドを呼び出し<CR>ます。詳細については、https://vim.fandom.com/wiki/Using_command-line_historyおよびヘルプページ:h historyとを参照してください:h cmdline-window

再利用可能なコマンド:copenに追加すると、次の方法でクイックフィックスリストをすぐに表示できます。

:execute "bufdo vimgrepadd // %" | copen

:bufdo vimgrepadd // % | copen私の場合、stackoverflowからの提案により、意図しないウィンドウがいくつか開かれました。

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