15

検索された用語が見つかった場所ごとにファイル拡張子を尊重する検索結果用の Sublime Text 2 の構文定義ファイルを作成したいと考えています。ドキュメントには、「個別のファイルからの構文定義を組み合わせることができる」と記載されていますが、その方法については記載されていません。

それがどのように機能するかの例はありますか?この質問に対する答え:崇高なテキスト 2: ファイル自体の内部でファイル構文を設定する (Vim モードラインとして)も機能します。

編集

では、友人からのヒント: http://manual.macromates.com/en/language_grammars

これは、別の言語を参照する名前で「include」タグを使用します。それは私にとってはうまくいきますが、残念ながら、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

は結果を 3 つのFind Results.hidden-tmLanguage関連部分に解析します。

  • ファイル名のある行
  • 一致のない抜粋された行
  • 一致のある抜粋された行

これに関するルールは次の<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>

これらは、ファイルを 1 行ずつ調べて、一致するものを探します。一致が見つかった場合、1 つ以上の<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>がテストされます。おもう。

いずれにせよ、Gist はこれらの begin-end-patterns ブロックのいくつかを、XML、HTML、JavaScript、および CSS のファイル タイプと構文ごとに 1 つずつ定義します。正規表現は<being>、ファイル名と特定のファイル拡張子を持つ行と一致します。これは、特定の構文の「コンテキスト」の開始を作成するために使用されます。後続の<patterns>ブロック内の要素が一致しなくなり、<end>正規表現が一致すると、コンテキストは終了します。基本的に、検索結果で強調表示したい構文について、これを肉付けしたいだけだと思います...

これは、その要旨を使用して取得している構文が強調表示された検索結果のスクリーンショットです。

ブリンブリンウェア

私が遭遇した大きな問題は、ブロックコメントが抜粋で始まるが、抜粋にブロックコメントを終了する文字が含まれていない場合です。ブロック コメントは、終了トークンが検索結果の別の場所で検出されるまで続きます。これは、その後の検索にも適用されます。

アップデート:

起動時に何も再コンパイルする必要がないことを追加するつもりでした。ただしFind Results.hidden-tmLanguage、 の変更を有効にするには、Sublime を再起動する必要があることに注意してください。これを何らかのプラグインにすると、変更は主に新しい言語の追加で構成されるように見えますが、これはまれなプラグインの更新である可能性があります.

于 2012-12-19T02:16:13.723 に答える