Я знаю, что tput sc
сохраняет текущую позицию курсора, а tput rc
восстанавливает ее именно там, где был вызван tput sc
. Проблема в том, что каждый раз, когда вызывается tput sc
, он перезаписывает предыдущую сохраненную позицию.
Есть ли способ сохранить больше позиций, например, tput sc pos1
и tput sc pos2
, которые можно восстановить, скажем, с помощью tput rc pos1
и tput rc pos2
соответственно? (В решении не обязательно использовать tput
, я упомянул его, потому что это единственная из известных мне команд, которая обрабатывает положение курсора)
Если нет, есть ли способ по крайней мере сохранить положение курсора локально в функции, так что если функция использует tput sc
и затем вызывает другую функцию, которая снова запускается tput sc
, то каждая функция восстанавливает свою собственную сохраненную позицию курсора при вызове tput rc
?
Заранее спасибо.
Можно использовать следующую функцию для извлечения текущей позиции курсора в простом массиве:
extract_current_cursor_position () {
export $1
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
echo -en "\033[6n" > /dev/tty
IFS=';' read -r -d R -a pos
stty $oldstty
eval "$1[0]=$((${pos[0]:2} - 2))"
eval "$1[1]=$((${pos[1]} - 1))"
}
(источник кода, используемого в этой функции, был взят и адаптировался из этого ответа),
Теперь, например, для сохранения текущей позиции курсора в pos1
, использование:
extract_current_cursor_position pos1
Сохранить текущую позицию курсора в pos2
, использование:
extract_current_cursor_position pos2
Видеть позиции курсора, сохраненные в pos1
и pos2
, можно использовать:
echo ${pos1[0]} ${pos1[1]}
echo ${pos2[0]} ${pos2[1]}
Перемещаться/восстанавливать позицию курсора в pos1
, необходимо использовать:
tput cup ${pos1[0]} ${pos1[1]}
Перемещаться/восстанавливать позицию курсора в pos2
, необходимо использовать:
tput cup ${pos2[0]} ${pos2[1]}
Команда tput
работает через последовательности управления терминалом, перечисленные здесь: http://sydney.edu.au/engineering/it/~tapted/ansi.html Существует последовательность для извлечения текущей позиции. (Query Cursor Position - \e[6n
) и похоже, что его нет в tput
. Чтобы извлечь его, используйте:
stty -echo; echo -n Теперь вы можете извлечь положение строки, сохраненное в $x
, в другую переменную и переместить курсор, используя tput cup
позже:
$ echo $my_saved_pos
12
$ tput cup $my_saved_pos 0
\e[6n'; read -d R x; stty echo; echo ${x#??}
30;1
Теперь вы можете извлечь положение строки, сохраненное в $x
, в другую переменную и переместить курсор, используя tput cup
позже:
$ echo $my_saved_pos
12
$ tput cup $my_saved_pos 0
tput
был упомянут с a ?
, поэтому рассмотрите коды перемещения кодов ANSI:
$'\e[s'
- Сохраняет текущую позицию$'\e[u'
- Восстанавливает предыдущее положениеПример:
$ printf "\e[s\e[6CWORLD\e[uHELLO\n"
HELLO WORLD