return { { "hrsh7th/nvim-cmp", -- load cmp on InsertEnter event = "InsertEnter", -- these dependencies will only be loaded when cmp loads -- dependencies are always lazy-loaded unless specified otherwise dependencies = { "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "hrsh7th/cmp-cmdline", -- 'hrsh7th/cmp-vsnip', -- 'hrsh7th/vim-vsnip', -- 'hrsh7th/vim-vsnip-integ', "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", "onsails/lspkind.nvim", { "zbirenbaum/copilot-cmp", dependencies = { "hrsh7th/nvim-cmp", { "zbirenbaum/copilot.lua", opts = { suggestion = { enabled = false }, panel = { enabled = false }, filetypes = { mail = false, text = false, }, }, }, }, config = function() require("copilot_cmp").setup() end, }, }, config = function() local cmp = require("cmp") local lspkind = require("lspkind") local luasnip = require("luasnip") 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 cmp.setup({ snippet = { expand = function(args) --vim.fn["vsnip#anonymous"](args.body) require("luasnip").lsp_expand(args.body) end, }, mapping = { [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.abort(), [""] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), [""] = 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(function(fallback) if cmp.visible() then cmp.select_next_item() -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() -- they way you will only jump inside the snippet region elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() 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 luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }), }, sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "luasnip" }, { name = "copilot" }, }, { { name = "buffer", option = { keyword_pattern = [[\k\+]] } }, --{ name = 'path' }, }), formatting = { format = lspkind.cmp_format({ mode = "symbol_text", -- show only symbol annotations maxwidth = 80, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) ellipsis_char = "…", -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead (must define maxwidth first) symbol_map = { Copilot = "" }, }), }, }) end, }, }