SpiderMonkey と flymake を使って Meadow 上で JavaScript のシンタックスエラーを検出する

タイトル長いな。。
とりあえずできたみたいなので手順をメモしておく。
なお以下の操作は全て Meadow の eshell でやってます。

$ wget ftp://ftp.mozilla.org/pub/js/js-1.7.0.tar.gz
$ tar xvzf js-1.7.0.tar.gz
$ cd js/src
$ make -f Makefile.ref OS_ARCH=Linux
(途中で失敗するけど気にしない)
$ make -f Makefile.ref OS_ARCH=Linux js
(これもうまくいかないみたいだけど気にしない)
(Linux_All_DBG.OBJ以下のjs.exeがお目当てのものなので、これさえあればOK!)
$ cp Linux_All_DBG.OBJ/js.exe c:/Meadow/bin/
(なぜMeadowのbinなのかは気にしないで下さい。僕はなんかここが好きなんです。)
(パスさえ通ってればどこにコピーしても大丈夫です。)


そして以下を.emacsに追加します。

;; flymake を使ってシンタックスエラーを検出する
(require 'flymake)

(defconst flymake-allowed-js-file-name-masks '(("\\.json$" flymake-js-init)
                                               ("\\.js$" flymake-js-init)))
(defcustom flymake-js-detect-trailing-comma t nil :type 'boolean)
(defvar flymake-js-err-line-patterns '(("^\\(.+\\)\:\\([0-9]+\\)\: \\(SyntaxError\:.+\\)\:$" 1 2 nil 3)))
(when flymake-js-detect-trailing-comma
  (setq flymake-js-err-line-patterns (append flymake-js-err-line-patterns
                                             '(("^\\(.+\\)\:\\([0-9]+\\)\: \\(strict warning: trailing comma.+\\)\:$" 1 2 nil 3)))))

(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 "js" (list "-s" local-file))))
(defun flymake-js-load ()
  (interactive)
  (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
    (setq flymake-check-was-interrupted t))
  (ad-activate 'flymake-post-syntax-check)
  (setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-js-file-name-masks))
  (setq flymake-err-line-patterns flymake-js-err-line-patterns)
  (flymake-mode t))

(add-hook 'javascript-mode-hook '(lambda () (flymake-js-load)))

これでうまくいきました。
効果の程は適当にJSファイル開いて適当に何か打ってみたりすれば分かります。