[Bast-commits] r3688 - trunk/Devel-REPL/lib/Devel/REPL/Plugin

sukria at dev.catalyst.perl.org sukria at dev.catalyst.perl.org
Mon Aug 20 23:14:49 GMT 2007


Author: sukria
Date: 2007-08-20 23:14:48 +0100 (Mon, 20 Aug 2007)
New Revision: 3688

Modified:
   trunk/Devel-REPL/lib/Devel/REPL/Plugin/Completion.pm
Log:
Add variable names to the completion list by using $self->lexical_environement


Modified: trunk/Devel-REPL/lib/Devel/REPL/Plugin/Completion.pm
===================================================================
--- trunk/Devel-REPL/lib/Devel/REPL/Plugin/Completion.pm	2007-08-20 17:18:39 UTC (rev 3687)
+++ trunk/Devel-REPL/lib/Devel/REPL/Plugin/Completion.pm	2007-08-20 22:14:48 UTC (rev 3688)
@@ -3,6 +3,7 @@
 use Moose::Role;
 use namespace::clean -except => [ 'meta' ];
 
+
 # push the given string in the completion list
 sub push_completion
 {
@@ -31,10 +32,8 @@
     # 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 @@
     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 @@
     my $orig = shift;
     my ($self, $line) = @_;
     my @ret = $self->$orig($line);
+    
+    # the namespace of the loaded module
     if ($line =~ /use\s+(\S+)/) {
         my $module = $1;
         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 /^${var}$/, @{$self->term->Attribs->{completion_word}};
+    }
+
     return @ret;
 };
 




More information about the Bast-commits mailing list