Vim で静的に C++ のシンタックスチェックを行う

[概要]

イメージとしては、Visual Studio 2010 で行われている静的なシンタックスチェックです。

これと似たような事を Vim で行います。

[Vimプラグイン]

[vimrc]

" quickfix のエラー箇所を波線でハイライト
execute "highlight qf_error_ucurl gui=undercurl guisp=Red"
let g:hier_highlight_group_qf  = "qf_error_ucurl"

" quickfix に出力して、ポッポアップはしない outputter/quickfix
" すでに quickfix ウィンドウが開いている場合は閉じるので注意
let s:silent_quickfix = quickrun#outputter#quickfix#new()
function! s:silent_quickfix.finish(session)
    call call(quickrun#outputter#quickfix#new().finish, [a:session], self)
    :cclose
    " vim-hier の更新
    :HierUpdate
    " quickfix への出力後に quickfixstatus を有効に
    :QuickfixStatusEnable
endfunction
" quickrun に登録
call quickrun#register_outputter("silent_quickfix", s:silent_quickfix)


" シンタックスチェック用の quickrun.vim のコンフィグ
" gcc 版
let g:quickrun_config["CppSyntaxCheck_gcc"] = {
    \ "type"  : "cpp",
    \ "exec"      : "%c %o %s:p ",
    \ "command"   : "g++",
    \ "cmdopt"    : "-fsyntax-only -std=gnu++0x ",
    \ "outputter" : "silent_quickfix",
    \ "runner"    : "vimproc"
\ }

" msvc 版
" .h ファイルの場合はうまく動かない
let g:quickrun_config["CppSyntaxCheck_msvc"] = {
    \ "type"  : "cpp",
    \ "exec"      : "%c %o %s:p ",
    \ "command"   : "cl.exe",
    \ "cmdopt"    : "/Zs ",
    \ "outputter" : "silent_quickfix",
    \ "runner"    : "vimproc",
    \ "output_encode" : "sjis"
\ }

" ファイルの保存後に quickrun.vim が実行するように設定する
autocmd BufWritePost *.cpp,*.h,*.hpp :QuickRun CppSyntaxCheck_gcc

[処理の流れ]

  1. ファイルを保存する
  2. ファイルの保存後に quickrun.vimgcc を使用したシンタックスチェックを非同期で行う
  3. quickrun.vim の実行結果を quickfix に出力する
  4. vim-hier で、quickfix の該当箇所をハイライトする
  5. エラーの該当箇所にカーソルを合わせると quickfixstatus でコマンドラインにエラー内容が出力される

[出力結果]


[注意]

すでに quickfix ウィンドウを開いている場合は、上記の処理をした後にウィンドウが閉じてしまうので注意して下さい。


レスポンス自体は quickrun.vim が非同期で行なっているので、さほど気にならないかと思います。
(まぁそれでも裏でガリガリ動いているのでマシンスペックが低いとアレかも知れませんが。
気になるようであれば、手動で quickrun.vim を呼び出すようにすればいいかな?
一定時間キー入力がない場合に自動的にコマンドを呼ぶような処理とかしたいですね。