Vimでnode.jsの文法チェック(nodelint編)

落ち込んでいるといつも「げんきだして!」とリプライを送ってくれるEmacs使いなid:sugyanさんが、nodelintでflymake - すぎゃーんメモというエントリを書かれて、vimで同じようなことが出来ないかと試行錯誤してみました。
flymakeの挙動を知らないので、それっぽくなったかは分からないのですが、「保存時にシンタックスチェック」する動作は出来るようになったみたいなので報告します。

以下のリンクを見ると、quickfix + errormarker.vimで出来るようです。
errormarker.vim で flymake(Emacsの) る - #生存戦略 、それは - subtech
で、じゃあまず最近Pythonを書く機会が多いから、Pythonで出来ないかなあと思ってたどり着いたのが以下のエントリ。
vimでPythonのコードを書いているときにflymake?っぽい感じをだす | hexacosa.net
これを参考にして、入れてみました。動いたので、それをnodelintに応用します。

errormarker.vimを入れる

そういえば、quickfix使っていなかったので知らなかったのですが、quickfixはデフォルトでvimに組み込まれているんですね。
というわけで、errormarker.vimを入れます。うちのvimはpathogenを導入しているので、これ自体は簡単。pathogenについてはvimプラグインの管理をpathogen.vimにした - WebCrawler2あたりを参照。

$ cd ~/.vim/
$ git submodule add https://github.com/vim-scripts/errormarker.vim.git bundle/errormarker.vim

これだけです。

nodelintを入れる

本題のnodelintです。

$ npm install -g nodelint

とまあこんな感じでnpmで入ります。あ、他の環境ではsudoをつけないといけないかも。うちはMacbrew環境なので。
nodelintはconfig.jsみたいなファイルに設定を書いて実行時に渡すことで出力する形式を指定できます。あとでerrormarker.vimに処理されやすいように、シンプルにしておきましょう。ちなみにデフォルトは$NODE_MODULE/nodelint/config.jsにあります。これを編集して使うのもいいかもです。
こんな感じに書いて、適当なところに置いておきます。我が家は~/node_modules/nodelint/config.jsへ。
追記(11/3): npm updateするとデフォルトに戻りますので、~/develop/node/nodelint/config.jsに置き直しました。

var options = {
    vars: true,
    error_prefix: "",
    error_suffix: ": "
};

nodelint側はこれで終わり。

errormarkerの設定

~/.vim/ftplugin/javascript/内にflyquickfixmake.vimというファイルを作ります。そして以下の内容を記述。

""" $HOME/.vim/ftplugin/javascript/flyquickfixmake.vim                                                                                                                                                      
""" setting for nodelint
setlocal makeprg=/usr/local/bin/nodelint\ --config\ $HOME/node_modules/nodelint/config.js\ %
setlocal errorformat=%A%f\\,\ line\ %l\\,\ character\ %c:%m,%C%.%#,%Z%.%#

if !exists("g:javascript_flyquickfixmake")
    let g:javascript_flyquickfixmake = 1
    au BufWritePost *.js make
endif

makeprgのnodelintのパスは環境に応じて設定してください。
errorformatについてはGoogle サイトを見て試行錯誤しました。たぶんこれでいいはず。。。

これで保存時にシンタックスチェックが行われるようになります。その後:copeなんかを打つと、分割されてエラーリストが表示されて、エラーの行でEnterすると、プログラム本体を開いている方のカーソルが対象の行に飛んだりします。便利ですね。
応用すればいろいろ出来そうですね。