vim.opt.completeopt = "menu,menuone,noselect" local constants = require("constants") -- Setup lspconfig. require'lspconfig'.clangd.setup{} require'lspconfig'.pylsp.setup{} local cmp = require'cmp' local kind_icons = { Text = "", Method = "", Function = "󰊕", Constructor = "", Field = "", Variable = "󰫧", Class = "", Interface = "", Module = "", Property = "", Unit = "", Value = "", Enum = "", Keyword = "", Snippet = "", Color = "", File = "", Reference = "", Folder = "", EnumMember = "", Constant = "", Struct = "", Event = "", Operator = "", TypeParameter = "", } -- The key mapping for the cmd. local cmd_mapping = { [''] = { c = function() if cmp.visible() then cmp.select_next_item() else feedkeys.call(keymap.t(''), 'n') end end }, [''] = { c = function() if cmp.visible() then cmp.select_prev_item() else feedkeys.call(keymap.t(''), 'n') end end }, [constants.next_key] = { c = function(fallback) if cmp.visible() then cmp.select_next_item() else fallback() end end }, [constants.previous_key] = { c = function(fallback) if cmp.visible() then cmp.select_prev_item() else fallback() end end }, [constants.close_key] = { c = cmp.mapping.close(), } } -- Setup time!!!! cmp.setup({ snippet = { -- REQUIRED - you must specify a snippet engine expand = function(args) require('luasnip').lsp_expand(args.body) -- For `luasnip` usersc; end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, mapping = { [constants.next_key] = cmp.mapping.select_next_item(), [constants.previous_key] = cmp.mapping.select_prev_item(), [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. [constants.close_key] = cmp.mapping { i = cmp.mapping.abort(), c = cmp.mapping.close(), }, -- Accept currently selected item. If none selected, `select` first item. -- Set `select` to `false` to only confirm explicitly selected items. [""] = cmp.mapping.confirm { select = true }, }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) -- Kind icons vim_item.kind = string.format("%s", kind_icons[vim_item.kind]) -- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind vim_item.menu = ({ nvim_lsp = "[LSP]", luasnip = "[Snippet]", buffer = "[Buffer]", path = "[Path]", nvim_lua = "[nvim_lua]", })[entry.source.name] return vim_item end, }, sources = { { name = 'nvim_lsp' }, { name = 'nvim_lua' }, { name = 'luasnip' }, -- For luasnip users. { name = 'path' }, { name = 'buffer' }, }, }) -- Set configuration for specific filetype. cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'cmp_git' }, -- You can specify the `cmp_git` source if you were installed it. }, { { name = 'buffer' }, }) }) -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline('/', { mapping = cmd_mapping, sources = { { name = 'buffer' } } }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(':', { mapping = cmd_mapping, sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) -- Setup lspconfig. local capabilities = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities()) local lspconfig = require('lspconfig') -- Attaching navic. local navic = require("nvim-navic") local on_attach = function(client, bufnr) if client.server_capabilities.documentSymbolProvider then navic.attach(client, bufnr) end end -- C++/C. lspconfig['clangd'].setup { capabilities = capabilities, on_attach = on_attach } -- Python lspconfig['pylsp'].setup { capabilities = capabilities, on_attach = on_attach }