Sublime Text自定义语法突出显示

时间:2016-10-05 16:55:06

标签: sublimetext3 sublimetext sublime-text-plugin

我正在研究自定义语法突出显示并从HTML语法中复制了几个片段,因为这篇文章非常相似。我一直试图弄清楚如何突出标签内的文字。这是我的定义:

- match: "(</?)([a-zA-Z0-9:]+)"
  captures:
    1: punctuation.definition.tag.begin.html
    2: entity.name.tag.other.html
  push:
    - meta_scope: meta.tag.other.html
    - match: '>'
      scope: punctuation.definition.tag.end.html
      pop: true
    - match: '.'
      scope: string.quoted.single.html

Samle text:

<file bash>
Some bash code block
Some bash code block
</file>

我的代码突出显示括号<>filebash关键字,但我无法弄清楚如何为内部块添加颜色。最终我想把它作为一个块评论或类似的东西,所以它会脱颖而出。有什么建议吗?

我需要一个解决方案,避免为没有结束标记的标记添加注释突出显示。例如,我正在使用的标记中有某些标记不使用关闭,例如<tag without close>没有</tag>。在正则表达式中添加排除项的任何方法只有在有开放标记和关闭标记的情况下才有效,但是在只有开放标记的情况下却不行吗?

<tag without close>
This should not be a comment.

<file bash>
This should be a comment.
</file>

This also should not be a comment.

只会使用少量标签,例如上面<tag>,主要用于元数据。

1 个答案:

答案 0 :(得分:2)

一种基于interiors of both <style> and <script> are managed的方式,使用with_prototype pop的方法。

- match: '(?:^\s+)?(<)([a-zA-Z0-9:]+)\b(?![^>]*/>)'
  captures:
    1: punctuation.definition.tag.begin.html
    2: entity.name.tag.other.html
  push:
    - match: '(</)(\2)(>)'
      captures:
        1: punctuation.definition.tag.begin.html
        2: entity.name.tag.other.html
        3: punctuation.definition.tag.end.html
      pop: true
    - match: '>'
      scope: punctuation.definition.tag.end.html
      push:
        - match: '.'
          scope: comment.block.html
      with_prototype:
        - match: (?=</\2)
          pop: true
        - include: main
    - match: '.'
      scope: string.quoted.single.html

请注意,此处([a-zA-Z0-9:]+)与您在问题中的任何有效标记名称相匹配,\2用于稍后匹配该组,两者都在即时解耦match条件和with_prototype条件。 with_protoype定义了应用于当前上下文中所有内容的模式,因此我们在此处使用它来确保在达到pop后我们</file>注释式突出显示,而不是作为评论的一部分。

with_prototype中,- include: main语句可确保您的评论内容中的所有代码都与外部<file>代码相似。例如,下面的<hello><file>的行为相同。

<file bash>
Some bash code block
<hello stuff>
Some bash code block
</hello>
Some bash code block
</file>

如果您的标签没有匹配的结束标记,您可以通过为堆栈上方的那些标记定义特定行为来覆盖此行为,如下所示:

- match: '(?:^\s+)?(<)(hello)\b(?![^>]*/>)'
  captures:
    1: punctuation.definition.tag.begin.html
    2: entity.name.tag.other.html
  push:
    - match: '>'
      scope: punctuation.definition.tag.end.html
      pop: true
    - match: '.'
      scope: string.quoted.single.html

如果此值早于match: '(?:^\s+)?(<)([a-zA-Z0-9:]+)\b(?![^>]*/>)'行,则任何<hello>代码都不会调用注释式突出显示。

此文字不是comment.block.html。 一些bash代码块 一些bash代码块 一些bash代码块