Moops通过以下结构增强了 perl 语法:
class MyPkg::MyClass {
# ...
}
并通过引入新关键字fun
和添加声明成员函数签名的可能性method
:
class MyPkg::MyClass {
method run(ArrayRef $ar){
}
}
我使用 vim 和标记文件来导航我的代码库,但是这些新关键字对于 是未知的ctags
,因此类、函数和方法没有被索引。我该如何改善这种情况?
我可以将正则表达式添加到扩展内置 perl 语言的 ctags,如下所示:
$ 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/"