Slide 1

Slide 1 text

Copyright © Henry, Inc. All rights reserved. kotlin-lsp の開発開始に触発されて、 Emacs で Kotlin 開発に挑戦した記録 株式会社ヘンリー SRE 渡辺 道和 (nabeo) Kotlin Fest 2025

Slide 2

Slide 2 text

Copyright © Henry, Inc. All rights reserved. X: @nabeo Blog: https://nabeop.hatenablog.com/ ● 渡辺 道和 (nabeo) ○ 2023年6月にインフラが得意な SRE として ジョイン ○ Kotlin 暦: 2年半 ○ Emacs 暦: そろそろ四半世紀 Kotlin はほぼ読み専。稀に既存のコードをちょこっとだけ 書き換えるなどしている。 自己紹介 2

Slide 3

Slide 3 text

Copyright © Henry, Inc. All rights reserved. 3 No Emacs, No Life Emacs の開発終了が 僕のエンジニア人生の終了だと思っている

Slide 4

Slide 4 text

Copyright © Henry, Inc. All rights reserved. ● AI 以前に LSP サーバの補助がないとコードリーディングの効率に影響する ○ 言語やプロジェクトに慣れていないうちは定義元ジャンプや参照先ジャンプがないと厳しい ● KotlinConf 2025 以前にも Kotlin における LSP サーバ実装は存在はしてい た ○ 大規模なプロジェクトでは実用に耐えない状態だった ○ 個人開発のプロダクトだったので開発も滞りがち ● IntelliJ IDEA は LSP サーバそのものではないが、LSP で提供される機能が 実装されている ○ Kotlin 開発では IntelliJ IDEA 一択という状況 現代において LSP は必須 4

Slide 5

Slide 5 text

Copyright © Henry, Inc. All rights reserved. 5 時は 2025年5月に遡る... ヒント: KotlinConf 2025

Slide 6

Slide 6 text

Copyright © Henry, Inc. All rights reserved. KotlinConf 2025 Unpacked: Upcoming Language Features, AI-Powered Development, and Kotlin Multiplatform Upgrades | The Kotlin Blog KotlinConf 2025 でまさかの LSP サーバ実装について言及される 6

Slide 7

Slide 7 text

Copyright © Henry, Inc. All rights reserved. 7 界隈がざわつく Kotlin 開発で Emacs が使えるかも...?

Slide 8

Slide 8 text

Copyright © Henry, Inc. All rights reserved. ● 使い慣れたエディタを使いたい ○ 自分が一番使い慣れているエディタが Emacs だった ○ このスライドも k1LoW/deck を使って Emacs で作っています ● エコシステムが充実している環境であれば自分にとって一番快適な環境を作 ることができる ○ 使用する言語によってエディタを使い分けたくない なぜ、Emacs を使いたいのか? 8

Slide 9

Slide 9 text

Copyright © Henry, Inc. All rights reserved. ● なにはなくとも LSP クライアント ● シンタックスハイライトは欲しい ● リンターもあれば嬉しい 現時点で Emacs でこれらをどれほどカバーできるかに挑戦してみた 9

Slide 10

Slide 10 text

Copyright © Henry, Inc. All rights reserved. 10 Emacs で kotlin-lsp を使う

Slide 11

Slide 11 text

Copyright © Henry, Inc. All rights reserved. ● 2つの選択肢がある ○ lsp-mode ○ eglot ● eglot は Emacs に標準で組み込まれている ● lsp-mode は 3rd パーティのパッケージとして提供されている Emacs での LSP 事情 11

Slide 12

Slide 12 text

Copyright © Henry, Inc. All rights reserved. kotlin-lsp はどちらでも使える ● lsp-mode は機能が豊富で様々な LSP サーバに対応している ● eglot はシンプルに使える lsp-mode v.s. eglot 12

Slide 13

Slide 13 text

Copyright © Henry, Inc. All rights reserved. ● 2ヶ月前くらいまでは eglot を使っていたけど、lsp-mode に乗り換えた ● 開発環境の快適さを追求できる ○ lsp-mode がデファクトスタンダードの位置にいる ○ lsp-mode には機能を拡張する lsp-ui や consult-lsp など多くのツールが存在している ○ 保存時に LSP サーバの機能を使ってフォーマットもしてくれる ○ ドキュメントが豊富 個人的には lsp-mode 推し (になった) 13

Slide 14

Slide 14 text

Copyright © Henry, Inc. All rights reserved. 14 kotlin-lsp で ktorio/ktor-samples を読んでいる様子

Slide 15

Slide 15 text

Copyright © Henry, Inc. All rights reserved. 大前提: pre-alpha という位置付けなので転んでも泣かない覚悟が必要!! ● メモリ消費が激しくて、初期化時に OOM エラーが発生する場合がある ○ ラッパースクリプト内の Java の起動引数をよしなにする ● すくなくとも macOS では最新の v0.253.10629 ではコード補完がうまく動 かない ○ Github でも不具合報告として複数の issue が立っている ○ 一つ前の v0.252.17811 はちゃんと使える ● 最後のリリースから2ヶ月以上新しいリリースがされていない ○ v0.253.10629 のリリース前に2週間ごとのリリースサイクルが予告されていた ○ クローズドなコードからの分離がうまくいっていないのではないか? ○ GitHub 上では頻繁にコミットが積まれているので信じて気長に待つ kotlin-lsp を使う時の注意点 15

Slide 16

Slide 16 text

Copyright © Henry, Inc. All rights reserved. 16 シンタックスハイライト

Slide 17

Slide 17 text

Copyright © Henry, Inc. All rights reserved. ● コードの構文を分析して CST を作成する ● GitHub で開発されてコードハイライトやアウトライン解析などで利用され ている ● Emacs では 29 から標準で使える様になった ● 各言語ごとにパーサーが開発されている Tree-sitter 17

Slide 18

Slide 18 text

Copyright © Henry, Inc. All rights reserved. ● fwcd さんが Kotlin 向けのパーサーを公開している ● M-x treesit-install-language-grammar して kotlin を選択すると ライブラリがコンパイルされる ○ kotlin 関連のファイルを開くとメジャーモードが kotlin-ts-mode となり Tree-sitter に よるシンタックスハイライトが有効になる Emacs で Tree-sitter を使う 18

Slide 19

Slide 19 text

Copyright © Henry, Inc. All rights reserved. 19 リンター (静的解析)

Slide 20

Slide 20 text

Copyright © Henry, Inc. All rights reserved. ● Emacs では Flycheck がデファクトスタンダードとなっている ○ lsp-mode のエラーなども Flycheck で確認することができる ● Flycheck はリンターなどをチェッカーとして定義して使用する ● Kotlin 向けのチェッカーは flycheck-kotlin というパッケージが存在する ○ 内部では ktlint が使われている ○ 会社ではリンターとして detekt を使っているが Flycheck 用のチェッカーが見つからなかった 20 Flycheck

Slide 21

Slide 21 text

Copyright © Henry, Inc. All rights reserved. flycheck-kotlin で ktorio/ktor-samples のコードを見ている様子 21

Slide 22

Slide 22 text

Copyright © Henry, Inc. All rights reserved. ● 編集中のファイルに対応しているチェッカーのリストのうち最初のチェッ カーをデフォルトで使う ○ lsp-mode のチェッカーがリストの一番先頭にきているので、flycheck-kotlin はデフォルト では使えない ○ M-x flycheck-select-checker で選択する必要がある ● flycheck-add-next-checker を使って lsp-mode のチェッカーの後に flycheck-kotlin のチェッカーを実行させる ○ kotlin-lsp は外部のパッケージの読み込みなどに対応していないので、lsp-mode 由来のエ ラーが大量にでてくるのでノイズになる lsp-mode を組み合わせた時に複数のチェッカーを組み合わせる 22

Slide 23

Slide 23 text

Copyright © Henry, Inc. All rights reserved. 俺たちの戦いはこれからだ!! ● 他の言語と比較すると Kotlin 開発では IntelliJ IDEA 一強時代が長かったの でエコシステムの充実度は低いといわざるを得ない ○ 例えば、Emacs から gradle の任意のタスクを実行するようなパッケージは存在しなさそう だった ● 公式による LSP サーバ実装の開発が開始されて機運は高まってきている (と 思いたい) ○ 少なくとも IntelliJ IDEA 以外のエディタを使った Kotlin 開発の可能性は出てきた ○ 特に AI との親和性が高い Cursor や Kiro などのエディタの現実味はあるはず ● Emacs の設定は GitHub で公開しているので参考にしてください ○ https://github.com/nabeo/dot.emacs まとめ 23

Slide 24

Slide 24 text

Copyright © Henry, Inc. All rights reserved. 24 ヘンリーブースでもっとエディタ談義しませんか? 採用情報 募集中の採用ポジションや募集要項などがご確認いた だけます。 オープンポジションのカジュアル面談も募集していま すので、お気軽にお申し込みください。 技術ブログ ヘンリー製品開発チームが運営する技術ブログです。