local M = {} function M.config() local cmp_status_ok, cmp = pcall(require, 'cmp') if not cmp_status_ok then return end local snip_status_ok, luasnip = pcall(require, 'luasnip') if not snip_status_ok then return end local check_backspace = function() local col = vim.fn.col('.') - 1 return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') end 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 = '', } cmp.setup({ formatting = { fields = { 'menu', 'kind', 'abbr' }, format = function(entry, item) local menu_icons = { nvim_lsp = 'λ', buffer = 'Ω', path = '🖫', } item.menu = menu_icons[entry.source.name] item.kind = kind_icons[item.kind] return item end, }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, confirm_opts = { behavior = cmp.ConfirmBehavior.Replace, select = false, }, experimental = { ghost_text = false, }, window = { completion = { scrolloff = 1, }, }, preselect = cmp.PreselectMode.None, completion = { keyword_length = 1, }, sources = { { name = 'nvim_lsp', group_index = 1 }, --{ name = "luasnip" }, { name = 'buffer', group_index = 2 }, { name = 'path' }, }, mapping = { [''] = cmp.mapping.select_prev_item(), [''] = cmp.mapping.select_next_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, [''] = cmp.mapping({ i = cmp.mapping.abort(), c = cmp.mapping.close(), }), [''] = cmp.mapping.confirm({ select = false }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expandable() then luasnip.expand() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif check_backspace() then fallback() else fallback() end end, { 'i', 's', }), [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's', }), }, }) end return M