watchdogs.vim つくりました

前々から言っていた watchdogs.vim ですが、そろそろ煮詰まってきたのでまとめ記事にしようかと。
ちなみにこれとは関係ありません。

[概要]

Vimシンタックスチェックを行うためのプラグインです。
類似プラグインでいえば、syntastic があります。

syntastic との最大の違いはバックエンドに quickrun.vim を使用する事で、

  • quickrun-module を利用した幅広い拡張性
  • vimproc を使用した非同期で処理

といったものがあります。
特にシンタックスチェックを非同期処理で行うことが出来るので、Vim のフォーカスが奪われることがなく、自動シンタックスチェックを行うことが出来ます。
これは syntastic にはない利点だと思います。

[必要なプラグイン]

プラグインを使用するためには下記のプラグインを導入して下さい。

NeoBundle "thinca/vim-quickrun"
NeoBundle "Shougo/vimproc"
NeoBundle "osyo-manga/shabadou.vim"
NeoBundle "osyo-manga/vim-watchdogs"

[各言語の対応ツール]

現在は下記のツールに対応しています。
使用する言語によって必要なツールを予め導入しておいて下さい。


ユーザ側で使用したいツール(言語)を追加する場合は g:quickrun_config に定義することによって簡単に追加する事が出来ます(後述参照。

[設定]

watchdogs.vimシンタックスチェックを使用するためには vimrc に下記の関数呼び出しを追加する必要があります。

" vimrc

" ユーザ側で定義した g:quickrun_config
let g:quickrun_config = { ... }


" この関数に g:quickrun_config を渡す
" この関数で g:quickrun_config にシンタックスチェックを行うための設定を追加する
" 関数を呼び出すタイミングはユーザの g:quickrun_config 設定後
call watchdogs#setup(g:quickrun_config)


これは watchdogs.vim で定義された quickrun_config を g:quickrun_config へと追加しています。

[使い方]

シンタックスチェックを行うバッファで、

:WatchdogsRun

を呼び出します。
これでバッファの filetype を参照してシンタックスチェックの結果が quickfix へと出力されます。


[自動シンタックスチェック]

watchdogs.vim

  • バッファの書き込み後
  • 一定時間キー入力がなかった場合

2つのタイミングで自動シンタックスチェックを行うことが出来ます。
使用するためには下記の設定を行なって下さい。

" 書き込み後にシンタックスチェックを行う
let g:watchdogs_check_BufWritePost_enable = 1

" filetype ごとに有効無効を設定することも出来る
let g:watchdogs_check_BufWritePost_enables = {
\   "cpp" : 0
\   "haskell" : 1
\}


" こっちは一定時間キー入力がなかった場合にシンタックスチェックを行う
" バッファに書き込み後、1度だけ行われる
let g:watchdogs_check_CursorHold_enable = 1

" filetype=python は無効になる
let g:watchdogs_check_CursorHold_enables = {
\   "python" : 0
\   "ruby"   : 1
\}


また :QuickRun が実行中である場合は、自動シンタックスチェックは行われません。

[使用するツールを変更する]

watchdogs.vim の設定を拡張・変更する場合は、g:quickrun_config に設定を記述します。
watchdogs.vim では、g:quickrun_config.watchdogs_checker/{tool-name} にツールごとの設定が記述されており、g:quickrun_config.{filetype}/watchdogs_checker.type に使用するツールの名前が書かれています。

" Example
" C++ のシンタックスチェック
let s:config = {
\   "cpp/watchdogs_checker" : {
\       "type" : "watchdogs_checker/g++"
\   },
\
\   "watchdogs_checker/g++" : {
\       "command"   : "g++",
\       "exec"      : "%c %o -fsyntax-only %s:p ",
\   },
\
\   "watchdogs_checker/msvc" : {
\       "command"   : "cl",
\       "exec"      : "%c /Zs %o %s:p ",
\   },
\
\   "watchdogs_checker/clang++" : {
\       "command"   : "clang++",
\       "exec"      : "%c %o -fsyntax-only %s:p ",
\   },
\}


これを踏まえて、C++シンタックスチェックを行うツールを変更するような場合は下記のような書き方になります。

" {filetype}/watchdogs_checker.type に使用するツール名を記述する
" C++ と Haskell のツールを変更する
let g:quickrun_config = {
\
\   "cpp/watchdogs_checker" : {
\       "type" : "watchdogs_checker/msvc",
\   },
\
\   "haskell/watchdogs_checker" : {
\       "type" : "watchdogs_checker/ghc-mod",
\   },
\
\}

" watchdogs.vim の呼び出し
call watchdogs#setup(g:quickrun_config)

[設定を追加する]

watchdogs.vim の設定を拡張・変更する場合は、g:quickrun_config に設定を記述します。
g:quickrun_config には、

  • g:quickrun_config.watchdogs_checker/{tool-name}
  • g:quickrun_config.{filetype}/watchdogs_checker.type
    • 使用する watchdogs_checker/{tool-name} を設定

を追加します。

" ghc-mod を使用した Haskell のシンタックスチェックを追加する
let g:quickrun_config = {
\
\   "watchdogs_checker/ghc-mod" : {
\       "command" : "ghc-mod",
\       "exec"    : '%c %o --hlintOpt="--language=XmlSyntax" check %s:p',
\   },
\
\   "haskell/watchdogs_checker" : {
\       "type" : "watchdogs_checker/ghc-mod"
\   },
\
\}

" watchdogs.vim の呼び出し
call watchdogs#setup(g:quickrun_config)

[エラー箇所をハイライトする]

エラー箇所をハイライトするためには quickfix を参照してハイライトを行う、vim-hier を導入します。

NeoBundle "jceb/vim-hier"


vim-hier を導入すれば :WatchdogsRun 後に自動的にハイライトされるようになります。
このように quickfix へと出力を行なっているので、quickfix を参照するようなプラグインで自由に拡張することが出来ます。

[シンタックスチェク後に quickfix を閉じる]

エラー箇所をハイライトしている場合等、quickfix ウィンドウが必要ない場合もあるかと思います。
その場合は、g:quickrun_config に下記の設定を行うことで、:WatchdogsRun 後に自動的に quickfix ウィンドウを閉じる事が出来ます。

" watchdogs_checker/_ に設定を記述する事で全ての watchdogs_checker で有効になる
" hook/close_quickfix/enable_exit 1 で :WatchdogsRun 終了時に quickfix ウィンドウが閉じる
let g:quickrun_config = {
\   "watchdogs_checker/_" : {
\       "hook/close_quickfix/enable_exit" : 1,
\   },
\}

" watchdogs.vim の設定を追加
call watchdogs#setup(g:quickrun_config)



と、いう感じで quickrun.vim を使用してシンタックスチェックを行うことが出来ます。
元々 quickrun.vim 側の拡張性は高いので、watchdogs.vim 側で対応していなくても config や quickrun-module を設定すればなんとか出来る事も多いと思います。
まだ、あまりテストを行ってないので不具合報告や追加ほしい機能等があれば、@manga_osyo まで連絡をくれれば対処しますので、よろしくお願いします。

[わたしの設定]

let s:config = {
\   "watchdogs_checker/_" : {
\       "hook/u_nya_/enable" : 1,
\       "hook/inu/enable" : 0,
\       "hook/unite_quickfix/enable" : 0,
\       "hook/echo/enable" : 0,
\       "hook/back_buffer/enable" : 0,
\       "hook/close_unite_quickfix/enable" : 0,
\       "hook/close_buffer/enable_exit" : 0,
\       "hook/close_quickfix/enable_exit" : 1,
\       "hook/redraw_unite_quickfix/enable_exit" : 0,
\       "hook/close_unite_quickfix/enable_exit" : 1,
\   },
\
\   "cpp/watchdogs_checker" : {
\       "hook/add_include_option/enable" : 1,
\       "type" : "watchdogs_checker/g++",
\   },
\
\   "haskell/watchdogs_checker" : {
\       "type" : "watchdogs_checker/hlint",
\   },
\   
\   "watchdogs_checker/msvc" : {
\       "hook/msvc_compiler/enable" : 1,
\       "hook/msvc_compiler/target" : "c:/program files/microsoft visual studio 10.0",
\       "hook/output_encode/encoding" : "sjis",
\       "cmdopt" : "/Zs ",
\   },
\
\   "watchdogs_checker/g++" : {
\       "cmdopt" : "-std=gnu++0x -Wall",
\   },
\
\   "watchdogs_checker/clang++" : {
\       "cmdopt" : "-std=gnu++0x -Wall",
\   },
\
\   "python/watchdogs_checker" : {
\       "type" : "watchdogs_checker/pyflakes",
\   },
\   
\   "watchdogs_checker/pyflakes" : {
\       "command" : "c:/python27/scripts/pyflakes",
\   },
\
\}

" call extend(g:quickrun_config, s:config)
unlet s:config

" watchdogs.vim の設定を追加
call watchdogs#setup(g:quickrun_config)

[動画サンプル]



[追記]

修正前

let g:watchdogs_check_BufWritePost_enables = 1

修正後

let g:watchdogs_check_BufWritePost_enable = 1