local helpers = require("personal.luasnip-helper-funcs") local get_visual = helpers.get_visual -- Math context detection local tex = {} tex.in_mathzone = function() return vim.fn["vimtex#syntax#in_mathzone"]() == 1 end tex.in_text = function() return not tex.in_mathzone() end -- Return snippet tables return { -- SUPERSCRIPT s( { trig = "([%w%)%]%}])'", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>^{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- SUBSCRIPT s( { trig = "([%w%)%]%}]);", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>_{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- SUBSCRIPT AND SUPERSCRIPT s( { trig = "([%w%)%]%}])__", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>^{<>}_{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- TEXT SUBSCRIPT s( { trig = "sd", snippetType = "autosnippet", wordTrig = false }, fmta("_{\\mathrm{<>}}", { d(1, get_visual) }), { condition = tex.in_mathzone } ), -- SUPERSCRIPT SHORTCUT -- Places the first alphanumeric character after the trigger into a superscript. s( { trig = '([%w%)%]%}])"([%w])', regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>^{<>}", { f(function(_, snip) return snip.captures[1] end), f(function(_, snip) return snip.captures[2] end), }), { condition = tex.in_mathzone } ), -- SUBSCRIPT SHORTCUT -- Places the first alphanumeric character after the trigger into a subscript. s( { trig = "([%w%)%]%}]):([%w])", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>_{<>}", { f(function(_, snip) return snip.captures[1] end), f(function(_, snip) return snip.captures[2] end), }), { condition = tex.in_mathzone } ), -- EULER'S NUMBER SUPERSCRIPT SHORTCUT s( { trig = "([^%a])ee", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>e^{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- ZERO SUBSCRIPT SHORTCUT s( { trig = "([%a%)%]%}])00", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>_{<>}", { f(function(_, snip) return snip.captures[1] end), t("0"), }), { condition = tex.in_mathzone } ), -- MINUS ONE SUPERSCRIPT SHORTCUT s( { trig = "([%a%)%]%}])11", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>_{<>}", { f(function(_, snip) return snip.captures[1] end), t("-1"), }), { condition = tex.in_mathzone } ), -- J SUBSCRIPT SHORTCUT (since jk triggers snippet jump forward) s( { trig = "([%a%)%]%}])JJ", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>_{<>}", { f(function(_, snip) return snip.captures[1] end), t("j"), }), { condition = tex.in_mathzone } ), -- PLUS SUPERSCRIPT SHORTCUT s( { trig = "([%a%)%]%}])%+%+", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>^{<>}", { f(function(_, snip) return snip.captures[1] end), t("+"), }), { condition = tex.in_mathzone } ), -- COMPLEMENT SUPERSCRIPT s( { trig = "([%a%)%]%}])CC", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>^{<>}", { f(function(_, snip) return snip.captures[1] end), t("\\complement"), }), { condition = tex.in_mathzone } ), -- CONJUGATE (STAR) SUPERSCRIPT SHORTCUT s( { trig = "([%a%)%]%}])%*%*", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>^{<>}", { f(function(_, snip) return snip.captures[1] end), t("*"), }), { condition = tex.in_mathzone } ), -- VECTOR, i.e. \vec s( { trig = "([^%a])vv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\vec{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- DEFAULT UNIT VECTOR WITH SUBSCRIPT, i.e. \unitvector_{} s( { trig = "([^%a])ue", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\unitvector_{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- UNIT VECTOR WITH HAT, i.e. \uvec{} s( { trig = "([^%a])uv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\uvec{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- MATRIX, i.e. \vec s( { trig = "([^%a])mt", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\mat{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- FRACTION s( { trig = "([^%a])ff", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\frac{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), i(2), }), { condition = tex.in_mathzone } ), -- ANGLE s( { trig = "([^%a])gg", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>\\ang{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- ABSOLUTE VALUE s( { trig = "([^%a])aa", regTrig = true, wordTrig = false, snippetType = "autosnippet" }, fmta("<>\\abs{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- SQUARE ROOT s( { trig = "([^%\\])sq", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\sqrt{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- BINOMIAL SYMBOL s( { trig = "([^%\\])bnn", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\binom{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- LOGARITHM WITH BASE SUBSCRIPT s( { trig = "([^%a%\\])ll", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\log_{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), }), { condition = tex.in_mathzone } ), -- DERIVATIVE with denominator only s( { trig = "([^%a])dV", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\dvOne{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- DERIVATIVE with numerator and denominator s( { trig = "([^%a])dvv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\dv{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- DERIVATIVE with numerator, denominator, and higher-order argument s( { trig = "([^%a])ddv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\dvN{<>}{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), i(3), }), { condition = tex.in_mathzone } ), -- PARTIAL DERIVATIVE with denominator only s( { trig = "([^%a])pV", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\pdvOne{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- PARTIAL DERIVATIVE with numerator and denominator s( { trig = "([^%a])pvv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\pdv{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- PARTIAL DERIVATIVE with numerator, denominator, and higher-order argument s( { trig = "([^%a])ppv", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\pdvN{<>}{<>}{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), i(3), }), { condition = tex.in_mathzone } ), -- SUM with lower limit s( { trig = "([^%a])sM", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\sum_{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), }), { condition = tex.in_mathzone } ), -- SUM with upper and lower limit s( { trig = "([^%a])smm", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\sum_{<>}^{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- INTEGRAL with upper and lower limit s( { trig = "([^%a])intt", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\int_{<>}^{<>}", { f(function(_, snip) return snip.captures[1] end), i(1), i(2), }), { condition = tex.in_mathzone } ), -- INTEGRAL from positive to negative infinity s( { trig = "([^%a])intf", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\int_{\\infty}^{\\infty}", { f(function(_, snip) return snip.captures[1] end), }), { condition = tex.in_mathzone } ), -- BOXED command s( { trig = "([^%a])bb", wordTrig = false, regTrig = true, snippetType = "autosnippet" }, fmta("<>\\boxed{<>}", { f(function(_, snip) return snip.captures[1] end), d(1, get_visual), }), { condition = tex.in_mathzone } ), -- -- BEGIN STATIC SNIPPETS -- -- DIFFERENTIAL, i.e. \diff s({ trig = "df", snippetType = "autosnippet", priority = 2000, snippetType = "autosnippet" }, { t("\\diff"), }, { condition = tex.in_mathzone }), -- BASIC INTEGRAL SYMBOL, i.e. \int s({ trig = "in1", snippetType = "autosnippet" }, { t("\\int"), }, { condition = tex.in_mathzone }), -- DOUBLE INTEGRAL, i.e. \iint s({ trig = "in2", snippetType = "autosnippet" }, { t("\\iint"), }, { condition = tex.in_mathzone }), -- TRIPLE INTEGRAL, i.e. \iiint s({ trig = "in3", snippetType = "autosnippet" }, { t("\\iiint"), }, { condition = tex.in_mathzone }), -- CLOSED SINGLE INTEGRAL, i.e. \oint s({ trig = "oi1", snippetType = "autosnippet" }, { t("\\oint"), }, { condition = tex.in_mathzone }), -- CLOSED DOUBLE INTEGRAL, i.e. \oiint s({ trig = "oi2", snippetType = "autosnippet" }, { t("\\oiint"), }, { condition = tex.in_mathzone }), -- GRADIENT OPERATOR, i.e. \grad s({ trig = "gdd", snippetType = "autosnippet" }, { t("\\grad "), }, { condition = tex.in_mathzone }), -- CURL OPERATOR, i.e. \curl s({ trig = "cll", snippetType = "autosnippet" }, { t("\\curl "), }, { condition = tex.in_mathzone }), -- DIVERGENCE OPERATOR, i.e. \divergence s({ trig = "DI", snippetType = "autosnippet" }, { t("\\div "), }, { condition = tex.in_mathzone }), -- LAPLACIAN OPERATOR, i.e. \laplacian s({ trig = "laa", snippetType = "autosnippet" }, { t("\\laplacian "), }, { condition = tex.in_mathzone }), -- PARALLEL SYMBOL, i.e. \parallel s({ trig = "||", snippetType = "autosnippet" }, { t("\\parallel"), }), -- CDOTS, i.e. \cdots s({ trig = "cdd", snippetType = "autosnippet" }, { t("\\cdots"), }), -- LDOTS, i.e. \ldots s({ trig = "ldd", snippetType = "autosnippet" }, { t("\\ldots"), }), -- EQUIV, i.e. \equiv s({ trig = "eqq", snippetType = "autosnippet" }, { t("\\equiv "), }), -- SETMINUS, i.e. \setminus s({ trig = "stm", snippetType = "autosnippet" }, { t("\\setminus "), }), -- SUBSET, i.e. \subset s({ trig = "sbb", snippetType = "autosnippet" }, { t("\\subset "), }), -- APPROX, i.e. \approx s({ trig = "px", snippetType = "autosnippet" }, { t("\\approx "), }, { condition = tex.in_mathzone }), -- PROPTO, i.e. \propto s({ trig = "pt", snippetType = "autosnippet" }, { t("\\propto "), }, { condition = tex.in_mathzone }), -- COLON, i.e. \colon s({ trig = "::", snippetType = "autosnippet" }, { t("\\colon "), }), -- IMPLIES, i.e. \implies s({ trig = ">>", snippetType = "autosnippet" }, { t("\\implies "), }), -- DOT PRODUCT, i.e. \cdot s({ trig = ",.", snippetType = "autosnippet" }, { t("\\cdot "), }), -- CROSS PRODUCT, i.e. \times s({ trig = "xx", snippetType = "autosnippet" }, { t("\\times "), }), }