torutkのブログ

ソフトウェア・エンジニアのブログ

emacs 23系でのJava編集

Java SE 8のラムダ式を試してみようと、

からlambda-8-b35-windows-x64-12_apr_2012.zipを入手し、適当なディレクトリに展開しました。(例えば、C:\Program Files\Java\jdk1.8.0_lambda)

ここで、最近はNetBeansソースコードを書くのですが、NetBeansはまだJava SE 8の文法を認識しないのでラムダ式がエラーとなってしまいます。

そこで、emacsで作成することにしました。emacsは、NTEmacs 23.4を使用していますが、素のjava編集モードだとコード補完がないのはともかくimport文記述も必要なので、少々厳しい環境です。

昔使っていたJDEEは最新のemacsでは動かすのに一苦労で(Meadow 3 = emacs 22で何とか動くけど、emacs 23では困難)、malabar-mode*1はビルドツールmaven依存が前提だし*2、とこの数年emacs 23系ではjava環境を整えてませんでした。

最近、ajc-java-completeなるちょっと便利なjava編集モードがあると知って設定してみました。
ajc-java-completeは、メソッド名の補完とimport文の自動生成程度ですが、import文の自動生成があるなら入れる価値ありです。

ajc-java-completeをemacs 23環境に構築する

素のemacs 23(NTEmacs 23.4)でajc-java-completeを使用するには、以下のelispパッケージが必要です。

入手

ajc-java-completeを、以下URLから入手します。

最近、githubに置いて、リリースパッケージはないというパターンが多いです。慣れないとソースツリーが見えるだけでどうすればいいの?という感じですが、右上の方にある[Downloads]というリンクをたどると、[Download as zip]と[Downlaod as tar.gz]というボタンが並んだページに飛ぶので、好きな方をクリックします。後者をクリックすると、本日時点では次のファイルがダウンロードできます。

  • jixiuf-ajc-java-complete-sorted-class-loaded-into-member-36-g0d154a6.tar.gz

auto-completeを、以下URLから入手します。

本日時点で以下ファイルがダウンロードできます。

  • auto-complete-1.3.1.tar.bz2

yasnippetを、以下URLから入手します。

これもgithubに置かれてリリースパッケージはないので、先のajc-java-complete同様[Downloads]を辿ってファイルをダウンロードします。

インストール

てっとり早くインストールするので、入手した各アーカイブファイルをemacsのsite-lispディレクトリ下に展開します。

展開したディレクトリ名はそのままでも問題ありませんが、長過ぎるので、

<NTEmacsディレクトリ>\site-lisp
                       +-- ajc-java-complete
                       +-- auto-complete-1.3.1
                       +-- yasnippet

に変更しました。

次に、ajc-java-complete\popup.el を、auto-complete-1.3.1\popup.el に上書きします。ajc-java-completeの使用にあたって、auto-complete-1.3.1 のpopupにパッチを当てているからです。

各パッケージの.elファイルをバイトコンパイルしてもよいですが、マシンパワーがあるので手を抜いて飛ばしています。

タグファイルの作成

ajc-java-completeでは、コード補完の情報をあらかじめタグファイルとして生成しておく必要があります。これはつまり、後から作ったクラスについては補完対象にならないということになります・・・。

ajc-java-completeパッケージには、あらかじめJava SEとServlet APIおよびAndroid APIを対象としたタグファイルが同梱されています。

これを解凍し、環境変数HOMEのディレクトリに.java_base.tag の名前でコピーするか、タグファイルをその場で生成します。

C:\tool\emacs23.4\site-lisp\ajc-java-complete> javac Tags.java
C:\tool\emacs23.4\site-lisp\ajc-java-complete> java -cp "C:\Program Files\Java\jdk1.8.0_lambda\jre\lib\rt.jar";. Tags
  :
C:\tool\emacs23.4\site-lisp\ajc-java-complete> 

%HOME%\.java_base.tag ファイルが生成されます。サイズは3MB強あります。
標準Java SE以外のクラスを補完に使うなら、-cpオプションでクラスパスを追加します。

.emacs設定

.emacs設定に追記します。

;;;
;;; Java編集
;;;
;; ajc-java-completeを使う
;; 依存パッケージ: auto-complete, yasnippet
;
; yasnippet
(require 'yasnippet)
(yas/global-mode 1)
;
; auto-complete
(require 'auto-complete)
(global-auto-complete-mode t)
(define-key ac-complete-mode-map "\C-n" 'ac-next)
(define-key ac-complete-mode-map "\C-p" 'ac-previous)
;
; ajc-java-complete
(require 'ajc-java-complete-config)
;(setq ajc-tag-file "~/.java_base.tag")
(add-hook 'java-mode-hook 'ajc-java-complete-mode)

これで、Javaソースファイルを開くとajc-java-completeモードが有効となります。

使い方

Javaソースファイル(拡張子.java)を開くと、Java編集モード+acj-java-completeモードとなります。ふつうにキーワードを入力していくと、勝手に補完が働きます。

次の画面は、変数名helloButtonを入力する際、先頭のhを入力した時点で発動した補完を示します。

次の画面は、メソッド名(メソッド呼び出し式)を入力する際、変数名の後ろにピリオドを入力した時点で発動した補完を示します。

次の画面は、上に続いてメソッド名の先頭文字aを入力した時点で発動した補完を示します。

次の画面は、このファイルに不足のimport文(javax.swing.JButton)を生成するため、C-c i を入力した時点で発動した補完を示します。

なお、import文の補完では、編集対象ソースファイルで不足しているimport複数を補完できます。

その他

アノテーション記述行の次のインデント

emacsjava-modeでは、アノテーションの認識がいまいちで、次の行が継続行扱いとなってインデントしてしまいます。
対策は、id:torutk:20041021 に記載のとおりです。

*1:malabar-modeの概説がhttp://d.hatena.ne.jp/nekop/20101215/1292380225 に、インストール記録がhttp://www.hepo.jp/bbn/diary/?date=20110222にあり

*2:インターネット非接続環境では使用が厳しい