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 map = function(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', '<cmd>lua vim.lsp.buf.hover()<cr>') map('n', 'gD', '<cmd>lua vim.lsp.buf.definition()<cr>') -- map('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>') map('n', 'gI', '<cmd>lua vim.lsp.buf.implementation()<cr>') map('n', 'gY', '<cmd>lua vim.lsp.buf.type_definition()<cr>') map('n', 'gR', '<cmd>lua vim.lsp.buf.references()<cr>') map('n', '<S-Tab>', '<cmd>lua vim.lsp.buf.signature_help()<cr>') map('n', '<leader>lr', '<cmd>lua vim.lsp.buf.rename()<cr>') map('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>') -- Diagnostics map('n', '[d', '<cmd>lua vim.diagnostic.goto_prev()<cr>') map('n', ']d', '<cmd>lua vim.diagnostic.goto_next()<cr>') 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 require('mason').setup {} require('mason-lspconfig').setup {} local get_servers = require('mason-lspconfig').get_installed_servers for _, server_name in ipairs(get_servers()) do lspconfig[server_name].setup({ on_attach = lsp_attach, }) end