keep $VERSION right in the repo
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / ReadLineHistory.pm
CommitLineData
9d03fe04 1# First cut at using the readline history directly rather than reimplementing
2# it. It does save history but it's a little crappy; still playing with it ;)
e4761e81 3#
9d03fe04 4# epitaph, 22nd April 2007
5
1716b200 6use strict;
7use warnings;
9d03fe04 8package Devel::REPL::Plugin::ReadLineHistory;
9
54beb05d 10our $VERSION = '1.003027';
11
6a5409bc 12use Devel::REPL::Plugin;
ef59b3d9 13use File::HomeDir;
14use File::Spec;
1d6c2dbc 15use namespace::autoclean;
ef59b3d9 16
17my $hist_file = $ENV{PERLREPL_HISTFILE} ||
18 File::Spec->catfile(File::HomeDir->my_home, '.perlreplhist');
9d03fe04 19
9d03fe04 20# HISTLEN should probably be in a config file to stop people accidentally
21# truncating their history if they start the program and forget to set
22# PERLREPL_HISTLEN
23my $hist_len=$ENV{PERLREPL_HISTLEN} || 100;
24
25around 'run' => sub {
baa665c2 26 my $orig=shift;
27 my ($self, @args)=@_;
28 if ($self->term->ReadLine eq 'Term::ReadLine::Gnu') {
29 $self->term->stifle_history($hist_len);
30 }
31 if ($self->term->ReadLine eq 'Term::ReadLine::Perl') {
32 $self->term->Attribs->{MaxHistorySize} = $hist_len;
33 }
34 if (-f($hist_file)) {
35 if ($self->term->ReadLine eq 'Term::ReadLine::Gnu') {
36 $self->term->ReadHistory($hist_file);
37 }
38 if ($self->term->ReadLine eq 'Term::ReadLine::Perl') {
39 open HIST, $hist_file or die "ReadLineHistory: could not open $hist_file: $!\n";
40 while (my $line = <HIST>) {
41 chomp $line;
42 $self->term->addhistory($line);
43 }
44 close HIST;
45 }
46 }
78453011 47
48 $self->term->Attribs->{do_expand}=1; # for Term::ReadLine::Gnu
49 $self->term->MinLine(2); # don't save one letter commands
50
51 # let History plugin know we have Term::ReadLine support
52 $self->have_readline_history(1) if $self->can('have_readline_history');
53
54
baa665c2 55 $self->$orig(@args);
78453011 56
baa665c2 57 if ($self->term->ReadLine eq 'Term::ReadLine::Gnu') {
58 $self->term->WriteHistory($hist_file) ||
59 $self->print("warning: failed to write history file $hist_file");
60 }
61 if ($self->term->ReadLine eq 'Term::ReadLine::Perl') {
62 my @lines = $self->term->GetHistory() if $self->term->can('GetHistory');
63 if( open HIST, ">$hist_file" ) {
64 print HIST join("\n",@lines);
65 close HIST;
66 } else {
67 $self->print("warning: unable to WriteHistory to $hist_file");
68 }
69 }
9d03fe04 70};
71
721;
73
cfd1094b 74__END__
75
76=head1 NAME
77
78Devel::REPL::Plugin::ReadLineHistory - Integrate history with the facilities provided by L<Term::ReadLine>
79
265cea44 80=head1 DESCRIPTION
81
82This plugin enables loading and saving command line history from
83a file as well has history expansion of previous commands using
84the !-syntax a la bash.
85
86By default, history expansion is enabled with this plugin when
87using L<Term::ReadLine::Gnu|Term::ReadLine::Gnu>. That means that
88"loose" '!' characters will be treated as history events which
89may not be what you wish.
90
91To avoid this, you need to quote the '!' with '\':
92
93 my $var = "foo\!";
94
95or place the arguments in single quotes---but enable the
96C<Term::ReadLine> attribute C<history_quotes_inhibit_expansion>:
97
98 $_REPL->term->Attribs->{history_quotes_inhibit_expansion} = 1;
99 my $var = 'foo!';
100
101and to disable history expansion from GNU readline/history do
102
103 $_REPL->term->Attribs->{do_expand} = 0;
104
105=head1 CONFLICTS
106
8d5343b5 107Note that L<Term::ReadLine::Perl> does not support a history
265cea44 108expansion method. In that case, you may wish to use the
8d5343b5 109L<Devel::REPL History plugin|Devel::REPL::Plugin::History> which provides similar functions.
110Work is underway to make use of either L<History|Devel::REPL::Plugin::History> or
111L<ReadLineHistory|Devel::REPL::Plugin::ReadHistory>> consistent for expansion with either the
112L<Term::ReadLine::Gnu> support or L<Term::ReadLine::Perl>.
265cea44 113
cfd1094b 114=cut
115