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

解决TextMate Grammar误将结束引号识别为起始引号的问题

解决SQL字符串中{}内容语法高亮的TextMate注入问题

问题根源

之前的第二种方案错误地重新定义了单引号字符串的完整匹配规则,与原SQL语法中已有的单引号处理逻辑冲突——原SQL语法本就负责识别单引号的起始、结束(包括SQL特有的单引号转义,如'abc''def'),自定义的begin: "'"和end: "'"规则会干扰原逻辑,导致结束引号被误判为新的起始引号,进而把后续所有内容标记为字符串。

正确解决方案

不需要重新定义单引号字符串规则,而是直接向原SQL语法的单引号字符串作用域内部注入匹配规则,利用TextMate的作用域嵌套特性实现高亮:

  1. 先确认原SQL语法中单引号字符串的作用域:打开VS Code的「开发者: 检查编辑器令牌和作用域」命令(快捷键Ctrl+Shift+P或Cmd+Shift+P搜索),点击SQL字符串中的任意字符,查看对应的作用域,通常为string.quoted.single.sql。

  2. 编写注入语法配置,示例如下:

{
  "scopeName": "injection.sql.param-highlight",
  "injectTo": ["source.sql"],
  "repository": {
    "param-pattern": {
      "name": "support.class",
      "match": "\\{[^}]*\\}"
    }
  },
  "patterns": [
    {
      "match": "",
      "inside": {
        "string.quoted.single.sql": {
          "patterns": [
            {
              "include": "#param-pattern"
            }
          ]
        }
      }
    }
  ]
}

方案说明

  • injectTo: 指定注入目标为source.sql,由于你的自定义SQL语法通过include: [source.sql]继承了基础SQL语法,该注入规则会自动应用到你的自定义语法中。
  • inside块:精准定位到原SQL的单引号字符串作用域内部,仅在该范围内匹配{...}内容,不会干扰原SQL对字符串起始、结束的判断。
  • 保留了原SQL对单引号转义的处理逻辑,无需额外编写转义匹配规则,避免出现类似'user{id}''s data'这类场景的匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:23:32