THINKING MEGANE

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_searcher

Unite.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 = 1
let 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でカレントディレクトリ以下のファイルに対して再帰的に検索が開始されます。

Unite Grep

こんな感じで候補が表示されるので、一番上のプロンプトで絞込語句を入力したり、Ctrl+p or Ctrl+nでカーソルを移動させることができます。

Enterで対象のファイルが新しいバッファで開きます。

カーソル位置の単語でパターン検索

開いているファイル内に検索したい語句がある場合は、カーソルをそこまで持っていき、,cgでOKです。

さきほどのPattern:のところにカーソル位置の単語が入力された状態になります。 あとの使い方は同じです。

検索結果の再呼び出し

候補を選択したあと、再度パターン検索の結果を表示したいときは、,rを入力します。

,g,cgで検索した結果は-buffer-name=search-bufferオプションによりバッファに保存しており、このバッファをUniteResumeで再利用することで再度結果を呼び出すことができます。

別の検索を実行するとバッファは上書きされます。


Tipsなど

パターン検索の起点ディレクトリを指定する

,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はこちらに公開しています。参考になればー。

GitHub: monochromegane/dotfiles

このエントリーをはてなブックマークに追加