Flymake を使って編集中にシンタックスエラーを検出する
ひげぽんの auto-compile.el の記事(*)を見たときに、 make のアウトプットを解析してエラーを解析すれば動的シンタックスチェックできるじゃんと思っていたのですが、たまたま今日 Emacs Wiki を見ていたらまさにその通りの機能を提供する Flymake に出会いました。動作原理は単純で、ファイル名からビルドするのに使うプログラムを調べて、それを適当なタイミング(保存時とか)にバックグラウンドで走らせます。その際に出力されたアウトプットを解析しエラーがあればそのファイル名や行番号からエラー箇所を特定してビジュアルに知らせてくれるのです。
(*) http://d.hatena.ne.jp/higepon/20061107/1162902929
例えば以下のように編集して保存します。
(バックグラウンドで ant が走って)エラーがあった場合、以下のようにビジュアルに知らせてくれます。
今回は ArrayList が見つからないというエラーなので、以下のように修正して保存すると、エラーが消えます。
このようにして java ではありがちな import 忘れを初期のうちに極力減らすことができます(もちろんその他のシンタックスエラーも)。ちなみにビルドが頻繁に行われるので編集が重たくなるかもしれませんが、(その代わりと言っていいのかわかりませんが)いざ手動でビルドするっていう時は前回のビルド結果が継続されるので通常よりビルドを速く終わらせることができるかもしれません。
さて、実際に Flymake を使うための設定を紹介しておきます。デフォルトの設定はなかなかと難ありで少しいじくる必要があります。
~/.emacs:
(load "flymake") ;; redefine to remove "check-syntax" target (defun flymake-get-make-cmdline (source base-dir) (list "make" (list "-s" "-C" base-dir (concat "CHK_SOURCES=" source) "SYNTAX_CHECK_MODE=1"))) ;; specify that flymake use ant instead of make (setcdr (assoc "\\.java\\'" flymake-allowed-file-name-masks) '(flymake-simple-ant-java-init flymake-simple-java-cleanup)) ;; redefine to remove "check-syntax" target (defun flymake-get-ant-cmdline (source base-dir) (list "ant" (list "-buildfile" (concat base-dir "/" "build.xml")))) (add-hook 'java-mode-hook '(lambda () (flymake-mode)))))
まず、 Flymake はビルドプログラムに check-syntax ターゲットを渡す傾向があるので、そいつを取りのぞいてやります。これはもちろん Makefile とか build.xml に check-syntax ターゲットを追加しても問題ないのですが、そんなこといちいちしていられないので、デフォルトターゲットを優先させるほうが良いでしょう。また java の場合、デフォルトのビルドプログラムが make になっているのですが、今時 make で java プログラムをコンパイルしている人なんて居なさそうなので ant に書きかえることにします(書きやすさ・速度の点では圧倒的に make のほうがいいのですが…)。あとは多少強引ですが java-mode 起動時に flymake-mode になるようにしておきます。
これで Emacs は編集機能の点でも Eclipse を圧倒的に凌駕しました。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/detect-syntax-errors-by-flymake/tbping