我正在尝试为 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/