Subscribed unsubscribe Subscribe Subscribe

nodelintでflymake

Emacs JavaScript Node.js

node-jslintでflymake - すぎゃーんメモ で設定した、node-jslintによるflymakeを使っていたのだけど、

var util = require('util');

とかに対して警告を出してきてちょっとイラっとする。どうもnode-jslintで使われているjslintがちょっと古いらしく、"util"がかつてnode.jsでpredefinedなglobalsだった、というのが残ってしまっているらしい。本家ではすでに修正されている模様。
Assume Node.js option falsely assumes global `util` · Issue #42 · douglascrockford/JSLint · GitHub
で、それを取り込んで更新してもらえれば良いのだけど 折角なのでnodelintに鞍替えしてみた。
https://github.com/tav/nodelint
こちらもnode-jslint同様にコマンドラインツールとしてjsファイルに対して実行することができるのだけど、細かい設定はconfigファイルのパスを渡す形になる。flymakeで使うにはちょっと残念…とは思ったもののとりあえず設定してみた。
設定は$HOME/local/etc/nodelint_config.jsにファイルを作り(実際には$HOME/.emacs.d/inits/etc/nodelint_config.jsにおいてそこにシンボリックリンクを貼ったけど それはgithub的な事情)

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

と自分好みの設定を書く。flymakeでエラーパターンを解析するためにerror_prefixerror_suffixはシンプルにしておくのが良さげ。
で、flymake用の設定を書く。

(require 'flymake)
(add-to-list 'flymake-allowed-file-name-masks '("\\.js\\'" flymake-js-init))
(defun flymake-js-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    (list "nodelint" (list "--config" (concat (getenv "HOME") "/local/etc/nodelint_config.js") local-file))))
(defun flymake-js-load ()
  (interactive)
  (setq flymake-err-line-patterns
        (cons '("^\\(.+\\), line \\([[:digit:]]+\\), character \\([[:digit:]]+\\): \\(.+\\)$"
                1 2 3 4)
              flymake-err-line-patterns))
  (flymake-mode t))

ほとんどjslint用の設定と変わらず、コマンドラインオプションを調整したのと、警告出力パターンの変更にあわせてflymake-err-line-patternsのところを調整したくらい。

しばらくこれで使い続けてみます。