return { { "neovim/nvim-lspconfig", event = { "BufReadPre", "BufNewFile" }, opts = { servers = {} }, config = function(_, opts) local add_hook_after = require("lspconfig.util").add_hook_after local on_attach = function(client, bufnr) require("nvim-navic").attach(client, bufnr) end for lsp, lsp_opts in pairs(opts.servers) do lsp_opts = lsp_opts or {} if lsp_opts.on_attach ~= nil then lsp_opts["on_attach"] = add_hook_after(on_attach, lsp_opts.on_attach) end lsp_opts["capabilities"] = require("cmp_nvim_lsp").default_capabilities(lsp_opts.capabilities or {}) require("lspconfig")[lsp].setup(lsp_opts) end end, init = function() vim.diagnostic.config({ float = { source = "always", format = function(diagnostic) -- should work for any LSP, see: https://github.com/neovim/neovim/pull/17510 if diagnostic.code then return string.format("(%s) %s", diagnostic.code, diagnostic.message) end return diagnostic.message end, }, }) end, dependencies = { { "SmiteshP/nvim-navic", opts = { highlight = true } }, }, }, }