Доступ к корневому пути проекта в Sublime Text 3 Snippet

Я пытаюсь найти способ получить доступ только к пути к файлу из корня моего проекта во фрагменте.

Я могу получить доступ к полному пути к файлу с помощью ${TM_FILEPATH}, но я пытаюсь настроить фрагмент документации файла, который автоматически получит путь для добавления в блок документации следующим образом:

/**
 * app/Controllers/MyClass.php
 *
 * Class summary here.
 *
 * @author Author Name <[email protected]>
 * @copyright  2016 Company Name
 * @package  MyClass
 */

всего с TM_FILEPATH я получаю это:

/**
 * /Users/username/Code/project/app/Controllers/MyClass.php
 *
 * Class summary here.
 *
 * @author Author Name <[email protected]>
 * @copyright  2016 Company Name
 * @package  MyClass
 */

Есть ли способ разобрать ${TM_FILEPATH}, чтобы получить только ту часть, которая мне нужна, или можно ли настроить переменную, которую я могу использовать сам, например ${ROOT_PATH} или аналогичную?


person Vince Kronlein    schedule 30.12.2015    source источник
comment
согласно документации по сниппетам вы можете получить доступ к переменным среды. Возможно, было бы неплохо создать простой плагин на Python, который будет устанавливать переменную среды в путь к проекту. (Плагины могут получить доступ к self.view.window().project_file_name())   -  person Keith Hall    schedule 30.12.2015


Ответы (1)


Фрагменты поддерживают замены на основе регулярных выражений, совместимые с PCRE. Следующая замена должна сделать то, что вы ищете, предполагая, что часть пути, которую вы хотите сохранить, всегда начинается с app:

<snippet>
    <content><![CDATA[${TM_FILEPATH/^\/.*\/(?=\bapp\b)//}]]></content>
    <tabTrigger>filepath</tabTrigger>
    <description>path to current file</description>
    <scope>source.php</scope>
</snippet>

Чтобы разбить его, наш вход равен TM_FILEPATH, затем наша последовательность захвата (разделенная /) равна ^\/.*\/(?=app) (^ соответствует началу строки, \/ является буквальным символом /, .* соответствует любой последовательности любых символов (.) любой длины. (*). Последовательность захвата заканчивается литералом /. Группа (?=\bapp\b) представляет собой опережающий поиск, утверждающий, что app можно сопоставить заранее, но фактически не захватывает его. \b escape-символы до и после app указывают, что app должен быть окружены символами разрыва слова (в том числе /) Это сделано для защиты от совпадения пути, подобного этому:

/Users/username/Code/company_web_app/app/Controllers/SomeClass.php

где app в названии проекта.

Наконец, раздел строки формата // пуст, так как мы просто хотим отбросить совпадение и оставить все остальное.

Вот пример, более подробно объясняющий, как все это работает.

person MattDMo    schedule 30.12.2015