我正在尝试为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)。但是,其中两个范围需要应用于同一个字符:参数部分中的最终}
,它结束参数并表示受保护/嵌入代码的开始。
但是,似乎无法将两个范围分配给.tmLanguage文件中的同一字符。无法结束参数部分并开始嵌入部分。定义的第一个范围优先,从而打破语法高亮。
有没有办法使用.tmLanguage
语法定义将两个不同的范围应用于Sublime Text中的同一个字符?如果没有,是否有某种方法可以将punctuation.definition.parameters.end.knitr
和punctuation.section.embedded.begin.knitr
挂钩到两个不同的事情而不是单个{
? (请记住,我无法在代码块中添加其他字符。)
答案 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