Фрагмент Sublime Text для вставки пространства имен PSR-0

Я пытаюсь сделать 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> 

Я уже понял, как получить имя класса, но получение пространства имен оказалось намного сложнее. Я далек от эксперта по регулярным выражениям – и это требует:

  1. Получение всего после src/
  2. … и до последнего /
  3. Переверните все остальные слэши на обратную косую черту.

/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) 
    1. Не захватывая выбор всего до src/
    2. Выберите все для следующего / . ( "Пространство имен")
    3. Повторите шаг 2. ( "Подпространство имена")
    4. Нехват выбора имени файла

    Затем я делаю замену с $1\\$2 , которая помещает захваты с шага 2 и 3 с обратной косой чертой между ними.

    Полная версия готового фрагмента:

     ${TM_FILEPATH/(?:^.*src\/|\G)(.*?)\/(.*?)\/(?:.*php|\G)/$1\\$2/g} 

    Это выведет Namespace\Subnamespace .

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