Skip Menu |

This queue is for tickets about the Devel-REPL CPAN distribution.

Report information
The Basics
Id: 57113
Status: resolved
Priority: 0/
Queue: Devel-REPL

People
Owner: Nobody in particular
Requestors: chm [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: Important
Broken in:
  • 1.003007
  • 1.003009
Fixed in: (no value)



Subject: Completion plugin does not work with Term::ReadLine::Perl
Devel::REPL::Plugin::Completion only supports Term::ReadLine::Gnu which makes it unusable on win32 perls (ASPerl and Strawberry). I was able to port the existing code to use either Term::ReadLine::Gnu or Term::ReadLine::Perl and have attached the new version with the result that completion now works on all platforms with Term::ReadLine::Perl. On win32, there is still the problem of catching Ctrl-C since the console, by default, catches the signal before it gets to the running program. A win32 specific fix is needed for that which may be some sort of XS binding. Thanks much for Devel::REPL. It has made the creation of a new PDL shell much easier. I hope this fix can be included in an official release in the future. --Chris
Subject: Completion.pm
package Devel::REPL::Plugin::Completion; use Devel::REPL::Plugin; use Scalar::Util 'weaken'; use PPI; use namespace::clean -except => [ 'meta' ]; has current_matches => ( is => 'rw', isa => 'ArrayRef', lazy => 1, default => sub { [] }, ); has match_index => ( is => 'rw', isa => 'Int', lazy => 1, default => sub { 0 }, ); has no_term_class_warning => ( isa => "Bool", is => "rw", default => 0, ); before 'read' => sub { my ($self) = @_; if ((!$self->term->isa("Term::ReadLine::Gnu") and !$self->term->isa("Term::ReadLine::Perl")) and !$self->no_term_class_warning) { warn "Term::ReadLine::Gnu or Term::ReadLine::Perl is required for the Completion plugin to work"; $self->no_term_class_warning(1); } my $weakself = $self; weaken($weakself); $self->term->Attribs->{attempted_completion_function} = sub { $weakself->_completion(@_); }; $self->term->Attribs->{completion_function} = sub { $weakself->_completion(@_); }; }; sub _completion { my $is_trp = scalar(@_) == 4 ? 1 : 0; my ($self, $text, $line, $start, $end) = @_; $end = $start+length($text) if $is_trp; # we're discarding everything after the cursor for completion purposes # we can't just use $text because we want all the code before the cursor to # matter, not just the current word substr($line, $end) = ''; my $document = PPI::Document->new(\$line); return unless defined($document); $document->prune('PPI::Token::Whitespace'); my @matches = $self->complete($text, $document); # iterate through the completions if ($is_trp) { return @matches; } else { return $self->term->completion_matches($text, sub { my ($text, $state) = @_; if (!$state) { $self->current_matches(\@matches); $self->match_index(0); } else { $self->match_index($self->match_index + 1); } return $self->current_matches->[$self->match_index]; }); } } sub complete { return (); } # recursively find the last element sub last_ppi_element { my ($self, $document, $type) = @_; my $last = $document; while ($last->can('last_element') && defined($last->last_element)) { $last = $last->last_element; return $last if $type && $last->isa($type); } return $last; } 1; __END__ =head1 NAME Devel::REPL::Plugin::Completion - Extensible tab completion =head1 AUTHOR Shawn M Moore, C<< <sartak at gmail dot com> >> =cut
Subject: Re: [rt.cpan.org #57113] Completion plugin does not work with Term::ReadLine::Perl
Date: Sat, 1 May 2010 12:01:58 -0500
To: bug-Devel-REPL [...] rt.cpan.org
From: fREW Schmidt <frioux [...] gmail.com>
I think one of my guys at work figured out how to catch ctrl-c in win32. I'll look at that when I look at applying this. On May 1, 2010 9:58 AM, "Chris Marshall via RT" <bug-Devel-REPL@rt.cpan.org> wrote: Sat May 01 10:58:31 2010: Request 57113 was acted upon. Transaction: Ticket created by CHM Queue: Devel-REPL Subject: Completion plugin does not work with Term::ReadLine::Perl Broken in: 1.003007, 1.003009 Severity: Important Owner: Nobody Requestors: chm@cpan.org Status: new Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=57113 > Devel::REPL::Plugin::Completion only supports Term::ReadLine::Gnu which makes it unusable on win32 perls (ASPerl and Strawberry). I was able to port the existing code to use either Term::ReadLine::Gnu or Term::ReadLine::Perl and have attached the new version with the result that completion now works on all platforms with Term::ReadLine::Perl. On win32, there is still the problem of catching Ctrl-C since the console, by default, catches the signal before it gets to the running program. A win32 specific fix is needed for that which may be some sort of XS binding. Thanks much for Devel::REPL. It has made the creation of a new PDL shell much easier. I hope this fix can be included in an official release in the future. --Chris
Fixed in trunk. Hopefully we'll have a release soon.