VS Code扩展开发:如何在tmLanguage的match中嵌入仓库自定义模式
如何在lang.tmLanguage.json中嵌入已定义的模式
在VS Code的Textmate语法定义文件(lang.tmLanguage.json)中,不能直接在match字段的正则表达式里用<#A>这类语法引用已定义模式,需要通过include字段结合begin/end或patterns数组来实现嵌入。
方法一:用begin+end+patterns组合匹配结构
针对你需要的start <#A> <#B>结构,可以这样定义:
{ "X": { "begin": "start\\s+", "end": "$", "patterns": [ { "include": "#A" }, { "include": "#B" } ] } }
begin匹配开头的start及后续空白字符end匹配行尾,限定匹配范围patterns数组按顺序引用已定义的#A和#B模式,会自动匹配start之后的对应内容
方法二:直接用patterns数组组合模式
如果不需要固定的前后缀,也可以直接把各部分模式组合到patterns里:
{ "X": { "patterns": [ { "match": "start\\s+" }, { "include": "#A" }, { "include": "#B" } ] } }
这种方式会让X模式依次匹配start、#A、#B对应的内容。
处理可选模式(如示例中的<#inheritance>?)
要实现可选匹配的效果,只需给引用的模式添加optional: true属性:
{ "class-def": { "begin": "class\\s+[\\w\\d_]+\\s*", "end": "$", "patterns": [ { "include": "#inheritance", "optional": true }, { "include": "#class-body" } ] } }
这样#inheritance对应的模式就会变成可选匹配项,和正则里的?效果一致。
内容的提问来源于stack exchange,提问作者Superior
相关产品推荐
相关产品推荐

