quickrun.vim で外部コマンドを非同期で実行する

quickrun.vim では vimproc を使用して、外部コマンドを非同期で実行する事が出来ます。
また outputter を作成することで外部コマンド実行後に任意の Vim script を処理する事も出来ます。
と、いうことで実際に quickrun.vim で c-index-test.exe を非同期で実行してみました。

[ソース]

" c-index-test のコマンドを処理する outputter
" 非同期で c-index-test を処理して、終了後に結果を出力する
let s:outputter = quickrun#outputter#buffered#new()
let s:outputter.config = {}

function! s:outputter.init(session)
    echo "Search declared..."

    " :QuickRun の呼び出し時にコマンドの作成
    let pos = getpos(".")
    let options = join(map(filter(split(&path, ","), "isdirectory(v:val)"), "'-I'.v:val"), " ")
    let a:session.config.cmdopt = "\:".pos[1]."\:".pos[2]." ".options

    " 元の処理を呼び出す
    call call(quickrun#outputter#buffered#new().init, [a:session], self)
endfunction

function! s:outputter.finish(session)
    " 結果の出力
    echo self._result
endfunction

" quickrun.vim へ登録
call quickrun#register_outputter("clang_declared", s:outputter)
unlet s:outputter

" config の定義
let g:quickrun_config["clang_declared"] = {
    \ "exec": "%c -cursor-at=%s:p%o %s",
    \ "command" : g:clang_declared_c_index_test_cmd,
    \ "cmdopt" : "",
    \ "outputter" :  "clang_declared",
    \ "runner" : "vimproc",
\ }

[コマンド]

カーソル位置の宣言箇所を出力

:QuickRun clang_declared


:QuickRun 時に outputter.init が処理されて、外部コマンドの終了後に outputter.finish が処理されます。
c-index-test.exe のコマンドラインを処理している箇所がやや助長ですが、流れとしてはそんなに難しくないと思います。
外部コマンドを呼ぶだけなら outputter.init ではなくて config で定義してしまえば outputter.finish を定義するだけでも十分だと思います。
こんな感じで quickrun.vim と vimproc を使用すれば非同期で外部コマンドを実行して結果を出力するといったような処理が簡単に行えるかと思います。
ぜひ、皆さんも quickrun.vim で遊んでみましょう!