summaryrefslogtreecommitdiffstats
path: root/lib/Reply/Plugin/Autocomplete/Packages.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Reply/Plugin/Autocomplete/Packages.pm')
-rw-r--r--lib/Reply/Plugin/Autocomplete/Packages.pm53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/Reply/Plugin/Autocomplete/Packages.pm b/lib/Reply/Plugin/Autocomplete/Packages.pm
new file mode 100644
index 0000000..4f7f2a4
--- /dev/null
+++ b/lib/Reply/Plugin/Autocomplete/Packages.pm
@@ -0,0 +1,53 @@
+package Reply::Plugin::Autocomplete::Packages;
+use strict;
+use warnings;
+# ABSTRACT: tab completion for package names
+
+use base 'Reply::Plugin';
+
+use Module::Runtime '$module_name_rx';
+
+=head1 SYNOPSIS
+
+ ; .replyrc
+ [ReadLine]
+ [Autocomplete::Packages]
+
+=head1 DESCRIPTION
+
+This plugin registers a tab key handler to autocomplete package names in Perl
+code.
+
+=cut
+
+sub tab_handler {
+ my $self = shift;
+ my ($line) = @_;
+
+ # $module_name_rx does not permit trailing ::
+ my ($package_fragment) = $line =~ /($module_name_rx(?:::)?)$/;
+ return unless $package_fragment;
+
+ my $file_fragment = $package_fragment;
+ $file_fragment =~ s{::}{/}g;
+
+ my $re = qr/^\Q$file_fragment/;
+
+ my @results;
+ for my $inc (keys %INC) {
+ if ($inc =~ $re) {
+ $inc =~ s{/}{::}g;
+ $inc =~ s{\.pm$}{};
+ push @results, $inc;
+ }
+ }
+
+ return @results;
+}
+
+=for Pod::Coverage
+ tab_handler
+
+=cut
+
+1;