首页 > 解决方案 > 崇高文本heredoc标签的完整列表?

问题描述

我注意到sublime text 会自动识别某些 heredoc 标签并相应地突出显示语法。

这是一个简单的例子,第一个 heredoc 知道根据 SQL 突出显示语法,但第二个不知道,即使它的内容相同。因此可以推断 sublime '知道'第一个是 SQL,因为 heredoc 标记是SQL)。

在此处输入图像描述

问题:可用的 heredoc 标签的完整列表是什么?

注意:这是在 ruby​​ heredoc 中,但我想它也可能适用于其他语言,尽管我无法确认。

标签: rubysublimetext3

解决方案


这是正在使用的语法定义的函数(在您的情况下,是 Ruby 语法)。或者,如果您愿意,这不是在任何地方都可以使用的东西,一种语言必须专门支持它。

因此,此类 heredocs 的列表确实受限于已知列表,并且为了看到您需要查看相关语言的语法定义。

对于 Ruby(从 build 3211 开始),该列表是HTMLSQLCSSJS(或JAVASCRIPT)和RUBY。在 build 4092 中,语法还包括SH(or SHELL)。所有其他人(例如您的DOC上述内容都是“普通的”)。

如果您想更深入地了解它的工作原理,可以使用View Package File命令面板打开Ruby/Ruby.sublime-syntax以查看与语言匹配的规则。如果您搜索heredoc,您可以看到context包含所有与此匹配的规则,通常如下所示(在构建 3211 中;在构建 4092 中更高级):

    # heredoc with embedded SQL and indented terminator
    - match: '(<<[-~]"?((?:[_\w]+_|)SQL)\b"?)'
      scope: punctuation.definition.string.begin.ruby
      push: [heredoc-sql, trailing-heredoc-start]

在这种情况下,规则说后面跟着 SQL 的 heredoc 说明符应该push是一个名为 的上下文heredoc-sql,它就在下面:

  heredoc-sql:
    - meta_scope: string.unquoted.embedded.sql.ruby
    - meta_content_scope: text.sql.embedded.ruby
    - match: ^\s*\2$
      scope: punctuation.definition.string.end.ruby
      pop: true
    - include: scope:source.sql
    - include: interpolated-ruby
    - include: escaped-char

这里include: scope:source.sql是说语言应该切换到 SQL 模式的魔法酱。它上面的规则pop是导致它“退出”heredoc并返回Ruby的原因。

使用这个公式,可以进行语法修改以包含 Sublime 支持的其他语言。这在 Sublime Text “4” 版本中可能更容易实现,其中语法系统增强之一是扩展语法定义的能力。


推荐阅读