Как я могу получить положение курсора в терминале?

Я знаю, что могу сохранить позицию, используя tput sc, но как я могу прочитать его положение в переменной? Мне нужен номер строки. Я не хочу использовать curses/ncurses.

1 ответ

На ANSI-совместимых терминалах распечатывается последовательность ESC[6n сообщит приложению позицию курсора как (как будто набрано на клавиатуре) ESC[n;mR, где n это строка и m это столбец.

Пример:

~$ echo -e "\033[6n"

Редакция:

Вы должны убедиться, что вы читаете ввод с клавиатуры. Терминал будет "печатать" только ESC[n;mR последовательность (без клавиши ВВОД). В bash Вы можете использовать что-то вроде:

echo -ne "\033[6n"            # ask the terminal for the position
read -s -d\[ garbage          # discard the first part of the response
read -s -d R foo              # store the position in bash variable 'foo'
echo -n "Current position: "
echo "$foo"                   # print the position

Пояснение: -d R (разделитель) аргумент сделает read остановитесь на чарсе R вместо разделителя записей по умолчанию (ENTER). Это будет хранить ESC[n;m в $foo, Разрез использует [ в качестве разделителя и выбрав второе поле, позволяя n;m (строка столбец).

Я не знаю о других снарядах. Ваш лучший снимок - какой-то один в Perl, Python или что-то в этом роде. В Perl вы можете начать со следующего (непроверенного) фрагмента:

~$ perl -e '$/ = "R";' -e 'print "\033[6n";my $x=<STDIN>;my($n, $m)=$x=~m/(\d+)\;(\d+)/;print "Current position: $m, $n\n";'

Например, если вы введете:

~$ echo -e "z033[6n"; cat > foo.txt

Нажмите [ENTER] пару раз, а затем [CRTL]+[D]. Тогда попробуйте:

~$ cat -v foo.txt
^[[47;1R

n а также m значения 47 и 1. Обратитесь к статье Википедии о кодах выхода ANSI для получения дополнительной информации.

До Интернета, в золотые дни BBS, старые пукающие, как я, очень забавлялись этими кодами.

Другие вопросы по тегам