return { -- disable builtin snippet support { "garymjr/nvim-snippets", enabled = false }, -- add luasnip { "L3MON4D3/LuaSnip", lazy = true, build = (not LazyVim.is_win()) and "echo 'NOTE: jsregexp is optional, so not a big deal if it fails to build'; make install_jsregexp" or nil, dependencies = { { "rafamadriz/friendly-snippets", config = function() require("luasnip.loaders.from_vscode").lazy_load() require("luasnip.loaders.from_vscode").lazy_load({ paths = { vim.fn.stdpath("config") .. "/snippets" } }) end, }, }, opts = { history = true, delete_check_events = "TextChanged", }, }, -- add snippet_forward action { "L3MON4D3/LuaSnip", opts = function() LazyVim.cmp.actions.snippet_forward = function() if require("luasnip").jumpable(1) then require("luasnip").jump(1) return true end end LazyVim.cmp.actions.snippet_stop = function() if require("luasnip").expand_or_jumpable() then -- or just jumpable(1) is fine? require("luasnip").unlink_current() return true end end end, }, -- nvim-cmp integration { "hrsh7th/nvim-cmp", optional = true, dependencies = { "saadparwaiz1/cmp_luasnip" }, opts = function(_, opts) opts.snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, } table.insert(opts.sources, { name = "luasnip" }) end, -- stylua: ignore keys = { { "", function() require("luasnip").jump(1) end, mode = "s" }, { "", function() require("luasnip").jump(-1) end, mode = { "i", "s" } }, }, }, -- blink.cmp integration { "saghen/blink.cmp", optional = true, opts = { snippets = { expand = function(snippet) require("luasnip").lsp_expand(snippet) end, active = function(filter) if filter and filter.direction then return require("luasnip").jumpable(filter.direction) end return require("luasnip").in_snippet() end, jump = function(direction) require("luasnip").jump(direction) end, }, }, }, -- Luasnip sources for blink { "saghen/blink.cmp", optional = true, opts = function(_, opts) table.insert(opts.sources.default, "luasnip") opts.sources.default = vim.tbl_filter(function(p) return p ~= "snippets" end, opts.sources.default) end, }, }