local status_ok, lspconfig = pcall(require, "lspconfig") if not status_ok then return end local function lsp_keymaps(bufnr) local map = function(m, lhs, rhs) local opts = {remap = false, silent = true, buffer = bufnr} vim.keymap.set(m, lhs, rhs, opts) end -- 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', 'go', 'lua vim.lsp.buf.type_definition()') map('n', 'gr', 'lua vim.lsp.buf.references()') map('n', '', 'lua vim.lsp.buf.signature_help()') map('n', '', 'lua vim.lsp.buf.rename()') map('n', '', 'lua vim.lsp.buf.code_action()') -- Diagnostics map('n', '', 'lua vim.diagnostic.open_float()') map('n', '[d', 'lua vim.diagnostic.goto_prev()') map('n', ']d', 'lua vim.diagnostic.goto_next()') end local function set_lsp_sign(name, text) vim.fn.sign_define(name, {text = text, texthl = name}) end set_lsp_sign("DiagnosticSignError", "x") set_lsp_sign("DiagnosticSignWarn" , "!") set_lsp_sign("DiagnosticSignInfo" , "i") set_lsp_sign("DiagnosticSignHint" , "h") local function lsp_settings() local sign = function(opts) vim.fn.sign_define(opts.name, { texthl = opts.name, text = opts.text, numhl = '' }) end vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = false, underline = true, severity_sort = true, float = { focusable = false, show_header = true, style = 'minimal', border = 'shadow', source = 'always', header = '', prefix = '* ', }, }) 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'} ) local command = vim.api.nvim_create_user_command command('LspWorkspaceAdd', function() vim.lsp.buf.add_workspace_folder() end, {desc = 'Add folder to workspace'}) command('LspWorkspaceList', function() vim.notify(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, {desc = 'List workspace folders'}) command('LspWorkspaceRemove', function() vim.lsp.buf.remove_workspace_folder() end, {desc = 'Remove folder from workspace'}) end local function lsp_attach(client, bufnr) local buf_command = vim.api.nvim_buf_create_user_command lsp_keymaps(bufnr) buf_command(bufnr, 'LspFormat', function() vim.lsp.buf.format() end, {desc = 'Format buffer with language server'}) end lsp_settings() 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, capabilities = require('cmp_nvim_lsp').default_capabilities(), }) end