diff options
Diffstat (limited to '')
| -rw-r--r-- | .vim/lua/internal/completion.lua | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/.vim/lua/internal/completion.lua b/.vim/lua/internal/completion.lua new file mode 100644 index 0000000..552a45e --- /dev/null +++ b/.vim/lua/internal/completion.lua @@ -0,0 +1,154 @@ +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 = { + ['<c-n>'] = cmp.mapping( + cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), + { 'i', 'c' } + ), + ['<c-p>'] = cmp.mapping( + cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), + { 'i', 'c' } + ), + ['<tab>'] = 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 }, + }, +}) |