Perl::Tags - Generate (possibly exuberant) Ctags style tags for Perl sourcecode
Perl::Tags is designed to be integrated into your development environment. Here are a few ways to use it:
Perl::Tags
Perl::Tags was originally designed to be used with vim. See https://github.com/osfameron/perl-tags-vim for an easily installable Plugin.
NB: You will need to have a vim with perl compiled in it. Debuntu packages this as vim-perl. Alternatively you can compile from source (you'll need Perl + the development headers libperl-dev).
vim-perl
libperl-dev
(Note that perl-tags-vim includes its own copy of Perl::Tags through the magic of git submodules and App::FatPacker, so you don't need to install this module from CPAN if you are only intending to use it with Vim as above!)
perl-tags-vim
See the "perl-tags" in bin script provided.
Any editor that supports ctags should be able to use this output. Documentation and code patches on how to do this are welcome.
use Perl::Tags; my $naive_tagger = Perl::Tags::Naive->new( max_level=>2 ); $naive_tagger->process( files => ['Foo.pm', 'bar.pl'], refresh=>1 ); print $naive_tagger; # stringifies to ctags file
Recursively follows use and require statements, up to a maximum of max_level.
use
require
max_level
There are several taggers distributed with this distribution, including:
This is a more-or-less straight ripoff, slightly updated, of the original pltags code. This is a "naive" tagger, in that it makes pragmatic assumptions about what Perl code usually looks like (e.g. it doesn't actually parse the code.) This is fast, lightweight, and often Good Enough.
This has additional subclasses such as Perl::Tags::Naive::Moose to parse Moose declarations, and Perl::Tags::Naive::Lib to parse use lib.
use lib
Uses the PPI module to do a deeper analysis and parsing of your Perl code. This is more accurate, but slower.
Can run multiple taggers, such as ::Naive and ::PPI, combining the results.
Documentation patches are welcome: in the meantime, have a look at Perl::Tags::Naive and its subclasses for a simple line-by-line method of tagging files. Alternatively Perl::Tags::PPI uses PPI's built in method of parsing Perl documents.
In general, you will want to override the get_tags_for_file method, returning a list of Perl::Tags::Tag objects to be registered.
get_tags_for_file
Perl::Tags::Tag
For recursively checking other modules, return a Perl::Tags::Tag::Recurse object, which does not create a new tag in the resulting perltags file, but instead processes the next file recursively.
Perl::Tags::Tag::Recurse
* Recursive, incremental tagging. * parses `use_ok`/`require_ok` line from Test::More
new
Perl::Tags is an abstract baseclass. Use a class such as Perl::Tags::Naive and instantiate it with new.
$naive_tagger = Perl::Tags::Naive->new( max_level=>2 );
Accepts the following parameters
max_level: levels of "use" statements to descend into, default 2 do_variables: tag variables? default 1 (true) exts: use the Exuberant extensions
to_string
A Perl::Tags object will stringify to a textual representation of a ctags file.
print $tagger;
clean_file
Delete all tags, but without touching the "order" seen, that way, if the tags are recreated, they will remain near the top of the "interestingness" tree
output
Save the file to disk if it has changed. (The private {is_dirty} attribute is used, as the tags object may be made up incrementally and recursively within your IDE.
{is_dirty}
process
Scan one or more Perl file for tags
$tagger->process( files => [ 'Module.pm', 'script.pl' ] ); $tagger->process( files => 'script.pl', refresh => 1, );
queue
popqueue
Internal methods managing the processing
process_item
process_file
Do the heavy lifting for process above.
Taggers must override the abstract method get_tags_for_file.
register
The parsing is done by a number of lightweight objects (parsers) which look for subroutine references, variables, module inclusion etc. When they are successful, they call the register method in the main tags object.
Note that if your tagger wants to register not a new declaration but rather a usage of another module, then your tagger should return a Perl::Tags::Tag::Recurse object. This is a pseudo-tag which causes the linked module to be scanned in turn. See Perl::Tags::Naive's handling of use statements as an example!
"perl-tags" in bin
Contributions are always welcome. The repo is in git:
http://github.com/osfameron/perl-tags
Please fork and make pull request. Maint bits available on request.
many patches for features and bugfixes
::PPI subclass
patch to use File::Temp
::Naive::Moose, ::Naive::Spiffy and ::Naive::Lib subclasses
prodding me to make repo public
Command line interface, applying patches
osfameron (2006-2014) - osfameron@cpan.org and contributors, as above
For support, try emailing me or grabbing me on irc #london.pm on irc.perl.org
This was originally ripped off pltags.pl, as distributed with vim and available from http://www.mscha.com/mscha.html?pltags#tools Version 2.3, 28 February 2002 Written by Michael Schaap <pltags@mscha.com>.
This is licensed under the same terms as Perl itself. (Or as Vim if you prefer).
To install Perl::Tags, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Perl::Tags
CPAN shell
perl -MCPAN -e shell install Perl::Tags
For more information on module installation, please visit the detailed CPAN module installation guide.