EmacsのScala IDE Ensimeのインストールと使い方

kotohが2015/07/17 17:17:38に投稿

Emacsの Scala 開発環境 ensime

はじめに

ensime は Emacs 上で動くScala IDE です。

ensimeは元々Emacs向けのScala IDEでしたが、様々なエディタに対応するようになり、
ensimeの構成自体も変更され、Emacsへのインストール方法も変わりました。

現在のensimeをEmacsにインストールする方法と使い方について説明します。

環境

MacOS 10.10 Yosemite
Emacs 24.5

前提

jdkはインストール済み。
sbt のバージョンは 0.13.8 で、インストール済み。

インストール

scala-mode2

melpaからインストールします。
scala-modeというのもありますが、scala-mode2の方が整形(インデント)やハイライトがしっかりしているように感じます。

M-x package-list-packages

scala-mode2を選択(iを押す)して実行(x)。

init.elに

(require 'scala-mode2)

を追加。

ensime-server

ensimeサーバです。
Emacsから接続して利用します。

$ git clone https://github.com/ensime/ensime-server.git
$ cd ensime-server
$ sbt publishLocal

ensime-mode

ensime-serverに接続するemacsクライアントです。
melpaからインストールします。

M-x package-list-packages

ensime を選択(iを押す) して実行(x)。

init.el に

(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)

を追加。

ensime-sbt plugin

sbtでensimeを扱うプラグインです。
sbtのグローバルプラグインという仕組みを利用してensime-sbt を設定します。
グローバルプラグインは設定した端末で利用する全てのsbtに適用されます。

~/.sbt/0.13/plugins/plugins.sbt を作成し、

resolvers += Resolver.sonatypeRepo("snapshots")
addSbtPlugin("org.ensime" % "ensime-sbt" % "0.1.7")

を追加。
(以前のsbtでは設定項目の間に空行が必要でしたが、sbt0.13.8では空行をはさむ必要がなくなりました。)

起動

sbt を起動します。
ensime-sbt プラグインがインストールされていると、gen-ensime というコマンドが使えるようになっています。

$ sbt
> gen-ensime

プロジェクトのトップディレクトリに.ensimeという設定ファイルが生成されます。
あとは、プロジェクト下のscalaファイルを開き、

M-x ensime

を実行すれば、ensime が起動します。

僕の環境では M-x ensime を実行すると ensime-serverとの接続に失敗したという内容のメッセージが出て、
inferior-ensime-server-xxx というバッファに Exec format error と出ていました。

sbtの起動スクリプトの先頭に #!/bin/bash を入れると動くようになりました。
Emacsからsbtが起動できなかったのが原因でした。

より使いやすく

ensimeは補完にcompany-modeを使っていますが、auto-completeに慣れているのでauto-completeを使うようにしました。

(setq ensime-completion-style 'auto-complete)

エラー箇所にカーソルを合わせるとミニバッファにエラー内容を表示するようにしました。

(defun scala/enable-eldoc ()
  "Show error message at point by Eldoc."
  (setq-local eldoc-documentation-function
              #'(lambda ()
                  (when (ensime-connected-p)
                    (let ((err (ensime-print-errors-at-point)))
                      (and err (not (string= err "")) err)))))
  (eldoc-mode +1))
(add-hook 'ensime-mode-hook #'scala/enable-eldoc)

最終的にはこんな感じの設定になりました。

(unless (package-installed-p 'scala-mode2)
  (package-refresh-contents) (package-install 'scala-mode2))
(unless (package-installed-p 'ensime)
  (package-refresh-contents) (package-install 'ensime))
(unless (package-installed-p 'auto-complete)
  (package-refresh-contents) (package-install 'auto-complete))

(require 'scala-mode2)
(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
(setq ensime-completion-style 'auto-complete)
(defun scala/enable-eldoc ()
  "Show error message at point by Eldoc."
  (setq-local eldoc-documentation-function
              #'(lambda ()
                  (when (ensime-connected-p)
                    (let ((err (ensime-print-errors-at-point)))
                      (and err (not (string= err "")) err)))))
  (eldoc-mode +1))
(add-hook 'ensime-mode-hook #'scala/enable-eldoc)

使い方

動作 コマンド キーバインド 説明
sbt起動 ensime-sbt C-c C-b s emacsでsbtを起動
定義元へジャンプ ensime-edit-definition M-. 変数、クラスの定義にジャンプ
戻る - M-, ジャンプ先から元に戻る
型情報を表示 ensime-inspect-type-at-point C-c C-b i カーソル位置の変数などの情報を表示
インポート ensime-import-type-at-point C-c C-r t カーソル位置のクラスをインポート
グローバル検索 ensime-search C-c C-v v 全体から型やメソッドを検索
テストへジャンプ ensime-goto-test C-c C-t t 対応するテストクラスにジャンプ
テストから戻る ensime-goto-impl C-c C-t i テストから戻る

詳しくは、 https://github.com/ensime/ensime-emacs/wiki/Navigating を参照して下さい。

おわりに

ensimeは、プロジェクトのルートディレクトリに.ensimeと.ensime_cacheというディレクトリを作ります。
これらのディレクトリはGitなどのリポジトリに含めるべきではありません。
.gitignoreに

.ensime
.ensime_cache/

を追記して利用することをおすすめします。

May the _ be with you.