Guillaume Rousse 4254f3a4a5 Switch back to a shell completion function for perl and perldoc
completions, using an external helper just for functions and modules
completions. This is overally slower, as our helper outputs all available
modules at once, rather than just one piece of namespace, but this is
more in line with other completions
2010-11-07 20:01:41 +01:00

81 lines
1.9 KiB
Perl
Executable File

#!/usr/bin/env perl
use strict;
use Config;
use File::Spec::Functions;
my %seen;
sub print_modules_real {
my ($base, $dir, $word) = @_;
# returns immediatly if the base doesn't match
return if $base && $base !~ /^\Q$word/;
chdir($dir) or return;
# print each file
foreach my $file (glob('*.pm')) {
$file =~ s/\.pm$//;
my $module = $base . $file;
next if $module !~ /^\Q$word/;
next if $seen{$module}++;
print $module . "\n";
}
# recurse in each subdirectory
foreach my $directory (grep { -d } glob('*')) {
my $subdir = $dir . '/' . $directory;
if ($directory =~ /^(?:[.\d]+|$Config{archname}|auto)$/) {
# exclude subdirectory name from base
print_modules_real(undef, $subdir, $word);
} else {
# add subdirectory name to base
print_modules_real($base . $directory . '::', $subdir, $word);
}
}
}
sub print_modules {
my ($word) = @_;
foreach my $directory (@INC) {
print_modules_real(undef, $directory, $word);
}
}
sub print_functions {
my ($word) = @_;
my $perlfunc;
for ( @INC, undef ) {
return if not defined;
$perlfunc = catfile $_, qw( pod perlfunc.pod );
last if -r $perlfunc;
}
open my $fh, '<', $perlfunc or return;
my $nest_level = -1;
while ( <$fh> ) {
next if 1 .. /^=head2 Alphabetical Listing of Perl Functions$/;
++$nest_level if /^=over/;
--$nest_level if /^=back/;
next if $nest_level;
next unless /^=item (-?\w+)/;
my $function = $1;
next if $function !~ /^\Q$word/;
next if $seen{$function}++;
print $function . "\n";
}
}
my $type = shift;
my $word = shift;
if ($type eq 'functions') {
print_functions($word);
} elsif ($type eq 'modules') {
print_modules($word);
}