AnyEvent-ReadLine-Gnu
view release on metacpan or search on metacpan
=over 4
=cut
package AnyEvent::ReadLine::Gnu;
use common::sense;
use AnyEvent;
BEGIN {
# we try our best
local $ENV{PERL_RL} = "Gnu";
require Term::ReadLine;
require Term::ReadLine::Gnu;
}
use base Term::ReadLine::;
our $VERSION = '1.1';
=item $rl = new AnyEvent::ReadLine::Gnu key => value...
Creates a new AnyEvent::ReadLine object.
Actually, it only configures readline and provides a convenient way to
call the show and hide methods, as well as readline methods - this is a
singleton.
The returned object is the standard L<Term::ReadLine::Gnu> object, all
methods that are documented (or working) for that module should work on
this object.
Once initialised, this module will also restore the terminal settings on a
normal program exit.
The callback will be installed with the C<CallbackHandlerInstall>, which
means it handles history expansion and history, among other things.
The following key-value pairs are supported:
=over 4
=item on_line => $cb->($string)
The only mandatory parameter - passes the callback that will receive lines
that are completed by the user.
The string will be in locale-encoding (a multibyte character string). For
example, in an utf-8 using locale it will be utf-8. There is no portable
way known to the author to convert this into e.g. a unicode string.
=item prompt => $string
The prompt string to use, defaults to C<< > >>.
=item name => $string
The readline application name, defaults to C<$0>.
=item in => $glob
The input filehandle (should be a glob): defaults to C<*STDIN>.
=item out => $glob
The output filehandle (should be a glob): defaults to C<*STDOUT>.
=back
=cut
our $self;
our $prompt;
our $cb;
our $hidden;
our $rw;
our ($in, $out);
our $saved_point;
our $saved_line;
# we postpone calling the user clalback here because readline
# still has the input buffer at this point, so calling hide and
# show might not have the desired effect.
sub on_line {
my $line = shift;
my $point = $self->{point};
AE::postpone sub {
$cb->($line, $point);
};
}
sub new {
my ($class, %arg) = @_;
$in = $arg{in} || *STDIN;
$out = $arg{out} || *STDOUT;
$prompt = $arg{prompt} // "> ";
$cb = $arg{on_line} || $arg{cb}
or do { require Carp; Carp::croak ("AnyEvent::ReadLine::Gnu->new on_line callback argument mandatry, but missing") };
$self = $class->SUPER::new ($arg{name} || $0, $in, $out);
$Term::ReadLine::Gnu::Attribs{term_set} = ["", "", "", ""];
$self->CallbackHandlerInstall ($prompt, \&on_line);
$hidden = 1;
$self->show;
$self
}
=item $rl->hide
=item AnyEvent::ReadLine::Gnu->hide
These methods I<hide> the readline prompt and text. Basically, it removes
the readline feedback from your terminal.
It is safe to call even when AnyEvent::ReadLine::Gnu has not yet been
initialised.
This is immensely useful in an event-based program when you want to output
some stuff to the terminal without disturbing the prompt - just C<hide>
readline, output your thing, then C<show> it again.
( run in 0.862 second using v1.01-cache-2.11-cpan-df04353d9ac )