Любой способ сделать терминальные последовательности управления переносимыми?
В настоящее время я нахожусь в процессе планирования пользовательского Vim-подобного редактора. Он будет написан на C, и я хочу, чтобы он был как можно более переносимым между всеми типами систем.
Я знаю о curses (ncurses, я полагаю), команде tput и о том, как терминалы используют управляющую последовательность (Esc-[и символ CSI) для изменения фона, перемещения курсора и т. Д.
Из приведенных выше вариантов кажется, что ncurses будет наиболее рекомендуемым способом печати для редактора. НО у ncurses также есть МНОГО вещей, которые я бы предпочел не использовать, и если это будет разумно, я бы предпочел создать свою собственную систему. Я не против его использования, но.. в любом случае.
Итак, мой вопрос: есть ли способ использовать управляющие последовательности в подавляющем большинстве терминалов без использования библиотеки? Будь через тпут или другим способом?
Спасибо!
1 ответ
tput(1)
использует terminfo(5)
(или старше termcap(5)
) база данных, которая обеспечивает отображение из абстрактных команд, таких как перемещение курсора к x,y, для экранирования последовательностей для различных терминалов. Когда вы запускаете команду, такую как
$ tput cup 10 3 # move cursor to row/column 10/3
, база данных terminfo запрашивается для поиска правильной строки для вашего терминала, которая затем просто записывается в стандартный вывод. Чтобы найти доступные команды (например, cup
), посмотрите на столбец cap-name в terminfo(5)
, tput
определяет, какой терминал вы используете, глядя на TERM
переменная окружения.
(Это означает, что вы можете проверить, какие управляющие символы генерируются, просто выполнив $ tput [command] > [file]
и открытие [file]
в каком-то редакторе, который может показывать управляющие символы, которые могут быть полезны для исследования. infocmp(1)
Команда также может быть использована для этого.)
Если вы используете tput
(или основной tputs(3)
), следовательно, ваша программа автоматически переносится на другие терминалы. Это то, что Vim использует, кстати.
Однако в современном мире почти все терминалы (или, скорее, эмуляторы терминалов) используют управляющие коды ANSI вместе с некоторыми расширениями (см. Последовательности управления XTerm). Я считаю, что на этом этапе экранирование, поддерживаемое xterm, и их поведение стали чем-то вроде стандарта де-факто, поскольку другие эмуляторы терминала просто копируют поведение xterm. Некоторые текстовые библиотеки пользовательского интерфейса, такие как termbox, по- видимому, полностью исключают поддержку не-ANSI-терминалов, а выходной ANSI-выход напрямую.
Помимо уже упоминавшегося termbox, есть также S-Lang, который включает в себя компонент обработки терминала. Я считаю, что это две самые популярные "замены ncurses". Я бы сначала дал ncurses некоторое время.