Как я могу получить положение курсора в терминале?
Я знаю, что могу сохранить позицию, используя 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, старые пукающие, как я, очень забавлялись этими кодами.