-- https://github.com/hrsh7th/nvim-cmp local word_pattern = "[%w_.]" local function has_words_before() 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(word_pattern) ~= nil end local function has_words_after() 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 + 1, col + 1) :match(word_pattern) ~= nil end local function setup() local utils = require("utils") local cmp = require("cmp") local luasnip = require("luasnip") local lspkind = utils.try_require("lspkind") local opt = { preselect = cmp.PreselectMode.None, completion = { keyword_length = 0 }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, formatting = { format = function(entry, vim_item) if lspkind then vim_item = lspkind.cmp_format({ mode = "symbol", maxwidth = 50, ellipsis_char = "...", before = function(_, item) item.dup = 0 -- remove duplicates, see nvim-cmp #511 return item end, })(entry, vim_item) end return vim_item end, }, mapping = { [""] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select, }), [""] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select, }), [""] = function(fallback) if cmp.visible() then cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace }) else fallback() end end, [""] = cmp.mapping.complete(), [""] = function(fallback) if luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() else fallback() end end, [""] = function(fallback) if luasnip.locally_jumpable(-1) then luasnip.jump(-1) else fallback() end end, [""] = function(fallback) if cmp.visible_docs() then cmp.scroll_docs(-4) else fallback() end end, [""] = function(fallback) if cmp.visible_docs() then cmp.scroll_docs(4) else fallback() end end, }, sources = { { name = "nvim_lsp" }, -- { name = "luasnip", }, { name = "orgmode" }, { name = "path" }, }, } if utils.try_require("moonfly") then local winhighlight = { winhighlight = "Normal:NormalFloat,FloatBorder:FloatBorder,CursorLine:PmenuSel", } opt.window = { completion = cmp.config.window.bordered(winhighlight), documentation = cmp.config.window.bordered(winhighlight), } end cmp.setup(opt) cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = { { name = "buffer" } }, }) cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = "path" } }, { { name = "cmdline", option = { ignore_cmds = { "Man", "!" } }, }, }), }) end return setup