18 May 2014, 10:47

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

[toc]

はじめに

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

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

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

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

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

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

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

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

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      Linux Mint 16
    </li>
    <li>
      Eclipe 4.3 Kepler
    </li>
    <li>
      Emacs 24
    </li>
  </ul>
</div>

Java 開発環境について

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

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

JDEE

<div class="outline-text-3" id="text-2-1">
  CEDET ベースのツール. あまりメンテナンスされていないようだ.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://mikio.github.io/article/2012/12/23_emacsjdeejava.html">Emacs 中毒者に贈る JDEE による Java 開発環境の構築|ざる魂</a>
    </li>
    <li>
      <a href="http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki">http://epian-wiki.appspot.com/wiki/Emacs/JDEEEmacs/JDEE%20-%20epian-wiki</a>
    </li>
    <li>
      <a href="http://www.emacswiki.org/emacs/JavaDevelopmentEnvironment">EmacsWiki: Java Development Environment</a>
    </li>
  </ul>
</div>

malabar-mode

<div class="outline-text-3" id="text-2-2">
  JDEE にかわってでてきたモダンな java のメジャーモード.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/nekop/20101215/1292380225">Emacs で Java を書く &#8211; nekop の日記</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/lranran123/20130404/1365088550">Emacs で Java の環境構築, CEDET と yasnippet と malabar-mode &#8211; 趣味プログラマがまれになんかしたことの記録</a>
    </li>
  </ul>
</div>

Eclim

<div class="outline-text-3" id="text-2-3">
  Emacs から Eclipse をつかう. その発想があったか!</p> 

  <ul class="org-ul">
    <li>
      <a href="http://sleepboy-zzz.blogspot.jp/2014/02/emacsjava_22.html">memo: Emacs で Java の設定</a>
    </li>
    <li>
      <a href="http://d.hatena.ne.jp/clairvy/20100630/1277854580">Emacs-Eclim を試す &#8211; クラなんとか or くらなんとか or cla なんとかの日記</a>
    </li>
  </ul>
</div>

選定する

<div class="outline-text-3" id="text-2-4">
  <p>
    選ぶに当たって重視する機能は,
  </p>

  <ul class="org-ul">
    <li>
      JUnit 連携機能
    </li>
    <li>
      リファクタリング
    </li>
    <li>
      コード補完・タグジャンプ
    </li>
    <li>
      Android 開発連携
    </li>
  </ul>

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

  <p>
    なので, eclim を試す.
  </p>
</div>

開発環境を整える

eclim

<div class="outline-text-3" id="text-3-1">
  インストーラがあるので, 指示にしたがって入れればよい.</p> 

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/install.html">Download / Install &#8211; eclim (eclipse + vim)</a>
    </li>
  </ul>
</div>

eclim-emacs

<div class="outline-text-3" id="text-3-2">
  emacs から利用するためには, eclim-emacs を入れる.</p> 

  <ul class="org-ul">
    <li>
      <a href="https://github.com/senny/emacs-eclim">senny/emacs-eclim</a>
    </li>
  </ul>
</div>

使い方

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

[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 デーモンを終了.

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

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

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

<div class="outline-text-3" id="text-4-1">
  <p>
    auto-complete/company-mode で eclipse の補完機能と連携できる.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)<br /> [/sourcecode]
  </p>
</div>

タグジャンプ

<div class="outline-text-3" id="text-4-2">
  <p>
    &#8216;eclim-java-find-references で定義元にジャンプできる. しかし, gtags をしてもいい.
  </p>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (define-key eclim-mode-map (kbd "C-c C-e l") &#8216;eclim-java-find-references)<br /> [/sourcecode]
  </p>
</div>

Program 起動

<div class="outline-text-3" id="text-4-3">
  <p>
    org.eclim.java.run.mainclass にメインクラスを設定.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://eclim.org/vim/java/java.html">Java / Jps &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://eclim.org/vim/settings.html">Settings &#8211; eclim (eclipse + vim)</a>
    </li>
    <li>
      <a href="http://stackoverflow.com/questions/7394811/eclim-what-to-set-org-eclim-java-run-mainclass-to">vim &#8211; Eclim &#8211; What to set org.eclim.java.run.mainclass to? &#8211; Stack Overflow</a>
    </li>
  </ul>

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

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> org.eclim.java.run.mainclass=<Class Name><br /> [/sourcecode]
  </p>

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

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

JUnit を動かす

<div class="outline-text-3" id="text-4-4">
  <p>
    これで JUnit が動いた. これはいいな.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk">https://groups.google.com/forum/#!topic/emacs-eclim/Bj0kyZ2mUSk</a>
    </li>
  </ul>

  <p>
    [sourcecode language=&#8221;elisp&#8221; title=&#8221;&#8221;]<br /> (defun eclim-run-test ()<br /> (interactive)<br /> (if (not (string= major-mode "java-mode"))<br /> (message "Sorry cannot run current buffer."))<br /> (compile (concat eclim-executable " -command java_junit -p " eclim&#8211;project-name " -t " (eclim-package-and-class))))<br /> [/sourcecode]
  </p>
</div>

最後に

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

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

.emacs の設定

<div class="outline-text-3" id="text-5-1">
  <p>
    最後に設定を張り付けておく.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (require &#8216;eclim)
  </p>

  <p>
    ;; java-mode で有効<br /> (add-hook &#8216;java-mode-hook &#8216;eclim-mode)
  </p>

  <p>
    ;; eclim daemon<br /> (require &#8216;eclimd)
  </p>

  <p>
    ;; regular auto-complete initialization<br /> (require &#8216;auto-complete-config)<br /> (ac-config-default)<br /> ;; add the emacs-eclim source<br /> (require &#8216;ac-emacs-eclim-source)<br /> (ac-emacs-eclim-config)
  </p>

  <p>
    ;; for company-mode<br /> ;; (require &#8216;company-emacs-eclim)<br /> ;; (company-emacs-eclim-setup)
  </p>

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

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

  <p>
    ;; skip warning error<br /> (setq compilation-skip-threshold 2)
  </p>

  <p>
    (setq eclim-eclipse-dirs "/opt/eclipse/kepler")<br /> (setq eclim-executable "/opt/eclipse/kepler/eclim")<br /> (setq eclimd-executable "/opt/eclipse/kepler/eclimd")<br /> (setq eclimd-default-workspace "/mnt/win/src/coursera")<br /> [/sourcecode]
  </p>
</div>