Vim で静的に C++ のシンタックスチェックを行う
[Vimプラグイン]
- quickrun.vim
- 非同期でシンタックスチェック
- quickfixstatus
- quickfix の該当箇所をコマンドラインに出力
- vim-hier
- quickfix の該当箇所をハイライト
- vimproc
- 非同期実行用
[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
[処理の流れ]
- ファイルを保存する
- ファイルの保存後に quickrun.vim で gcc を使用したシンタックスチェックを非同期で行う
- quickrun.vim の実行結果を quickfix に出力する
- vim-hier で、quickfix の該当箇所をハイライトする
- エラーの該当箇所にカーソルを合わせると quickfixstatus でコマンドラインにエラー内容が出力される
[注意]
すでに quickfix ウィンドウを開いている場合は、上記の処理をした後にウィンドウが閉じてしまうので注意して下さい。
レスポンス自体は quickrun.vim が非同期で行なっているので、さほど気にならないかと思います。
(まぁそれでも裏でガリガリ動いているのでマシンスペックが低いとアレかも知れませんが。
気になるようであれば、手動で quickrun.vim を呼び出すようにすればいいかな?
一定時間キー入力がない場合に自動的にコマンドを呼ぶような処理とかしたいですね。