mirror of
https://github.com/kanaka/mal.git
synced 2024-09-20 18:18:51 +03:00
74 lines
1.5 KiB
Perl
74 lines
1.5 KiB
Perl
# To get readline line editing functionality, please install
|
|
# Term::ReadKey and either Term::ReadLine::Gnu (GPL) or
|
|
# Term::ReadLine::Perl (GPL, Artistic) from CPAN.
|
|
|
|
package readline;
|
|
use strict;
|
|
use warnings;
|
|
use Exporter 'import';
|
|
our @EXPORT_OK = qw( mal_readline set_rl_mode );
|
|
|
|
use Term::ReadLine;
|
|
|
|
my $_rl = Term::ReadLine->new('Mal');
|
|
$_rl->ornaments(0);
|
|
#print "Using ReadLine implementation: " . $_rl->ReadLine() . "\n";
|
|
my $OUT = $_rl->OUT || \*STDOUT;
|
|
my $_history_loaded = 0;
|
|
|
|
my $history_file = $ENV{"HOME"} . "/.mal-history";
|
|
|
|
sub save_line {
|
|
my ($line) = @_;
|
|
open(my $fh, '>>', $history_file) or return;
|
|
say $fh $line;
|
|
close $fh;
|
|
}
|
|
|
|
sub load_history {
|
|
open my $fh, $history_file or return;
|
|
|
|
while(my $line = <$fh>) {
|
|
chomp $line;
|
|
$_rl->addhistory($line) if $line =~ /\S/;
|
|
}
|
|
|
|
close $fh;
|
|
}
|
|
|
|
my $rl_mode = "terminal";
|
|
|
|
sub set_rl_mode {
|
|
my($mode) = @_;
|
|
$rl_mode = $mode;
|
|
}
|
|
|
|
sub mal_readline {
|
|
my($prompt) = @_;
|
|
my $line = undef;
|
|
if (! $_history_loaded) {
|
|
$_history_loaded = 1;
|
|
load_history();
|
|
}
|
|
|
|
if ($rl_mode eq "terminal") {
|
|
if (defined ($line = $_rl->readline($prompt))) {
|
|
save_line($line);
|
|
chomp $line;
|
|
return $line;
|
|
} else {
|
|
return undef;
|
|
}
|
|
} else {
|
|
print "$prompt";
|
|
if (defined ($line = readline(*STDIN))) {
|
|
save_line($line);
|
|
chomp($line);
|
|
return $line;
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
}
|
|
1;
|