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

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

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

ИЗМЕНИТЬ

Хорошо, тогда совет от друга: http://manual.macromates.com/en/language_grammars

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


person Chris Pfohl    schedule 21.09.2012    source источник
comment
Это не определение синтаксиса, но может помочь: http://css-tricks.com/exclude-compiled-css-from-sublime-text-2-projects/   -  person runningRhetoric    schedule 16.11.2012
comment
Не совсем то, что я искал... Я доволен результатами поиска... ммм, "результатами". Я надеялся на лучшую подсветку синтаксиса   -  person Chris Pfohl    schedule 16.11.2012
comment
Я ищу что-то похожее и наткнулся на этот blog.macromates.com /2012/injection-grammars-project-variables. Однако запись мне не очень понятна. Я все еще перевариваю. Даже наткнулся на это (groups.google.com/forum/ ?fromgroups=#!msg/textmate/cEXEeWHjEXNk/), но опять же, все еще довольно расплывчато.   -  person Sơn Trần-Nguyễn    schedule 15.12.2012
comment
Вы видели, что на вопрос о моделях был дан ответ?   -  person dbn    schedule 17.12.2012
comment
@dbw, да, на него ответили, но недостаточно четко.   -  person Chris Pfohl    schedule 17.12.2012
comment
Круто, тогда буду думать.   -  person dbn    schedule 17.12.2012


Ответы (1)


Недавно я навязчиво обманул подсветку синтаксиса CSS ST2. Мое понимание этих файлов *.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>

Главное в этом типе паттерна то, что он имеет <begin> и <end>, затем у него есть своя секция <pattern>. Когда регулярное выражение <begin> сопоставляется, содержимое <patterns> применяется до тех пор, пока (это то, где я действительно ошибаюсь) не встретится несопоставленный токен, после чего проверяется <end>. Я думаю.

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

Вот скриншот результатов поиска с выделенным синтаксисом, которые я получаю, используя этот смысл:

Blingwear

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

Обновлять:

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

person tiffon    schedule 19.12.2012
comment
@ChristopherPfohl Спасибо! Да, я в восторге. И, если вы найдете способ обойти проблему с блочными комментариями, опубликуйте обновление. - person tiffon; 20.12.2012
comment
Спасибо за это. Я добавил несколько инструкций для пользователей ST3 в комментариях к сути. - person Dogoku; 11.02.2014