我正在尝试为ST3写一个相当无辜的片段。用于插入
\left<open-parens> \right<close-parens>
在数学范围内进入乳胶文档。
我现在拥有的是:
<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:[}
的代码段版本。
然而在使用中,当键入任何起始parens时,ST会调用它自己的代码片段,a)紧接着插入紧密的parens和b)从我的代码片段中删除焦点,因此永远不会调用正则表达式。
第一个问题,我已经能够通过捕捉开放的parenses并调用一个小片段,插入角色本身来缓解。 E.g:
{ "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-snippet)。如何实现这一目标?
答案 0 :(得分:0)
这不是我正在寻找的答案,而是这个特定问题的有效解决方案。
使用外观略有不同,但所需的击键是相同的。
我做的是这样的: 将lft-snippet更改为:
<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-snippet变得更容易阅读(删除正则表达式)。
我仍然非常想知道如何以更一般的方式实现这一目标。