NeoVim/coc.nvimでJavaの開発環境を整える(補完、定義へ移動、コードフォーマット、デバッグ)
数年前にJavaを書いていた時はEclipseを使用していました。今は全ての作業をNeoVimで行いたいため、NeoVimとLSPクライアントのcoc.nvimを使用した開発環境を整えてみました。
主に以下の機能を利用できるようにします。1〜3はcoc-java
、4はcoc-java-debug
とviminspector
を使用します。
- 補完
- 定義へ移動
- コードフォーマット
- デバッグ
動作確認にはSpring Bootの以下のサンプルアプリを使います。
ビルドツールはgradleを使用します。以下のコマンドでアプリを起動します。
$ cd gs-rest-service/complete
$ ./gradlew bootRun
curlでAPIの動作を確認します。
$ curl http://localhost:8080/greeting?name=hoge
{"id":1,"content":"Hello, hoge!"}
補完・定義へ移動・コードフォーマット
coc-java
はVSCodeのJava拡張機能のような機能をVimで利用できるようにするためのcoc.nvim拡張です。
coc-java
をインストールすれば1〜3のエディタの機能を利用できます。coc-java
のインストールと同時に最新のjdt.lsをインストールしてくれます。
:CocInstall coc-java
これで補完が効きます。以下のように、@Comp
まで打って候補が表示されています。
定義へ移動もできます。以下は@GetMapping
アノテーションへ移動した際の表示です。
デフォルトでコードフォーマットも可能です。フォーマットルールはcoc-settings.json
にいくつか設定をすると変更できるようです。フォーマット設定の詳細はこちらを確認すると良さそうです。
java.format.settings.url : Specifies the url or file path to the Eclipse formatter xml settings.
java.format.settings.profile : Optional formatter profile name from the Eclipse formatter settings.
以上のように、1〜3あたりの機能が使えればNeoVimでも十分Javaの開発を進められるかと思います。
デバッグ
NeoVimでブレークポイントを置いてデバッガーを起動してステップインして…といったデバッグ作業をするために、viminspector
というVimプラグインとcoc-java-debug
というcoc.nvim拡張機能を使います。
まずはviminspector
です。使用しているプラグインマネージャーでインストールします。また、プラグインを読み込む前にlet g:vimspector_enable_mappings = 'HUMAN'
というグローバル変数を設定しておきます。これを設定すると、F5等のファンクションキーを利用してブレークポイントの切り替えやステップイン等のデバッグ操作を行うことができるようになります。
let g:vimspector_enable_mappings = 'HUMAN'
Plug 'puremourning/vimspector'
次にcoc-java-debug
をCocInstall
でインストールします。
:CocInstall coc-java-debug
各種ツールの準備は完了です。サンプルアプリでデバッグを試してみます。
サンプルアプリのプロジェクトルートに.vimspector.json
という設定ファイルを配置する必要があります。これはcoc-java-debug
のREADME.mdに記載のあるコード例をそのまま使用します。
{
"adapters": {
"java-debug-server": {
"name": "vscode-java",
"port": "${AdapterPort}"
}
},
"configurations": {
"Java Attach": {
"default": true,
"adapter": "java-debug-server",
"configuration": {
"request": "attach",
"host": "127.0.0.1",
"port": "5005"
},
"breakpoints": {
"exception": {
"caught": "N",
"uncaught": "N"
}
}
}
}
--debug-jvm
を追加してアプリを起動します。
$ ./gradlew bootRun --debug-jvm
NeoVimでデバッグ対象のソースコードにブレークポイントを置きます。F9でブレークポイントのトグルができます。
ブレークポイントを置いたら、:CocCommand java.debug.vimspector.start
でデバッガーを起動します。
その後、curlでAPIを実行してみます。
$ curl "http://localhost:8080/greeting?name=hoge"
すると、レスポンスは返ってこず、NeoVimを見てみるとブレークポイントを置いた行で処理がとまっています。NeoVim上の別ウィンドウで変数の内容を確認することができます。F10でステップオーバー、F11でステップインができます。
F5を押すと次のブレークポイントまで飛びますが、今回は一つしか置いていないのでこれでデバッグは終了します。EclipseでやっていたようなデバッグをNeoVimで実施することができました。
まとめ
とりあえずcoc-java
さえインストールすれば快適にJavaのコーディングができます。デバッグについては色々調べた結果それらしいことはできましたが、もしかしたらEclipseやIntelliJのようなIDEの方がやりやすいかもしれません。
Discussion