Терминал: где я?
Есть ли переменная или функция, которая может сказать мне фактическую позицию курсора?
#!/usr/bin/env perl
use warnings;
use 5.012;
use Term::ReadKey;
use Term::Cap;
use POSIX;
my( $col, $row ) = GetTerminalSize();
my $termios = new POSIX::Termios;
$termios->getattr;
my $ospeed = $termios->getospeed;
my $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
# some movement ...
# at which position (x/y) is the cursor now?
4 ответа
Я не думаю, что вы можете определить положение курсора, используя termcap
,
Руководство termutils гласит:
Если вы планируете использовать команды относительного перемещения курсора в прикладной программе, вы должны знать, какова начальная позиция курсора. Для этого необходимо отслеживать положение курсора и обновлять записи каждый раз, когда на терминал выводится что-либо, включая графические символы.
Вы могли бы использовать curses
вместо. Она имеет getcurx()
а также getcurx()
, Для этого есть модуль CPAN (и libcurses-perl
пакет в Debian или Ubuntu).
Некоторые терминалы могут поддерживать запрос позиции, как CSI 6 n
, Если поддерживается, положение будет сообщено как CSI Pl;Pc R
, Например
$ echo -e "\e[6n"; xxd
^[[4;1R
0000000: 1b5b 343b 3152 0a .[4;1R.
Это сообщает, что курсор находится в 1-м столбце 4-й строки (считая от 1).
Однако на это, вероятно, не следует полагаться, так как на самом деле не очень многие терминалы поддерживают это.
Печать ESC[6n на ANSI-совместимых терминалах даст вам текущую позицию курсора в виде ESC[n;mR, где n - строка, а m - столбец
Поэтому попробуйте прочитать его с помощью escape-символов терминала. Что-то вроде того:
perl -e '$/ = "R";' -e 'print "\033[6n";my $x=<STDIN>;my($n, $m)=$x=~m/(\d+)\;(\d+)/;print "Current position: $m, $n\n";'