-- Setup autocomplete/LSP clients local lspconfig = require('lspconfig') local lsp_capabilities = require('cmp_nvim_lsp').default_capabilities() local servers = {"clangd", "zls", "rust_analyzer", "lua_ls"} for _, lsp in pairs(servers) do lspconfig[lsp].setup { capabilities = lsp_capabilities, on_attach = onattach, flags = {debounce_text_changes = 500} } end vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function() local bufmap = function(mode, lhs, rhs) local opts = {buffer = true} vim.keymap.set(mode, lhs, rhs, opts) end bufmap('n', 'K', 'lua vim.lsp.buf.hover()') bufmap('n', 'gd', 'lua vim.lsp.buf.definition()') bufmap('n', 'gD', 'lua vim.lsp.buf.declaration()') bufmap('n', 'gi', 'lua vim.lsp.buf.implementation()') bufmap('n', 'go', 'lua vim.lsp.buf.type_definition()') bufmap('n', 'gr', 'lua vim.lsp.buf.references()') bufmap('n', 'gs', 'lua vim.lsp.buf.signature_help()') bufmap('n', '', 'lua vim.lsp.buf.rename()') bufmap('n', '', 'lua vim.lsp.buf.code_action()') bufmap('n', 'gl', 'lua vim.diagnostic.open_float()') bufmap('n', '[d', 'lua vim.diagnostic.goto_prev()') bufmap('n', ']d', 'lua vim.diagnostic.goto_next()') end }) require('luasnip.loaders.from_vscode').lazy_load() local cmp = require('cmp') local luasnip = require('luasnip') local select_opts = {behavior = cmp.SelectBehavior.Select} cmp.setup({ formatting = { fields = {'menu', 'abbr', 'kind'}, format = function(entry, item) local menu_icon = { nvim_lsp = 'λ', luasnip = '⋗', buffer = 'Ω', path = '🖫', } item.menu = menu_icon[entry.source.name] return item end, }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end }, sources = { {name = 'path'}, {name = 'nvim_lsp', keyword_length = 1}, {name = 'buffer', keyword_length = 3}, {name = 'luasnip', keyword_length = 2}, }, mapping = { [''] = cmp.mapping.select_prev_item(select_opts), [''] = cmp.mapping.select_next_item(select_opts), [''] = cmp.mapping.select_prev_item(select_opts), [''] = cmp.mapping.select_next_item(select_opts), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({select = true}), [''] = cmp.mapping.confirm({select = false}), }, })