Moops通过如下构造增强了perl语法:
class MyPkg::MyClass {
# ...
}并通过引入新关键字fun和method添加了为成员函数声明签名的可能性
class MyPkg::MyClass {
method run(ArrayRef $ar){
}
}我使用vim和标记文件来导航我的代码库,但是这些新的关键字对于ctags来说是未知的,所以类、函数和方法都没有索引。我如何才能改善这种情况?
发布于 2014-02-05 00:40:52
我可以向扩展内置perl语言的ctag添加正则表达式,如下所示:
$ 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可以找到类definition
run() vim时,光标会找到函数的定义
但是,这里有两个问题:
在第一次调用run() vim的情况下, vim不能明确地决定调用哪个函数,因为它缺少上下文;您必须自己决定(使用:ts)
MyPkg::MyOtherClass vim上时,run()无法找到标记
因此,总而言之,我对Moops、vim和ctags的最佳实践是始终声明完全限定的类。
发布于 2015-03-22 06:08:26
谢谢!
我发现这对其他语法糖库(i.e.Function::Parameters)非常有用,尽管在方法查找方面有一点改进:
--regex-Perl="/^[ \t]*method\s+([a-zA-Z0-9_]+)/\1/s/"
https://stackoverflow.com/questions/21558242
复制相似问题