return { "hrsh7th/nvim-cmp", event = "InsertEnter", -- Only load when entering insert mode for performance dependencies = { -- Snippet engine (REQUIRED by cmp) { "L3MON4D3/LuaSnip", dependencies = { "saadparwaiz1/cmp_luasnip" } }, -- Sources for completion "hrsh7th/cmp-nvim-lsp", -- LSP suggestions "hrsh7th/cmp-buffer", -- Buffer words "hrsh7th/cmp-path", -- File system paths "hrsh7th/cmp-cmdline", -- Command line completion (if you want it) -- You can add more sources here, e.g., 'hrsh7th/cmp-vsnip', 'ray-x/cmp-treesitter' }, config = function() -- Set up nvim-cmp local cmp = require("cmp") local luasnip = require("luasnip") cmp.setup({ snippet = { -- REQUIRED - sets the snippet engine nvim-cmp uses expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.confirm({ select = true }), -- Accept selected item. [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() -- Use to jump to the next snippet placeholder elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() -- Use to jump to the previous snippet placeholder elseif luasnip.jump_backward() then luasnip.jump_backward() else fallback() end end, { "i", "s" }), }), sources = cmp.config.sources({ { name = "nvim_lsp" }, -- LSP suggestions { name = "luasnip" }, -- Snippet source }, { { name = "buffer" }, -- Buffer words { name = "path" }, -- File system paths }), }) -- Optional: Configure for command line completion cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = "path" }, }, { { name = "cmdline" }, }), }) end, }