Commit | Line | Data |
---|---|---|
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 | |
5 | package readline; | |
6 | use strict; | |
7 | use warnings; | |
8 | use Exporter 'import'; | |
b8ee29b2 | 9 | our @EXPORT_OK = qw( mal_readline set_rl_mode ); |
9e5b2151 JM |
10 | |
11 | use Term::ReadLine; | |
12 | ||
13 | my $_rl = Term::ReadLine->new('Mal'); | |
14 | $_rl->ornaments(0); | |
15 | #print "Using ReadLine implementation: " . $_rl->ReadLine() . "\n"; | |
16 | my $OUT = $_rl->OUT || \*STDOUT; | |
17 | my $_history_loaded = 0; | |
18 | ||
37b97ee7 JM |
19 | my $history_file = $ENV{"HOME"} . "/.mal-history"; |
20 | ||
21 | sub save_line { | |
22 | my ($line) = @_; | |
23 | open(my $fh, '>>', $history_file) or return; | |
24 | say $fh $line; | |
25 | close $fh; | |
26 | } | |
27 | ||
28 | sub 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 |
39 | my $rl_mode = "terminal"; |
40 | ||
41 | sub set_rl_mode { | |
42 | my($mode) = @_; | |
43 | $rl_mode = $mode; | |
44 | } | |
45 | ||
89bd4de1 | 46 | sub 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 | } | |
73 | 1; |