This repository has been archived on 2025-10-10. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
.nvim/lua/plugins/lsp.lua
2023-10-30 14:45:32 -03:00

136 lines
4.1 KiB
Lua

-- Plugins related to LSP
return { {
'neovim/nvim-lspconfig',
dependencies = {
'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
{ 'j-hui/fidget.nvim', tag = 'legacy', opts = {} },
'folke/neodev.nvim',
},
config = function()
-- Kickstart autoformat on save ---------
local format_is_enabled = true;
vim.api.nvim_create_user_command('KickstartFormatToggle', function()
format_is_enabled = not format_is_enabled;
print('Setting autoformatting to:' .. tostring(format_is_enabled))
end, {});
local _augroups = {};
local get_augroup = function(client)
if not _augroups[client.id] then
local group_name = 'kickstart-lsp-format-' .. client.name;
local id = vim.api.nvim_create_augroup(group_name, { clear = true });
_augroups[client.id] = id
end
return _augroups[client.id];
end
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }),
callback = function(args)
local client_id = args.data.client_id;
local client = vim.lsp.get_client_by_id(client_id);
local bufnr = args.buf;
if not client.server_capabilities.documentFormattingProvider then
return;
end
if client.name == 'tsserver' then
return;
end
vim.api.nvim_create_autocmd('BufWritePre', {
group = get_augroup(client),
buffer = bufnr,
callback = function()
if not format_is_enabled then
return
end
vim.lsp.buf.format({
async = false,
filter = function(c)
return c.id == client.id
end,
});
end,
});
end,
});
-- CONFIGURE LSP
-- Runs on_attach when an LSP connects to a particular buffer
local on_attach = function(_, bufnr)
local nmap = function(keys, func, desc)
if desc then
desc = 'LSP: ' .. desc
end
vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc });
end
nmap('<leader>rn', vim.lsp.buf.rename, '[rn] Rename');
nmap('<leader>ca', vim.lsp.buf.code_action, '[ca] Code Action');
nmap('<leader>gd', require('telescope.builtin').lsp_definitions, '[gd] Goto Definition');
nmap('<leader>gD', require('telescope.builtin').lsp_declaration, '[gD] Goto Declaration');
nmap('<leader>gr', require('telescope.builtin').lsp_references, '[gr] Goto References');
nmap('<leader>gI', require('telescope.builtin').lsp_implementations, '[gI] Goto Implementations');
nmap('<leader>td', require('telescope.builtin').lsp_type_definitions, '[td] Type Definition');
nmap('K', vim.lsp.buf.hover, 'Hover docs');
nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature docs');
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
vim.lsp.buf.format()
end, { desc = 'Format current buffer with LSP' });
end
-- document existing key chains
require('which-key').register({
['<leader>c'] = { name = '[c] Code', _ = 'which_key_ignore' },
['<leader>d'] = { name = '[d] Document', _ = 'which_key_ignore' },
['<leader>g'] = { name = '[g] Git', _ = 'which_key_ignore' },
['<leader>h'] = { name = '[h] More Git', _ = 'which_key_ignore' },
['<leader>r'] = { name = '[r] Rename', _ = 'which_key_ignore' },
['<leader>s'] = { name = '[s] Search', _ = 'which_key_ignore' },
['<leader>w'] = { name = '[w] Workspace', _ = 'which_key_ignore' },
});
require('mason').setup();
require('mason-lspconfig').setup();
local servers = {
lua_ls = {
Lua = {
workspace = { checkThirdParty = false },
telemetry = { enable = false },
}
},
};
-- Neovim lua configuraion
require('neodev').setup()
local capabilities = vim.lsp.protocol.make_client_capabilities();
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities);
local mason_lspconfig = require('mason-lspconfig');
mason_lspconfig.setup({
ensure_installed = vim.tbl_keys(servers),
});
mason_lspconfig.setup_handlers({
function(server_name)
require('lspconfig')[server_name].setup({
capabilities = capabilities,
on_attach = on_attach,
settings = servers[server_name],
filetypes = (servers[server_name] or {}).filetypes,
});
end,
});
end,
} };