From 23de12baba9fbfc4ca24581b37c374aa5345cc25 Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Mon, 25 Nov 2024 13:30:37 +0100 Subject: update nvim config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- .vim/lua/internal/completion.lua | 154 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 .vim/lua/internal/completion.lua (limited to '.vim/lua/internal/completion.lua') 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 = { + [''] = 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 }, + }, +}) -- cgit 1.4.1