/usr/share/perl5/Devel/REPL/Plugin/History.pm is in libdevel-repl-perl 1.003025-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | use strict;
use warnings;
package Devel::REPL::Plugin::History;
BEGIN {
$Devel::REPL::Plugin::History::AUTHORITY = 'cpan:PHAYLON';
}
{
$Devel::REPL::Plugin::History::VERSION = '1.003025';
}
use Devel::REPL::Plugin;
use namespace::autoclean;
has 'history' => (
isa => 'ArrayRef', is => 'rw',
lazy => 1,
default => sub { [] }
);
# lazy so ReadLineHistory Plugin can set this
has 'have_readline_history' => (
is => 'rw',
lazy => 1,
default => sub { 0 }
);
sub push_history {
my ($self, $line) = @_;
# Push history is not needed if we have Term::ReadLine
# support. We put the test inside push_history() in case
# someone has modified it in their code.
if ($self->have_readline_history) {
# update history to keep consistent with Term::ReadLine
$self->history( [ $self->term->GetHistory ] );
} else {
# not used with Term::ReadLine history support
push(@{$self->history}, $line);
}
}
around 'read' => sub {
my $orig = shift;
my ($self, @args) = @_;
my $line = $self->$orig(@args);
if (defined $line) {
if ($line =~ m/^!(.*)$/) {
my $call = $1;
$line = $self->history_call($call);
if (defined $line) {
$self->print($line."\n");
} else {
return "'Unable to find ${call} in history'";
}
}
if ($line =~ m/\S/) {
$self->push_history($line);
}
}
return $line;
};
sub history_call {
my ($self, $call) = @_;
if ($call =~ m/^(-?\d+)$/) { # handle !1 or !-1
my $idx = $1;
$idx-- if ($idx > 0); # !1 gets history element 0
my $line = $self->history->[$idx];
return $line;
}
my $re = qr/^\Q${call}\E/;
foreach my $line (reverse @{$self->history}) {
return $line if ($line =~ $re);
}
return;
};
1;
__END__
=head1 NAME
Devel::REPL::Plugin::History - Keep track of all input, provide shortcuts !1, !-1
=cut
|