local lspconfig_ok, lspconfig = pcall(require, "lspconfig") if not lspconfig_ok then return end -- 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 language_servers = { gopls = { -- capabilities = { -- document_formatting = false, -- document_range_formatting = false, -- } -- on_attach = function(client, bufnr) -- on_attach(client, bufnr) -- client.resolved_capabilities.document_formatting = false -- client.resolved_capabilities.document_range_formatting = false -- end }, -- 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', 'root', 'client', 'awesome', 'screen', 'mouse', 'keyboardgrabber', 'mousegrabber' }, }, 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, }, }, }, } } 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 = vim.tbl_deep_extend("keep", settings, { on_attach = on_attach, capabilities = capabilities, }) lspconfig[langsvr].setup(settings) end local luasnip_status_ok, luasnip = pcall(require, "luasnip") if cmp_status_ok and luasnip_status_ok then 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' }, }, } end -- local null_ls_ok, null_ls = pcall(require, "null-ls") -- if null_ls_ok then -- 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, -- }, -- }) -- end