erlang-mode + flymake-mode

(追記:erlang-flymakeはErlang/OTPの公式リリースに入りました。そちらを使えばもっとハッピーになれます
これまでOMake便利だよー、すげえよー!という話を各所でしていましたが、世間はrebar化の波に流されてようとしていて*1、私もその例外ではないようです。一旦rebarとOMakeを共存させようと少し試行錯誤もしてみましたが、結局はPersistent modeでヒャッハーするために依存関係をrebarとOMakeの世界の両方で実現しないといけないのはどうにも面倒くさいイケてないので、先日某氏が使いこなしていたFlymakeを試してみることにしました。
いざ試してみると意外とよいみたいだし、elispは手で書けないのでここに手順を残しておきます。環境はDebian stable。

Debian stableなので、EmacsにFlymakeがデフォルトで付属しています。とても助かります。

1. Flymakeが使うチェック用のスクリプトを用意

EmacsWikiにあったものを丸パクリです。とりあえずこれをホームディレクトリ(~/check.es)に置いてパーミッションを755にしてやります。

#!/usr/bin/env escript
-export([main/1]).

main([File_Name]) ->
    compile:file(File_Name, [warn_obsolete_guard, warn_unused_import, 
                             warn_shadow_vars, warn_export_vars,
  			     strong_validation, report,
  			     {i, "../include"}]).

ホームディレクトリにおく割に "../include" と相対パスにしておく辺りが気持ち悪いですね。改善の余地はありそうです。EmacsWikiには「Dialyzerも動いたお!」とかいうのが見えるけど、DialyzerはFlymakeで実行するにはちょっと重そうだよね…。

2. .emacsを編集

わたしは中身をよく理解していませんが、とりあえずこれで色はでました。丁度よいサンプルがなかったので、Haskellでやっている人のパクってき参考にしました。

(require 'flymake)
(defun flymake-erlang-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 "~/check.es" (list local-file))))

(add-to-list 'flymake-allowed-file-name-masks '("\\.erl\\'" flymake-erlang-init))

(add-hook 'erlang-mode-hook
	  '(lambda ()
	     (if (not (null buffer-file-name)) (flymake-mode))))

本当は色付きで表示されたところのエラーメッセージを表示するなんてのもあるらしいんだけど、それは面倒だからサボりました。

できた!
f:id:kuenishi:20110502121032p:image

参考

Rubyでやっている人もいますね。動的な型なし言語だからこそよいのかも。やや、動的とか型がどうとかあんまし関係ないか。

*1:ところでrebarって「リバー」って読んでたけど世間的には「レバー」なんですかね。どっちなんだろ。MapReduceを「マップドゥース」と読まれると殺意を覚えます。同様に"false"をファルスと言われたときは何のこっちゃわからなくて困りました