Eclim で Emacs と Eclipse のいいとこどり!Emacs で Java 開発環境を構築した (副題 打倒 Eclipse!)

    [toc]

    はじめに

    よし, 認めよう. 私は, 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 つが選択肢としてある. 詳細な解説はリンク先に譲る.

    選定する

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

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

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

    なので, eclim を試す.

    開発環境を整える

    eclim

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

    eclim-emacs

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

    使い方

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

    [sourcecode language=”emacs-lisp” title=””]
    (require ‘eclim)
    (require ‘eclimd)

    ;; java-mode で有効
    (add-hook ‘java-mode-hook ‘eclim-mode)
    [/sourcecode]

    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 の補完機能と連携できる.

    [sourcecode language=”emacs-lisp” title=””]
    ;; 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)
    [/sourcecode]

    タグジャンプ

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

    [sourcecode language=”elisp” title=””]
    (define-key eclim-mode-map (kbd "C-c C-e l") ‘eclim-java-find-references)
    [/sourcecode]

    Program 起動

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

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

    [sourcecode language=”text” title=””]
    org.eclim.java.run.mainclass=
    [/sourcecode]

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

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

    JUnit を動かす

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

    [sourcecode language=”elisp” title=””]
    (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))))
    [/sourcecode]

    最後に

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

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

    .emacs の設定

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

    [sourcecode language=”emacs-lisp” title=””]
    (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")
    [/sourcecode]