如何为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:捕获注释启动符
''本身,方便我们给它单独的高亮样式。
- 组1和组2:捕获注释起始行的前置缩进(组2是实际的缩进内容,比如空格或制表符),如果
beginCaptures:
给捕获到的缩进和注释符分配对应的语法作用名,这样VS Code可以根据这些名来应用高亮样式,保持语法一致性。end正则:(?=^(?!\\2[ \\t]+|\\s*$)[^ \\t])
这是实现缩进延续逻辑的核心,是一个正向预查,意思是:当我们遇到一行开头,既不是“比起始缩进更深”(
\\2[ \\t]+表示在原缩进基础上再加空格/制表符),也不是全空白行,并且后面跟着非空白字符时,就结束注释块。
这样全空白行会被保留在注释里,而缩进等于或小于起始缩进的非空行则会触发注释结束,回到代码模式。contentName:
给整个注释块的内容统一分配注释的语法名,确保所有注释内容都会被高亮为注释样式,包括后续缩进的行。内部
patterns:
匹配后续注释行的前置缩进,给它们分配缩进对应的语法名,让注释内的缩进也能有统一的样式(如果需要的话)。
测试你的示例场景
我们来验证你给出的几个测试场景:
- 行首启动注释的情况:
This is not a comment '' This IS a comment So is this # 缩进比起始行深,属于注释 And this also # 同样属于注释 This is NOT a comment # 缩进等于起始行(0),触发注释结束 - 行内启动注释的情况:
some.code(that.isNot(aComment)) '' This IS a comment And this second line is too! # 缩进比代码行深,属于注释 back.toCode<Again>() # 缩进回到代码行水平,结束注释
这两种场景都能按照你的预期正确识别注释范围。
备注:内容来源于stack exchange,提问作者Richiban
相关产品推荐
相关产品推荐

