Как я могу получить положение курсора в терминале? - PullRequest
10 голосов
/ 01 декабря 2011

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

1 Ответ

17 голосов
/ 02 декабря 2011

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

...