终端控制转义序列:如何用“\ e [6n”?捕获行和列?

时间:2012-02-13 08:23:13

标签: perl terminal row ansi-escape

如何在变量中捕获行和列而不是打印出来(这里是^[[12;1R)?

#!/usr/bin/env perl
use warnings;
use 5.012;

print "\n" x 10;

say "\e[6n";

2 个答案:

答案 0 :(得分:0)

我发现了这个:

#!/usr/bin/env perl
use warnings;
use 5.012;
use Term::ReadKey;

ReadMode 4;

system( 'clear' ) == 0 or die $?;

print "\e[6n";
my ( $x, $y ) = getch();
say "Col: $x  -  Row: $y";


print "Hello world\n" x 6;

print "\e[6n";
( $x, $y ) = getch();
say "Col: $x  -  Row: $y";


print "String\n" x 5;
print "go to column 21 -> |";


print "\e[6n";
( $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;
                }
            }
        }
    } 
}

答案 1 :(得分:0)

很抱歉这需要一段时间,我在很久以前就添加了这个功能,然后忘了更新问题;)

use Term::TermKey;

my $termkey = Term::TermKey->new( \*STDIN );

STDOUT->autoflush( 1 );
print "\e[6n";

while( $termkey->waitkey( my $key ) == RES_KEY ) {
   if( $key->type_is_position ) {
      printf "Position is %d, %d\n", $key->col, $key->line;
      last;
   }
}