## 事象
`~/.config/nvim/lsp` 配下に[[LSP]]の[[Lua]]ファイルを作成する。
```
lsp
├── denols.lua
└── yamlls.lua
```
`denols.lua`
```lua
return {
root_markers = { "deno.json", "deno.jsonc", "hoge.hoge" },
}
```
しかし、この `root_markers` が適応されない。`:checkhealth lsp` の結果は以下のようになる。
```
- denols:
- capabilities: {
textDocument = {
completion = {
completionItem = {
commitCharactersSupport = false,
deprecatedSupport = true,
documentationFormat = { "markdown", "plaintext" },
insertReplaceSupport = true,
insertTextModeSupport = {
valueSet = { 1 }
},
labelDetailsSupport = true,
preselectSupport = false,
resolveSupport = {
properties = { "documentation", "detail", "additionalTextEdits", "command", "data" }
},
snippetSupport = true,
tagSupport = {
valueSet = { 1 }
}
},
completionList = {
itemDefaults = { "commitCharacters", "editRange", "insertTextFormat", "insertTextMode", "data" }
},
contextSupport = true,
insertTextMode = 1
}
}
}
- cmd: { "deno", "lsp" }
- cmd_env: {
NO_COLOR = true
}
- filetypes: javascript, javascriptreact, javascript.jsx, typescript, typescriptreact, typescript.tsx
- handlers: {
["textDocument/definition"] = <function 1>,
["textDocument/references"] = <function 1>,
["textDocument/typeDefinition"] = <function 1>
}
- on_attach: <function @/home/tadashi-aikawa/.local/share/nvim/lazy/nvim-lspconfig/lsp/denols.lua:95>
- root_markers: deno.json, deno.jsonc, .git
- settings: {
deno = {
enable = true,
suggest = {
imports = {
hosts = {
["https://deno.land"] = true
}
}
}
}
}
```
` - root_markers: deno.json, deno.jsonc, .git` となっていることから、[[nvim-lspconfig]]の設定が優先されている。
[[nvim-lspconfig]]の設定ファイルは以下。
```lua
return {
"neovim/nvim-lspconfig",
lazy = false,
}
```
[[lazy.nvim]]の設定初期化後は `vim.lsp.enable` も実行している。
```lua
vim.lsp.enable({
"denols",
"yamlls",
})
```
### 環境
| 対象 | バージョン |
| ------------------ | ----------- |
| [[Ubuntu]] | 24.04.1 LTS |
| [[Neovim]] | 0.11.0 |
| [[nvim-lspconfig]] | `2e74354` |
## 原因
`runtimepath` の順番で `~/.config/nvim` よりも `~/.local/share/nvim/lazy/nvim-lspconfig` が後になっていたから。
`set runtimepath?` の結果。
```
23:11:36 msg_show.list_cmd set runtimepath? runtimepath=~/.config/nvim,~/.local/share/nvim/lazy/lazy.nvim,~/.local/share/nvim/lazy/lspsaga.nvim,~/.local/share/nvim/lazy/fidget.nvim,~/.local/share/nvim/lazy/timber.nvim,~/.local/share/nvim/lazy/tiny-inline-diagnostic.nvim,~/.local/share/nvim/lazy/nvim-highlight-colors,~/.local/share/nvim/lazy/Comment.nvim,~/.local/share/nvim/lazy/nvim-treesitter-context,~/.local/share/nvim/lazy/gitsigns.nvim,~/.local/share/nvim/lazy/plenary.nvim,~/.local/share/nvim/lazy/todo-comments.nvim,~/.local/share/nvim/lazy/lualine.nvim,~/.local/share/nvim/lazy/vim-textobj-entire,~/.local/share/nvim/lazy/schemastore.nvim,~/.local/share/nvim/lazy/lsp_signature.nvim,~/.local/share/nvim/lazy/nvim-autopairs,~/.local/share/nvim/lazy/blink.compat,~/.local/share/nvim/lazy/LuaSnip,~/.local/share/nvim/lazy/blink.cmp,~/.local/share/nvim/lazy/copilot.lua,~/.local/share/nvim/lazy/mini.icons,~/.local/share/nvim/lazy/nvim-web-devicons,~/.local/share/nvim/lazy/barbar.nvim,~/.local/share/nvim/lazy/no-neck-pain.nvim,~/.local/share/nvim/lazy/nvim-treesitter,~/.local/share/nvim/lazy/vim-illuminate,~/.local/share/nvim/lazy/conform.nvim,~/.local/share/nvim/lazy/flash.nvim,~/.local/share/nvim/lazy/CamelCaseMotion,~/.local/share/nvim/lazy/promise-async,~/.local/share/nvim/lazy/nvim-ufo,~/.local/share/nvim/lazy/nvim-hlslens,~/.local/share/nvim/lazy/nvim-notify,~/.local/share/nvim/lazy/nui.nvim,~/.local/share/nvim/lazy/noice.nvim,~/.local/share/nvim/lazy/nvim-scrollbar,~/.local/share/nvim/lazy/nvim-surround,~/.local/share/nvim/lazy/ns-textobject.nvim,~/.local/share/nvim/lazy/vim-repeat,~/.local/share/nvim/lazy/nvim-lspconfig,~/.local/share/nvim/lazy/vim-textobj-user,~/.local/share/nvim/lazy/tokyonight.nvim,~/.local/share/nvim/lazy/snacks.nvim,~/.local/share/mise/installs/neovim/0.11.0/nvim-linux-x86_64/share/nvim/runtime,~/.local/share/mise/installs/neovim/0.11.0/nvim-linux-x86_64/share/nvim/runtime/pack/dist/opt/netrw,~/.local/share/mise/installs/neovim/0.11.0/nvim-linux-x86_64/share/nvim/runtime/pack/dist/opt/matchit,~/.local/share/mise/installs/neovim/0.11.0/nvim-linux-x86_64/lib/nvim,~/.local/state/nvim/lazy/readme
```
[Neovimのコード](https://github.com/neovim/neovim/blob/a167800f1cbeda5b4d7540ec23a55fa40c72dfb7/runtime/lua/vim/lsp.lua#L417) では `runtimepath` 配下の `lsp/*.lua` を取得している。
`neovim/runtime/lua/vim/lsp.lua`
```lua
local rtp_config --- @type vim.lsp.Config?
for _, v in ipairs(api.nvim_get_runtime_file(('lsp/%s.lua'):format(name), true)) do
local config = assert(loadfile(v))() ---@type any?
if type(config) == 'table' then
--- @type vim.lsp.Config?
rtp_config = vim.tbl_deep_extend('force', rtp_config or {}, config)
else
log.warn(('%s does not return a table, ignoring'):format(v))
end
end
```
`api.nvim_get_runtime_file` は恐らく `runtimepath` の順番で取得されるため
1. `~/.config/nvim/lsp/*.lua`
2. `~/.local/share/nvim/lazy/nvim-lspconfig`
の順番で [[vim.tbl_deep_extend]] が実行されるため、**同一項目は常に[[nvim-lspconfig]]の設定で上書きされてしまう**。
## 解決方法
`~/.config/nvim/lsp` から `~/.config/nvim/after/lua` に LSP関連のファイルを移動する。こうすることで、`runtimepath` の末尾に `~/.config/nvim/after` が追加されるので、[[nvim-lspconfig]]の設定よりも優先される。
> [!attention]
> `~/.config/nvim/after` ディレクトリが存在しないと `runtimepath` には追加されない。
[[Bluesky]]で教えていただいた。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://web-cdn.bsky.app/static/favicon-32x32.png" />
<span class="link-card-v2-site-name">Bluesky Social</span>
</div>
<div class="link-card-v2-title">
yuys13 (@yuys13.bsky.social)
</div>
<div class="link-card-v2-content">
:h 'runtimepath'を見るのが早いと思いますが、~/.config/nvim/afterがあればruntimepathの後ろの方に追加されます。nvim-lspconfigを適用して自分の設定で上書きしたい場合は~/.config/nvim/after/lspディレクトリを使えば自分でruntimepathを弄る必要はありません
</div>
<a href="https://bsky.app/profile/yuys13.bsky.social/post/3lnsi3ddjbc2z"></a>
</div>
[[lazy.nvim]]の設定。
```lua
return {
"neovim/nvim-lspconfig",
lazy = false,
}
```
## 参考
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://www.redditstatic.com/shreddit/assets/favicon/64x64.png" />
<span class="link-card-v2-site-name">www.reddit.com</span>
</div>
<div class="link-card-v2-title">
Reddit - The heart of the internet
</div>
<a href="https://www.reddit.com/r/neovim/comments/1jxv6c0/nvimlspconfig_has_now_migrated_to_use_the_new/?rdt=64185"></a>
</div>
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://static.zenn.studio/images/logo-transparent.png" />
<span class="link-card-v2-site-name">Zenn</span>
</div>
<div class="link-card-v2-title">
Neovim0.11用のLSP設定
</div>
<img class="link-card-v2-image" src="https://res.cloudinary.com/zenn/image/upload/s--cMNw-wyT--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_66:Neovim0.11%25E7%2594%25A8%25E3%2581%25AELSP%25E8%25A8%25AD%25E5%25AE%259A%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:kawarimidoll%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzIzNzlhYzhkODYuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png" />
<a href="https://zenn.dev/kawarimidoll/articles/b202e546bca344"></a>
</div>