diff options
Diffstat (limited to 'core/overrides/cmp.lua')
-rw-r--r-- | core/overrides/cmp.lua | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/core/overrides/cmp.lua b/core/overrides/cmp.lua new file mode 100644 index 0000000..2b6a9cd --- /dev/null +++ b/core/overrides/cmp.lua @@ -0,0 +1,122 @@ +local has_words_before = function() + unpack = unpack or table.unpack + local line, col = unpack(a.nvim_win_get_cursor(0)) + return col ~= 0 and a.nvim_buf_get_lines(0, line - 1, line, true) + [1]:sub(col, col):match("%s") == nil +end + +local cmp = require('cmp') +local luasnip = require('luasnip') +require("luasnip.loaders.from_vscode").lazy_load() + +cmp.setup { + completion = { autocomplete = false, }, + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + sources = cmp.config.sources({ + { name = 'nvim_lsp', keyword_length = 3 }, + { name = 'luasnip', keyword_length = 3 }, + { name = 'path' }, + { name = 'buffer', keyword_length = 3, max_item_count = 7 }, + { name = 'calc' }, + }), + window = { + completion = { + winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", + col_offset = -3, + side_padding = 0, + } + }, + formatting = { + fields = { "kind", "abbr", "menu" }, + format = function(entry, vim_item) + local kind_icons = { + Text = 'Tx', + Snippet = '<>', + Method = ' ', + Function = '{}', + Constructor = ' ', + Field = '""', + Variable = 'x=', + Class = '~{', + Interface = '.h', + Module = ' ', + Property = '@p', + Unit = ' ', + Value = ' ', + Enum = 'E#', + Keyword = '$1', + Color = ' ', + File = ' ', + Reference = ' ', + Folder = ' ', + EnumMember = ' ', + Constant = ' ', + Struct = ' ', + Event = ' ', + Operator = ' ', + TypeParameter = ' ', + } + local menu_items = { + buffer = "buffer", + nvim_lsp = "LSP", + luasnip = "luasnip", + nvim_lua = "lua", + calc = "calc", + } + + vim_item.kind = string.format(' %s ', kind_icons[vim_item.kind]) + vim_item.menu = string.format(' (%s)', menu_items[entry.source.name]) + + return vim_item + end + }, + mapping = cmp.mapping.preset.insert({ + ["<Tab>"] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + ["<S-Tab>"] = 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" }), + ['<CR>'] = cmp.mapping.confirm({ select = true }), + ['<ESC>'] = cmp.mapping.close(), + }), + sorting = { + comparators = { + cmp.config.compare.offset, + cmp.config.compare.exact, + cmp.config.compare.score, + require "cmp-under-comparator".under, + cmp.config.compare.kind, + cmp.config.compare.sort_text, + cmp.config.compare.length, + cmp.config.compare.order, + }, + }, + enabled = function() + local context = require 'cmp.config.context' + if a.nvim_get_mode().mode == 'c' then + return true + else + return not context.in_treesitter_capture("comment") + and not context.in_syntax_group("Comment") + end + end +} |