return { { "onsails/lspkind.nvim", opts = { symbol_map = require "plugins.configs.ui.lspkind", }, }, { "github/copilot.vim", }, { "hrsh7th/cmp-cmdline", }, { "hrsh7th/nvim-cmp", opts = function(_, opts) local cmp = require "cmp" local luasnip = require "luasnip" local function has_words_before() local line, col = (unpack or table.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 -- `/` cmdline setup. cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = { { name = "buffer" }, }, }) -- `:` cmdline setup. cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = "path" }, }, { { name = "cmdline", option = { ignore_cmds = { "Man", "!" }, }, }, }), }) cmp.setup.filetype("python", { sources = cmp.config.sources { { name = "nvim_lsp", priority = 1000 }, { name = "buffer", priority = 500 }, { name = "path", priority = 250 }, }, }) return require("astrocore").extend_tbl(opts, { -- Configure window style window = { completion = { winhighlight = "Normal:Pmenu,CursorLine:PmenuSel,Search:None", -- border = "none", side_padding = 0, }, }, formatting = { -- Show icon at the beginning and menu at the end fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) local kind = require("lspkind").cmp_format { mode = "symbol_text", maxwidth = 50 }(entry, vim_item) local strings = vim.split(kind.kind, "%s", { trimetry = true }) kind.kind = " " .. (strings[1] or "") .. " " kind.menu = " [" .. (strings[2] or "") .. "]" return kind end, }, -- Always select the first option completion = { completeopt = "menu,menuone,noinsert", }, -- Custom mapping mapping = { -- Esc to close completion menu [""] = cmp.mapping { i = cmp.mapping.abort(), c = cmp.mapping.close() }, -- Tab to select completion [""] = cmp.mapping(function(fallback) if cmp.visible() and has_words_before() then fallback() else fallback() end end, { "i", "s" }), -- Use and to select luasnip [""] = cmp.mapping(function(fallback) if luasnip.jumpable(1) then luasnip.jump(1) else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) -- Check if Copilot is suggesting something if vim.fn["copilot#Accept"]() ~= "" then vim.api.nvim_set_keymap("i", "", "copilot#Accept(“”)", { expr = true, silent = true }) else fallback() -- If no suggestion, fallback to default behavior end end, { "i", "s" }), -- Enable in insert and command-line mode }, experimental = { ghost_text = false, -- this feature conflict with copilot.vim's preview. }, }) end, }, }