Объединение определений синтаксиса в SublimeText2 - программирование
Подтвердить что ты не робот

Объединение определений синтаксиса в SublimeText2

Я хочу написать файл определения синтаксиса для Sublime Text 2 для поиска результатов, который уважает расширения файлов для каждого места, где он находит искомый термин. В документации упоминается, что "Синтаксические определения из отдельных файлов могут быть объединены" , но не упоминает, как.

Есть ли у кого-нибудь примеры того, как это работает? Ответ на этот вопрос: Sublime Text 2: настройка файла синтаксиса внутри самого файла (как модели Vim) также будет работать.

ИЗМЕНИТЬ

Хорошо, так подскажите один от друга: http://manual.macromates.com/en/language_grammars

Использует тег 'include' с именем для ссылки на другой язык. Это будет работать для меня, но, к сожалению, мне нужно будет написать плагин для повторной компиляции файла каждый раз, когда Sublime Text будет открываться и переписывать его с помощью различных языковых расширений... У вас есть лучшая идея?

4b9b3361

Ответ 1

Недавно я навязчиво обманул выделение синтаксиса ST2 CSS. Мое понимание этих файлов *.tmLanguage основано на пробной версии и ошибке - в основном на ошибке. Я упоминаю об этом, чтобы отметить, что моя хватка является пятнистой, в лучшем случае.

Я думаю, что файл, который вы хотите изменить, ~/Library/Application Support/Sublime Text 2/Packages/Default/Find Results.hidden-tmLanguage

Короче говоря, я думаю, вы хотите настроить его, как этот gist (который имеет либеральные комментарии):

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>. Я думаю.

В любом случае, gist определяет несколько из этих блоков начального шаблона, по одному для каждого типа и синтаксиса XML, HTML, JavaScript и CSS. Регулярное выражение <being> соответствует строке с именем файла и определенным расширением файла. Это используется для создания начала "контекста" для данного синтаксиса. Контекст заканчивается, когда совпадают элементы в последующем повторении соответствия <patterns> и регулярное выражение <end>. Я думаю, вы в основном просто хотите, чтобы это отразилось на тех синтаксисах, которые вы хотите выделить в поиске результатов...

Вот скриншот синтаксически подсвеченных результатов поиска. Я получаю использование этого gist:

Blingwear

Я должен отметить, что большая проблема, с которой я столкнулся, - это когда комментарий блока начинается в выдержке, но выдержка не включает символы, которые заканчивают комментарий блока. Комментарий блока продолжается до тех пор, пока конечный токен не встречается где-то еще в результатах поиска. Это также распространяется на последующие поиски.

Update:

Я хотел добавить, что вам не нужно перекомпилировать что-либо при запуске. Хотя, стоит упомянуть, что вам нужно перезапустить возвышенное, чтобы изменения в Find Results.hidden-tmLanguage вступили в силу. Если вы сделаете это плагин какого-то рода, похоже, что изменения состоят в основном из добавления новых языков, которые могут быть просто нечастым обновлением плагинов.