首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.tmlanguage转义序列和规则优先级

.tmlanguage转义序列和规则优先级
EN

Stack Overflow用户
提问于 2014-08-25 05:27:27
回答 3查看 1.2K关注 0票数 0

通过解析.tmlanguage文件并将样式应用于NSMutableAttributtedString,我正在用苹果的Swift语言实现语法高亮器。

我正在使用javascript代码、一个javascript.tmlanguage文件和monokai.tmtheme主题(最后一次包含在崇高文本3中)进行测试,以检查语法是否正确突出显示。通过以相同的顺序应用.tmlanguage文件中的每个规则(模式),语法几乎得到了完美的突出显示。

我现在遇到的问题是,当引号(")前面有反斜杠时,我不知道该如何转义引号(“)。我是否遗漏了.tmlanguage文件中指定的内容?另一个问题是,我不知道如何知道其他规则在其他规则内部应该被忽略,例如:

当在字符串中:"http://stackoverflow.com/" a url被识别为//后的注释时,我得到了双斜杠作为注释

此外,当内部注释时,双引号或单引号被视为字符串:// press "Enter" to continue,当与注释颜色相同时,单词"Enter“被突出显示为string。

因此,我不知道某些规则是否优先于其他规则,或者文件中是否有我没有注意到的内容。

救命啊!

更新:

下面是我所说的转义引号的一个更好的例子:

我明白了:

而所有的字母都应该是黄色的,除了转义序列(/")应该是蓝色的。

问题是。我如何知道/“应该被转义?这段代码的规则是:

EN

回答 3

Stack Overflow用户

发布于 2019-01-09 10:31:44

也许我迟了回答这个问题。您可以应用以下方法。

  1. (丑陋) In end regex,使用([^/])("),在endCaptures中使用1= string.quote.double.js 2= punctuation.definition.string.end.js

  1. 如果字符串必须是单行,则可以使用match=(")(.*)(")captures= 1= punctuation.definition.string.begin.js 2= string.quote.double.js 3= punctuation.definition.string.end.js 使用你的patterns

  1. 您可以尝试applyEndPatternLast并查看它是否被允许。设置applyEndPatternLast=1就行了。
票数 1
EN

Stack Overflow用户

发布于 2014-08-25 07:39:52

优先顺序是文件中的早期规则优先于以后的规则。举个例子,在我的Python Improved语言定义中,我有一个作用域,其中包含了在流行的Python框架Django中使用的一系列所有大写常量。我还有一个通用的constant.other.allcaps.python范围,可以识别(几乎)所有大写中的任何内容。由于Django常量规则位于.tmLanguage文件中的.tmLanguage规则之前,所以我可以使用一种颜色对其进行着色,而后面出现的“高亮显示所有大写中的所有内容”只获取不属于第一个列表的标识符。

因此,您应该尽可能早地将“注释”范围放在文件中,然后编写解析器,使其符合我前面描述的规则。但是,它比这稍微复杂一些,因为我认为repository中的项是根据它们的include行的位置而不是在文件中定义存储库规则的位置来排序的。不过,您可能需要做一些测试来验证这一点。

不幸的是,我不知道你说的转义引号是什么意思--你能不能详述一下,然后再加一两个例子呢?

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2022-08-30 22:07:18

假设/是转义双引号的正确字符,下面的操作应该有效:

代码语言:javascript
复制
    "str_double_quote": {
        "begin": "\"",
        "end": "\"",
        "name": "string.quoted.double.swift",
        "patterns": [
            {
                "name": "constant.character.escape.swift",
                "match": "/[\"/]"
            }
        ]
    }

您可以匹配模式中的转义双引号(/")和文字正斜杠(//),以便在使用结束标记来处理它们之前使用它们。

如果转义的字符实际上是反斜杠,那么棘手的一点是,对于JSON编码和正则表达式语法,有两个级别的转义。要匹配\",正则表达式需要转义反斜杠(\\")。JSON要求您转义反斜杠和双引号,导致\\\\\"在TextMate JSON语法文件中。因此,match表达式将是\\\\[\"\\\\]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25479482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档