Luasnip中LaTeX片段触发问题:Lua模式如何匹配闭合大括号
Luasnip LaTeX下标片段触发规则修复
要让片段仅在字母、数字或闭合大括号}后触发下划线下标功能,分两种场景解决:
方案1:用Condition判断(推荐)
这种方式不需要修改触发键,仅通过条件判断前一个字符是否符合要求,逻辑更清晰:
local ls = require("luasnip") local s = ls.snippet local t = ls.text_node local i = ls.insert_node ls.add_snippets("tex", { s({ trig = "_", -- 自动触发可选,根据需求开启 snippetType = "autosnippet", condition = function(line_to_cursor) -- 匹配光标前最后一个字符是否为字母、数字或闭合大括号 return line_to_cursor:match("[%a%d}]$") ~= nil end }, { t("_{"), i(1), -- 下标内容输入位 t("}"), i(0) -- 光标最终停留位 }) })
方案2:用正则触发键
如果必须通过正则匹配整个触发序列,需要开启regex_trigger,且字符集中的}无需转义(Lua模式匹配里,}在字符集[]内是普通字符):
ls.add_snippets("tex", { s({ trig = "([%a%d}])_", regex_trigger = true, snippetType = "autosnippet" }, { -- 保留捕获到的前一个字符(字母/数字/}) require("luasnip.extras.fmt").fmta([[ <>_{<>}<> ]], { ls.f(function(args) return args[1][1] end, 1), i(1), i(0) }) }) })
常见问题说明
- 若之前尝试转义
}(比如写成%}),反而会让模式匹配%}字符串而非单纯的闭合大括号,直接写}即可。 - 使用正则触发时必须开启
regex_trigger = true,否则Luasnip会把trig当作普通字符串处理,无法匹配正则规则。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

