Moops通过以下结构增强perl语法:
class MyPkg::MyClass {
# ...
}
并添加了通过引入新关键字fun
和method
来声明成员函数签名的可能性:
class MyPkg::MyClass {
method run(ArrayRef $ar){
}
}
我使用vim和tag文件来导航我的代码库,但这些新关键字对ctags
是未知的,因此不对类,函数和方法编制索引。我该如何改善这种情况?
答案 0 :(得分:6)
我可以将正则表达式添加到扩展内置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
的最佳做法是始终声明完全限定的类。
答案 1 :(得分:1)
谢谢!
我发现它对其他语法糖库(ieFunction :: Parameters)非常有用,虽然对于方法查找有一点改进的正则表达式:
--regex-Perl="/^[ \t]*method\s+([a-zA-Z0-9_]+)/\1/s/"