【问题标题】:How to avoid auto-close (, {, [ in user defined Sublime Text 3 snippet?如何在用户定义的 Sublime Text 3 代码段中避免自动关闭 (, {, [?
【发布时间】:2026-01-16 09:30:01
【问题描述】:

我正在尝试为 ST3 编写一个看起来相当无辜的 sn-p。用于插入

\left<open-parens> \right<close-parens>

在数学范围内进入 Latex 文档。

我现在拥有的是:

<snippet>
    <content><![CDATA[\\left${1:(} $0 \\right${1/(\()|(\{)|(\[)/(?1:\))(?2:\})(?3:\])/}]]></content>
    <tabTrigger>lft</tabTrigger>
    <scope>text.tex.latex string.other.math.tex,meta.function.environment.math.latex</scope>
</snippet>

用法如下:

  • 输入lst,tab;
  • \left( \right) 被插入,( 被选中;
  • 如果用户希望(tab 位于中间;
  • 否则键入{[ 以在\right 之后插入相应的右括号

我已验证正则表达式按预期工作(通过尝试将${1:(} 替换为${1:{}${1:[} 的sn-p 版本。

但是在使用中,当键入任何起始括号时,ST 调用它自己的 sn-p,a) 紧跟其后插入关闭括号 b) 从我的 sn-p 中删除焦点,因此永远不会调用正则表达式。

第一个问题,我已经能够通过捕获开头的parenses并调用一个微小的sn-p,插入字符本身来缓解。例如:

{ "keys": ["{"], "command": "insert_snippet", "args": {"contents": "$0{"}, "context": [
     {"key": "selector", "operator": "equal", "operand": "text.tex.latex string.other.math.tex, meta.function.environment.math.latex"},
     {"key": "preceding_text", "operator": "regex_contains", "operand": "\\\\left\\($", "match_all": true }] },

但后来我发现了 b)。

解决方案将涉及以下任何一项:

  • 根据上下文和"key": "preceding_text",阻止执行内置的自动关闭 sn-ps。
  • 让我自己的 mini-sn-p 返回到前者(即在输入 [focus 后返回到 lst-sn-p)。

如何做到这一点?

【问题讨论】:

    标签: autocomplete sublimetext2 sublimetext code-snippets sublimetext3


    【解决方案1】:

    这并不是我真正要寻找的答案,而是针对这个特定问题的有效解决方案。

    使用在外观上略有不同,但所需的击键是相同的。

    我要做的是: 将 lft-sn-p 更改为:

    <content><![CDATA[\\left${1:$0\right}]]></content>
    

    为每个parens-type定义一个新的键绑定,覆盖默认的并且做一些有用的事情,例如对于 [] 将其添加到键盘映射文件中:

    { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[ $0 $SELECTION]"}, "context":
        [
            { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
            { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true },
            { "key": "selector", "operator": "equal", "operand": "text.tex.latex string.other.math.tex, meta.function.environment.math.latex"},
            { "key": "preceding_text", "operator": "regex_contains", "operand": "\\\\left\\\\right$", "match_all": true }
        ] 
    },
    

    作为一个积极的副作用,lft-sn-p 变得更容易阅读(删除正则表达式)。

    我仍然非常想知道以更一般的方式完成此任务的方法。

    【讨论】:

      最近更新 更多