Эта глава имеет дело с вводом/выводом символов на экран. Когда мы
говорим "символ", то подразумеваем композицию пикселов, которая может
меняться в зависимости от таблицы представлений символов (charset).
Ваша графическая карта уже предлагает одну или более таких таблиц и по
умолчанию работает в текстовом (charset) режиме, потому что текст
обрабатывается быстрее, чем пиксельная графика. Терминалы можно
использовать лучше, чем как простые и скучные текстовые дисплеи.
Рассмотрим, как использовать специальные возможности, которые
предлагает терминал Linux, особенно консоль Linux.
printf, sprintf, fprintf, scanf, sscanf, fscanf
С этими функциями libc вы можете выдавать форматированные строки
в stdout (стандартный вывод), stderr (стандартная ошибка) или другие потоки,
определенные как FILE *stream (например, файлы). sscanf
обеспечивает подобные возможности для чтения форматированного ввода из stdin.
termcap
База данных TERMinal CAPabilitie это таблица элементов описания
работы с терминалом в ASCII-файле /etc/termcap. Здесь вы можете найти
информацию о том, как выводить специальные символы, как осуществлять
операции (удаления, вставки символов или строк и т.д.) и как
инициализировать терминал. База данных используется, например,
редактором vi. Имеются библиотечные функции для чтения и использования
возможностей терминала (смотри termcap(3x)). С этой базой данных
программы могут работать с различными терминалами одним и тем же
кодом. База данных termcap и библиотечные функции предоставляют только
низкоуровневый доступ к терминалу. Изменение атрибутов или цветов,
параметризованный вывод и оптимизация остаются программисту.
terminfo database
База данных TERMinal INFOrmation построена над базой данных
termcap и описывает некоторые возможности терминалов на более высоком
уровне. С terminfo программа может легко менять атрибуты экрана,
используя специальные клавиши, такие как функциональные клавиши и др.
Эта база данных может быть найдена в /usr/lib/terminfo/[A-z,0-9]*.
Каждый файл описывает один терминал.
curses
Terminfo хорошая база для работы с терминалом в программе.
Библиотека (BSD-)curses дает вам высокоуровневый доступ к терминалу,
базируясь на terminfo. curses позволяет открывать и манипулировать
окнами на экране, предоставляет весь необходимый набор функций
ввода/вывода и может изменять видеоатрибуты терминально-независимым
образом на более чем 150 терминалах. Библиотека находится в
/usr/lib/libcurses.a. Это BSD-версия curses.
ncurses
ncurses представляет собой развитие curses. В версии 1.8.6 она должна быть
совместима с AT&T curses, как это определено в SYSVR4, и иметь
несколько расширений, таких как манипулирование цветами, специальная
оптимизация для вывода, оптимизации, зависящие от терминала, и др.
ncurses была протестирована на множестве систем, таких как Sun-OS, HP
и Linux. Автор рекомендует предпочесть ncurses всему остальному. В
SYSV Unix системах (например, Solaris) должна существовать библиотека
curses с теми же функциональными возможностями, что и ncurses (на
самом деле солярисовская curses имеет немного больше функций и
поддержку мыши).
В следующих разделах мы рассмотрим, как пользоваться различными
пакетами доступа к терминалу. В Linux мы имеем GNU-версию termcap и
можем пользоваться ncurses вместо curses.
Функции printf(...) в libc обеспечивают форматированный вывод и
позволяют трансформировать аргументы.
int fprintf(FILE *stream, const char *format, ...),
преобразует выводимые аргументы в соответствии с шаблоном и записывает его в
stream. Формат определяется аргументом format.
Функция возвращает число записанных символов или отрицательное число в
случае ошибки.
format содержит два типа объектов:
обычные символы и
информацию, как трансформировать или форматировать аргументы.
Форматная информация должна начинаться с %, за которым следуют
значения для формата, дальше идет символ для трансляции (чтобы напечатать
знак %, используйте %%). Возможны следующие значения для
формата:
Параметры:
-
Форматированный аргумент будет при печати прижат влево на своем поле.
+
Каждое число будет напечатано со знаком, например, +12 или
-2.32.
Пробел
Если первый символ не знак, то будет вставлен пробел.
0
Для чисел ширина поля будет заполнена слева нулями.
#
Изменяет вывод в зависимости от трансформации для аргумента:
Для o первое число будет 0.
Для x или X будет напечатано в конце 0x или
0X соответственно.
Для e, E, f, F вывод имеет десятичную точку.
Для g или G в конце аргумента будут напечатаны нули.
Число, указывающее минимальную ширину поля.
Трансформированный аргумент печатается в поле, ширина которого не
меньше, чем сам аргумент. С этим числом вы можете увеличить ширину
поля. Если аргумент меньше, то оставшаяся часть поля заполняется
пробелами или нулями.
Точка для отделения ширины поля и точности.
Число для точности.
Возможные значения для трансформации смотри в таблице
8.1.
int printf(const char *format, ...)
То же самое, что fprintf(stdout, ...).
int sprintf(char *s, const char *format, ...)
То же, что и printf(...), но вывод будет записан в символьный
указатель s (с последующим \0). Вы должны
захватить достаточно памяти для s!
vprintf(const char *format, va_list arg) vfprintf(FILE *stream, const char *format, va_list arg) vsprintf(char *s, const char *format, va_list arg)
То же, что и для вышеописанных функций, только список аргументов
находится в arg.
Символ
Форматируется в
d,i
int signed, десятиричный
o
int unsigned, восьмеричный, без предваряющего 0
x,X
int unsigned, шестнадцатиричный, без предваряющего 0x
Точно так же, как printf(...) для форматированного вывода, Вы
можете использовать scanf(...) для форматированного ввода.
int fscanf(FILE *stream, const char *format, ...) fscanf(...) читает из stream и преобразует ввод по правилам,
определяемым в format. Результаты помещаются в аргументы, заданные в
"..." (эти аргументы должны быть указателями!). Чтение
заканчивается, когда в format исчерпаны правила форматирования.
fscanf вернет EOF, при первом достижении конца файла или при
возникшей ошибке. Если этого не случится, будет возвращено количество
трансформированных аргументов.
format может содержать правила форматирования аргументов (см.
таблицу 8.2. Он может также включать:
пробелы или табуляции, которые игнорируются;
любой нормальный символ, кроме %. Символы должны быть во вводе
на соответствующих позициях.
правила преобразования, заданные с %, необязательный символ
* (позволит fscanf(...) присвоить аргументу), необязательное
число, необязательный символ h, l или L (для задания длины
считываемой инфомации) и символ трансформации.
int scanf(const char *format, ...) То же, что fscanf(stdin,...).
int sscanf(char *str, const char *format, ...)
То же, что scanf, но ввод производится из строки str.
СимволВход: тип аргумента
dдесятичный integer: int*
iinteger: int* (вход может быть восьми
или шестнадцатиричным)
oвосьмеричный integer: int* (с или без предваряющего 0)
uдесятичный unsigned: unsigned int*
xшестнадцатиричный integer: int* (с или без предваряющего
0x)
cодин или более символов: char* (без завершающего /0)
e,f,gffloat: float* (такой как [-]m.dddddde+xx,
[-]m.dddddde-xx)
pуказатель: void*
nчисло трансформированных аргументов: int*
[...]непустое множество символов на входе: char*
[^...]исключая такие символы: char*
%%
Таблица 8.2: Libc: правила scanf
перед d,i,n,o,u,x может стоять h, если указатель short
то же для l, если указатель long
l также может быть перед e,f,g, если указатель double
L может стоять перед e,f,g, если указатель long double
Библиотека termcap это API для базы данных termcap, которая
находится в /etc/termcap. Библиотечные функции позволяют:
получить описание текущего терминала: tgetent(...).
найти описание для информации:
tgetnum(...), tgetflag(...), tgetstr(...).
Представить числовые параметры в форме, специфичной для терминала:
tparam(...), tgoto(...).
вычислить и произвести поточечный вывод: tputs(...).
Программы, использующие библиотеку termcap должны включать
termcap.h и собираться с:
gcc [flags] files -ltermcap
Функции termcap терминально-независимые программы, но дают
программисту только низкоуровневый доступ к терминалу. Для пакета
более высокого уровня потребуется curses или ncurses.
int tgetent(void *buffer, const char *termtype)
В операционной системе Linux текущее имя терминала содержится в
переменой среды TERM. Поэтому termtype есть результат вызова
getenv(3).
Что касается buffer, то в GNU-версии Linux termcap не нужно
захватывать память. В других версиях вам придется выделить 2048 байт
(прежде buffer требовал 1024 байта, но сейчас размер удвоился).
tgetent(...) возвращает 1 в случае успеха и 0 когда база данных
найдена, но не имеет точки входа для TERM. Другие ошибки возвращают
различные значения.
Следующий пример объясняет как использовать tgetent(...):
#define buffer 0
char *termtype=getenv("TERM");
int ok;
ok=tgetent(buffer,termtype);
if (ok==1)
/* все нормально, мы имеем вход */
else if(ok==0)
/* Что-то не так с TERM
* проверим сначала termtype, затем базу данных termcap
*/
else
/* Глобальная ошибка */
По умолчанию termcap использует /etc/termcap как базу данных. Если
переменная среды TERMCAP установлена, например, в $HOME/mytermcap, то
все функции будут пользоваться mytermcap вместо /etc/termcap.
Без начального слэша в TERMCAP определенное значение понимается как имя для
терминала.
Каждый фрагмент информации называется свойством (capability). Каждое
свойство это двухсимвольный код, за каждым двухсимвольным кодом стоит
значение свойства. Возможны следующие типы свойств:
Числовой: например, co число столбцов
Логический или флаговый: например, hc терминал
твердой копии (hardcopy terminal)
Строковый: например, st установка табуляции
Каждое свойство связано с единственным типом значений (co всегда
числовой, hc всегда флаг, а st всегда строка). Три типа
значений и три типа функций, их запрашивающих. char *name
двухсимвольный код свойства.
int tgetnum(char *name) Получение свойства с числовым значением, таким как co. Функция
tgetnum(...) возвращает числовое значение, если свойство доступно, 1 в
противном случае. Заметьте, что возвращаемое значение всегда неотрицательно.
int tgetflag(char *name)
Получение логического свойства. Возвращает 1, если флаг
установлен, 0 в противном случае.
char *tgetstr(char *name, char **area)
Получение строкового свойства. Возвращает указатель на строку или
NULL в случае отсутствия. В GNU-версии, если area есть NULL, termcap
выделит память сам. termcap больше не позаботится об этом указателе,
если вы не освободите name перед выходом из программы. Такой метод
предпочтителен, поскольку вы не знаете сколько памяти потребуется для
указателя, поэтому позвольте termcap сделать все за вас.
Подключение ncurses.h определит переменные и типы для ncurses,
такие как WINDOW, и прототипы функций. Автоматически подключатся
stdio.h, stdarg.h, termios.h и unctrl.h.
initscr() используется для инициализации структур данных ncurses
и для чтения файла terminfo. Будет захвачена память под stdscr и
curscr. Если произойдет ошибка, то initscr вернет ERR. В противном
случае возвращается указатель на stdscr. Кроме этого, экран будет
очищен и будут проинициализированы LINES и COLS.
endwin() очистит все выделенные ресурсы ncurses и восстановит
режимы tty, какими они были до вызова initscr(). Функция
endwin() должна вызываться перед любой другой функцией из библиотеки
ncurses и перед выходом из вашей программы. Если вы хотите использовать для
вывода более чем один терминал, используйте newterm(...) вместо
initscr().
Компилируйте программу посредством:
gcc [flags] files -lncurses
Вы можете устанавливать любые флаги (см. gcc(1)). Если путь к
ncurses.h изменился, вы должны включить следующую строку, иначе
ncurses.h, nterm.h, termcap.h и unctrl.h не будут найдены:
-I/usr/include/ncurses
Другие возможные в Linux флаги: O2 скажет gcc произвести некоторую
оптимизацию; -ansi: для ANSI си-кода; -Wall выведет все
предупреждения; -m486 оптимизирует код для Intel 486 (можно и для
Intel 386).
Библиотека ncurses находится в /usr/lib. Существует 3 версии библиотеки:
libncurses.a обычная ncurses
libdcurses.a ncurses для отладки
libpcurses.a ncurses для профилирования (существует ли что-нибудь
после 1.8.6libcurses.a?)
libcurses.a не четвертая версия, это первоначальная BSD curses
(в slackware 2.1.0 в пакете bsd).
Структуры данных для экрана называются windows и определены в
ncurses.h. Окно это нечто типа символьного массива в памяти, которым
программист может манипулировать без вывода на терминал. При помощи
newwin(...) вы можете создать другие окна.
Чтобы оптимально обновить физический терминал, ncurses имеет
другое окно, curscr. Это изображение, реально выводимое на экран. Для
отображения stdscr на экране используется функция refresh(). После
этого ncurses обновит curscr и физический терминал содержимым stdscr.
Библиотечные функции произведут внутреннюю оптимизацию для процесса
обновления, поэтому вы можете менять различные окна и затем обновлять
экран сразу самым оптимальным способом.
Функциями ncurses вы можете работать со структурой данных window.
Функции, начинающиеся с w, позволяют назначать окно window,
тогда как остальные обычно имеют дело с stdscr. Функции, начинающиеся с
mv, прежде всего переместят курсор на позицию y,x.
Символы имеют тип chtype, который является long unsigned int
, чтобы сохранять дополнительную информацию о себе (атрибуты и т.д.).
Библиотека ncurses использует базу данных terminfo. Обычно она
находится в usr/lib/terminfo/, и ncurses обращается туда за локальными
определениями терминала. Если вы хотите проверить некоторые другие
определения для терминала, не исправляя первоначальную terminfo,
установите соответственно переменную среды TERMINFO. Эта переменная
будет протестирована ncurses, и вместо usr/lib/terminfo/ сохранятся
ваши определения.
Текущей версией ncurses является (на момент написания книги) 1.8.6.
В конце этого раздела вы найдете обзорную таблицу для BSD-Curses,
ncurses и Sun-OS 5.4 curses.
WINDOW *initscr()
Обычно это первая функция, вызываемая из программы, использующей ncurses. В
некоторых случаях полезно вызывать slk_init(int), filter(),
ripoffline(...) или use_env(bf) перед initscr(). Для
работы с несколькими терминалами (или тестирования возможностей системы) Вы
можете использовать newterm(...) вместо initscr().
initscr() прочитает terminfo файл и установит структуры данных
ncurses, выделит память для curscr и stdscr и проинициализирует переменные
LINES и COLS значениями, соответствующими вашему терминалу. Будет возвращен
указатель на stdscr или ERR в случае ошибки. Вам НЕ нужно
инициализировать указатель.
stdscr=initscr();
поскольку initscr() сделает это за вас. Если возвращен ERR, ваша
программа должна завершиться, поскольку ни одна функция ncurses не
будет работать:
if (!(initscr()))
{
fprintf(stderr,"type: initscr() failed\n\n");
exit (1);
}
SCREEN *newterm(char *type, FILE *outfd, FILE *infd)
Работая в ncurses с несколькими терминалами, вы должны вызвать для каждого из
них newterm(...) вместо initscr(). type это имя
терминала как оно содержится в $TERM (ansi, xterm, vt100, например).
outfd это указатель для вывода, infd указатель для ввода. Для
каждого терминала, открытого newterm(...), следует вызывать
endwin().
SCREEN *set_term(SCREEN *new)
При помощи set_term(SCREEN) Вы можете переключать текущий
терминал. Все функции будут работать с текущим терминалом,
установленным set_term(SCREEN).
int endwin() endwin() произведет очистку, восстановит режимы терминала,
сохраненные перед вызовом initscr(), и поставит курсор в левый
верхний угол экрана. Не забудьте закрыть все окна перед тем, как вызвать
endwin(), перед выходом из вашей программы.
Дополнительный вызов refresh() после endwin() восстановит
содержимое терминала, отображавшееся до вызова initscr()
(visual-mode), в противном случае экран будет очищен (non-visual-mode).
int isendwin()
Возвращает TRUE, если после endwin() была вызвана refresh(),
иначе FALSE.
void delscreen(SCREEN* sp)
Вызывается после endwin() для высвобождения всех занятых
ресурсов, когда SCREEN больше не нужен.
Окна могут быть созданы, уничтожены, перемещены, скопированы,
задублированы и т.д.
WINDOW *newwin(nlines, ncols, begy, begx) begy и begx координаты верхнего левого угла окна. nlines
это число линий (integer); ncols число колонок (integer).
Верхний левый угол нашего окна находится в строке 10 в колонке
10; окно имеет 10 строк и 60 колонок. Если nlines равна нулю, окно
будет иметь (LINES-begy) строк. Точно так же, если ncols
равна нулю, то окно будет иметь (COLS-begx) колонок.
Когда мы вызываем newwin(...) с нулевыми аргументами:
WINDOW *mywin;
mywin=newwin(0,0,0,0);
открытое окно получает размеры экрана.
При помощи LINES и COLS мы можем открыть окно на
середине экрана, какую бы размерность оно ни имело:
Откроется окно с 22 строками и 70 колонками в середине экрана.
Проверьте размер экрана перед тем, как открывать окно. Консоль Linux
имеет не менее 25 строк и 80 колонок, но на Х-терминалах это может не
выполняться (их размеры изменяемы).
С другой стороны, используйте LINES и COLS, чтобы
поместить два окна в один экран:
Подробнее смотрите screen.c в директории с примерами.
int delwin(win)
Удаляет окно win. Подокна win удаляются перед win.
Будут освобождены все ресурсы, занятые win. Удаляйте все открытые
вами окна перед вызовом endwin().
int mvwin(win, by, bx)
Перемещает окно на координаты by,bx. Если это означает выход за
пределы экрана, то ничего не произойдет и будет возвращен ERR.
WINDOW *subwin(origwin, nlines, ncols, begy, begx)
Возвращает подокно в середине origwin. Когда вы изменяете одно
из двух окон (origwin или новое), это изменение отразится на обоих
окнах. Вызывайте touchwin(origwin) перед следующим refresh().
begx и begy относятся не к origwin, а к экрану.
WINDOW *derwin(origwin, nlines, ncols, begy, begx)
То же, что subwin(), begx и begy относятся не к
экрану, а к origwin.
int mvderwin(win, y, x)
Перенесет win за пределы родительского окна.
WINDOW *dupwin(win)
Дублирует окно win.
int overlay(win1, win2) int overwrite(win1, win2) overlay(...) скопирует весь текст из win1 в win2,
игнорируя пропуски. overwrite(...) делает то же самое, но копирует
вместе с пропусками.
int copywin(win1, win2, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, overlay)
То же, что overlay(...) и overwrite(...), но позволяет
контролировать область окна для копирования.
int addch(ch) int waddch(win, ch) int mvaddch(y, x, ch) int mvwaddch(win, y, x, ch)
Эти функции выводят символ в окно. Они работают с окном; Вам
нужно вызвать refresh(), чтобы поместить окно на экран. Функции
addch(...) и waddch(...) помещают символ ch в окно
или win. mvaddch(...) и mvwaddch(...) предварительно
ставят курсор на позицию y,x.
int addstr(str) int addnstr(str, n) int waddstr(win, str) int waddnstr(win, str, n) int mvaddstr(y, x, str) int mvaddnstr(y, x, str, n) int mvwaddstr(win, y, x, str) int mvwaddnstr(win, y, x, str, n)
Эти функции заносят строку в окно и эквивалентны сериям вызовов
addch(...). str это строка, заканчивающаяся символом с
кодом 0 ("blafoo\0"). Функции, начинающиеся с
w, заносят str в окно win, остальные в stdscr.
Функции с n пишут n символов строки str. Если
n равен -1, будет записана вся строка str.
int addchstr(chstr) int addchnstr(chstr, n) int waddchstr(win, chstr) int waddchnstr(win, chstr, n) int mvaddchstr(y, x, chstr) int mvaddchnstr(y, x, chstr, n) int mvwaddchstr(win, y, x, chstr) int mvwaddchnstr(win, y, x, chstr, n)
Эти функции копируют chstr в окно stdscr или win.
Начальной позицией является позиция курсора. Функции с n пишут
n символов строки chstr. Если n равен -1, будет
записана вся строка. Курсор не двигается и символы не контролируются. Эти
функции быстрее, чем addstr(...). chstr является указателем
на массив элементов chtype.
int echochar(ch) int wechochar(win, ch)
То же, что addch(...), waddch(win), с последующим
refresh(), wrefresh(win).
int printw(fmt, ...) int wprintw(win, fmt, ...) int mvprintw(y, x, fmt, ...) int mvwprintw(win, y, x, fmt, ...) int vwprintw(win, fmt, va_list)
Эти функции соответствуют printf(...) и подобным ей функциям libc.
В libc printf() используется для форматированного вывода. Вы
можете определять выводимую строку и включать в нее переменные
различных типов. Подробнее смотрите раздел 8.1.1.
int insch(c) int winsch(win, c) int mvinsch(y,x,c) int mvwinsch(win,y,x,c)
Символ ch вставляется слева от курсора, и все символы сдвигаются
на одну позицию вправо. Самый правый символ строки может быть потерян.
int insertln() int winsertln(win)
Вставляет чистую строку над текущей. Нижняя строка будет потеряна.
int insdelln(n) int winsdelln(win, n)
Для положительного n эти функции вставляют n строк в
соответствующем окне (n нижних строк будут потеряны). Для
отрицательных n будут удалены n строк под курсором,
оставшиеся сдвинутся вверх.
int insstr(str) int insnstr(str, n) int winsstr(win, str) int winsnstr(win, str, n) int mvinsstr(y, x, str) int mvinsnstr(y, x, str, n) int mvwinsstr(win, y, x, str) int mvwinsnstr(win, y, x, str, n)
Эти функции вставят str в текущую строку слева от курсора
(сколько возможно до конца строки). Символы справа от курсора
сдвигаются вправо и удаляются достигнув конца строки. Курсор остается
на месте.
y и x координаты, на которые переместится курсор перед
вставкой str; n это число вставляемых символов
(n=0 вводит чистую строку).
int delch() int wdelch(win) int mvdelch(y, x) int mvwdelch(win, y, x)
Выполняется удаление символа под курсором и сдвиг оставшейся справа от
курсора строки на одну позицию влево.
y и x координаты, на которые курсор переместится перед
удалением.
int deleteln() int wdeleteln(win)
Удаление строки под курсором и перемещение нижележащих линий на
одну позицию вверх. Последняя линия окна будет очищена.
int border(ls, rs, ts, bs, tl, tr, bl, br) int wborder(win, ls, rs, ts, bs, tl, tr, bl, br) int box(win, vert, hor)
Очерчивают соответствующее окно (stdscr или win). В таблице 8.3
вы увидите символы и их значения по умолчанию для box(...). На
картинке вы увидите позиции символов для бокса.
int vline(ch, n) int wvline(win, ch, n) int hline(ch, n) int whline(win, ch, n)
Эти функции вычерчивают вертикальную или горизонтальную прямую
начиная с позиции курсора. ch это используемый символ, n
задает число таких символов. Позиция курсора не изменяется.
void bkgdset(ch) void wbkgdset(win, ch)
Устанавливает фоновый символ и атрибут для экрана или окна.
Атрибут в ch будет OR-нут с каждым непробельным символом окна. Фон
становится частью окна и не изменяется при прокрутке и вводе/выводе.
int bkgd(ch) int wbkgd(win, ch)
Установит в ch фоновый символ и атрибут.
int getch() int wgetch(win) int mvgetch(y, x) int mvwgetch(win, y, x) getch() прочитает ввод с терминала. Если режим паузы установлен,
getch() будет ждать нажатия клавиши. Если нет, вернет клавишу из
буфера ввода или ERR, если буфер пуст. mvgetch(...) и
mvwgetch(...) сначала установят курсор на позицию y,x.
w-функции читают ввод с терминала, связанного с окном win,
getch() и mvgetch(...) с stdscr.
С включенной keypad(...) при нажатии функциональной клавиши
getch() вернет код, определенный в ncurses.h как макрос KEY_*. При
нажатии ESCAPE (который может быть началом функциональной клавиши)
ncurses запустит односекундный таймер. Если остаток не получен в
течение этой секунды, то возвращается ESCAPE, иначе значение
функциональной клавиши. При необходимости секундный таймер можно
отключить через notimeout().
int ungetch(ch)
Вернет ch в буфер ввода.
int getstr(str) int wgetstr(win, str) int mvgetstr(y, x, str) int mvwgetstr(win, y, x, str) int wgetnstr(win, str, n)
Эти функции проделают серию вызовов getch(), пока не будет
получена новая строка. Символы помещаются в str, поэтому не
забывайте захватывать память для вашего символьного указателя перед вызовом
getstr(). Если включено эхо, то строка отображается (используйте
noecho(), чтобы его отключить) и пользовательские символы удаления
будут проинтерпретированы.
chtype inch() chtype winch(win) chtype mvinch(y, x) chtype mvwinch(win, y, x)
Эти функции возвращают символ с экрана или окна. Поскольку
возвращается тип chtype, возвращается и атрибут. Информация об
атрибуте может быть получена с помощью констант A_* (см.
таблицу 8.4).
int instr(str) int innstr(str, n) int winstr(win, str) int winnstr(win, str, n) int mvinstr(y, x, str) int mvinnstr(y, x, str, n) int mvwinstr(win, y, x, str) int mvwinnstr(win, y, x, str, n) Возвращает символьную строку из экрана или окна.
int inchstr(chstr) int inchnstr(chstr, n) int winchstr(win, chstr) int winchnstr(win, chstr, n) int mvinchstr(y, x, chstr) int mvinchnstr(y, x, chstr, n) int mvwinchstr(win, y, x, chstr) int mvwinchnstr(win, y, x, chstr, n)
Возвращает строку типа chtype из экрана или окна вместе с
атрибутом для каждого символа. Пока не реализована; lib_inchstr не
включена в библиотеку ncurses.
int scanw(fmt, ...) int wscanw(win, fmt, ...) int mvscanw(y, x, fmt, ...) int mvwscanw(win, y, x, fmt, ...) int vwscanw(win, fmt, va_list) Функции эквивалентны scanf(...) из libc (см.
раздел 8.1.2). Входом для сканирования служит вызов
wgetstr(...).
int idlok(win, bf) void idcok(win, bf)
Включение и отключение возможностей вставки/удаления для окна
терминала (idlok(...) для строк, idcok(...) для символов).
void immedok(win, bf)
Если устанавливается TRUE, то каждое изменение в окне win вызывает
физическое обновление экрана. Это может ухудшить характеристики
программы, поэтому значение по умолчанию FALSE.
int clearok(win, bf)
Если bf равен TRUE, то следующий вызов wrefresh(win)
очистит экран и полностью его перерисует (Ctrl+L в редакторе vi).
int leaveok(win, bf)
По умолчанию ncurses ставит курсор там, где он был при последнем обновлении
окна. Программы, не использующие курсор, могут установить leaveok(...)
TRUE и сэкономить время, требующееся для движения курсора.
int nl() int nonl()
Управление переходом на новую строку. После nl() произойдетт
возврат каретки и дозаполнение; nonl() отключает контроль. В последнем
случае ncurses может ускорить перемещение курсора.
int keypad(win, bf)
TRUE активизирует keypad на клавиатуре во время ожидания ввода.
Для функциональных клавиш и стрелок keypad ncurses вернет код клавиши,
определенный как KEY_* в ncurses.h. Это очень удобно для клавиатуры
ПК, потому что вы имеете возможность и пользоваться цифровым блоком, и
перемещать курсор.
int meta(win, bf)
Если TRUE, то коды клавиш, возвращаемые getch(), 7-битовые
(верхний бит не учитывается).
int cbreak() int nocbreak() int crmode() int nocrmode() cbreak() и nocbreak() устанавливают или снимают режим терминала
CBREAK. Когда CBREAK установлен, читаемый ввод немедленно доступен
программе, когда нет будет буферизован до получения целой строки.
Замечание:crmode() и nocrmode() существуют для
повышения совместимости, их использовать не нужно.
int raw() int noraw()
Устанавливает или снимает режим RAW. RAW это то же, что и
CBREAK, только без обработки специальных символов.
int echo() int noecho()
Вызывайте echo() для отображения ввода пользователя и noecho(),
чтобы его скрыть.
int halfdelay(t)
То же, что и cbreak(), но с паузой в t секунд.
int nodelay(win, bf)
Терминал устанавливается в неблокируемый режим. getch() вернет
ERR, если ввод не готов. Если bf есть FALSE, то getch() будет ждать
нажатия клавиши.
int timeout(t) int wtimeout(win, t)
Эти функции рекомендуется использовать вместо halfdelay(t) и
nodelay(win, bf). Результат getch() зависит от значения
t. При положительном t считывание блокируется на t
милисекунд; при t, равном нулю, блокировки не происходит; при
отрицательном t программа блокируется, пока ввод не станет возможен.
int notimeout(win, bf)
Если bf равен TRUE, getch() будет использовать односекундный
таймер для интерпретации вводимой последовательности, начинающейся с
ESCAPE и т.п.
int typeahead(fd)
При fd, равном -1, никакой проверки печати производиться не
будет, при других значениях ncurses будет использовать для таких
проверок файловый дескриптор fd вместо stdin.
int intrflush(win, bf)
При активизации истинным bf нажатая клавиша прерывания (типа
quit, break) очистит очередь драйвера tty.
int baudrate()
Возвращает скорость терминала в bps (бит в секунду).
char erasechar()
Возвращает текущий символ erase.
char killchar()
Возвращает текущий символ kill.
int has_ic() int has_il() has_ic() возвращает TRUE, если терминал может вставлять/удалять
символ, has_il() возвращает TRUE, если терминал может
вставлять/удалять строку. В противном случае возвращается ERR.
char *longname()
Указатель предоставляет доступ к описанию текущего терминала.
char *termname()
Возвращает содержимое TERM из пользовательской среды.
для клавиш перемещения курсора. Для просмотра файла цикл может выглядеть
примерно так:
int loop=TRUE;
char c;
enum{UP,DOWN,RIGHT,LEFT};
noecho();
timeout(-1);
nonl();
cbreak();
keypad(stdscr,TRUE);
while(loop==TRUE){
c=getch();
switch(c){
case KEY_UP:
case 'u':
case 'U': scroll_s(UP);
break;
case KEY_DOWN:
case 'd':
case 'D': scroll_s(DOWN);
break;
case KEY_LEFT:
case 'l':
case 'L': scroll_s(LEFT);
break;
case KEY_RIGHT:
case 'r':
case 'R': scroll_s(RIGHT);
break;
case 'q':
case 'Q': loop=FALSE;
default: break;
}
}
Для второго случая, нам достаточно установить echo(), и символы,
набираемые пользователем, будут напечатаны на экране. Место печати
задается функциями move(...) или wmove(...).
Или вы можете открыть окно с маской (выделяемой другими цветами)
и попросить пользователя ввести строку:
int erase() int werase(win) werase(...) и erase() скопируют пробелы на каждую позицию окна
win или stdscr. Например, если вы установили атрибуты цвета в окне и
вызвали werase(), окно должно быть окрашено. Однако автор имел
некоторые проблемы с COLOR_PAIRS, если определял другие атрибуты, а
затем черный по белому, так он писал его собственную стирающую функцию
(это низкоуровневый доступ к структуре WINDOW):
void NewClear(WINDOW *win)
{
int y,x;
for (y = 0; y <= win -> _maxy; y++)
for (x = 0; x <= win -> _maxx; x++)
(chtype *) win-> _line[y][x] = ' '|win-> _attrs;
win -> _curx = win -> _cury = 0;
touchwin(win);
}
Проблема состоит в том, что ncurses иногда делает совершенно
бесполезными атрибуты окна, когда заполняет экран пробелами. Если в
lib_clrtoeol.c BLANK определен как
#define BLANK ' '|A_NORMAL,
то другие атрибуты окна теряются, пока идет стирание строки.
int clear() int wclear(win)
То же, что erase(), но будет также установлен clearok() (экран
будет очищен с последующим обновлением).
int clrtobot() int wclrtobot(win)
Очистка текущей строки курсора (начинается с символа справа от
курсора) и строки под курсором.
int clrtoeol() int wclrtoeol(win)
Очистка текущей строки начиная справа от курсора и до конца строки.
Как написано в обзоре, окна ncurses есть отображения в памяти.
Это означает, что любое изменение окна не отражается на физическом
экране до тех пор, пока не будет произведено обновление. Это
оптимизирует вывод на экран, поскольку вы получаете возможность
совершать множество действий, а затем лишь единожды вызвать
обновление, чтобы напечатать его на экране. В противном случае на терминале
отражалось бы каждое изменение, что ухудшало бы исполнение ваших программ.
int refresh() int wrefresh(win) refresh() копирует stdscr на терминал, а wrefresh(win) копирует
изображение окна в stdscr и затем делает curscr подобным stdscr.
int wnoutrefresh(win) int doupdate() wnoutrefresh(win) копирует окно win только в stdscr. Это означает, что
вывода на терминал не производится, но виртуальный экран stdscr на самом деле
выглядит именно так, как того хочет программист. doupdate() произведет
вывод на терминал. Программа может менять различные окна, вызывая
wnoutrefresh(win) для каждого окна, а затем достаточно один раз
вызвать doupdate(), чтобы обновить физический экран.
Допустим, мы имеем следующую программу с двумя окнами. Мы
изменяем оба окна, меняя несколько линий текста. Напишем
cgangewin(win) с wrefresh(win).
Тогда ncurses обновит терминал дважды, а это замедлит исполнение
нашей программы. Благодаря doupdate() мы изменим changewin(win)
и нашу основную функцию, добившись этим лучшего исполнения.
int redrawwin(win) int wredrawln(win, bline, nlines) Используйте эти функции, когда перед записью чего-нибудь нового
требуется выбросить несколько строк или целый экран (может быть строки
запорчены или что-либо вроде этого).
int touchwin(win) int touchline(win, start, count) int wtouchln(win, y, n, changed) int untouchwin(win)
Говорит ncurses, что были произведены манипуляции с целым окном
или линиями от start до start+count. Например, когда есть
несколько окон, перекрывающих друг друга (как в примере type.c),
изменение одного из них никак не повлияет на изображение других.
wtouchln() захватит n линий, начинающихся в y.
Если change соответствует TRUE, то линии захватываются, в противном
случае нет (изменяются или не изменяются).
untouchwin(win) пометит окно win как неизмененное со
времени последнего вызова refresh().
int is_linetouched(win, line) int is_wintouched(win)
При помощи этих функций вы можете проверить, были ли линия line или
окно win захвачены со времени последнего вызова refresh().
Атрибуты это специальные возможности терминала, применяемые во время
печати символов на экран. Символы могут быть напечататы жирно, могут быть
подчеркнуты, могут мигать и т.д. В ncurses вы имеете возможность включать или
отключать атрибуты для достижения наилучшего внешнего вида вывода. Возможные
атрибуты перечислены в нижеследующей таблице.
Определение
Атрибут
A_ATTRIBUTES
маска для атрибутов (chtype)
A_NORMAL
нормальный, переустановка всего остального
A_STANDOUT
наиболее яркий режим
A_UNDERLINE
подчеркивание
A_REVERSE
обратное изображение
A_BLINK
мигание
A_DIM
тусклый или полуяркий режим
A_BOLD
четкий или очень яркий режим
A_ALTCHARSET
использование альтернативной символьной таблицы
A_INVIS
невидимый режим
A_PROTECT
не понял
A_CHARTEXT
маска для действующих символов (chtype)
A_COLOR
маска для цвета
COLOR_PAIR(n)
установка цветовой пары n
PAIR_NUMBER(a)
получение цветовой пары, лежащей в атрибуте a
Таблица 8.4: Ncurses-атрибуты
Ncurses определяет 8 цветов, которыми вы можете пользоваться на
терминале с цветовой поддержкой. Сначала проинициализируйте цветовые
структуры данных посредством start_color(), затем проверьте
возможности терминала при помощи has_colors(). start_color() будет
инициализировать COLORS, наибольшее количество цветов, поддерживаемых
терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы
можете определить.
Определение
Цвет
COLOR_BLACK
черный
COLOR_RED
красный
COLOR_GREEN
зеленый
COLOR_YELLOW
желтый
COLOR_BLUE
синий
COLOR_MAGENTA
пурпурный
COLOR_CYAN
голубой
COLOR_WHITE
белый
Таблица 8.5: Цвета в Ncurses
Атрибуты могут быть совмещены '|' (OR), поэтому вы можете
получить четкий мерцающий вывод при помощи A_BOLD|A_BLINK
Если вы установите окно с атрибутом attr, все символы,
напечатанные в этом окне, приобретут это свойство и будут его
сохранять до изменения вами атрибута. Это не будет утеряно при
прокрутке или движении окна и т.п.
Будьте осторожны с цветами, если вы пишете программы для ncurses
и BSD curses, так как BSD curses не имеет цветовой поддержки. (Точно
так же не имеют цветовой поддержки старые версии SYS V). Поэтому, если
вы компилируете для обеих библиотек, придется использовать операции #ifdef.
int attroff(attr) int wattroff(win, attr) int attron(attr) int wattron(win, attr)
Включают или отключают указанный атрибут attr, не влияя на другие
атрибуты в окне (stdscr или win).
int attrset(attr) int wattrset(win, attr)
Установка атрибута в attr в stdscr или win.
int standout() int standend() int wstandout(win) int wstandend(win)
Включают атрибут наиболее яркого режима для окна (stdscr или win).
chtype getattrs(win)
Выдает текущие атрибуты для окна win.
bool has_colors()
Возвращает TRUE, если терминал имеет цвета. Перед тем, как
использовать цвета, проверьте терминал has_colors(), а перед этим
проинициализируйте цвета start_color().
bool can_change_color()
TRUE, если терминал может переопределять цвета.
int start_color()
Цветовая инициализация. Эта функция должна быть вызвана перед
использованием цветов!
int init_pair(pair,fg,bg)
Если вы используете цвета в атрибутах окна, то сначала вы должны определить
цветовую пару через init_pair(...). fg и bg это
цвета переднего и заднего плана, спаренные в pair. pair
принимает значения от 1 до COLORPAIRS-1. 0 не ошибка, но
зарезервирован для черного и белого. Определенную однажды pair
можно использовать как атрибут. К примеру, нужны красные символы на синем:
init_pair(1,COLOR_RED,COLOR_BLUE);
Теперь вызовем wattr(...) для установки новой пары цветов для
win:
wattr(win,COLOR_PAIR(1));
Или соединим цветовые пары с другими атрибутами, например:
Первый вызов установит цветовую пару и атрибут BOLD, второй подключит режим
STANDOUT, и вы получите светлый красный на синем экране.
int pair_content(pair, f, b)
Вернет цвета переднего и заднего плана из pair.
int init_color(color, r, g, b)
Изменит цветовые компоненты r, g и b для
color. r, g и b находятся в диапазоне от
1 до COLORS-1.
int color_content(color, r, g, b)
Получение компонентов r, g и b для color.
Как комбинировать атрибуты и цвета? Некоторые терминалы, как
консоли в Linux, имеют цвета, а некоторые нет (xterm, vs100 и
т.д.). Следующий код решит эту проблему:
void CheckColor(WINDOW *win1, WINDOW *win2)
{
start_color();
if (has_colors()){
/* Хорошо, у нас есть цвета, определяем цветовые пары для
* цветов переднего и заднего плана
*/
init_pair(1,COLOR_BLUE,COLOR_WHITE);
init_pair(2,COLOR_WHITE,COLOR_RED);
/* теперь используем уже определенные цветовые пары для окон */
wattrset(win1,COLOR_PAIR(2));
wattrset(win2,COLOR_PAIR(1));
}
else
{
/* Нет цвета (может быть vt100 или xterm). Ладно, будем
* пользоваться вместо этого черно-белыми атрибутами.
*/
wattrset(win1,A_REVERSE);
wattrset(win2,A_BOLD);
}
return;
}
Прежде всего, функция CheckColor проинициализирует цвета при
помощи start_color(). Затем has_colors() вернет TRUE, если
текущий терминал имеет цвета. После этого вызывается ini_tpair(...)
для соединения цветов переднего и заднего плана, и wattrset(...) для
установки этих цветов в данном окне. Впрочем, чтобы установить атрибуты для
черно-белого терминала, мы можем использовать только wattrset(...).
Чтобы получить цвета на xterm, лучший способ, найденный автором, это
использовать ansi_xterm с надерганными элементами terminfo из
Midnight Commander. Просто добудьте исходники ansi_xterm и Midnight
Commander (mc-x.x.tar.gz). Потом скомпилируйте ansi_xterm и
используйте tic с xterm.ti и vt100.ti из архива mc-x.x.tar.gz.
Запустите ansi_xterm и протестируйте его.
int move(y, x) int wmove(win, y, x)
Движение курсора stdscr или win. Для функций ввода/вывода определяются
дополнительные макросы, передвигающие курсор перед вызовом данных функций.
int curs_set(bf)
Переключает видимость/невидимость курсора, если терминал имеет
такую возможность.
void getyx(win, y, x)
Возвращает координаты курсора. Замечание: это макрос.
void getparyx(win, y, x)
Если win подокно, getparyx(...) сохранит координаты окна
относительно родительского окна. В противном случае y и x
установятся в -1.
void getbegyx(win, y, x) void getmaxyx(win, y, x) int getmaxx(win) int getmaxy(win)
Сохранит начальные и размерные координаты для win в y и
x.
int getsyx(int y, int x) int setsyx(int y, int x)
Сохранит виртуальный курсор экрана в y и x или установит
этот курсор. При y и x, равных -1, getsyx(...)
установит leaveok.
int scrollok(win, bf)
Если TRUE, текст в окне win будет прокручен вверх на одну строку,
когда курсор находится в правом нижнем углу и напечатан символ. Если
FALSE, то курсор остается на прежней позиции.
При включенном scrollok(...) содержимое окна может быть
прокручено при помощи нижеследующих функций. Замечание: оно будет
прокручено и в случае, если вы напечатаете новую строку, находясь в
последней строке окна, поэтому будьте осторожны со scrollok(...).)
int scroll(win)
Эта функция прокрутит окно (и строки в структуре данных) на одну
строку вверх.
int scrl(n) int wscrl(win, n)
Эти функции прокрутят окно stdscr или win вверх или вниз, в
зависимости от целого n. Если n положительное, произойдет
прокрутка окна на n линий вверх, если n отрицательное на
n линий вниз.
int setscrreg(t, b) int wsetscrreg(win, t, b)
Устанавливают программную область прокрутки.
Следующий код объяснит, как прокручивать текст на экране. Смотрите также
type.c в директории примеров.
Мы хотим прокрутить текст в окне, имеющем 18 линий и 66 колонок. S[]
это массив символов с текстом. Max_s является номером последней
строки в S[]. Clear_line напечатает пробелы с текущей
позиции курсора до конца строки, используя текущие атрибуты окна (не
A_NORMAL, как это делает clrtoeol). Beg это последняя строка из
s[], изображенная на данный момент на экране. Scroll перечень
того, что должна сделать функция, показать NEXT или PREVious (следующую или
предыдущую) строку текста.
enum{PREV,NEXT};
void scroll_s(WINDOW *win, int scroll)
{
/* пробуем, должны ли мы прокрутить вниз и если что-нибудь есть,
* то прокрутить
*/
if((scroll==NEXT)&&(beg<=(max_s-18))){
/* одна строка вниз */
beg++;
/* задаем права на прокрутку */
scrollok(win, TRUE);
/* прокручиваем */
wscrl(win, +1);
/* отклоняем права на прокрутку */
scrollok(win, FALSE);
/* устанавливаем новую строку в последней линии */
mvwaddnstr(win,17,0,s[beg+17],66);
/* очищаем последнюю строку от последнего символа до конца
* строки. Иначе атрибуты не будут учтены.
*/
clear_line(66,win);
}
else if((scroll==PREV)&&(beg>0)){
beg--;
scrollok(win, TRUE);
wscrl(win, -1);
scrollok(win, FALSE);
mvwaddnstr(win,0,0,s[beg],66);
clear_line(66,win);
}
wrefresh(win);
return;
}
int slk_attron(chtype attr) int slk_attrset(chtype attr) int slk_attroff(chtype attr) Эти функции соответствуют функциям attron(attr),
attrset(attr) and attroff(attr).
ПеременнаяИмя свойстваВнутренний код
Описание
auto_left_marginbwbwCub1 переносит с
колонки 0 в последнюю колонку
auto_right_marginamamГраницы терминала
устанавливаются автоматически
back_color_erasebceutЭкран очищается с
цветом фона
can_changecccccТерминал может
переопределять существующие цвета
ceol_standout_glitchxhpxsвыделение не
удаляется перезаписью (hp)
col_addr_glithxhpaYAТолько положительное
движение для свойств hpa/mhpa
cpi_changes_rescpixYFИзменение размеров
символа изменяет разрешение
cr_cancels_micro_modecrxmYBИспользование
cr отключает режим micro
eat_newline_glitchxenlxnНовая строка
игнорируется после 80 столбцов (Concept)
erase_overstrikeeoeoМожно забить пробелом
generic_typegngnОбщий тип линии (такой как
выделенная или коммутируемая)
hard_copyhchcТерминал твердой копии
hard_cursorchtsHCКурсор аппаратный
has_meta_keykmkmИмеет метаклавишу ($shift,
sets parity bit$)
has_print_wheeldaisyYCтребуется
вмешательство оператора, чтобы изменить символьную таблицу притера
has_status_linehshsИмеет дополнительную
строку статуса
hue_lightness_saturationhlshlТерминал
использует только цветовую нотацию HLS (Tektronix)
insert_null_glitchininРежим вставки
распознает нули
lpi_changes_reslpixYGИзменение толщины
линии изменяет разрешение
memory_abovedadaСохранение содержимого
дисплея над экраном
memory_belowdbdbСохранение содержимого
дисплея под экраном
move_insert_modemirmiБезопасность
передвижения в режиме вставки
move_standout_modemsgrmsБезопасность
передвижения в режиме выделения
needs_xon_xoffnxonnxДозаполнение не будет
работать, требуется xon/xoff
no_esc_ctl_cxsbxb$Beehive$ (f1=escape,
f2=Ctrl-C)
non_rev_rmcupnrrmcNRsmcup не оборачивает
rmcup
no_pad_charnpcNPСимвол заполнения не
существует
non_dest_scroll_regionndscrNDОбласть
прокрутки ненарушаема
over_strikeososТерминал забивает символы
prtr_silentmc5i5iПринтер не создает эха на
экране
row_addr_glitchxvpaYDТолько положительное
движение для свойств vhp\mvpa
semi_auto_right_marginsamYEПечать в
последнем столбце вызывает cr
status_line_esc_okeslokesEscape может быть
использован в строке статуса
dest_tabs_magic_smsoxtxtНарушена
табуляция, magic so char (Teleray 1061)
tilde_glitchhzhzНевозможно напечатать
тильды
transparent_underlineululЗабой
подчеркивания
xon_xoffxonxoТерминал использует команды
xon/xoff
ПеременнаяИмя свойстваВнутренний код
Описание
bit_image_entwiningbitwinYoНе
документировано в SYSV
buffer_capacitybufszYaБуфер печати
columnscolscoЧисло колонок в линии
dot_vert_spacingspinvYbВысота позиции, в
pin на дюйм
dot_horz_spacingspinhYcШирина позиции, в
точках на дюйм
init_tabsititТабуляторы изначально каждые
# позиций
label_heightlhlhЛиний в каждой метке
label_widthlwlwКолонок в каждой метке
lineslinesliЧисло линий на экране или
странице
lines_of_memorylm/TD>lmЧисло линий в памяти, 0
означает переменное
magic_cookie_glitchxmc/TD>sg/TD>Число пробелов слева
от smso или rmso
max_colorscolors/TD>CoМаксимальное количество
цветов на экране
max_micro_addressmaddrYdМаксимальное
значение в micro_..._adress
max_micro_jumpmjumpYeМаксимальное значение
в parm_..._micro
max_pairspairspaМаксимальное число
цветовых пар на экране
micro_col_sizemcsYfРазмер шага символа в
режиме micro
micro_line_sizemlsYgРазмер шага линии в
режиме micro
no_color_videoncvNCВидеоатрибуты, которые
нельзя использовать с цветами
number_of_pinsnpinsYhЧисло pin на головке
принтера
num_labelsnlabNlЧисло меток на экране
output_res_charorcYiГоризонтальное
разрешение, в единицах на линию
output_res_lineorlYjВертикальное
разрешение, в единицах на линию
output_res_horz_inchorhiYkГоризонтальное
разрешение, в единицах на дюйм
output_res_vert_inchorviYlВертикальное
разрешение, в единицах на дюйм
padding_baud_ratepbpbНижняя граница, когда
требуется cr/nl заполнение
virtual_terminalvtvtНомер виртуального
терминала (UNIX)
width_status_linewslmsЧисло колонок в
строке статуса
bit_image_typebitypeYpТип устройства
двоичного образа
buttonstnsBTКоличество кнопок мыши
max_attributesmamaМаксимальное число
атрибутов, которое можно установить для терминала одновременно
maximum_windowswnumMWМаксимальное число
возможных окон
print_ratecpsYmСкорость печати, в символах
в секунду
wide_char_sizewidcsYnРазмер шага символа в
режиме двойной ширины
Последние шесть числовых свойств присутствуют в структуре term SYSV, но не
задокументированы в man page. Комментарии взяты из заголовка этой структуры.
acs_charsacscac$Graphics charset pairs$
def=vt100
alt_scancode_escscesaS8Альтернативный esc
для эмуляции $scancode$ (по умолчанию vt100)
back_tabcbtbtВозврат табулятора (P)
bellbelblСлышимый сигнал (звонок) (P)
bit_image_repeatbirepXyПовторение
двоичного образа ячейки #1 #2 раз (использует tparm)
bit_image_newlinebinelZzПередвижение на
следующую линию двоичного образа (использует tparm)
bit_image_carriage_returnbicrYv
Передвижение на начало линии двоичного образа (использует tparm)
carriage_returncrcrВозврат каретки
change_char_pitchcpiZAИзменение # символов
на дюйм
change_line_pitchlpiZBИзменение # линий на
дюйм
change_res_horzchrZCИзменение
горизонтального разрешения
change_res_vertcvrZDИзменение
вертикального разрешения
change_scroll_regioncsrcsИзменение до #1
линий через #2 (vt100) (PG)
char_paddingrmprPКак ip, только когда в
режиме вставки
char_set_namescsnmZyСписок наименований
символьной таблицы
clear_all_tabstbcctОчистка всех позиций
табуляции (P)
clear_marginsmgcMCОчистка всех границ
(верхней, нижней и сторон)
clear_screenclearclОчистка экрана и курсор
home (P*)
clr_bolel1 cbОчистка до начала строки
clr_eolelceОчистка до конца строки (P)
clr_eosedcdОчистка до конца дисплея (P*)
code_set_initcsinciИнициализация
последовательности для сложных таблиц кодов
color_namescolornmYwДать наименование для
цвета #1
column_addresshpachУстановка колонки
курсора (PG)
command_charactercmdchCCcmd символ
терминально устанавливаем в прототипе
cursor_addresscupcmПоказ движения курсора
строка #1 колонка #2 (PG)
cursor_down cud1doВниз на одну линию
cursor_home homehoКурсор в начало (если не
указана позиция курсора)
cursor_invisiblecivisviСделать курсор
невидимым
cursor_leftcub1leПередвижение курсора на
одну позицию влево
cursor_mem_addressmrcupCMЗапоминание
соответствующей адресации курсора
cursor_normalcnormveПридать курсору
нормальную видимость (undo vs/vi)
cursor_rightcuf1ndНенарушаемое
пространство (курсор вправо)
cursor_to_llllllПоследняя строка, первая
колонка (если не указана позиция курсора)
cursor_upcuu1upПересылка на верхний
уровень (курсор вверх)
cursor_visiblecvvisvsСделать курсор
сильновидимым
define_bit_image_regiondefbiYxОпределение
прямоугольной области двоичного образа (использует tparm)
define_chardefcZEОпределение символов в
символьной таблице
delete_characterdch1dcУдаление символа
(P*)
delete_linedl1dlУдаление линии (P*)
device_typedevtdvИндикация поддержки
языка/таблицы кодов
dis_status_linedsldsНевозможна строка
статуса
display_pc_chardispcS1Отображение символа
ПК
down_half_linehdhdПол-линии вниз (вперед
1/2 перевода строки)
ena_acsenacseAВключена альтернативная
символьная таблица
end_bit_image_regionendbiYyКонец области
двоичного образа (использует tparm)
enter_alt_charset_modesmacsasНачало
альтернативная символьной таблицы (P)
enter_am_modesmamSAВключение
автоматических границ
enter_blink_modeblinkmbВключение мигания
enter_bold_modeboldmdВключения суперяркого
режима
enter_ca_modesmcuptiСтрока начала
программ, использующих позицию курсора
enter_delete_modesmdcdmРежим удаления
(enter)
enter_dim_modedimmhВключение полуяркого
режима
enter_doublewide_modeswidmZFВозможен режим
двойной ширины
enter_draft_qualitysdrfqZGУстановка
качества печати
enter_insert_modesmirimРежим вставки
(enter)
enter_italics_modesitmZHВозможен режим
курсива
enter_leftward_modeslmZIВозможно движение
каретки влево
enter_micro_modesmicmZJРазблокирование
возможностей микропередвижения
enter_near_letter_qualitysnlqZKУстановка
печати NLQ
enter_normal_qualitysnrmqZLУстановка
нормального качества печати
enter_pc_charset_modesmpchS2Ввод режима
показа символов ПК
enter_protected_modeprotmpВключение
защищенного режима
enter_reverse_moderevmrВключение обратного
видеорежима
enter_scancode_modesmscS4Ввод режима
scancode ПК
enter_secure_modeinvismkВключение
пробельного режима (символы невидимы)
enter_shadow_modesshmZMВозможен режим
оттененной печати
enter_standout_modesmsosoНачало режима
выделения
enter_subscript_modessubmZNВозможна печать
индекса
enter_superscript_modessupmZOВозможна
печать верхнего индекса
enter_underline_modesmulusНачало режима
подчеркивания
enter_upward_modesumZPВозможно движение
каретки вверх
enter_xon_modesmxonSXВключение
подтверждения связи xon/xoff
erase_charsechecОчистка #1 символов (PG)
exit_alt_charset_modermacsaeКонец
альтернативной символьной таблицы (P)
exit_am_modermamRAОтключение
автоматических границ
exit_attribute_modesgr0meОтключение всех
атрибутов
exit_ca_modermcupteСтрока конца программ,
использующих позицию курсора
exit_delete_modermdcedКонец режима
удаления
exit_doublewide_moderwidmZQНевозможна
печать с двойной шириной
exit_insert_modermireiКонец режима
вставки
exit_italics_moderitmZRНевозможна печать
курсивом
exit_leftward_moderlmZSВозможно движение
каретки вправо (нормального режима)
exit_micro_modermicmZTЗаблокированы
возможности микропередвижения
exit_pc_charset_modermpchS3Невозможен
показ символов ПК
exit_scancode_modermscS5Невозможен режим
просмотра ПК
exit_shadow_modershmZUНевозможна
оттененная печать
exit_standout_modermsoseКонец режима
выделения
exit_subscript_modersubmZVНевозможна
подстрочная печать
exit_superscript_modersupmZWНевозможна
надстрочная печать
exit_underline_modermulueКонец режима
подчеркивания
exit_upward_moderumZXВозможно движение
каретки вниз
exit_xon_modermxonRXОтключение
подтверждения связи xon/xoff
flash_screenflashvbВидимый звонок
(невозможно передвижение курсора)
form_feedffffТерминал твердой копии
извергает страницы (P*)
form_status_linefslfsВозврат со строки
статуса
init_1stringis1i1Строка инициализации
терминала
init_2stringis2i2Строка инициализации
терминала
init_3stringis3i3Строка инициализации
терминала
init_fileififНазвание содержащего файла
init_progiprogiPПуть программы для
инициализации
initialize_colorinitcIcИнициализация
определения цвета
initialize_pairinitpIpИнициализация
цветовой пары
insert_characterich1icСимвол вставки (P)
insert_lineil1alДобавление новой чистой
строки (P*)
insert_paddingipipЗабивка после
вставленного символа (p*)
key_a1ka1K1Верхний левый keypad
key_a3ka3K3Верхний правый keypad
key_b2ka2K2Центр keypad
key_backspacekbskbПослан клавишей
backspace
key_begkbeg1Клавиша начала
key_btabkcbtkBКлавиша назад табуляции
key_c1kc1K4Нижний левый keypad
key_c3kc3K5Нижний левый keypad
key_cancelkcan2Клавиша cancel
key_catabktbckaПослан клавишей очистки
всей табулиции
key_clearkclrkCПослан клавишей очистки
экрана или клавишей очистки (стирания)
key_closekclo3Клавиша close
key_commandkcmd4Командная клавиша
key_copykcpy5Клавиша копирования
key_createkcrt6Клавиша создания
key_ctabkctabktПослан клавишей очистки
табулиции
key_dckdch1kDПослан клавишей удаления
символа
key_dlkdl1kLПослан клавишей удаления
строки
key_downkcud1kdПослан клавишей нижнего
терминального массива
key_eickrmirkMПослан клавишей rmir или
smir в режиме вставки
key_endkend7Клавиша end
key_enterkent8Клавиша ввода/посылки
key_eolkelkEПослан клавишей очистки до
конца строки
key_eoskedkSПослан клавишей очистки до
конца экрана
key_exitkext9Клавиша выхода
key_f0kf0k0Функциональная клавиша F00
key_f1kf1k1Функциональная клавиша F01
key_f2kf2k2Функциональная клавиша F02
key_f3kf3k3Функциональная клавиша F03
key_f4kf4k4Функциональная клавиша F04
key_f5kf5k5Функциональная клавиша F05
key_f6kf6k6Функциональная клавиша F06
key_f7kf7k7Функциональная клавиша F07
key_f8kf8k8Функциональная клавиша F08
key_f9kf9k9Функциональная клавиша F09
key_f10kf10k;Функциональная клавиша F10
key_f11kf11F1Функциональная клавиша F11
key_f12kf12F2Функциональная клавиша F12
key_f13kf13F3Функциональная клавиша F13
key_f14kf14F4Функциональная клавиша F14
key_f15kf15F5Функциональная клавиша F15
key_f16kf16F6Функциональная клавиша F16
key_f17kf17F7Функциональная клавиша F17
key_f18kf18F8Функциональная клавиша F18
key_f19kf19F9Функциональная клавиша F19
key_f20kf20FAфункциональная клавиша F00
key_f21kf21FBфункциональная клавиша F01
key_f22kf22FCфункциональная клавиша F02
key_f23kf23FDфункциональная клавиша F03
key_f24kf24FEфункциональная клавиша F04
key_f25kf25FFфункциональная клавиша F05
key_f26kf26FGфункциональная клавиша F06
key_f27kf27FHфункциональная клавиша F07
key_f28kf28FIфункциональная клавиша F08
key_f29kf29FJфункциональная клавиша F09
key_f30kf30FKфункциональная клавиша F10
key_f31kf31FLфункциональная клавиша F11
key_f32kf32FMфункциональная клавиша F12
key_f33kf33FNфункциональная клавиша F13
key_f34kf34FOфункциональная клавиша F14
key_f35kf35FPфункциональная клавиша F15
key_f36kf36FQфункциональная клавиша F16
key_f37kf37FRфункциональная клавиша F17
key_f38kf38FSфункциональная клавиша F18
key_f39kf39FTфункциональная клавиша F19
key_f40kf40FUфункциональная клавиша F00
key_f41kf41FVфункциональная клавиша F01
key_f42kf42FWфункциональная клавиша F02
key_f43kf43FXфункциональная клавиша F03
key_f44kf44FYфункциональная клавиша F04
key_f45kf45FZфункциональная клавиша F05
key_f46kf46Faфункциональная клавиша F06
key_f47kf47Fbфункциональная клавиша F07
key_f48kf48Fcфункциональная клавиша F08
key_f49kf49Fdфункциональная клавиша F09
key_f50kf50Feфункциональная клавиша F10
key_f51kf51Ffфункциональная клавиша F11
key_f52kf52Fgфункциональная клавиша F12
key_f53kf53Fhфункциональная клавиша F13
key_f54kf54Fiфункциональная клавиша F14
key_f55kf55Fjфункциональная клавиша F15
key_f56kf56Fkфункциональная клавиша F16
key_f57kf57Flфункциональная клавиша F17
key_f58kf58Fmфункциональная клавиша F18
key_f59kf59Fnфункциональная клавиша F19
key_f60kf60Foфункциональная клавиша F10
key_f61kf61Fpфункциональная клавиша F11
key_f62kf62Fqфункциональная клавиша F12
key_f63kf63Frфункциональная клавиша F13
key_findkfnd0клавиша поиска
key_helpkhlp%1клавиша помощи
key_homekhomekh послан клавишей home
key_ickich1kIпослан клавишей символ
вставки/ ввод режима вставки
key_ilkil1kAпослан клавишей вставки строки
key_leftkcub1klпослан клавишей левого
терминального массива
key_llkllkHпослан клавишей home-down
key_markkmrk%2клавиша пометки
key_messagekmsg%3клавиша сообщения
key_movekmov%4клавиша перемещения
key_nextknxt%5клавиша следующего
key_npageknpkNпослан клавишей следующей
страницы
key_openkopn%6клавиша открывания
key_optionskopt%7клавиша опций
key_ppagekppkPпослан клавишей предыдущей
страницы
key_previouskprv%8клавиша предыдущего
key_printkprt%9клавиша печати
key_redokrdo%0клавиша redo
key_referencekref&1клавиша ссылки
key_refreshkrfr&2клавиша обновления
key_replacekrpl&3клавиша перестановки
key_restartkrst&4клавиша перезапуска
key_resumekres&5клавиша возобновления
работы
key_rightkcuf1krпослан клавишей стрелки
враво
key_saveksav&6клавиша сохранения
key_sbegkBEG&9клавиша начала в верхнем
регистре
key_scancelkCAN&0клавиша cancel в верхнем
регистре
key_scommandkCMD*1командная клавиша в
верхнем регистре
key_scopykCPY*2клавиша копирования в
верхнем регистре
key_screatekCRT*3клавиша создания в
верхнем регистре
key_sdckDC*4клавиша удаления символа в
верхнем регистре
key_sdlkDL*5клавиша удаления строки в
верхнем регистре
key_selectkslt*6клавиша выделения
key_sendkEND*7клавиша конца в верхнем
регистре
key_seolkEOL*8клавиша конца строки в
верхнем регистре
key_sexitkEXT*9клавиша выхода в верхнем
регистре
key_sfkindkFпослан клавишей прокрутки
прямо/вниз
key_sfindkFND*0клавиша поиска в верхнем
регистре
key_shelpkHLP#1клавиша помощи в верхнем
регистре
key_shomekHOM#2клавиша начала в верхнем
регистре
key_sickIC#3клавиша вставки символа в
верхнем регистре
key_sleftkLFT#4клавиша влево в верхнем
регистре
key_smessagekMSG%aклавиша сообщения в
верхнем регистре
key_smovekMOV%bклавиша перемещения в
верхнем регистре
key_snextkNXT%cклавиша следующего в
верхнем регистре
key_soptionskOPT%dклавиша опций в верхнем
регистре
key_spreviouskPRV%eклавиша предыдущего в
верхнем регистре
key_sprintkPRT%fклавиша печати в верхнем
регистре
key_srkrikRпослан клавишей прокрутки
назад/вверх
key_sredokRDO%gклавиша redo в верхнем
регистре
key_sreplacekRPL%hклавиша перестановки в
верхнем регистре
key_srightkRIT%iклавиша вправо в верхнем
регистре
key_sresumekRES%jклавиша возобновления
работы в верхнем регистре
key_ssavekSAV!1клавиша сохранения в
верхнем регистре
key_ssuspendkSPD!2клавиша приостановки в
верхнем регистре
key_stabkhtskTпослан клавишей установки
табуляции
key_sundokUND!3клавиша undo в верхнем
регистре
key_suspendkspd&7клавиша приостановки
key_undokund&8клавиша undo
key_upkcuu1kuпослан клавишей вверх
терминала
keypad_localrmkxkeвыход из режима $"keypad
transmit"$
keypad_xmitsmkxksустановка режима $"keypad
transmit"$ терминала
lab_f0lf0l0метки на функциональную клавишу
f0, если не f0
lab_f1lf1l1метки на функциональную клавишу
f1, если не f1
lab_f2lf2l2метки на функциональную клавишу
f2, если не f2
lab_f3lf3l3метки на функциональную клавишу
f3, если не f3
lab_f4lf4l4метки на функциональную клавишу
f4, если не f4
lab_f5lf5l5метки на функциональную клавишу
f5, если не f5
lab_f6lf6l6метки на функциональную клавишу
f6, если не f6
lab_f7lf7l7метки на функциональную клавишу
f7, если не f7
lab_f8lf8l8метки на функциональную клавишу
f8, если не f8
lab_f9lf9l9метки на функциональную клавишу
f9, если не f9
lab_f10lf10laметки на функциональную
клавишу f10, если не f10
label_onsmlnLOподключение мягких меток
label_offrmlnLFотключение мягких меток
meta_offrmmmoотключение метарежима
meta_onsmmmmвключение метарежима (8-ой
бит)
micro_column_addressmhpaZYкак
column_address для микрорегулировки
micro_downmcud1ZZкак cursor_down для
микрорегулировки
micro_leftmcub1Zaкак cursor_left для
микрорегулировки
micro_rightmcuf1Zbкак cursor_right для
микрорегулировки
micro_row_addressmvpaZcкак row_address для
микрорегулировки
micro_up mcuu1Zdкак cursor_up для микрорегулировки
newlinenelnwновая линия (действует, как lf
после cr)
order_of_pinsporderZeСоединяет программные
$buts$ с pin головки принтера
orig_colorsococСброс всех цветовых пар
orig_pairopopУстановка цветовой пары по
умолчанию, как в первоначальном варианте
pad_charpadpcСимвол-заполнитель (скорее
всего null)
parm_dchdchDCУдаление #1 символов (PG*)
parm_delete_linedlDLУдаление #1 строк
(PG*)
parm_down_cursorcudDOДвижение курсора вниз
на #1 строк (PG*)
parm_down_micromcudZfКак cud для
микрорегулирования
parm_ichichICВставка #1 пробельных
символов (PG*)
parm_indexindnSFПрокрутка вперед #1 строк
(PG)
parm_insert_lineilALДобавление #1 новых
чистых строк (PG*)
parm_left_cursorcubLEПеремещение курсора
влево на #1 позиций (PG)
parm_left_micromcubZgКак cul для
микрорегулирования
parm_right_cursorcufRIПеремещение курсора
вправо на #1 позиций (PG*)
parm_right_micromcufZhКак cur для
микрорегулирования
parm_rindexrinSRПрокрутка назад на #1
строк (PG*)
parm_upcursorcuuUPПеремещение курсора
вверх на #1 строк (PG*)
parm_upmicromcuuZiКак cuu для
микрорегулирования
pkey_keypfkeypkПрограммная функциональная
клавиша #1 для печати строки #2
pkey_local pflocplПрограммная функциональная
клавиша #1 для выполнения строки #2
pkey_xmitpfxpxПрограммная функциональная
клавиша #1 для xmit строки #2
pkey_plabpfxlxlПрограммная клавиша #1 для
xmit #2 и показа #3
plab_normplnpnПрограммная метка #1 для
показа строки #2
print_screenmc0psПечать содержимого экрана
prtr_nonmc5ppOВключение принтера для #1
байт
prtr_offmc4pfВыключение принтера
prtr_onmc5poВключение принтера
repeat_charreprpПовторение символа #1 #2
раз (PG*)
req_for_inputrfiRFЗапрос на ввод
reset_1stringrs1r1Перезапуск терминала в
нормальный режим
reset_2stringrs2r2Перезапуск терминала в
нормальный режим
reset_3stringrs3r3Перезапуск терминала в
нормальный режим
reset_filerfrfИмя файла, содержащего
строку перезапуска
restore_cursorrcrcУстановка курсора на
позицию последнего sc
row_addressvpacvАбсолютная вертикальная
позиция (установка линии) (PG)
save_cursorscscСохранение позиции курсора
(P)
scancode_escapescescS7Escape для эмуляции
scancode
scroll_forwardindsfПрокрутка текста вверх
(P)
scroll_reverserisrПрокрутка
текста вниз (P)
select_char_setscsZjВыбор символьной
таблицы
set0_des_seqs0dss0$Shift to
codeset 0 (EUC set 0, ASCII)$
set1_des_seqs1dss1$Shift to codeset 1$
set2_des_seqs2dss2$Shift to codeset 2$
set3_des_seqs3dss3$Shift to codeset 3$
set_a_backgroundsetabABУстановка цвета
заднего плана, используя ANSI escape
set_a_foregroundsetafAFУстановка цвета
переднего плана, используя ANSI escape
set_attributessgrsaУстановка
видеоатрибутов (PG9)
set_backgroundsetbSbУстановка текущего
цвета заднего плана
set_bottom_marginsmgbZkОбъявление текущей
строки нижней границей
set_bottom_margin_parmsmgbpZlСтроки на
расстоянии #1 или #2 от нижней границы объявляются нижней границей
set_color_bandsetcolorYzУстановить текущим
цвет #1
set_color_pairscpspУстановка текущей
цветовой пары
set_foregroundsetfSfУстановка текущего
цвета переднего плана
set_left_marginsmglMLУстановка текущей
колонки как левой границы
set_left_margin_parmsmglpZmУстановка левой
(правой) границы на #1 (#2)
set_lr_marginsmglrMLУстановка левой и
правой границ
set_page_lingthslinesYZУстановка длины
страницы в #1 линий (используйте tparm)
set_right_marginsmgrMRУстановка текущей
колонки как правой границы
set_right_margin_parmsmgrpZnУстановка
колонки #1 как правой границы
set_tabhtsstУстановка табуляций на всех
линиях в текущей колонке
set_tb_marginsmgtbMTУстановка верхней и
нижней границ
set_top_marginsmgtZoУстановка текущей
строки как верхней границы
set_top_margin_parmsmgtpZpУстановка строки
#1 как верхней границы
set_windowwindwiТекущее окно: строки
#1-#2, колонки #3-#4
start_bit_image sbimZqНачало печати bit image
start_char_set_defscsdZrНачало определения
символьной таблицы
stop_bit_imagerbimZsКонец печати bit image
stop_char_set_defrcsdZtКонец определения
символьной таблицы
subscript_characterssubcsZuСписок
подстрочных символов
superscript_characterssupcsZvСписок
надстрочных символов
tabhttaТабуляция на 8 следующих позиций
these_cause_crdocrZwДанные символы
вызывают CR
to_status_linetsltsПереход на строку
статуса, первую колонку
underline_charucucПодчеркнуть символ и
встать после него
up_half_linehuhuПередвижение на 1/2
содержимого строки
xoff_characterxoffcXFсимвол XOFF
xon_characterxoncXNсимвол XON
Следующие числовые свойства присутствуют в структуре term SYSV, но не
задокументированы в man page. Комментарии взяты из заголовка этой структуры.
label_format
fln
Lf
??
set_clock
sclk
SC Установка времени дня
display_clock
dclk
DK
Вывод времени дня на
экран
remove_clock
rmclk
RC
Удаление времени дня
??
create_window
cwin
CW
Определение окна #1 с
параметрами от #2, #3 до #4 #5
goto_window
wingo
WG
Переход в окно #1
hangup
hup
HU
Положить трубку телефона
dial_phone
dial
DI
Набрать номер телефона #1
quick_dial
qdial
QD
Набрать номер телефона #1
без дальнейшего повторения