App-Prolix
view release on metacpan or search on metacpan
lib/App/Prolix.pm view on Meta::CPAN
my($self) = @_;
$self->_log->close if $self->_log;
}
# Like: (DateTime->new->iso8601 =~ s/[-:]//g), but I didn't want to add
# a big dependency.
sub now_stamp {
my($self) = @_;
my(@t) = localtime; # Should this be gmtime?
return sprintf "%4d%02d%02dT%02d%02d%02d",
$t[5] + 1900, $t[4] + 1, $t[3], $t[2], $t[1], $t[0]; # Ahh, UNIX.
}
sub stats {
my($self) = @_;
return "Suppressed " . $self->_suppressed . "/" .
$self->_output_lines . " lines.";
}
# returns a fresh reference to a string.
sub _strref {
return \(my $throwaway = "");
}
sub run_pipe {
my($self) = @_;
say "Running in pipe mode" if $self->verbose;
while (<STDIN>) {
chomp;
$self->on_out($_)
}
}
sub run_spawn {
my($self) = @_;
say "Running: " .
String::ShellQuote::shell_quote_best_effort(@{$self->_cmd})
if $self->verbose;
Term::ReadKey::ReadMode("noecho");
END { Term::ReadKey::ReadMode("normal"); }
$self->_term(Term::ReadLine->new("prolix"));
my $attribs = $self->_term->Attribs;
$attribs->{completion_entry_function} =
$attribs->{list_completion_function};
$attribs->{completion_word} = [qw(
help
ignore_line
ignore_re
ignore_substring
pats
quit
snippet
stats
)];
my $t = IPC::Run::timer(0.3);
my $ipc = IPC::Run::start $self->_cmd,
\undef, # no stdin
$self->_out,
$self->_err,
$t;
$t->start;
my $pumping = 1;
while ($pumping && $ipc->pump) {
$self->consume;
try {
$self->try_user_input;
} catch {
when (/prolix-quit/) {
$ipc->kill_kill;
$pumping = 0;
}
default { die $_ }
};
$t->start(0.3);
}
$t->reset;
$ipc->finish;
$self->consume_final;
Term::ReadKey::ReadMode("normal");
}
sub _dump_stack {
print Carp::longmess("************");
$SIG{USR1} = \&_dump_stack;
}
sub try_user_input {
my($self) = @_;
return if not defined Term::ReadKey::ReadKey(-1);
# Enter interactive prompt mode. We hope this will be brief, and
# IPC::Run can buffer our watched command in the meanhwile.
say q{Press ENTER to go back, or enter "help" for a list of commands.}
if $self->verbose;
Term::ReadKey::ReadMode("normal");
while (my $cmd = $self->_term->readline("prolix>")) {
$self->_term->addhistory($cmd);
$self->handle_user_input($cmd);
}
Term::ReadKey::ReadMode("restore"); # into noecho, we hope!
}
sub handle_user_input {
my($self, $cmd) = @_;
(my $nullary = $cmd) =~ s/^\s*(\S+)\s*/$1/;
if ($nullary) {
given ($nullary) {
when ("clear_all") { $self->clear_all }
when ("stack") { _dump_stack }
when ("bufs") { $self->dump_bufs }
when (/q|quit/) { die "prolix-quit\n" }
when (/h|help/) { $self->help_interactive }
( run in 1.767 second using v1.01-cache-2.11-cpan-7fcb06a456a )