return { { 'williamboman/mason.nvim', dependencies = { 'williamboman/mason-lspconfig.nvim', }, config = function() -- adding cmp_nvim_lsp capabilities to lspconfig should be done before -- any language server configuration local lspconfig_defaults = require('lspconfig').util.default_config lspconfig_defaults.capabilities = vim.tbl_deep_extend( 'force', lspconfig_defaults.capabilities, require('cmp_nvim_lsp').default_capabilities() ) -- enable features if there is a language server active on the file vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function(event) local opts = {buffer = event.buf} vim.keymap.set('n', 'K', 'lua vim.lsp.buf.hover()', { buffer = event.buf, desc = '[K]nowledge' }) vim.keymap.set('n', 'gd', 'lua vim.lsp.buf.definition()', { buffer = event.buf, desc = '[G]o to [d]efinition' }) vim.keymap.set('n', 'gD', 'lua vim.lsp.buf.declaration()', { buffer = event.buf, desc = '[G]o to [D]eclaration' }) vim.keymap.set('n', 'gi', 'lua vim.lsp.buf.implementation()', { buffer = event.buf, desc = '[G]o to [i]mplementation' }) vim.keymap.set('n', 'gT', 'lua vim.lsp.buf.type_definition()', { buffer = event.buf, desc = '[G]o to [T]ype definition' }) vim.keymap.set('n', 'gr', 'lua vim.lsp.buf.references()', { buffer = event.buf, desc = '[G]o to [r]eferences' }) vim.keymap.set('n', 'gs', 'lua vim.lsp.buf.signature_help()', { buffer = event.buf, desc = '[G]o to [S]ignature Help' }) vim.keymap.set('n', '', 'lua vim.lsp.buf.rename()', opts) vim.keymap.set({'n', 'x'}, '', 'lua vim.lsp.buf.format({async = true})', opts) vim.keymap.set('n', '', 'lua vim.lsp.buf.code_action()', opts) end, }) local servers = require('configs.lsp-servers') local ensure_installed = vim.tbl_keys(servers or {}) require('mason').setup({}) require('mason-lspconfig').setup({ ensure_installed = ensure_installed, handlers = { function(server_name) local server = servers[server_name] or {} server.capabilities = vim.tbl_deep_extend( 'force', {}, lspconfig_defaults.capabilities, server.capabilities or {} ) require('lspconfig')[server_name].setup({}) end, } }) local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, }, mapping = cmp.mapping.preset.insert({ -- Navigate between completion items [''] = cmp.mapping.select_prev_item({behavior = 'select'}), [''] = cmp.mapping.select_next_item({behavior = 'select'}), -- `Enter` key to confirm completion [''] = cmp.mapping.confirm({select = false}), -- Ctrl+Space to trigger completion menu [''] = cmp.mapping.complete(), -- Scroll up and down in the completion documentation [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), }), snippet = { expand = function(args) vim.snippet.expand(args.body) end, }, }) end, }, { 'neovim/nvim-lspconfig' }, { 'hrsh7th/cmp-nvim-lsp' }, { 'hrsh7th/nvim-cmp' }, }