Перемотать назад блок текста в командах терминала VT100

В основном я хочу манипулировать выводом некоторой программы, подключенной к терминалу, чтобы нижняя часть текста всегда представляла собой произвольный блок текста (назовем его нижним колонтитулом), а нормальный вывод программы отображался над этим. Если бы этот нижний колонтитул был ограничен одной строкой терминала, это было бы очень легко сделать, просто очистив текущую строку, переместив курсор в начало строки перед каждым вызовом write, а затем переписав нижний колонтитул. Однако, если мой желаемый нижний колонтитул занимает несколько терминальных строк, включая символы новой строки или строки, обтекающие край экрана, все усложняется. Я подумал, что смогу обойти это с помощью управляющих кодов «сохранить курсор» и «восстановить курсор» VT100, которые будут выдаваться как таковые при каждой записи:

  1. восстановить курсор
  2. желаемый write звонок
  3. сохранить курсор
  4. выходной нижний колонтитул

Однако они не работают, когда выводимый текст достигает нижней части терминала, поскольку сохраненный курсор всегда будет находиться в нижней строке.

Есть ли способ добиться этого произвольного нижнего колонтитула терминала? Идеально было бы что-то с кодами VT100, но если единственный способ - использовать проклятия, то я полагаю, что это тоже возможно.


person user2601195    schedule 07.08.2018    source источник
comment
размер терминала подлежит изменению?   -  person Jasen    schedule 08.08.2018
comment
Вот почему они написали библиотеку curses давным-давно.   -  person AlexP    schedule 08.08.2018


Ответы (2)


Вы можете сделать это, используя область прокрутки. Что-то вроде этого (имея в виду, что, хотя вы можете жестко кодировать escape-последовательности, это более читабельно):

#!/bin/sh
rows=$(tput lines)
foot=$((rows - 4))
tput csr 1 $((foot - 1))
count=0
while true
do
        date
        count=$((count + 1))
        tput sc
        tput cup $foot 1
        printf "Total cycles %d", $count
        tput rc
        sleep 1
done
person Thomas Dickey    schedule 08.08.2018
comment
Область прокрутки <ESC>[{start};{end}r выглядит так, как будто она добьется цели. Мне просто нужно сделать максимальное количество строк для нижнего колонтитула. - person user2601195; 08.08.2018

Проблема в том, что VT100 не поддерживает текстовые окна или окна с фиксированной прокруткой (возможно, это лучший термин).

Таким образом, это оставляет вам управлять.

Curses было бы проще всего, потому что вы могли бы в своем коде просто открыть два отдельных окна, одно для «текста», одно для нижнего колонтитула, а затем позволить curses обновлять экран по своему усмотрению.

Только с необработанным VT100 вам придется отслеживать, когда прокручивать. Когда вы выполняете прокрутку, вы можете удалить верхнюю строку, затем вставить пустую строку непосредственно перед нижним колонтитулом, а затем написать новую пустую строку.

Проклятия, конечно же, справятся со всем этим за вас.

person Will Hartung    schedule 07.08.2018