Как реализован графический интерфейс Vim, если это программа, работающая на терминале?

Как реализован графический интерфейс Vim, если это программа, работающая на терминале?

Я не могу понять, как реализованы такие программы, как Vim (или top, например), которые выполняются внутри терминала и имеют графический интерфейс. Предполагается, что терминал может только отображать символы, а Vim может не только показывать несколько окон, но и управлять курсором, перемещая его во всех направлениях.

Другой пример — Linux.вершинаутилита, которая показывает информацию вв реальном временичто обновляется, как возможно, что эта программа может обновлять информацию вместо того, чтобы делатьпрокрутить внизи показывая новые печатные символы?.

решение1

Приложения, работающие в терминале, могут иметьтекстпользовательский интерфейс, поскольку большинство терминалов не простонемые терминалыкоторые могут только печатать символы и переходить на следующую строку, но «интеллектуальные» терминалы, которые поддерживаютуправляющие символыипоследовательности выходасо значениями, такими как «стереть текущую строку и прокрутить последующие строки вверх», «перейти в позицию (53,7)»», «отныне печатать ярко-красным цветом» и т. д.

Большинство эмуляторов терминала реализуют большую частьescape-последовательности xterm, сам по себе в основном совместим сВТ100Аппаратный терминал и его последователи. Приложения знают, какие последовательности управления отправлять для выполнения различных действий черезtermcapилитерминфобазы данных. СмотретьКак работает ввод с клавиатуры и вывод текста?(раздел «Приложение текстового режима, работающее в терминале») иКак и где интерпретируется $TERM?Больше подробностей.

Помимо текстового пользовательского интерфейса, Vim также имеет графический пользовательский интерфейс, называемый GVim. Этот интерфейс работает на графическом терминале, который реализуетпротокол X11, не на текстовом терминале (но, конечно, вы можетезапускприложение из текстового терминала, оно просто не будет отображаться в этом терминале).

решение2

vimи gvimмогут быть отдельными исполняемыми файлами, связанными с разными библиотеками. Возможно иметь один исполняемый файл, выполняющий любой интерфейс (например, elvis и emacs делают это). vim 4.0 в 1996 году добавил опцию, -gпозволяющую указать ему использовать версию GUI (которая в этом случае будет частью того же исполняемого файла).

Я не нашел копию объявления для версии 4.0 (которая могла бы дать некоторые подсказки относительно мотивации этой -gопции (рассылка объявлений vim началась в1997), но см. упоминание об этом в старом FAQ Лорана Дюперваля:

7.3 How can I make Vim faster on a Unix station?

   The GUI support in Vim 4.0 can slow down the startup time noticeably.
   Until Vim supports dynamic loading, you can speed up the startup time
   by compiling two different versions of Vim: one with the GUI and one
   without the GUI and install both. Make sure you remove the link from
   $bindir/gvim to $bindir/vim when installing the GUI version, though.

   If screen updating is your problem, you can run Vim in screen. screen
   is an ascii terminal multiplexer. The latest version can be found at
   <URL:ftp://ftp.uni-erlangen.de:/pub/utilities/screen>.

Насколько я помню, довольно долгое время существовало два исполняемых файла (когдачто(изменение потребовало бы довольно обширного исследования фактически используемых пакетов). Но такая возможность появилась еще в 1996 году.

При наличии любого типа интерфейса существуют способы обновления дисплея. Для gvim, который использует библиотеки X, в то время как терминальные приложения, такие как top(илиvim) использовать escape-последовательности. В зависимости от системы, оба ониtermcapПриложения, получая свой репертуар управляющих последовательностей с помощью интерфейса termcap ncurses и т. д. (некоторые версии topна самом делеиспользоватьncurses для отображения, например, htop). vim дополняет этот репертуар, используя встроенные таблицы (которые часто избыточны).

Интересно, procpsчто версия topв Debian (относительная редкость)терминфоприложение, как можно увидеть, проверив егоисходный код.

решение3

После появления оригинального TTY появились терминалы, заменяющие принтер на VDU.

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

ASCII предоставил достаточно управляющих символов для базового линейного принтера, но не предвосхитил VDU. Дополнительные специфичные для терминала элементы управления кодируются в ASCII с помощью "escape". Последовательность escape начинается с escape-символа ASCII. Следующие символы в последовательности интерпретируются как специфичные для терминала элементы управления.

Визуальный редактор viявляется хорошим примером приложения, использующего эту новую технологию.

Наборы кодов выхода стандартизируются. Если у вас есть достаточно свежая документация, "ANSI escape" может быть хорошим термином для поиска виндекс.

Связанный контент