2015-02-18 5 views
1

В настоящее время я планирую создать собственный Vim-подобный редактор. Он будет написан на C, и я хочу, чтобы он был настолько переносимым, насколько это возможно, как можно больше типов систем.Любой способ сделать переносные терминальные управляющие последовательности?

Я знаю, проклятий (Ncurses, я полагаю), команда tput, и как терминалы используют последовательность управления (Esc- [и характер CSI), чтобы изменить фон, перемещать курсор и т.д.

Из вышеперечисленных вариантов кажется, что ncurses будет наиболее рекомендуемым способом печати для редактора. НО у ncurses также есть много вещей, которые я бы скорее не использовал, и если это разумно выполнимо, я бы предпочел создать свою собственную систему. Я не против использования этого, но ... в любом случае.

Итак, мой вопрос: есть ли способ использовать контрольные последовательности в подавляющем большинстве терминалов без использования библиотеки? Через tput или другой метод?

Спасибо!

+0

Это * * цель проклятий. Если вы не хотите его использовать, вы можете объяснить, почему более подробно. Тем не менее, да, вы должны иметь возможность получить такую ​​же степень переносимости, используя terminfo или termcap напрямую (хотя это не «без использования библиотеки»). И, на практике, вы, вероятно, могли бы покрыть большинство терминалов набором последовательностей ESC с усиленным интерфейсом ... но я не рекомендую это делать. –

ответ

1

tput(1)terminfo(5) использует (или старше) termcap(5) базу данных, которая обеспечивает отображение от абстрактных команд, таких как перемещения курсора х, у, чтобы избежать последовательностей для различных терминалов. При выполнении команды типа

$ tput cup 10 3 # move cursor to row/column 10/3 

, база данных TERMINFO опрашивается, чтобы найти правильную строку для вашего терминала, который затем просто записывается на стандартный вывод. Чтобы найти доступные команды (например, cup), посмотрите на кол-во в terminfo(5). tput определяет, какой терминал вы используете, просматривая переменную окружения TERM.

(Это означает, что вы можете проверить, что побег символов генерируются просто делать $ tput [command] > [file] и открытие [file] в некотором редакторе, который может показать управляющие символы, которые могут быть удобны для исследования. Команда infocmp(1) также может быть использована для этого.)

Если вы используете tput (или лежащий в основе tputs(3)), ваша программа, следовательно, автоматически переносится на разные терминалы. Это то, что Вим использует кстати.

Однако в современном мире практически все терминалы (или эмуляторы терминалов) используют ANSI escape codes, а также некоторые расширения (см. XTerm Control Sequences). Я считаю, что экраны, поддерживаемые xterm, и их поведение на данный момент стали стандартом де-факто, а другие эмуляторы терминала просто копируют поведение xterm. Некоторые текстовые библиотеки пользовательского интерфейса, такие как termbox, по-видимому, устраняют поддержку терминалов, отличных от ANSI, и выводят ANSI-экраны напрямую.

К тому же уже упомянутый терминbox также содержит S-Lang, который включает в себя компонент обработки терминала. Я считаю, что это две самые популярные «замены ncurses». Сначала я дал ncurses.

Смежные вопросы