diff --git a/lua/lazyvim/plugins/lsp/init.lua b/lua/lazyvim/plugins/lsp/init.lua index ffa48d3c..570ec354 100644 --- a/lua/lazyvim/plugins/lsp/init.lua +++ b/lua/lazyvim/plugins/lsp/init.lua @@ -57,6 +57,10 @@ return { jsonls = {}, lua_ls = { -- mason = false, -- set to false if you don't want this server to be installed with mason + -- Use this to add any additional keymaps + -- for specific lsp servers + ---@type LazyKeys[] + -- keys = {}, settings = { Lua = { workspace = { diff --git a/lua/lazyvim/plugins/lsp/keymaps.lua b/lua/lazyvim/plugins/lsp/keymaps.lua index 1a21c398..de691941 100644 --- a/lua/lazyvim/plugins/lsp/keymaps.lua +++ b/lua/lazyvim/plugins/lsp/keymaps.lua @@ -28,8 +28,8 @@ function M.get() { "[e", M.diagnostic_goto(false, "ERROR"), desc = "Prev Error" }, { "]w", M.diagnostic_goto(true, "WARN"), desc = "Next Warning" }, { "[w", M.diagnostic_goto(false, "WARN"), desc = "Prev Warning" }, - { "cf", format, desc = "Format Document", has = "documentFormatting" }, - { "cf", format, desc = "Format Range", mode = "v", has = "documentRangeFormatting" }, + { "cf", format, desc = "Format Document", has = "formatting" }, + { "cf", format, desc = "Format Range", mode = "v", has = "rangeFormatting" }, { "ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "v" }, has = "codeAction" }, { "cA", @@ -65,7 +65,6 @@ function M.get() return M._keys end -function M.on_attach(client, buffer) ---@param method string function M.has(buffer, method) method = method:find("/") and method or "textDocument/" .. method @@ -77,11 +76,13 @@ function M.has(buffer, method) end return false end + +function M.resolve(buffer) local Keys = require("lazy.core.handler.keys") local keymaps = {} ---@type table - for _, value in ipairs(M.get()) do - local keys = Keys.parse(value) + local function add(keymap) + local keys = Keys.parse(keymap) if keys[2] == vim.NIL or keys[2] == false then keymaps[keys.id] = nil else @@ -89,8 +90,23 @@ end end end + local opts = require("lazyvim.util").opts("nvim-lspconfig") + local clients = vim.lsp.get_active_clients({ bufnr = buffer }) + for _, client in ipairs(clients) do + local maps = opts.servers[client.name] and opts.servers[client.name].keys or {} + for _, keymap in ipairs(maps) do + add(keymap) + end + end + return keymaps +end + +function M.on_attach(client, buffer) + local Keys = require("lazy.core.handler.keys") + local keymaps = M.resolve(buffer) + for _, keys in pairs(keymaps) do - if not keys.has or client.server_capabilities[keys.has .. "Provider"] then + if not keys.has or M.has(buffer, keys.has) then local opts = Keys.opts(keys) ---@diagnostic disable-next-line: no-unknown opts.has = nil