2016-08-28 14 views
3

Когда вы запустите программу прокрутки (n), она удалит полосу прокрутки из эмулятора терминала, очистит экран, журнал прокрутки (история) также исчезнет. Когда вы выходите из программы, содержимое экрана снова появляется, строка прокрутки возвращается и возвращается буфер прокрутки.Как проклятия сохраняют содержимое экрана?

Как это делает ncurses? Я изучил все escape-коды ANSI, я не вижу ничего такого, что могло бы сделать такие вещи. Какая технология стоит за этим?

ответ

2

Технология называется The Alternate Screen Buffer. Терминальный эмулятор предоставляет два режима: первичный и альтернативный. Альтернативный буфер экрана не имеет прокрутки назад, когда вы переключаетесь между этими буферами, содержимое в них сохраняется. Для переключения между ними используйте smcup и rmcup ANSI Escape Sequences. В двоичной форме они:

$ tput smcup|hexdump -C 
00000000 1b 5b 3f 31 30 34 39 68       |.[?1049h| 

$ tput rmcup|hexdump -C 
00000000 1b 5b 3f 31 30 34 39 6c       |.[?1049l| 
4

Это подробно обсуждается в XTerm FAQ Why doesn't the screen clear when running vi?.

ncurses как таковой не делает. Это делается терминалом , учитывая управляющие последовательности, предусмотренные в описании терминала .

Поведение относится к альтернативному буферу экрана , который был введен с xterm в X10R4 (конец 1986 года). Xterm поддерживает два буфер:

  • нормального буфер экрана (то, что вы видите в окне VT100), включая область прокрутки и
  • альтернативного буфер экрана (который не включает в себя область скроллинга)

xterm (и программы, которые используют эту функцию, такие как rxvt) распознают escape-последовательности для переключения между двумя буферами. Так как обычный termcap не имел возможности для этого, разработчики использовали последовательности инициализации termcap ti и te (которые соответствуют терминам smcup и rmcup). Технически имена относятся к режиму адресации курсора, но никто не заботится (много).

чередовать особенность Экрана оригинальной XTERM мог быть подавлен путем удаления во время выполнения в Termcap ti и te возможности (из переменных в TERMCAP среды), но этот подход не может работать с terminfo В, которая использует файлы. С 1997 года xterm реализовал новый набор escape-последовательностей, которые xterm может игнорировать. Несколько других программ позволяют эту функцию подавляться, но, как правило, это не так.