tmLanguage使用开始结束规则突出显示语法而不突出显示没有结束的开头

时间:2016-08-25 13:13:33

标签: syntax-highlighting tmlanguage

我正在创建一个简单的后缀编程语言。语法如下: 2 3 add将两个整数23加在一起。 "hello, world!" puts将字符串"hello, world!"放入STDOUT。

可以使用的新功能的定义如下:

"fourth_pow"
  "This function raises the argument on the top of the stack to the fourth power."
  [
    dup dup dup mul mul mul
  ]
def

空格和换行符在语言语法中并不重要。这意味着上面的定义也可以作为"fourth_pow" "..." [ dup dup dup mul mul mul] def(但当然,这不太可读)。

我现在想强调这种语言的语法,这样在上面的定义语句中,新定义的函数名称和def关键字都会突出显示。

.tmLanguage文件(YAML格式)中的代码段为:

definition:
    name: "entity.other.function.jux-beta_syntax"
    begin: ("([a-zA-Z_][\w]*[?!]?)")
    end: (def)
    beginCaptures:
      '1': {name: "entity.name.function.jux-beta_syntax"}
    contentName: "support.constant.jux-beta_syntax"
    patterns:
    - include: '#comment'
    - include: '#quotation_start'
    - include: '#quotation_end'
    - include: '#string'
    - include: '#identifier'
    - include: '#integer'

(参见整个文件here

这'工作',但这意味着当我在文件的末尾开始一个新的字符串时,它会被突出显示,好像它是一个函数定义。这是因为'开始' #definition规则的一部分匹配。但我想要发生的事情是,只有在比赛结束时才对其进行着色。

有没有办法使用tmLanguage格式?

1 个答案:

答案 0 :(得分:1)

主要问题是,至少在Sublime Text(我没有测试TextMate或VSCode)中,正则表达式引擎只能使用.tmLanguage文件一次匹配一行。因此,像这样:

(?m:("([a-zA-Z_][\w]*[?!]?)")(.*)(def))

使用?m:多行选项(.匹配换行符)将无效,尽管它在Ruby中运行良好(正则表达式引擎基于Oniguruma)。由于语法突出显示一次只能输入一行,因此只要输入双引号字符串,beginCaptures就会匹配。当然,一旦函数的主体和def被写入,所有内容都会适当地突出显示。

很遗憾,我不能流利地为您提供相关的工作示例,但您可能希望在最新版本的sublime-syntax中查看新的Sublime Text 3格式。它使用堆栈运行,因此您可以推送和弹出上下文,允许在多行上进行匹配。在“选定的示例”部分中,以Bracket Balancing为例 - 它突出显示右括号)而没有匹配的开头paren (

祝你好运!