local cmp = require("cmp") -- https://github.com/zbirenbaum/copilot-cmp#tab-completion-configuration-highly-recommended local has_words_before = function() if vim.api.nvim_buf_get_option(0, "buftype") == "prompt" then return false end local line, col = unpack(vim.api.nvim_win_get_cursor(0)) return col ~= 0 and vim.api.nvim_buf_get_text(0, line - 1, 0, line - 1, col, {})[1]:match("^%s*$") == nil end cmp.setup({ completion = { completeopt = "menu,menuone,noinsert,noselect", }, snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, preselect = cmp.PreselectMode.None, 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.close(), ["C-y"] = cmp.mapping.confirm({ select = true, behaviour = cmp.ConfirmBehavior.Replace }), -- https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#super-tab-like-mapping [""] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Insert, select = true, }), [""] = vim.schedule_wrap(function(fallback) if cmp.visible() and has_words_before() then cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) else fallback() end end), [""] = function(fallback) if not cmp.select_prev_item() then if vim.bo.buftype ~= "prompt" and has_words_before() then cmp.complete() else fallback() end end end, }), sources = cmp.config.sources({ { name = "copilot" }, { name = "nvim_lsp" }, { name = "buffer", option = { get_bufnrs = function() return vim.api.nvim_list_bufs() end, }, }, -- { name = "tmux", option = { all_panes = true } }, { name = "path" }, { name = "calc" }, }), sorting = { comparators = { cmp.config.compare.exact, require("copilot_cmp.comparators").prioritize, cmp.config.compare.offset, cmp.config.compare.score, cmp.config.compare.recently_used, cmp.config.compare.locality, cmp.config.compare.kind, cmp.config.compare.sort_text, cmp.config.compare.length, cmp.config.compare.order, }, }, -- https://github.com/hrsh7th/nvim-cmp/wiki/Advanced-techniques#disabling-completion-in-certain-contexts-such-as-comments enabled = function() return true end, formatting = { fields = { "kind", "abbr", "menu" }, }, experimental = { ghost_text = true, }, })