Visual Studio Code语言扩展继承现有功能

8
在Visual Studio Code中,只需提供一个语法文件(例如,通过JSON)就可以相对容易地添加自己的语言扩展。我想为我使用的特定脚本语言提供一个语法文件。该脚本语言嵌入在ARM汇编源代码中,而这已经存在一个插件。因此,我基本上想通过我的脚本语言扩展ARM Extension。目前是否可能实现这一点?在我看来,这将是我处理的方式,因为如果我只复制现有的扩展(它是MIT许可),我将事实上创建一个硬分叉,这不是我的意图。
1个回答

13

1. 注入

您可以通过将以下内容添加到package.json中来将语言扩展注入到父作用域的范围内:

"contributes": {
    "grammars": [
        {
            "scopeName": "source.asm.x86_64.your_syntax_extension",
            "path": "./syntaxes/your_syntax_extension.json",
            "injectTo": [ "source.asm.x86_64" ]
        }
    ]
}

2. 包含

如果您的语言扩展使用自定义文件类型或者您想要覆盖一些父级作用域的语法定义,您可以编写自己的定义并包含父级作用域。您可以使用以下任意一种格式:

your_syntax_extension.json

{
  "fileTypes": [
    "myExtension"
  ],
  "name": "Your Syntax Extension",
  "patterns": [
    {
      "include": "source.asm.x86_64"
    }
  ],
  "scopeName": "source.asm.x86_64.your_syntax_extension"
}

你的语法扩展.tmLanguage

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>fileTypes</key>
    <array>
        <string>myExtension</string>
    </array>
    <key>name</key>
    <string>Your Syntax Extension</string>
    <key>patterns</key>
    <array>
        <dict>
            <key>include</key>
            <string>source.asm.x86_64</string>
        </dict>
    </array>
    <key>scopeName</key>
    <string>source.asm.x86_64.your_syntax_extension</string>
</dict>
</plist>

对于这两种情况,您可能希望将扩展包包含为依赖项。为此,请将其唯一标识符添加到您的package.json中:

在两种情况下,您可能希望将扩展程序包包含为依赖项。要这样做,请将其唯一标识符添加到您的package.json中:

"extensionDependencies": [
    "13xforever.language-x86-64-assembly"
]

谢谢您的解释,我想补充一下,为了使注入功能正常工作,我不得不在我的语法配置JSON中添加"injectionSelector": "L:source"。我还添加了另一个扩展的依赖项,但至少在开发主机VS Code中似乎被忽略了。这个限制只有在扩展程序发布到商店或安装到非开发主机上时才会被强制执行吗?无论如何,我接受了您的答案,因为那绝对是正确的方法。 - Karathan
1
我给一个没有 extensionDependencies 的包添加了它,但是 VSCode 没有安装它。不过,我可以向您保证它对我的已发布的包有效。 - idleberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接