AnyEvent::TermKey - terminal key input using libtermkey with AnyEvent


 use AnyEvent::TermKey qw( FORMAT_VIM KEYMOD_CTRL );
 use AnyEvent;
 my $cv = AnyEvent->condvar;
 my $aetk = AnyEvent::TermKey->new(
    term => \*STDIN,
    on_key => sub {
       my ( $key ) = @_;
       print "Got key: ".$key->termkey->format_key( $key, FORMAT_VIM )."\n";
       $cv->send if $key->type_is_unicode and
                    $key->utf8 eq "C" and
                    $key->modifiers & KEYMOD_CTRL;


This class implements an asynchronous perl wrapper around the libtermkey library, which provides an abstract way to read keypress events in terminal-based programs. It yields structures that describe keys, rather than simply returning raw bytes as read from the TTY device.

It internally uses an instance of Term::TermKey to access the underlying C library. For details on general operation, including the representation of keypress events as objects, see the documentation on that class.

Proxy methods exist for normal accessors of Term::TermKey, and the usual behaviour of the getkey or other methods is instead replaced by the on_key event.


$aetk = AnyEvent::TermKey->new( %args )

This function returns a new instance of a AnyEvent::TermKey object. It takes the following named arguments:

term => IO or INT

Optional. File handle or POSIX file descriptor number for the file handle to use as the connection to the terminal. If not supplied STDIN will be used.

on_key => CODE

CODE reference to the key-event handling callback. Will be passed an instance of a Term::TermKey::Key structure:

 $on_key->( $key )


$tk = $aetk->termkey

Returns the Term::TermKey object being used to access the libtermkey library. Normally should not be required; the proxy methods should be used instead. See below.

$flags = $aetk->get_flags

$aetk->set_flags( $flags )

$canonflags = $aetk->get_canonflags

$aetk->set_canonflags( $canonflags )

$msec = $aetk->get_waittime

$aetk->set_waittime( $msec )

$str = $aetk->get_keyname( $sym )

$sym = $aetk->keyname2sym( $keyname )

( $ev, $button, $line, $col ) = $aetk->interpret_mouse( $key )

$str = $aetk->format_key( $key, $format )

$key = $aetk->parse_key( $str, $format )

$key = $aetk->parse_key_at_pos( $str, $format )

$cmp = $aetk->keycmp( $key1, $key2 )

These methods all proxy to the Term::TermKey object, and allow transparent use of the AnyEvent::TermKey object as if it was a subclass. Their arguments, behaviour and return value are therefore those provided by that class. For more detail, see the Term::TermKey documentation.


Paul Evans <>