ssc*_*ber 8 vim perl ctags exuberant-ctags moops
Moops通过以下构造增强了perl语法:
class MyPkg::MyClass {
# ...
}
Run Code Online (Sandbox Code Playgroud)
并增加了通过引入新关键字来声明成员函数签名的可能性,fun并且method:
class MyPkg::MyClass {
method run(ArrayRef $ar){
}
}
Run Code Online (Sandbox Code Playgroud)
我使用vim和tag文件来导航我的代码库,但这些新的关键字是未知的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 .
Run Code Online (Sandbox Code Playgroud)
或者我可以将它们放在我的~/.ctags文件中(省略引号)
假设我们有一个小项目:
$ tree
.
??? MyPkg
? ??? MyClass.pm
? ??? MyOtherClass.pm
??? myscript.pl
Run Code Online (Sandbox Code Playgroud)
用MyPkg/MyClass.pm:
use Moops;
class MyPkg::MyClass {
method run( ArrayRef $args ){
}
}
Run Code Online (Sandbox Code Playgroud)
并且MyPkg/MyOtherClass.pm:
use Moops;
package MyPkg;
class MyOtherClass {
method run( ArrayRef $args ){
}
}
Run Code Online (Sandbox Code Playgroud)
请注意这里的替代语法.包名称前缀为类名称MyPkg::MyOtherClass.
最后,myscript.pl:
#!/usr/bin/env perl
use MyPkg::MyClass;
use MyPkg::MyOtherClass;
MyPkg::MyClass->new()->run(\@ARGV);
MyPkg::MyOtherClass->new()->run(\@ARGV);
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这几乎有效:
MyPkg::MyClass并按下CTRL-]vim可以找到类定义run()vim时移动光标会找到该函数的定义但是,这里有两个问题:
run()vim 的情况下,不能毫无根据地决定调用哪个函数,因为它缺少上下文; 你必须自己决定(使用:ts)MyPkg::MyOtherClassvim上根本找不到标签因此,总而言之,我的最佳实践是Moops,vim并且ctags将始终声明完全合格的类.