Scalaのバージョンを新しくしたら、Metalsの更新も忘れずに行うべきであると信じる件(付録つき)。

By | 2020年7月8日

少々長めの前置き

Scalaを2.13に変更して以降、EmacsでScalaのコードを書こうとすると、Emacsのミニバッファに…

という感じのメッセージが表示されたり、もっと派手なエラーメッセージが表示されるようになっていたのですが…

  • JavaのAPIを呼び出すレベルのコードであればそれでも何とか書けてしまうことと、
  • 原因がいまいちつかめていなかったこと。

から、特に対応せずに放置してました。

そうこうしているうちに、職場の方から…

というような感じの話が来て、手動で作業していたら日が暮れてしまうような作業を自動化するためのプログラムを書くことにしたのですが…

職場の作業用のPCにはEmacsは入っていますが、Metalsはインストールしていません。

さすがにMetalsが入っていないとコードに色がつかず、作業効率がダダ下がりになってしまいます。

そこで、職場の作業用のPCにもScala及びMetalsを入れてみたのですが、Metalsについてはそこはかとなく自宅用のPCのMetalsよりもアップデートされているように見えました。


スポンサーリンク

そういえば、上記のエラーメッセージが表示されたときに、「More Information」を選択すると…

ってな感じのメッセージが表示されていたのを思い出しました。

「これはもしかするとMetalsを最新のものに更新すれば解決できるんじゃね?」

と考え、自宅のPCのMetalsの更新を試みたのですが、ちょっとした追加作業が必要だったので、この記事ではその追加作業を中心に書きます。

スポンサーリンク

Metalsの更新作業

普通に更新。

Metalsの更新を行う作業といっても特別なものではなく、Metalsのページに書いてある手順に従い、init.elを追加(または修正)後、coursierを使ってmetals-emacsを作成します。

コマンドプロンプトでcoursierを実行すると…


スポンサーリンク

のような感じで、更新後のmetals-emacsの実行に必要なScalaまたはJavaのJARファイルがダウンロードされます。

追加の作業(その1):古いパッケージを明示的に削除する。

前節の作業が完了したらEmacsを再起動すると、必要なEmacs Lispのパッケージがダウンロードされてバイトコンパイルが行われ、Metalsが再度使えるようになる…

はずなのですが…

「lsp-protocol.elがありません。」

(超意訳)とか…

「lsp-treemacs–make-ref-itemがvoidだ。」


スポンサーリンク

などといった意味不明な供述エラーメッセージがEmacsのミニバッファに表示されて、バイトコンパイルが成功裏に完了しません。

そういうわけで、.emacs.d/elpaの状況を確認したりした結果、以下の手順で上記のエラーを解消させることができました。

  1. 以下のパッケージを.emacs/elpaから削除する。
    • lsp-*という名前のパッケージ(*はワイルドカードを表します)。
    • scala-mode (バージョンが古かったので、削除しました。)
    • 同一のパッケージ名で異なるバージョンが2個以上存在しているもの。該当するパッケージについてはすべてのバージョンを削除する。
  2. Emacsを起動して手順1で削除したパッケージの最新版のEmacs LispのパッケージをダウンロードしてEmacsにバイトコンパイルをさせる。
  3. Emacsを再起動する。

追加の作業(その2): init.elのカスタマイズ。

実は前節の手順でもさらに別のエラー(「lsp-metals-treeview-enableがvoidだ。」)が発生し、init.elの設定を反映できなかったので、lsp-treemacs関連の設定をコメントアウトしました。

最終的な動作の確認

ここで、再度Emacsを起動し、適当なScalaのプログラムを開いてみると…

Emacs上でフォーカスしているScalaのメソッドの説明が表示されるようになりました!!

スクリーンショットはありませんが、補完機能も再び動くようになりました。

まとめ

この記事の最初の方で書いた自動化ツールは無事完成しまして、(詳しくは書けませんが)作業の効率化とモチベーションの維持に絶大な効果を発揮してくれました。

Metalsも徐々に使い勝手が改善されてきているように感じるので、Scalaのマイナーバージョンが上がった際にはすかさず最新版に入れ換えるべきであると思いました。🐼

この記事の本編は以上です。

スポンサーリンク

付録: Proxy越しでcoursierのCLIを実行する方法(Windows 10の場合)

Windows 10にcoursierのCLIをダウンロードしてcoursierを実行してProxy越しにScalaまたはJavaのJARファイルをダウンロードする際には、以下の方法でProxyを設定した場合に限り、ダウンロードに成功しましたので、メモしておきます。φ(..)メモメモ

JARファイルとしてはcoursierを指定します。

$ $ java -Dhttps.proxyHost=… -Dhttps.proxyPort=… \
-jar coursier [args]

 

Windows 10上でcoursierのCLIを使用する際にはバッチファイル(coursier.bat)を起動することとなっていますが、バッチファイルを直接起動する方法ではProxyを越えることができず、ダウンロードに失敗しました。

なお、本節の情報はcoursierの2.0.0-RC6-21を用いてProxy越しにダウンロードを試みた場合の情報ですが、他の条件下においての結果を保証するものではありません。