なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

ensimeをscalaのコーディングで実戦投入していく

2020年11月追記

  • Ensimeのプロジェクトは停止しています、Metalsが優遇されたためメンテナーがプロジェクトを削除らしい

ensime.github.io

ensimeとは

github.com

What is ENSIME?

ENSIME is the ENhanced Scala Interaction Mode for Emacs. It provides many features that are commonly found only in IDEs, such as live error-checking, symbol inspection, package/type browsing, and basic refactorings. ENSIME's architecture is client/server: a thin Emacs client communicates with an analysis server written in Scala. The client component is based heavily on the SLIME environment for Common Lisp - using the same Swank RPC protocol. The server component services these calls using an instance of the official Scala compiler, so the results should always be consistent with the commandline compiler.

ENSIMEとは?

ENSIMEとはEmacsのためのENhanced(改良された)、ScalaのInteraction(対話)Mode(モード)です。EnsimeはIDEのみに見られる一般的な機能を数多く備えています、例えば動的なエラーチェッカー、シンボルの検査、そして基本的なリファクタリング機能などです。Ensimeの構造はサーバクライアント方式です: Emacsシンクライアントとして、Scalaで書かれたソースコード解析用のサーバと通信します。クライアントのモジュールはCommon LispのためのSLIMEの環境(- これはSwankのRPCプロトコルを使用する)に強く依存しています。サーバのサービスモジュールは、公式のScalaコンパイラインスタンスを使用して呼び出します、ですのでその結果はコマンドラインから呼び出したコンパイラの結果と一致する。

Elispを準備

Emacsからsbtを呼び出してビルドするとansiの制御コードが邪魔になるので、出来る限り表示できるようにする。

とりあえずsbt-modeを入れておく。

 > M-x package-install sbt-mode

その後色指定のelispを入れておく。シェルモードとコンパイル時にansiの制御コードがうまく機能するようになる。
元ネタはここから
http://www.moreslowly.jp/mw/index.php/Emacs_%E3%81%AE_compilation-mode_%E3%81%A7_ansi_color_%E3%81%8C%E5%8C%96%E3%81%91%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%93%E3%81%A8%E3%81%B8%E3%81%AE%E5%AF%BE%E5%87%A6

※実際このように頑張ってshell-modeを使うより、eshellを使ったほうがいいかもしれない。eshellは色は表示されないが確実に処理を見ることができる。

;; 色指定                                                                            
(add-hook 'compilation-mode-hook 'ansi-color-for-comint-mode-on)                     
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)                           
(add-hook 'shell-mode-hook 'sbt-mode)                                                
(add-hook 'compilation-filter-hook                                                   
          '(lambda ()                                                                
             (let ((start-marker (make-marker))                                      
                   (end-marker (process-mark (get-buffer-process (current-buffer)))))
               (set-marker start-marker (point-min))                                 
               (ansi-color-apply-on-region start-marker end-marker))))               

ensimeのインストール

引用させてもらう、
qiita.com

・設定用のelispの書き方などはQiitaを参考にしていいと思う。

ensime-serverのビルドとローカルリポジトリへのインストール

ビルドする場合はgithubからソースを取ってくる、ビルドしなくてもensime初回起動時にensime-updateが走りensime-serverを取得するため、やらなくても問題なさそうに見える

Scala-2.9, Scala-2.10用のブランチがあるので用途によってチェックアウトするソースは変える必要がありそう
・2015年現在はScala-2.11で開発しているみたいなので、2.11の場合はmasterからチェックアウトすればOKだと思う
・クッソ時間がかかる

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

sbt plugin

・私はいつもプロジェクト直下のproject/plugins.sbtに書き込んでる
・このplugins.sbtというファイル、一行ごとに空白行がないとエラーになります。*1

// scala 2.10.2 で起動を確認、2.11系はまた違うかも
resolvers += Resolver.sonatypeRepo("snapshots")

addSbtPlugin("org.ensime" % "ensime-sbt" % "0.1.5")
// or
addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.2")

これを書いた後 sbt gen-ensime できればほぼ用意は完了です。

ensime-sbt 0.2.0のリリース

・2015年9月10日に新しいensimeがリリースされているので、それを試してみてもいいかもしれません

ハマリポイント

結局は、新しめのsbt、新しめのensimeを使えば解決しそう。

Scala 2.11系は、scala 2.11.5 以上でないと起動できないかも?

github.com

Scala 2.10系は特にこの問題は起こらないようだ
build.scala/build.sbt/build.propertiesScalaのバージョンを指定していけばいいと思います

Scala 2.11/sbt-0.13.6/ensime-0.1.6でないと使えない?

github.com

M-x ensime起動時に org.ensime.server.Server が見つからないと表示される

emacsのクライアント側の問題かもしれないので`M-x ensime-update`を実行してみて

すぐに使えるコマンドとかマニュアル

まぬある
Home · ENSIME

C-c C-v v
Search globally for methods or types.

プロジェクト全体的に関数や型を検索する(M-x grep-find みたいな)
無駄にインクリメンタルサーチになっている。

C-c C-v f
Format the current Scala source file.

Scalaソースコードの整形

M-. or Control+Left-Click
Jump to definition of symbol under cursor.

カーソルを置いたシンボルの定義に飛ぶ

Launching the Debugger
C-c C-d d

デバッガの起動

Break Points
Scalaソースの任意の行にカーソルがある状態で、
C-c C-d b をタイプすることでブレークポイントを設定します。
C-c C-d u でブレークポイントを解除することができます。

プレークポイント

eclipseっぽいimport文の補完とか

ensimeがきちっと起動していれば、import文が書かれていないクラスは赤くなって表示される。
4.2 Error Highlighting

Home · ENSIME

赤くなったクラスまで行って、カーソルを置き C-c C-r t を実行すると保管される

C-c C-r x
Where x is one of:
r Rename the symbol at point.
o Organize imports.
l Extract local.
m Extract method.
i Inline local.
t Add import for type at point.

このビデオでだいたいわかった

*1:ドチャクソ不親切なエラーメッセージが出る