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

Moops расширяет синтаксис Perl за счет таких конструкций, как:

class MyPkg::MyClass {
   # ...
}

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

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

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


person sschober    schedule 04.02.2014    source источник


Ответы (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 было бы всегда объявлять классы полностью определенными.

person sschober    schedule 04.02.2014
comment
Привет, когда я запускаю ctags в командной строке, я получаю, что команда не найдена. Я установил его, но он все еще не работает. Не могли бы вы привести пример того, как это выглядит в файле ~/.ctags? - person srchulo; 09.12.2018

Спасибо!

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

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

person Ivan Baidakou    schedule 21.03.2015