Annotation of GNUtools/emacs/info/termcap-1, revision 1.1

1.1     ! root        1: This is Info file ../info/termcap, produced by Makeinfo-1.49 from the
        !             2: input file termcap.texi.
        !             3: 
        !             4:    This file documents the termcap library of the GNU system.
        !             5: 
        !             6:    Copyright (C) 1988 Free Software Foundation, Inc.
        !             7: 
        !             8:    Permission is granted to make and distribute verbatim copies of this
        !             9: manual provided the copyright notice and this permission notice are
        !            10: preserved on all copies.
        !            11: 
        !            12:    Permission is granted to copy and distribute modified versions of
        !            13: this manual under the conditions for verbatim copying, provided that
        !            14: the entire resulting derived work is distributed under the terms of a
        !            15: permission notice identical to this one.
        !            16: 
        !            17:    Permission is granted to copy and distribute translations of this
        !            18: manual into another language, under the above conditions for modified
        !            19: versions, except that this permission notice may be stated in a
        !            20: translation approved by the Foundation.
        !            21: 
        !            22: 
        !            23: File: termcap,  Node: Top,  Next: Introduction,  Prev: (DIR),  Up: (DIR)
        !            24: 
        !            25: * Menu:
        !            26: 
        !            27: * Introduction::What is termcap?  Why this manual?
        !            28: * Library::     The termcap library functions.
        !            29: * Data Base::   What terminal descriptions in `/etc/termcap' look like.
        !            30: * Capabilities::Definitions of the individual terminal capabilities:
        !            31:                  how to write them in descriptions, and how to use
        !            32:                  their values to do display updating.
        !            33: * Summary::    Brief table of capability names and their meanings.
        !            34: * Var Index::   Index of C functions and variables.
        !            35: * Cap Index::   Index of termcap capabilities.
        !            36: * Index::       Concept index.
        !            37: 
        !            38: 
        !            39: File: termcap,  Node: Introduction,  Next: Library,  Prev: Top,  Up: Top
        !            40: 
        !            41: Introduction
        !            42: ************
        !            43: 
        !            44:    "Termcap" is a library and data base that enables programs to use
        !            45: display terminals in a terminal-independent manner.  It originated in
        !            46: Berkeley Unix.
        !            47: 
        !            48:    The termcap data base describes the capabilities of hundreds of
        !            49: different display terminals in great detail.  Some examples of the
        !            50: information recorded for a terminal could include how many columns wide
        !            51: it is, what string to send to move the cursor to an arbitrary position
        !            52: (including how to encode the row and column numbers), how to scroll the
        !            53: screen up one or several lines, and how much padding is needed for such
        !            54: a scrolling operation.
        !            55: 
        !            56:    The termcap library is provided for easy access this data base in
        !            57: programs that want to do terminal-independent character-based display
        !            58: output.
        !            59: 
        !            60:    This manual describes the GNU version of the termcap library, which
        !            61: has some extensions over the Unix version.  All the extensions are
        !            62: identified as such, so this manual also tells you how to use the Unix
        !            63: termcap.
        !            64: 
        !            65:    The GNU version of the termcap library is available free as source
        !            66: code, for use in free programs, and runs on Unix and VMS systems (at
        !            67: least).  You can find it in the GNU Emacs distribution in the files
        !            68: `termcap.c' and `tparam.c'.
        !            69: 
        !            70:    This manual was written for the GNU project, whose goal is to
        !            71: develop a complete free operating system upward-compatible with Unix
        !            72: for user programs.  The project is approximately two thirds complete. 
        !            73: For more information on the GNU project, including the GNU Emacs editor
        !            74: and the mostly-portable optimizing C compiler, send one dollar to
        !            75: 
        !            76:      Free Software Foundation
        !            77:      675 Mass Ave
        !            78:      Cambridge, MA 02139
        !            79: 
        !            80: 
        !            81: File: termcap,  Node: Library,  Next: Data Base,  Prev: Introduction,  Up: Top
        !            82: 
        !            83: The Termcap Library
        !            84: *******************
        !            85: 
        !            86:    The termcap library is the application programmer's interface to the
        !            87: termcap data base.  It contains functions for the following purposes:
        !            88: 
        !            89:    * Finding the description of the user's terminal type (`tgetent').
        !            90: 
        !            91:    * Interrogating the description for information on various topics
        !            92:      (`tgetnum', `tgetflag', `tgetstr').
        !            93: 
        !            94:    * Computing and performing padding (`tputs').
        !            95: 
        !            96:    * Encoding numeric parameters such as cursor positions into the
        !            97:      terminal-specific form required for display commands (`tparam',
        !            98:      `tgoto').
        !            99: 
        !           100: * Menu:
        !           101: 
        !           102: * Preparation:: Preparing to use the termcap library.
        !           103: * Find::        Finding the description of the terminal being used.
        !           104: * Interrogate:: Interrogating the description for particular capabilities.
        !           105: * Initialize::  Initialization for output using termcap.
        !           106: * Padding::     Outputting padding.
        !           107: * Parameters::  Encoding parameters such as cursor positions.
        !           108: 
        !           109: 
        !           110: File: termcap,  Node: Preparation,  Next: Find,  Prev: Library,  Up: Library
        !           111: 
        !           112: Preparing to Use the Termcap Library
        !           113: ====================================
        !           114: 
        !           115:    To use the termcap library in a program, you need two kinds of
        !           116: preparation:
        !           117: 
        !           118:    * The compiler needs declarations of the functions and variables in
        !           119:      the library.
        !           120: 
        !           121:      On GNU systems, it suffices to include the header file `termcap.h'
        !           122:      in each source file that uses these functions and variables.
        !           123: 
        !           124:      On Unix systems, there is often no such header file.  Then you must
        !           125:      explictly declare the variables as external.  You can do likewise
        !           126:      for the functions, or let them be implicitly declared and cast
        !           127:      their values from type `int' to the appropriate type.
        !           128: 
        !           129:      We illustrate the declarations of the individual termcap library
        !           130:      functions with ANSI C prototypes because they show how to pass the
        !           131:      arguments.  If you are not using the GNU C compiler, you probably
        !           132:      cannot use function prototypes, so omit the argument types and
        !           133:      names from your declarations.
        !           134: 
        !           135:    * The linker needs to search the library.  Usually either
        !           136:      `-ltermcap' or `-ltermlib' as an argument when linking will do
        !           137:      this.
        !           138: 
        !           139: 
        !           140: File: termcap,  Node: Find,  Next: Interrogate,  Prev: Preparation,  Up: Library
        !           141: 
        !           142: Finding a Terminal Description: `tgetent'
        !           143: =========================================
        !           144: 
        !           145:    An application program that is going to use termcap must first look
        !           146: up the description of the terminal type in use.  This is done by calling
        !           147: `tgetent', whose declaration in ANSI Standard C looks like:
        !           148: 
        !           149:      int tgetent (char *BUFFER, char *TERMTYPE);
        !           150: 
        !           151: This function finds the description and remembers it internally so that
        !           152: you can interrogate it about specific terminal capabilities (*note
        !           153: Interrogate::.).
        !           154: 
        !           155:    The argument TERMTYPE is a string which is the name for the type of
        !           156: terminal to look up.  Usually you would obtain this from the environment
        !           157: variable `TERM' using `getenv ("TERM")'.
        !           158: 
        !           159:    If you are using the GNU version of termcap, you can alternatively
        !           160: ask `tgetent' to allocate enough space.  Pass a null pointer for
        !           161: BUFFER, and `tgetent' itself allocates the storage using `malloc'.  In
        !           162: this case the returned value on success is the address of the storage,
        !           163: cast to `int'.  But normally there is no need for you to look at the
        !           164: address.  Do not free the storage yourself.
        !           165: 
        !           166:    With the Unix version of termcap, you must allocate space for the
        !           167: description yourself and pass the address of the space as the argument
        !           168: BUFFER.  There is no way you can tell how much space is needed, so the
        !           169: convention is to allocate a buffer 2048 characters long and assume that
        !           170: is enough.  (Formerly the convention was to allocate 1024 characters and
        !           171: assume that was enough.  But one day, for one kind of terminal, that was
        !           172: not enough.)
        !           173: 
        !           174:    No matter how the space to store the description has been obtained,
        !           175: termcap records its address internally for use when you later
        !           176: interrogate the description with `tgetnum', `tgetstr' or `tgetflag'.  If
        !           177: the buffer was allocated by termcap, it will be freed by termcap too if
        !           178: you call `tgetent' again.  If the buffer was provided by you, you must
        !           179: make sure that its contents remain unchanged for as long as you still
        !           180: plan to interrogate the description.
        !           181: 
        !           182:    The return value of `tgetent' is -1 if there is some difficulty
        !           183: accessing the data base of terminal types, 0 if the data base is
        !           184: accessible but the specified type is not defined in it, and some other
        !           185: value otherwise.
        !           186: 
        !           187:    Here is how you might use the function `tgetent':
        !           188: 
        !           189:      #ifdef unix
        !           190:      static char term_buffer[2048];
        !           191:      #else
        !           192:      #define term_buffer 0
        !           193:      #endif
        !           194:      
        !           195:      init_terminal_data ()
        !           196:      {
        !           197:        char *termtype = getenv ("TERM");
        !           198:        int success;
        !           199:      
        !           200:        if (termtype == 0)
        !           201:          fatal ("Specify a terminal type with `setenv TERM <yourtype>'.\n");
        !           202:      
        !           203:        success = tgetent (term_buffer, termtype);
        !           204:        if (success < 0)
        !           205:          fatal ("Could not access the termcap data base.\n");
        !           206:        if (success == 0)
        !           207:          fatal ("Terminal type `%s' is not defined.\n", termtype);
        !           208:      }
        !           209: 
        !           210: Here we assume the function `fatal' prints an error message and exits.
        !           211: 
        !           212:    If the environment variable `TERMCAP' is defined, its value is used
        !           213: to override the terminal type data base.  The function `tgetent' checks
        !           214: the value of `TERMCAP' automatically.  If the value starts with `/'
        !           215: then it is taken as a file name to use as the data base file, instead
        !           216: of `/etc/termcap' which is the standard data base.  If the value does
        !           217: not start with `/' then it is itself used as the terminal description,
        !           218: provided that the terminal type TERMTYPE is among the types it claims
        !           219: to apply to.  *Note Data Base::, for information on the format of a
        !           220: terminal description.
        !           221: 
        !           222: 
        !           223: File: termcap,  Node: Interrogate,  Next: Initialize,  Prev: Find,  Up: Library
        !           224: 
        !           225: Interrogating the Terminal Description
        !           226: ======================================
        !           227: 
        !           228:    Each piece of information recorded in a terminal description is
        !           229: called a "capability".  Each defined terminal capability has a
        !           230: two-letter code name and a specific meaning.  For example, the number
        !           231: of columns is named `co'.  *Note Capabilities::, for definitions of all
        !           232: the standard capability names.
        !           233: 
        !           234:    Once you have found the proper terminal description with `tgetent'
        !           235: (*note Find::.), your application program must "interrogate" it for
        !           236: various terminal capabilities.  You must specify the two-letter code of
        !           237: the capability whose value you seek.
        !           238: 
        !           239:    Capability values can be numeric, boolean (capability is either
        !           240: present or absent) or strings.  Any particular capability always has
        !           241: the same value type; for example, `co' always has a numeric value,
        !           242: while `am' (automatic wrap at margin) is always a flag, and `cm'
        !           243: (cursor motion command) always has a string value.  The documentation
        !           244: of each capability says which type of value it has.
        !           245: 
        !           246:    There are three functions to use to get the value of a capability,
        !           247: depending on the type of value the capability has.  Here are their
        !           248: declarations in ANSI C:
        !           249: 
        !           250:      int tgetnum (char *NAME);
        !           251:      int tgetflag (char *NAME);
        !           252:      char *tgetstr (char *NAME, char **AREA);
        !           253: 
        !           254: `tgetnum'
        !           255:      Use `tgetnum' to get a capability value that is numeric.  The
        !           256:      argument NAME is the two-letter code name of the capability.  If
        !           257:      the capability is present, `tgetnum' returns the numeric value
        !           258:      (which is nonnegative).  If the capability is not mentioned in the
        !           259:      terminal description, `tgetnum' returns -1.
        !           260: 
        !           261: `tgetflag'
        !           262:      Use `tgetflag' to get a boolean value.  If the capability NAME is
        !           263:      present in the terminal description, `tgetflag' returns 1;
        !           264:      otherwise, it returns 0.
        !           265: 
        !           266: `tgetstr'
        !           267:      Use `tgetstr' to get a string value.  It returns a pointer to a
        !           268:      string which is the capability value, or a null pointer if the
        !           269:      capability is not present in the terminal description.
        !           270: 
        !           271:      There are two ways `tgetstr' can find space to store the string
        !           272:      value:
        !           273: 
        !           274:         * You can ask `tgetstr' to allocate the space.  Pass a null
        !           275:           pointer for the argument AREA, and `tgetstr' will use
        !           276:           `malloc' to allocate storage big enough for the value.
        !           277:           Termcap will never free this storage or refer to it again; you
        !           278:           should free it when you are finished with it.
        !           279: 
        !           280:           This method is more robust, since there is no need to guess
        !           281:           how much space is needed.  But it is supported only by the GNU
        !           282:           termcap library.
        !           283: 
        !           284:         * You can provide the space.  Provide for the argument AREA the
        !           285:           address of a pointer variable of type `char *'.  Before
        !           286:           calling `tgetstr', initialize the variable to point at
        !           287:           available space. Then `tgetstr' will store the string value
        !           288:           in that space and will increment the pointer variable to
        !           289:           point after the space that has been used.  You can use the
        !           290:           same pointer variable for many calls to `tgetstr'.
        !           291: 
        !           292:           There is no way to determine how much space is needed for a
        !           293:           single string, and no way for you to prevent or handle
        !           294:           overflow of the area you have provided.  However, you can be
        !           295:           sure that the total size of all the string values you will
        !           296:           obtain from the terminal description is no greater than the
        !           297:           size of the description (unless you get the same capability
        !           298:           twice).  You can determine that size with `strlen' on the
        !           299:           buffer you provided to `tgetent'.  See below for an example.
        !           300: 
        !           301:           Providing the space yourself is the only method supported by
        !           302:           the Unix version of termcap.
        !           303: 
        !           304:    Note that you do not have to specify a terminal type or terminal
        !           305: description for the interrogation functions.  They automatically use the
        !           306: description found by the most recent call to `tgetent'.
        !           307: 
        !           308:    Here is an example of interrogating a terminal description for
        !           309: various capabilities, with conditionals to select between the Unix and
        !           310: GNU methods of providing buffer space.
        !           311: 
        !           312:      char *tgetstr ();
        !           313:      
        !           314:      char *cl_string, *cm_string;
        !           315:      int height;
        !           316:      int width;
        !           317:      int auto_wrap;
        !           318:      
        !           319:      char PC;   /* For tputs.  */
        !           320:      char *BC;  /* For tgoto.  */
        !           321:      char *UP;
        !           322:      
        !           323:      interrogate_terminal ()
        !           324:      {
        !           325:      #ifdef UNIX
        !           326:        /* Here we assume that an explicit term_buffer
        !           327:           was provided to tgetent.  */
        !           328:        char *buffer
        !           329:          = (char *) malloc (strlen (term_buffer));
        !           330:      #define BUFFADDR &buffer
        !           331:      #else
        !           332:      #define BUFFADDR 0
        !           333:      #endif
        !           334:      
        !           335:        char *temp;
        !           336:      
        !           337:        /* Extract information we will use.  */
        !           338:        cl_string = tgetstr ("cl", BUFFADDR);
        !           339:        cm_string = tgetstr ("cm", BUFFADDR);
        !           340:        auto_wrap = tgetflag ("am");
        !           341:        height = tgetnum ("li");
        !           342:        width = tgetnum ("co");
        !           343:      
        !           344:        /* Extract information that termcap functions use.  */
        !           345:        temp = tgetstr ("pc", BUFFADDR);
        !           346:        PC = temp ? *temp : 0;
        !           347:        BC = tgetstr ("le", BUFFADDR);
        !           348:        UP = tgetstr ("up", BUFFADDR);
        !           349:      }
        !           350: 
        !           351: *Note Padding::, for information on the variable `PC'.  *Note Using
        !           352: Parameters::, for information on `UP' and `BC'.
        !           353: 
        !           354: 
        !           355: File: termcap,  Node: Initialize,  Next: Padding,  Prev: Interrogate,  Up: Library
        !           356: 
        !           357: Initialization for Use of Termcap
        !           358: =================================
        !           359: 
        !           360:    Before starting to output commands to a terminal using termcap, an
        !           361: application program should do two things:
        !           362: 
        !           363:    * Initialize various global variables which termcap library output
        !           364:      functions refer to.  These include `PC' and `ospeed' for padding
        !           365:      (*note Output Padding::.) and `UP' and `BC' for cursor motion
        !           366:      (*note tgoto::.).
        !           367: 
        !           368:    * Tell the kernel to turn off alteration and padding of
        !           369:      horizontal-tab characters sent to the terminal.
        !           370: 
        !           371:    To turn off output processing in Berkeley Unix you would use `ioctl'
        !           372: with code `TIOCLSET' to set the bit named `LLITOUT', and clear the bits
        !           373: `ANYDELAY' using `TIOCSETN'.  In POSIX or System V, you must clear the
        !           374: bit named `OPOST'.  Refer to the system documentation for details.
        !           375: 
        !           376:    If you do not set the terminal flags properly, some older terminals
        !           377: will not work.  This is because their commands may contain the
        !           378: characters that normally signify newline, carriage return and
        !           379: horizontal tab--characters which the kernel thinks it ought to modify
        !           380: before output.
        !           381: 
        !           382:    When you change the kernel's terminal flags, you must arrange to
        !           383: restore them to their normal state when your program exits.  This
        !           384: implies that the program must catch fatal signals such as `SIGQUIT' and
        !           385: `SIGINT' and restore the old terminal flags before actually terminating.
        !           386: 
        !           387:    Modern terminals' commands do not use these special characters, so
        !           388: if you do not care about problems with old terminals, you can leave the
        !           389: kernel's terminal flags unaltered.
        !           390: 
        !           391: 
        !           392: File: termcap,  Node: Padding,  Next: Parameters,  Prev: Initialize,  Up: Library
        !           393: 
        !           394: Padding
        !           395: =======
        !           396: 
        !           397:    "Padding" means outputting null characters following a terminal
        !           398: display command that takes a long time to execute.  The terminal
        !           399: description says which commands require padding and how much; the
        !           400: function `tputs', described below, outputs a terminal command while
        !           401: extracting from it the padding information, and then outputs the
        !           402: padding that is necessary.
        !           403: 
        !           404: * Menu:
        !           405: 
        !           406: * Why Pad::          Explanation of padding.
        !           407: * Describe Padding:: The data base says how much padding a terminal needs.
        !           408: * Output Padding::   Using `tputs' to output the needed padding.
        !           409: 
        !           410: 
        !           411: File: termcap,  Node: Why Pad,  Next: Describe Padding,  Prev: Padding,  Up: Padding
        !           412: 
        !           413: Why Pad, and How
        !           414: ----------------
        !           415: 
        !           416:    Most types of terminal have commands that take longer to execute
        !           417: than they do to send over a high-speed line.  For example, clearing the
        !           418: screen may take 20msec once the entire command is received.  During
        !           419: that time, on a 9600 bps line, the terminal could receive about 20
        !           420: additional output characters while still busy clearing the screen. 
        !           421: Every terminal has a certain amount of buffering capacity to remember
        !           422: output characters that cannot be processed yet, but too many slow
        !           423: commands in a row can cause the buffer to fill up.  Then any additional
        !           424: output that cannot be processed immediately will be lost.
        !           425: 
        !           426:    To avoid this problem, we normally follow each display command with
        !           427: enough useless charaters (usually null characters) to fill up the time
        !           428: that the display command needs to execute.  This does the job if the
        !           429: terminal throws away null characters without using up space in the
        !           430: buffer (which most terminals do).  If enough padding is used, no output
        !           431: can ever be lost.  The right amount of padding avoids loss of output
        !           432: without slowing down operation, since the time used to transmit padding
        !           433: is time that nothing else could be done.
        !           434: 
        !           435:    The number of padding characters needed for an operation depends on
        !           436: the line speed.  In fact, it is proportional to the line speed.  A 9600
        !           437: baud line transmits about one character per msec, so the clear screen
        !           438: command in the example above would need about 20 characters of padding.
        !           439:  At 1200 baud, however, only about 3 characters of padding are needed
        !           440: to fill up 20msec.
        !           441: 
        !           442: 
        !           443: File: termcap,  Node: Describe Padding,  Next: Output Padding,  Prev: Why Pad,  Up: Padding
        !           444: 
        !           445: Specifying Padding in a Terminal Description
        !           446: --------------------------------------------
        !           447: 
        !           448:    In the terminal description, the amount of padding required by each
        !           449: display command is recorded as a sequence of digits at the front of the
        !           450: command. These digits specify the padding time in msec.  They can be
        !           451: followed optionally by a decimal point and one more digit, which is a
        !           452: number of tenths of msec.
        !           453: 
        !           454:    Sometimes the padding needed by a command depends on the cursor
        !           455: position. For example, the time taken by an "insert line" command is
        !           456: usually proportional to the number of lines that need to be moved down
        !           457: or cleared. An asterisk (`*') following the padding time says that the
        !           458: time should be multiplied by the number of screen lines affected by the
        !           459: command.
        !           460: 
        !           461:      :al=1.3*\E[L:
        !           462: 
        !           463: is used to describe the "insert line" command for a certain terminal.
        !           464: The padding required is 1.3 msec per line affected.  The command itself
        !           465: is `ESC [ L'.
        !           466: 
        !           467:    The padding time specified in this way tells `tputs' how many pad
        !           468: characters to output.  *Note Output Padding::.
        !           469: 
        !           470:    Two special capability values affect padding for all commands. 
        !           471: These are the `pc' and `pb'.  The variable `pc' specifies the character
        !           472: to pad with, and `pb' the speed below which no padding is needed.  The
        !           473: defaults for these variables, a null character and 0, are correct for
        !           474: most terminals.  *Note Pad Specs::.
        !           475: 
        !           476: 
        !           477: File: termcap,  Node: Output Padding,  Prev: Describe Padding,  Up: Padding
        !           478: 
        !           479: Performing Padding with `tputs'
        !           480: -------------------------------
        !           481: 
        !           482:    Use the termcap function `tputs' to output a string containing an
        !           483: optional padding spec of the form described above (*note Describe
        !           484: Padding::.).  The function `tputs' strips off and decodes the padding
        !           485: spec, outputs the rest of the string, and then outputs the appropriate
        !           486: padding.  Here is its declaration in ANSI C:
        !           487: 
        !           488:      char PC;
        !           489:      short ospeed;
        !           490:      
        !           491:      int tputs (char *STRING, int NLINES, int (*OUTFUN) ());
        !           492: 
        !           493:    Here STRING is the string (including padding spec) to be output;
        !           494: NLINES is the number of lines affected by the operation, which is used
        !           495: to multiply the amount of padding if the padding spec ends with a `*'. 
        !           496: Finally, OUTFUN is a function (such as `fputchar') that is called to
        !           497: output each character.  When actually called, OUTFUN should expect one
        !           498: argument, a character.
        !           499: 
        !           500:    The operation of `tputs' is controlled by two global variables,
        !           501: `ospeed' and `PC'.  The value of `ospeed' is supposed to be the
        !           502: terminal output speed, encoded as in the `ioctl' system call which gets
        !           503: the speed information.  This is needed to compute the number of padding
        !           504: characters.  The value of `PC' is the character used for padding.
        !           505: 
        !           506:    You are responsible for storing suitable values into these variables
        !           507: before using `tputs'.  The value stored into the `PC' variable should be
        !           508: taken from the `pc' capability in the terminal description (*note Pad
        !           509: Specs::.).  Store zero in `PC' if there is no `pc' capability.
        !           510: 
        !           511:    The argument NLINES requires some thought.  Normally, it should be
        !           512: the number of lines whose contents will be cleared or moved by the
        !           513: command. For cursor motion commands, or commands that do editing within
        !           514: one line, use the value 1.  For most commands that affect multiple
        !           515: lines, such as `al' (insert a line) and `cd' (clear from the cursor to
        !           516: the end of the screen), NLINES should be the screen height minus the
        !           517: current vertical position (origin 0).  For multiple insert and scroll
        !           518: commands such as `AL' (insert multiple lines), that same value for
        !           519: NLINES is correct; the number of lines being inserted is not correct.
        !           520: 
        !           521:    If a "scroll window" feature is used to reduce the number of lines
        !           522: affected by a command, the value of NLINES should take this into
        !           523: account.  This is because the delay time required depends on how much
        !           524: work the terminal has to do, and the scroll window feature reduces the
        !           525: work. *Note Scrolling::.
        !           526: 
        !           527:    Commands such as `ic' and `dc' (insert or delete characters) are
        !           528: problematical because the padding needed by these commands is
        !           529: proportional to the number of characters affected, which is the number
        !           530: of columns from the cursor to the end of the line.  It would be nice to
        !           531: have a way to specify such a dependence, and there is no need for
        !           532: dependence on vertical position in these commands, so it is an obvious
        !           533: idea to say that for these commands NLINES should really be the number
        !           534: of columns affected. However, the definition of termcap clearly says
        !           535: that NLINES is always the number of lines affected, even in this case,
        !           536: where it is always 1.  It is not easy to change this rule now, because
        !           537: too many programs and terminal descriptions have been written to follow
        !           538: it.
        !           539: 
        !           540:    Because NLINES is always 1 for the `ic' and `dc' strings, there is
        !           541: no reason for them to use `*', but some of them do.  These should be
        !           542: corrected by deleting the `*'.  If, some day, such entries have
        !           543: disappeared, it may be possible to change to a more useful convention
        !           544: for the NLINES argument for these operations without breaking any
        !           545: programs.
        !           546: 
        !           547: 
        !           548: File: termcap,  Node: Parameters,  Prev: Padding,  Up: Library
        !           549: 
        !           550: Filling In Parameters
        !           551: =====================
        !           552: 
        !           553:    Some terminal control strings require numeric "parameters".  For
        !           554: example, when you move the cursor, you need to say what horizontal and
        !           555: vertical positions to move it to.  The value of the terminal's `cm'
        !           556: capability, which says how to move the cursor, cannot simply be a
        !           557: string of characters; it must say how to express the cursor position
        !           558: numbers and where to put them within the command.
        !           559: 
        !           560:    The specifications of termcap include conventions as to which
        !           561: string-valued capabilities require parameters, how many parameters, and
        !           562: what the parameters mean; for example, it defines the `cm' string to
        !           563: take two parameters, the vertical and horizontal positions, with 0,0
        !           564: being the upper left corner.  These conventions are described where the
        !           565: individual commands are documented.
        !           566: 
        !           567:    Termcap also defines a language used within the capability
        !           568: definition for specifying how and where to encode the parameters for
        !           569: output.  This language uses character sequences starting with `%'. 
        !           570: (This is the same idea as `printf', but the details are different.) 
        !           571: The language for parameter encoding is described in this section.
        !           572: 
        !           573:    A program that is doing display output calls the functions `tparam'
        !           574: or `tgoto' to encode parameters according to the specifications.  These
        !           575: functions produce a string containing the actual commands to be output
        !           576: (as well a padding spec which must be processed with `tputs'; *note
        !           577: Padding::.).
        !           578: 
        !           579: * Menu:
        !           580: 
        !           581: * Encode Parameters:: The language for encoding parameters.
        !           582: * Using Parameters::  Outputting a string command with parameters.
        !           583: 
        !           584: 
        !           585: File: termcap,  Node: Encode Parameters,  Next: Using Parameters,  Prev: Parameters,  Up: Parameters
        !           586: 
        !           587: Describing the Encoding
        !           588: -----------------------
        !           589: 
        !           590:    A terminal command string that requires parameters contains special
        !           591: character sequences starting with `%' to say how to encode the
        !           592: parameters.  These sequences control the actions of `tparam' and
        !           593: `tgoto'.
        !           594: 
        !           595:    The parameters values passed to `tparam' or `tgoto' are considered
        !           596: to form a vector.  A pointer into this vector determines the next
        !           597: parameter to be processed.  Some of the `%'-sequences encode one
        !           598: parameter and advance the pointer to the next parameter. Other
        !           599: `%'-sequences alter the pointer or alter the parameter values without
        !           600: generating output.
        !           601: 
        !           602:    For example, the `cm' string for a standard ANSI terminal is written
        !           603: as `\E[%i%d;%dH'.  (`\E' stands for ESC.)  `cm' by convention always
        !           604: requires two parameters, the vertical and horizontal goal positions, so
        !           605: this string specifies the encoding of two parameters.  Here `%i'
        !           606: increments the two values supplied, and each `%d' encodes one of the
        !           607: values in decimal.  If the cursor position values 20,58 are encoded
        !           608: with this string, the result is `\E[21;59H'.
        !           609: 
        !           610:    First, here are the `%'-sequences that generate output.  Except for
        !           611: `%%', each of them encodes one parameter and advances the pointer to
        !           612: the following parameter.
        !           613: 
        !           614: `%%'
        !           615:      Output a single `%'.  This is the only way to represent a literal
        !           616:      `%' in a terminal command with parameters.  `%%' does not use up a
        !           617:      parameter.
        !           618: 
        !           619: `%d'
        !           620:      As in `printf', output the next parameter in decimal.
        !           621: 
        !           622: `%2'
        !           623:      Like `%02d' in `printf': output the next parameter in decimal, and
        !           624:      always use at least two digits.
        !           625: 
        !           626: `%3'
        !           627:      Like `%03d' in `printf': output the next parameter in decimal, and
        !           628:      always use at least three digits.  Note that `%4' and so on are
        !           629:      *not* defined.
        !           630: 
        !           631: `%.'
        !           632:      Output the next parameter as a single character whose ASCII code is
        !           633:      the parameter value.  Like `%c' in `printf'.
        !           634: 
        !           635: `%+CHAR'
        !           636:      Add the next parameter to the character CHAR, and output the
        !           637:      resulting character.  For example, `%+ ' represents 0 as a space,
        !           638:      1 as `!', etc.
        !           639: 
        !           640:    The following `%'-sequences specify alteration of the parameters
        !           641: (their values, or their order) rather than encoding a parameter for
        !           642: output. They generate no output; they are used only for their side
        !           643: effects on the parameters.  Also, they do not advance the "next
        !           644: parameter" pointer except as explicitly stated.  Only `%i', `%r' and
        !           645: `%>' are defined in standard Unix termcap.  The others are GNU
        !           646: extensions.
        !           647: 
        !           648: `%i'
        !           649:      Increment the next two parameters.  This is used for terminals that
        !           650:      expect cursor positions in origin 1.  For example, `%i%d,%d' would
        !           651:      output two parameters with `1' for 0, `2' for 1, etc.
        !           652: 
        !           653: `%r'
        !           654:      Interchange the next two parameters.  This is used for terminals
        !           655:      whose cursor positioning command expects the horizontal position
        !           656:      first.
        !           657: 
        !           658: `%s'
        !           659:      Skip the next parameter.  Do not output anything.
        !           660: 
        !           661: `%b'
        !           662:      Back up one parameter.  The last parameter used will become once
        !           663:      again the next parameter to be output, and the next output command
        !           664:      will use it.  Using `%b' more than once, you can back up any
        !           665:      number of parameters, and you can refer to each parameter any
        !           666:      number of times.
        !           667: 
        !           668: `%>C1C2'
        !           669:      Conditionally increment the next parameter.  Here C1 and C2 are
        !           670:      characters which stand for their ASCII codes as numbers. If the
        !           671:      next parameter is greater than the ASCII code of C1, the ASCII
        !           672:      code of C2 is added to it.
        !           673: 
        !           674: `%a OP TYPE POS'
        !           675:      Perform arithmetic on the next parameter, do not use it up, and do
        !           676:      not output anything.  Here OP specifies the arithmetic operation,
        !           677:      while TYPE and POS together specify the other operand.
        !           678: 
        !           679:      Spaces are used above to separate the operands for clarity; the
        !           680:      spaces don't appear in the data base, where this sequence is
        !           681:      exactly five characters long.
        !           682: 
        !           683:      The character OP says what kind of arithmetic operation to
        !           684:      perform.  It can be any of these characters:
        !           685: 
        !           686:     `='
        !           687:           assign a value to the next parameter, ignoring its old value.
        !           688:           The new value comes from the other operand.
        !           689: 
        !           690:     `+'
        !           691:           add the other operand to the next parameter.
        !           692: 
        !           693:     `-'
        !           694:           subtract the other operand from the next parameter.
        !           695: 
        !           696:     `*'
        !           697:           multiply the next parameter by the other operand.
        !           698: 
        !           699:     `/'
        !           700:           divide the next parameter by the other operand.
        !           701: 
        !           702:      The "other operand" may be another parameter's value or a constant;
        !           703:      the character TYPE says which.  It can be:
        !           704: 
        !           705:     `p'
        !           706:           Use another parameter.  The character POS says which
        !           707:           parameter to use.  Subtract 64 from its ASCII code to get the
        !           708:           position of the desired parameter relative to this one.  Thus,
        !           709:           the character `A' as POS means the parameter after the next
        !           710:           one; the character `?' means the parameter before the next
        !           711:           one.
        !           712: 
        !           713:     `c'
        !           714:           Use a constant value.  The character POS specifies the value
        !           715:           of the constant.  The 0200 bit is cleared out, so that 0200
        !           716:           can be used to represent zero.
        !           717: 
        !           718:    The following `%'-sequences are special purpose hacks to compensate
        !           719: for the weird designs of obscure terminals.  They modify the next
        !           720: parameter or the next two parameters but do not generate output and do
        !           721: not use up any parameters.  `%m' is a GNU extension; the others are
        !           722: defined in standard Unix termcap.
        !           723: 
        !           724: `%n'
        !           725:      Exclusive-or the next parameter with 0140, and likewise the
        !           726:      parameter after next.
        !           727: 
        !           728: `%m'
        !           729:      Complement all the bits of the next parameter and the parameter
        !           730:      after next.
        !           731: 
        !           732: `%B'
        !           733:      Encode the next parameter in BCD.  It alters the value of the
        !           734:      parameter by adding six times the quotient of the parameter by ten.
        !           735:      Here is a C statement that shows how the new value is computed:
        !           736: 
        !           737:           PARM = (PARM / 10) * 16 + PARM % 10;
        !           738: 
        !           739: `%D'
        !           740:      Transform the next parameter as needed by Delta Data terminals.
        !           741:      This involves subtracting twice the remainder of the parameter by
        !           742:      16.
        !           743: 
        !           744:           PARM -= 2 * (PARM % 16);
        !           745: 
        !           746: 
        !           747: File: termcap,  Node: Using Parameters,  Prev: Encode Parameters,  Up: Parameters
        !           748: 
        !           749: Sending Display Commands with Parameters
        !           750: ----------------------------------------
        !           751: 
        !           752:    The termcap library functions `tparam' and `tgoto' serve as the
        !           753: analog of `printf' for terminal string parameters.  The newer function
        !           754: `tparam' is a GNU extension, more general but missing from Unix
        !           755: termcap.  The original parameter-encoding function is `tgoto', which is
        !           756: preferable for cursor motion.
        !           757: 
        !           758: * Menu:
        !           759: 
        !           760: * tparam::   The general case, for GNU termcap only.
        !           761: * tgoto::    The special case of cursor motion.
        !           762: 
        !           763: 
        !           764: File: termcap,  Node: tparam,  Next: tgoto,  Prev: Using Parameters,  Up: Using Parameters
        !           765: 
        !           766: `tparam'
        !           767: ........
        !           768: 
        !           769:    The function `tparam' can encode display commands with any number of
        !           770: parameters and allows you to specify the buffer space.  It is the
        !           771: preferred function for encoding parameters for all but the `cm'
        !           772: capability.  Its ANSI C declaration is as follows:
        !           773: 
        !           774:      char *tparam (char *CTLSTRING, char *BUFFER, int SIZE, int PARM1,...)
        !           775: 
        !           776:    The arguments are a control string CTLSTRING (the value of a terminal
        !           777: capability, presumably), an output buffer BUFFER and SIZE, and any
        !           778: number of integer parameters to be encoded.  The effect of `tparam' is
        !           779: to copy the control string into the buffer, encoding parameters
        !           780: according to the `%' sequences in the control string.
        !           781: 
        !           782:    You describe the output buffer by its address, BUFFER, and its size
        !           783: in bytes, SIZE.  If the buffer is not big enough for the data to be
        !           784: stored in it, `tparam' calls `malloc' to get a larger buffer.  In
        !           785: either case, `tparam' returns the address of the buffer it ultimately
        !           786: uses.  If the value equals BUFFER, your original buffer was used.
        !           787: Otherwise, a new buffer was allocated, and you must free it after you
        !           788: are done with printing the results.  If you pass zero for SIZE and
        !           789: BUFFER, `tparam' always allocates the space with `malloc'.
        !           790: 
        !           791:    All capabilities that require parameters also have the ability to
        !           792: specify padding, so you should use `tputs' to output the string
        !           793: produced by `tparam'.  *Note Padding::.  Here is an example.
        !           794: 
        !           795:      {
        !           796:        char *buf;
        !           797:        char buffer[40];
        !           798:      
        !           799:        buf = tparam (command, buffer, 40, parm);
        !           800:        tputs (buf, 1, fputchar);
        !           801:        if (buf != buffer)
        !           802:          free (buf);
        !           803:      }
        !           804: 
        !           805:    If a parameter whose value is zero is encoded with `%.'-style
        !           806: encoding, the result is a null character, which will confuse `tputs'.
        !           807: This would be a serious problem, but luckily `%.' encoding is used only
        !           808: by a few old models of terminal, and only for the `cm' capability.  To
        !           809: solve the problem, use `tgoto' rather than `tparam' to encode the `cm'
        !           810: capability.
        !           811: 
        !           812: 
        !           813: File: termcap,  Node: tgoto,  Prev: tparam,  Up: Using Parameters
        !           814: 
        !           815: `tgoto'
        !           816: .......
        !           817: 
        !           818:    The special case of cursor motion is handled by `tgoto'.  There are
        !           819: two reasons why you might choose to use `tgoto':
        !           820: 
        !           821:    * For Unix compatibility, because Unix termcap does not have
        !           822:      `tparam'.
        !           823: 
        !           824:    * For the `cm' capability, since `tgoto' has a special feature to
        !           825:      avoid problems with null characters, tabs and newlines on certain
        !           826:      old terminal types that use `%.' encoding for that capability.
        !           827: 
        !           828:    Here is how `tgoto' might be declared in ANSI C:
        !           829: 
        !           830:      char *tgoto (char *CSTRING, int HPOS, int VPOS)
        !           831: 
        !           832:    There are three arguments, the terminal description's `cm' string and
        !           833: the two cursor position numbers; `tgoto' computes the parametrized
        !           834: string in an internal static buffer and returns the address of that
        !           835: buffer. The next time you use `tgoto' the same buffer will be reused.
        !           836: 
        !           837:    Parameters encoded with `%.' encoding can generate null characters,
        !           838: tabs or newlines.  These might cause trouble: the null character because
        !           839: `tputs' would think that was the end of the string, the tab because the
        !           840: kernel or other software might expand it into spaces, and the newline
        !           841: becaue the kernel might add a carriage-return, or padding characters
        !           842: normally used for a newline.  To prevent such problems, `tgoto' is
        !           843: careful to avoid these characters.  Here is how this works: if the
        !           844: target cursor position value is such as to cause a problem (that is to
        !           845: say, zero, nine or ten), `tgoto' increments it by one, then compensates
        !           846: by appending a string to move the cursor back or up one position.
        !           847: 
        !           848:    The compensation strings to use for moving back or up are found in
        !           849: global variables named `BC' and `UP'.  These are actual external C
        !           850: variables with upper case names; they are declared `char *'.  It is up
        !           851: to you to store suitable values in them, normally obtained from the
        !           852: `le' and `up' terminal capabilities in the terminal description with
        !           853: `tgetstr'.  Alternatively, if these two variables are both zero, the
        !           854: feature of avoiding nulls, tabs and newlines is turned off.
        !           855: 
        !           856:    It is safe to use `tgoto' for commands other than `cm' only if you
        !           857: have stored zero in `BC' and `UP'.
        !           858: 
        !           859:    Note that `tgoto' reverses the order of its operands: the horizontal
        !           860: position comes before the vertical position in the arguments to
        !           861: `tgoto', even though the vertical position comes before the horizontal
        !           862: in the parameters of the `cm' string.  If you use `tgoto' with a
        !           863: command such as `AL' that takes one parameter, you must pass the
        !           864: parameter to `tgoto' as the "vertical position".
        !           865: 
        !           866: 
        !           867: File: termcap,  Node: Data Base,  Next: Capabilities,  Prev: Library,  Up: Top
        !           868: 
        !           869: The Format of the Data Base
        !           870: ***************************
        !           871: 
        !           872:    The termcap data base of terminal descriptions is stored in the file
        !           873: `/etc/termcap'.  It contains terminal descriptions, blank lines, and
        !           874: comments.
        !           875: 
        !           876:    A terminal description starts with one or more names for the
        !           877: terminal type. The information in the description is a series of
        !           878: "capability names" and values.  The capability names have standard
        !           879: meanings (*note Capabilities::.) and their values describe the terminal.
        !           880: 
        !           881: * Menu:
        !           882: 
        !           883: * Format::            Overall format of a terminal description.
        !           884: * Capability Format:: Format of capabilities within a description.
        !           885: * Naming::            Naming conventions for terminal types.
        !           886: * Inheriting::        Inheriting part of a description from
        !           887:                         a related terminal type.
        !           888: 
        !           889: 
        !           890: File: termcap,  Node: Format,  Next: Capability Format,  Prev: Data Base,  Up: Data Base
        !           891: 
        !           892: Terminal Description Format
        !           893: ===========================
        !           894: 
        !           895:    Aside from comments (lines starting with `#', which are ignored),
        !           896: each nonblank line in the termcap data base is a terminal description.
        !           897: A terminal description is nominally a single line, but it can be split
        !           898: into multiple lines by inserting the two characters `\ newline'. This
        !           899: sequence is ignored wherever it appears in a description.
        !           900: 
        !           901:    The preferred way to split the description is between capabilities:
        !           902: insert the four characters `: \ newline tab' immediately before any
        !           903: colon. This allows each sub-line to start with some indentation.  This
        !           904: works because, after the `\ newline' are ignored, the result is `: tab
        !           905: :'; the first colon ends the preceding capability and the second colon
        !           906: starts the next capability.  If you split with `\ newline' alone, you
        !           907: may not add any indentation after them.
        !           908: 
        !           909:    Here is a real example of a terminal description:
        !           910: 
        !           911:      dw|vt52|DEC vt52:\
        !           912:              :cr=^M:do=^J:nl=^J:bl=^G:\
        !           913:              :le=^H:bs:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :co#80:li#24:\
        !           914:              :nd=\EC:ta=^I:pt:sr=\EI:up=\EA:\
        !           915:              :ku=\EA:kd=\EB:kr=\EC:kl=\ED:kb=^H:
        !           916: 
        !           917:    Each terminal description begins with several names for the terminal
        !           918: type. The names are separated by `|' characters, and a colon ends the
        !           919: last name.  The first name should be two characters long; it exists
        !           920: only for the sake of very old Unix systems and is never used in modern
        !           921: systems.  The last name should be a fully verbose name such as "DEC
        !           922: vt52" or "Ann Arbor Ambassador with 48 lines".  The other names should
        !           923: include whatever the user ought to be able to specify to get this
        !           924: terminal type, such as `vt52' or `aaa-48'.  *Note Naming::, for
        !           925: information on how to choose terminal type names.
        !           926: 
        !           927:    After the terminal type names come the terminal capabilities,
        !           928: separated by colons and with a colon after the last one.  Each
        !           929: capability has a two-letter name, such as `cm' for "cursor motion
        !           930: string" or `li' for "number of display lines".
        !           931: 
        !           932: 
        !           933: File: termcap,  Node: Capability Format,  Next: Naming,  Prev: Format,  Up: Data Base
        !           934: 
        !           935: Writing the Capabilities
        !           936: ========================
        !           937: 
        !           938:    There are three kinds of capabilities: flags, numbers, and strings. 
        !           939: Each kind has its own way of being written in the description.  Each
        !           940: defined capability has by convention a particular kind of value; for
        !           941: example, `li' always has a numeric value and `cm' always a string value.
        !           942: 
        !           943:    A flag capability is thought of as having a boolean value: the value
        !           944: is true if the capability is present, false if not.  When the
        !           945: capability is present, just write its name between two colons.
        !           946: 
        !           947:    A numeric capability has a value which is a nonnegative number. 
        !           948: Write the capability name, a `#', and the number, between two colons. 
        !           949: For example, `...:li#48:...' is how you specify the `li' capability for
        !           950: 48 lines.
        !           951: 
        !           952:    A string-valued capability has a value which is a sequence of
        !           953: characters. Usually these are the characters used to perform some
        !           954: display operation. Write the capability name, a `=', and the characters
        !           955: of the value, between two colons.  For example,
        !           956: `...:cm=\E[%i%d;%dH:...' is how the cursor motion command for a
        !           957: standard ANSI terminal would be specified.
        !           958: 
        !           959:    Special characters in the string value can be expressed using
        !           960: `\'-escape sequences as in C; in addition, `\E' stands for ESC.  `^' is
        !           961: also a kind of escape character; `^' followed by CHAR stands for the
        !           962: control-equivalent of CHAR.  Thus, `^a' stands for the character
        !           963: control-a, just like `\001'. `\' and `^' themselves can be represented
        !           964: as `\\' and `\^'.
        !           965: 
        !           966:    To include a colon in the string, you must write `\072'.  You might
        !           967: ask, "Why can't `\:' be used to represent a colon?"  The reason is that
        !           968: the interrogation functions do not count slashes while looking for a
        !           969: capability.  Even if `:ce=ab\:cd:' were interpreted as giving the `ce'
        !           970: capability the value `ab:cd', it would also appear to define `cd' as a
        !           971: flag.
        !           972: 
        !           973:    The string value will often contain digits at the front to specify
        !           974: padding (*note Padding::.) and/or `%'-sequences within to specify how
        !           975: to encode parameters (*note Parameters::.).  Although these things are
        !           976: not to be output literally to the terminal, they are considered part of
        !           977: the value of the capability.  They are special only when the string
        !           978: value is processed by `tputs', `tparam' or `tgoto'.  By contrast, `\'
        !           979: and `^' are considered part of the syntax for specifying the characters
        !           980: in the string.
        !           981: 
        !           982:    Let's look at the VT52 example again:
        !           983: 
        !           984:      dw|vt52|DEC vt52:\
        !           985:              :cr=^M:do=^J:nl=^J:bl=^G:\
        !           986:              :le=^H:bs:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :co#80:li#24:\
        !           987:              :nd=\EC:ta=^I:pt:sr=\EI:up=\EA:\
        !           988:              :ku=\EA:kd=\EB:kr=\EC:kl=\ED:kb=^H:
        !           989: 
        !           990:    Here we see the numeric-valued capabilities `co' and `li', the flags
        !           991: `bs' and `pt', and many string-valued capabilities.  Most of the
        !           992: strings start with ESC represented as `\E'.  The rest contain control
        !           993: characters represented using `^'.  The meanings of the individual
        !           994: capabilities are defined elsewhere (*note Capabilities::.).
        !           995: 
        !           996: 
        !           997: File: termcap,  Node: Naming,  Next: Inheriting,  Prev: Capability Format,  Up: Data Base
        !           998: 
        !           999: Terminal Type Name Conventions
        !          1000: ==============================
        !          1001: 
        !          1002:    There are conventions for choosing names of terminal types.  For one
        !          1003: thing, all letters should be in lower case.  The terminal type for a
        !          1004: terminal in its most usual or most fundamental mode of operation should
        !          1005: not have a hyphen in it.
        !          1006: 
        !          1007:    If the same terminal has other modes of operation which require
        !          1008: different terminal descriptions, these variant descriptions are given
        !          1009: names made by adding suffixes with hyphens.  Such alternate descriptions
        !          1010: are used for two reasons:
        !          1011: 
        !          1012:    * When the terminal has a switch that changes its behavior.  Since
        !          1013:      the computer cannot tell how the switch is set, the user must tell
        !          1014:      the computer by choosing the appropriate terminal type name.
        !          1015: 
        !          1016:      For example, the VT-100 has a setup flag that controls whether the
        !          1017:      cursor wraps at the right margin.  If this flag is set to "wrap",
        !          1018:      you must use the terminal type `vt100-am'.  Otherwise you must use
        !          1019:      `vt100-nam'.  Plain `vt100' is defined as a synonym for either
        !          1020:      `vt100-am' or `vt100-nam' depending on the preferences of the
        !          1021:      local site.
        !          1022: 
        !          1023:      The standard suffix `-am' stands for "automatic margins".
        !          1024: 
        !          1025:    * To give the user a choice in how to use the terminal.  This is done
        !          1026:      when the terminal has a switch that the computer normally controls.
        !          1027: 
        !          1028:      For example, the Ann Arbor Ambassador can be configured with many
        !          1029:      screen sizes ranging from 20 to 60 lines.  Fewer lines make bigger
        !          1030:      characters but more lines let you see more of what you are editing.
        !          1031:      As a result, users have different preferences.  Therefore, termcap
        !          1032:      provides terminal types for many screen sizes.  If you choose type
        !          1033:      `aaa-30', the terminal will be configured to use 30 lines; if you
        !          1034:      choose `aaa-48', 48 lines will be used, and so on.
        !          1035: 
        !          1036:    Here is a list of standard suffixes and their conventional meanings:
        !          1037: 
        !          1038: `-w'
        !          1039:      Short for "wide".  This is a mode that gives the terminal more
        !          1040:      columns than usual.  This is normally a user option.
        !          1041: 
        !          1042: `-am'
        !          1043:      "Automatic margins".  This is an alternate description for use when
        !          1044:      the terminal's margin-wrap switch is on; it contains the `am'
        !          1045:      flag.  The implication is that normally the switch is off and the
        !          1046:      usual description for the terminal says that the switch is off.
        !          1047: 
        !          1048: `-nam'
        !          1049:      "No automatic margins".  The opposite of `-am', this names an
        !          1050:      alternative description which lacks the `am' flag.  This implies
        !          1051:      that the terminal is normally operated with the margin-wrap switch
        !          1052:      turned on, and the normal description of the terminal says so.
        !          1053: 
        !          1054: `-na'
        !          1055:      "No arrows".  This terminal description initializes the terminal to
        !          1056:      keep its arrow keys in local mode.  This is a user option.
        !          1057: 
        !          1058: `-rv'
        !          1059:      "Reverse video".  This terminal description causes text output for
        !          1060:      normal video to appear as reverse, and text output for reverse
        !          1061:      video to come out as normal.  Often this description differs from
        !          1062:      the usual one by interchanging the two strings which turn reverse
        !          1063:      video on and off.
        !          1064: 
        !          1065:      This is a user option; you can choose either the "reverse video"
        !          1066:      variant terminal type or the normal terminal type, and termcap will
        !          1067:      obey.
        !          1068: 
        !          1069: `-s'
        !          1070:      "Status".  Says to enable use of a status line which ordinary
        !          1071:      output does not touch (*note Status Line::.).
        !          1072: 
        !          1073:      Some terminals have a special line that is used only as a status
        !          1074:      line. For these terminals, there is no need for an `-s' variant;
        !          1075:      the status line commands should be defined by default.  On other
        !          1076:      terminals, enabling a status line means removing one screen line
        !          1077:      from ordinary use and reducing the effective screen height.  For
        !          1078:      these terminals, the user can choose the `-s' variant type to
        !          1079:      request use of a status line.
        !          1080: 
        !          1081: `-NLINES'
        !          1082:      Says to operate with NLINES lines on the screen, for terminals
        !          1083:      such as the Ambassador which provide this as an option.  Normally
        !          1084:      this is a user option; by choosing the terminal type, you control
        !          1085:      how many lines termcap will use.
        !          1086: 
        !          1087: `-NPAGESp'
        !          1088:      Says that the terminal has NPAGES pages worth of screen memory,
        !          1089:      for terminals where this is a hardware option.
        !          1090: 
        !          1091: `-unk'
        !          1092:      Says that description is not for direct use, but only for
        !          1093:      reference in `tc' capabilities.  Such a description is a kind of
        !          1094:      subroutine, because it describes the common characteristics of
        !          1095:      several variant descriptions that would use other suffixes in
        !          1096:      place of `-unk'.
        !          1097: 
        !          1098: 
        !          1099: File: termcap,  Node: Inheriting,  Prev: Naming,  Up: Data Base
        !          1100: 
        !          1101: Inheriting from Related Descriptions
        !          1102: ====================================
        !          1103: 
        !          1104:    When two terminal descriptions are similar, their identical parts do
        !          1105: not need to be given twice.  Instead, one of the two can be defined in
        !          1106: terms of the other, using the `tc' capability.  We say that one
        !          1107: description "refers to" the other, or "inherits from" the other.
        !          1108: 
        !          1109:    The `tc' capability must be the last one in the terminal description,
        !          1110: and its value is a string which is the name of another terminal type
        !          1111: which is referred to.  For example,
        !          1112: 
        !          1113:      N9|aaa|ambassador|aaa-30|ann arbor ambassador/30 lines:\
        !          1114:              :ti=\E[2J\E[30;0;0;30p:\
        !          1115:              :te=\E[60;0;0;30p\E[30;1H\E[J:\
        !          1116:              :li#30:tc=aaa-unk:
        !          1117: 
        !          1118: defines the terminal type `aaa-30' (also known as plain `aaa') in terms
        !          1119: of `aaa-unk', which defines everything about the Ambassador that is
        !          1120: independent of screen height.  The types `aaa-36', `aaa-48' and so on
        !          1121: for other screen heights are likewise defined to inherit from `aaa-unk'.
        !          1122: 
        !          1123:    The capabilities overridden by `aaa-30' include `li', which says how
        !          1124: many lines there are, and `ti' and `te', which configure the terminal
        !          1125: to use that many lines.
        !          1126: 
        !          1127:    The effective terminal description for type `aaa' consists of the
        !          1128: text shown above followed by the text of the description of `aaa-unk'. 
        !          1129: The `tc' capability is handled automatically by `tgetent', which finds
        !          1130: the description thus referenced and combines the two descriptions
        !          1131: (*note Find::.).  Therefore, only the implementor of the terminal
        !          1132: descriptions needs to think about using `tc'.  Users and application
        !          1133: programmers do not need to be concerned with it.
        !          1134: 
        !          1135:    Since the reference terminal description is used last, capabilities
        !          1136: specified in the referring description override any specifications of
        !          1137: the same capabilities in the reference description.
        !          1138: 
        !          1139:    The referring description can cancel out a capability without
        !          1140: specifying any new value for it by means of a special trick.  Write the
        !          1141: capability in the referring description, with the character `@' after
        !          1142: the capability name, as follows:
        !          1143: 
        !          1144:      NZ|aaa-30-nam|ann arbor ambassador/30 lines/no automatic-margins:\
        !          1145:              :am@:tc=aaa-30:
        !          1146: 
        !          1147: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.