2016-03-02 83 views
2

我想爲Sublime Text 3編寫一個mustache語法定義,但我遇到了HTML標記範圍的問題。覆蓋語法定義中的範圍?

任何鬍鬚變量或節在html標籤外都可以正常工作,但如果它們在裏面,它們將根據標籤的範圍進行樣式設計。

例如:就好像它是一個屬性,並id作爲字符串

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

varblock將被適當地高亮顯示,但enabled將被突出顯示。

有沒有辦法讓鬍子變量和部分優先於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} 

回答

4

我不知道如何與老YAML語法定義做到這一點。但是,由於您使用ST3,因此您可以使用新的.sublime-syntax文件(解釋爲here)。有了這些,您可以在「推送」其他語法定義時定義原型。 在此定義中,您可以通過編寫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 
+0

謝謝!這工作正是我想要的方式。 – emma