На терминалах, совместимых с ANSI, печать последовательности ESC[6n
сообщит приложению о позиции курсора как (как будто набрано на клавиатуре) ESC[n;mR
, где n
- строка, а m
- столбец.
Пример:
~$ echo -e "\033[6n"
РЕДАКТИРОВАНИЕ:
Вы должны убедиться, что читаете ввод с клавиатуры. Терминал «наберет» только последовательность ESC[n;mR
(без клавиши ENTER). В 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 , старые пукающие, как я, очень забавлялись этими кодами.