Ada: merge to latest baseline
[jackhill/mal.git] / perl / readline.pm
CommitLineData
9e5b2151 1# To get readline line editing functionality, please install
b8ee29b2
JM
2# Term::ReadKey and either Term::ReadLine::Gnu (GPL) or
3# Term::ReadLine::Perl (GPL, Artistic) from CPAN.
9e5b2151
JM
4
5package readline;
6use strict;
7use warnings;
8use Exporter 'import';
b8ee29b2 9our @EXPORT_OK = qw( mal_readline set_rl_mode );
9e5b2151
JM
10
11use Term::ReadLine;
12
13my $_rl = Term::ReadLine->new('Mal');
14$_rl->ornaments(0);
15#print "Using ReadLine implementation: " . $_rl->ReadLine() . "\n";
16my $OUT = $_rl->OUT || \*STDOUT;
17my $_history_loaded = 0;
18
37b97ee7
JM
19my $history_file = $ENV{"HOME"} . "/.mal-history";
20
21sub save_line {
22 my ($line) = @_;
23 open(my $fh, '>>', $history_file) or return;
24 say $fh $line;
25 close $fh;
26}
27
28sub load_history {
29 open my $fh, $history_file or return;
30
31 while(my $line = <$fh>) {
32 chomp $line;
33 $_rl->addhistory($line) if $line =~ /\S/;
34 }
35
36 close $fh;
37}
38
b8ee29b2
JM
39my $rl_mode = "terminal";
40
41sub set_rl_mode {
42 my($mode) = @_;
43 $rl_mode = $mode;
44}
45
89bd4de1 46sub mal_readline {
9e5b2151
JM
47 my($prompt) = @_;
48 my $line = undef;
49 if (! $_history_loaded) {
50 $_history_loaded = 1;
37b97ee7 51 load_history();
9e5b2151
JM
52 }
53
b8ee29b2
JM
54 if ($rl_mode eq "terminal") {
55 if (defined ($line = $_rl->readline($prompt))) {
56 save_line($line);
10b07148 57 chomp $line;
b8ee29b2
JM
58 return $line;
59 } else {
60 return undef;
61 }
9e5b2151 62 } else {
b8ee29b2
JM
63 print "$prompt";
64 if (defined ($line = readline(*STDIN))) {
65 save_line($line);
10b07148 66 chomp($line);
b8ee29b2
JM
67 return $line;
68 } else {
69 return undef;
70 }
9e5b2151
JM
71 }
72}
731;