local M = {} local luasnip = require("luasnip") local types = require("luasnip.util.types") function M.visual_isn(pos) local d = luasnip.dynamic_node local i = luasnip.insert_node local isn = luasnip.indent_snippet_node local sn = luasnip.snippet_node return isn(pos, d(1, function(_, parent) local res, env = {}, parent.snippet.env for _, ele in ipairs(env.LS_SELECT_DEDENT or {}) do table.insert(res, ele) end return sn(nil, i(1, res)) end), "$PARENT_INDENT\t") end function M.choice_index(choice_node) for i, c in ipairs(choice_node.choices) do if c == choice_node.active_choice then return i end end return 1 end function M.setup() luasnip.config.setup { region_check_events = "InsertEnter", delete_check_events = "InsertLeave", store_selection_keys = "", enable_autosnippets = true, ext_opts = { [types.snippet] = { active = { virt_text = { { "●", "DiagnosticWarn" } }, }, }, [types.insertNode] = { passive = { hl_group = "DiagnosticVirtualTextWarn", }, }, [types.choiceNode] = { active = { hl_group = "DiagnosticVirtualTextHint", virt_text = { { "⧨", "DiagnosticHint" } }, }, }, }, } -- Track where we are expanding the snippet. luasnip.env_namespace("INFO", { init = function(info) return { POS = info.pos } end, }) vim.keymap.set({ "i", "s" }, "", function() if luasnip.choice_active() then return "luasnip-next-choice" else return "" end end, { silent = true, expr = true, remap = true }) vim.keymap.set({ "i", "s" }, "", function() if luasnip.choice_active() then return "luasnip-prev-choice" else return "" end end, { silent = true, expr = true, remap = true }) -- Allow aborting the active snippet at any point in time. vim.keymap.set({ "n", "i", "s" }, "", "LuaSnipUnlinkCurrent") -- Allow toggling autoexpansion on and off. This is more or less the intended -- approach: https://github.com/L3MON4D3/LuaSnip/issues/832#issuecomment-1474993417 luasnip.expand_auto_on = true local expand_auto = luasnip.expand_auto local toggle_expand_auto = function() if luasnip.expand_auto_on then luasnip.expand_auto = function() end else luasnip.expand_auto = expand_auto end luasnip.expand_auto_on = not luasnip.expand_auto_on end toggle_expand_auto() vim.keymap.set({ "n", "i", "s" }, "", toggle_expand_auto) end return M