3

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

```{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

使用正则表达式将这些范围与部分代码挂钩很容易(部分代码可在此处获得)。但是,其中两个作用域需要应用于同一个字符:}参数部分中的 final,它结束参数并表示围栏/嵌入代码的开始。

在此处输入图像描述

但是,似乎不可能将两个范围分配给 .tmLanguage 文件中的同一个字符。无法结束参数部分并开始嵌入部分。定义的第一个范围优先,从而破坏了语法突出显示。

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

4

3 回答 3

2

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

但幸运的是,我想出了一个解决方法:一个范围可以分配给一个\n. 所以我可以使用以下正则表达式来模拟重叠范围:

  • (\})将捕获右大括号,可用作punctuation.section.embedded.begin.knitr
  • (?<=\})(.*)(\n)将捕获\n以下右大括号作为第二个找到的组,允许我将其分配给punctuation.section.embedded.begin.knitr

棘手,但它的工作原理。

于 2013-08-23T00:27:53.650 回答
0

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

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

据我所知,应该工作。

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

于 2017-05-22T08:50:18.270 回答
0
- match: '((what you want to match))'
  captures:
    1: first.scope.name
    2: second.scope.name
于 2019-01-19T13:18:34.863 回答