【问题标题】:Define a VSCode Scheme Syntax rule that "always wins"定义“总是获胜”的 VSCode 方案语法规则
【发布时间】:2020-05-08 02:40:50
【问题描述】:

我想为 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)

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

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

(^|\\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"(未按预期添加嵌套范围)

【问题讨论】:

    标签: visual-studio-code vscode-extensions textmate tmlanguage


    【解决方案1】:

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

    在嵌套情况下不起作用:

    ^[ \t]*o .*
    

    适用于我测试过的所有案例:

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

    文档说:

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

    在多个范围选择器试图被 vscode/textmate 匹配的上下文中,这意味着什么?我不知道。知道的请留言!

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多