如何避免自动关闭(,{,[在用户定义的Sublime Text 3片段?

时间:2014-02-07 23:28:28

标签: autocomplete sublimetext2 sublimetext code-snippets sublimetext3

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

用法如下:

  • 键入lsttab;
  • 插入
  • \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)。

如何实现这一目标?

1 个答案:

答案 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变得更容易阅读(删除正则表达式)。

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