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 "), } ), }