quickrun.vim で make する

この記事は Vim Advent Calendar 2012 106日目の記事になります。
もうすぐ煩悩の数に追いつきそうですね。


quickrun.vim でもやってみた。


って事で簡単に quickrun.vim でも make を試してみました。
と、言っても基本的に quickrun.vim で行うことは make コマンドの呼び出しぐらいなんですけどね。

" :QuickRun make
" で make する
" outputter や runner はお好みで
let g:quickrun_config = {
\   "make" : {
\       "command"   : "mingw32-make",
\       "exec" : "%c %o",
\       "outputter" : "error:buffer:quickfix",
\       "runner" : "vimproc",
\   },
\}



通常 quickrun.vim は現在のバッファに書かれているコード(or ファイル)を対象とするのですが、別にそうであるべき必要はなく、こんな感じにコマンドを呼ぶだけの処理にも利用する事が出来ます。


この時に quickrun.vim を使用する利点としては、

  • runner-vimproc を使用する事で簡単に非同期処理ができる
  • outputter を指定して出力先を自由に設定できる
  • hook が利用出来る
  • 上記のような設定を自由に組み合わせることが出来る

というような感じでしょか。
quickfix に出力し、unite-quickfix を使用すれば unite-build のように unite.vim への出力も簡単に行うことが出来ます。
また quickfix へと出力すれば vim-hier を使用してソースコード上のハイライトも出来ますね。


と、いう風にこういう感じで quickrun.vim を利用してみるのもいかがでしょうか。
ちなみに make されたバイナリを実行するような設定も書いておけば make してすぐにバイナリを実行することも出来ますね。
以下、捕捉。

[カレントディレクトリを指定する]

コードを書いている際にカレントディテクトリが makefile 以外の場所に移っているかもしれません
そういう時は hook-cd を使用すればカレントディレクトリを変更して実行することが出来ます。

" D:/test/aaa をカレントディレクトリとして make を実行する
" hook/cd/directory にカレントディレクトリを設定
let g:quickrun_config = {
\   "make" : {
\       "command"   : "mingw32-make",
\       "exec" : "%c %o",
\       "outputter" : "error:buffer:quickfix",
\       "runner" : "vimproc",
\       "hook/cd/enable" : 1,
\       "hook/cd/directory" : "D:/test/aaa",
\   },
\}


hook/cd に関する詳しい挙動は、

:help quickrun-module-hook/cd

を参照して下さい。

[注意]

上記の hook-cd を使用する際の注意点なのですが、下記のようにバッファを開くたびにカレントディレクトリの変更を行うような処理が行われている場合、outputter に buffer が指定されているとカレントディレクトリがうまく設定されない事があります。

augroup vimrc_group__cd
    autocmd!
    autocmd BufEnter * execute ":lcd " . expand("%:p:h")
augroup END


これは outputter-buffer の初期化時に出力バッファを開くため、そのタイミングでカレントディレクトリが変更されてしまうためです。
これを回避する場合は下記のように変更してみて下さい。

" QuickRun 中かどうかを判定する
let g:is_quickrun_started = 0

let s:hook = {
\   "name" : "is_started",
\   "kind" : "hook",
\}

function! s:hook.init(...)
    let g:is_quickrun_started = 1
endfunction

function! s:hook.sweep(...)
    let g:is_quickrun_started = 0
endfunction

call quickrun#module#register(s:hook, 1)
unlet s:hook

augroup vimrc_group__cd
    autocmd!

    " :QuickRun 中はカレントディレクトリを変更しない
    autocmd BufEnter *
\   if !get(g:, "is_quickrun_started", 0)
\|        execute ":lcd " . expand("%:p:h")
\|    endif
augroup END