Поддержка ctags для moops

Moops улучшает синтаксис perl такими конструкциями, как:

class MyPkg::MyClass {
   # ...
}

и добавляет возможность объявлять подписи для функций-членов, вводя новые ключевые слова fun а также method:

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

Я использую файлы vim и tag для навигации по моей базе кода, но эти новые ключевые слова неизвестны ctagsпоэтому классы, функции и методы не индексируются. Как я могу улучшить ситуацию?

2 ответа

Я могу добавить регулярные выражения в ctags, расширяющие встроенный язык Perl, вот так:

$ 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 находит определение для функции

Но здесь есть две проблемы:

  1. в случае первого вызова run() vim не может однозначно решить, какая функция вызывается, так как ей не хватает контекста; Вы должны решить для себя (используя :ts)
  2. перемещая курсор над MyPkg::MyOtherClass Vim вообще не может найти тег

Итак, в заключение, моя лучшая практика для Moops, vim а также ctags будет всегда объявлять классы полностью квалифицированными.

Спасибо!

Я считаю, что это очень полезно с другими библиотеками синтаксического сахара (ieFunction::Parameters), хотя немного улучшено регулярное выражение для поиска методов:

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

Другие вопросы по тегам