Slide 1

Slide 1 text

Kotlin-lspの最新情報と Neovimのlsp設定例 Server-Side Kotlin LT大会 vol.18 2026年4⽉8⽇ 株式会社ログラス 1

Slide 2

Slide 2 text

のコードを⾒るとき、 何のエディタを使っていますか?

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

全てが揃う、間違い無しの選択

Slide 5

Slide 5 text

でも、私は…

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

self-intro

Slide 8

Slide 8 text

LSP(Language Server Protocol) とは 8

Slide 9

Slide 9 text

LSP(Language Server Protocol)とは 解決する課題: "M × N" の壁 9 以前は、新しいエディタ(Vim, Sublime Text, IntelliJ等)で、新しい⾔語(Kotlin, Rust, Go等)を使おうとするたびに、専⽤のプラグインをゼロから開発する必要があり ました。 • 以前: ⾔語数 (M) × エディタ数 (N) の開発コストが発⽣ • LSP導⼊後: ⾔語サーバーが1つあれば、共通プロトコルを通じて全エディタで動作

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

LSP(Language Server Protocol)とは LSPの仕組み: エディタとサーバーの対話 11 エディタ(クライアント)と、解析エンジン(サーバー)が JSON-RPC で通信します。 1. Editor: 「今、main.kt の5⾏⽬、10列⽬にカーソルがあるよ」 2. Language Server: 「そこなら、println という関数が補完候補だね」 3. Editor: (補完リストを表⽰)

Slide 12

Slide 12 text

LSP(Language Server Protocol)とは 提供される主な機能 12 • コード補完(IntelliSense, Completion) • 定義へのジャンプ / 参照元検索 • ホバーによるドキュメント表⽰ • リアルタイムの静的解析(警告‧エラー表⽰)

Slide 13

Slide 13 text

kotlin-lspについて 13

Slide 14

Slide 14 text

• これまでKotlinのLanguage Serverはコミュニティ版しか存在しなかった ‐ https://github.com/fwcd/kotlin-language-server • 2025年のKotlinConf Keynoteで公式がKotlinのlanguage serverを開発することを発表 ‐ 発表段階ではPre-alpha版、現時点でもPre-alpha版 ‐ https://www.youtube.com/shorts/YE8UzPavOTA • ソースコードは⼀部公開というステータス ‐ ユーザーによるビルドは不可能 ‐ IntelliJに組込まれているKotlinプラグインの機能を kotlin-lspに移植作業中というステータス • リリースノートでは毎週リリースという表記はある ‐ ただ、現時点ではリリース間隔は不定期 ‐ https://github.com/Kotlin/kotlin-lsp/blob/main/RELEASES.md kotlin-lspについて KotlinConf 2025で発表された”公式の”language server 14

Slide 15

Slide 15 text

IntelliJを使わなくても Kotlinが書ける

Slide 16

Slide 16 text

つまり、Vimmerの私としては 激アツなわけです!!

Slide 17

Slide 17 text

そうは⾔ってもkotlin-lspはPre-alpha版 課題は盛り沢⼭な状態でした…

Slide 18

Slide 18 text

kotlin-lspについて Kotlin-lspの課題 18 • VSCode以外で使う場合は、Standalone版を実⾏する必要がある。 ‐ 公式の開発メンバーの誰かがkotlin-lsp単体を動かすことができたスクリプトを使っている状態 • メモリ使⽤量が⾮常に多い ‐ 巨⼤なプロジェクトになるほどメモリ使⽤量が多くなるので -Xmx24G みたいなオプションを付ける ‐ https://speakerdeck.com/nabeo/use-kotlin-lsp-in-emacs?slide=9 • Composite Buildに対応していない ‐ 複数モジュールの読み込みはひと⼿間加える必要がある ‐ 後述するNeovimの設定

Slide 19

Slide 19 text

そして、2026年3⽉20⽇…

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

v262.2310.0のリリース 🎉 !!!!

Slide 22

Slide 22 text

22 kotlin-lspについて v262.2310.0 のすごいところ • Kotlin 2.3.0のサポート • 実装‧型定義ジャンプの追加 • いくつかのコードアクション追加 • パフォーマンス改善とメモリリークバグの修正 ‐ 体感ではあるが、明かにメモリ使⽤量が少なくなっている • Mavenからのプロジェクトインポートがサポートされる • Gradleのプロジェクトインポートが安定

Slide 23

Slide 23 text

Gradleのプロジェクトインポートが安定化

Slide 24

Slide 24 text

念願のComposite Buildの対応

Slide 25

Slide 25 text

じゃあ、⼿放しで使えるのか? と⾔われると、そうでも無い。

Slide 26

Slide 26 text

まだ”設定させていただける”余地はある。

Slide 27

Slide 27 text

Neovimの設定例 27

Slide 28

Slide 28 text

Neovimの設定例 そもそも、”設定させていただける”とは? 28 • VimもNeovimも基本的に設定しないと便利に使えません。 • 簡単には使えないですが、どういう仕組みで動いているのかを理解できるようになれます。 • 仕組みを理解できるようになると、理解が深まり、更なる改善案が⽣れます。 • 改善をしていけば、作業効率は向上していきます。 • 作業効率の向上が⾒込める”設定”という⾏為、とても素敵だと思いませんか? • つまり、”設定させていただける”ことは感謝すべきことです。

Slide 29

Slide 29 text

故に 設定させていただきありがとうございます。

Slide 30

Slide 30 text

Neovimの設定例 kotlin-lsp における Workspace Folders 設定 -> Gradle composite build を LSP に認識させる仕組み 30 settings.gradle.kts の includeBuild() は、別ディレクトリのプロジェクトをビルドに組み込む。 メインプロジェクトの rootUri 外にソースが分散するため、LSP に追加で認識させる必要がある。

Slide 31

Slide 31 text

Neovimの設定例 問題 ー LSPサーバーの認識範囲 31 LSP サーバーは起動時に rootUri(1ディレクトリ)しか認識しない。 includeBuild 先のコードはインデックス対象外となり、以下の問題が発⽣する: • 定義ジャンプが機能しない • 型解決に失敗する • 偽のエラー診断が表⽰される

Slide 32

Slide 32 text

32

Slide 33

Slide 33 text

Neovimの設定例 解決策 ー workspace/didChangeWorkspaceFolders 33 LSP 仕様に定義された通知メソッドで、サーバーの認識対象ディレクトリを動的に追加‧削除できる。 Neovim では vim.lsp.buf.add_workspace_folder() を呼ぶことでこの通知が送信される。

Slide 34

Slide 34 text

Neovimの設定例 34

Slide 35

Slide 35 text

Neovimの設定例 なぜ on_init で実⾏するか 35 • on_init はkotlin-lsp起動の初期段階である initialize レスポンス直後 ‐ 編集中に使⽤されるインデックスの構築前に呼ばれる。 • このタイミングで workspace folder を追加することで、 サーバーが最初のスキャンから全ソースを認識できるようになる ‐ 図解は次ページへ

Slide 36

Slide 36 text

Neovimの設定例 36

Slide 37

Slide 37 text

Neovimの設定例 この設定による効果とまとめ 37 • workspace folder 追加により得られる改善: ‐ Before: 別プロジェクトへの定義ジャンプ時にインデックス作成と読み込み ‐ After: 起動初回の読み込みで完結し、⾼速に定義ジャンプ可能 • 読み込み時間はプロジェクト数に依存 • まとめ ‐ kotlin-lsp v262.2310.0 はめっちゃ良いぞ!! ‐ いっぱい設定できると学びと効率化が得られるぞ!! ‐ Gradle composite build + LSP の組み合わせでは workspace folder の動的追加は効果的 • kotlin-lsp 固有ではなく、workspace folders 対応の LSP サーバー全般に適⽤可能 ‐ 詳しい設定は私のdotfilesを⾒てください! • https://github.com/yasunori0418/dotfiles

Slide 38

Slide 38 text

38