こんにちは。都志(@louvre2489)です。
2022/03/19〜03/20にかけて実施されたScalaMatsuri 2022に参加してきました。
今回も興味深いセッションが多く、とても楽しめるイベントでした。セッション内容は以下で確認ができ、資料が共有されているものも多いので、『参加できなかったけど気になる〜!』という方は是非チェックしてみてください。
個人的には、2日目の飛び入りカンファレンスでの『あなたの知らないMetalsの便利な100の機能』がとても興味深かったです。あまりにもテンションが上がってしまい、勢いでその日の夜に Vim + Metals の設定を行ってしまいました。
このブログでは、同じように興味を持った人がスムーズに設定を行えるように設定の段取りをご紹介したいと思います。
想定読者
- Scala が好きな人
- Vim が好きな人
Metals とは
公式ページはこちらです。
カンファレンス時に共有していただいた資料はこちらです。
以下、Metals の概要です
- Scala の LSP 実装
- LSP に馴染みの無い方は、『コード解析を行ってプログラム開発を補助してくれる機能』と認識していただければOKだと思います
- このあたりを読むと少しイメージがわくかもしれません:言語サーバープロトコルの概要 - Visual Studio (Windows) | Microsoft Docs
- Scalaの開発環境としては、利用率が IntelliJ に次いで多い
- カンファレンス内では、『数年前のシェア調査では IntelliJ が7〜8割で Metals が1〜2割』と仰っていた気がします(数値は記憶が間違ってるかも)
- JetBrains の調査(Scala プログラミング - インフォグラフィック:2021年開発者エコシステムの現状 | JetBrains: Developer Tools for Professionals and Teams)ではIntelliJのシェアが圧倒的とのことですが、これは JetBrains 製品ユーザーが主なアンケート回答者だったとのことなので...
それではここからは Vim で Metals を利用する方法をご紹介します。
Vim(NeoVim)でScalaを書けるようにする
環境
今回、以下の環境で動作することを確認しています。
- NeoVim:v0.6.1
- Scala:2.13.8
※ 素の Vim を利用している場合は、このブログの内容では環境構築することはできません。
まずはMetalsの公式ページを見てみる
Vim での利用についてはこちらに記載されています。
coc.nvim での導入方法については手厚く書かれているので、coc.nvim
ユーザーであればこの通り進めていけば特に困ることはないと思います。(coc.nvim
ユーザーの場合は、以降の説明を読む必要はありません)
しかし、私は coc.nvim
しておらず、補完ツールには ddc.vim 、LSPクライアントには nvim-lsp
(NeoVim標準のLSPクライアント)を利用しています。そのような場合はどうすれば良いかと言うと、、、
こちらに書かれています。完全にページの一番下で、何やら "ついで" 感を感じますね。
ここには以下のように記載されています。
While we recommend using the coc-metals extension with coc.nvim, or nvim-metals with Neovim, Metals will work with these alternative LSP clients. Keep in mind that they have varying levels of LSP support, and you need to bootstrap Metals yourself.
coc-nvim
を推奨しているのは公式ページの章構成から察していましたが、coc-nvim
を利用していないNeoVim ユーザーであればnvim-metals
を使うのが良さそうですね。ということで、今回はnvim-metals
を導入してみます。
ちなみに、nvim-metals
を使わなくても、nvim-lspconfigなどの LSP ツールを利用して Metals を利用することも可能です。しかし、それでもnvim-metals
を使用すべきであるとされており、理由は以下で説明されています。
nvim-metals を入れる
いよいよここからnvim-metals
を使えるようにしていきます。
まずはこちらのプラグインを入れます。
単純に入れたらOKというわけではなく、README にいくつか前提条件が提示されているので注意してください。
NeoVim のバージョン
v.0.6.0以上が必要となります。
Coursier が必要
Coursier(Scala の環境セットアップ用ツール) がインストールされていないといけないことに注意してください。
ここに記載されている手順に従ってインストールすれば特に困ることはないと思います。
plenary.nvim が必要
plenary.nvim に依存しているので、こちらのプラグインも入れないといけないことに注意してください。
なお、plenary.nvim
はプラグインとして追加してあげるだけで良く、plenary.nvim
に対する設定は特に不要です。
nvim-metals の設定を追加する
ここまで手順を進めてもまだ動きません。
これまた README に書かれている通り、機能を利用するためのマッピングは自分で定義してあげないといけないようです。
ここで一瞬途方に暮れるんですが、なんとガッツリと設定例を提示してくれています。
また、機能一覧には各動作に必要なマッピングを説明してくれている(しかも動画付き!)ので、こちらを見ながら自分が利用したい機能とそのマッピングを追記してください。
これらを丸パクリ参考にして設定を行った結果がこちらとなります。
こんなかんじになりました
エラーや警告を表示してくれます
補完もバッチリ(要自動補完用プラグイン)
メソッドのシグネチャ情報を確認できる
そこから定義にジャンプすることもできる(今回はZIOのコードにジャンプしてみました)
その他にも、import
の自動追加や、型を明記していない変数・メソッドに対する型の追記(明示化)など、コードを書く上で必要そうな補助機能も色々と存在します。
ちょっと残念なところも...
一部機能を利用することができない
たとえば、showInferredType
を有効にすると以下のように変数の型の情報がホバーで表示されるようなのですが、Vimではこちらの機能が利用できませんでした。
こちらの機能は VSCode と Emacs でしか利用できないようです。(このあたりに書かれています)
まとめ
一部利用することができない機能もあったりしますが、エラー情報の表示やコード補完などのコーディングするのに必要な環境をVim上に整えることができました。
サラッと触ったかんじ、簡単なコーディングをする上では特に気になるところはありませんでした。(複雑なことをやろうとすると IntelliJ を使いたくなるかもしれませんが...)
もはや完全にIDEですね!しばらくはVimでScalaのコーディングをして楽しんでみようと思います!