diff --git a/lua/lazyvim/plugins/lsp/keymaps.lua b/lua/lazyvim/plugins/lsp/keymaps.lua index d7ed546f..30d43473 100644 --- a/lua/lazyvim/plugins/lsp/keymaps.lua +++ b/lua/lazyvim/plugins/lsp/keymaps.lua @@ -1,52 +1,61 @@ local M = {} -function M.on_attach(client, buffer) - local self = M.new(client, buffer) - - self:map("cd", vim.diagnostic.open_float, { desc = "Line Diagnostics" }) - self:map("cl", "LspInfo", { desc = "Lsp Info" }) - self:map("gd", "Telescope lsp_definitions", { desc = "Goto Definition" }) - self:map("gr", "Telescope lsp_references", { desc = "References" }) - self:map("gD", vim.lsp.buf.declaration, { desc = "Goto Declaration" }) - self:map("gI", "Telescope lsp_implementations", { desc = "Goto Implementation" }) - self:map("gt", "Telescope lsp_type_definitions", { desc = "Goto Type Definition" }) - self:map("K", vim.lsp.buf.hover, { desc = "Hover" }) - self:map("gK", vim.lsp.buf.signature_help, { desc = "Signature Help", has = "signatureHelp" }) - self:map("", vim.lsp.buf.signature_help, { mode = "i", desc = "Signature Help", has = "signatureHelp" }) - self:map("]d", M.diagnostic_goto(true), { desc = "Next Diagnostic" }) - self:map("[d", M.diagnostic_goto(false), { desc = "Prev Diagnostic" }) - self:map("]e", M.diagnostic_goto(true, "ERROR"), { desc = "Next Error" }) - self:map("[e", M.diagnostic_goto(false, "ERROR"), { desc = "Prev Error" }) - self:map("]w", M.diagnostic_goto(true, "WARNING"), { desc = "Next Warning" }) - self:map("[w", M.diagnostic_goto(false, "WARNING"), { desc = "Prev Warning" }) - self:map("ca", vim.lsp.buf.code_action, { desc = "Code Action", mode = { "n", "v" }, has = "codeAction" }) +---@type PluginLspKeys +M._keys = nil +---@return (LazyKeys|{has?:string})[] +function M.get() local format = require("lazyvim.plugins.lsp.format").format - self:map("cf", format, { desc = "Format Document", has = "documentFormatting" }) - self:map("cf", format, { desc = "Format Range", mode = "v", has = "documentRangeFormatting" }) - self:map("cr", M.rename, { expr = true, desc = "Rename", has = "rename" }) + ---@class PluginLspKeys + -- stylua: ignore + M._keys = M._keys or { + { "cd", vim.diagnostic.open_float, desc = "Line Diagnostics" }, + { "cl", "LspInfo", desc = "Lsp Info" }, + { "gd", "Telescope lsp_definitions", desc = "Goto Definition" }, + { "gr", "Telescope lsp_references", desc = "References" }, + { "gD", vim.lsp.buf.declaration, desc = "Goto Declaration" }, + { "gI", "Telescope lsp_implementations", desc = "Goto Implementation" }, + { "gt", "Telescope lsp_type_definitions", desc = "Goto Type Definition" }, + { "K", vim.lsp.buf.hover, desc = "Hover" }, + { "gK", vim.lsp.buf.signature_help, desc = "Signature Help", has = "signatureHelp" }, + { "", vim.lsp.buf.signature_help, mode = "i", desc = "Signature Help", has = "signatureHelp" }, + { "]d", M.diagnostic_goto(true), desc = "Next Diagnostic" }, + { "[d", M.diagnostic_goto(false), desc = "Prev Diagnostic" }, + { "]e", M.diagnostic_goto(true, "ERROR"), desc = "Next Error" }, + { "[e", M.diagnostic_goto(false, "ERROR"), desc = "Prev Error" }, + { "]w", M.diagnostic_goto(true, "WARNING"), desc = "Next Warning" }, + { "[w", M.diagnostic_goto(false, "WARNING"), desc = "Prev Warning" }, + { "ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "v" }, has = "codeAction" }, + { "cf", format, desc = "Format Document", has = "documentFormatting" }, + { "cf", format, desc = "Format Range", mode = "v", has = "documentRangeFormatting" }, + { "cr", M.rename, expr = true, desc = "Rename", has = "rename" }, + } + return M._keys end -function M.new(client, buffer) - return setmetatable({ client = client, buffer = buffer }, { __index = M }) -end +function M.on_attach(client, buffer) + local Keys = require("lazy.core.handler.keys") + local keymaps = {} ---@type table -function M:has(cap) - return self.client.server_capabilities[cap .. "Provider"] -end - -function M:map(lhs, rhs, opts) - opts = opts or {} - if opts.has and not self:has(opts.has) then - return + for _, value in ipairs(M.get()) do + local keys = Keys.parse(value) + if keys[2] == vim.NIL or keys[2] == false then + keymaps[keys.id] = nil + else + keymaps[keys.id] = keys + end + end + + for _, keys in pairs(keymaps) do + if not keys.has or client.server_capabilities[keys.has .. "Provider"] then + local opts = Keys.opts(keys) + ---@diagnostic disable-next-line: no-unknown + opts.has = nil + opts.silent = true + opts.buffer = buffer + vim.keymap.set(keys.mode or "n", keys[1], keys[2], opts) + end end - vim.keymap.set( - opts.mode or "n", - lhs, - type(rhs) == "string" and ("%s"):format(rhs) or rhs, - ---@diagnostic disable-next-line: no-unknown - { silent = true, buffer = self.buffer, expr = opts.expr, desc = opts.desc } - ) end function M.rename()