VS Code中“常规代码/文本”的TextMate作用域及插值语法配置问询
TextMate语法配置方案:多行字符串嵌入代码块高亮与有限深度嵌套
常规代码对应的TextMate作用域
如果想让<% %>内的内容和主语言代码高亮一致,要使用主语言的source作用域:
- 自定义语言(如命名为
mylang):source.mylang - 嵌入现有语言(如Python、JavaScript):对应语言的source作用域,比如
source.python、source.js
核心是通过include指令将<% %>块内的内容关联到目标source作用域,替换原来的variable类作用域。
适配有限深度嵌套的语法配置示例
以下是自定义语言mylang的tmLanguage.json配置,实现<<>>多行字符串内嵌入<% %>代码块,同时支持2层有限深度嵌套:
{ "scopeName": "source.mylang", "patterns": [ // 处理<<>>包裹的多行字符串 { "name": "string.quoted.heredoc.mylang", "begin": "(<<)(\\w+)", "beginCaptures": { "1": { "name": "punctuation.definition.string.begin.mylang" }, "2": { "name": "entity.name.tag.mylang" } }, "end": "^\\2$", "endCaptures": { "0": { "name": "entity.name.tag.mylang" } }, "patterns": [ // 第一层<% %>嵌入块 { "name": "meta.embedded.block.mylang", "begin": "<%", "beginCaptures": { "0": { "name": "punctuation.section.embedded.begin.mylang" } }, "end": "%>", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.mylang" } }, "patterns": [ // 引入主语言语法,支持代码内的字符串等规则 { "include": "source.mylang" }, // 第二层嵌套<% %>块(有限深度控制) { "name": "meta.embedded.block.mylang", "begin": "<%", "beginCaptures": { "0": { "name": "punctuation.section.embedded.begin.mylang" } }, "end": "%>", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.mylang" } }, "patterns": [ { "include": "source.mylang" } ] } ] }, // 字符串内的转义字符处理 { "include": "#string-escape" } ] }, // 主语言核心语法规则 { "include": "#main-code" } ], "repository": { "string-escape": { "patterns": [ { "name": "constant.character.escape.mylang", "match": "\\\\." } ] }, "main-code": { "patterns": [ // 关键字高亮 { "name": "keyword.control.mylang", "match": "\\b(if|else|for|while|return)\\b" }, // 单行字符串 { "name": "string.quoted.double.mylang", "begin": "\"", "end": "\"", "patterns": [ { "include": "#string-escape" } ] }, // 变量名高亮 { "name": "variable.other.mylang", "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" } ] } } }
配置说明
- 多行字符串匹配:通过
begin/end规则识别<<TAG开头、TAG行首结束的多行字符串。 - 嵌入代码块高亮:在字符串的
patterns中定义<%/%>块,通过include: "source.mylang"引入主语言语法,让块内内容按常规代码高亮,替代原有的variable作用域。 - 有限深度嵌套:通过在第一层嵌入块内再定义一层
<%/%>规则,实现2层嵌套支持。若需要更多深度,可重复添加嵌套规则(比如再加第三层嵌入块定义)。 - 语言适配:如果嵌入的是其他语言,只需将
include: "source.mylang"替换为对应语言的source作用域(如source.js)即可。
内容的提问来源于stack exchange,提问作者AnHeuermann
相关产品推荐
相关产品推荐

