Я могу добавить регулярные выражения в 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
было бы всегда объявлять классы полностью определенными.
person
sschober
schedule
04.02.2014