agとUnite.vimで快適高速grep環境を手に入れる
今までVim内のgrepにはUnite.vimを使っていたんですが、ファイル数が多いときに遅く感じることがあったので、前回導入したag(The Silver Searcher)と組み合わせて快適高速grep環境をつくりました。
The Silver Searcher と Unite.vim
The Silver Searcherは、grepやackより高速な検索が売りのパターン検索を行うコマンドです。
また、Unite.vimは、様々なデータソースを共通のインターフェースで操作できるプラグインです。
ディレクトリのファイル一覧や、バッファ一覧などを同じインターフェースで操作できるので使いはじめると手放せなくなるプラグインです。
The Silver Searcherについてはこの辺が分かりやすいと思います。
インストール
The Silver Searcher のインストール
Macの場合、homebrewで提供されてます。
$ brew install the_silver_searcherUnite.vim のインストール
BundleやNeoBundleによるインストールがおすすめです。
Bundleの場合~/.vimrcに以下を記述してノーマルモードで:BundleInstallを実行、インストールします。
Bundle "Shougo/unite.vim"Bundle "git://github.com/Shougo/vimproc"インストール後、vimprocをコンパイルします。
$ cd ~/.vim/bundle/vimproc$ make# Macの場合makeファイルはOSごとに違うので公式のREADMEを確認してください。
設定
~/.vimrcに以下を記述します。
" insert modeで開始let g:unite_enable_start_insert = 1" 大文字小文字を区別しないlet g:unite_enable_ignore_case = 1let g:unite_enable_smart_case = 1" grep検索nnoremap <silent> ,g :<C-u>Unite grep:. -buffer-name=search-buffer<CR>" カーソル位置の単語をgrep検索nnoremap <silent> ,cg :<C-u>Unite grep:. -buffer-name=search-buffer<CR><C-R><C-W>" grep検索結果の再呼出nnoremap <silent> ,r :<C-u>UniteResume search-buffer<CR>" unite grep に ag(The Silver Searcher) を使うif executable('ag') let g:unite_source_grep_command = 'ag' let g:unite_source_grep_default_opts = '--nogroup --nocolor --column' let g:unite_source_grep_recursive_opt = ''endif使い方
カレントディレクトリ以下をパターン検索
ノーマルモードで,gを入力するとVimのコマンドラインに
Pattern:と表示されるので、検索したいパターンを入力、Enterでカレントディレクトリ以下のファイルに対して再帰的に検索が開始されます。

こんな感じで候補が表示されるので、一番上のプロンプトで絞込語句を入力したり、Ctrl+p orCtrl+nでカーソルを移動させることができます。
Enterで対象のファイルが新しいバッファで開きます。
カーソル位置の単語でパターン検索
開いているファイル内に検索したい語句がある場合は、カーソルをそこまで持っていき、,cgでOKです。
さきほどのPattern:のところにカーソル位置の単語が入力された状態になります。あとの使い方は同じです。
検索結果の再呼び出し
候補を選択したあと、再度パターン検索の結果を表示したいときは、,rを入力します。
,gや,cgで検索した結果は-buffer-name=search-bufferオプションによりバッファに保存しており、このバッファをUniteResumeで再利用することで再度結果を呼び出すことができます。
別の検索を実行するとバッファは上書きされます。
パターン検索の起点ディレクトリを指定する
,gや,cgで呼び出すUnite grepはプロジェクトのトップディレクトリで使うことを想定おり、カレントディレクトリ配下をデフォルトで指定するようにしています。
もしパターン検索の起点ディレクトリを毎回指定するときは、Unite grep:.の:.を削除してください。
Patternプロンプトの前に、Target:が表示されるようになり、ここで起点ディレクトリを指定できるようになります。
EUC-JP/Shift-JISのファイルがパターン検索にひっかからない
The Silver SearcherはEUC-JP/Shift-JISのエンコードがされたファイルをバイナリと見なして検索対象から除外します。もしそれらのエンコードのファイルを利用する場合は、EUC-JP/Shift-JISのファイルも検索対象とする修正版を提供しているのでこちらを利用してみてください。
詳細はこちら
homebrewならインストールは簡単です。
brew install https://gist.github.com/morygonzalez/6588887/raw/b09a904e7ca9dd09abfef88b0e0e98a50a206d3b/the_legacy_searcher.rb既存のコマンドはbrew uninstall the_silver_searcherでアンインストールしておいてください。
Unite.vimは標準でもgrepが同梱されているのですが、agと組み合わせることでより高速な環境を手にいれることができます。Unite.vimは他にもたくさんのことができるのでプラグインを探してみてください。
ちなみに自分のdotfileはこちらに公開しています。参考になればー。