Сохранение большего количества позиций corsor (с tput?) В терминале bash

Я знаю, что 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?

Заранее спасибо.

5
задан 26 October 2013 в 13:49

3 ответа

Можно использовать следующую функцию для извлечения текущей позиции курсора в простом массиве:

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]}
5
ответ дан 26 October 2013 в 13:49

Команда 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
0
ответ дан 26 October 2013 в 13:49

tput был упомянут с a ?, поэтому рассмотрите коды перемещения кодов ANSI:

  • $'\e[s' - Сохраняет текущую позицию
  • $'\e[u' - Восстанавливает предыдущее положение

Пример:

$ printf "\e[s\e[6CWORLD\e[uHELLO\n"
HELLO WORLD
1
ответ дан 26 October 2013 в 13:49

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

Похожие вопросы: