在SublimeText2中组合语法定义

时间:2012-09-21 15:00:41

标签: syntax-highlighting sublimetext2

我想为Sublime Text 2编写一个语法定义文件,用于查找结果,该文件尊重每个找到搜索词的地点的文件扩展名。该文档提到了"Syntax definitions from separate files can be combined",但未提及如何。

有没有人有任何关于它是如何工作的例子?这个问题的答案:Sublime Text 2: Setting file syntax inside the file itself (as Vim modelines)也可以。

修改

好的,请朋友提示:http://manual.macromates.com/en/language_grammars

使用带有名称的'include'标记来引用另一种语言。这对我有用,但不幸的是,每次Sublime Text打开时我都需要编写一个插件来重新编译文件,并用各种语言扩展重新编写它...任何机会你们都有更好的主意吗?

1 个答案:

答案 0 :(得分:22)

最近,我痴迷于欺骗我的ST2 CSS语法高亮。我对这些* .tmLanguage文件的理解是基于反复试验 - 主要是错误。我提到这一点,注意我的掌握是 spotty ,充其量。

我认为您要修改的文件是~/Library/Application Support/Sublime Text 2/Packages/Default/Find Results.hidden-tmLanguage

长话短说,我想你想把它设置得像这个要点(有自由评论):

https://gist.github.com/4333623#file-find-results-hidden-tmlanguage

典型的文件查找结果将如下所示:

Searching 11 files for "feedback-assistance-form" (regex)

/_projects/___/group_reg.js:
   60       });
   61  
   62:      $asstForm = $help.find('#feedback-assistance-form');
   63  
   64       if (!$asstForm.length) {
   65:          console.log('WARN: Feedback assistance: #feedback-assistance-form not found');
   66           return;
   67       }

/_projects/___/group_register_help_tmpl.html:
    6  <div id="group-reg-help">
    7  
    8:  <form id="feedback-assistance-form" class="js-popover help-content hide" action="{% url info.views.assistance_request %}" method="post">
    9       
   10       <legend>Need Assistance?</legend>

3 matches across 2 files

Find Results.hidden-tmLanguage将结果解析为3个相关部分:

  • 文件名为
  • 的行
  • 没有匹配的摘录行
  • 带匹配的摘录行

此规则位于<patterns>部分:

<key>patterns</key>
<array>
    <dict>
        <key>match</key>
        <string>^([^ ].*):$</string>
        <key>captures</key>
        <dict>
            <key>1</key>
            <dict>
                <key>name</key>
                <string>entity.name.filename.find-in-files</string>
            </dict>
        </dict>
    </dict>
    <dict>
        <key>match</key>
        <string>^ +([0-9]+) </string>
        <key>captures</key>
        <dict>
            <key>1</key>
            <dict>
                <key>name</key>
                <string>constant.numeric.line-number.find-in-files</string>
            </dict>
        </dict>
    </dict>
    <dict>
        <key>match</key>
        <string>^ +([0-9]+):</string>
        <key>captures</key>
        <dict>
            <key>1</key> <!-- capture group 1 -->
            <dict>
                <key>name</key>  <!-- name it so it can be colored -->
                <string>constant.numeric.line-number.match.find-in-files</string>
            </dict>
        </dict>
    </dict>
</array>

这些只是逐行浏览文件,并寻找匹配项。如果找到匹配项,则将一个或多个<key>name</key>定义应用于匹配的捕获组(如果有)。这些name定义在主题定义文件中引用(例如,Monokai),颜色应用于与指定捕获组匹配的字符。

上述模式只与捕获组匹配。我认为这种限制是匹配(或它的捕获组)无法进一步处理。

在要点中应用的是格式的模式:

<key>patterns</key>
<array>
    <dict>
        <key>begin</key>

<!-- add the filetype extensions, here -->
<!-- these are XML formatted files: -->

        <string>^([^ ].*\.(?:xml|tmLanguage|hidden-tmLanguage|tmTheme):)$</string>
        <key>beginCaptures</key>
        <dict>
            <key>1</key>
            <dict>
                <key>name</key>
                <string>entity.name.filename.find-in-files</string>
            </dict>
        </dict>
        <key>end</key>
        <string>^[^ ]</string>
        <key>patterns</key>
        <array>
            <dict>
                <key>include</key>
                <string>#line-numbers</string>
            </dict>
            <dict>
                <key>include</key>


<!-- which syntax should match up to the filetype extensions listed above: -->
<!-- to find out what the "scopeName" is, refer to the corresponding *.tmLanguage file -->
<!-- for XML, this is ~/Library/Application Support/Sublime Text 2/Packages/XML/XSL.tmLanguage -->

                <string>text.xml</string>
            </dict>
        </array>
    </dict>
    <!-- ... can have many more -->
</array>

此类模式的主要内容是它有<begin><end>,然后它有自己的<pattern>部分。当<begin>正则表达式匹配时,<patterns>的内容将被应用,直到(这是我非常不稳定的地方)遇到不匹配的令牌,此时<end>被测试。我想。

无论如何,要点定义了几个这样的开始 - 结束模式块,每个模块对应一种XML,HTML,JavaScript和CSS文件类型和语法。 <being>正则表达式将该行与文件名和特定文件扩展名匹配。这用于为给定语法创建“上下文”的开头。当后续<patterns>块中的元素停止匹配且<end>正则表达式匹配时,上下文结束。我认为你基本上只想在发现结果中想要突出显示哪种语法来充实...

以下是我使用该要点的语法突出显示结果的屏幕截图:

Blingwear

我应该注意,我遇到的一个大问题是在摘录中开始阻止注释但摘录不包括结束阻止注释的字符。块注释将继续,直到在查找结果中的其他位置遇到终止令牌。这也延伸到后续搜索中。

更新

我想补充一点,你不需要在启动时重新编译任何东西。 虽然,但值得一提的是,您必须重新启动sublime才能使Find Results.hidden-tmLanguage中的更改生效。如果你把它变成某种类型的插件,似乎更改主要包括添加新语言,这可能只是一个不常见的插件更新。