терминал: где я? - PullRequest
       43

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

4 голосов
/ 10 февраля 2011

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

#!/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 ]

4 голосов
/ 10 февраля 2011

Вместо этого вы можете использовать curses. Он имеет getcurx() и getcurx(). Для него есть модуль CPAN (и пакет libcurses-perl в Debian или Ubuntu).

3 голосов
/ 10 февраля 2011

Не думаю, что вы можете определить положение курсора, используя termcap.

В руководстве по termutils написано:

Если вы планируете использовать команды относительного перемещения курсора в прикладной программе, вы должны знать, какова начальная позиция курсора. Для этого необходимо отслеживать положение курсора и обновлять записи каждый раз, когда на терминал выводится что-либо, включая графические символы.

1 голос
/ 22 апреля 2012

Некоторые терминалы могут поддерживать запрос позиции, как CSI 6 n. Если поддерживается, позиция будет сообщаться как CSI Pl;Pc R. Например

$ echo -e "\e[6n"; xxd

^[[4;1R
0000000: 1b5b 343b 3152 0a                      .[4;1R.

Сообщает, что курсор находится в 1-м столбце 4-й строки (считая от 1).

Однако на это, вероятно, не следует полагаться, так как на самом деле не очень много терминалов поддерживают это.

0 голосов
/ 03 мая 2013

Печать 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";'
...