You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
        }
      ]
    }
  }
}

配置说明

  1. 多行字符串匹配:通过begin/end规则识别<<TAG开头、TAG行首结束的多行字符串。
  2. 嵌入代码块高亮:在字符串的patterns中定义<%/%>块,通过include: "source.mylang"引入主语言语法,让块内内容按常规代码高亮,替代原有的variable作用域。
  3. 有限深度嵌套:通过在第一层嵌入块内再定义一层<%/%>规则,实现2层嵌套支持。若需要更多深度,可重复添加嵌套规则(比如再加第三层嵌入块定义)。
  4. 语言适配:如果嵌入的是其他语言,只需将include: "source.mylang"替换为对应语言的source作用域(如source.js)即可。

内容的提问来源于stack exchange,提问作者AnHeuermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:17:49