3

我想在 markdown 中添加一些额外的语法高亮。

我定义了一个注入语法:

{
  "scopeName": "markdown.mytodos",
  "injectionSelector": "L:text.html.markdown",
    "patterns": [
        { "include": "#todo" }
  ],
    "repository": {
        "todo": {
        "match": "^[ \t]*o .*",
        "_comment": "Line start, tabs or spaces, then literal `o` and a space",
        "name": "entity.name.tag.css"
    }
  }
}

结果:

我希望看到我对这两个例子的规则,但它只适用于第一个:

foo
o bar <- correct scope

foo
    o bar <- wrong scope (meta.paragraph.markdown)

所以看起来我的范围没有占用,即使正则表达式匹配(单独测试)。

我查了一下,Markdownmeta.paragraph.markdown用这个begin规则定义:

(^|\\G)[ ]{0,3}(?=\\S)

这个while规则:

(^|\\G)((?=\\s*[-=]{3,}\\s*$)|[ ]{4,}(?=\\S))

我目前的理论是,这种未while封闭的状态阻碍了我的规则。

问题:

  1. 开放规则是否会阻止任何其他匹配的发生?
  2. 我如何告诉我的 vscode/textmate 语法我希望它一直“赢”,即使在不同的范围内?

我努力了:

  1. 使用开始/结束规则而不是match(无变化)
  2. 将语言定义为的子集,meta.paragraph.markdown而不是text.html.markdown:("injectionSelector": "L:meta.paragraph.markdown"不按预期添加嵌套范围)
4

1 回答 1

1

我发现更改匹配模式可以解决问题。

在嵌套情况下不起作用:

^[ \t]*o .*

适用于我测试过的所有情况:

(^|\G)[ \t]*o .*

文档说:

\G 断言位置在前一个匹配的结尾或第一个匹配的字符串的开头

在尝试与 vscode/textmate 匹配的多个范围选择器的上下文中,这意味着什么?我不确定。知道的请戳进来!

于 2020-01-22T02:30:13.127 回答