X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FREPL%2FPlugin%2FCompletion.pm;h=ad7c25f1c17e546544de667349ab8a301d687014;hb=b21e755170420636ffad424d0634bc68e38956df;hp=bbee49a287ec59bb950426e8efb48c824a3762d8;hpb=e4ac8502d347481fb17c889adb8a4a831988359a;p=p5sagit%2FDevel-REPL.git diff --git a/lib/Devel/REPL/Plugin/Completion.pm b/lib/Devel/REPL/Plugin/Completion.pm index bbee49a..ad7c25f 100644 --- a/lib/Devel/REPL/Plugin/Completion.pm +++ b/lib/Devel/REPL/Plugin/Completion.pm @@ -3,6 +3,7 @@ package Devel::REPL::Plugin::Completion; use Moose::Role; use namespace::clean -except => [ 'meta' ]; + # push the given string in the completion list sub push_completion { @@ -31,10 +32,8 @@ sub BEFORE_PLUGIN # set the completion function $self->term->Attribs->{completion_entry_function} = $self->term->Attribs->{list_completion_function}; - - # init the completion with an arrayref (could be the Perl built-ins) $self->term->Attribs->{completion_word} = []; - + # now put each file in curdir in the completion list my $curdir = File::Spec->curdir(); if (opendir(CURDIR, $curdir)) { @@ -46,21 +45,6 @@ sub BEFORE_PLUGIN closedir(CURDIR); } -# wrap the read method so we save in the completion list -# each variable declaration -around 'read' => sub { - my $orig = shift; - my ($self, @args) = @_; - my $line = $self->$orig(@args); - if (defined $line) { - if ($line =~ /\s*[\$\%\@](\S+)\s*=/) { - my $str = $1; - $self->push_completion($str); - } - } - return $line; -}; - # wrap the eval one to catch each 'use' statement in order to # load the namespace in the completion list (module functions and friends) # we do that around the eval method cause we want the module to be actually loaded. @@ -68,12 +52,24 @@ around 'eval' => sub { my $orig = shift; my ($self, $line) = @_; my @ret = $self->$orig($line); - if ($line =~ /use\s+(\S+)/) { + + # the namespace of the loaded module + if ($line =~ /\buse\s+(\S+)/) { my $module = $1; - foreach my $keyword (keys %{$self->get_namespace($module)}) { + foreach my $keyword (keys %{$self->get_namespace($module) || {}}) { $self->push_completion($keyword); } } + + # parses the lexical environment for new variables to add to + # the completion list + my $lex = $self->lexical_environment; + foreach my $var (keys %{$lex->get_context('_')}) { + $var = substr($var, 1); # we drop the variable idiom as it confuses the completion + $self->push_completion($var) unless + grep $_ eq $var, @{$self->term->Attribs->{completion_word}}; + } + return @ret; };