vim.opt.completeopt = { 'menu', 'menuone', 'noselect' } vim.opt.shortmess:append('c') vim.opt.pumheight = 20 -- max height of completion window -- re-link the highlight group for the 3rd field in the completion popup -- which is populated with the completion source vim.schedule(function() local hl = vim.api.nvim_set_hl hl(0, 'CmpItemMenu', { link = 'Comment', force = true }) hl(0, 'CmpItemAbbrMatch', { bold = true, force = true }) hl(0, 'CmpItemAbbrMatchFuzzy', { link = 'CmpItemAbbrMatch', force = true }) hl(0, 'CmpItemKindVariable', { link = 'Normal', force = true }) hl(0, 'CmpItemKindInterface', { link = 'CmpItemKindVariable', force = true }) hl(0, 'CmpItemKindText', { link = 'CmpItemKindVariable', force = true }) hl(0, 'CmpItemKindFunction', { link = 'Function', force = true }) hl(0, 'CmpItemKindMethod', { link = 'CmpItemKindFunction', force = true }) hl(0, 'CmpItemKindKeyword', { link = 'Keyword', force = true }) hl(0, 'CmpItemKindProperty', { link = 'CmpItemKindKeyword', force = true }) hl(0, 'CmpItemKindUnit', { link = 'CmpItemKindKeyword', force = true }) end) local cmp = require('cmp') cmp.setup({ sources = { { name = 'nvim_lsp', keyword_length = 1, group_index = 1 }, { name = 'nvim_lsp_signature_help', keyword_length = 1, group_index = 1 }, { name = 'luasnip', keyword_length = 2, group_index = 1 }, -- { name = 'spell' }, { name = 'async_path', group_index = 2 }, { name = 'buffer', keyword_length = 3, group_index = 2 }, }, mapping = { [''] = cmp.mapping( cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), { 'i', 'c' } ), [''] = cmp.mapping( cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), { 'i', 'c' } ), [''] = cmp.mapping( cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = true, }), { 'i', 'c' } ), }, -- enable snippet expansion snippet = { expand = function(args) vim.snippet.expand(args.body) end, }, experimental = { ghost_text = false, native_menu = false, }, window = { completion = { scrollbar = true, -- align 'abbr' with cursor, necessary due to 'kind' appearing first col_offset = -3, }, }, formatting = { fields = { 'kind', 'abbr', 'menu' }, expandable_indicator = true, format = function(entry, item) item.dup = 0 -- dedup items from the same source, first one wins item.menu = '░ ' .. entry.source.name return require('lspkind').cmp_format({ mode = 'symbol', symbol_map = { -- 󰆼 󱆃 Array = '󰨾 ', Boolean = '󰦍 ', Class = '󰙀 ', Color = '󰉦 ', Constant = '󰐀 ', Constructor = '󱇿 ', Enum = '󱃢 ', EnumMember = '󱃡 ', Event = '󱐋 ', -- Field = '󰽜 ', Field = '󰆈 ', File = '󰈔 ', Folder = '󰝰 ', Function = '󰊕 ', Interface = '󱦜 ', Key = '󰌋 ', Keyword = '󰓽 ', Method = '󰒓 ', Module = '󰏖 ', Namespace = '󰆧 ', Null = '󰎣 ', Object = '󰘦 ', Operator = '󱓉 ', Property = '󰐱 ', Package = '󰏗 ', Reference = '󰌹 ', Snippet = '󰯁 ', Struct = '󰙅 ', Text = '󰉿 ', TypeParameter = '󰌨 ', Unit = '󰠱 ', Value = '󰎠 ', Variable = '󱄑 ', }, })(entry, item) end, }, }) cmp.setup.cmdline({ ':', '/', '?', '@' }, { sources = { { name = 'cmdline', group_index = 1 }, { name = 'cmdline_history', group_index = 1 }, { name = 'nvim_lsp_document_symbol', keyword_length = 1, group_index = 1 }, { name = 'async_path', group_index = 1 }, { name = 'buffer', group_index = 1 }, }, matching = { disallow_symbol_nonprefix_matching = false, }, view = { entries = { selection_order = 'near_cursor' }, }, formatting = { fields = { 'abbr', 'menu' }, }, }) cmp.setup.cmdline({ '/', '?' }, { sources = { { name = 'nvim_lsp_document_symbol', keyword_length = 1, group_index = 1 }, { name = 'path', max_item_count = 12, group_index = 1 }, { name = 'buffer', group_index = 2 }, }, })