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

时间:2014-08-25 05:27:27

标签: swift sublimetext2 syntax-highlighting textmate textkit

我通过解析.tmlanguage文件并将样式应用于NSMutableAttributtedString,在Apple的Swift语言中实现语法高亮显示。

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

我现在遇到的问题是,我不知道怎么知道引号(")在它前面有反斜杠时应该被转义(" )。我错过了.tmlanguage文件中指定的内容吗?其他问题是我不知道如何知道其他规则在其他规则内部时应该被忽略,例如:

我在内部字符串中使用双斜杠作为注释:"http://stackoverflow.com/"在//之后将网址识别为注释

在内部评论时,也会将双引号或单引号视为字符串:// press "Enter" to continue,单词"输入"当与评论颜色相同时,它会被突出显示为字符串

所以,我不知道会议中某些规则是否优先于某些规则,或者文件中是否有某些我没有注意到的内容。

请帮忙!

更新

这是一个更好的例子,我用逃避引号来表示:

我得到这个:enter image description here所有字母都应该是黄色的,除了转义序列(/")应该是蓝色。

问题是。我怎么知道/"应该逃脱?该段代码的规则是:

enter image description here

2 个答案:

答案 0 :(得分:0)

优先级是文件中的早期规则优先于以后的规则。例如,在我的Python Improved语言定义中,我有一个范围,其中包含Django中使用的一系列全大写常量,Django是一个流行的Python Web框架。我还有一个通用的constant.other.allcaps.python范围,可以识别(几乎)所有大写字母中的任何内容。由于Django常量规则在allcaps文件中的.tmLanguage规则之前,我可以使用一种颜色使用主题对其进行着色,而后来出现的“突出显示所有大写中的所有内容”只会抓取标识符不属于第一个列表。

因此,您应该尽可能早地将“comments”范围放在文件中,然后以符合上述规则的方式编写解析器。但是,它稍微复杂一些,因为我认为repository中的项目的优先级基于其include行的位置,而不是文件中定义的存储库规则的位置。但是,您可能需要进行一些测试来验证这一点。

不幸的是,我不确定你对转义引号的意思 - 你可以扩展它,也许可以添加一两个例子吗?

希望这有帮助。

答案 1 :(得分:0)

也许我来晚了。您可以应用以下方法。

  1. (丑) 在您的end正则表达式中,使用([^/])("),在您的endCaptures中,
      

    1 = string.quote.double.js
      2 = punctuation.definition.string.end.js

  2. 如果字符串必须为单行,则可以使用match=(")(.*)(")captures=
      

    1 =标点符号.definition.string.begin.js
      2 = string.quote.double.js
      3 =标点符号.definition.string.end.js
      并使用您的patterns

  3. 您可以尝试applyEndPatternLast,看看是否允许使用。设置applyEndPatternLast=1即可。