【问题标题】:How to reference an injected grammar within a custom VSCode language如何在自定义 VSCode 语言中引用注入的语法
【发布时间】:2020-02-24 21:26:58
【问题描述】:

为下文作序。可以在以下位置找到说明此问题的演示项目: https://github.com/kirksl/so60384141

我可以在原生 VSCode 语言中引用注入语法

指定这个(package.json)

        "grammars": 
        [
            {
                "scopeName": "source.js.mylang",
                "path": "./syntaxes/mylang-js.tmLanguage.json",
                "injectTo": ["source.js"]
            }
        ]

还有这个(./syntaxes/mylang-js.tmLanguage.json)

{
  "scopeName": "source.js.mylang",
  "injectionSelector": "L:source",
  "patterns": [
    {
      "include": "#todo-keyword"
    }
  ],
  "repository": {
    "todo-keyword": {
      "match": "TODO",
      "name": "keyword.todo"
    }
  }
}

我看到了这个(.js 文件,本机 JS)

到目前为止一切顺利。

但是,我似乎无法在下面详述的自定义语言中引用相同的注入语法。带有三引号的围栏代码块应该使用它。

现在更新这个(package.json)

        "languages": [
            {
                "id": "mylang",
                "aliases": ["Mylang", "mylang"],
                "extensions": [".mylang"],
                "configuration": "./language-configuration.json"
            }
        ],
        "grammars": 
        [
            {
                "language": "mylang",
                "scopeName": "source.mylang",
                "path": "./syntaxes/mylang.tmLanguage.json",
                "embeddedLanguages": {
                    "meta.embedded.block.javascript": "javascript"
                }
            },
            {
                "scopeName": "source.js.mylang",
                "path": "./syntaxes/mylang-js.tmLanguage.json",
                "injectTo": ["source.js"]
            }
        ]

另外指定这个 (./syntaxes/mylang-js.tmLanguage.json)

    "fenced-expression": {
      "begin": "(^|\\G)\\s*[\"]{3}\\s*$",
      "end": "(^|\\G)\\s*[\"]{3}\\s*$",
      "contentName": "meta.embedded.block",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "endCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "patterns": [
        {
          "begin": "^(\\s*)(?=[\\S&&[^{<\\[]])",
          "while": "^(?!\\s*[\"]{3}\\s*)",
          "contentName": "meta.embedded.block.javascript",
          "patterns": [
            {
              "include": "source.js"
            }
          ]
        }
      ]
    }

我看到了这个(.mylang 文件,JS 突出显示,TODO 未突出显示)

最后只是显示一些管道是为了启用我正在寻找的突出显示

如果我将"include": "source.js" 切换为"include": "source.js.mylang"

    "fenced-expression": {
      "begin": "(^|\\G)\\s*[\"]{3}\\s*$",
      "end": "(^|\\G)\\s*[\"]{3}\\s*$",
      "contentName": "meta.embedded.block",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "endCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "patterns": [
        {
          "begin": "^(\\s*)(?=[\\S&&[^{<\\[]])",
          "while": "^(?!\\s*[\"]{3}\\s*)",
          "contentName": "meta.embedded.block.javascript",
          "patterns": [
            {
              "include": "source.js.mylang"
            }
          ]
        }
      ]
    }

我看到了这个(.mylang 文件,JS 未突出显示,TODO 突出显示)

【问题讨论】:

  • 嗯,仍然不确定我们是否具备复制所需的一切。 mylang.tmLanguage.json 是什么样的?你只显示mylang-js.tmLanguage.json
  • @Gama11 我在github.com/kirksl/so60384141发布了一个演示项目
  • 感谢您指出"patterns":[{"include": "source.js.mylang"}] 以实际使用语法高亮

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


【解决方案1】:

你还需要将mylang-js.tmLanguage.json注入source.mylanginjectTo只适用于顶级作用域名称,见解释here):

{
    "scopeName": "source.js.mylang",
    "path": "./syntaxes/mylang-js.tmLanguage.json",
    "injectTo": ["source.js", "source.mylang"]
}

然后它似乎按预期工作:

此外,您必须调整您的 injectionSelector 以确保 TODO 突出显示仅适用于嵌入式 JS 块中的 cmets:

"injectionSelector": "L:comment.line.double-slash.js"

【讨论】:

  • 我按照您对“injectTo”的建议添加了“source.mylang”,并看到 TODO 突出显示,但我发现了一个问题。如果您删除“//”或在不是 JS 的围栏三引号之外使用 TODO,它仍然突出显示 TODO。真的希望只扩展带有 TODO 突出显示的 JS 代码。
  • 使用正确的injectionSelector 似乎可以解决这两个问题(请参阅我的更新答案)。
  • 好点。我的监督。非常感谢您帮助我解决这个问题。我欠你一杯啤酒或任何你订阅的饮料。对此设置感到好奇的是,此时甚至需要语法中“javascript”的“embeddedLanguages”?删除它没有任何区别。
  • 好问题。除了语法高亮之外,编辑器功能似乎有必要在嵌入式语言中正常工作,例如“切换行注释”,另请参见:github.com/microsoft/vscode/issues/34598
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2020-07-13
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2018-03-04
相关资源
最近更新 更多