覆盖语法定义中的范围?

时间:2016-03-02 14:27:06

标签: sublimetext3 sublimetext

我正在尝试为Sublime Text 3编写mustache语法定义,但我遇到了HTML标记范围的问题。

任何胡子变量或部分在html标记之外工作正常,但如果它们在里面,则根据标记的范围设置样式。

例如:

{{var}}
{{#block}}
    <div {{#enabled}}class="enabled"{{/enabled}} id="{{id}}"></div>
{{/block}}

varblock将正确突出显示,但enabled将突出显示为属性,id为字符串。

有没有办法让胡子变量和部分优先于HTML标签?

以下是我的语法定义的YAML:

patterns:
- include: text.html.basic

- name: comment.block.mustache
  match: '\{\{!(.*?)\}\}'

- name: markup.mustache
  begin: '\{\{[&>#^] *(.*?) *\}\}'
  beginCaptures:
    '1': {name: entity.name.tag.mustache}
  end: '\{\{\/ *(\1) *\}\}'
  endCaptures:
    '1': {name: entity.name.tag.mustache}
  patterns:
  - include: $self
  - include: text.html.basic
    match: '[\s\S]'

- name: variable.mustache
  begin: '\{\{\{?'
  end: '\}?\}\}'
  captures:
    '0': {name: entity.name.tag.mustache}

1 个答案:

答案 0 :(得分:5)

我不知道如何使用旧的YAML语法定义执行此操作。但是,由于您使用ST3,因此可以使用新的.sublime-syntax文件(解释为here)。有了这些,您可以在&#34;推动&#34;其他语法定义。 在此定义中,您可以通过编写push "Packages/path/to/file.sublime-syntax"来包含其他语法。之后,您可以添加原型,这些原型将在语法中匹配。

我做了一个语法定义,它应该有你想要的行为:

%YAML 1.2
---
name: Mustache
file_extensions: ["mustache"]
scope: text.html.mustache

contexts:
  main:
    - match: ""
      push: "Packages/HTML/HTML.sublime-syntax"
      with_prototype:
        - include: unescape
        - include: comment
        - include: block

  unescape:
    - match: "{{{"
      push: "Packages/HTML/HTML.sublime-syntax"
      with_prototype:
        - match: "}}}"
          pop: true

  comment:
    - match: '{{!(.*?)}}'
      scope: comment.block.mustache

  block:
    - match: "{{"
      scope: meta.block.begin.mustache
      push:
      - match: "}}"
        pop: true
        scope: meta.block.end.mustache
      - include: sections
      - include: variable

  sections:
    - match: "(#|^)(\\w+)\\b"
      captures:
        2: entity.name.tag.mustache
      scope: meta.block.section.start.mustache
    - match: "(/)(\\w+)\\b"
      captures:
        2: entity.name.tag.mustache
      scope: meta.block.section.end.mustache

  variable:
    - match: "\\b\\w+\\b"
      scope: entity.name.tag.mustache