🤯

nvim-lspで勝手に立ち上がっているサーバーがあるときはroot_patternが暴発しているかもしれない

2022/08/07に公開

https://twitter.com/kawarimidoll/status/1555403765565771776

Neovim builtin lspを使っていて、nodeプロジェクトでないディレクトリ内で、なぜかtsserverが立ち上がってしまっているという問題が発生しました。
これがroot_patternの仕様によるものだったので、こちらに記録を残しておきます。

Neovim lspの設定には、nvim-lspconfigを使用します。

https://github.com/neovim/nvim-lspconfig

root_patternの実装はlua/lspconfig/util.luaにあります。
内部で実装されているsearch_ancestorsを使って親ディレクトリへ辿っていき、引数として渡されたファイル・ディレクトリが見つかれば、その階層をルートとして返します(実際はこの動作をする関数を返します)。

筆者はtsserverの設定でroot_pattern("package.json", "node_modules")としていたのですが、いつの間にかホームディレクトリにnode_modulesが作られてしまっていました(過去にyarnの設定をガチャガチャいじっていたためだと思われます)。
この結果、ホーム以下のディレクトリでNeovimを起動した場合、必ず先祖にnode_modulesが見つかることになり、tsserverが起動してしまっていました。

ということで、もし勝手に立ち上がっているサーバーがあるときは、自分のlspの設定および各サーバーのデフォルトの設定を確認し、root_patternが意図せず有効になっていないかチェックしてみてください。
同様の問題にぶつかる例はほぼないかもしれませんが、何かの参考になれば幸いです。

Discussion