local lsp = require("lsp-zero") lsp.preset("recommended") local language_servers = { 'tsserver', 'eslint', 'gopls', } local linux_language_servers = { 'sumneko_lua', 'rust_analyzer', 'clangd', } if io.popen("uname"):read("*a") == "Linux" then for key, val in pairs(linux_language_servers) do language_servers[key] = val end end lsp.ensure_installed(language_servers) -- Fix Undefined global 'vim' lsp.configure('sumneko_lua', { settings = { Lua = { diagnostics = { globals = { 'vim' } } } } }) local cmp = require('cmp') local cmp_select = {behavior = cmp.SelectBehavior.Select} local cmp_mappings = lsp.defaults.cmp_mappings({ [''] = cmp.mapping.select_prev_item(cmp_select), [''] = cmp.mapping.select_next_item(cmp_select), [''] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping.complete(), }) -- disable completion with tab -- this helps with copilot setup cmp_mappings[''] = nil cmp_mappings[''] = nil lsp.setup_nvim_cmp({ preselect = 'none', mapping = cmp_mappings, completion = { completeopt = 'menu,menuone,noinsert,noselect' } }) lsp.set_preferences({ suggest_lsp_servers = false, sign_icons = { error = 'E', warn = 'W', hint = 'H', info = 'I' } }) lsp.on_attach(function(client, bufnr) local opts = {buffer = bufnr, remap = false} if client.name == "eslint" then vim.cmd.LspStop('eslint') return end local nmap = function(keys, func, desc) if desc then desc = 'LSP: ' .. desc end vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) end -- goto defintion -- vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) -- hover docs vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') nmap("gr", vim.lsp.buf.references, '[G]oto [R]eferences') nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') -- vim.keymap.set("n", "vws", vim.lsp.buf.workspace_symbol, opts) -- vim.keymap.set("n", "vd", vim.diagnostic.open_float, opts) -- vim.keymap.set("n", "[d", vim.diagnostic.goto_next, opts) -- vim.keymap.set("n", "]d", vim.diagnostic.goto_prev, opts) -- vim.keymap.set("n", "vca", vim.lsp.buf.code_action, opts) -- vim.keymap.set("n", "vrn", vim.lsp.buf.rename, opts) -- vim.keymap.set("i", "", vim.lsp.buf.signature_help, opts) end) lsp.setup() vim.diagnostic.config({ virtual_text = true, })