xterm/vt102, чтобы заполнить окно терминала, а затем выйти при нажатии клавиши, очищая все, что было на экране?

Я пытаюсь разобраться в последовательностях VT102 и в том, как работают такие библиотеки, как ncurses.

Например, когда я открываю Emacs, он заполняет окно терминала. Когда я нажимаю Cx Cc, программа закрывается, и мое окно терминала выглядит точно так же, как оно выглядело до того, как я запустил emacs (т.е. строка над моим курсором показывает команду emacs в моем zsh история, а не то, что отрендерил emacs).

В качестве своего рода «привет, мир» я написал небольшой ruby-скрипт, который открывает /dev/tty, а затем записывает \x1B[48;597m\n (пустые строки с фоновым цветом) для всех строк, которые есть в моем терминале. Затем программа засыпает на 5 секунд, и я на мгновение счастливо смотрю на ярко-оранжевый экран. Затем он закрывается, оставляя меня на подсказке zsh с 53 ярко-оранжевыми строками над ним.

Два вопроса:

  1. Является ли запись пустых строк с фоновым цветом правильным способом заполнения окна терминала цветом?
  2. Как полностью очистить экран, отправив последовательность VT102 в /dev/tty?

Я могу отправить \x1B[2J, но это делает то же самое, что и когда я выполняю команду clear, а на самом деле просто сдвигает все содержимое вверх по окну терминала, пока мой курсор не окажется в самом верху пустого окна, а не покидает мой курсор там, где он был бы естественным образом, если бы моя программа не выводила на экран кучу пустых строк.

PS: Не уверен, какие теги использовать здесь, на которые кто-то может быть подписан.


person d11wtq    schedule 08.05.2012    source источник


Ответы (1)


Является ли запись пустых строк с фоновым цветом правильным способом заполнения окна терминала цветом?

Нет. Правильный способ сделать это (на терминале, поддерживающем BCE*) — установить цвет фона, а затем стереть экран с помощью последовательности ED (например, ^[ [ 2 J).

*: большинство современных терминалов

Как полностью очистить экран, отправив последовательность VT102 в /dev/tty?

Использование ЭД. См. выше.

Если вы на самом деле хотите переключиться на альтернативный экран (как это делает emacs в вашем примере), альтернативный экран управляется приватным режимом 1049. Вы можете переключиться на него, используя ^[ [ ? 1 0 4 9 h, и переключиться обратно, используя ^[ [ ? 1 0 4 9 l. Обратите внимание, однако, что это расширение xterm; он не совсем стандартный и не поддерживается никакими аппаратными терминалами DEC (например, VT102).

person Community    schedule 08.05.2012
comment
Круто, новые ключевые слова, спасибо :) [?1049h и [?1049l делают почти правильные вещи, за исключением размещения курсора в верхней части экрана после выхода. Я собираюсь прочитать об этих расширениях, которые вы упомянули. - person d11wtq; 09.05.2012
comment
Режим ?1049 должен сохранять и восстанавливать курсор, когда вы устанавливаете/сбрасываете его - убедитесь, что вы случайно не делаете ничего, что приведет к размещению курсора до/после. См. rtfm.etla.org/xterm/ctlseq.html для получения списка дополнительных настроек. последовательности и vt100.net/docs для оригинальных документов DEC. - person ; 09.05.2012
comment
Оказывается, я просто наполовину спал и набрал «1» вместо «л» ;) Большое спасибо, я на самом деле сейчас приступил к работе и знаю, что ищу! - person d11wtq; 09.05.2012