将不同的范围应用于Sublime Text语法定义文件中的相同字符

时间:2013-08-22 03:23:00

标签: regex sublimetext2 syntax-highlighting sublimetext knitr

我正在尝试为Sublime Text 2创建一个新的.tmLanguage文件,该文件为knitr和Markdown定义了特殊的隔离代码块。这些块采用以下形式:

```{r example_chunk, echo=true}
x <- rnorm(100)
y <- rnorm(100)
plot(y ~ x, pch=20)
```

有两个部分:(1)参数({r ...})和(2)实际的嵌入代码(在结束}和```之间)。需要应用四个范围来描述这两个部分:

  • punctuation.definition.parameters.begin.knitr
  • punctuation.definition.parameters.end.knitr
  • punctuation.section.embedded.begin.knitr
  • punctuation.section.embedded.end.knitr

使用正则表达式将这些范围与代码的一部分挂钩很容易(部分代码可用here)。但是,其中两个范围需要应用于同一个字符:参数部分中的最终},它结束参数并表示受保护/嵌入代码的开始。

enter image description here

但是,似乎无法将两个范围分配给.tmLanguage文件中的同一字符。无法结束参数部分并开始嵌入部分。定义的第一个范围优先,从而打破语法高亮。

有没有办法使用.tmLanguage语法定义将两个不同的范围应用于Sublime Text中的同一个字符?如果没有,是否有某种方法可以将punctuation.definition.parameters.end.knitrpunctuation.section.embedded.begin.knitr挂钩到两个不同的事情而不是单个{? (请记住,我无法在代码块中添加其他字符。)

3 个答案:

答案 0 :(得分:2)

事实证明,似乎不可能在同一个角色上使用两个标点符号定义(除非有某种方法可以使用一些疯狂的嵌套系统来使其工作)。

但我很幸运找到了一种解决方法:可以将范围分配给\n。所以我可以使用以下正则表达式来模拟重叠范围:

  • (\})将捕获右括号,可用作punctuation.section.embedded.begin.knitr
  • (?<=\})(.*)(\n)会在第二个找到的小组后面的大括号中抓取\n,允许我将其分配给punctuation.section.embedded.begin.knitr

整蛊,但它确实有效。

答案 1 :(得分:0)

我发现了一种简单的方法。 JSON中的示例代码:

{
  "match": "((\w+))",
  "captures": {
    "1": {"name": "scope.one"},
    "2": {"name": "scope.two"}
  }
}

应该据我所知。

另一方面,你可以通过结束第一个范围来做得更好 "match": "(?=(?:\}))"或只是使用ST3语言规范。 :)

答案 2 :(得分:0)

- match: '((what you want to match))'
  captures:
    1: first.scope.name
    2: second.scope.name