首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在自定义VSCode语言中引用注入语法

问如何在自定义VSCode语言中引用注入语法
EN

Stack Overflow用户
提问于 2020-02-25 05:26:58
回答 1查看 1K关注 0票数 3

下面是前言。说明此问题的演示项目可在以下位置找到:https://github.com/kirksl/so60384141

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

指定此(package.json)

代码语言:javascript
复制
        "grammars": 
        [
            {
                "scopeName": "source.js.mylang",
                "path": "./syntaxes/mylang-js.tmLanguage.json",
                "injectTo": ["source.js"]
            }
        ]

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

代码语言:javascript
复制
{
  "scopeName": "source.js.mylang",
  "injectionSelector": "L:source",
  "patterns": [
    {
      "include": "#todo-keyword"
    }
  ],
  "repository": {
    "todo-keyword": {
      "match": "TODO",
      "name": "keyword.todo"
    }
  }
}

我看到了这个(.js文件,原生JS)

​

​

到目前一切尚好。

然而,我似乎不能在我的自定义语言中引用相同的注入语法,如下所述。带有三重引号的围栏代码块应该利用它。

更新,现在,这个(package.json)

代码语言:javascript
复制
        "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)

代码语言:javascript
复制
    "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"

代码语言:javascript
复制
    "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突出显示)

​

​

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 03:38:09

您还需要将mylang-js.tmLanguage.json注入到source.mylang中(injectTo仅适用于顶级作用域名称,请参阅解释here):

代码语言:javascript
复制
{
    "scopeName": "source.js.mylang",
    "path": "./syntaxes/mylang-js.tmLanguage.json",
    "injectTo": ["source.js", "source.mylang"]
}

然后它看起来就像预期的那样工作:

​

​

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

代码语言:javascript
复制
"injectionSelector": "L:comment.line.double-slash.js"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60384141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档