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 = { 'kind', 'abbr', 'menu' }, format = function(_, vim_item) vim_item.kind = string.format('%s', kind_icons[vim_item.kind]) return vim_item end, }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, duplicates = { nvim_lsp = 1, luasnip = 1, cmp_tabnine = 1, buffer = 1, path = 1, }, confirm_opts = { behavior = cmp.ConfirmBehavior.Replace, select = false, }, window = { documentation = cmp.config.window.bordered(), }, -- documentation = { -- border = { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, -- }, experimental = { ghost_text = false, native_menu = false, }, completion = { keyword_length = 1, }, sources = { { name = 'nvim_lsp' }, --{ name = "luasnip" }, { name = 'buffer' }, { 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