Терминал: где я?

Есть ли переменная или функция, которая может сказать мне фактическую позицию курсора?

#!/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(), Для этого есть модуль CPANlibcurses-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";'
Другие вопросы по тегам