0

是否可以使用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;
                }
            }
        }
    } 
}
4

1 回答 1

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:我现在发布了libtermkey0.15 和Term::TermKey0.14,它们具有上述 API。

于 2012-04-24T11:10:37.223 回答