8

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

class MyPkg::MyClass {
   # ...
}

并通过引入新关键字fun和添加声明成员函数签名的可能性method

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

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

4

2 回答 2

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::MyClassCTRL-]vim可以找到类定义
  2. 将光标移到run()vim 的第一次调用上会找到函数的定义

但是,这里有两个问题:

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

所以,总而言之,我的最佳实践是Moopsvim并且ctags总是声明完全合格的类。

于 2014-02-04T16:40:51.853 回答
1

谢谢!

我发现这对其他语法糖库(ieFunction::Parameters)非常有用,尽管对方法查找的正则表达式有所改进:

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

于 2015-03-21T22:08:25.503 回答