Emacs23でJavaクラス補完機能設定

Amazon Linuxのemacs23.1でjava開発環境をつくるにあたり、Javaクラス補完機能設定を調査しました。

# 環境
* Amazon Linux AMI 2013.09.2 (64bit) - ami-0d13700c
* emacs 23.1
* java 1.6.0.0
* git 1.8.3.1

# インストール手順
## 初期アップデートとemacsのインストール

Amazon Linuxインスタンスを立ち上げ、emacsをインストールします。

```shell-session
$ sudo yum update
$ sudo yum install emacs
```

Emacsのバージョンは23.1です。

```shell-session
$ emacs -version
GNU Emacs 23.1.1
Copyright (C) 2009 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```

とりあえず、~/.emacs.d/init.dを作ってload-pathを通しておきます。

```el:~/.emacs.d/init.el
(add-to-list 'load-path "~/.emacs.d")
```

## 環境構築に必要なツールのインストール(javacとgit)

いくつかのパッケージはgit cloneしますのでgitを用意します。また、Javaクラスのタグを生成する際にjavacも必要となりますので、これもインストールしておきます。また、アーカイブを展開する作業ディレクトリ(例：~/tmp)も作成しておきます。

```shell-session
$ sudo yum install git
$ sudo yum install java-1.6.0-openjdk-devel.x86_64
$ mkdir ~/tmp
```

## 多言語補完テンプレートauto-completeのインストール

まず、さまざまなプログラミング言語の補完テンプレートであるauto-completeをインストールします。基本的な手順は、適当なディレクトリでアーカイブを展開しmake installを行います。

```shell-session
cd ~/tmp
wget http://cx4a.org/pub/auto-complete/auto-complete-1.3.1.tar.bz2
bzip2 -cd auto-complete-1.3.1.tar.bz2 | tar xvf -
cd auto-complete-1.3.1
mkdir ~/.emacs.d/auto-complete
make install DIR=$HOME/.emacs.d/auto-complete/
```

```el:~/.emacs.d/init.el
; auto-complete-mode
(add-to-list 'load-path "~/.emacs.d/auto-complete")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/ac-dict")
(ac-config-default)
(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)
```

これでさまざまな言語のキーワードの補完ができるようになります。

## cl-libのインストール

次に、スニペットシステムyasnippetをインストールしますが、yasnippetはemacs24で標準となったcl-libを使用しており、emacs23では個別にインストールする必要があります。いくつかのインストール方法があるようですが、el-getを利用してインストールすることがもっとも容易でしたので、まずel-getをインストールします。
el-getは、~/.emacs.dにgit cloneし、適当に設定すれば使えるようになります。

```shell-session
cd ~/.emacs.d
git clone https://github.com/dimitri/el-get
```

```el:~/.emacs.d/init.el
; el-get
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))
(add-to-list 'el-get-recipe-path "~/.emacs.d/el-get-user/recipes")
(el-get 'sync)
```

次にcl-libです。これはemacs23環境であればインストールをするようにel-getに指示するだけです。

```el:~/.emacs.d/init.el
; cl-lib
(when (<= emacs-major-version 23)
  (el-get 'sync '(cl-lib)))
```

## スニペットシステムyasnippetのインストール

cl-libの準備ができましたので、スニペットシステムyasnippetをインストールします。
yasnippetもまた、git cloneしてinit.elで設定すれば使用することができます。

```shell-session
cd ~/.emacs.d
git clone --recursive https://github.com/capitaomorte/yasnippet
```

```el:~/.emacs.d/init.el
; yasnippet
(add-to-list 'load-path "~/.emacs.d/yasnippet")
(require 'yasnippet)
(yas-global-mode 1) ; minor-modeもある
```

## Javaクラスタグ補完システムauto-java-completeのインストール

最後に、Javaソース内でクラス・メソッド名を保管したり、自動的にimport文を追加したりすることのできる、auto-java-completeをインストールします。手順としては、git cloneし、javaコマンドによって全クラス・メソッドのタグリストを作成します。

```shell-session
cd ~/.emacs.d
git clone https://github.com/emacs-java/auto-java-complete
cd auto-java-complete
javac Tags.java
java -cp "/usr/lib/jvm/java/jre/lib/rt.jar:." Tags # 必要に応じてclasspathを追加指定
```

init.elでは、java-modeで使うためにhookを定義します。

```el:~/.emacs.d/init.el
; auto-java-complete
(add-to-list 'load-path "~/.emacs.d/auto-java-complete")
(require 'ajc-java-complete-config)
(add-hook 'java-mode-hook 'ajc-java-complete-mode)
```

# 参考
* 手順全般: http://blog.clouder.jp/archives/001141.html
* auto-complete-mode: http://cx4a.org/software/auto-complete/
* el-get: http://shibayu36.hatenablog.com/entry/2013/03/14/081524
* cl-lib: http://www.gfd-dennou.org/member/uwabami/cc-env/emacs/el-get_config.html
* yasnippet: https://github.com/capitaomorte/yasnippet
* auto-java-complete: http://blog.clouder.jp/archives/001141.html