AnyEvent-ReadLine-Gnu
view release on metacpan or search on metacpan
=head1 DESCRIPTION
The L<Term::ReadLine> module family is bizarre (and you are encouraged not
to look at its sources unless you want to go blind). It does support
event-based operations, somehow, but it's hard to figure out.
It also has some utility functions for printing messages asynchronously,
something that, again, isn't obvious how to do.
This module has figured it all out for you, once and for all.
=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;
( run in 2.020 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )