是否可以Term::TermKey以Term::ReadKey类似的方式抓住光标位置:
#!/usr/bin/env perl
use warnings;
use 5.12.0;
use Term::ReadKey;
ReadMode 4;
system( 'clear' ) == 0 or die $?;
print "Hello world\n" x 4;
print "go to column 21 -> |";
print "\e[6n";
my ( $x, $y ) = getch();
say "Col: $x - Row: $y";
ReadMode 0;
sub getch {
my $c = ReadKey 0;
if ( $c eq "\e" ) {
my $c = ReadKey 0.10;
if ( $c eq '[' ) {
my $c = ReadKey 0;
if ( $c =~ /\A\d/ ) {
my $c1 = ReadKey 0;
if ( $c1 ne '~' ) {
my $y = 0 + $c;
while ( 1 ) {
last if $c1 eq ';';
$y = 10 * $y + $c1;
$c1 = ReadKey 0;
}
my $x = 0;
while ( 1 ) {
$c1 = ReadKey 0;
last if $c1 eq 'R';
$x = 10 * $x + $c1;
}
return $x, $y;
}
}
}
}
}
答案 0 :(得分:2)
还没有,但我正在制定计划。它可能会被报告为新的事件类型,如下所示:
use Term::TermKey;
my $tk = Term::TermKey->new;
syswrite STDOUT, "\e[6n";
while( $tk->waitkey( my $key ) ) {
if( $key->type_is_position ) {
printf "The cursor is at %d, %d\n", $key->line, $key->col;
}
}
首先需要在底层C库中提供一些额外的支持,包括挂钩其他CSI序列的能力。一旦进入,虽然未来应该更容易支持更多,例如来自CSI的许多其他状态报告。
编辑2012/04/26 :我现在已经发布libtermkey
0.15和Term::TermKey
0.14,其中包含如上所述的API。