通过解析.tmlanguage文件并将样式应用于NSMutableAttributtedString,我正在用苹果的Swift语言实现语法高亮器。
我正在使用javascript代码、一个javascript.tmlanguage文件和monokai.tmtheme主题(最后一次包含在崇高文本3中)进行测试,以检查语法是否正确突出显示。通过以相同的顺序应用.tmlanguage文件中的每个规则(模式),语法几乎得到了完美的突出显示。
我现在遇到的问题是,当引号(")前面有反斜杠时,我不知道该如何转义引号(“)。我是否遗漏了.tmlanguage文件中指定的内容?另一个问题是,我不知道如何知道其他规则在其他规则内部应该被忽略,例如:
当在字符串中:"http://stackoverflow.com/" a url被识别为//后的注释时,我得到了双斜杠作为注释
此外,当内部注释时,双引号或单引号被视为字符串:// press "Enter" to continue,当与注释颜色相同时,单词"Enter“被突出显示为string。
因此,我不知道某些规则是否优先于其他规则,或者文件中是否有我没有注意到的内容。
救命啊!
更新:
下面是我所说的转义引号的一个更好的例子:
我明白了:

而所有的字母都应该是黄色的,除了转义序列(/")应该是蓝色的。
问题是。我如何知道/“应该被转义?这段代码的规则是:

发布于 2019-01-09 10:31:44
也许我迟了回答这个问题。您可以应用以下方法。
end regex,使用([^/])("),在endCaptures中使用1= string.quote.double.js
2= punctuation.definition.string.end.jsmatch=(")(.*)("),captures= 1= punctuation.definition.string.begin.js
2= string.quote.double.js
3= punctuation.definition.string.end.js
使用你的patternsapplyEndPatternLast并查看它是否被允许。设置applyEndPatternLast=1就行了。发布于 2014-08-25 07:39:52
优先顺序是文件中的早期规则优先于以后的规则。举个例子,在我的Python Improved语言定义中,我有一个作用域,其中包含了在流行的Python框架Django中使用的一系列所有大写常量。我还有一个通用的constant.other.allcaps.python范围,可以识别(几乎)所有大写中的任何内容。由于Django常量规则位于.tmLanguage文件中的.tmLanguage规则之前,所以我可以使用一种颜色对其进行着色,而后面出现的“高亮显示所有大写中的所有内容”只获取不属于第一个列表的标识符。
因此,您应该尽可能早地将“注释”范围放在文件中,然后编写解析器,使其符合我前面描述的规则。但是,它比这稍微复杂一些,因为我认为repository中的项是根据它们的include行的位置而不是在文件中定义存储库规则的位置来排序的。不过,您可能需要做一些测试来验证这一点。
不幸的是,我不知道你说的转义引号是什么意思--你能不能详述一下,然后再加一两个例子呢?
希望这能有所帮助。
发布于 2022-08-30 22:07:18
假设/是转义双引号的正确字符,下面的操作应该有效:
"str_double_quote": {
"begin": "\"",
"end": "\"",
"name": "string.quoted.double.swift",
"patterns": [
{
"name": "constant.character.escape.swift",
"match": "/[\"/]"
}
]
}您可以匹配模式中的转义双引号(/")和文字正斜杠(//),以便在使用结束标记来处理它们之前使用它们。
如果转义的字符实际上是反斜杠,那么棘手的一点是,对于JSON编码和正则表达式语法,有两个级别的转义。要匹配\",正则表达式需要转义反斜杠(\\")。JSON要求您转义反斜杠和双引号,导致\\\\\"在TextMate JSON语法文件中。因此,match表达式将是\\\\[\"\\\\]。
https://stackoverflow.com/questions/25479482
复制相似问题