visual-studio-code - 如何在 VS Code 语言扩展中优先考虑规则
问题描述
我正在尝试为 VS Code 创建语言扩展。这种语言的注释是单行注释,以分号开头,像这样
command ;comment
为此,我将以下内容放入 tmLanguage.json 的存储库部分:
"comments": {
"name": "comment.lang",
"begin": ";",
"end": "\n"
}
并将其包含在模式部分
{
"include": "#comments"
}
到目前为止,这有效。现在最重要的是,该语言还具有特殊的块,以“;!”开头 与 ”;;” 分别。那些我想被区别对待的人:
"magicString": {
"name": "magicString.lang",
"begin": ";!",
"end": "\n"
},
"commentHeader": {
"name": "commentHeader.lang",
"begin": ";;",
"end": "\n"
},
同样,我将它们包含在模式部分
{
"include": "#magicString"
},
{
"include": "#commentHeader"
}
现在明显的问题是这两个开始完全像一个评论。因此,它们似乎被认可并被视为评论。范围检查器确认标记确实被处理为“comment.lang”。
我怎样才能解决这个问题?有没有办法将一条规则优先于另一条规则?我在TextMate 文档中查找了该主题,但我不明白。我尝试在begin
正则表达式中指定分号重复的次数——我认为这应该有效,但它没有。
"magicString": {
"name": "magicString.lang",
"begin": ";!",
"end": "\n"
},
"commentHeader": {
"name": "commentHeader.lang",
"begin": ";{2}",
"end": "\n"
},
"comments": {
"name": "comment.lang",
"begin": ";{1}",
"end": "\n"
}
解决方案
在您的情况下,一个简单的解决方案是确保三个begin
正则表达式是互斥的。例如,您可以按如下方式更改存储库模式:
"magicString": {
"name": "comment.magic.lang",
"begin": ";!",
"end": "\n"
},
"commentHeader": {
"name": "comment.header.lang",
"begin": ";;",
"end": "\n"
},
"comments": {
"name": "comment.lang",
"begin": ";[^;!]",
"end": "\n"
}
请注意comments
:的正则表达式;[^;!]
表示“;
后面没有;
or字符的!
字符”。
(上述代码段中范围名称的更改与您的问题没有直接关系。这只是我对什么被认为是更好的做法的印象,尽管我警告说我是 TextMate 的完整初学者。)
推荐阅读
- python - 将两个浮点数据帧合并为一个字符串数据帧
- common-lisp - 不能将 acons 添加到空列表中
- python - OpenCv 中的单一颜色级别
- javascript - 使特定的 div 出现在另一个 div 之前
- ios - 通过 iOS 上的免提配置文件呼叫时 BLE 设备断开连接,原因为 722
- .net - Gremlin中TinerGraph转JanusGraph时出现查询错误?
- html - Wrap a sentence into 3 rows at an exact point in a sentence
- sql-server - 如何从中提取“stackoverflow.com”?
- powershell - 如何在PowerShell输出中打印文件夹和文件名
- python - wide_to_long Valueerror : id 变量需要唯一标识每一行