Я пытаюсь сделать Sublime Text-snippet, который вставляет класс шаблона PHP, в строках:
<?php namespace Namespace\Subnamespace; class TestClass { public function __construct() { //code... } }
При использовании стандартов PHP-FIG (или аналогичных), как пространство имен, так и имя класса могут быть получены из пути файла. Файл в приведенном выше примере будет помещен в /Users/Projects/Whatever/src/Namespace/Subnamespace/TestClass.php
.
Это то, что у меня есть до сих пор:
<snippet> <content><![CDATA[ <?php namespace ${1:Namespace}; class ${TM_FILENAME/(.*)[.](.*)/$1/g} { public function __construct() { ${0://code...} } } ]]></content> <tabTrigger>phpclass</tabTrigger> <scope>text.html</scope> </snippet>
Я уже понял, как получить имя класса, но получение пространства имен оказалось намного сложнее. Я далек от эксперта по регулярным выражениям – и это требует:
src/
/
/Users/Projects/Whatever/src/Namespace/Subnamespace/TestClass.php
становится Namespace\Subnamespace
.
Это самая актуальная тема, которую я нашел по этому вопросу, но это на мой взгляд, и я даже не мог заставить ее работать.
Кто-нибудь может мне с этим помочь?
Вот подстановка пространства имен, которая работает на более чем двух уровнях в ST-3:
namespace ${1:${TM_FILEPATH/(?:.*src\/)|(\/)?([^\/]+)(?=\/)|(?:\/[^\/]+\.php$)/(?1:\\$^N:$^N)/g}};
file: /path/to/project/src/sub1/sub2/sub3/sub4/class.php
output: namespace sub1\sub2\sub3\sub4;
Мне удалось заставить его работать, но он, к сожалению, ограничен указанным количеством уровней пространства имен. Поскольку мой текущий проект всегда имеет 2 уровня ( Project\Namespace
), он работает хорошо. Но это не оптимальное решение.
Вот регулярное выражение:
(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)
src/
/
. ( "Пространство имен") Затем я делаю замену с $1\\$2
, которая помещает захваты с шага 2 и 3 с обратной косой чертой между ними.
Полная версия готового фрагмента:
${TM_FILEPATH/(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)/$1\\$2/g}
Это выведет Namespace\Subnamespace
.
Он работает пока, но я очень хотел бы увидеть версию, которая работает для любого количества уровней пространства имен.