エディタと sbt だけで Scala のコードを書くことも可能だが、今日日のプログラマの多くは統合開発環境 (IDE) を用いる。 Scala の IDE は Metals と IntelliJ IDEA の二強で、それぞれ sbt ビルドとの統合をサポートする。
Metals は、Scala のためのオープンソースな言語サーバであり、VS Code その他の LSP をサポートするエディタのバックエンドとして機能することができる。 一方で Metals は、Build Server Protocol (BSP) 経由で sbt を含む異なるビルドサーバをサポートする。
VS Code で Metals を使うには:
build.sbt
ファイルを含むディレクトリを開く。
Cmd-Shift-P
) を開き Metals: Switch build server と打ち込み、「sbt」を選択する。一部のサブプロジェクトを BSP へ入れたく無い場合は、以下のセッティングを使うことができる。
bspEnabled := false
コードに変更を加えて保存 (macOS だと Cmd-S
) すると、Metals は sbt を呼び出して実際のビルド作業を行う。
Igal Tabachnik さんの Using BSP effectively in IntelliJ and Scala という記事が参考になる。
インタラクティブ・デバッグが開始してからの操作方法の詳細は VS Code ドキュメンテーションの Debugging ページ参照。
Metals がビルドサーバとして sbt を使う間、シンクライアントを使って同じ sbt セッションにログインすることができる。
sbt --client
と打ち込む。これで Metals が開始した sbt セッションにログインすることができた。その中でコードが既にコンパイルされた状態から testOnly
その他のタスクを実行できる。
IntelliJ IDEA は JetBrains社が開発した IDE で、Community Edition は Apache v2 ライセンスの元でオープンソース化されている。 IntelliJ は sbt を含む多くのビルドツールと統合して、プロジェクトをインポートすることができる。 これは従来の方法で、BSP よりも多くの場合安定性が高い。
IntelliJ IDEA にビルドをインポートするには:
build.sbt
ファイルを含んだディレクトリを開く:IntelliJ Scala プラグインは独自の軽量コンパイラエンジンを用いてエラーの検知を行うが、これは高速であるが正しくないこともある。Compiler-based highlighting といって、 IntelliJ を Scala コンパイラを使ってエラー・ハイライトを行うように設定することも可能だ。
インタラクティブ・デバッグが開始してからの操作方法の詳細は IntelliJ ドキュメンテーションの Debug code ページ参照。
IntelliJ へビルドをインポートするということは、事実上 IntelliJ をビルドツールやコンパイラとして採用してコードを書いているということだ (compiler-based highlighting も参照)。 多くのユーザはそのエキスペリエンスで満足しているが、一方でコードベースによってはコンパイラエラーが間違っていたり、ソース生成を行うプラグインと動作しなかったり、sbt と同一のビルド意味論を用いてコードを書きたいと思う人もいる。 幸いなことに、現代の IntelliJ は Build Server Protocol (BSP) 経由で sbt を含む異なるビルドサーバをサポートする。
IntelliJ において BSP を使う利点は、実際のビルド作業を sbt を用いて行うため、今までも sbt セッションを立ち上げながら IntelliJ を使っていた人は、二重でコンパイルしなくてもよくなるという利点がある。
IntelliJ へインポート | BSP を使った IntelliJ | |
---|---|---|
信頼性 | ✅ 安定した動作 | ⚠️ 技術的に枯れていないため、UX 問題などにあう可能性がある |
応答性 | ✅ | ⚠️ |
正確性 | ⚠️ 独自のコンパイラを用いた型検査。scalac に設定することも可能。 | ✅ Zinc + Scala コンパイラを用いた型検査 |
❌ ソース生成するごとに再同期が必要 | ✅ | |
ビルド | ❌ sbt を併用すると二重ビルドが必要になる | ✅ |
IntelliJ のビルドサーバとして sbt を用いるには:
Cmd-Shift-P
) より「Existing」 と打ち込んで「Import Project From Existing Sources」を探す:build.sbt
ファイルを開く。ダイアログが表示されたら BSP を選択する:一部のサブプロジェクトを BSP へ入れたく無い場合は、以下のセッティングを使うことができる。
bspEnabled := false
コードに変更を加えて保存 (macOS だと Cmd-S
) すると、IntelliJ は sbt を呼び出して実際のビルド作業を行う。
シンクライアントを使って既存の sbt セッションにログインすることができる。
sbt --client
と打ち込む。これで IntelliJ が開始した sbt セッションにログインすることができた。その中でコードが既にコンパイルされた状態から testOnly
その他のタスクを実行できる。
Neovim は、Vim エディタのモダンなフォークで、組み込みで LSP をサポートしていたりする。 そのため Neovim は Metals のフロントエンドとして設定可能だ。
Metals メンテナの一人である Chris Kipps さんが nvim-metals というプラグインを作っており、これは Metals 機能を網羅的にサポートする。
nvim-metals をインストールするには、Chris Kipps さんの lsp.lua を元に
$XDG_CONFIG_HOME/nvim/lua/
以下に設定ファイルを書き、自分の好みに合わせていく。
例えば、vim-plug など別のプラグインマネージャを使っている場合はプラグインの部分をコメントアウトする必要がある。
init.vim
から以下のようにして読み込める:
lua << END
require('lsp')
END
lsp.lua
によると、g:metals_status
はステータスラインに表示させるべきと書いてあり、これは lualine.nvim などを使って実現できる。
:MetalsInstall
を実行する。
:MetalsStartServer
を実行する。
gD
を使ってジャンプできる (具体的なキーバインドは好みのものにカスタマイズできる):Ctrl-O
を使って古いバッファーに戻る。
K
を使う:<leader>aa
を使う::cnext
や :cprev
といったコマンドを使ってエラーや警告を見ていける。
<leader>ae
を使う。
<leader>dt
を用いてブレークポイントを設定していく:K
) で確認して、debug continue (<leader>dc
) でデバッガを開始する。
プロンプトが表示されたら、「1: RunOrTest」を選ぶ。
<leader>dK
) を使って変数の値を検査することができる:<leader>dc
) してセッションを終了させる。
詳細は nvim-metals 参考。
シンクライアントを使って既存の sbt セッションにログインすることができる。
:terminal
と打ち込んで組み込みのターミナルを立ち上げる。
sbt --client
と打ち込むNeovim の中だが、タブ補完なども普通に動作する。