我正在尝试为 ST3 编写一个看起来相当无辜的片段。用于插入
\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:[} 的片段版本。

    然而,在使用中,当输入任何起始括号时,ST 调用它自己的代码段,a) 在之后立即插入关闭括号和 b) 从我的代码段中删除焦点,因此永远不会调用正则表达式。

    第一个问题,我已经能够通过捕获开头的括号并调用一个小片段,插入字符本身来缓解。例如:
    { "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" 阻止执行内置自动关闭代码段。
  • 使我自己的小片段返回到前者(即在输入 [ 后焦点返回到 lst 片段)。

  • 如何做到这一点?

    最佳答案

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

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

    我做的是这样的:
    将 lft-snippet 更改为:

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

    对于每个 parens-type 定义一个新的键绑定(bind),它会覆盖默认值并执行一些有用的操作,例如对于 [] 将其添加到键盘映射文件中:
    { "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-snippet 变得更容易阅读(删除正则表达式)。

    我仍然非常想知道以更一般的方式实现这一目标的方法。

    关于autocomplete - 如何避免自动关闭 (, {, [ 在用户定义的 Sublime Text 3 片段中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21639636/

    10-13 09:05