-- note: diagnostics are not exclusive to lsp servers -- so these can be global keybindings vim.keymap.set('n', 'gl', 'lua vim.diagnostic.open_float()') vim.keymap.set('n', '[d', 'lua vim.diagnostic.goto_prev()') vim.keymap.set('n', ']d', 'lua vim.diagnostic.goto_next()') vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function(event) local opts = {buffer = event.buf} -- these will be buffer-local keybindings -- because they only work if you have an active language server vim.keymap.set('n', 'mh', 'lua vim.lsp.buf.hover()', opts) vim.keymap.set('n', 'mgd', 'lua vim.lsp.buf.definition()', opts) vim.keymap.set('n', 'mgD', 'lua vim.lsp.buf.declaration()', opts) vim.keymap.set('n', 'mgi', 'lua vim.lsp.buf.implementation()', opts) vim.keymap.set('n', 'mgo', 'lua vim.lsp.buf.type_definition()', opts) vim.keymap.set('n', 'mgr', 'lua vim.lsp.buf.references()', opts) vim.keymap.set('n', 'mgs', 'lua vim.lsp.buf.signature_help()', opts) vim.keymap.set('n', 'mr', 'lua vim.lsp.buf.rename()', opts) vim.keymap.set({'n', 'x'}, 'mf', 'lua vim.lsp.buf.format({async = true})', opts) vim.keymap.set('n', 'ma', 'lua vim.lsp.buf.code_action()', opts) end }) local lsp_capabilities = require('cmp_nvim_lsp').default_capabilities() local default_setup = function(server) require('lspconfig')[server].setup({ capabilities = lsp_capabilities, }) end require('mason').setup({}) require('mason-lspconfig').setup({ ensure_installed = {}, handlers = { default_setup, }, }) local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, }, mapping = cmp.mapping.preset.insert({ -- Enter key confirms completion item [''] = cmp.mapping.confirm({select = false}), -- Ctrl + space triggers completion menu [''] = cmp.mapping.complete(), }), snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) end, }, })