Есть ли плагин VIM, который заставляет атрибуты Moose отображаются в Tag_List?
Вопрос
Я редактирую пакеты, которые используют лоси, и мне было интересно, если бы был плагин для создания атрибутов Moose, отображаются в списке тегов.
Например, в следующем коде атрибут options
не отображается в Tag_List, но print_out_site
делает:
use Moose;
use MooseX::AttributeHelpers;
...
has 'options' => (
metaclass => 'Collection::Hash',
isa => 'HashRef[Str]',
is => 'ro',
provides => {
exists => 'exists',
get => 'get',
set => 'set',
},
);
...
sub print_out_site {
my $self = shift;
my $key = shift;
$self->fasta_out_fh->print(">", $key, "\n");
$self->fasta_out_fh->print($self->sites->{$key}, "\n");
}
Решение
Добавьте линию
--regex-perl=/has '(.*)' => \(/\1/a,attribute,moose attributes/
до ~ / .CTAGS, и он должен появиться. Вам может потребоваться настроить регулярное выражение, чтобы избежать ложных матчей в других файлах или для размещения различных форматировку для объявлений атрибутов в других файлах.
Это расширяет CTAGS так, чтобы он обнаружил другой тип тега на основе регулярного выражения при анализе файлов PERL.
Затем вам нужно сказать плагин Taglist о новом типе тегов, добавив это в свой файл VIMRC:
let tlist_perl_settings='perl;c:constant;l:label;p:package;s:subroutine;a:attribute'
Другие советы
Джефф, я попробовал ваш код, но это не сработало для меня с помощью синтаксиса, который вы используете. Может ли это быть задачей версии? Я использую Exuberant CTAGS версию 5.8.
Я также немного модифицировал Regeex, потому что цитаты являются необязательными, и вы, возможно, захотите разрешить пробелы (но больше ничего) предшествуют ключевое слово «имеет».
Вот что сработало для меня. Я создал файл HOME / ACTAGS (еще не было, иначе просто добавить к нему) со следующей строкой:
--regex-perl=/^\s*has\s+['"]?([0-9a-zA-Z_]+)/\1/a,attribute/
Затем добавил строку в .VIMRC, как вы предложили
let tlist_perl_settings='perl;c:constant;l:label;p:package;s:subroutine;a:attribute'
Теперь он перечисляет мои атрибуты в мосельных модулях.
Кроме того, мне полезно также иметь информацию о родительском классе, ролях и использованных модулях, отображаются в TAGLIST, поэтому вот мой полный файл Home / .Ctags
--regex-perl=/^\s*has\s+['"]?([0-9a-zA-Z_]+)/\1/a,attribute/
--regex-perl=/^\s*with\s+(['"])(.+)\1/\2/r,role/
--regex-perl=/^\s*extends\s+(['"])(.+)\1/\2/e,extends/
--regex-perl=/^\s*use\s+([^ ;]+)/\1/u,use/
И это то, что у меня есть в .VIMRC (вы можете изменить порядок тегов в Taglist, просто изменив заказ в TLIST_PAR_SETTINGS):
let tlist_perl_settings='perl;u:use;p:package;r:role;e:extends;c:constant;a:attribute;s:subroutine;l:label'
let Tlist_Show_One_File = 1
Из-за дополнительного контента мне полезно использовать опцию TLIST_SHOW_ONE_FILE, которая заставляет TAGLIST показывать только теги текущего выбранного файла.
Чтобы временно скрыть некоторые теги, которые вы всегда можете переместить курсор на имя тега и нажмите «ZC» (и «ZO», чтобы открыть).