ctags支持moops

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,所以类,函数和方法都没有编入索引.我该如何改善这种情况?

ssc*_*ber 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 .
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)

这几乎有效:

  1. 移动光标MyPkg::MyClass并按下CTRL-]vim可以找到类定义
  2. 在第一次调用run()vim时移动光标会找到该函数的定义

但是,这里有两个问题:

  1. 在第一次调用run()vim 的情况下,不能毫无根据地决定调用哪个函数,因为它缺少上下文; 你必须自己决定(使用:ts)
  2. 将光标移到MyPkg::MyOtherClassvim上根本找不到标签

因此,总而言之,我的最佳实践是Moops,vim并且ctags将始终声明完全合格的类.