ctags支持moops

时间:2014-02-04 16:40:52

标签: perl vim ctags exuberant-ctags moops

Moops通过以下结构增强perl语法:

class MyPkg::MyClass {
   # ...
}

并添加了通过引入新关键字funmethod来声明成员函数签名的可能性:

class MyPkg::MyClass {
    method run(ArrayRef $ar){
    }
 }

我使用vim和tag文件来导航我的代码库,但这些新关键字对ctags是未知的,因此不对类,函数和方法编制索引。我该如何改善这种情况?

2 个答案:

答案 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

这几乎有效:

  1. 将光标移到MyPkg::MyClass上并按CTRL-] vim即可找到班级定义
  2. 将光标移动到run() vim的第一次调用上,找到函数的定义
  3. 但是,这里有两个问题:

    1. 在第一次调用run()的情况下,vim无法明确地决定调用哪个函数,因为它缺少上下文;你必须自己决定(使用:ts
    2. 将光标移到MyPkg::MyOtherClass vim上无法找到标签
    3. 总而言之,我对Moopsvimctags的最佳做法是始终声明完全限定的类。

答案 1 :(得分:1)

谢谢!

我发现它对其他语法糖库(ieFunction :: Parameters)非常有用,虽然对于方法查找有一点改进的正则表达式:

--regex-Perl="/^[ \t]*method\s+([a-zA-Z0-9_]+)/\1/s/"