## 事象 `~/.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>