From b77413ff8f59f380612074f0c9bd49093d8db695 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Sun, 19 Jan 2025 13:52:52 +0100 Subject: Squashed 'mut/neovim/pack/plugins/start/blink.cmp/' content from commit 1cc3b1a git-subtree-dir: mut/neovim/pack/plugins/start/blink.cmp git-subtree-split: 1cc3b1a908fbcfd15451c4772759549724f38524 --- lua/blink/cmp/config/snippets.lua | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 lua/blink/cmp/config/snippets.lua (limited to 'lua/blink/cmp/config/snippets.lua') diff --git a/lua/blink/cmp/config/snippets.lua b/lua/blink/cmp/config/snippets.lua new file mode 100644 index 0000000..cd804e9 --- /dev/null +++ b/lua/blink/cmp/config/snippets.lua @@ -0,0 +1,65 @@ +--- @class (exact) blink.cmp.SnippetsConfig +--- @field preset 'default' | 'luasnip' | 'mini_snippets' +--- @field expand fun(snippet: string) Function to use when expanding LSP provided snippets +--- @field active fun(filter?: { direction?: number }): boolean Function to use when checking if a snippet is active +--- @field jump fun(direction: number) Function to use when jumping between tab stops in a snippet, where direction can be negative or positive + +--- @param handlers table<'default' | 'luasnip' | 'mini_snippets', fun(...): any> +local function by_preset(handlers) + return function(...) + local preset = require('blink.cmp.config').snippets.preset + return handlers[preset](...) + end +end + +local validate = require('blink.cmp.config.utils').validate +local snippets = { + --- @type blink.cmp.SnippetsConfig + default = { + preset = 'default', + -- NOTE: we wrap `vim.snippet` calls to reduce startup by 1-2ms + expand = by_preset({ + default = function(snippet) vim.snippet.expand(snippet) end, + luasnip = function(snippet) require('luasnip').lsp_expand(snippet) end, + mini_snippets = function(snippet) + if not _G.MiniSnippets then error('mini.snippets has not been setup') end + local insert = MiniSnippets.config.expand.insert or MiniSnippets.default_insert + insert(snippet) + end, + }), + active = by_preset({ + default = function(filter) return vim.snippet.active(filter) end, + luasnip = function(filter) + if filter and filter.direction then return require('luasnip').jumpable(filter.direction) end + return require('luasnip').in_snippet() + end, + mini_snippets = function() + if not _G.MiniSnippets then error('mini.snippets has not been setup') end + return MiniSnippets.session.get(false) ~= nil + end, + }), + jump = by_preset({ + default = function(direction) vim.snippet.jump(direction) end, + luasnip = function(direction) require('luasnip').jump(direction) end, + mini_snippets = function(direction) + if not _G.MiniSnippets then error('mini.snippets has not been setup') end + MiniSnippets.session.jump(direction == -1 and 'prev' or 'next') + end, + }), + }, +} + +function snippets.validate(config) + validate('snippets', { + preset = { + config.preset, + function(preset) return vim.tbl_contains({ 'default', 'luasnip', 'mini_snippets' }, preset) end, + 'one of: "default", "luasnip", "mini_snippets"', + }, + expand = { config.expand, 'function' }, + active = { config.active, 'function' }, + jump = { config.jump, 'function' }, + }, config) +end + +return snippets -- cgit v1.2.3