在SublimeText2中组合语法定义

Cri*_*ole 15 syntax-highlighting sublimetext2

我想为Sublime Text 2编写一个语法定义文件,用于查找结果,该文件尊重它找到搜索词的每个地方的文件扩展名.该文档提到"可以组合单独文件中的语法定义",但没有提到如何.

有没有人有任何关于它是如何工作的例子?回答这个问题:Sublime Text 2:在文件本身内设置文件语法(如Vim modelines)也可以.

编辑

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

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

tif*_*fon 22

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

我认为你要修改的文件是 ~/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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这些只是逐行浏览文件,并寻找匹配项.如果找到<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>
Run Code Online (Sandbox Code Playgroud)

这种类型的模式最主要的是它有一个<begin>和一个<end>,然后它有它自己的<pattern>部分.当<begin>匹配正则表达式时,<patterns>应用内容直到(这是我真正参差不齐的地方)遇到一个不匹配的令牌,此时对其<end>进行测试.我认为.

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

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

Blingwear

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

更新:

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