|
TERMINFO(4)
НАЗВАНИЕ
terminfo - база данных характеристик терминалов
СИНТАКСИС
/usr/lib/terminfo/?/*
ОПИСАНИЕ
Terminfo - это скомпилированная база данных [см.
tic(1M)], описывающая характеристики терминалов. В исходных файлах terminfo задаются характеристики терминалов, описывается, как выполняются операции, какие требуются заполнители или инициализирующие последовательности. Эта база данных используется прикладными программами, например, редактором vi или пакетом
curses(3X), так что эти программы могут работать на
различных терминалах без всяких изменений. Чтобы получить исходное описание терминала, следует воспользоваться утилитой infocmp(1M) с опцией -I.
Элементы исходных файлов terminfo состоят из полей,
разделенных запятыми. Пробелы и табуляции после каждой
запятой игнорируются. Первая строка каждого описания
терминала в базе данных terminfo(4) задает имена, по
которым terminfo(4) распознает терминал. Имена разделяются символами |. Первое имя задает наиболее часто используемое сокращение для терминала [именно это имя
нужно использовать в качестве значения переменной TERM
в $HOME/.profile, см. profile(4)], последнее имя
длинное, полностью определяющее терминал, все остальные имена являются синонимами первого. Все имена, кроме
последнего, не должны содержать пробелов и первые их 14
символов должны быть уникальными; в последнем имени для
удобства допускаются пробелы.
Имена терминалов (кроме последнего) должны выбираться в
соответствии со следующими соглашениями. Необходимо
выбрать некоторое базовое имя, определяющее терминальное оборудование. Так, для терминала AT&T 4425 выбрано
имя att4425. Режимы, в которых может находиться терминал, и режимы, которые предпочитают пользователи, обозначаются суффиксами, начинающимися с -. Примеры и более
подробную информацию о выборе имен и синонимов можно
найти в term(5).
Характеристики
В описаниях, приведенных ниже, переменная - это имя, по
которому программист, пишущий на языке C (на уровне
terminfo), получает доступ к указанной характеристике.
Сокращение - это короткое имя для этой переменной, используемое в тексте базы данных. Оно употребляется человеком, изменяющим базу данных, а также командой
tput(1) при опросе значения указанной характеристики
для конкретного терминала. Код termcap - это двухсимвольный код, соответствующий базе данных termcap, которая раньше использовалась для тех же целей, что и
terminfo.
Хотя длина имен, соответствующих характеристикам, не
ограничена, имена, содержащие более 5 символов, не используются. Всюду, где возможно, имена совпадают или
соответствуют тем, что предложены в стандарте ANSI
X3.64-1979. Их семантика также соответствует указанному
стандарту.
Для всех упомянутых в следующей таблице символьных характеристик (то есть характеристик, описываемых цепочками символов), кроме тех, которые используются для
ввода, может быть указан заполнитель. Имена символьных
характеристик ввода начинаются с key_. В описаниях некоторых характеристик могут встретиться пометки, имеющие следующий смысл:
- (G) Означает, что цепочка символов передается через
функцию tparm с указанными параметрами (#i).
- (*) Означает, что заполнитель зависит от количества
затронутых строк.
- (#i) Обозначает i-й параметр.
Булевы характеристики:
Имя переменной | Сокращение | Код termcap | Описание |
auto_left_margin | bw | bw | cub1 переводит курсор из колонки 0 в последнюю колонку |
auto_right_margin | am | am | В терминале есть автоматические границы |
beehive_glitch | xsb | xb | Терминал Beehive (f1=escape, f2=ctrl C) |
ceol_standout_glitch | xhp | xs | Текст, выведенный в режиме сообщений, не очищается при повторном выводе в то же место (терминал hp) |
eat_newline_glitch | xenl | xn | Перевод строки после 80 колонок игнорируется (терминал Concept) |
erase_overstrike | eo | eo | Может зачищать надпечатку пробелом |
generic_type | gn | gn | Тип терминала может меняться (например, коммутируемая или переключаемая линия) |
hard_copy | hc | hc | Терминал - печатающее устройство |
hard_cursor | chts | chts | Курсор трудно увидеть |
has_meta_key | km | km | Есть ключ МЕТА (если нажат, устанавливается бит четности) |
has_status_line | hs | hs | Имеется дополнительная служебная строка |
insert_null_glitch | in | in | При режиме вставки распознаются пустоты |
memory_above | da | da | В терминале запоминается информация, находящаяся выше экрана |
memory_below | db | db | В терминале запоминается информация, находящаяся ниже экрана |
move_insert_mode | mir | mi | Можно без опасений перемещаться в режиме вставки |
move_standout_mode | msgr | ms | Можно без опасений перемещаться в режиме сообщений |
needs_xon_xoff | nxon | nx | Заполнение не работает, требуется xon/xoff |
non_rev_rmcup | nrrmc | NR | smcup не обратен rmcup |
no_pad_char | npc | NP | Символ-заполнитель не существует |
over_strike | os | os | Терминал может производить надпечатку |
prtr_silent | mc5i | 5i | Ввод не изображается на экране |
status_line_esc_ok | eslok | es | В служебной строке может использоваться escape |
teleray_glitch | xt | xt | Вывод символа табуляции портит терминал, не пользуйтесь smso (Терминал Teleray1061) |
tilde_glitch | hz | hz | Терминал Hazeltine, нельзя выводить символы ~ |
transparent_underline | ul | ul | Символ _ производит надпечатку |
xon_xoff | xon | xo | Терминал использует протокол xon/xoff |
Числовые характеристики:
Имя переменной | Сокращение | Код termcap | Описание |
columns | cols | co | Число колонок в строке |
init_tabs | it | it | Шаг позиций табуляции |
label_height | lh | lh | Количество строк в каждой метке |
label_width | lw | lw | Количество колонок в каждой метке |
lines | lines | li | Число строк на экране или странице |
lines_of_memory | lm | lm | Число строк памяти, если > lines. 0 означает переменное число |
magic_cookie_glitch | xmc | sg | Количество пустых символов, остающихся после smso или rmso |
num_labels | nlab | Nl | Количество меток на экране (начиная с 1) |
padding_baud_rate | pb | pb | Минимальная скорость обмена, для которой требуется заполнитель |
virtual_terminal | vt | vt | Номер виртуального терминала |
width_status_line | wsl | ws | Количество колонок в служебной строке |
Символьные характеристики:
Имя переменной | Сокращение | Код termcap | Описание |
acs_chars | acsc | ac | Пары символов из графического алфавита aAbBcC (по умолчанию =vt100+) |
back_tab | cbt | bt | Обратная табуляция |
bell | bel | bl | Звуковой сигнал |
carriage_return | cr | cr | Возврат каретки (*) |
change_scroll_region | csr | cs | Установить в качестве роллируемой области строки с #1 по #2 (vt100) (G) |
char_padding | rmp | rP | Аналогично lp, но в режиме замены |
clear_all_tabs | tbc | ct | Сбросить все позиции табуляции |
clear_margins | mgc | MC | Сбросить левую и правую границы, установленные программно |
clear_screen | clear | cl | Очистить экран и поместить курсор в начальную позицию (*) |
clr_bol | el1 | cb | Очистить начало строки, включительно |
clr_eol | el | ce | Очистить конец строки |
clr_eos | ed | cd | Очистить конец экрана (*) |
column_address | hpa | ch | Установить горизонтальную позицию (в абсолютных координатах) (G) |
command_character | cmdch | CC | Устанавливаемый в терминале символ-команда |
cursor_address | cup | cm | Перемещение курсора в
строку #1 колонку #2 (G) |
cursor_down | cud1 | do | Вниз на одну строку |
cursor_home | home | ho | Курсор в начальную позицию (если нет cup) |
cursor_invisible | civis | vi | Сделать курсор невидимым |
cursor_left | cub1 | le | Курсор влево на один шаг |
cursor_mem_address | mrcup | CM | Адресация курсора относительно памяти |
cursor_normal | cnorm | ve | Сделать курсор нормальным (отменить vs/vi) |
cursor_right | cuf1 | nd | Неразрушающий пробел (курсор вправо) |
cursor_to_ll | ll | ll | Последняя строка, первая колонка (если нет cup) |
cursor_up | cuu1 | up | Предыдущая строка (курсор вверх) |
cursor_visible | cvvis | vs | Сделать курсор очень хорошо видимым |
delete_character | dch1 | dc | Удалить символ (*) |
delete_line | dl1 | dl | Удалить строку (*) |
dis_status_line | dsl | ds | Отменить служебную строку |
down_half_line | hd | hd | На полстроки вниз |
ena_acs | enacs | aA | Разрешить использование дополнительного алфавита |
enter_alt_charset_mode | smacs | as | Перейти к дополнительному алфавиту |
enter_am_mode | smam | SA | Включить автоматические границы |
enter_blink_mode | blink | mb | Включить мерцание |
enter_bold_mode | bold | md | Включить режим выделенных символов |
enter_ca_mode | smcup | ti | Начальная цепочка для программ, использующих cup |
enter_delete_mode | smdc | dm | Войти в режим удаления |
enter_dim_mode | dim | mh | Включить пониженную яркость |
enter_insert_mode | smir | im | Войти в режим вставки |
enter_protected_mode | prot | mp | Войти в защищенный режим |
enter_reverse_mode | rev | mr | Войти в режим инверсии |
enter_secure_mode | invis | mk | Войти в режим, в котором не изображаются выводимые символы |
enter_standout_mode | smso | so | Войти в режим сообщений |
enter_underline_mode | smul | us | Войти в режим подчеркивания |
enter_xon_mode | smxon | SX | Включить xon/xoff протокол |
erase_chars | ech | ec | Удалить #1 символов (G) |
exit_alt_charset_mode | rmacs | ae | Вернуться из дополнительного алфавита |
exit_attribute_mode | sgr0 | me | Выключить все атрибуты |
exit_ca_mode | rmcup | te | Завершающая цепочка
для программ, использующих cup |
exit_delete_mode | rmdc | ed | Выйти из режима удаления |
exit_insert_mode | rmir | ei | Выйти из режима вставки |
exit_standout_mode | rmso | se | Выйти из режима сообщений |
exit_underline_mode | rmul | ue | Выйти из режима подчеркивания |
exit_xon_mode | rmxon | RX | Выключить xon/xoff протокол |
flash_screen | flash | vb | Видимый звонок (может не перемещать курсор) |
form_feed | ff | ff | Прогон страницы в терминале-принтере (*) |
from_status_line | fsl | fs | Возврат из служебной строки |
init_1string | is1 | i1 | Первая цепочка инициализации терминала |
init_2string | is2 | i2 | Вторая цепочка инициализации терминала |
init_3string | is3 | i3 | Третья цепочка инициализации терминала |
init_file | if | if | Имя файла, содержащего цепочку инициализации терминала |
init_prog | iprog | iP | Имя программы, производящей инициализацию терминала |
insert_character | ich1 | ic | Вставить символ |
insert_line | il1 | al | Вставить пустую строку (*) |
insert_padding | ip | ip | Вывести заполнитель после вставки символа (*) |
key_a1 | ka1 | K1 | KEY_A1, 0534, слева вверху на дополнительной клавиатуре |
key_a3 | ka3 | K3 | KEY_A3, 0535, справа вверху на дополнительной клавиатуре |
key_b2 | kb2 | K2 | KEY_B2, 0536, в центре клавиатуры |
key_backspace | kbs | kb | KEY_BACKSPACE, 0407, посылается клавишей "забой" |
key_beg | kbeg | @1 | KEY_BEG, 0542, посылается клавишей BEG |
key_btab | kcbt | kB | KEY_BTAB, 0541, посылается клавишей BTAB |
key_c1 | kc1 | K4 | KEY_C1, 0537, слева внизу на дополнительной клавиатуре |
key_c3 | kc3 | K5 | KEY_C3, 0540, справа внизу на дополнительной клавиатуре |
key_cancel | kcan | @2 | KEY_CANCEL, 0543, посылается клавишей CANCEL |
key_catab | ktbc | ka | KEY_CATAB, 0526, посылается клавишей "очистка всех табуляций" |
key_clear | kclr | kC | KEY_CLEAR, 0515, посылается клавишей "очистка экрана" |
key_close | kclo | @3 | KEY_CLOSE, 0544, посылается клавишей CLOSE |
key_command | kcmd | @4 | KEY_COMMAND, 0545, посылается клавишей CMD |
key_copy | kcpy | @5 | KEY_COPY, 0546, посылается клавишей COPY |
key_create | kcrt | @6 | KEY_CREATE, 0547, посылается клавишей CREATE |
key_ctab | kctab | kt | KEY_CTAB, 0525, посылается клавишей "очистка табуляции" |
key_dc | kdch1 | kD | KEY_DC, 0512, посылается клавишей "удаление символа" |
key_dl | kdl1 | kL | KEY_DL, 0510, посылается клавишей "удаление строки" |
key_down | kcud1 | kd | KEY_DOWN, 0402, посылается клавишей "стрелка вниз" |
key_eic | krmir | kM | KEY_EIC, 0514, посылается rmir или smir в режиме вставки |
key_end | kend | @7 | KEY_END, 0550, посылается клавишей END |
key_enter | kent | @8 | KEY_ENTER, 0527, посылается клавишей ENTER/SEND |
key_eol | kel | kE | KEY_EOL, 0517, посылается клавишей "очистка конца строки" |
key_eos | ked | kS | KEY_EOL, 0516, посылается клавишей "очистка конца экрана" |
key_exit | kext | @9 | KEY_EXIT, 0551, посылается клавишей EXIT |
key_f0 | kf0 | k0 | KEY_F(0), 0410, посылается функциональной клавишей f0 |
key_f1 | kf1 | k1 | KEY_F(1), 0411, посылается функциональной клавишей f1 |
key_f2 | kf2 | k2 | KEY_F(2), 0412, посылается функциональной клавишей f2 |
key_f3 | kf3 | k3 | KEY_F(3), 0413, посылается функциональной клавишей f3 |
key_f4 | kf4 | k4 | KEY_F(4), 0414, посылается функциональной клавишей f4 |
key_f5 | kf5 | k5 | KEY_F(5), 0415, посылается функциональной клавишей f5 |
key_f6 | kf6 | k6 | KEY_F(6), 0416, посылается функциональной клавишей f6 |
key_f7 | kf7 | k7 | KEY_F(7), 0417, посылается функциональной клавишей f7 |
key_f8 | kf8 | k8 | KEY_F(8), 0420, посылается функциональной клавишей f8 |
key_f9 | kf9 | k9 | KEY_F(9), 0421, посылается функциональной клавишей f9 |
key_f10 | kf10 | k; | KEY_F(10), 0422, посылается функциональной клавишей f10 |
key_f11 | kf11 | F1 | KEY_F(11), 0423, посылается функциональной клавишей f11 |
key_f12 | kf12 | F2 | KEY_F(12), 0424, посылается функциональной клавишей f12 |
key_f13 | kf13 | F3 | KEY_F(13), 0425, посылается функциональной клавишей f13 |
key_f14 | kf14 | F4 | KEY_F(14), 0426, посылается функциональной клавишей f14 |
key_f15 | kf15 | F5 | KEY_F(15), 0427, посылается функциональной клавишей f15 |
key_f16 | kf16 | F6 | KEY_F(16), 0430, посылается функциональной клавишей f16 |
key_f17 | kf17 | F7 | KEY_F(17), 0431, посылается функциональной клавишей f17 |
key_f18 | kf18 | F8 | KEY_F(18), 0432, посылается функциональной клавишей f18 |
key_f19 | kf19 | F9 | KEY_F(19), 0433, посылается функциональной клавишей f19 |
key_f20 | kf20 | FA | KEY_F(20), 0434, посылается функциональной клавишей f20 |
key_f21 | kf21 | FB | KEY_F(21), 0435, посылается функциональной клавишей f21 |
key_f22 | kf22 | FC | KEY_F(22), 0436, посылается функциональной клавишей f22 |
key_f23 | kf23 | FD | KEY_F(23), 0437, посылается функциональной клавишей f23 |
key_f24 | kf24 | FE | KEY_F(24), 0440, посылается функциональной клавишей f24 |
key_f25 | kf25 | FF | KEY_F(25), 0441, посылается функциональной клавишей f25 |
key_f26 | kf26 | FG | KEY_F(26), 0442, посылается функциональной клавишей f26 |
key_f27 | kf27 | FH | KEY_F(27), 0443, посылается функциональной клавишей f27 |
key_f28 | kf28 | FI | KEY_F(28), 0444, посылается функциональной клавишей f28 |
key_f29 | kf29 | FJ | KEY_F(29), 0445, посылается функциональной клавишей f29 |
key_f30 | kf30 | FK | KEY_F(30), 0446, посылается функциональной клавишей f30 |
key_f31 | kf31 | FL | KEY_F(31), 0447, посылается функциональной клавишей f31 |
key_f32 | kf32 | FM | KEY_F(32), 0450, посылается функциональной клавишей f32 |
key_f33 | kf33 | FN | KEY_F(33), 0451, посылается функциональной клавишей f33 |
key_f34 | kf34 | FO | KEY_F(34), 0452, посылается функциональной клавишей f34 |
key_f35 | kf35 | FP | KEY_F(35), 0453, посылается функциональной клавишей f35 |
key_f36 | kf36 | FQ | KEY_F(36), 0454, посылается функциональной клавишей f36 |
key_f37 | kf37 | FR | KEY_F(37), 0455, посылается функциональной клавишей f37 |
key_f38 | kf38 | FS | KEY_F(38), 0456, посылается функциональной клавишей f38 |
key_f39 | kf39 | FT | KEY_F(39), 0457, посылается функциональной клавишей f39 |
key_f40 | kf40 | FU | KEY_F(40), 0460, посылается функциональной клавишей f40 |
key_f41 | kf41 | FV | KEY_F(41), 0461, посылается функциональной клавишей f41 |
key_f42 | kf42 | FW | KEY_F(42), 0462, посылается функциональной клавишей f42 |
key_f43 | kf43 | FX | KEY_F(43), 0463, посылается функциональной клавишей f43 |
key_f44 | kf44 | FY | KEY_F(44), 0464, посылается функциональной клавишей f44 |
key_f45 | kf45 | FZ | KEY_F(45), 0465, посылается функциональной клавишей f45 |
key_f46 | kf46 | Fa | KEY_F(46), 0466, посылается функциональной клавишей f46 |
key_f47 | kf47 | Fb | KEY_F(47), 0467, посылается функциональной клавишей f47 |
key_f48 | kf48 | Fc | KEY_F(48), 0470, посылается функциональной клавишей f48 |
key_f49 | kf49 | Fd | KEY_F(49), 0471, посылается функциональной клавишей f49 |
key_f50 | kf50 | Fe | KEY_F(50), 0472, посылается функциональной клавишей f50 |
key_f51 | kf51 | Ff | KEY_F(51), 0473, посылается функциональной клавишей f51 |
key_f52 | kf52 | Fg | KEY_F(52), 0474, посылается функциональной клавишей f52 |
key_f53 | kf53 | Fh | KEY_F(53), 0475, посылается функциональной клавишей f53 |
key_f54 | kf54 | Fi | KEY_F(54), 0476, посылается функциональной клавишей f54 |
key_f55 | kf55 | Fj | KEY_F(55), 0477, посылается функциональной клавишей f55 |
key_f56 | kf56 | Fk | KEY_F(56), 0500, посылается функциональной клавишей f56 |
key_f57 | kf57 | Fl | KEY_F(57), 0501, посылается функциональной клавишей f57 |
key_f58 | kf58 | Fm | KEY_F(58), 0502, посылается функциональной клавишей f58 |
key_f59 | kf59 | Fn | KEY_F(59), 0503, посылается функциональной клавишей f59 |
key_f60 | kf60 | Fo | KEY_F(60), 0504, посылается функциональной клавишей f60 |
key_f61 | kf61 | Fp | KEY_F(61), 0505, посылается функциональной клавишей f61 |
key_f62 | kf62 | Fq | KEY_F(62), 0506, посылается функциональной клавишей f62 |
key_f63 | kf63 | Fr | KEY_F(63), 0507, посылается функциональной клавишей f63 |
key_find | kfnd | @0 | KEY_FIND, 0552, посылается клавишей FIND |
key_help | khlp | %1 | KEY_HELP, 0553, посылается клавишей HELP |
key_home | khome | kh | KEY_HOME, 0406, посылается клавишей HOME |
key_ic | kich1 | kI | KEY_IC, 0513, посылается клавишей "вставить символ" |
key_il | kil1 | kA | KEY_IL, 0511, посылается клавишей "вставить строку" |
key_left | kcub1 | kl | KEY_LEFT, 0404, посылается клавишей "стрелка влево" |
key_ll | kll | kH | KEY_LL, 0533, посылается клавишей HOME DOWN |
key_mark | kmrk | %2 | KEY_MARK, 0554, посылается клавишей MARK |
key_message | kmsg | %3 | KEY_MESSAGE, 0555, посылается клавишей MESSAGE |
key_move | kmov | %4 | KEY_MOVE, 0556, посылается клавишей MOVE |
key_next | knxt | %5 | KEY_NEXT, 0557, посылается клавишей NEXT |
key_npage | knp | kN | KEY_NPAGE, 0522, посылается клавишей NEXT PAGE |
key_open | kopn | %6 | KEY_OPEN, 0560, посылается клавишей OPEN |
key_options | kopt | %7 | KEY_OPTIONS, 0561, посылается клавишей OPTIONS |
key_ppage | kpp | kP | KEY_PPAGE, 0523, посылается клавишей PREV PAGE |
key_previous | kprv | %8 | KEY_PREVIOUS, 0562, посылается клавишей PREVIOUS |
key_print | kprt | %9 | KEY_PRINT, 0532, посылается клавишей PRINT или COPY |
key_redo | krdo | %0 | KEY_REDO, 0563, посылается клавишей REDO |
key_reference | kref | &1 | KEY_REFERENCE, 0564, посылается клавишей REFERENCE |
key_refresh | krfr | &2 | KEY_REFRESH, 0565, посылается клавишей REFRESH |
key_replace | krpl | &3 | KEY_REPLACE, 0566, посылается клавишей REPLACE |
key_restart | krst | &4 | KEY_RESTART, 0567, посылается клавишей RESTART |
key_resume | kres | &5 | KEY_RESUME, 0570, посылается клавишей RESUME |
key_right | kcuf1 | kr | KEY_RIGHT, 0405, посылается клавишей "стрелка вправо" |
key_save | ksav | &6 | KEY_SAVE, 0571, посылается клавишей SAVE |
key_sbeg | kBEG | &9 | KEY_SBEG, 0572, посылается клавишей SHIFT+BEG |
key_scancel | kCAN | &0 | KEY_SCANCEL, 0573, посылается клавишей SHIFT+CANCEL |
key_scommand | kCMD | *1 | KEY_SCOMMAND, 0574, посылается клавишей SHIFT+COMMAND |
key_scopy | kCPY | *2 | KEY_SCOPY, 0575, посылается клавишей SHIFT+COPY |
key_screate | kCRT | *3 | KEY_SCREATE, 0576, посылается клавишей SHIFT+CREATE |
key_sdc | kDC | *4 | KEY_SDC, 0577, посылается клавишей SHIFT+"удалить символ" |
key_sdl | kDL | *5 | KEY_SDL, 0600, посылается клавишей SHIFT+"удалить строку" |
key_select | kslt | *6 | KEY_SELECT, 0601, посылается клавишей SELECT |
key_send | kEND | *7 | KEY_SEND, 0602, посылается клавишей SEND |
key_seol | kEOL | *8 | KEY_SEOL, 0603, посылается клавишей SHIFT+EOL |
key_sexit | kEXT | *9 | KEY_SEXIT, 0604, посылается клавишей SHIFT+EXIT |
key_sf | kind | kF | KEY_SF, 0520, посылается клавишей SCROLL FORWARD |
key_sfind | kFND | *0 | KEY_SFIND, 0605, посылается клавишей SHIFT+FIND |
key_shelp | kHLP | #1 | KEY_SHELP, 0606, посылается клавишей SHIFT+HELP |
key_shome | kHOM | #2 | KEY_SHOME, 0607, посылается клавишей SHIFT+HOME |
key_sic | kIC | #3 | KEY_SIC, 0610, посылается клавишей SHIFT+"вставить символ" |
key_sleft | kLFT | #4 | KEY_SLEFT, 0611, посылается клавишей SHIFT+"стрелка влево" |
key_smessage | kMSG | %1 | KEY_SMESSAGE, 0612,
посылается клавишей SHIFT+MESSAGE |
key_smove | kMOV | %b | KEY_SMOVE, 0613, посылается клавишей SHIFT+MOVE |
key_snext | kNXT | %c | KEY_SNEXT, 0614, посылается клавишей SHIFT+NEXT |
key_soptions | kOPT | %d | KEY_SOPTIONS, 0615,
посылается клавишей SHIFT+OPTIONS |
key_sprevious | kPRV | %e | KEY_SPREVIOUS, 0616,
посылается клавишей SHIFT+PREVIOUS |
key_sprint | kPRT | %f | KEY_SPRINT, 0617, посылается клавишей SHIFT+PRINT |
key_sr | kri | kR | KEY_SR, 0521, посылается клавишей SCROLL BACK |
key_sredo | kRDO | %g | KEY_SREDO, 0620, посылается клавишей SHIFT+REDO |
key_sreplace | kRPL | %h | KEY_SREPLACE, 0621, посылается клавишей SHIFT+REPLACE |
key_sright | kRIT | %i | KEY_SRIGHT, 0622, посылается клавишей SHIFT+"стрелка вправо" |
key_srsume | kRES | %j | KEY_SRSUME, 0623, посылается клавишей SHIFT+RESUME |
key_ssave | kSAV | !1 | KEY_SSAVE, 0624, посылается клавишей SHIFT+SAVE |
key_ssuspend | kSPD | !2 | KEY_SSUSPEND, 0625,
посылается клавишей SHIFT+SUSPEND |
key_stab | khts | kT | KEY_STAB, 0524, посылается клавишей SET TAB |
key_sundo | kUND | !3 | KEY_SUNDO, 0626, посылается клавишей SHIFT+UNDO |
key_suspend | kspd | &7 | KEY_SUSPEND, 0627, посылается клавишей SUSPEND |
key_undo | kund | &8 | KEY_UNDO, 0630, посылается клавишей UNDO |
key_up | kcuu1 | ku | KEY_UP, 0403, посылается клавишей "стрелка вверх" |
keypad_local | rmkx | ke | Выход из "прозрачного" режима |
keypad_xmit | smkx | ks | Вход в "прозрачный" режим |
lab_f0 | lf0 | l0 | f0 если на ней написано не f0 |
lab_f1 | lf1 | l1 | f1 если на ней написано не f1 |
lab_f2 | lf2 | l2 | f2 если на ней написано не f2 |
lab_f3 | lf3 | l3 | f3 если на ней написано не f3 |
lab_f4 | lf4 | l4 | f4 если на ней написано не f4 |
lab_f5 | lf5 | l5 | f5 если на ней написано не f5 |
lab_f6 | lf6 | l6 | f6 если на ней написано не f6 |
lab_f7 | lf7 | l7 | f7 если на ней написано не f7 |
lab_f8 | lf8 | l8 | f8 если на ней написано не f8 |
lab_f9 | lf9 | l9 | f9 если на ней написано не f9 |
lab_f10 | lf10 | la | f10 если на ней написано не f10 |
label_off | rmln | LF | Выключить программируемые надписи на клавишах |
label_on | smln | LO | Включить программируемые надписи на клавишах |
meta_off | rmm | mo | Выключить режим МЕТА (взведение 8-го бита) |
meta_on | smm | mm | Включить режим МЕТА (взведение 8-го бита) |
newline | nel | nw | Перевод строки (возврат каретки и переход к новой строке) |
pad_char | pad | pc | Символ-заполнитель отличный от нуля |
parm_dch | dch | DC | Удалить #1 символов (G*) |
parm_delete_line | dl | DL | Удалить #1 строк (G*) |
parm_down_cursor | cud | DO | Курсор вниз на #1 строк (G*) |
parm_ich | ich | IC | Вставить #1 пустых символов (G*) |
parm_index | indn | SF | Сроллировать вперед на #1 строк (G) |
parm_insert_line | il | AL | Вставить #1 пустых строк (G*) |
parm_left_cursor | cub | LE | Переместить курсор влево на #1 позиций (G) |
parm_right_cursor | cuf | RI | Переместить курсор вправо на #1 позиций (G*) |
parm_rindex | rin | SR | Сроллировать назад на #1 строк (G) |
parm_up_cursor | cuu | UP | Переместить курсор вверх на #1 позиций (G*) |
pkey_key | pfkey | pk | Программировать функциональную клавишу #1 на печать строки #2 |
pkey_local | pfloc | pl | Программировать функциональную клавишу #1 на выполнение строки #2 |
pkey_xmit | pfx | px | Программировать функциональную клавишу #1 на выдачу цепочки #2 |
pkey_norm | pln | pn | Программировать метку #1 на показ цепочки #2 |
print_screen | mc0 | ps | Напечатать содержимое экрана |
prtr_non | mc5p | pO | Включить принтер для печати #1 байт |
prtr_off | mc4 | pf | Выключить принтер |
prtr_on | mc5 | po | Включить принтер |
repeat_char | rep | rp | Повторить символ #1 #2 раз (G*) |
req_for_input | rfi | RF | Послать следующий введенный символ (для pty) |
reset_1string | rs1 | r1 | Приведение терминала в нормальное состояние |
reset_2string | rs2 | r2 | Приведение терминала в нормальное состояние |
reset_3string | rs3 | r3 | Приведение терминала в нормальное состояние |
reset_file | rf | rf | Имя файла, содержащего коды для приведения терминала в нормальное состояние |
restore_cursor | rc | rc | Восстановить позицию курсора (при последней команде sc) |
row_address | vpa | cv | Абсолютная вертикальная позиция (G) |
save_cursor | sc | sc | Сохранить позицию курсора |
scroll_forward | ind | sf | Сроллировать текст вверх |
scroll_reverse | ri | sr | Сроллировать текст вниз |
set_attributes | sgr | sa | Задать атрибуты изображения #1-#9 (G) |
set_left_margin | smgl | ML | Установить левую границу |
set_right_margin | smgr | MR | Установить правую границу |
set_tab | hts | st | Установить остановку по табуляции во всех строках в текущей колонке |
set_window | wind | wi | Установить текущее окно в строках #1-#2, колонках #3-#4 (G) |
tab | ht | ta | Переместиться к следующей остановке по табуляции |
to_status_line | tsl | ts | Перейти в служебную строку, колонку #1 |
underline_char | uc | uc | Подчеркнуть один символ и встать за ним |
up_half_line | hu | hu | На полстроки вверх |
xoff_character | xoffc | XF | Символ XOFF |
xon_character | xonc | XN | Символ XON |
Пример задания элемента исходного файла
Следующий элемент, описывающий терминал Concept-100, в
момент написания настоящего руководства являлся одним
из самых сложных в файле terminfo.
c100|concept100|concept|c104|c100-4p|hds concept 100,
am, eo, mir, ul, xenl,
cols#80, lines#24, pb#9600, vt#8,
bel=^G, blink=\EC, clear=\E?\E^E$<2*>, cr=$<9>\r,
cub1=\b, cud1=\n, cuf1=\E=,
cup=\Ea%p1%'\s'%+%c%p2%'\s'%+%c, cuu1=\E;,
dch1=\E^Q$<16*>, dim=\EE, dl1=\E^B$<3*>,
ed=\E^E$<16*>, el=\E^U$<16>, flash=\Ek$<20>\EK,
ht=\t$<8>, il1=\E^R$<3*>, ind=\n, .ind=\n$<9>, invis=\EH,
ip=$<16*>, is1=\EK,
is2=\EU\Ef\E7\E5\E8\El\ENH\EK\E\0\Eo&\0\Eo'\E,
is3=\Ev\s\s\s\s$<6>\Ep\n, kbs=\b, kcbt=\E', kctab=\E_,
kcub1=\E>, kcud1=\E<, kcuf1=\E=, kcuu1=\E;,
kdch1=\E^Q, kdl1=\E^B, ked=\E^C, kel=\E^S, kf1=\E5,
kf2=\E6, kf3=\E7, kf4=\E8, kf5=\E9, kf6=\E:a,
kf7=\E:b, kf8=\E:c, khome=\E?, khts=\E], kich1=\E^P,
kil1=\E^R, kind=\E[, knp=\E-, kpp=\E., kri=\E\\,
krmir=\E\200, mc4=^^o\s\E\EQ!\EYP^W,
mc5=\EQ"\EY(^W\EYD\Eo\s^^, prot=\EI,
rep=\Er%p1%c%p2%'\s'%+%c$<.2*>, rev=\ED,
rmcup=\Ev\s\s\s\s$<6>\Ep\r\n, rmir=\E\s\s, rmkx=\Ex,
rmso=\Ed, rmul=\Eg, sgr0=\EN@,
smcup=\EU\Ev\s\s8p\Ep\r\E^U$<16>, smir=\E^P, smkx=\EX,
smso=\ED, smul=\EG,
Элементы могут располагаться на нескольких строках,
каждая строка, кроме первой, должна начинаться с пробела. Строки, начинающиеся с символа #, считаются комментариями.
Типы характеристик
Характеристики terminfo бывают трех типов: булевы, означающие, что терминал имеет соответствующую возможность, числовые, обычно используемые для задания размеров, и символьные, задающие последовательность кодов,
которую нужно послать на терминал, чтобы выполнить соответствующее действие.
Все характеристики имеют имена. Например, то, что терминал Concept имеет автоматические границы (то есть при
достижении конца строки автоматически выполняется возврат каретки и перевод строки), отражается характеристикой am. За числовыми характеристиками следует знак # и
числовое значение, например, для терминала Concept,
cols#80 задает число колонок, равное 80. Числовое значение может быть записано как десятичное, восьмеричное
или шестнадцатеричное, в соответствии с соглашениями,
принятыми в языке C.
Наконец, символьные характеристики, например el (последовательность кодов для очистки конца строки), задаются
именем (от двух до пяти символов), за которыми следует
знак = и цепочка символов, завершающаяся запятой. В любом месте внутри цепочки символов может встречаться задержка в миллисекундах, заключенная в "скобки" $<...>.
Например, задержка el=\EK$<3> обеспечивается процедурой
tputs [см. curses(3X)] путем посылки символов-заполнителей. Задержка может задаваться числом, например 20,
или числом, за которым следует символ * (например, 3*),
символ / (например, 5/) или оба символа (например, 10*/
). Символ * означает, что задержка пропорциональна количеству строк, вовлеченных в операцию, при этом для
каждой строки задержка равна указанной (заметим, что
для операции вставки символа число вовлеченных строк
всегда равно 1). При использовании * можно задавать задержку с точностью до 0.1 миллисекунды (с одним знаком
после десятичной точки, например 3.5*). Символ / означает, что задержка обязательна. В противном случае, если терминал поддерживает xon/xoff протокол (характеристика xon), задержка не обязательна и будет использоваться только для оценки сложности операции, а также
при двоичном режиме передачи. Обязательная задержка выполняется всегда, независимо от значения характеристики
xon.
Для удобства записи управляющих последовательностей
применяются следующие соглашения. Последовательности \E
и \e обозначают символ ESCAPE (код ASCII 033), ^x обозначает CTRL+x для всех допустимых x, а последовательности \n, \l, \r, \t, \b, \f и \s представляют соответственно перевод строки, переход к новой строке,
возврат каретки, горизонтальную табуляцию, возврат на
шаг, "переход к новой странице и пробел. Дополнительно
имеются следующие последовательности: \^ представляет
^, \\ представляет \, \, представляет запятую, \:
представляет :, \0 представляет пустой символ (на самом
деле \0 порождает символ \200, который не является терминатором строки и действует на большинстве терминалов,
как пустой символ). Наконец, символы можно задавать
трехзначным восьмеричным числом после знака \ (например, \123).
Иногда бывает необходимо временно удалить некоторые характеристики. Для этого перед именем характеристики помещается точка (см. в примере выше второе вхождение
ind). Заметим, что характеристики обрабатываются слева
направо, и используются первые встреченные значения.
Подготовка описаний
Наиболее эффективный путь подготовки описания нового
терминала - выбрать из базы данных terminfo описание
похожего терминала, а затем постепенно исправлять его,
каждый раз проверяя исправления запуском редактора vi.
Для проверки нового описания установите переменной окружения TERMINFO значение, равное имени каталога, где
хранится скомпилированное новое описание, после этого
все программы будут использовать новое описание вместо
стандартного. Для определения необходимой задержки при
вставке строки (если она не указана производителем оборудования) можно рекомендовать следующий тест. Закомментируйте в описании характеристику xon, войдите редактором vi в большой файл, удалите 16 строк, находясь
на середине экрана, и затем быстро несколько раз нажмите клавишу u. Если экран испортился, то требуется б яльшая задержка. Аналогичный тест можно использоваться и
для вставки символа.
Заметим, что если Ваш терминал чересчур необычен, Вы
можете столкнуться с тем, что возможностей описания его
характеристик в terminfo недостаточно, и заставить работать с ним редактор vi невозможно.
Основные характеристики
Количество колонок в каждой строке терминала задается
числовой характеристикой cols. Если у терминала есть
экран, число строк на нем задается числовой характеристикой lines. Если терминал переводит строку при достижении правой границы, ему нужно приписать булеву характеристику am. Если терминал может очистить экран, помещая курсор в начальную позицию, следует задать символьную характеристику clear. Если терминал при выводе одного символа поверх другого производит не замену, а
надпечатку, должна быть указана булева характеристика
os. Если терминал является печатающим устройством, нужно указать одновременно булевы характеристики hc и os.
(Характеристика os применяется к терминалам типа
Tektronix 4010, печатающим устройствам и терминалам,
поддерживающим символы языка APL.) Если существует код,
помещающий курсор на левую границу текущей строки, укажите его в символьной характеристике cr (обычно это код
CTRL+M, возврат каретки). Если существует код, производящий звуковой сигнал, укажите его в символьной характеристике bel. Если терминал, как большинство терминалов, поддерживает протокол xon/xoff, укажите булеву характеристику xon.
Если существует код, перемещающий курсор на одну позицию влево (обычно это CTRL+H, возврат на шаг), укажите
его в символьной характеристике cub1. Аналогично, коды,
перемещающие курсор вправо, вверх и вниз задаются в характеристиках cuf1, cuu1 и cud1. Эти локальные перемещения курсора не должны изменять текст, через который
проходит курсор. Например, обычно нельзя использовать
cuf1=\s, поскольку пробел стирает символ, находящийся в
текущей позиции.
Важно отметить, что локальные перемещения курсора нельзя применять, если курсор находится на верхнем или левом краю экрана. Если терминал не обладает характеристикой bw, программа не должна пытаться сдвинуть курсор
влево из самой левой позиции. Нельзя также пытаться переместиться вверх из самой верхней строки.
Для того, чтобы сдвинуть текст вверх, необходимо переместиться в левый нижний угол экрана и послать на терминал цепочку символов, заданную в характеристике ind.
Для того, чтобы сдвинуть текст вниз, необходимо переместиться в левый верхний угол экрана и послать цепочку, заданную в характеристике ri. Если курсор не находится в указанных позициях, цепочки ind и ri применять
нельзя. Существуют также параметризованные характеристики indn и rin, которые отличаются от характеристик
ind и ri только тем, что у них есть один параметр, задающий число строк, на которое необходимо сдвинуться.
Параметризованные характеристики можно применять только
в указанных позициях.
Хотя наличие булевой характеристики am свидетельствует
о том, что терминал автоматически переводит курсор на
следующую строку при достижении последней колонки, это
не обязательно верно для сдвига вправо (cuf1) из последней колонки. Единственное допустимое локальное перемещение, когда курсор находится на границе экрана - это
cub1 на левой границе, если терминал обладает характеристикой bw, при этом курсор перемещается на правую
границу предыдущей строки, что удобно, например, использовать для рисования рамки по границе экрана. Однако, если терминал не обладает характеристикой bw, эффект перемещения влево с левой границы не определен.
Если на терминале есть переключатель, включающий и выключающий автоматические границы, в базе данных terminfo
предполагается, что он находится в положении "включено". Если у терминала есть команда, переводящая курсор
в первую колонку следующей строки, она задается в символьной характеристике nel.
Упомянутых возможностей достаточно для описания как печатающий устройств, так и дисплеев. Например, телетайп
(модель 33) описывается следующим образом:
33|tty33|tty|AT&T model 33 teletype,
hc, os, xon,
cols#72,
bel=^G, cr=\r, cud1=\n, ind=\n,
А вот описание терминала Lear Siegler ADM-3:
adm3|lsi adm3,
am,
cols#80, lines#24,
bel=^G, clear=^Z, cr=\r, cub1=\b, cud1=\n, ind=\n,
Параметризованные цепочки символов
Цепочки символов, служащие для адресации курсора, а
также другие цепочки, требующие параметров, задаются с
помощью так называемых параметризованных цепочек, содержащих команды, по типу форматных цепочек в
printf(3S). Например, для позиционирования курсора существует характеристика cup, которой требуются два параметра: номер строки и номер колонки. (Строки и колонки нумеруются с нуля и представляют физический экран,
видимый пользователю, они не относятся к скрытой, невидимой пользователю дисплейной памяти.) Если терминал
допускает относительную адресацию курсора, это отражается в характеристике mrcup.
Механизм разбора параметризованных цепочек символов использует стек и специальные команды (начинающиеся со
знака %), манипулирующие стеком. Параметризованные цепочки при этом похожи на программу для калькулятора в
обратной польской записи. Обычно вначале параметры загружаются в стек, а затем извлекаются из него с преобразованием в определенный формат. Часто требуются более
сложные операции. Бинарные операции записываются в
постфикстной форме с традиционным порядком операндов.
Так, например, вычитание пятерки из значения x записывается как %gx%{5}%-.
В параметризованных цепочках допустимы следующие команды [pop() обозначает извлечение верхнего элемента стека, push(аргумент) - добавление своего аргумента в
стек]:
%% | вывести символ % |
%[[:]флаги][ширина[.точность]][doxXs] | вывести pop() в формате, аналогичном printf(3S), в качестве флагов можно указать [-+#] и пробел. |
%c | вывести pop() в формате %c |
%p[1-9] | push(i-й аргумент) |
%P[a-z] | присвоить переменной [a-z] значение pop() |
%g[a-z] | push(значение переменной [a-z]) |
%'c' | push(символьная константа c) |
%{nn} | push(десятичная константа nn) |
%l | push(strlen(pop())) |
%+ %- %* %/ %m | выполнить соответствующую арифметическую операцию (%m - взятие по модулю): push(pop() операция pop()) |
%& %| %^ | выполнить соответствующую битную операцию: push(pop() операция pop()) |
%= %> %< | выполнить соответствующую логическую операцию: push(pop() операция pop()) |
%A %O | логические операции И и ИЛИ |
%! %~ | унарные операции: push( операция pop()) |
%i | добавить 1 к первому параметру, если он один, и к первым двум параметрам, если их более одного (используется для ANSI терминалов) |
%? выражение %t то %e иначе %; | если-то-иначе, часть %e иначе может быть опущена. Допустимы конструкции иначе-если с синтаксисом в духе Алгола 68: %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e b4 %; где ci - условия, bi - тела |
Если в команде %[doxXs] используются флаги - или +, необходимо перед ними поставить :, чтобы было отличие от
команд %- и %+, например %:-16.16s.
Рассмотрим несколько примеров.
На терминале Hewlett-Packard 2645 для того, чтобы поместить курсор в 3-ю строку 12-ю колонку требуется вывести последовательность \E&a12c03Y с задержкой 6 миллисекунд. Обратите внимание, что порядок номеров строки
и колонки обратный, причем номер дополняется слева нулем до двух цифр. В этом случае описание характеристики
cup будет иметь вид cup=\E&a%p2%2.2dc%p1%2.2dY$<6>.
На терминале Micro-Term ACT-IV требуется, чтобы номеру
строки и колонки предшествовал символ ^T, номера строки
и колонки задаются в двоичном виде, таким образом,
cup=^T%p1%c%p2%c. Терминалы, в которых используется %c
должны иметь возможности сдвинуть курсор на шаг влево и
на шаг вверх (cub1 и cuu1), так как не всегда безопасно
выводить на терминал коды \n, ^D и \r, система может их
неправильно интерпретировать или проигнорировать (что
касается табуляции \t, библиотечные подпрограммы, работающие с terminfo, всегда устанавливают характеристики
терминала так, что табуляции не заменяются на пробелы,
поэтому посылать на терминал табуляции можно без опасений).
Последний пример относится к терминалу LSI ADM-3a, в
котором к адресу строки и колонки прибавляется код пробела, то есть cup=\E=%p1%'\s'%+%c%p2%'\s'%+%c. После
вывода двух символов \E= в стек помещается первый параметр, затем туда же кладется код пробела (32), затем
сумма замещает два верхних элемента стека, после чего
она выводится в двоичном виде. После этого то же самое
повторяется со вторым параметром.
Перемещения курсора
Если терминал может быстро перемещать курсор в левый
верхний угол экрана, эта возможность задается характеристикой home. Аналогично, быстрый способ перемещения в
левый нижний угол задается характеристикой ll. Часто
для этого используется перемещение на единицу вверх из
левого верхнего угла, однако, как это уже отмечалась, в
программе не следует делать предположения относительно
эффектов локальных перемещений на границах экрана. Заметим, что перемещение в левый верхний угол экрана эквивалентно перемещению по адресу (0,0) без изменения
привязки экрана к дисплейной памяти (если дисплейная
память превышает по размерам экран). Например на терминалах Hewlett-Packard в качестве характеристики home
нельзя использовать \EH.
Если у терминала есть возможности абсолютной установки
строки или колонки, адреса задаются однопараметрическими характеристиками hpa (горизонтальное позиционирование) и vpa (вертикальное позиционирование). Иногда это
бывает короче универсального двухпараметрического позиционирования (например, для терминала Hewlett-Packard
2645) и используется вместо cup. Если имеются параметризованные локальные перемещения (например, переместиться на n позиций вправо), они задаются однопараметрическими характеристиками cud, cub, cuf и cuu, что используется на терминалах, не имеющих характеристики
cup, например Tektronix 4025.
Очистка областей
Если терминал может очистить конец текущей строки, оставив курсор на прежнем месте, это задается характеристикой el. Если терминал может очистить начало текущей
строки до позиции курсора включительно, это задается
характеристикой el1. Если терминал может очистить строки, начиная с текущей и до конца экрана, это задается
характеристикой ed, которой можно пользоваться, только
если курсор находится в первой колонке. Таким образом,
очистка конца экрана может быть проэмулирована удалением большого числа строк.
Удаление/вставка строк
Если терминал может вставить пустую строку перед текущей, это задается характеристикой il1, которой можно
пользоваться, только если курсор находится в первой колонке. Курсор при этом должен оказаться на только что
вставленной строке. Если терминал может удалить текущую
строку, это задается характеристикой dl1, которой можно
пользоваться, только если курсор находится в первой колонке удаляемой строки. Версии характеристик il1 и dl1,
принимающие в качестве параметра число удаляемых или
вставляемых строк, задаются, как характеристики il и
dl.
Если терминал может устанавливать область роллирования
с разрушением (как, например, терминал VT100), соответствующая команда описывается характеристикой csr,
которая имеет 2 параметра: верхняя и нижняя строки области роллирования. К сожалению, после выполнения этой
команды позиция курсора оказывается неопределенной. С
помощью этой команды можно добиться эффекта удаления
или вставки строки, рекомендуется при этом пользоваться
командами sc и rc (запомнить позицию курсора и восстановить ее). Вставка строк на границах экрана удобнее
выполнять командами ri и ind, в том числе и на тех терминалах, которые могут вставлять и удалять строки в любом месте.
Некоторые терминалы могут устанавливать область роллирования без разрушения. Чтобы определить, к какому типу
относится Ваш терминал, создайте область роллирования в
середине экрана, поместите данные в нижнюю строку области роллирования и выполните команду ri, за которой
dl1 или ind. Если данные из нижней строки, исчезнувшие
после команды ri, восстановились на экране после команды dl1 или ind, значит Ваш терминал устанавливает область роллирования без разрушения. В этом случае указывать характеристику csr нельзя.
Если терминал может определять окно, как часть дисплейной памяти, к которой относятся команды, это задается
характеристикой wind, которая имеет четыре параметра:
начальная и конечная строки памяти, начальная и конечная колонки памяти, в указанном порядке.
Если терминал может использовать дисплейную память ниже
экрана, это задается булевой характеристикой db, возможность использования дисплейной памяти выше экрана
задается булевой характеристикой da. Это означает, что
удаление строки или роллирование экрана может привести
к появлению непустой строки внизу или роллирование с
помощью ri может привести к появлению непустой строки
вверху.
Удаление/вставка символов
Существует два способа удаления/вставки символов, которые могут быть описаны в terminfo. Чаще всего, удаление
и вставка символов приводит к сдвигу всего конца текущей строки. Однако есть терминалы, например Concept 100
или Perkin Elmer Owl, которые различают выведенные на
экран пробелы и места, куда ничто не было выведено
(пустоты). При этом при вставке и удалении символов
сдвиг затрагивает только пустоты, которые либо удаляются с экрана, либо заменяются на два пустых символа. Вы
можете определить к какому типу относится Ваш терминал,
очистив экран и напечатав несколько символов вперемежку
с перемещением курсора. Напечатайте abc def, используя
между словами не пробел, а перемещение курсора. Затем
поместите курсор перед abc и переведите терминал в режим вставки. Если последующий ввод символов приводит к
сдвигу строки целиком, а символы, выходящие за край экрана пропадают, то Ваш терминал не различает пробелы и
пустоты. Если abc вначале пододвигается к def, а затем
они вместе движутся к краю экрана и переходят на следующую строку, то Ваш терминал относится ко второму типу,
и для него должна быть задана булева характеристика in.
Хотя логически переход символов на следующую строку и
специальная обработка пустот представляют собой разные
вещи, в terminfo используется одна характеристика, поскольку нам не встречался терминал, ведущий себя иначе,
чем описано выше.
В terminfo можно описать как терминалы, у которых имеется режим вставки, так и терминалы, требующие специальной команды для освобождения пустого места перед выводом символа. В характеристике smir задается команда
для перевода терминала в режим вставки. В характеристике rmir задается команда для вывода терминала из режима
вставки. В характеристике ich1 задается последовательность, которую нужно послать перед выводом вставляемого
символа. Большинство терминалов, имеющих режим вставки,
не имеют команды ich1. (Если Ваш терминал имеет обе
возможности, предпочтительнее использовать режим вставки. При этом не следует, без необходимости, задавать
характеристику ich1.) Если при вставке символов требуется задержка, она задается в символьной характеристике
ip. В характеристике ip можно также задать последовательность, которая должна быть послана на терминал после вставки одного символа. Если Ваш терминал требует
одновременного включения режима вставки и использования
специального кода, освобождающего место для вставляемого символа, следует указать обе характеристики (smir/
rmir и ich1), и обе они будут использованы. Характеристика ich с одним параметром n повторяет эффект ich1 n
раз.
Если требуется задержка между выводом символов не в режиме вставки, она задается в характеристике rmp.
Иногда при удалении символа в текущей строке возникает
необходимость в перемещении курсора (например, если
удаляется символ табуляции). Если Ваш терминал позволяет перемещать курсор в режиме вставки, укажите булеву
характеристику mir. Если характеристика mir не указана,
выполнение операции будет чуть медленнее. Для некоторых
терминалов (например, Datamedia) из-за специфических
свойств режима вставки указывать mir нельзя.
Для удаления символов указываются следующие характеристики: dch1 для удаления одного символа, dch для удаления n символов, smdc и rmdc для входа и выхода из режима удаления (состояния терминала, при котором правильно
работает команда dch1).
Команда для очистки n символов (эквивалентная выводу n
пробелов без перемещения курсора) задается характеристикой ech, имеющей один параметр.
Яркость, подчеркивание и другие визуальные эффекты
Если Ваш терминал имеет различные возможности визуализации, воспользоваться ими можно по-разному. Вы можете
выбрать определенный режим, такой как режим сообщений
[см. curses(3X)], в котором символы изображаются ярко,
контрастно, и использовать его для вывода сообщений об
ошибках и других сообщений, привлекающих внимание. (Если у Вас есть выбор, хорошим вариантом является инверсия пониженной яркости или просто инверсия, хотя разные
пользователи на разных терминалах имеют различные предпочтения.) Последовательности для входа в режим сообщений и выхода из него задаются в характеристиках smso и
rmso соответственно. Если последовательность, переводящая в режим сообщений или выводящая из него, оставляет
на экране один или два пробела, как это происходит с
терминалами TVI 912 и Teleray 1061, в числовой характеристике xmc задается это число.
Коды, необходимые для начала и завершения подчеркивания, задаются в характеристиках smul и rmul соответственно. Если терминал может подчеркнуть текущий символ,
передвинув при этом курсор на шаг вправо, как например
терминал Micro-Term MIME, это задается характеристикой
uc.
Другие визуальные эффекты включают в себя: blink (мерцающие символы), bold (выделенные - жирные или более
яркие символы), dim (символы пониженной яркости), invis
(невидимые символы), prot (защищенные символы), rev
(инвертированные символы), sgr0 (выключить все атрибуты), smacs (перейти к альтернативному набору символов)
и rmacs (выйти из альтернативного набора символов).
Включение одного из этих режимов может повлиять (а может и не повлиять) на установку остальных режимов. Если
перед переходом к альтернативному набору символов требуется выполнить какие-то команды, они задаются в характеристике enacs.
Если существует последовательность, устанавливающая набор атрибутов, она задается характеристикой sgr, имеющей девять параметров. Каждый параметр может быть нулем
или не нулем, в зависимости от того, выключается соответствующий атрибут или включается. Девять параметров
задаются в следующем порядке: режим сообщений, подчеркивание, инверсия, мерцание, пониженная яркость, выделение, невидимые символы, защита, альтернативный набор
символов. В sgr не обязательно поддерживать все режимы,
достаточно тех, для которых существует соответствующая
команда (см. пример в конце настоящего описания).
Терминалы с характеристикой xmc при получении последовательностей, переключающих режимы, выдают на экран
всякий мусор. Некоторые терминалы, например, Hewlett
Packard 2621, автоматически выходят из режима сообщений
при переходе на новую строку или адресации курсора.
Программы, использующие режим сообщений, должны выйти
из него прежде, чем адресовать курсор или переходить на
новую строку, если только не задана характеристика
msgr, говорящая о том, что перемещаться в режиме сообщений можно без опаски.
Если терминал обладает способностью беззвучной сигнализации об ошибке, она задается в характеристике flash,
при этом курсор перемещаться не должен. Хорошим беззвучным сообщением является инвертирование всего экрана, задержка 200 мс и восстановление нормального изображения на экране.
Если существует возможность сделать курсор более заметным, чем обычно (например, блок или мерцающее подчеркивание вместо немерцающего подчеркивания), эта последовательность задается в характеристике cvvis, при этом
необходимо задать булеву характеристику chts. Возможность сделать курсор абсолютно невидимым задается характеристикой civis. Характеристика cnorm задает последовательность, возвращающую курсор в обычное состояние.
Если требуется, чтобы для использования команд адресации терминал находился в определенном состоянии, коды
для перехода к этому состоянию и выхода из него задаются характеристиками smcup и rmcup. Это нужно, например,
для терминала Concept, который имеет несколько страниц
памяти. Поскольку адресация курсора ведется относительно памяти, а не экрана, чтобы адресация работала, необходимо правильно привязать экран к памяти. Эти характеристики используются также для терминала Tektronix
4025, для которого smcup устанавливает командный символ. Если smcup после rmcup не восстанавливает полностью состояние до rmcup, необходимо указать булеву
характеристику nrrmc.
Если на Вашем терминале подчеркивание получается путем
вывода символа подчеркивания, даже если в других случаях вывода одного символа поверх другого надпечатки не
происходит, то необходимо указать булеву характеристику
ul. Для терминалов, на которых вывод одного символа поверх другого производит надпечатку, задайте булеву характеристику os. Если при надпечатке пробелом можно
стереть символ, задайте характеристику eo.
Пример задания визуальных эффектов: пусть рассматриваемый терминал требует следующих последовательностей для
включения режимов:
Параметр | Атрибут | Последовательность |
| нет | \E[0m |
p1 | сообщение | \E[0;4;7m |
p2 | подчеркивание | \E[0;3m |
p3 | инверсия | \E[0;4m |
p4 | мерцание | \E[0;5m |
p5 | пониж.яркость | \E[0;7m |
p6 | выделение | \E[0;3;4m |
p7 | невидимость | \E[0;8m |
p8 | защита | отсутствует |
p9 | альтерн.набор | ^O (выкл) ^N (вкл) |
Обратите внимание, что указанные последовательности
вначале выключают все режимы, а затем включают нужный.
Заметьте также, что режим сообщений, как было рекомендовано выше, включает инверсию пониженной яркости. Поскольку терминал не имеет выделенного режима, выделение
реализуется подчеркиванием и инверсией. Наконец, для
комбинации атрибутов, например, подчеркивание + мерцание, используется следующая последовательность:
\E[0;3;5m. У терминала нет защищенного режима и его никак нельзя проэмулировать, поэтому p8 игнорируется. Работа с альтернативным набором переключается символами
^O и ^N. Чтобы включить все режимы, необходимо послать
следующую последовательность: \E[0;3;4;5;7;8m^N.
Теперь посмотрим, как выводятся различные последовательности. Например, ;3 выводится, если истинно p2 или
p6, то есть включается режим подчеркивания или выделения. Выписывание последовательностей и их зависимостей
дает следующее:
Последоват. | Когда выводить | В виде terminfo |
\E[0 | всегда | \E[0 |
;3 | если p2 или p6 | %?%p2%p6%|%t;3%; |
;4 | если p1 или p3 или p6 | %?%p1%p3%|%p6%|%t;4%; |
;5 | если p4 | %?%p4%t;5%; |
;7 | если p1 или p5 | %?%p1%p5%|%t;7%; |
;8 | если p7 | %?%p7%t;8%; |
m | всегда | m |
^N или ^O если p9 ^N иначе ^O %?%p9%t^N%e^O%; |
Записывая все это в одну последовательность, получаем:
sgr=\E[0%?%p2%p6%|%t;3%;%?%p1%p3%|%p6%|%t;4%;%?%p4%t;5%;
%?%p1%p5%|%t;7%;%?%p7%t;8%;m%?%p9%t^N%e^O%;
Клавиатура
В terminfo можно записать информацию о кодах, которые
посылает в компьютер клавиатура терминала при нажатии
клавиш. Некоторые терминалы не посылают кодов в компьютер, нажатие клавиш изображается только на экране, например, терминал Hewlett-Packard 2621. Если командами
можно заставить терминал посылать или не посылать коды
при нажатии клавиш, эти команды указываются в характеристиках smkx и rmkx. В противном случае считается, что
клавиши всегда посылают коды. С терминалами, которые
никогда не посылают кодов, работать невозможно.
Коды, которые посылаются стрелками влево, вправо, вверх
и вниз и клавишей HOME, задаются характеристиками
kcub1, kcuf1, kcuu1, kcud1 и khome соответственно. Если
на клавиатуре имеются клавиши f0, f1, f2, ..., f63, посылаемые ими коды задаются характеристиками kf0, kf1,
kf2, ..., kf63. Если надписи на первых 11 клавишах не
f0, ..., f10, их можно задать характеристиками lf0,
lf1, ..., lf10. Можно также задать коды, посылаемые некоторыми другими клавишами: kll (в левый нижний угол),
kbs (возврат на шаг), ktbc (очистка всех табуляций),
kctab (очистить точку останова табуляции), kclr (очистка экрана), kdch1 (удалить символ), kdl1 (удалить строку), krmir (войти в режим вставки), kel (очистить конец
строки), ked (очистить конец экрана), kich1 (вставить
символ или войти в режим ставки), kil1 (вставить строку), knp (следующая страница), kpp (предыдущая страница), kind (роллирование вперед), kri (роллирование назад), khts (установить точку останова табуляции). В дополнение, если на клавиатуре есть область из 9 клавиш
(3x3), включающая в себя стрелки, то остальные 5 клавиш
могут быть заданы, как ka1, ka3, kb2, kc1 и kc3. Эти
клавиши обычно используется, когда необходимо отслеживать расположение нажимаемых клавиш на клавиатуре. Выше
в списке характеристик перечислен дополнительно целый
ряд клавиш, которые также могут быть заданы.
Цепочки символов для программирования функциональных
клавиш задаются характеристиками pfkey, pfloc и pfx.
Цепочки для программирования изображаемых надписей задаются характеристикой pln. Каждая из этих характеристик имеет два параметра: номер клавиши, которую нужно
запрограммировать (от 0 до 10) и программирующую цепочку. Если указанный номер клавиши больше 10, результат
не определен, для некоторых терминалов при этом может
запрограммироваться какая-нибудь дополнительная клавиша. Характеристика pfkey приводит к тому, что эффект от
нажатия клавиши эквивалентен указанной цепочке, характеристика pfloc заставляет терминал при нажатии клавиши
выполнять указанные операции в локальном режиме, характеристика pfx приводит к посылке указанной последовательности в компьютер. Характеристики nlab, lw и lh задают число программируемых надписей, их ширину и высоту. Если имеются команды включения и выключения программируемых надписей, они задаются характеристиками
smln и rmln. Обычно smln выводят после вывода нескольких pln, чтобы быть уверенными, что надписи видны.
Табуляции и инициализация
Если терминал поддерживает точки останова табуляции, то
команда, которая перемещает курсор до следующей точки
останова табуляции, задается характеристикой ht (обычно
это CTRL+I). Команда, перемещающая курсор к предыдущей
точке останова табуляции, задается характеристикой cbt.
Если характеристики линии установлены так, что драйвер
заменяет табуляции на соответствующее число пробелов, а
не посылает их напрямую на терминал, программы не должны использовать ht и cbt, даже если они присутствуют,
поскольку у пользователя позиции табуляции могут быть
установлены не так. Если терминал поддерживает точки
останова табуляции, которые при инициализации устанавливаются в каждую n-ю позицию, параметр n задается числовой характеристикой it. Это используется командой
tput init [см. tput(1)] для определения того, нужно ли
устанавливать замену табуляций на пробелы и где установить точки останова табуляции. Если терминал может сохранять установку позиций табуляции и при выключении питания, в описании terminfo считается, что они установлены правильно. Если имеются команды установки и очистки позиций табуляции, они задаются характеристиками tbc
(очистить все позиции табуляции) и hts (установить позицию табуляции в текущую колонку каждой строки).
Кроме того, имеются следующие характеристики: is1, is2
и is3, инициализирующие цепочки символов для терминала,
iprog, имя программы, инициализирующей терминал, и if,
имя файла, содержащего длинную цепочку для инициализации. Предполагается, что эти цепочки устанавливают терминал в состояние, соответствующее дальнейшему описанию
в terminfo. Они должны посылаться на терминал в следующем порядке: запустить программу iprog, вывести is1,
вывести is2, установить границы с помощью mgc, smgl и
smgr, установить табуляции с помощью tbc и hts, вывести
файл if, и, наконец, вывести is3. Обычно именно это делается командой tput init [см. tput(1), profile(4)].
Большинство инициализаций выполняется с помощью is2.
Специальные режимы терминалов могут быть установлены
без дублирования цепочек символов с помощью общей для
всех последовательности is2 и специальных is1 и is3.
Последовательности, которые переводят терминал в начальное состояние из абсолютно любого, задаются характеристиками rs1, rs2, rf и rs3 (аналогично is1, is2, if
и is3). (Некоторые описания используют характеристики
if и rf с файлами из /usr/lib/tabset/*, однако рекомендуется использовать цепочки инициализации.) Характеристики rs1, rs2, rf и rs3 выводятся командой tput reset,
которая используется для выведения терминала из непонятного состояния. Команды помещаются в rs1, rs2, rf и
rs3 только если они производят неприятный эффект на экране и при нормальной работе не требуются. Например,
команду, переводящую терминал в режим 80 колонок, можно
поместить в is2, но на некоторых терминалах она приводит к неприятным эффектам на экране, и к тому же обычно
не требуется, так как терминал и так находится в режиме
80 колонок.
Если для установки позиций табуляций требуются действия
более сложные, чем просто использование tbc и hts, необходимая последовательность помещается в is2 или if.
Задержки
Некоторые характеристики управляют задержками в драйвере tty(7). Обычно это требуется для печатающих устройств и используется командой tput init для правильной
установки характеристик в драйвере. Задержки, указанные
в характеристиках cr, ind, cub1, ff и tab, могут использоваться для установки соответствующих бит задержки
в драйвере tty. Если указана характеристика pb (минимальная скорость для применения задержки), то при скоростях ниже указанной задержка не применяется.
Служебные строки
В terminfo можно занести информацию о том, что у терминала есть дополнительная служебная строка, которая
обычно не используется программами. Если это нижняя
строка экрана, которая обычным образом адресуется (например, 25-я строка терминала Heathkit h19 или 24-я
строка терминала vt100, в котором установлена 23-строчная область роллирования), необходимо задать характеристику hs. Специальные команды, перемещающие курсор в
заданную позицию служебной строки и возвращающие курсор
обратно, задаются характеристиками tsl и fsl. (fsl
должна оставлять курсор в том же месте, в каком он был
до tsl. При необходимости следует воспользоваться командами sc и rc.) Характеристика tsl имеет один параметр - номер колонки в служебной строке, в которую помещается курсор.
То, что терминал может выполнять команды, например табуляцию, даже если курсор находится в служебной строке,
задается характеристикой eslok. Цепочка символов, убирающая с экрана или очищающая служебную строку, задается характеристикой dsl. Если терминал может запоминать
и вспоминать позицию курсора, задайте характеристики sc
и rc. Считается, что служебная строка имеет ту же длину, что и все остальные, то есть cols. Если длина служебной строки иная (например, терминал не позволяет заполнить всю служебную строку), то она задается числовой
характеристикой wsl.
Псевдографика
Если у терминала есть альтернативный набор символов,
позволяющий выводить рамки и стрелки, отображение рисунка на код символа задается символьной характеристикой acsc. Определение этой цепочки основано на альтернативном наборе символов терминала vt100 фирмы DEC,
несколько расширенного символами терминала 4410v1 фирмы
AT&T.
Изображение | Символ vt100+ |
стрелка вправо | + |
стрелка влево | , |
стрелка вниз | . |
сплошной блок | 0 |
фонарик | i |
стрелка вверх | - |
алмаз | ` |
клетка | a |
знак градуса | f |
плюс/минус | g |
квадраты | h |
правый нижний угол | j |
правый верхний угол | k |
левый верхний угол | l |
левый нижний угол | m |
крест | n |
надчеркивание | o |
горизонталь | q |
подчеркивание | s |
левый край | t |
правый край | u |
нижний край | v |
верхний край | w |
вертикаль | x |
перечисление | ~ |
Самый лучший способ описания средств псевдографики другого терминала заключается в следующем. Сначала надо
добавить к таблице, приведенной выше, новую колонку и в
ней перечислить символы, которые в альтернативном наборе нового терминала выводят то же изображение. Например,
Изображение | Символ vt100+ | Новый терминал |
левый верхний угол | l | R |
левый нижний угол | m | F |
правый верхний угол | k | T |
правый нижний угол | j | G |
горизонталь | q | , |
вертикаль | x | . |
После этого необходимо выписать символы слева направо,
то есть acsc=lRmFkTjGq\,x..
Дополнительные возможности
Если терминалу требуется заполнитель, отличный от нуля,
он задается характеристикой pad. Используется только
первый символ значения pad. Если у терминала нет заполнителя, укажите характеристику npc.
Возможности терминала перемещать курсор на полстроки
вверх или вниз задаются характеристиками hu и hd соответственно. Они обычно используются для верхних и нижних индексов на печатающих устройствах. Возможность печатающего устройства прогонять бумагу до следующей
страницы задается характеристикой ff (обычно это
CTRL+L).
Если имеется команда, повторяющая заданный символ заданное число раз (и позволяющая тем самым уменьшить
время, необходимое для передачи группы одинаковых символов), она задается характеристикой rep. Первым параметром является повторяемый символ, а вторым - количество повторений. Таким образом,
tparm(repeat_char,'x',10) выводит xxxxxxxxxx.
Некоторые терминалы могут изменять символ, используемый
в качестве командного, как например Tektronix 4025.
Символ, который используется во всех командах, но в некоторых случаях может быть другим, задается характеристикой cmdch. В некоторых системах поддерживается следующее соглашение: если определена переменная окружения
CC [см. environ(5)], то символ, заданный характеристикой cm, во всех командах заменяется на значение переменной окружения CC.
Если к одной и той же линии могут подключатся различные
терминалы (например, через сеть), можно использовать
характеристику gn, чтобы программа могла определить,
что тип подключенного терминала неизвестен (это не относится к виртуальным терминалам, чьи характеристики
известны). Если терминал поддерживает протокол виртуального терминала системы UNIX, его номер задается числовой характеристикой vt. Последовательность, которую
нужно послать на терминал перед чтением с него, задается характеристикой rfi.
Если терминал поддерживает протокол xon/xoff, укажите
характеристику xon. Можно оставить информацию о задержках, полезную для оценки сложности операции, но символы-заполнители при этом передаваться не будут. Последовательности, включающие протокол xon/xoff и выключающие
его, задаются характеристиками smxon и rmxon. Если символы в протоколе xon/xoff не CTRL+Q и CTRL+S, они могут
быть заданы характеристиками xonc и xoffc.
Если терминал имеет клавишу МЕТА, которая действует,
как клавиша регистра, устанавливая восьмой бит передаваемого кода, укажите характеристику km. В противном
случае программы считают, что восьмой бит является битом четности и очищают его. Если имеются команды, включающие и выключающие этот "МЕТА-режим", они задаются
характеристиками smm и rmm.
Если в дисплейной памяти терминала строк больше, чем на
экране, то число строк в памяти задается характеристикой lm. Значение lm#0 означает, что число строк памяти
неизвестно, но оно все-таки больше, чем число строк на
экране.
Команды, управляющие принтером, подключенным к терминалу, задаются следующими характеристиками: mc0 (напечатать содержимое экрана), mc4 (выключить принтер) и mc5
(включить принтер). Если принтер включен, весь текст,
посылаемый на терминал, посылается и на принтер. Характеристика mc5p, имеющая один параметр, включает принтер
для печати указанного числа символов, а затем его выключает. Параметр при этом не должен превосходить 255.
Если при печати на принтере текст не изображается на
экране, укажите характеристику mc5i. Если выполняется
команда, заданная mc5p, то принтеру передаются все коды, включая mc4.
Особые случаи
Имеющиеся в terminfo характеристики хорошо описывают
большинство терминалов. Однако некоторые терминалы не
удается описать полностью. Это является не недостатком
конкретного терминала, а скорее свидетельствует об отличии конкретного оборудования от той модели терминала,
на которой основана terminfo.
Для некоторых конкретных терминалов в terminfo предусмотрены специальные характеристики.
Для терминалов, которые не умеют изображать знак ~,
как, например, терминал Hazeltine, задается характеристика hz.
Для терминалов, которые игнорируют перевод строки сразу
после автоматического перехода на новую строку при достижении правой границы, как терминал Concept 100, задается характеристика xenl. Для терминалов, на которых
курсор остается на правой границе до получения следующего символа, вместо того, чтобы перейти на следующую
строку сразу, как терминал vt100, тоже задается характеристика xenl.
Если текст, выданный в режиме сообщений, должен обязательно очищаться командой el перед выводом текста поверх него, то задается характеристика xhp.
Для терминалов Teleray, которые табуляциями затирают
текст, через который перемещается курсор, необходимо
задать характеристику xt. Эта же характеристика означает, что для выхода из режима сообщений необходимо использовать команды вставки и удаления строк.
Для терминалов Beehive Superbee, которые не умеют посылать коды ESC и CTRL+C, нобходимо указать характеристику xsb, означающую, что вместо ESC будет использоваться
клавиша f1, а вместо CTRL+C - клавиша f2.
Похожие терминалы
Если имеются два похожих терминала, то один может быть
определен указанием, что он почти такой же, как другой.
В символьной характеристике (спецификаторе) use задается имя похожего терминала. Характеристики, предшествующие use, замещают характеристики указанного терминала.
Характеристика может быть отменена, указанием xx@ ранее
определения самой характеристики xx. Например, описание
att4424-2|Teletype 4424 in display function group ii,
rev@, sqr@, smul@, use=att4424,
означает, что терминал AT&T 4424-2 является разновидностью телетайпа AT&T 4424, но не обладает характеристиками rev, sgr и smul, и, следовательно, не может выделять что-либо на экране.
Спецификатор use удобно использовать для различных режимов терминалов или для отражения различных вкусов
пользователей. Можно задавать несколько спецификаторов
use.
ФАЙЛЫ
/usr/lib/terminfo/?/* Скомпилированная база данных
терминалов.
/usr/lib/.COREterm/?/* Подмножество скомпилированной
базы данных терминалов.
/usr/lib/tabset/* Коды, устанавливающие границы и
позиции табуляции для конкретных
терминалов.
СМ. ТАКЖЕ
curses(3X), printf(3S), term(5).
captoinfo(1M), infocmp(1M), tic(1M), tty(7) в Справочнике администратора.
tput(1) в Справочнике пользователя.
ПРЕДОСТЕРЕЖЕНИЯ
Как указано в разделе Табуляции и инициализация, перед
использованием пакета curses(3X) необходимо вывести на
терминал цепочки символов is1, is2, is3 и файл if. Это
можно сделать с помощью команды tput init [см. tput(1)
и profile(4)].
Эксперименты с файлами /usr/lib/terminfo/?/* и /usr/
lib/.COREterm/?/* (например, удаление или изменение
файла) может повлиять на выполнение программ, таких как
vi, которые считают, что в этом месте лежит правильный
файл. В частности, удаление описания "ненужного" терминала может привести к непредсказуемым последствиям.
ЗАМЕЧАНИЯ
База данных termcap, которая использовалась в ранних
версиях системы UNIX, в будущих версиях может не поддерживаться.
|
|