こういう話がありました。
Feature Request : Support for scala in dap-mode · Issue #196 · emacs-lsp/dap-mode を見てもdap-modeの使い方がよく分からなかったし別に時間をかける所じゃないなと思ったので、デバッグする時だけはIntelliJを使うことにしようとしたのですが、私の環境だとUIが崩壊してデバッグ設定以前の問題になってしまいます。
実はMetalsの(というかlsp-mode+dap-modeの)デバッガはいま普通に機能するけど、確かに使い方(使える状態にするコツ)がちょっとむずかしい感じがしますね。実際にはやることはあんまりないんだけど、いざやろうとすると時間を食うと思うので、時間を食われてやった側の人間としてやり方を書き記しておこうと思います。本当は最近のEmacsのモダンな環境ぜんぶ紹介するみたいなのを書いてそこで(他の言語の場合も含めて)書くつもりだったけど、取り急ぎScalaのことだけ書きます。
設定方法
実はこれだけ。
(add-hook 'lsp-mode-hook 'dap-mode) (add-hook 'lsp-mode-hook 'dap-ui-mode) (add-hook 'lsp-mode-hook 'lsp-lens-mode) ; これはdap-modeに必須ではないがScalaではほぼ必要
参考までに僕が実際に使っている設定を貼っておきます。
- lsp-modeの設定
- サイドバーのウィンドウのサイズ調整をちょいちょいやっている以外はとくに変わったところはないはず
- Scala環境の設定
- MetalsやBloopをインストールするのがめんどいのでtarao/scala-bootstrap-elを使っている
デバッガの使い方
lsp-modeというかdap-modeでのデバッガを利用するには、普通なら、M-x dap-debug-edit-template
でデバッグテンプレートを書くか、dap-modeの各言語サポートで用意されているテンプレートを用いることになります。たとえばGoだとM-x dap-debug
すると一覧が現れてGo Attach Executable Configuration
を選ぶと実行中のプロセスに対してプロセスID指定でアタッチしてデバッグを開始できます。しかしScala(Metals)では(まだ)デバッグテンプレートが提供されていません。かと言って自分で書ける気がしない...... (書こうとしたことあるんだけど、なんかうまくいった試しがない。)
実はMetalsではM-x dap-debug
するよりもっと簡単なやり方があって、それはCode Lensを使う方法。というかおそらくEmacs上ではいまこれがMetalsでデバッグ開始する唯一の方法なんじゃないかと思います。(リモートデバッグもBloopで最近サポートされたのでデバッグテンプレートちゃんと書けば動きそうではある。)
lsp-lens-mode
を有効にしていると、main
メソッドを持つクラス(やオブジェクト)に対してrun|debug
が表示されるようになります(コンパイルのタイミングとかで出ないときがあるのでそういうときは頃合いを見てM-x revert-buffer
するとよさそう)。
あとはM-x lsp-avy-lens
等でdebug
のCode Lensを選択すると、デバッガが立ち上がります。M-x dap-breakpoint-toggle
でブレークポイント張れるし、M-x dap-next
で次のステップに進んだりできます(コマンド一覧はこちら)。
ちなみに、どういう原理なのかは知らないけどmain
メソッドを直書きしてなくてもScalaTestなどのテストクラスにもCode Lens出るので、特定のテストクラスだけ単体で実行するのもこれでやれて非常にべんりです。