friendly-grep、vimgrepを使いやすくするvimプラグイン

  • 10
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事は Vim Advent Calendar 2012 205日目の記事になります。
前回は@manga_osyoさんの Vim で指定した文字を挿入して行を結合するでした

friendly-grep.vim

vimgrepの書式がなんか覚えにくかったので使いやすくするブラグインを作りました。
ちょっとしたwrapperのようなもんですね。
ちなみに初めてのvim pluginリリース。 似たようなのがありそうな気がしますが、多分無い。

これを利用すれば「再帰検索って確かアスタリスク必要だっけ?」とか、
「キーワードと検索対象ってどっちを先に入力するんだっけ?」とか
意識する必要がなくなります。

よく検索するディレクトリを登録できたりも。

特徴

  • 対話式で、「キーワードを入力して」、「検索対象のディレクトリ(ファイル)を入力して」、「再帰検索する?」と聞いてくれる
  • よく検索するディレクトリやファイル名を登録しておくと、入力を省略できる
  • ディレクトリの入力はtab補完できる
  • いつも再帰検索する or しない場合は「再帰検索する?」といちいち聞いてこないようにできる
  • 検索結果の開き方を指定できる(quickfix, newtab, vsplit, splitのいずれか)
  • 内部的にはvimgrepを実行

インストール方法

friendly-grep.vim

.vimrcに以下を追加後、:BundleInstall あるいは :NeoBundleInstall を実行。

.vimrc
Bundle 'akira-hamada/friendly-grep.vim' " vundleの場合
NeoBundle 'akira-hamada/friendly-grep.vim' " NeoBundleの場合

使い方

単に :FriendlyGrep を実行するだけです。

あとは順番に検索クエリー、検索対象、再帰検索するかどうか(yあるいはn)を入力するだけでvimgrepが実行されます。
(デフォルトだとウィンドウが横分割されて検索結果を表示)

以下のように.vimrcでショートカットを設定したほうが良いでしょう。

.vimrc
  nnoremap <C-g> <ESC>:FriendlyGrep<CR>

検索結果の画面では :cnextや :cprevious で移動できますが、これも以下のような感じでショートカットを設定しといた方が吉。この辺のことはvimのquickfixのお話になります。

.vimrc
nnoremap <LEFT> :cprevious<CR> " 一つ前の結果へジャンプ
nnoremap <RIGHT> :cnext<CR> " 次の結果へジャンプ
nnoremap <UP> :<C-u>cfirst<CR> " 最初の結果へジャンプ
nnoremap <DOWN> :<C-u>clast<CR> " 最後の結果へジャンプ

オプション

便利に使うための3つの設定を.vimrcで設定できる。

.vimrc
let g:friendlygrep_target_dir = 'hoge/foo/bar/'
" よく検索するディレクトリあるいはファイル名を登録出来ます。
" 上記だと 'hoge/foo/bar/' が検索対象入力時に毎回入力済みになる。
" (デフォルトは空)

let g:friendlygrep_recursively = 1
" 毎回「再帰検索する?」と聞かれるのがウザい場合はこれを設定すると聞いてこなくなります。 
" 1 : 常に再帰検索 
" 0 : 常に非再帰検索
" (デフォルトはnull、毎回聞いてきます)

let g:friendlygrep_display_result_in = 'tab'
" 検索結果の開き方を指定出来ます。
" 'tab' : 新規タブに表示
" 'split' : 現在のウィンドウを横分割して上に表示 (デフォルト)
" 'vsplit' : 現在のウィンドウを縦分割して左に表示
" 'quickfix' : 現在のウィンドウにquickfixリストと共に表示

今後の課題

ちなみにMacVimでしか動作確認してません。バンバンissue登録なりpull-reqなりしてください。

  • :help friendlygrep でヘルプを表示させたいけど上手くいかない
  • splitする時の幅をユーザが設定できるようにしたい(今だとvsplitは width: 55 で固定)