local status_ok, lspconfig = pcall(require, "lspconfig") if not status_ok then return end -- configure lsp when attached local function lsp_attach(client, bufnr) -- helper functions local function set_lsp_sign(name, text) vim.fn.sign_define(name, { text = text, texthl = name }) end local function map(m, lhs, rhs) local opts = { remap = false, silent = true, buffer = bufnr } vim.keymap.set(m, lhs, rhs, opts) end set_lsp_sign("DiagnosticSignError", "x") set_lsp_sign("DiagnosticSignWarn" , "!") set_lsp_sign("DiagnosticSignInfo" , "i") set_lsp_sign("DiagnosticSignHint" , "h") -- LSP actions map('n', 'K', 'lua vim.lsp.buf.hover()') map('n', 'gD', 'lua vim.lsp.buf.definition()') -- map('n', 'gD', 'lua vim.lsp.buf.declaration()') map('n', 'gI', 'lua vim.lsp.buf.implementation()') map('n', 'gY', 'lua vim.lsp.buf.type_definition()') map('n', 'gR', 'lua vim.lsp.buf.references()') map('n', '', 'lua vim.lsp.buf.signature_help()') map('n', 'lr', 'lua vim.lsp.buf.rename()') map('n', '', 'lua vim.lsp.buf.rename()') map('n', '', 'lua vim.lsp.buf.code_action()') -- Diagnostics map('n', '[d', 'lua vim.diagnostic.goto_prev()') map('n', ']d', 'lua vim.diagnostic.goto_next()') vim.api.nvim_buf_create_user_command(bufnr, 'LspFormat', function() vim.lsp.buf.format() end, {desc = 'Format buffer with language server'}) vim.api.nvim_buf_create_user_command('LspWorkspaceAdd', function() vim.lsp.buf.add_workspace_folder() end, { desc = 'Add folder to workspace' }) vim.api.nvim_buf_create_user_command('LspWorkspaceList', function() vim.notify(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, { desc = 'List workspace folders' }) vim.api.nvim_buf_create_user_command('LspWorkspaceRemove', function() vim.lsp.buf.remove_workspace_folder() end, { desc = 'Remove folder from workspace' }) end vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = false, underline = true, severity_sort = true, }) vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'shadow', }) vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with( vim.lsp.handlers.signature_help, { border = 'shadow' }) -- get servers and attach to them local status_ok1, mason = pcall(require, "mason") if not status_ok1 then return end mason.setup {} local status_ok2, masonlspconfig = pcall(require, "mason-lspconfig") if not status_ok2 then return end masonlspconfig.setup {} masonlspconfig.setup_handlers { function (server_name) lspconfig[server_name].setup { on_attach = lsp_attach } end, -- specific servers can be setup as follows: -- ["rust_analyzer"] = function () -- require("rust-tools").setup {} -- end -- check out :help mason-lspconfig for more info }