よし, 認めよう. 私は, Eclipse フリークだった.

Eclipse ですべての開発環境の統合を夢見て, あらゆるプラグインを試した.

全 C/C++ プログラマに捧ぐ!Eclipse CDT を使う時のオススメ機能/ プラグインまとめ | Futurismo

歳をとるにつれて, 若かりし誤った考えを改めた. 真の統合開発環境は Emacs なのでは?

いや, うすうすは気づいている. Java 開発では Eclipse が最強なことくらい.

しかし, それを分かっていてあえて Emacs を使うことは美しい行為ではないか?

それは, 死を覚悟して決戦に挑む武士のように.

この記事は, そんな不安と挑戦の記録です.

Environment

  • Linux Mint 16
  • Eclipe 4.3 Kepler
  • Emacs 24

Java 開発環境について

まずは, Emacs における Java 開発環境を調べた.

以下の 3 つが選択肢としてある. 詳細な解説はリンク先に譲る.

JDEE

CEDET ベースのツール. あまりメンテナンスされていないようだ.

malabar-mode

JDEE にかわってでてきたモダンな java のメジャーモード.

Eclim

Emacs から Eclipse をつかう. その発想があったか!

選定する

選ぶに当たって重視する機能は,

  • JUnit 連携機能
  • リファクタリング
  • コード補完・タグジャンプ
  • Android 開発連携

malabar-mode に挑戦したが, maven がよくわからずに挫折.

なので, eclim を試す.

開発環境を整える

eclim

インストーラがあるので, 指示にしたがって入れればよい.

eclim-emacs

emacs から利用するためには, eclim-emacs を入れる.

使い方

設定ファイルに以下を追記.

(require 'eclim)
(require 'eclimd)

;; java-mode で有効
(add-hook 'java-mode-hook 'eclim-mode)

M-x start-eclimd で eclipse を eclim デーモンとして起動.

M-x eclim-project-mode で workspace にあるプロジェクト一覧が表示される.

適当にソースを選んでごにょごにょ. 詳しくは, README 参照. まだ, あんまりいじくりまわしていない.

M-x stop-eclimd で eclipse を eclim デーモンを終了.

このページがとても詳しいのでリンクをはっておきます.

[[https://www.skybert.net/emacs/java/][.:: skybert.net :: emacs
java ::.]]

auto-complete/company-mode で自動補完

auto-complete/company-mode で eclipse の補完機能と連携できる.

;; regular auto-complete initialization
(require 'auto-complete-config)
(ac-config-default)
;; add the emacs-eclim source
(require 'ac-emacs-eclim-source)
(ac-emacs-eclim-config)

;; for company-mode
;; (require 'company-emacs-eclim)
;; (company-emacs-eclim-setup)

タグジャンプ

‘eclim-java-find-references で定義元にジャンプできる. しかし, gtags をしてもいい.

(define-key eclim-mode-map (kbd "C-c C-e l") 'eclim-java-find-references)

Program 起動

org.eclim.java.run.mainclass にメインクラスを設定.

設定方法は, .settings/org.eclim.prefs というファイルを作成して,以下を書き込む

  org.eclim.java.run.mainclass=<Class Name>

しかし, これだけでは動作しなかった. main メソッドの場所で eclim-run-class を実行すると, ようやく eclim 経由で java program が起動.

起動は, eclim の機能を利用するのではなくて, 別のビルドツールを利用したほうがいいな.

JUnit を動かす

これで JUnit が動いた. これはいいな.

(defun eclim-run-test ()
  (interactive)
  (if (not (string= major-mode "java-mode"))
    (message "Sorry cannot run current buffer."))
  (compile (concat eclim-executable " -command java_junit -p " eclim--project-name " -t " (eclim-package-and-class))))

最後に

使いこなすには, 時間がかかりそうな.

今は, まだ eclipse のほうがいいと思っている. いや, 負けるな Emacs!

.emacs の設定

最後に設定を張り付けておく.

(require 'eclim)

;; java-mode で有効
(add-hook 'java-mode-hook 'eclim-mode)

;; eclim daemon
(require 'eclimd)

;; regular auto-complete initialization
(require 'auto-complete-config)
(ac-config-default)
;; add the emacs-eclim source
(require 'ac-emacs-eclim-source)
(ac-emacs-eclim-config)

;; for company-mode
;; (require 'company-emacs-eclim)
;; (company-emacs-eclim-setup)

;; Displaying compilation error messages in the echo area
(setq help-at-pt-display-when-idle t)
(setq help-at-pt-timer-delay 0.1)
(help-at-pt-set-timer)

;; add keybinds
(define-key eclim-mode-map (kbd "C-c C-e p q") 'eclim-problems)
(define-key eclim-mode-map (kbd "C-c C-e p o") 'eclim-problems-open)
(define-key eclim-mode-map (kbd "C-c C-e p n") 'eclim-problems-next)
(define-key eclim-mode-map (kbd "C-c C-e p p") 'eclim-problems-previous)
;; Re-map `eclim-project-create' to C so that I can use c for
;; `eclim-problems-correct'
(define-key eclim-mode-map (kbd "C-c C-e p C") 'eclim-project-create)
(define-key eclim-mode-map (kbd "C-c C-e p c") 'eclim-problems-correct)
(define-key eclim-mode-map (kbd "M-.") 'eclim-java-find-declaration)
;; find-references = list-callers.
(define-key eclim-mode-map (kbd "C-c C-e l") 'eclim-java-find-references)

;; skip warning error
(setq compilation-skip-threshold 2)

(setq eclim-eclipse-dirs "/opt/eclipse/kepler")
(setq eclim-executable "/opt/eclipse/kepler/eclim")
(setq eclimd-executable "/opt/eclipse/kepler/eclimd")
(setq eclimd-default-workspace "/mnt/win/src/coursera")