-- Completion engine using nvim-cmp -- Keeping nvim-cmp for now due to blink.cmp stability issues return { { "hrsh7th/nvim-cmp", event = "InsertEnter", dependencies = { "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "rafamadriz/friendly-snippets", }, config = function() local cmp = require("cmp") local luasnip = require("luasnip") -- Load snippets require("luasnip.loaders.from_vscode").lazy_load() cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, completion = { completeopt = "menu,menuone,noinsert", }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.select_next_item(), [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping.complete(), [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.abort(), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.abort() end fallback() -- Still exit insert mode after aborting end, { "i", "s" }), }), sources = cmp.config.sources({ { name = "nvim_lsp", priority = 8 }, { name = "luasnip", priority = 7 }, { name = "path", priority = 7 }, { name = "buffer", priority = 6 }, }), window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, }) end, }, -- LuaSnip for snippet expansion { "L3MON4D3/LuaSnip", lazy = true, build = (function() if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then return end return "make install_jsregexp" end)(), opts = { history = true, delete_check_events = "TextChanged", }, }, }