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