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

如何为Nyx语言实现支持缩进延续的TextMate注释语法规则?

如何为Nyx语言实现支持缩进延续的TextMate注释语法规则?

我刚好理解你要实现的这种注释逻辑——用''启动注释,并且后续缩进比启动行更深的行都自动归为注释的一部分。这种规则确实比较少见,不过我们可以通过TextMate的正则捕获和正向预查来实现。

先看你现有的规则,已经捕获了注释起始行的缩进,但缺少对''本身的捕获,以及关键的“判断后续行缩进是否更深”的结束条件。这里给你一套完整的解决方案,我会逐部分解释:

"comments": {
  "patterns": [
    {
      "name": "comment.block.nyx",
      "begin": "(^([ \\t]+))?('')",
      "beginCaptures": {
        "1": { "name": "punctuation.whitespace.comment.leading.nyx" },
        "3": { "name": "punctuation.definition.comment.nyx" }
      },
      "end": "(?=^(?!\\2[ \\t]+|\\s*$)[^ \\t])",
      "contentName": "comment.line.double-apos.nyx",
      "patterns": [
        {
          "match": "^[ \\t]+",
          "name": "punctuation.whitespace.comment.leading.nyx"
        }
      ]
    }
  ]
}

规则细节解释

  • begin正则:(^([ \\t]+))?('')
    这个正则会捕获三个部分:

    • 组1和组2:捕获注释起始行的前置缩进(组2是实际的缩进内容,比如空格或制表符),如果''在行首,这两个组就是空的。
    • 组3:捕获注释启动符''本身,方便我们给它单独的高亮样式。
  • beginCaptures:
    给捕获到的缩进和注释符分配对应的语法作用名,这样VS Code可以根据这些名来应用高亮样式,保持语法一致性。

  • end正则:(?=^(?!\\2[ \\t]+|\\s*$)[^ \\t])
    这是实现缩进延续逻辑的核心,是一个正向预查,意思是:

    当我们遇到一行开头,既不是“比起始缩进更深”(\\2[ \\t]+表示在原缩进基础上再加空格/制表符),也不是全空白行,并且后面跟着非空白字符时,就结束注释块。
    这样全空白行会被保留在注释里,而缩进等于或小于起始缩进的非空行则会触发注释结束,回到代码模式。

  • contentName:
    给整个注释块的内容统一分配注释的语法名,确保所有注释内容都会被高亮为注释样式,包括后续缩进的行。

  • 内部patterns:
    匹配后续注释行的前置缩进,给它们分配缩进对应的语法名,让注释内的缩进也能有统一的样式(如果需要的话)。

测试你的示例场景

我们来验证你给出的几个测试场景:

  1. 行首启动注释的情况:
    This is not a comment
    
    '' This IS a comment
        So is this  # 缩进比起始行深,属于注释
        And this also  # 同样属于注释
    This is NOT a comment  # 缩进等于起始行(0),触发注释结束
    
  2. 行内启动注释的情况:
    some.code(that.isNot(aComment)) '' This IS a comment
        And this second line is too!  # 缩进比代码行深,属于注释
    back.toCode<Again>()  # 缩进回到代码行水平,结束注释
    

这两种场景都能按照你的预期正确识别注释范围。

备注:内容来源于stack exchange,提问作者Richiban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:52:40