Chatwork Creator's Note

ビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。

ビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。

読者になる

ScalaMatsuri 2022参加レポート〜VimでScalaを書けるようにする〜

こんにちは。都志(@louvre2489)です。

2022/03/19〜03/20にかけて実施されたScalaMatsuri 2022に参加してきました。

今回も興味深いセッションが多く、とても楽しめるイベントでした。セッション内容は以下で確認ができ、資料が共有されているものも多いので、『参加できなかったけど気になる〜!』という方は是非チェックしてみてください。

scalamatsuri.org

個人的には、2日目の飛び入りカンファレンスでの『あなたの知らないMetalsの便利な100の機能』がとても興味深かったです。あまりにもテンションが上がってしまい、勢いでその日の夜に Vim + Metals の設定を行ってしまいました。

このブログでは、同じように興味を持った人がスムーズに設定を行えるように設定の段取りをご紹介したいと思います。

想定読者

  • Scala が好きな人
  • Vim が好きな人

Metals とは

公式ページはこちらです。

scalameta.org

カンファレンス時に共有していただいた資料はこちらです。

scrapbox.io

以下、Metals の概要です

それではここからは 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を使用すべきであるとされており、理由は以下で説明されています。

github.com

nvim-metals を入れる

いよいよここからnvim-metalsを使えるようにしていきます。

まずはこちらのプラグインを入れます。

github.com

単純に入れたらOKというわけではなく、README にいくつか前提条件が提示されているので注意してください。

NeoVim のバージョン

v.0.6.0以上が必要となります。

Coursier が必要

Coursier(Scala の環境セットアップ用ツール) がインストールされていないといけないことに注意してください。

ここに記載されている手順に従ってインストールすれば特に困ることはないと思います。

plenary.nvim が必要

plenary.nvim に依存しているので、こちらのプラグインも入れないといけないことに注意してください。

なお、plenary.nvimはプラグインとして追加してあげるだけで良く、plenary.nvimに対する設定は特に不要です。

nvim-metals の設定を追加する

ここまで手順を進めてもまだ動きません。

これまた README に書かれている通り、機能を利用するためのマッピングは自分で定義してあげないといけないようです。

ここで一瞬途方に暮れるんですが、なんとガッツリと設定例を提示してくれています。

github.com

また、機能一覧には各動作に必要なマッピングを説明してくれている(しかも動画付き!)ので、こちらを見ながら自分が利用したい機能とそのマッピングを追記してください。

これらを丸パクリ参考にして設定を行った結果がこちらとなります。

github.com

こんなかんじになりました

  • エラーや警告を表示してくれます f:id:louvre2489:20220323184058p:plain

  • 補完もバッチリ(要自動補完用プラグイン) f:id:louvre2489:20220323184121p:plain

  • メソッドのシグネチャ情報を確認できる f:id:louvre2489:20220323184148p:plain

  • そこから定義にジャンプすることもできる(今回はZIOのコードにジャンプしてみました) f:id:louvre2489:20220323184225p:plain

その他にも、importの自動追加や、型を明記していない変数・メソッドに対する型の追記(明示化)など、コードを書く上で必要そうな補助機能も色々と存在します。

ちょっと残念なところも...

一部機能を利用することができない

たとえば、showInferredTypeを有効にすると以下のように変数の型の情報がホバーで表示されるようなのですが、Vimではこちらの機能が利用できませんでした。

f:id:louvre2489:20220323191445p:plain

こちらの機能は VSCode と Emacs でしか利用できないようです。(このあたりに書かれています)

まとめ

一部利用することができない機能もあったりしますが、エラー情報の表示やコード補完などのコーディングするのに必要な環境をVim上に整えることができました。

サラッと触ったかんじ、簡単なコーディングをする上では特に気になるところはありませんでした。(複雑なことをやろうとすると IntelliJ を使いたくなるかもしれませんが...)

もはや完全にIDEですね!しばらくはVimでScalaのコーディングをして楽しんでみようと思います!