首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ctags支持拖拽操作

ctags支持拖拽操作
EN

Stack Overflow用户
提问于 2014-02-05 00:40:52
回答 2查看 325关注 0票数 8

Moops通过如下构造增强了perl语法:

代码语言:javascript
复制
class MyPkg::MyClass {
   # ...
}

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

代码语言:javascript
复制
class MyPkg::MyClass {
    method run(ArrayRef $ar){
    }
 }

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

EN

回答 2

Stack Overflow用户

发布于 2014-02-05 00:40:52

我可以向扩展内置perl语言的ctag添加正则表达式,如下所示:

代码语言:javascript
复制
$ 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文件中(省略引号)

假设我们有一个小项目:

代码语言:javascript
复制
$ tree
.
├── MyPkg
│   ├── MyClass.pm
│   └── MyOtherClass.pm
└── myscript.pl

使用MyPkg/MyClass.pm

代码语言:javascript
复制
use Moops;

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

MyPkg/MyOtherClass.pm

代码语言:javascript
复制
use Moops;
package MyPkg;

class MyOtherClass {
  method run( ArrayRef $args ){
  }
}

注意这里的替代语法。包名被放在类名的前面,从而产生MyPkg::MyOtherClass

最后,myscript.pl

代码语言:javascript
复制
#!/usr/bin/env perl
use MyPkg::MyClass;
use MyPkg::MyOtherClass;

MyPkg::MyClass->new()->run(\@ARGV);
MyPkg::MyOtherClass->new()->run(\@ARGV);

使用上面提到的附加正则表达式定义调用ctags,结果标记文件如下所示:

代码语言:javascript
复制
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可以找到类definition

  • moving第一次调用run() vim时,光标会找到函数

的定义

但是,这里有两个问题:

在第一次调用run() vim的情况下, vim不能明确地决定调用哪个函数,因为它缺少上下文;您必须自己决定(使用:ts)

  1. moving将光标悬停在MyPkg::MyOtherClass vim上时,
  2. run()

无法找到标记

因此,总而言之,我对Moopsvimctags的最佳实践是始终声明完全限定的类。

票数 6
EN

Stack Overflow用户

发布于 2015-03-22 06:08:26

谢谢!

我发现这对其他语法糖库(i.e.Function::Parameters)非常有用,尽管在方法查找方面有一点改进:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21558242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档