С гордостью хочу представить вашему вниманию утилиту ctags с полноценной поддержкой индексации php:
- Поддержка классов и интерфейсов
- Поддержка членов классов — функции, переменные, константы
- Поддержка пространств имен
- Форматирование тэгов таким образом что вам больше не придется искать нужный __construct по десятку файлов
Подробности под катом. Ссылка на утилиту там же в конце.
Исторически сложилось так, что ctags поддерживал PHP путем парсинга через регулярные выражения, что во-первых позволило быстро и малой кровью добавить поддержку нового языка, а во-вторых сделало невозможным использование какой либо информации об области видимости найденной переменной или функции.
В результате разработка сложных проектов с большим числом классов с использованием инструментов вроде Vim или Emacs была далека от идеала. Например, каждый класс имеет метод __construct, и, чтобы найти нужный конструктор приходилось изрядно «попрыгать» по классам, так как тэги с одинаковыми именами индексировались так как будто они все находились в глобальной области видимости.
Сперва, чтобы побороть эту проблему, я решил попробовать PHPStorm, но после пары часов восхищения качеством парсинга и автодополнения, мне стало в который раз ясно, что с Emacs можно слезть только на Vim, да и то не надолго.
Так вот и пришла мысль допилить наконец поддержку PHP в Ctags до соответствия современным требованиям. В отличие от других языков мне показалось разумным создавать два тэга для одного члена класса или пространства имен — классическое Class::Member, которое обеспечивает классическую навигацию для которой достаточно указать только Member, а также Member<Class>. Последний вариант удобен когда вы используете автодополнение по тэгам в том же Emacs.
Оба варианта выглядят так:
Скачать утилиту можно тут: github.com/zargener/ctags. Собирается легко и без установки лишних зависимостей. Для удобства можно заменить системную утилиту ctags. Новый парсер полностью разбирает исходники той же Symfony2 без видимых ошибок, но примеры некорректно разбираемых файлов приветствуются.
Автор: PerlPower