15

我想为查找结果编写 Sublime Text 2 的语法定义文件,该文件尊重它找到搜索词的每个位置的文件扩展名。该文档提到“可以组合来自不同文件的语法定义”,但没有提及如何组合。

有没有人有任何例子说明它是如何工作的?这个问题的答案:Sublime Text 2:在文件本身内设置文件语法(作为 Vim 模式行)也可以。

编辑

好的,所以请朋友给个小费:http: //manual.macromates.com/en/language_grammars

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

4

1 回答 1

23

最近,我痴迷地欺骗了我的 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

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>

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

无论如何,gist 定义了几个这样的 begin-end-patterns 块,一个用于 XML、HTML、JavaScript 和 CSS 文件类型和语法。正<being>则表达式匹配具有文件名和特定文件扩展名的行。这用于为给定语法创建“上下文”的开头。<patterns>当后续块中的元素停止匹配并且<end>正则表达式匹配时,上下文结束。我认为您基本上只想针对要在查找结果中突出显示的任何语法来充实这一点...

这是我使用该要点获得的语法突出显示的查找结果的屏幕截图:

女装

我应该注意,我遇到的一个大问题是当块注释以摘录开始但摘录不包括结束块注释的字符时。块注释将继续,直到在查找结果的其他地方遇到终止标记。这也延伸到随后的搜索中。

更新:

我的意思是补充一点,您不需要在启动时重新编译任何东西。虽然,值得一提的是,您必须重新启动 sublime 才能使更改Find Results.hidden-tmLanguage生效。如果您将此作为某种插件,似乎更改将主要包括添加新语言,这可能只是不频繁的插件更新。

于 2012-12-19T02:16:13.723 回答