diff options
author | David Paleino <dapal@debian.org> | 2011-05-02 19:01:33 +0200 |
---|---|---|
committer | David Paleino <dapal@debian.org> | 2011-05-02 19:04:24 +0200 |
commit | 4632248cbbc63f140a9e137e889e0185de8d7b54 (patch) | |
tree | d207eb219ab19e99af2951d8ed29abe972009778 /helpers | |
parent | 88f9f46d81624302b4cf3e6bb20441cfd7ed2916 (diff) | |
download | bash-completion-4632248cbbc63f140a9e137e889e0185de8d7b54.tar.gz |
Get rid of $BASH_COMPLETION as well
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/Makefile.am | 3 | ||||
-rw-r--r-- | helpers/perl | 89 |
2 files changed, 92 insertions, 0 deletions
diff --git a/helpers/Makefile.am b/helpers/Makefile.am new file mode 100644 index 00000000..4ad4b439 --- /dev/null +++ b/helpers/Makefile.am @@ -0,0 +1,3 @@ +helpers_DATA = perl + +EXTRA_DIST = $(helpers_DATA) diff --git a/helpers/perl b/helpers/perl new file mode 100644 index 00000000..f847dc74 --- /dev/null +++ b/helpers/perl @@ -0,0 +1,89 @@ +# -*- perl -*- + +use strict; +use Config; +use File::Spec::Functions; + +my %seen; + +sub print_modules_real { + my ($base, $dir, $word) = @_; + + # return immediately if potential completion doesn't match current word + # a double comparison is used to avoid dealing with string lengths + # (the shorter being the pattern to be used as the regexp) + # word 'Fi', base 'File' -> match 'File' against 'Fi' + # word 'File::Sp', base 'File' -> match 'File::Sp' against 'File' + return if + $base && + $word && + $base !~ /^\Q$word/ && + $word !~ /^\Q$base/; + + 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); +} |