kotlin-lsp の開発開始に触発されて、Emacs で Kotlin 開発に挑戦した記録 / kotlin‑lsp as a Catalyst: My Journey to Kotlin Development in Emacs
by
nabeo
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 ヘンリーブースでもっとエディタ談義しませんか? 採用情報 募集中の採用ポジションや募集要項などがご確認いた だけます。 オープンポジションのカジュアル面談も募集していま すので、お気軽にお申し込みください。 技術ブログ ヘンリー製品開発チームが運営する技術ブログです。