require("mason").setup() require("mason-lspconfig").setup({ ensure_installed = { "clangd", "tsserver", "gopls" }, }) local cmp = require("cmp") cmp.setup({ completion = { autocomplete = false, }, snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, sources = cmp.config.sources({ { name = "nvim_lsp", entry_filter = function(entry, ctx) if entry:get_kind() == 15 then -- Snippet return false end return true end, }, }), mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping.abort(), [""] = cmp.mapping.complete(), }) }) local lsp_capabilities = require("cmp_nvim_lsp").default_capabilities() lsp_capabilities.textDocument.completion.completionItem.snippetSupport = false local lsp_on_attach = function(client, b) local nmap = function(keys, func, desc) vim.keymap.set("n", keys, func, { buffer = b, desc = desc }) end nmap("", vim.lsp.buf.rename, "Rename symbol") nmap("ca", vim.lsp.buf.code_action, "Code action") nmap("", vim.lsp.buf.definition, "Go to definition") nmap("", function() vim.cmd("sp") vim.lsp.buf.definition() end, "Go to definition") nmap("fr", require("telescope.builtin").lsp_references, "Find references") nmap("", require("telescope.builtin").lsp_document_symbols, "Find document symbols") nmap("", vim.lsp.buf.hover, "Signature help") end local lspconfig = require("lspconfig") require("mason-lspconfig").setup_handlers({ function (server_name) lspconfig[server_name].setup({ on_attach = lsp_on_attach, capabilities = lsp_capabilities, }) end, ["clangd"] = function() lspconfig.clangd.setup({ on_attach = lsp_on_attach, capabilities = lsp_capabilities, filetypes = { "c", "cpp" }, cmd = { "C:\\Program Files\\LLVM\\bin\\clangd.exe" }, }) end, ["tsserver"] = function() lspconfig.tsserver.setup({ on_attach = lsp_on_attach, capabilities = lsp_capabilities, }) end, ["gopls"] = function() lspconfig.gopls.setup({ on_attach = lsp_on_attach, capabilities = lsp_capabilities, cmd = { "gopls.exe" }, }) end })