【问题标题】:VS Code: Injection grammar scope for custom keyword is overriden in C++VS Code:自定义关键字的注入语法范围在 C++ 中被覆盖
【发布时间】:2022-11-11 19:05:55
【问题描述】:

我想制作一个小的 VS Code 扩展来为 C/C++ 代码中的一些自定义关键字添加语法高亮。

我正在尝试使用source.csource.cpp 语言范围内的注入语法来做到这一点,遵循VS Code syntax highlighting guide。根据指南,在注入选择器范围前加上 L: 意味着“[the] 注入语法的规则将在任何现有语法规则之前应用”。这似乎适用于 C 代码,但在 C++ 中,一些(但不是全部)语法规则会覆盖我注入的语法。

对于 MWE,假设我想为并行循环添加一个 par_for 关键字。

我在package.json 中定义了扩展名:

{
    ...
    "contributes": {
        "grammars": [{
            "scopeName": "parfor.injection",
            "path": "./syntaxes/parfor.injection.json",
            "injectTo": ["source.c", "source.cpp"]
        }]
    }
}

syntaxes/parfor.injection.json 中的注入语法将我的新范围keyword.control.parfor 应用于par_for 的所有实例(字符串和cmets 除外):

{
    "scopeName": "parfor.injection",
    "injectionSelector": [
        "L:source.c -string -comment",
        "L:source.cpp -string -comment"
    ],
    "patterns": [
        { "include": "#parfor-keyword" }
    ],
    "repository": {
        "parfor-keyword": {
            "name": "keyword.control.parfor",
            "match": "\\bpar_for\\b"
        }
    }
}

在 C 中,事情按预期工作:

但在 C++ 中,par_for 被视为函数名:

屏幕截图取自禁用所有扩展的 VS Code 测试实例。

C++ 中的问题显然是由par_for 后面的括号触发的;如果我写,比如说,par_for foo,那么keyword.control.parfor 范围会按预期应用于par_for

有没有办法确保我注入的语法模式优先于 C++ 语法所做的任何事情?

【问题讨论】:

  • 我正在尝试做同样的事情,只是我的添加更简单:Byte、Word16 等。我尝试按照您的示例进行操作,但是没有可以在我的安装中创建 Byte.injection.json 的 syntaxes/ 目录(在~/.vscode。你能为你的文件添加提供完整的路径名和更多上下文吗?Byte.injection.json 文件在哪里?任何帮助表示赞赏。你有没有成功解决你的问题?

标签: c++ visual-studio-code syntax-highlighting textmate


【解决方案1】:

很抱歉没有提供太多解释,我也没有完全理解这一点,但这有效:

{
    "scopeName": "par_for.injection",
    "injectionSelector": "meta.body -string -comment",
    "patterns": [{"include": "#par_for-keyword"}],
    "repository": {
        "par_for-keyword": {
            "match": "par_for",
            "name": "keyword.par_for"
        }
    }
}

真正的区别是meta.body

我从您的帖子中提取了-string -comment,谢谢!这个答案对你来说可能已经晚了,但我会把它留给下一个读者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 2019-11-11
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多