You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

常见问题说明

  1. 若之前尝试转义}(比如写成%}),反而会让模式匹配%}字符串而非单纯的闭合大括号,直接写}即可。
  2. 使用正则触发时必须开启regex_trigger = true,否则Luasnip会把trig当作普通字符串处理,无法匹配正则规则。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:31:14