Vim プラグイン紹介第三弾は Quickfix 用プラグインです。みなさん、Quickfix 使ってますか? 使ってないなら今日から使いましょう。破壊力抜群ですよ。
今回もソースは bitbucket に置いてあります。
https://bitbucket.org/anyakichi/vim-qfutil
ところで、Vim には quickfix というものと、location list というものがあります。quickfix は Vim プロセスに対してグローバル、location list は 1 つのウィンドウに対してローカルという違いはありますが、基本的な機能は同じです。好みでグローバルとローカルと使い分けなさい、ということだと思います。
で、人によっては quickfix と loction list にバラバラにキーマッピングしていたりすると思いますが、機能は一緒だし両方を同時に使うことはまずないんだから、同じキーマッピングで両者をトグルして使おうよ、というのが今回のプラグインです。正直、機能らしい機能は何もないです。
ということで、私の.vimrcからキーマッピング等を一部抜粋。
nnoremap <silent> q\ :<C-u>call qfutil#toggle()<CR>
nnoremap <silent> <C-j> :<C-u>call qfutil#next(v:count)<CR>
nnoremap <silent> <C-k> :<C-u>call qfutil#previous(v:count)<CR>
nnoremap <silent> g<C-j> :<C-u>call qfutil#last(v:count)<CR>
nnoremap <silent> g<C-k> :<C-u>call qfutil#first(v:count)<CR>
nmap <C-g><C-j> g<C-j>
nmap <C-g><C-k> g<C-k>
nnoremap <silent> q. :<C-u>call qfutil#toggle_window()<CR>
nnoremap <silent> qq :<C-u>call qfutil#qq(v:count)<CR>
nnoremap <silent> qn :<C-u>call qfutil#nfile(v:count)<CR>
nnoremap <silent> qp :<C-u>call qfutil#pfile(v:count)<CR>
nnoremap <silent> qa :<C-u>call qfutil#list()<CR>
nnoremap <silent> qo :<C-u>call qfutil#older(v:count)<CR>
nnoremap <silent> qi :<C-u>call qfutil#newer(v:count)<CR>
nnoremap <silent> <expr> qm qfutil#make()
nnoremap <expr> q<Space> qfutil#make('')
nnoremap <expr> qg qfutil#grep('')
nnoremap <silent> q] :<C-u>call qfutil#ltag()<CR>
augroup MyAutoCmd
autocmd!
autocmd QuickFixCmdPost [^l]* cwindow
autocmd QuickFixCmdPost l* lwindow
augroup END
q\ で quickfix と location list がトグルされるので、あとは quickfix も location list も同じキーマッピングで使えます。
ここで簡単な使用例を少し。まずは NetBSD のソースツリーの sys あたりでおもむろに vim を起動します。

次に、qg とタイプすると、quickfix と location list のどちらのモードかにより :grep か :lgrep が挿入されます。デフォルトは location list になっているので、以下で入力されているのは :lgrep の方です。ここでは kern 以下の .c ファイルから、SS_CANTRCVMORE を含む行を探してみましょう。

リターンを押すと検索が実行され、location list ウィンドウが自動で開きます。もしも自動で開かなかった場合には、q. をタイプすると開くと思います。ここでは最初にマッチする uipc_socket.c の 1163 行目にジャンプしています。

ここで C-j をタイプすると次の項目に、C-k をタイプすると前の項目にそれぞれジャンプできます。以下は C-j を 4 回タイプした後で、uipc_socket2.c の 209 行目に飛んでいることがわかります。

ちなみに quickfix というのは名前の通り、本来は make したときのコンパイラのエラーログから、当該箇所にジャンプすることを想定された機能です。ですので grep ではなく make でも便利に使えるので、使ってみたい方は Vim のヘルプを参照してみてください。