Последовательность выхода из режима управления терминалом: как перехватить строку и столбец с помощью "\e[6n"?
Как я могу поймать строку и столбец в переменных вместо распечатки (здесь ^[[12;1R
)?
#!/usr/bin/env perl
use warnings;
use 5.012;
print "\n" x 10;
say "\e[6n";
2 ответа
Решение
Я нашел это:
#!/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;
}
}
}
}
}
Извините, что это заняло некоторое время, я добавил эту функцию много лет назад, но забыл обновить вопрос;)
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;
}
}