local lspconfig_ok, lspconfig = pcall(require, "lspconfig") if not lspconfig_ok then return end local language_servers = { gopls = {}, -- grammarly = {}, -- marksman = {}, jsonls = {}, tsserver = {}, sumneko_lua = { settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = 'LuaJIT', }, diagnostics = { -- Get the language server to recognize the `vim` global globals = { 'vim' }, }, workspace = { -- Make the server aware of Neovim runtime files library = vim.api.nvim_get_runtime_file("", true), }, -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false, }, }, }, } } -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local bufopts = { noremap = true, silent = true, buffer = bufnr } vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) vim.keymap.set('n', 'od', vim.lsp.buf.hover, bufopts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) vim.keymap.set('n', 'fd', vim.lsp.buf.formatting, bufopts) end local capabilities = vim.lsp.protocol.make_client_capabilities() local cmp_status_ok, cmp = pcall(require, "cmp") if cmp_status_ok then local cmp_nvim_lsp_status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") if cmp_nvim_lsp_status_ok then capabilities = cmp_nvim_lsp.update_capabilities(capabilities) end end for langsvr, settings in pairs(language_servers) do settings["on_attach"] = on_attach settings["capabilities"] = capabilities lspconfig[langsvr].setup(settings) end if not cmp_status_ok then return end local luasnip_status_ok, luasnip = pcall(require, "luasnip") cmp.setup { snippet = { expand = function(args) if luasnip_status_ok then luasnip.lsp_expand(args.body) end end, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip_status_ok and luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip_status_ok and luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }), sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, }, } local null_ls_ok, null_ls = pcall(require, "null_ls") if not null_ls_ok then return end null_ls.setup({ sources = { null_ls.builtins.formatting.stylua, null_ls.builtins.diagnostics.eslint, null_ls.builtins.completion.spell, null_ls.builtins.formatting.goimports, null_ls.builtins.formatting.gofumpt, }, })