🍺

NeoVim/coc.nvimでJavaの開発環境を整える(補完、定義へ移動、コードフォーマット、デバッグ)

2021/05/09に公開

数年前にJavaを書いていた時はEclipseを使用していました。今は全ての作業をNeoVimで行いたいため、NeoVimとLSPクライアントのcoc.nvimを使用した開発環境を整えてみました。

主に以下の機能を利用できるようにします。1〜3はcoc-java、4はcoc-java-debugviminspectorを使用します。

  1. 補完
  2. 定義へ移動
  3. コードフォーマット
  4. デバッグ

動作確認にはSpring Bootの以下のサンプルアプリを使います。

https://github.com/spring-guides/gs-rest-service

ビルドツールはgradleを使用します。以下のコマンドでアプリを起動します。

$ cd gs-rest-service/complete
$ ./gradlew bootRun

curlでAPIの動作を確認します。

$ curl http://localhost:8080/greeting?name=hoge
{"id":1,"content":"Hello, hoge!"}

補完・定義へ移動・コードフォーマット

coc-javaVSCodeのJava拡張機能のような機能をVimで利用できるようにするためのcoc.nvim拡張です。

coc-javaをインストールすれば1〜3のエディタの機能を利用できます。coc-javaのインストールと同時に最新のjdt.lsをインストールしてくれます。

https://github.com/neoclide/coc-java

: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-debugCocInstallでインストールします。

:CocInstall coc-java-debug

各種ツールの準備は完了です。サンプルアプリでデバッグを試してみます。

サンプルアプリのプロジェクトルートに.vimspector.jsonという設定ファイルを配置する必要があります。これはcoc-java-debugREADME.mdに記載のあるコード例をそのまま使用します。

.vimspector.json
{
  "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