return { { "neovim/nvim-lspconfig", dependencies = { "hrsh7th/cmp-nvim-lsp", }, event = { "BufReadPre", "BufNewFile" }, config = function() local lspconfig = require("lspconfig") local capabilities = require("cmp_nvim_lsp").default_capabilities() local common = { capabilities = capabilities, } local lsps = { "gopls", "lua_ls", "pylsp", } for _, lsp in ipairs(lsps) do lspconfig[lsp].setup(common) end local wk = require("which-key") wk.register({ ["[d"] = { vim.diagnostic.goto_prev, "Previous diagnostic" }, ["]d"] = { vim.diagnostic.goto_next, "Next diagnostic" }, }) vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup("UserLspConfig", {}), callback = function(ev) wk.register({ gD = { vim.lsp.buf.declaration, "Go to declaration" }, gd = { vim.lsp.buf.definition, "Go to definition" }, gr = { vim.lsp.buf.references, "Go to references" }, gi = { vim.lsp.buf.implementation, "Go to implementation" }, K = { vim.lsp.buf.hover, "Show LSP hover info" }, [""] = { vim.lsp.buf.signature_help, "Show signature help" }, ["D"] = { vim.lsp.buf.type_definition, "Type definition" }, ["rn"] = { vim.lsp.buf.rename, "Rename" }, ["ca"] = { vim.lsp.buf.code_action, "Code action" }, ["F"] = { function() vim.lsp.buf.format({ async = true }) end, "Format buffer", }, ["w"] = { name = "+LSP workspace", a = { vim.lsp.buf.add_workspace_folder, "Add workspace folder" }, r = { vim.lsp.buf.remove_workspace_folder, "Remove workspace folder" }, l = { function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, "List workspace folders", }, }, }, {buffer=ev.buf}) end, }) end, }, }