COHERENT manpages
This page displays the COHERENT manpage for termcap [Terminal-description language].
List of available manpages
Index
termcap -- System Administration
Terminal-description language
/etc/termcap
termcap is a language for describing terminals and their capabilities.
Terminal descriptions are collected in the file /etc/termcap and are read
by tgetent and its related programs to ensure that output to a particular
terminal is in a format that that terminal can understand.
COHERENT also supports the terminal-description language terminfo. For a
description of how these languages differ, see the Lexicon entry for
terminfo.
Overview
A terminal description written in termcap consists of a series of fields,
which are separated from each other by colons `:'. Every line in the
description, with the exception of the last line, must end in a backslash
`\'. Tab characters are ignored. Lines that begin with a `#' are
comments. A termcap description must not exceed 1,024 characters.
The first field names the terminal. Several different names may be used,
each separated by a vertical bar `|'; each name given, however, must be
unique within the file /etc/termcap. By convention, the first listed must
be two characters long. The second name is the name by which the terminal
is most commonly known; this name may contain no blanks in it. Other
versions of the name may follow. By convention, the last version is the
full name of the terminal; here, spaces may be used for legibility. Any of
these may be used to name your terminal to the COHERENT system. For
example, the name field for the VT-100 terminal is as follows:
d1|vt100|vt-100|pt100|pt-100|dec vt100:\
Note that the names are separated by vertical bars `|', that the field ends
with a colon, and that the line ends with a backslash. Using any of these
names in an export command will make the correct terminal description
available to programs that need to use it.
The remaining fields in the entry describe the capabilities of the
terminal. Each capability field consists of a two-letter code, and may
include additional information. There are three types of capability:
Boolean
This indicates whether or not a terminal has a specific feature. If
the field is present, the terminal is assumed to have the feature; if
it is absend, the terminal is assumed not to have that feature. For
example, the field
am:
is present, termcap assumes that the terminal has automatic margins,
whereas if that field is not present, the program using termcap
assumes that the terminal does not have them.
Numeric
This gives the size of some aspect of the terminal. Numeric
capability fields have the capability code, followed by a `#' and a
number. For example, the entry
co#80:
means that the terminal screen is 80 columns wide.
String capabilities
These give a sequence of characters that trigger a terminal operation.
These fields consist of the capability code, an equal sign `=', and
the string.
Strings often include escape sequences. A ``\E'' indicates an
<ESC> character; a control character is indicated with a carat
`^' plus the appropriate letter; and the sequences \b, \f, \n, \r, and
\t are, respectively, backspace, formfeed, newline, <return>,
and tab.
An integer or an integer followed by an asterisk in the string (e.g.,
`int*') indicates that execution of the function should be delayed by
int milliseconds; this delay is termed padding. Thus, deletion on
lines on the Microterm Mime-2A is coded as:
dl=20*^W:
dl is the capability code for delete, the equal sign introduces the
deletion sequence, 20* indicates that each line deletion should be
delayed by 20 milliseconds, and ^W indicates that the line-deletion
code on the Mime-2A is <ctrl-W>.
The asterisk indicates that the padding required is proportional to
the number of lines affected by the operation. In the above example,
the deletion of four lines on the Mime-2A generates a total of 80
milliseconds of padding; if no asterisk were present, however, the
padding would be only 20 milliseconds, no matter how many lines were
deleted. Also, when an asterisk is used, the number may be given to
one decimal place, to show tenths of a millisecond of padding.
Note that with string capabilities, characters may be given as a
backslash followed by the three octal digits of the character's ASCII
code. Thus, a colon in a capability field may be given by \072. To
put a null character into the string, use \200, because termcap strips
the high bit from each character.
Finally, the literal characters `^' and `\' are given by ``\^'' and
``\\''.
Capability Codes
The following table lists termcap's capability codes. Type indicates
whether the code is boolean, numeric, or string; a dagger `+' indicates
that this capability may include padding, and a dagger plus an asterisk
``+*'' indicates that it may be used with the asterisk padding function
described above.
Variable Type Definition
ae........string+...End alternate set of characters
al........string+*..Add blank line
am........boolean...Automatic margins
as........string+...Start alternate set of characters
bc........string....Backspace character, if not <ctrl-H>
bs........boolean...Backspace character is <ctrl-H>
bt........string+...Backtab
bw........boolean...Backspace wraps from column 0 to last column
CC........string....Command character in prototype if it can be set at terminal
cd........string+*..Clear to end of display
ce........string+...Clear line
ch........string+...Horizontal cursor motion
cl........string+*..Clear screen
cm........string+...Cursor motion, both vertical and horizontal
co........number....Number of columns
cr........string+*..<return>; default <ctrl-M>
cs........string+...Change scrolling region (DEC VT100 only); resembles cm
cv........string+...Vertical cursor motion
da........boolean+..Display above may be retained
dB........number....Milliseconds of delay needed by bs
db........boolean...Display below may be retained
dC........number....Milliseconds of delay needed by cr
dc........string+*..Delete a character
dF........number....Milliseconds of delay needed by ff
dl........string+*..Delete a line
dm........string....Enter delete mode
dN........number....Milliseconds of delay needed by nl
do........string....Move down one line
dT........number....Milliseconds of delay needed by tab
ed........string....Leave delete mode
ei........string....Leave insert mode; use :ei=: if this string is the same as ic
eo........string....Erase overstrikes with a blank
ff........string+*..Eject hardcopy terminal page; default <ctrl-L>
hc........boolean...Hardcopy terminal
hd........string....Move half-line down, i.e., forward 1/2 line feed)
ho........string....Move cursor to home position; use if cm is not set
hu........string....Move half-line up, i.e., reverse 1/2 line feed
hz........string....Cannot print tilde `~' (Hazeltine terminals only)
ic........string+...Insert a character
if........string....Name of the file that contains is
im........string....Begin insert mode; use :im=: if ic has not been set
in........boolean...Nulls are distinguished in display
ip........string+*..Insert padding after each character listed
is........string....Initialize terminal
k0-k9.....string....Codes sent by function keys 1 through 10 (k0 = F10)
kb........string....Code sent by backspace key
kd........string....Code sent by down-arrow key
ke........string....Leave ``keypad transmit'' mode
kh........string....Code sent by home key
kl........string....Code sent by left-arrow key
kn........number....No. of function keys; default is 10
ko........string....Entries for for all other non-function keys
kr........string....Code sent by right-arrow key
ks........string....Begin ``keypad transmit'' mode
ku........string....Code sent by up-arrow key
l0-l9.....string....Function keys labels if not f0-f9
li........number....Number of lines
ll........string....Move cursor to first column of last line (cm not set)
ma........string....Map keypad-to-cursor movement for vi version 2
mi........boolean...Cursor may be safely moved while in insert mode
ml........string....Turn on memory lock for area of screen above cursor
ms........boolean...Cursor can be moved while in standout or underline mode
mu........string....Turn off memory lock
nc........boolean...<return> does not work
nd........string....Move cursor right non-destructively
nl........string+*..Newline character; default is \n (Obsolete)
ns........boolean...Terminal is CRT, but does not scroll
os........boolean...Terminal can overstrike
pc........string....Pad character any character other than null
PS........string....Print start: redirect input to auxiliary port
PN........string....Print end: stop redirecting input to auxiliary port
pt........boolean...Terminal's tabs set by hardware; may need to be set with is
se........string....Exit standout mode
sf........string+...Scroll forward
sg........number....Blank characters left by so or se
so........string....Enter standout mode
sr........string+...Reverse scroll
ta........string+...Tab character other than <ctrl-I>, or with padding
tc........string....Similar terminal -- must be last field in entry
te........string....End a program that uses cm
ti........string....Begin a program that uses cm
uc........string....Underscore character and skip it
ue........string....Leave underscore mode
ug........number....Blank characters left by us or ue
ul........boolean...Terminal underlines but does not overstrike
up........string....Move up one line
us........string....Begin underscore mode
vb........string....Visible bell; may not move cursor
ve........string....Exit open/visual mode
vs........string....Begin open/visual mode
xb........boolean...Beehive terminal (f1=<esc>, f2=<crtl-C>)
xn........boolean...Newline is ignored after wrap
xr........boolean...<return> behaves like ce \r \n
xs........boolean...Standout mode is not erased by writing over it
xt........boolean...Tabs are destructive
Examples
The following is the termcap description for the IBM Personal Computer,
also known as ansipc. This is the default description used with your
COHERENT system console:
ap|ansipc|ansi personal computer:\
:al=\E[L:am:bs:bt=\E[Z:bw:cd=\E[O:ce=\E[K:ch=\E[%i%d`:\
:cl=\E[2O:cm=\E[%i%d;%dH:co#80:cs=\E[%i%d;%dr:\
:cv=\E[%i%dd:dl=\E[M:ho=\E[H:is=\E[25f\E[2K\E[m\E[H:\
:k0=\E[0x:k1=\E[1x:k2=\E[2x:k3=\E[3x:k4=\E[4x:k5=\E[5x:\
:k6=\E[6x:k7=\E[7x:k8=\E[8x:k9=\E[9x:kb=^h:kd=\E[B:kh=\E[H:\
:kl=\E[D:kr=\E[C:ku=\E[A:li#24:ll=\E[24;1H:hd=\E[C:se=\E[m:\
:sf=\E[S:sg#0:so=\E[7m:sr=\E[T:ue=\E[m:up=\E[A:us=\E[4m:\
:KI=\E[5x:KD=\E[3x:Kd=\E[P:KB=\E[6x:KU=\E[4x:Ku=\E[@:\
:KM=\E[7x:KJ=\E[8x:Kt=\E[Z:KT=\t:KL=\E[1x:KR=\E[2x:KP=\E[U:\
:Kp=\E[V:KX=\E[9x:KC=\E[0x:KE=\E[24H:KW=^F:Kw=^R:Kr=^N:do=\E[B:
The first field, which occupies line 1, gives the various aliases for this
device. The remaining fields mean the following:
:al=\E[L:\ <esc>L adds new blank line; use one millisecond for each
line added.
:am:\ Terminal has automatic margins.
:bs:\ Backspace character is <ctrl>-H (the default).
:bt=\E[Z:\ <esc>[Z back-tabs.
:bw:\ On this device, a backspace character wraps from column 0 to
the last column (in this case, column 79) on the previous line.
:cd=\E[O:\ <esc>[O clears to the end of display.
:ce=\E[K:\ <esc>[K clears to end of line.
:ch=\E[%i%d`:\
The string for horizontal cursor motion (described later).
:cl=\E[2O:\ <esc>[2O clears screen.
:cm=\E[%i%d;%dH:\
Cursor motion (described later).
:co#80:\ Screen has 80 columns.
:cs=\E[%i%d;%dr:\
String for changing the scrolling region.
:cv=\E[%i%dd:\
String for vertical cursor motion.
:dl=\E[M:\ <esc>E[M deletes a line.
:ho=\E[H:\ <esc>[H moves cursor to home position.
:is=\E[25f\E[2K\E[m\E[H:\
The string with which the device is initialized.
:k0=\E[0x:\ Function key 10 sends sequence <esc>[0x.
:k1=\E[1x:\ Function key 1 sends sequence <esc>[1x.
:k2=\E[2x:\ Function key 2 sends sequence <esc>[2x.
:k3=\E[3x:\ Function key 3 sends sequence <esc>[3x.
:k4=\E[4x:\ Function key 4 sends sequence <esc>[4x.
:k5=\E[5x:\ Function key 5 sends sequence <esc>[5x.
:k6=\E[6x:\ Function key 6 sends sequence <esc>[6x.
:k7=\E[7x:\ Function key 7 sends sequence <esc>[7x.
:k8=\E[8x:\ Function key 8 sends sequence <esc>[8x.
:k9=\E[9x:\ Function key 9 sends sequence <esc>[9x.
:kb=^h:\ Backspace key sends <Ctrl>-H.
:kd=\E[B:\ Down-arrow key sends <esc>[B.
:kh=\E[H:\ Home key sends <esc>[H.
:kl=\E[D:\ Left-arrow key sends <esc>[D.
:kr=\E[C:\ Right-arrow key sends <esc>[C.
:ku=\E[A:\ Up-arrow key sends <esc>[A.
:li#24:\ Terminal has 24 lines.
:ll=\E[24;1H:\
<esc>[24;1H moves the cursor to the first column of the
last line.
:hd=\E[C:\ <esc>[C moves the cursor downward by one-half line.
:se=\E[m:\ <esc>[m exits standout mode.
:sf=\E[S:\ <esc>[S scrolls the screen forward.
:sg#0:\ The so and se instructions leave zero blank lines on the
screen.
:so=\E[7m:\ <esc>[7m begins standout mode.
:sr=\E[T:\ <esc>[T reverse-scrolls the screen.
:ue=\E[m:\ <esc>m ends underline mode.
:up=\E[A:\ <esc>[A moves the cursor up one line.
:us=\E[4m:\ <esc>4m begins underscore mode.
:do=\E[B: <esc>E[B moves cursor down one line.
Note that the last field did not end with a backslash; this indicated to
the COHERENT system that the termcap description was finished.
A terminal description does not have to be nearly so detailed. If you wish
to use a new terminal, first check the following table to see if it already
appears by termcap. If it does not, check the terminal's documentation to
see if it mimics a terminal that is already in /etc/termcap, and use that
description, modifying it if necessary and changing the name to suit your
terminal. If you must create an entirely new description, first prepare a
skeleton file that contains the following basic elements: number of lines,
number of columns, backspace, cursor motion, line delete, clear screen,
move cursor to home position, newline, move cursor up a line, and non-
destructive right space. For example, the following is the termcap
description for the Lear-Siegler ADM-3A terminal:
la|adm3a|3a|lsi adm3a:\
:am:bs:cd=^W:ce=^X:cm=\E=%+ %+ :cl=^Z:co#80:ho=^^:li#24:\
:nd=<ctrl-L>:up=^K:
Once you have installed and debugged the skeleton description, add details
gradually until every feature of the terminal is described.
Cursor Motion
The cursor motion characteristic contains printf-like escape sequences not
used elsewhere. These encode the line and column positions of the cursor,
whereas other characters are passed unchanged. If the cm string is
considered as a function, then its arguments are the line and the column to
which the cursor is to move; the % codes have the following meanings:
%d Decimal number, as in printf. The origin is 0.
%2 Two-digit decimal number. The same as %2d in printf().
%3 Three-digit decimal number. The same as %3d in printf().
%. Single byte. The same as %c in printf().
%+n Add n to the current position value. n may be either a number or a
character.
%>nm
If the current position value is greater than n+m; then there is no
output.
%r Reverse order of line and column, giving column first and then line.
No output.
%i Increment line and column.
%% Give a % sign in the string.
%n Exclusive or line and column with 0140 (Datamedia 2500 terminal only).
%B Binary coded decimal (16 * (n/10))+(n%10). No output.
%D Reverse coding (n-(2*(n%16)). No output (Delta Data terminal only).
To send the cursor to line 3, column 12 on the Hewlett-Packard 2645, the
terminal must be sent <esc>&a12c03Y padded for 6 milliseconds.
Note that the column is given first and then the line, and that the line
and column are given as two digits each. Thus, the cm capability for the
Hewlett-Packard 2645 is given by:
:cm=6\E&%r%2c%2Y:
The Microterm ACT-IV needs the current position sent preceded by a
<Ctrl-T>, with the line and column encoded in binary:
:cm=^T%.%.:
Terminals that use %. must be able to backspace the cursor (bs or bc) and
to move the cursor up one line on the screen (up). This is because
transmitting \t, \n, \r, or <ctrl-D> may have undesirable
consequences or be ignored by the system.
Similar Terminals
If your system uses two similar terminals, one can be defined as resembling
the other, with certain exceptions. The code tc names the similar
terminal. This field must be last in the termcap entry, and the combined
length of the two entries cannot exceed 1,024 characters. Capabilities
given first over-ride those in the similar terminal, and capabilities in
the similar terminal can be cancelled by xx@ where xx is the capability.
For example, the entry
hn|2621nl|HP 2621nl:ks@:ke@:tc=2621
defines a Hewlett-Packard 2621 terminal that does not have the ks and ke
capabilities, and thus cannot turn on the function keys when in visual
mode.
Initialization
A terminal initialization string may be given with the is capability; if
the string is too long, it may be read from a file given by the if code.
Usually, these strings set the tabs on a terminal with settable tabs. If
both is and if are given, is will be printed first to clear the tabs, then
the tabs will be set from the file specified by if. The Hewlett-Packard
2626 has:
:is=\E&j@\r\E3\r:if=/usr/lib/tabset/stdcrt:
Programming With termcap
The COHERENT library libterm.a contains the following routines that extract
and use the descriptions for termcap:
tgetent() Read a termcap entry.
tgetflag()
Check if a given Boolean capability is present in the terminal's
termcap entry.
tgetnum() Return the value of a numeric termcap feature (e.g., the number
of columns on the terminal).
tgetstr() Read and decode a termcap string feature.
tgoto() Read and decode a cursor-addressing string.
tputs() Read and decode the leading padding information of a termcap
string feature.
See the Lexicon entry for each function for details.
The external variable ospeed is the output speed to the terminal as encoded
by stty. The external variable PC is a padding character if a NUL
(<crtl-@>) is not appropriate.
The following example shows how to read a termcap entry:
#include <stdio.h>
static char *CM, *SO, *SE, *CL;
static int rows, cols;
static int am;
static int errflag;
static char *ptr;
static char *tv_stype;
extern char *tgoto(); /* termcap cursor position command */
extern char *tgetstr(); /* get string code from termcap */
extern int tgetflag(); /* get boolean flag from termcap */
extern int tgetnum(); /* get numeric code from termcap */
extern void tputs(); /* termcap put data command */
extern char PC; /* termcap's pad character */
/*
* Get a required termcap string or exit with a message.
*/
static char *
qgetstr(ref)
char *ref;
{
register char *tmp;
if ((tmp = tgetstr(ref, &ptr)) == NULL) {
printf("/etc/termcap terminal %s must have a %s= entry\n",
tv_stype, ref);
errflag = 1;
}
return (tmp);
}
/*
* Get required termcap information for this terminal type.
*/
static void
tcapopen()
{
extern char *getenv(), *realloc();
char *tcapbuf;
char tcbuf[1024]; /* this must hold the whole tml entry */
char *p;
/* set up termcap type */
if ((tv_stype = getenv("TERM")) == NULL) {
printf("Environment variable TERM not defined\n");
exit(1);
}
if (tgetent(tcbuf, tv_stype) != 1) {
printf("Terminal type %s not in /etc/termcap\n", tv_stype);
exit(1);
}
/* get far too much and shrink later */
if ((ptr = tcapbuf = malloc(1024)) == NULL) {
printf("out of space\n");
exit(1);
}
/* get termcap entries for later use */
CM = qgetstr("cm"); /* this string used by tgoto() */
CL = qgetstr("cl"); /* this string used to clear screen */
SO = qgetstr("so"); /* this string used to set standout */
SE = qgetstr("se"); /* this string used by clear standout */
if (errflag)/* set if any missing entries */
exit(1);
/* set termcap's pad char */
PC = (((p = tgetstr("pc", &ptr)) == NULL) ? 0 : *p);
if (tcapbuf != realloc(tcapbuf, (unsigned)(ptr - tcapbuf))) {
printf("Buffer not shrunk in place!\n");
exit(1);
}
if ((cols = tgetnum("co")) < 0)/* Get rows and columns */
cols = 80;
if ((rows = tgetnum("li")) < 0)
rows = 24;
am = tgetflag("am");/* automatic margins ? */
}
/*
* output char function.
*/
static void
ttputc(c)
{
fputc(c, stdout);
}
/*
* output command string, set padding to one line affected.
* use ttputc as character output function. Use only for
* termcap created data not your own strings.
*/
void
putpad(str)
char *str;
{
tputs(str, 1, ttputc);
}
/*
* Move cursor.
*/
void
move(col, row)
{
putpad(tgoto(CM, col, row));
}
/*
* Demonstrate termcap.
*/
main()
{
tcapopen();
putpad(CL); /* clear the screen */
move(30, 5);
putpad(SO); /* standout mode */
printf("Termcap Demo");
putpad(SE); /* end standout mode */
move(0, 7);
printf("This terminal has %d columns and %d rows.", cols, rows);
if (am) {
move(0, 8);
printf("Automatic margins.");
}
move(0, rows);/* quit at bottom of screen */
exit(0);
}
Files
/etc/termcap -- Terminal-description data base
/usr/lib/libterm.a -- Routines for reading a termcap description
See Also
Administering COHERENT,
captoinfo,
curses,
libterm,
terminal,
terminfo,
tgetent(),
tgetflag(),
tgetnum(),
tgetstr(),
tgoto(),
tputs()
Strang, J., Mui, L., O'Reilly, T.: Termcap & Terminfo. Sebastopol, CA:
O'Reilly & Associates, Inc., 1991. Highly recommended.
Notes
To see which terminals are currently supported, see file /etc/termcap.
COHERENT also supports terminfo, a clone of the UNIX System-V terminal-
description system. terminfo enjoys a number of features not available
under termcap, and is the preferred system under COHERENT.
Should you wish to convert to terminfo, the command captoinfo converts a
file of termcap descriptions to their terminfo analogues.