ВОЗМОЖНОСТИ ТЕРМИНАЛОВ
Теперь, когда мы имеем понятие о характеристиках терминальных интерфейсов, давайте перейдем к возможностям терминалов. ВОЗМОЖНОСТИ это те функции, которые выполняет аппаратура терминала. Если мы знаем эту информацию, мы можем создать список возможных функций и использовать его, например, для работы редактора vi. Это осуществляется при помощи специального файла данных termcap (terminal capabilities - возможности терминала), который описывает возможности терминала.
Большинство из существующих типов терминалов уже занесены в файл termcap. Это файл /etc/termcap. Файл termcap и редактор vi происходят из системы Berkeley. Такая комбинация оказалась настолько эффективной, что была перенесена в System V. В более поздней System V Release 3 файл termcap уже не используется, его заменяет файл terminfo фирмы AT&T. Мы применяли файл terminfo совместно с командным файлом today в главе 5, но подробное обсуждение terminfo выходит за пределы нашей книги. В системе Berkeley файл termcap по-прежнему остается стандартом, и он заслуживает более детального рассмотрения.
Имеется документация по termcap, но не думайте, что вы из нее много узнаете. В документации приводятся имена и однострочные описания поддерживаемых функций, но нет информации о том, как формировать из ничего записи этого файла. Самое лучшее, что мы можем посоветовать, это взять имеющуюся запись и изменить ее.
В качестве примера мы приводим запись файла termcap для компьютера Apple II. Это описание распространено в различных формах, но наш пример относится к видеоплате Videx UltraTerm для Apple II+. Заметим, что возможности, предоставляемые файлом termcap, являются обычно подмножеством тех возможностей, которые фактически предоставляет аппаратура. В частности, видеоплата в компьютере Apple выполняет некоторые функции, которые не умеет делать файл termcap, например комбинации настроечных битов для изменения видеоатрибутов. Самое большее, что мы можем сделать с видеоатрибутами посредством файла termcap, это включить или выключить инверсное отображение.
С другой стороны, некоторые типы аппаратуры не обладают всеми возможностями, обеспечиваемыми файлом termcap. Например, одной из функций, которой недостает в Apple, является функция прокрутки ("scroll reverse"). Аппаратура не делает этого, поэтому и в termcap нет необходимости иметь описание этой функции. Вместо скроллинга (прокрутки) вниз, отображаемый на экране текст продолжает выводиться в верхней строке.
Для того, чтобы получить представление о том, как termcap соотносит общие характеристики терминала с конкретными возможностями, сравним терминалы Apple и vt52. Две соответствующие записи в termcap имеют много похожих функций, но совершенно разные коды для их выполнения. Приведем пример содержимого файла termcap:
a2|aii|Apple II with UltraTerm :\ :bl=^G:\ :bs:\ :cd=^K:\ :ce=^]:\ :cl=^L:\ :cm=^^%r%+ %+ :\ :co#80:\ :cr=^M:\ :do=^J:\ :ho=^Y:\ :kb=^H:\ :kd=^J:\ :kl=^H:\ :kr=^\\:\ :ku=^_:\ :le=^H:\ :li#24:\ :nd=^\\:\ :nl=^J:\ :se=^O:\ :so=^N:\ :up=^_:
В табл. 7- 1 представлен список функций файла termcap с сопоставлением терминалов Apple и vt52. Если какая-либо функция отсутствует у одного или другого терминала, это отмечается словом "нет".
Таблица 7-1
Терминальные возможности и их конкретные значения
Функция | Apple II | vt52 |
bl - звуковой сигнал (bell) | ^G | ^G |
bs - возврат на шаг по коду ^H (can backspace with ^H) | да | да |
cd - очистка до конца экрана (clear to end of display) | ^K | \EJ |
ce - очистка до конца строки (clear to end of line) | ^] | \EK |
cl - очистка всего экрана (clear entire screen) | ^L | \EH\EJ |
cm - движение курсора (cursor motion) | ^^%r%+ %+ | \EY%+ %+ |
co - число позиций в строке (number of columns in a line) | #80 | #80 |
cr - возврат каретки (carriage return) | ^M | ^M |
do - сдвиг на строку вниз (down one line) | ^J | ^J |
ho - курсор в начало экрана(без команды cm) (home cursor) | ^Y | \EH |
kb - код клавиши backspace (sent by backspace key) | ^H | ^H |
kd - код клавиши "стрелка вниз" (sent by down arrow key) | ^J | \EB |
kl - код клавиши "стрелка влево" (sent by left arrow key) | ^H | \ED |
kr - код клавиши "стрелка вправо" (sent by right arrow key) | ^\\ | \EC |
ku - код клавиши "стрелка вверх" (sent by up arrow key) | ^_ | \EA |
le - курсор влево (cursor left) | ^H | ^H |
li - число строк экрана (number of lines per screen) | #24 | #24 |
nd - нестирающий пробел (nondestructive space) | ^\\ | \EC |
nl - символ перевода строки (newline character) | ^J | ^J |
pt - наличие аппаратной табуляции (has hardware tabs) | нет | да |
se - обычный экран (end stand out mode (normal)) | ^O | нет |
so - инверсный экран (begin stand out mode (inverse)) | ^N | нет |
sr - прокрутка (scroll reverse) | нет | \EI |
ta - символ табуляции (tab) | ^I | ^I |
up - сдвиг вверх на строку(up a line) | нет | ^_ |
Файл termcap позволяет вам спрятать основную информацию о специфических характеристиках терминала (за исключением характеристик, которые могут отсутствовать у терминала, или специальных возможностей, которые не описаны в termcap). Это значит, что вы можете создавать терминально-независимые программы. При этом вам нет необходимости изменять все специфические обращения к терминалу, такие как ESC-последовательности (символы, указывающие терминалу, что передаваемые после них символы (символ) должны интерпретироваться как управляющие коды). Это символы (\E) для терминала vt52 и (^) для Apple.
Наилучший пример - способ использования файла termcap редактором vi. Он начинает выполнять указанную ему функцию, например движение курсора, после чего ставит вопрос: "Какой код функции, которую мы хотим выполнить?". Затем он ищет соответствующую последовательность в той информации, которую предоставляет termcap.
С другой стороны, иногда вам необходимо оптимизировать какую-либо функцию по скорости, заставив ее посылать коды непосредственно на определенный терминал. В этом случае вам опять-таки полезен файл termcap, поскольку вы можете найти необходимую информацию в соответствующем файле termcap, после чего закодировать эту информацию в вашей программе. Это мы и делаем в первой инструментальной программе данной главы - программе 'c'.