我想制作一个小型 VS Code 扩展,为 C/C++ 代码中的少数自定义关键字添加语法突出显示。
我正在尝试通过注入语法来做到这一点source.c
and source.cpp
语言范围,遵循VS Code 语法高亮指南 https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide#injection-grammars。根据指南,在注入选择器范围前加上前缀L:
意味着“注入的语法规则将在任何现有语法规则之前应用”。这似乎适用于 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
(字符串和注释除外):
{
"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"
}
}
}
In C, things work as expected:
![par_for highlighting in C: correct](https://i.stack.imgur.com/Z1mEw.png)
But in C++, par_for
gets treated like a function name:
![par_for highlighting in C++: wrong](https://i.stack.imgur.com/J51nt.png)
屏幕截图取自禁用所有扩展的 VS Code 测试实例。
C++ 中的问题显然是由下面的括号触发的par_for
;如果我写,说,par_for foo
,那么keyword.control.parfor
范围适用于par_for
正如预期的那样。
有没有办法确保我注入的语法模式优先于 C++ 语法正在执行的任何操作?