Maven2連携可能な malabar-mode があれば java-mode も jde-mode も不要かも

仕事だと(周りに合わせるあ為に) Eclipse を使っているけど家ではできるだけ何でも Emacs でやりたくて、当然ビルドには Maven2 を使いたい。jde-mode からうまく Maven2 を扱える elisp が無いかな...と他力本願で探してみたら色々見つかって、その中では malabar-mode が現時点のベストっぽい。本格的に使ってみるのはこれからだけど、日本語記事が見あたらなかったので書いておく。

そもそも最初は maven2 と連携だけできればと思って pom-parser.el を見つけたんだけど同作者の jde-mvn の方が新しいって注釈があり、じゃあそっちを、と思ったら今度はこれも古いから malabar-mode を使え、と書いてある。 maven2 連携だけかと思ったら jde の代替らしい。作者の espenhw 氏、かなり勢いがある。
ちなみにマラバルっていうのはジャワティーの高級茶葉の名前らしい。

できること

  • そもそも maven2 連携を前提として書かれているのでクラスパスの解決が超スムーズ。pom.xml だけあれば良く、prj.el 不要。
  • ビルドには jde で使っていた bsh ではなく groovy を使っている。 malabar が起動すると Malabar Groovy バッファが立ち上がってそこで groovy も使えるみたいなので 2 度おいしい。(これを機会に groovy も使ってみるか...)
  • その他 jde-mode でできてたこと。デフォルトキーバインドは jde と同様
    • インポート文生成
    • オーバーライド
    • getter/setter 生成

(まだ)できないこと

  • Flymake との連携は可能なのか現時点で不明。 github にも TODO っぽいチケットが挙げられている(コンパイル時にエラー箇所は下線表示してくれるし、しばらくは無くてもいいかも)

導入

git clone git://github.com/espenhw/malabar-mode.git
  • MacEmacs な人は pom.xml 内の emacs ってなってる所を /Applications/Emacs.app/Contents/MacOS/Emacs に書き換える
  • site-lispcedet を置く(ビルド時に emacs をバッチ起動するため)
  • mvn package でビルド、なんだけど試した時点の最新ソースでは test でエラーが出たため、めんどくさいので -Dmaven.test.skip=true した
  • target にできた zip を解凍して load-path にコピー
;;; *** Malabar Mode : A better Java mode
(when (require 'malabar-mode nil t)
  (setq malabar-groovy-lib-dir (expand-file-name "~/lib/elisp/malabar-1.3-SNAPSHOT/lib")) ; お好みで
  (add-to-list 'auto-mode-alist '("\\.java\\'" . malabar-mode))
  ;; 普段使わないパッケージを import 候補から除外
  (add-to-list 'malabar-import-excluded-classes-regexp-list
               "^java\\.awt\\..*$")
  (add-to-list 'malabar-import-excluded-classes-regexp-list
               "^com\\.sun\\..*$")
  (add-to-list 'malabar-import-excluded-classes-regexp-list
               "^org\\.omg\\..*$")
  (add-hook 'malabar-mode-hook
            (lambda ()
              (add-hook 'after-save-hook 'malabar-compile-file-silently
                        nil t))))

;;; **** Malabar Groovy : Customization of malabar-mode's inferior Groovy.
(setq malabar-groovy-java-options '("-Duser.language=en")) ; 日本語だとコンパイルエラーメッセージが化けるので