local status_ok, cmp = pcall(require, "cmp") if not status_ok then return end 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 -- insert '()' after completing a function cmp.event:on('confirm_done', require('nvim-autopairs.completion.cmp').on_confirm_done()) local luasnip = require('luasnip') local neogen = require('neogen') require("luasnip.loaders.from_vscode").lazy_load() cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, sources = cmp.config.sources({ { name = 'nvim_lsp', keyword_length = 3 }, { name = 'luasnip_choice' }, { name = 'async_path' }, { name = 'buffer', keyword_length = 3, max_item_count = 7 }, { name = 'calc' }, { name = 'neorg' }, }), window = { completion = { border = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC", }, documentation = { border = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC", } }, view = { entries = { name = 'custom', selection_order = 'near_cursor' }, }, -- mappings ----------------------------------------------------------------- mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping(function(fallback) if #cmp.get_entries() == 1 then cmp.confirm({ select = true }) elseif cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() elseif has_words_before() then cmp.complete() if #cmp.get_entries() == 1 then cmp.confirm({ select = true }) end elseif neogen.jumpable() then neogen.jump_next() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) elseif neogen.jumpable(true) then neogen.jump_prev() else fallback() end end, { "i", "s" }), [''] = 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 = true }), c = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }), }, [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.close(), [""] = cmp.mapping.abort(), }), 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 }