如何在 Sublime Text 3 的 XML 引号内突出显示 LUA 语法?

How do I get LUA syntax highlighting inside of XML quotes in Sublime Text 3?

我有一种情况,我最终在 XML 字符串中编码了很多 LUA, and it looks quite ugly, to be honest. 如果能有 syntax highlighting for the LUA, since that's the main focus of the file 就好了;我相当确定这是受支持的(显然 SQL 在某些情况下会在 PHP 内部突出显示),但我一直在寻找如何编辑语法文件,老实说,我只是被难住了。一些解决方案甚至似乎建议我需要编辑一个 .tmLanguage 文件,但我找不到任何这些文件,并且 sublime-syntax 文件的 none 看起来是同一种格式。

如果它使情况更容易,包含 LUA always 的字符串以 "%function(self) 开头并且它们 alwaysend" 结尾,我真的只想要 XML 中的这个突出显示功能。

第一步是打开 XML 语法定义进行编辑。我将解释如何做到这一点。任何引用 tmLanguage(XML 格式)文件的内容都已过时,Sublime Text 3 现在使用 sublime-syntax(YAML 格式)文件作为所有默认语法高亮显示。

我建议克隆官方 git 存储库 https://github.com/sublimehq/Packages(请按照存储库自述文件中的说明进行操作,其中详细说明了如何以 Sublime Text 提取包的方式克隆包)这样您就可以使用 git 将对官方版本所做的任何未来更改包含到您的版本中(因为我们正在使用此自定义版本覆盖将使用 ST 自动升级的默认版本)。 (基本上,您需要 Sublime Packages 文件夹中的 repo 中的 XML 文件夹,可以通过导航到 Preferences -> Browse 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) text/code 正确突出显示为 LUA(以及LUA 代码的其余部分)。
  • 请注意,它使用 clear_scopes: true 来确保 LUA 代码看起来不像 XML text/attributes.
  • 然后,它会在堆栈中查找关闭的 XML 属性引号 (") 和 "pops" 上下文,返回到普通 XML 标记内. (我选择查找前面没有 end",这样 end 仍然会被 LUA 语法定义选中。否则我们将不得不复制在 XML 语法中匹配正则表达式和范围,这并不理想。)

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