diff options
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/Makefile.am | 4 | ||||
-rw-r--r-- | helpers/perl | 98 | ||||
-rw-r--r-- | helpers/python | 14 |
3 files changed, 116 insertions, 0 deletions
diff --git a/helpers/Makefile.am b/helpers/Makefile.am new file mode 100644 index 0000000..2a0a18d --- /dev/null +++ b/helpers/Makefile.am @@ -0,0 +1,4 @@ +helpersdir = $(datadir)/$(PACKAGE)/helpers +helpers_DATA = perl python + +EXTRA_DIST = $(helpers_DATA) diff --git a/helpers/perl b/helpers/perl new file mode 100644 index 0000000..83ab1a1 --- /dev/null +++ b/helpers/perl @@ -0,0 +1,98 @@ +# -*- perl -*- + +use strict; +use Config; +use Cwd; +use File::Spec::Functions; + +my %seen; + +sub print_modules_real { + my ($base, $dir, $word, $include_pod) = @_; + + # 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 (sort(glob('*.pm'), glob('*.pod'))) { + next if ($file =~ /\.pod$/ and not $include_pod); + $file =~ s/\.(?:pm|pod)$//; + 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, $include_pod); + } else { + + # add subdirectory name to base + print_modules_real($base . $directory . '::', + $subdir, $word, $include_pod); + } + } +} + +sub print_modules { + my ($word, $include_pod) = @_; + + my $origdir = getcwd; + foreach my $directory (@INC) { + print_modules_real(undef, $directory, $word, $include_pod); + chdir $origdir; + } +} + +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); +} elsif ($type eq 'perldocs') { + print_modules($word, 1); +} diff --git a/helpers/python b/helpers/python new file mode 100644 index 0000000..a74387f --- /dev/null +++ b/helpers/python @@ -0,0 +1,14 @@ +# -*- python -*- + +import pkgutil +import sys + +# walk_packages() is much slower than iter_modules(), use it only when +# completing something with a dot in it. +if len(sys.argv) > 1 and "." in sys.argv[1]: + walker = pkgutil.walk_packages +else: + walker = pkgutil.iter_modules + +for mod in walker(): + print(mod[1]) # noqa: E211 |