local has_words_before = function() unpack = unpack or table.unpack local line, col = unpack(vim.api.nvim_win_get_cursor(0)) return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil end return function() local cmp = require'cmp' local snippy = require("snippy") local lspkind = require('lspkind') cmp.setup({ snippet = { expand = function(args) require('snippy').expand_snippet(args.body) -- For `snippy` users. end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [""] = cmp.mapping({ i = function(fallback) if cmp.visible() and cmp.get_active_entry() then cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }) else fallback() end end, s = cmp.mapping.confirm({ select = false }), c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif snippy.can_expand_or_advance() then snippy.expand_or_advance() elseif has_words_before() then cmp.complete() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif snippy.can_jump(-1) then snippy.previous() else fallback() end end, { "i", "s" }), }), sources = cmp.config.sources({ { name = "copilot" }, { name = 'nvim_lsp' }, { name = 'snippy' }, { name = 'vimtex', }, { name = 'path' }, }, { { name = 'buffer' }, }), formatting = { format = lspkind.cmp_format({ mode = 'symbol_text', preset = 'codicons', maxwidth = 50, ellipsis_char = '...', before = function (entry, vim_item) return vim_item end, symbol_map = { Copilot = "" }, }) } }) cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, }, { { name = 'buffer' }, }) }) cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), view = { entries = {name = 'wildmenu', separator = '|' } }, sources = { { name = 'buffer' }, { name = 'path' } } }) cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) end