Как достигается "взаимопонимание" программ с терминалом termcap, terminfo и переменная TERM).
  Если в операционной системе Юникс для ввода/вывода можно использовать множество различных терминалов, отличающихся и размером экрана (количество строк и символов в строке), и командами управления экраном, и кодами, которые генерируют клавиши и т.п., то как же одна и та же программа может работать
со всем этим "зоопарком"?
 Вообще-то, этот вопрос выходит за рамки описания драйвера syscons. Но, поскольку некоторые настройки syscons превращают его в "немного другой"
терминал (меняют количество строк на экране, коды, выдаваемые
"функциональными" клавишами, и набор символов), то рассмотрим его хотя бы
вкратце.
  
  Конечно, любая программа, если она претендует на то, чтобы работать на терминалах разных типов, и не должна знать - как на конкретном терминале
очистить экран или какой код выдает клавиша "стрелка вверх".
  Для этого в Юниксе существует специальная "база данных свойств терминалов" -
termcap. Каждый тип терминала в этой "базе данных" имеет свое название и
перечень его "свойств".
  Свойствами терминала могут быть
  -  общие характеристики терминала, например
	-       co#80 - количество колонок (в данном случае - 80)
	
-       li#25 - количество строк (в данном случае - 25)
	
-       pt - терминал сам отрабатывает код Tab
	
-       ...
 
-  коды, которые нужно выводить на экран для управления курсором, очистки
   экрана (или части экрана), смены цветов, атрибутов и т.п., например
	-       up=\E[A  - как сдвинуть курсор вверх
	
-       cl=\E[H\E[J - как очистить экран
	
-       mb=\E[5m - как включить "мерцание"
	
-       ...
 
-  коды, которые выдают "специальные" клавиши терминала, например
	-       k1=\E[M - код от клавиши F1
	
-       kD=\177 - код от клавиши Delete
	
-       ku=\E[A - код от клавиши "стрелка вверх"
	
-       ...
 
  Естественно, названия "свойств" (co, li, up, cl, k1, kD ...) являются стандартом, а вот их значения как раз зависят от конкретного типа терминала.
  Программа должна
	-      при старте выяснить - как называется терминал, на котором ее запустили,
	
-      считать из базы данных все свойства этого терминала
	
-      и в дальнейшей работе "сверяться" с этими данными.
  Если ей, например, нужно очистить экран, она должна найти "свойство" cl и вывести на терминал соответствующую последовательность кодов. А если на ввод от терминала пришла последовательность кодов "Esc[M", она должна найти - какому из "свойств" соответствует эта строчка и, обнаружив, что
это - k1, сделать вывод, что пользователь нажал клавишу F1.
  Надо сразу заметить, что для выполнения всех этих действий существуют различные библиотеки (ncurses, slang и т.п.). Поэтому, если вы возьметесь писать свою программу (типа редактора), то совсем не обязательно самому
делать подробный разбор "свойств" терминала и поиск в них различных клавиш.
  Главное, что вам нужно знать - чтобы программы (ваши и чужие) правильно работали с терминалом
	-    нужно "сообщить" программам - как называется ваш терминал в "базе данных"
	
-    описание "свойств" этого терминала должно точно соответствовать реальным свойствам вашего терминала.
  Для "сообщения" программам названия вашего терминала служит "переменная окружения" TERM. Если вы работаете с syscons в стандартном "режиме отображения" (25 строчек), эта переменная должна иметь значение cons25 или cons25r (если syscons русифицирован).
  Вообще-то, переменная TERM автоматически устанавливается при входе в систему. FreeBSD берет ее значение из файла /etc/ttys или она явно устанавливается в ваших "стартовых командных файлах" (.login, .profile, .cshrc
и т.п.).
  Но, если вы в ходе работы измените настройки syscons, которые меняют размер экрана, коды "функциональных" клавиш или набор "псевдографики", то
реальные свойства syscons уже не будут соответствовать тому описанию, которое
хранится в termcap. В этом случае, скорее всего, придется найти "более
подходящее" описание терминала в базе данных и, соответственно, поменять
значение переменной TERM.
  Напомню, что кроме cons25, в termcap имеются описания для того же syscons, но с большим количеством строк (cons30, cons50, cons60) или с другим набором "псевдографики" (cons25r).
 В конце концов, если вы не сможете подобрать подходящий терминал из имеющихся в базе, можно подправить какое-нибудь описание из уже имеющихся
или (что, пожалуй, лучше) сочинить новое имя и составить для него описание.
При этом учтите, что вам совсем не обязательно делать полное описание всех свойств. Существует специальное "свойство" в termcap - tc="имя терминала".
Оно означает - "остальные свойства взять из описания указанного терминала". Поэтому, вам достаточно "до-определить" или "пере-определить" только несколько параметров, а в конце указать - tc=cons25 ("остальное взять из описания cons25"). Естественно, если вы опишете в вашем новом терминале какой-нибудь параметр, который и так уже описан в cons25, то использоваться будет именно ваше определение.
  
  Не могу не сказать несколько слов о проблеме соответствия между реальными свойствами терминалов и их описанием в termcap. К сожалению, расхождения случаются довольно часто. И речь не только о клавише Delete в syscons.
  Я сталкивался с несоответствием кодов клавиш у программы xterm и ее описания терминала xterm, а уж всевозможные телнеты из других ОС (MS DOS, MS Windows), хотя и берутся изображать из себя ANSI-терминал или VT100, очень редко делают это полностью в соответствии с termcap.
  Что делать в таких случаях? Понятно, что для полного соответствия надо либо исправлять описание в termcap, либо "подправлять" саму программу,
эмулирующую терминал. Другой вопрос - что лучше?
  Если "поднастроить" программу невозможно, то ответ однозначный - исправить termcap или создать в нем новое описание, специально для конкретной программы-эмулятора.
  Другое дело, что большинство таких программ можно "перенастроить" через их
файлы конфигурации. В этом случае, обычно, лучше подправить свойства программы.
 Ну и, конечно, первым делом надо поискать в termcap наиболее подходящее
описание, возможно оно там уже есть.
  И, наконец, ответ на вопрос - "что лучше" может отличаться в зависимости
от конкретных условий.
  Если речь идет о вашем персональном компьютере, куда посторонние не заглядывают, то - "без разницы" как вы добьетесь соответствия.
  Если это машина, на которую многие ходят телнетом (или xterm'ом), да еще и с разных платформ, то исправление termcap под одних клиентов может оказаться "багом" для других. Понятно, что в этом случае лучше его не трогать.
  А вот если речь идет об организации, в которой всем пользователям ставится одна и та же программа для доступа к Юникс-серверу (да еще и выяснится, что
программу уже поставили на многие рабочие станции, а она не "подстроена"),
то может оказаться проще все-таки изменить termcap.
  Короче, решайте сами :)
   
  Кроме termcap существует еще одна "база данных свойств терминала" terminfo.
Ее назначение точно такое же как и у termcap (просто они "зародились" в разных ветвях Юникса). Отличается она только названиями "свойств" и форматом (termcap содержит все описания в одном большом текстовом файле, а terminfo хранит каждый тип терминала в отдельном файлике и в двоичном формате).
  В стандартной поставке FreeBSD она отсутствует и, как правило, необходимости в ней нет.
  Но, если вам придется работать с другими платформами Юникса или какая-нибудь программа пожелает брать данные именно из terminfo (а не удовлетворится termcap'ом), то воспользуйтесь утилитой tconv (смотри man tconv). Она выполняет "конвертирование" из termcap в terminfo и обратно.
Иван Паскаль pascal@tsu.ru