nabeo がピーしているブログ (仮)

どーも、nabeop です

Emacs + eglot で kotlin-lsp を使う

Kotlin Conf 2025 でサラッと Kotlin の LSP サーバ実装を開発中ということが発表された。

VS Code の拡張として提供されるらしいが、Githubリポジトリをみると Emacs や neovim 向けでも使えるように Standalone 版がダウンロードできるようになっている。今までは仕事で Kotlin を使うために InteliJ IDEA を起動していたけど、手に馴染んだ Emacs で Kotlin のコードを触ることができるなら、そうしたいので Standalone 版の kotlin-lsp を Emacs + eglot の環境で使えるように試行錯誤してみた。

user-emacs-directory 以下の data/kotlin-lsp ディレクトリにダウンロードしてきた zip ファイルを展開して eglot-server-program に以下のような設定を追加した。

  (add-to-list
    'eglot-server-programs
    `((kotlin-mode kotlin-ts-mode) . (,(concat user-emacs-directory "data/kotlin-lsp/kotlin-lsp.sh") "--stdio")))

で、この状態で kotlin で書かれたファイルを開くと kotlin-lsp が起動するんだけど、LSP サーバの起動時の initialize 処理で OOM で落ちるという状況だった。macOSアクティビティモニタをみていると僕の環境では 8GB から 9GB 付近に天井がありそうだった。kotlin-lsp.sh を読んだところ外部から heap 領域の上限を指定できるようにはなってなかったので、Java を起動しているところに -Xmx24G として割り当ててみた。

今度は OOM で落ちることはなくなったけど、 initialize 処理で eglot がタイムアウトしたので、eglot-connect-timeout を 60 で設定してたところを 120 にしてあげた。

これでひとまず使えるようになったけど、kotlin-lsp は対象の Kotlin プロジェクトのサイズによってメモリを消費するぽくて、感覚的にはローカル LLM で少し大きめのモデルを使った時と同じくらいだった。ちょっとこのまま使い続けるかは悩むところだけど、以前の状況よりもマシにはなってきているのでこのまま頑張ってほしい。Jetbrains さんのビジネスモデルを考えると将来的には kotlin-lsp を使うために有料のプランが必要ということになりそうだけど、まともに使えるなら有料プランに課金もやぶさかではないというスタンスです。