如何在Sublime Text 3中使XML引用内的LUA语法高亮?

我有一个情况,我在XML字符串内编写了很多LUA代码,说实话,它看起来相当丑陋。 由于文件的主要焦点是LUA,因此能够拥有LUA的语法高亮显得非常重要。 我相当确定这是支持的(显然在某些情况下,SQL是在PHP内部高亮显示的),但是我一直在寻找如何编辑语法文件,但我无从下手。一些解决方案甚至似乎表明我需要编辑一个.tmLanguage文件,但我找不到任何这些文件,也没有sublime-syntax文件看起来是同一种格式。如果情况更容易些,包含LUA的字符串总是以"%function(self)开头,并且它们总是以 end"结尾,在XML中仅需要此高亮功能。

点赞
用户4473405
用户4473405

第一步是打开XML语法定义以进行编辑。我将解释如何操作。任何涉及到“tmLanguage”(XML格式)文件的内容都已经过时了,Sublime Text 3现在使用“sublime-syntax”(YAML格式)文件进行所有默认语法高亮。

我建议克隆官方的git repo https://github.com/sublimehq/Packages(请遵循repo的自述文件中的说明,详细说明了如何以这样的方式克隆一个package,以便您能够使用git将任何未来的更改包括在官方版本中并在自己的版本中使用(因为我们正在覆盖默认版本,该版本会随ST自动升级)(基本上,您需要将repo中的“XML”文件夹放入您的Sublime“Packages”文件夹中,该文件夹可以从ST中通过导航到“首选项->浏览包”菜单项中访问)。

我们感兴趣的文件是“XML/XML.sublime-syntax”。如您所见,它充满了正则表达式。我们最感兴趣的是它解析XML属性的地方。

搜索“double-quoted-string:”。在此行下方立即粘贴以下内容:

- match: '"(?=%function\(self\))'
  scope: string.quoted.double.xml punctuation.definition.string.begin.xml
  push:
    - clear_scopes: true
    - match: '"'
      scope: string.quoted.double.xml punctuation.definition.string.end.xml
      pop: true
    - include: scope:source.lua

请注意,第一个字符(match之前的-)应当和原来的- match: '"'对齐。

保存它,就这样!

基本上,我们所做的是:

  • 在语法检查纯双引号(")之前,它将查找紧随其后的文字字符串%function(self)的双引号。它使用一个正向前瞻来完成这个过程,这样就可以“include”source.lua作用域,并将该%function(self)文本/代码与LUA一起正确地高亮显示(连同其他LUA代码)。
  • 请注意,它使用clear_scopes:true来确保LUA代码不像XML文本/属性。
  • 然后,它查找XML属性引号的结束(")并将上下文从堆栈中弹出,回到普通的XML标签中。(我选择在没有它之前就查找"而不是查找end,这样end仍然会被LUA语法定义所捕获。否则,我们将不得不在XML语法中重复匹配正则表达式和范围,这是不理想的。)

(您可能希望在本地repo中创建一个新分支,并提交这些更改,以便更容易地合并未来的官方更改。)

lua inside xml

2016-10-13 07:03:05