これまでScalaでの開発にはENSIMEを使ってきたけど, もうそろそろ頃合いだとおもうのでMetalsに乗り換えた. エディタ側でLSPのサポートが充実してきているのでこれはだいぶ簡単で, さっくり乗り換えることができた.
Metalsはビルド部分は裏側でBloopを使っているので, テストの実行なんかもこれに乗っかるとだいぶ楽になる. けどEmacsからBloopを利用するにはまだちょっと面倒なところもあったので, この際いろいろ整備してみた.
Metals + Bloop
MetalsはまぁふつうにScalaのlanguage serverという感じだけど, ENSIMEと比べると以下の点が強力(個人的な視点).
Metalsでできること・できないこと
(個人的な視点で欲しかったものベースなので網羅性はない)
できる
- 型情報やコンパイルエラーの情報の表示
- ドキュメントやメソッドパラメータの表示
- 定義へのジャンプ
- 補完
- シンボルの利用箇所の列挙
Emacsで使う
基本的には公式の設定方法に従ったらよいだけ. とはいえ面倒な部分もあったので自分でいろいろ整えた.
MetalsとBloopをインストールするのすら面倒
どこにインストールするかとか考えたくもない. バージョンアップするときどのファイルを置き換えたらいいかも考えたくない. そこで, Emacs側で設定してあれば裏で勝手にダウンロードしてきてBloopサーバも起動しといてくれるようにするやつを作った.
(require 'scala-bootstrap) (require 'lsp-mode) (add-hook 'scala-mode-hook '(lambda () (scala-bootstrap:with-metals-installed (scala-bootstrap:with-bloop-server-started (lsp)))))
という感じにするとscala-mode
でいますぐMetals生活が始められる(実際に使ってる設定はこういうかんじ). 最新版にするときはM-x scala-bootstrap:reinstalll-metals
とかでイケる. カスタム変数を設定すればバージョン固定もできる.
Bloopを使うのが面倒
コマンドラインでbloop test --only \*MySpec myproject
みたいにするのはめんどくさすぎる. プロジェクト内のファイルを編集中になにかてきとうなコマンドを叩いたらさっと実行してほしい. sbt-mode
ではそういうのができた.
調べてみるとemacs-bloopというのがあるけど, だいぶ雑でrequire
できるようにすらなってないし, bloop console
には対応していなかった. ということでforkして足りないところを補った.
README.md
までちゃんとする余力はなかったのでこのへんの設定から使い方を感じとってほしい.
がんばったところとしてはbloop console
をcomint-mode
でうまく扱えるようにいろいろしてるところ. 具体的には以下のあたり.
- 色指定以外のANSIエスケープコード(CSI)もやってくるので無視する
- プロンプトになぜかスペースが一つ余計につくので除く
- 複数行入力を適切に扱う
- エコーバックされてくると二重に出ちゃうのでなんとかする
副作用としてプロンプトをEmacs側で任意にカスタマイズできるようになった.