Поддержка ctags для moops
Moops улучшает синтаксис perl такими конструкциями, как:
class MyPkg::MyClass {
# ...
}
и добавляет возможность объявлять подписи для функций-членов, вводя новые ключевые слова fun
а также method
:
class MyPkg::MyClass {
method run(ArrayRef $ar){
}
}
Я использую файлы vim и tag для навигации по моей базе кода, но эти новые ключевые слова неизвестны ctags
поэтому классы, функции и методы не индексируются. Как я могу улучшить ситуацию?
2 ответа
Я могу добавить регулярные выражения в ctags, расширяющие встроенный язык Perl, вот так:
$ ctags \
--regex-Perl="/^[ \t]*method\s+([a-zA-Z0-9]+)/\1/s/" \
--regex-Perl="/^\s*class\s+([a-zA-Z0-9:]+)/\1/p/" \
-R .
или я могу положить их в мой ~/.ctags
файл (без кавычек)
Предполагая, что у нас есть небольшой проект:
$ tree
.
├── MyPkg
│ ├── MyClass.pm
│ └── MyOtherClass.pm
└── myscript.pl
С MyPkg/MyClass.pm
:
use Moops;
class MyPkg::MyClass {
method run( ArrayRef $args ){
}
}
а также MyPkg/MyOtherClass.pm
:
use Moops;
package MyPkg;
class MyOtherClass {
method run( ArrayRef $args ){
}
}
Обратите внимание на альтернативный синтаксис здесь. Имя пакета добавляется к имени класса, что приводит к MyPkg::MyOtherClass
,
В заключение, myscript.pl
:
#!/usr/bin/env perl
use MyPkg::MyClass;
use MyPkg::MyOtherClass;
MyPkg::MyClass->new()->run(\@ARGV);
MyPkg::MyOtherClass->new()->run(\@ARGV);
призвание ctags
с дополнительными определениями регулярных выражений, упомянутыми выше, результирующий файл тегов выглядит следующим образом:
MyOtherClass MyPkg/MyOtherClass.pm /^class MyOtherClass {$/;" p
MyPkg MyPkg/MyOtherClass.pm /^package MyPkg;$/;" p
MyPkg::MyClass MyPkg/MyClass.pm /^class MyPkg::MyClass {$/;" p
run MyPkg/MyClass.pm /^ method run( ArrayRef $args ){$/;" s
run MyPkg/MyOtherClass.pm /^ method run( ArrayRef $args ){$/;" s
Это почти работает:
- перемещая курсор над
MyPkg::MyClass
и нажавCTRL-]
Vim может найти определение класса - перемещая курсор на первый вызов
run()
vim находит определение для функции
Но здесь есть две проблемы:
- в случае первого вызова
run()
vim не может однозначно решить, какая функция вызывается, так как ей не хватает контекста; Вы должны решить для себя (используя:ts
) - перемещая курсор над
MyPkg::MyOtherClass
Vim вообще не может найти тег
Итак, в заключение, моя лучшая практика для Moops
, vim
а также ctags
будет всегда объявлять классы полностью квалифицированными.
Спасибо!
Я считаю, что это очень полезно с другими библиотеками синтаксического сахара (ieFunction::Parameters), хотя немного улучшено регулярное выражение для поиска методов:
--regex-Perl="/^[ \t]*method\s+([a-zA-Z0-9_]+)/\1/s/"