3617 lines
		
	
	
	
		
			138 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			3617 lines
		
	
	
	
		
			138 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| \input texinfo  @c -*-texinfo-*-
 | |
| @setfilename termcap.info
 | |
| @settitle The Termcap Library
 | |
| @smallbook
 | |
| 
 | |
| @ifinfo
 | |
| This file documents the termcap library of the GNU system.
 | |
| 
 | |
| Copyright (C) 1988 Free Software Foundation, Inc.
 | |
| 
 | |
| Permission is granted to make and distribute verbatim copies of
 | |
| this manual provided the copyright notice and this permission notice
 | |
| are preserved on all copies.
 | |
| 
 | |
| @ignore
 | |
| Permission is granted to process this file through TeX and print the
 | |
| results, provided the printed document carries copying permission
 | |
| notice identical to this one except for the removal of this paragraph
 | |
| (this paragraph not being relevant to the printed manual).
 | |
| 
 | |
| @end ignore
 | |
| Permission is granted to copy and distribute modified versions of this
 | |
| manual under the conditions for verbatim copying, provided that the entire
 | |
| resulting derived work is distributed under the terms of a permission
 | |
| notice identical to this one.
 | |
| 
 | |
| Permission is granted to copy and distribute translations of this manual
 | |
| into another language, under the above conditions for modified versions,
 | |
| except that this permission notice may be stated in a translation approved
 | |
| by the Foundation.
 | |
| @end ifinfo
 | |
| 
 | |
| @setchapternewpage odd
 | |
| 
 | |
| @c @shorttitlepage The Termcap Manual
 | |
| 
 | |
| @titlepage
 | |
| @ignore
 | |
| @sp 6
 | |
| @center @titlefont{Termcap}
 | |
| @sp 1
 | |
| @center The Termcap Library and Data Base
 | |
| @sp 4
 | |
| @center Second Edition
 | |
| @sp 1
 | |
| @center December 1992
 | |
| @sp 5
 | |
| @center Richard M. Stallman
 | |
| @sp 1
 | |
| @center Free Software Foundation
 | |
| @end ignore
 | |
| 
 | |
| @c Real title page
 | |
| @title The Termcap Manual
 | |
| @subtitle The Termcap Library and Data Base
 | |
| @subtitle Second Edition
 | |
| @subtitle December 1992
 | |
| @author Richard M. Stallman
 | |
| @page
 | |
| @vskip 0pt plus 1filll
 | |
| Copyright @copyright{} 1988 Free Software Foundation, Inc.
 | |
| 
 | |
| Published by the Free Software Foundation
 | |
| (59 Temple Place, Suite 330, Boston, MA 02111 USA).
 | |
| Printed copies are available for $10 each.
 | |
| 
 | |
| Permission is granted to make and distribute verbatim copies of
 | |
| this manual provided the copyright notice and this permission notice
 | |
| are preserved on all copies.
 | |
| 
 | |
| Permission is granted to copy and distribute modified versions of this
 | |
| manual under the conditions for verbatim copying, provided that the entire
 | |
| resulting derived work is distributed under the terms of a permission
 | |
| notice identical to this one.
 | |
| 
 | |
| Permission is granted to copy and distribute translations of this manual
 | |
| into another language, under the above conditions for modified versions,
 | |
| except that this permission notice may be stated in a translation approved
 | |
| by the Foundation.
 | |
| @sp 2
 | |
| Cover art by Etienne Suvasa.
 | |
| @end titlepage
 | |
| @page
 | |
| 
 | |
| @synindex vr fn
 | |
| 
 | |
| @node Top, Introduction, (dir), (dir)
 | |
| 
 | |
| @menu
 | |
| * Introduction::  What is termcap?  Why this manual?
 | |
| * Library::     The termcap library functions.
 | |
| * Data Base::   What terminal descriptions in @file{/etc/termcap} look like.
 | |
| * Capabilities::  Definitions of the individual terminal capabilities:
 | |
|                  how to write them in descriptions, and how to use
 | |
|                  their values to do display updating.
 | |
| * Summary::     Brief table of capability names and their meanings.
 | |
| * Var Index::   Index of C functions and variables.
 | |
| * Cap Index::   Index of termcap capabilities.
 | |
| * Index::       Concept index.
 | |
| 
 | |
|  --- The Detailed Node Listing ---
 | |
| 
 | |
| The Termcap Library
 | |
| 
 | |
| * Preparation::  Preparing to use the termcap library.
 | |
| * Find::        Finding the description of the terminal being used.
 | |
| * Interrogate::  Interrogating the description for particular capabilities.
 | |
| * Initialize::  Initialization for output using termcap.
 | |
| * Padding::     Outputting padding.
 | |
| * Parameters::  Encoding parameters such as cursor positions.
 | |
| 
 | |
| Padding
 | |
| 
 | |
| * Why Pad::     Explanation of padding.
 | |
| * Not Enough::  When there is not enough padding.
 | |
| * Describe Padding::  The data base says how much padding a terminal needs.
 | |
| * Output Padding::    Using @code{tputs} to output the needed padding.
 | |
| 
 | |
| Filling In Parameters
 | |
| 
 | |
| * Encode Parameters::  The language for encoding parameters.
 | |
| * Using Parameters::   Outputting a string command with parameters.
 | |
| 
 | |
| Sending Display Commands with Parameters
 | |
| 
 | |
| * tparam::      The general case, for GNU termcap only.
 | |
| * tgoto::       The special case of cursor motion.
 | |
| 
 | |
| The Format of the Data Base
 | |
| 
 | |
| * Format::      Overall format of a terminal description.
 | |
| * Capability Format::  Format of capabilities within a description.
 | |
| * Naming::      Naming conventions for terminal types.
 | |
| * Inheriting::  Inheriting part of a description from
 | |
| a related terminal type.
 | |
| * Changing::    When changes in the data base take effect.
 | |
| 
 | |
| Definitions of the Terminal Capabilities
 | |
| 
 | |
| * Basic::       Basic characteristics.
 | |
| * Screen Size::  Screen size, and what happens when it changes.
 | |
| * Cursor Motion::  Various ways to move the cursor.
 | |
| * Wrapping::    What happens if you write a character in the last column.
 | |
| * Scrolling::   Pushing text up and down on the screen.
 | |
| * Windows::     Limiting the part of the window that output affects.
 | |
| * Clearing::    Erasing one or many lines.
 | |
| * Insdel Line::  Making new blank lines in mid-screen; deleting lines.
 | |
| * Insdel Char::  Inserting and deleting characters within a line.
 | |
| * Standout::    Highlighting some of the text.
 | |
| * Underlining::  Underlining some of the text.
 | |
| * Cursor Visibility::  Making the cursor more or less easy to spot.
 | |
| * Bell::        Attracts user's attention; not localized on the screen.
 | |
| * Keypad::      Recognizing when function keys or arrows are typed.
 | |
| * Meta Key::    @key{META} acts like an extra shift key.
 | |
| * Initialization::  Commands used to initialize or reset the terminal.
 | |
| * Pad Specs::   Info for the kernel on how much padding is needed.
 | |
| * Status Line::  A status line displays ``background'' information.
 | |
| * Half-Line::   Moving by half-lines, for superscripts and subscripts.
 | |
| * Printer::     Controlling auxiliary printers of display terminals.
 | |
| @end menu
 | |
| 
 | |
| @node Introduction, Library, Top, Top
 | |
| @unnumbered Introduction
 | |
| 
 | |
| @cindex termcap
 | |
| @dfn{Termcap} is a library and data base that enables programs to use
 | |
| display terminals in a terminal-independent manner.  It originated in
 | |
| Berkeley Unix.
 | |
| 
 | |
| The termcap data base describes the capabilities of hundreds of different
 | |
| display terminals in great detail.  Some examples of the information
 | |
| recorded for a terminal could include how many columns wide it is, what
 | |
| string to send to move the cursor to an arbitrary position (including how
 | |
| to encode the row and column numbers), how to scroll the screen up one or
 | |
| several lines, and how much padding is needed for such a scrolling
 | |
| operation.
 | |
| 
 | |
| The termcap library is provided for easy access this data base in programs
 | |
| that want to do terminal-independent character-based display output.
 | |
| 
 | |
| This manual describes the GNU version of the termcap library, which has
 | |
| some extensions over the Unix version.  All the extensions are identified
 | |
| as such, so this manual also tells you how to use the Unix termcap.
 | |
| 
 | |
| The GNU version of the termcap library is available free as source code,
 | |
| for use in free programs, and runs on Unix and VMS systems (at least).  You
 | |
| can find it in the GNU Emacs distribution in the files @file{termcap.c} and
 | |
| @file{tparam.c}.
 | |
| 
 | |
| This manual was written for the GNU project, whose goal is to develop a
 | |
| complete free operating system upward-compatible with Unix for user
 | |
| programs.  The project is approximately two thirds complete.  For more
 | |
| information on the GNU project, including the GNU Emacs editor and the
 | |
| mostly-portable optimizing C compiler, send one dollar to
 | |
| 
 | |
| @display
 | |
| Free Software Foundation
 | |
| 675 Mass Ave
 | |
| Cambridge, MA 02139
 | |
| @end display
 | |
| 
 | |
| @node Library, Data Base, Introduction, Top
 | |
| @chapter The Termcap Library
 | |
| 
 | |
| The termcap library is the application programmer's interface to the
 | |
| termcap data base.  It contains functions for the following purposes:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Finding the description of the user's terminal type (@code{tgetent}).
 | |
| 
 | |
| @item
 | |
| Interrogating the description for information on various topics
 | |
| (@code{tgetnum}, @code{tgetflag}, @code{tgetstr}).
 | |
| 
 | |
| @item
 | |
| Computing and performing padding (@code{tputs}).
 | |
| 
 | |
| @item
 | |
| Encoding numeric parameters such as cursor positions into the
 | |
| terminal-specific form required for display commands (@code{tparam},
 | |
| @code{tgoto}).
 | |
| @end itemize
 | |
| 
 | |
| @menu
 | |
| * Preparation::  Preparing to use the termcap library.
 | |
| * Find::        Finding the description of the terminal being used.
 | |
| * Interrogate::  Interrogating the description for particular capabilities.
 | |
| * Initialize::  Initialization for output using termcap.
 | |
| * Padding::     Outputting padding.
 | |
| * Parameters::  Encoding parameters such as cursor positions.
 | |
| @end menu
 | |
| 
 | |
| @node Preparation, Find,  , Library
 | |
| @section Preparing to Use the Termcap Library
 | |
| 
 | |
| To use the termcap library in a program, you need two kinds of preparation:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| The compiler needs declarations of the functions and variables in the
 | |
| library.
 | |
| 
 | |
| On GNU systems, it suffices to include the header file
 | |
| @file{termcap.h} in each source file that uses these functions and
 | |
| variables.@refill
 | |
| 
 | |
| On Unix systems, there is often no such header file.  Then you must
 | |
| explictly declare the variables as external.  You can do likewise for
 | |
| the functions, or let them be implicitly declared and cast their
 | |
| values from type @code{int} to the appropriate type.
 | |
| 
 | |
| We illustrate the declarations of the individual termcap library
 | |
| functions with ANSI C prototypes because they show how to pass the
 | |
| arguments.  If you are not using the GNU C compiler, you probably
 | |
| cannot use function prototypes, so omit the argument types and names
 | |
| from your declarations.
 | |
| 
 | |
| @item
 | |
| The linker needs to search the library.  Usually either
 | |
| @samp{-ltermcap} or @samp{-ltermlib} as an argument when linking will
 | |
| do this.@refill
 | |
| @end itemize
 | |
| 
 | |
| @node Find, Interrogate, Preparation, Library
 | |
| @section Finding a Terminal Description: @code{tgetent}
 | |
| 
 | |
| @findex tgetent
 | |
| An application program that is going to use termcap must first look up the
 | |
| description of the terminal type in use.  This is done by calling
 | |
| @code{tgetent}, whose declaration in ANSI Standard C looks like:
 | |
| 
 | |
| @example
 | |
| int tgetent (char *@var{buffer}, char *@var{termtype});
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| This function finds the description and remembers it internally so that
 | |
| you can interrogate it about specific terminal capabilities
 | |
| (@pxref{Interrogate}).
 | |
| 
 | |
| The argument @var{termtype} is a string which is the name for the type of
 | |
| terminal to look up.  Usually you would obtain this from the environment
 | |
| variable @code{TERM} using @code{getenv ("TERM")}.
 | |
| 
 | |
| If you are using the GNU version of termcap, you can alternatively ask
 | |
| @code{tgetent} to allocate enough space.  Pass a null pointer for
 | |
| @var{buffer}, and @code{tgetent} itself allocates the storage using
 | |
| @code{malloc}.  There is no way to get the address that was allocated,
 | |
| and you shouldn't try to free the storage.@refill
 | |
| 
 | |
| With the Unix version of termcap, you must allocate space for the
 | |
| description yourself and pass the address of the space as the argument
 | |
| @var{buffer}.  There is no way you can tell how much space is needed, so
 | |
| the convention is to allocate a buffer 2048 characters long and assume that
 | |
| is enough.  (Formerly the convention was to allocate 1024 characters and
 | |
| assume that was enough.  But one day, for one kind of terminal, that was
 | |
| not enough.)
 | |
| 
 | |
| No matter how the space to store the description has been obtained,
 | |
| termcap records its address internally for use when you later interrogate
 | |
| the description with @code{tgetnum}, @code{tgetstr} or @code{tgetflag}.  If
 | |
| the buffer was allocated by termcap, it will be freed by termcap too if you
 | |
| call @code{tgetent} again.  If the buffer was provided by you, you must
 | |
| make sure that its contents remain unchanged for as long as you still plan
 | |
| to interrogate the description.@refill
 | |
| 
 | |
| The return value of @code{tgetent} is @minus{}1 if there is some difficulty
 | |
| accessing the data base of terminal types, 0 if the data base is accessible
 | |
| but the specified type is not defined in it, and some other value
 | |
| otherwise.
 | |
| 
 | |
| Here is how you might use the function @code{tgetent}:
 | |
| 
 | |
| @smallexample
 | |
| #ifdef unix
 | |
| static char term_buffer[2048];
 | |
| #else
 | |
| #define term_buffer 0
 | |
| #endif
 | |
| 
 | |
| init_terminal_data ()
 | |
| @{
 | |
|   char *termtype = getenv ("TERM");
 | |
|   int success;
 | |
| 
 | |
|   if (termtype == 0)
 | |
|     fatal ("Specify a terminal type with `setenv TERM <yourtype>'.\n");
 | |
| 
 | |
|   success = tgetent (term_buffer, termtype);
 | |
|   if (success < 0)
 | |
|     fatal ("Could not access the termcap data base.\n");
 | |
|   if (success == 0)
 | |
|     fatal ("Terminal type `%s' is not defined.\n", termtype);
 | |
| @}
 | |
| @end smallexample
 | |
| 
 | |
| @noindent
 | |
| Here we assume the function @code{fatal} prints an error message and exits.
 | |
| 
 | |
| If the environment variable @code{TERMCAP} is defined, its value is used to
 | |
| override the terminal type data base.  The function @code{tgetent} checks
 | |
| the value of @code{TERMCAP} automatically.  If the value starts with
 | |
| @samp{/} then it is taken as a file name to use as the data base file,
 | |
| instead of @file{/etc/termcap} which is the standard data base.  If the
 | |
| value does not start with @samp{/} then it is itself used as the terminal
 | |
| description, provided that the terminal type @var{termtype} is among the
 | |
| types it claims to apply to.  @xref{Data Base}, for information on the
 | |
| format of a terminal description.@refill
 | |
| 
 | |
| @node Interrogate, Initialize, Find, Library
 | |
| @section Interrogating the Terminal Description
 | |
| 
 | |
| Each piece of information recorded in a terminal description is called a
 | |
| @dfn{capability}.  Each defined terminal capability has a two-letter code
 | |
| name and a specific meaning.  For example, the number of columns is named
 | |
| @samp{co}.  @xref{Capabilities}, for definitions of all the standard
 | |
| capability names.
 | |
| 
 | |
| Once you have found the proper terminal description with @code{tgetent}
 | |
| (@pxref{Find}), your application program must @dfn{interrogate} it for
 | |
| various terminal capabilities.  You must specify the two-letter code of
 | |
| the capability whose value you seek.
 | |
| 
 | |
| Capability values can be numeric, boolean (capability is either present or
 | |
| absent) or strings.  Any particular capability always has the same value
 | |
| type; for example, @samp{co} always has a numeric value, while @samp{am}
 | |
| (automatic wrap at margin) is always a flag, and @samp{cm} (cursor motion
 | |
| command) always has a string value.  The documentation of each capability
 | |
| says which type of value it has.@refill
 | |
| 
 | |
| There are three functions to use to get the value of a capability,
 | |
| depending on the type of value the capability has.  Here are their
 | |
| declarations in ANSI C:
 | |
| 
 | |
| @findex tgetnum
 | |
| @findex tgetflag
 | |
| @findex tgetstr
 | |
| @example
 | |
| int tgetnum (char *@var{name});
 | |
| int tgetflag (char *@var{name});
 | |
| char *tgetstr (char *@var{name}, char **@var{area});
 | |
| @end example
 | |
| 
 | |
| @table @code
 | |
| @item tgetnum
 | |
| Use @code{tgetnum} to get a capability value that is numeric.  The
 | |
| argument @var{name} is the two-letter code name of the capability.  If
 | |
| the capability is present, @code{tgetnum} returns the numeric value
 | |
| (which is nonnegative).  If the capability is not mentioned in the
 | |
| terminal description, @code{tgetnum} returns @minus{}1.
 | |
| 
 | |
| @item tgetflag
 | |
| Use @code{tgetflag} to get a boolean value.  If the capability
 | |
| @var{name} is present in the terminal description, @code{tgetflag}
 | |
| returns 1; otherwise, it returns 0.
 | |
| 
 | |
| @item tgetstr
 | |
| Use @code{tgetstr} to get a string value.  It returns a pointer to a
 | |
| string which is the capability value, or a null pointer if the
 | |
| capability is not present in the terminal description.
 | |
| 
 | |
| There are two ways @code{tgetstr} can find space to store the string value:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| You can ask @code{tgetstr} to allocate the space.  Pass a null
 | |
| pointer for the argument @var{area}, and @code{tgetstr} will use
 | |
| @code{malloc} to allocate storage big enough for the value.
 | |
| Termcap will never free this storage or refer to it again; you
 | |
| should free it when you are finished with it.
 | |
| 
 | |
| This method is more robust, since there is no need to guess how
 | |
| much space is needed.  But it is supported only by the GNU
 | |
| termcap library.
 | |
| 
 | |
| @item
 | |
| You can provide the space.  Provide for the argument @var{area} the
 | |
| address of a pointer variable of type @code{char *}.  Before calling
 | |
| @code{tgetstr}, initialize the variable to point at available space.
 | |
| Then @code{tgetstr} will store the string value in that space and will
 | |
| increment the pointer variable to point after the space that has been
 | |
| used.  You can use the same pointer variable for many calls to
 | |
| @code{tgetstr}.
 | |
| 
 | |
| There is no way to determine how much space is needed for a single
 | |
| string, and no way for you to prevent or handle overflow of the area
 | |
| you have provided.  However, you can be sure that the total size of
 | |
| all the string values you will obtain from the terminal description is
 | |
| no greater than the size of the description (unless you get the same
 | |
| capability twice).  You can determine that size with @code{strlen} on
 | |
| the buffer you provided to @code{tgetent}.  See below for an example.
 | |
| 
 | |
| Providing the space yourself is the only method supported by the Unix
 | |
| version of termcap.
 | |
| @end itemize
 | |
| @end table
 | |
| 
 | |
| Note that you do not have to specify a terminal type or terminal
 | |
| description for the interrogation functions.  They automatically use the
 | |
| description found by the most recent call to @code{tgetent}.
 | |
| 
 | |
| Here is an example of interrogating a terminal description for various
 | |
| capabilities, with conditionals to select between the Unix and GNU methods
 | |
| of providing buffer space.
 | |
| 
 | |
| @example
 | |
| char *tgetstr ();
 | |
| 
 | |
| char *cl_string, *cm_string;
 | |
| int height;
 | |
| int width;
 | |
| int auto_wrap;
 | |
| 
 | |
| char PC;   /* For tputs.  */
 | |
| char *BC;  /* For tgoto.  */
 | |
| char *UP;
 | |
| 
 | |
| interrogate_terminal ()
 | |
| @{
 | |
| #ifdef UNIX
 | |
|   /* Here we assume that an explicit term_buffer
 | |
|      was provided to tgetent.  */
 | |
|   char *buffer
 | |
|     = (char *) malloc (strlen (term_buffer));
 | |
| #define BUFFADDR &buffer
 | |
| #else
 | |
| #define BUFFADDR 0
 | |
| #endif
 | |
| 
 | |
|   char *temp;
 | |
| 
 | |
|   /* Extract information we will use.  */
 | |
|   cl_string = tgetstr ("cl", BUFFADDR);
 | |
|   cm_string = tgetstr ("cm", BUFFADDR);
 | |
|   auto_wrap = tgetflag ("am");
 | |
|   height = tgetnum ("li");
 | |
|   width = tgetnum ("co");
 | |
| 
 | |
|   /* Extract information that termcap functions use.  */
 | |
|   temp = tgetstr ("pc", BUFFADDR);
 | |
|   PC = temp ? *temp : 0;
 | |
|   BC = tgetstr ("le", BUFFADDR);
 | |
|   UP = tgetstr ("up", BUFFADDR);
 | |
| @}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| @xref{Padding}, for information on the variable @code{PC}.  @xref{Using
 | |
| Parameters}, for information on @code{UP} and @code{BC}.
 | |
| 
 | |
| @node Initialize, Padding, Interrogate, Library
 | |
| @section Initialization for Use of Termcap
 | |
| @cindex terminal flags (kernel)
 | |
| 
 | |
| Before starting to output commands to a terminal using termcap,
 | |
| an application program should do two things:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Initialize various global variables which termcap library output
 | |
| functions refer to.  These include @code{PC} and @code{ospeed} for
 | |
| padding (@pxref{Output Padding}) and @code{UP} and @code{BC} for
 | |
| cursor motion (@pxref{tgoto}).@refill
 | |
| 
 | |
| @item
 | |
| Tell the kernel to turn off alteration and padding of horizontal-tab
 | |
| characters sent to the terminal.
 | |
| @end itemize
 | |
| 
 | |
| To turn off output processing in Berkeley Unix you would use @code{ioctl}
 | |
| with code @code{TIOCLSET} to set the bit named @code{LLITOUT}, and clear
 | |
| the bits @code{ANYDELAY} using @code{TIOCSETN}.  In POSIX or System V, you
 | |
| must clear the bit named @code{OPOST}.  Refer to the system documentation
 | |
| for details.@refill
 | |
| 
 | |
| If you do not set the terminal flags properly, some older terminals will
 | |
| not work.  This is because their commands may contain the characters that
 | |
| normally signify newline, carriage return and horizontal tab---characters
 | |
| which the kernel thinks it ought to modify before output.
 | |
| 
 | |
| When you change the kernel's terminal flags, you must arrange to restore
 | |
| them to their normal state when your program exits.  This implies that the
 | |
| program must catch fatal signals such as @code{SIGQUIT} and @code{SIGINT}
 | |
| and restore the old terminal flags before actually terminating.
 | |
| 
 | |
| Modern terminals' commands do not use these special characters, so if you
 | |
| do not care about problems with old terminals, you can leave the kernel's
 | |
| terminal flags unaltered.
 | |
| 
 | |
| @node Padding, Parameters, Initialize, Library
 | |
| @section Padding
 | |
| @cindex padding
 | |
| 
 | |
| @dfn{Padding} means outputting null characters following a terminal display
 | |
| command that takes a long time to execute.  The terminal description says
 | |
| which commands require padding and how much; the function @code{tputs},
 | |
| described below, outputs a terminal command while extracting from it the
 | |
| padding information, and then outputs the padding that is necessary.
 | |
| 
 | |
| @menu
 | |
| * Why Pad::     Explanation of padding.
 | |
| * Not Enough::  When there is not enough padding.
 | |
| * Describe Padding::  The data base says how much padding a terminal needs.
 | |
| * Output Padding::  Using @code{tputs} to output the needed padding.
 | |
| @end menu
 | |
| 
 | |
| @node Why Pad, Not Enough,  , Padding
 | |
| @subsection Why Pad, and How
 | |
| 
 | |
| Most types of terminal have commands that take longer to execute than they
 | |
| do to send over a high-speed line.  For example, clearing the screen may
 | |
| take 20msec once the entire command is received.  During that time, on a
 | |
| 9600 bps line, the terminal could receive about 20 additional output
 | |
| characters while still busy clearing the screen.  Every terminal has a
 | |
| certain amount of buffering capacity to remember output characters that
 | |
| cannot be processed yet, but too many slow commands in a row can cause the
 | |
| buffer to fill up.  Then any additional output that cannot be processed
 | |
| immediately will be lost.
 | |
| 
 | |
| To avoid this problem, we normally follow each display command with enough
 | |
| useless charaters (usually null characters) to fill up the time that the
 | |
| display command needs to execute.  This does the job if the terminal throws
 | |
| away null characters without using up space in the buffer (which most
 | |
| terminals do).  If enough padding is used, no output can ever be lost.  The
 | |
| right amount of padding avoids loss of output without slowing down
 | |
| operation, since the time used to transmit padding is time that nothing
 | |
| else could be done.
 | |
| 
 | |
| The number of padding characters needed for an operation depends on the
 | |
| line speed.  In fact, it is proportional to the line speed.  A 9600 baud
 | |
| line transmits about one character per msec, so the clear screen command in
 | |
| the example above would need about 20 characters of padding.  At 1200 baud,
 | |
| however, only about 3 characters of padding are needed to fill up 20msec.
 | |
| 
 | |
| @node Not Enough, Describe Padding, Why Pad, Padding
 | |
| @subsection When There Is Not Enough Padding
 | |
| 
 | |
| There are several common manifestations of insufficient padding.
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Emacs displays @samp{I-search: ^Q-} at the bottom of the screen.
 | |
| 
 | |
| This means that the terminal thought its buffer was getting full of
 | |
| display commands, so it tried to tell the computer to stop sending
 | |
| any.
 | |
| 
 | |
| @item
 | |
| The screen is garbled intermittently, or the details of garbling vary
 | |
| when you repeat the action.  (A garbled screen could be due to a
 | |
| command which is simply incorrect, or to user option in the terminal
 | |
| which doesn't match the assumptions of the terminal description, but
 | |
| this usually leads to reproducible failure.)
 | |
| 
 | |
| This means that the buffer did get full, and some commands were lost.
 | |
| Many changeable factors can change which ones are lost.
 | |
| 
 | |
| @item
 | |
| Screen is garbled at high output speeds but not at low speeds.
 | |
| Padding problems nearly always go away at low speeds, usually even at
 | |
| 1200 baud.
 | |
| 
 | |
| This means that a high enough speed permits commands to arrive faster
 | |
| than they can be executed.
 | |
| @end itemize
 | |
| 
 | |
| Although any obscure command on an obscure terminal might lack padding,
 | |
| in practice problems arise most often from the clearing commands
 | |
| @samp{cl} and @samp{cd} (@pxref{Clearing}), the scrolling commands
 | |
| @samp{sf} and @samp{sr} (@pxref{Scrolling}), and the line insert/delete
 | |
| commands @samp{al} and @samp{dl} (@pxref{Insdel Line}).
 | |
| 
 | |
| Occasionally the terminal description fails to define @samp{sf} and some
 | |
| programs will use @samp{do} instead, so you may get a problem with
 | |
| @samp{do}.  If so, first define @samp{sf} just like @samp{do}, then
 | |
| add some padding to @samp{sf}.
 | |
| 
 | |
| The best strategy is to add a lot of padding at first, perhaps 200 msec.
 | |
| This is much more than enough; in fact, it should cause a visible slowdown.
 | |
| (If you don't see a slowdown, the change has not taken effect;
 | |
| @pxref{Changing}.)  If this makes the problem go away, you have found the
 | |
| right place to add padding; now reduce the amount until the problem comes
 | |
| back, then increase it again.  If the problem remains, either it is in some
 | |
| other capability or it is not a matter of padding at all.
 | |
| 
 | |
| Keep in mind that on many terminals the correct padding for insert/delete
 | |
| line or for scrolling is cursor-position dependent.  If you get problems
 | |
| from scrolling a large region of the screen but not from scrolling a small
 | |
| part (just a few lines moving), it may mean that fixed padding should be
 | |
| replaced with position-dependent padding.
 | |
| 
 | |
| @node Describe Padding, Output Padding, Not Enough, Padding
 | |
| @subsection Specifying Padding in a Terminal Description
 | |
| 
 | |
| In the terminal description, the amount of padding required by each display
 | |
| command is recorded as a sequence of digits at the front of the command.
 | |
| These digits specify the padding time in milliseconds (msec).  They can be
 | |
| followed optionally by a decimal point and one more digit, which is a
 | |
| number of tenths of msec.
 | |
| 
 | |
| Sometimes the padding needed by a command depends on the cursor position.
 | |
| For example, the time taken by an ``insert line'' command is usually
 | |
| proportional to the number of lines that need to be moved down or cleared.
 | |
| An asterisk (@samp{*}) following the padding time says that the time
 | |
| should be multiplied by the number of screen lines affected by the command.
 | |
| 
 | |
| @example
 | |
| :al=1.3*\E[L:
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| is used to describe the ``insert line'' command for a certain terminal.
 | |
| The padding required is 1.3 msec per line affected.  The command itself is
 | |
| @samp{@key{ESC} [ L}.
 | |
| 
 | |
| The padding time specified in this way tells @code{tputs} how many pad
 | |
| characters to output.  @xref{Output Padding}.
 | |
| 
 | |
| Two special capability values affect padding for all commands.  These are
 | |
| the @samp{pc} and @samp{pb}.  The variable @samp{pc} specifies the
 | |
| character to pad with, and @samp{pb} the speed below which no padding is
 | |
| needed.  The defaults for these variables, a null character and 0,
 | |
| are correct for most terminals.  @xref{Pad Specs}.
 | |
| 
 | |
| @node Output Padding,  , Describe Padding, Padding
 | |
| @subsection Performing Padding with @code{tputs}
 | |
| @cindex line speed
 | |
| 
 | |
| @findex tputs
 | |
| Use the termcap function @code{tputs} to output a string containing an
 | |
| optional padding spec of the form described above (@pxref{Describe
 | |
| Padding}).  The function @code{tputs} strips off and decodes the padding
 | |
| spec, outputs the rest of the string, and then outputs the appropriate
 | |
| padding.  Here is its declaration in ANSI C:
 | |
| 
 | |
| @example
 | |
| char PC;
 | |
| short ospeed;
 | |
| 
 | |
| int tputs (char *@var{string}, int @var{nlines}, int (*@var{outfun}) ());
 | |
| @end example
 | |
| 
 | |
| Here @var{string} is the string (including padding spec) to be output;
 | |
| @var{nlines} is the number of lines affected by the operation, which is
 | |
| used to multiply the amount of padding if the padding spec ends with a
 | |
| @samp{*}.  Finally, @var{outfun} is a function (such as @code{fputchar})
 | |
| that is called to output each character.  When actually called,
 | |
| @var{outfun} should expect one argument, a character.
 | |
| 
 | |
| @vindex ospeed
 | |
| @vindex PC
 | |
| The operation of @code{tputs} is controlled by two global variables,
 | |
| @code{ospeed} and @code{PC}.  The value of @code{ospeed} is supposed to be
 | |
| the terminal output speed, encoded as in the @code{ioctl} system call which
 | |
| gets the speed information.  This is needed to compute the number of
 | |
| padding characters.  The value of @code{PC} is the character used for
 | |
| padding.
 | |
| 
 | |
| You are responsible for storing suitable values into these variables before
 | |
| using @code{tputs}.  The value stored into the @code{PC} variable should be
 | |
| taken from the @samp{pc} capability in the terminal description (@pxref{Pad
 | |
| Specs}).  Store zero in @code{PC} if there is no @samp{pc}
 | |
| capability.@refill
 | |
| 
 | |
| The argument @var{nlines} requires some thought.  Normally, it should be
 | |
| the number of lines whose contents will be cleared or moved by the command.
 | |
| For cursor motion commands, or commands that do editing within one line,
 | |
| use the value 1.  For most commands that affect multiple lines, such as
 | |
| @samp{al} (insert a line) and @samp{cd} (clear from the cursor to the end
 | |
| of the screen), @var{nlines} should be the screen height minus the current
 | |
| vertical position (origin 0).  For multiple insert and scroll commands such
 | |
| as @samp{AL} (insert multiple lines), that same value for @var{nlines} is
 | |
| correct; the number of lines being inserted is @i{not} correct.@refill
 | |
| 
 | |
| If a ``scroll window'' feature is used to reduce the number of lines
 | |
| affected by a command, the value of @var{nlines} should take this into
 | |
| account.  This is because the delay time required depends on how much work
 | |
| the terminal has to do, and the scroll window feature reduces the work.
 | |
| @xref{Scrolling}.
 | |
| 
 | |
| Commands such as @samp{ic} and @samp{dc} (insert or delete characters) are
 | |
| problematical because the padding needed by these commands is proportional
 | |
| to the number of characters affected, which is the number of columns from
 | |
| the cursor to the end of the line.  It would be nice to have a way to
 | |
| specify such a dependence, and there is no need for dependence on vertical
 | |
| position in these commands, so it is an obvious idea to say that for these
 | |
| commands @var{nlines} should really be the number of columns affected.
 | |
| However, the definition of termcap clearly says that @var{nlines} is always
 | |
| the number of lines affected, even in this case, where it is always 1.  It
 | |
| is not easy to change this rule now, because too many programs and terminal
 | |
| descriptions have been written to follow it.
 | |
| 
 | |
| Because @var{nlines} is always 1 for the @samp{ic} and @samp{dc} strings,
 | |
| there is no reason for them to use @samp{*}, but some of them do.  These
 | |
| should be corrected by deleting the @samp{*}.  If, some day, such entries
 | |
| have disappeared, it may be possible to change to a more useful convention
 | |
| for the @var{nlines} argument for these operations without breaking any
 | |
| programs.
 | |
| 
 | |
| @node Parameters,  , Padding, Library
 | |
| @section Filling In Parameters
 | |
| @cindex parameters
 | |
| 
 | |
| Some terminal control strings require numeric @dfn{parameters}.  For
 | |
| example, when you move the cursor, you need to say what horizontal and
 | |
| vertical positions to move it to.  The value of the terminal's @samp{cm}
 | |
| capability, which says how to move the cursor, cannot simply be a string of
 | |
| characters; it must say how to express the cursor position numbers and
 | |
| where to put them within the command.
 | |
| 
 | |
| The specifications of termcap include conventions as to which string-valued
 | |
| capabilities require parameters, how many parameters, and what the
 | |
| parameters mean; for example, it defines the @samp{cm} string to take
 | |
| two parameters, the vertical and horizontal positions, with 0,0 being the
 | |
| upper left corner.  These conventions are described where the individual
 | |
| commands are documented.
 | |
| 
 | |
| Termcap also defines a language used within the capability definition for
 | |
| specifying how and where to encode the parameters for output.  This language
 | |
| uses character sequences starting with @samp{%}.  (This is the same idea as
 | |
| @code{printf}, but the details are different.)  The language for parameter
 | |
| encoding is described in this section.
 | |
| 
 | |
| A program that is doing display output calls the functions @code{tparam} or
 | |
| @code{tgoto} to encode parameters according to the specifications.  These
 | |
| functions produce a string containing the actual commands to be output (as
 | |
| well a padding spec which must be processed with @code{tputs};
 | |
| @pxref{Padding}).
 | |
| 
 | |
| @menu
 | |
| * Encode Parameters::  The language for encoding parameters.
 | |
| * Using Parameters::  Outputting a string command with parameters.
 | |
| @end menu
 | |
| 
 | |
| @node Encode Parameters, Using Parameters,  , Parameters
 | |
| @subsection Describing the Encoding
 | |
| @cindex %
 | |
| 
 | |
| A terminal command string that requires parameters contains special
 | |
| character sequences starting with @samp{%} to say how to encode the
 | |
| parameters.  These sequences control the actions of @code{tparam} and
 | |
| @code{tgoto}.
 | |
| 
 | |
| The parameters values passed to @code{tparam} or @code{tgoto} are
 | |
| considered to form a vector.  A pointer into this vector determines
 | |
| the next parameter to be processed.  Some of the @samp{%}-sequences
 | |
| encode one parameter and advance the pointer to the next parameter.
 | |
| Other @samp{%}-sequences alter the pointer or alter the parameter
 | |
| values without generating output.
 | |
| 
 | |
| For example, the @samp{cm} string for a standard ANSI terminal is written
 | |
| as @samp{\E[%i%d;%dH}.  (@samp{\E} stands for @key{ESC}.)  @samp{cm} by
 | |
| convention always requires two parameters, the vertical and horizontal goal
 | |
| positions, so this string specifies the encoding of two parameters.  Here
 | |
| @samp{%i} increments the two values supplied, and each @samp{%d} encodes
 | |
| one of the values in decimal.  If the cursor position values 20,58 are
 | |
| encoded with this string, the result is @samp{\E[21;59H}.
 | |
| 
 | |
| First, here are the @samp{%}-sequences that generate output.  Except for
 | |
| @samp{%%}, each of them encodes one parameter and advances the pointer
 | |
| to the following parameter.
 | |
| 
 | |
| @table @samp
 | |
| @item %%
 | |
| Output a single @samp{%}.  This is the only way to represent a literal
 | |
| @samp{%} in a terminal command with parameters.  @samp{%%} does not
 | |
| use up a parameter.
 | |
| 
 | |
| @item %d
 | |
| As in @code{printf}, output the next parameter in decimal.
 | |
| 
 | |
| @item %2
 | |
| Like @samp{%02d} in @code{printf}: output the next parameter in
 | |
| decimal, and always use at least two digits.
 | |
| 
 | |
| @item %3
 | |
| Like @samp{%03d} in @code{printf}: output the next parameter in
 | |
| decimal, and always use at least three digits.  Note that @samp{%4}
 | |
| and so on are @emph{not} defined.
 | |
| 
 | |
| @item %.
 | |
| Output the next parameter as a single character whose ASCII code is
 | |
| the parameter value.  Like @samp{%c} in @code{printf}.
 | |
| 
 | |
| @item %+@var{char}
 | |
| Add the next parameter to the character @var{char}, and output the
 | |
| resulting character.  For example, @samp{%+ } represents 0 as a space,
 | |
| 1 as @samp{!}, etc.
 | |
| @end table
 | |
| 
 | |
| The following @samp{%}-sequences specify alteration of the parameters
 | |
| (their values, or their order) rather than encoding a parameter for output.
 | |
| They generate no output; they are used only for their side effects
 | |
| on the parameters.  Also, they do not advance the ``next parameter'' pointer
 | |
| except as explicitly stated.  Only @samp{%i}, @samp{%r} and @samp{%>} are
 | |
| defined in standard Unix termcap.  The others are GNU extensions.@refill
 | |
| 
 | |
| @table @samp
 | |
| @item %i
 | |
| Increment the next two parameters.  This is used for terminals that
 | |
| expect cursor positions in origin 1.  For example, @samp{%i%d,%d} would
 | |
| output two parameters with @samp{1} for 0, @samp{2} for 1, etc.
 | |
| 
 | |
| @item %r
 | |
| Interchange the next two parameters.  This is used for terminals whose
 | |
| cursor positioning command expects the horizontal position first.
 | |
| 
 | |
| @item %s
 | |
| Skip the next parameter.  Do not output anything.
 | |
| 
 | |
| @item %b
 | |
| Back up one parameter.  The last parameter used will become once again
 | |
| the next parameter to be output, and the next output command will use
 | |
| it.  Using @samp{%b} more than once, you can back up any number of
 | |
| parameters, and you can refer to each parameter any number of times.
 | |
| 
 | |
| @item %>@var{c1}@var{c2}
 | |
| Conditionally increment the next parameter.  Here @var{c1} and
 | |
| @var{c2} are characters which stand for their ASCII codes as numbers.
 | |
| If the next parameter is greater than the ASCII code of @var{c1}, the
 | |
| ASCII code of @var{c2} is added to it.@refill
 | |
| 
 | |
| @item %a @var{op} @var{type} @var{pos}
 | |
| Perform arithmetic on the next parameter, do not use it up, and do not
 | |
| output anything.  Here @var{op} specifies the arithmetic operation,
 | |
| while @var{type} and @var{pos} together specify the other operand.
 | |
| 
 | |
| Spaces are used above to separate the operands for clarity; the spaces
 | |
| don't appear in the data base, where this sequence is exactly five
 | |
| characters long.
 | |
| 
 | |
| The character @var{op} says what kind of arithmetic operation to
 | |
| perform.  It can be any of these characters:
 | |
| 
 | |
| @table @samp
 | |
| @item =
 | |
| assign a value to the next parameter, ignoring its old value.
 | |
| The new value comes from the other operand.
 | |
| 
 | |
| @item +
 | |
| add the other operand to the next parameter.
 | |
| 
 | |
| @item -
 | |
| subtract the other operand from the next parameter.
 | |
| 
 | |
| @item *
 | |
| multiply the next parameter by the other operand.
 | |
| 
 | |
| @item /
 | |
| divide the next parameter by the other operand.
 | |
| @end table
 | |
| 
 | |
| The ``other operand'' may be another parameter's value or a constant;
 | |
| the character @var{type} says which.  It can be:
 | |
| 
 | |
| @table @samp
 | |
| @item p
 | |
| Use another parameter.  The character @var{pos} says which
 | |
| parameter to use.  Subtract 64 from its ASCII code to get the
 | |
| position of the desired parameter relative to this one.  Thus,
 | |
| the character @samp{A} as @var{pos} means the parameter after the
 | |
| next one; the character @samp{?} means the parameter before the
 | |
| next one.
 | |
| 
 | |
| @item c
 | |
| Use a constant value.  The character @var{pos} specifies the
 | |
| value of the constant.  The 0200 bit is cleared out, so that 0200
 | |
| can be used to represent zero.
 | |
| @end table
 | |
| @end table
 | |
| 
 | |
| The following @samp{%}-sequences are special purpose hacks to compensate
 | |
| for the weird designs of obscure terminals.  They modify the next parameter
 | |
| or the next two parameters but do not generate output and do not use up any
 | |
| parameters.  @samp{%m} is a GNU extension; the others are defined in
 | |
| standard Unix termcap.
 | |
| 
 | |
| @table @samp
 | |
| @item %n
 | |
| Exclusive-or the next parameter with 0140, and likewise the parameter
 | |
| after next.
 | |
| 
 | |
| @item %m
 | |
| Complement all the bits of the next parameter and the parameter after next.
 | |
| 
 | |
| @item %B
 | |
| Encode the next parameter in BCD.  It alters the value of the
 | |
| parameter by adding six times the quotient of the parameter by ten.
 | |
| Here is a C statement that shows how the new value is computed:
 | |
| 
 | |
| @example
 | |
| @var{parm} = (@var{parm} / 10) * 16 + @var{parm} % 10;
 | |
| @end example
 | |
| 
 | |
| @item %D
 | |
| Transform the next parameter as needed by Delta Data terminals.
 | |
| This involves subtracting twice the remainder of the parameter by 16.
 | |
| 
 | |
| @example
 | |
| @var{parm} -= 2 * (@var{parm} % 16);
 | |
| @end example
 | |
| @end table
 | |
| 
 | |
| @node Using Parameters,  , Encode Parameters, Parameters
 | |
| @subsection Sending Display Commands with Parameters
 | |
| 
 | |
| The termcap library functions @code{tparam} and @code{tgoto} serve as the
 | |
| analog of @code{printf} for terminal string parameters.  The newer function
 | |
| @code{tparam} is a GNU extension, more general but missing from Unix
 | |
| termcap.  The original parameter-encoding function is @code{tgoto}, which
 | |
| is preferable for cursor motion.
 | |
| 
 | |
| @menu
 | |
| * tparam::      The general case, for GNU termcap only.
 | |
| * tgoto::       The special case of cursor motion.
 | |
| @end menu
 | |
| 
 | |
| @node tparam, tgoto,  , Using Parameters
 | |
| @subsubsection @code{tparam}
 | |
| 
 | |
| @findex tparam
 | |
| The function @code{tparam} can encode display commands with any number of
 | |
| parameters and allows you to specify the buffer space.  It is the preferred
 | |
| function for encoding parameters for all but the @samp{cm} capability.  Its
 | |
| ANSI C declaration is as follows:
 | |
| 
 | |
| @smallexample
 | |
| char *tparam (char *@var{ctlstring}, char *@var{buffer}, int @var{size}, int @var{parm1},...)
 | |
| @end smallexample
 | |
| 
 | |
| The arguments are a control string @var{ctlstring} (the value of a terminal
 | |
| capability, presumably), an output buffer @var{buffer} and @var{size}, and
 | |
| any number of integer parameters to be encoded.  The effect of
 | |
| @code{tparam} is to copy the control string into the buffer, encoding
 | |
| parameters according to the @samp{%} sequences in the control string.
 | |
| 
 | |
| You describe the output buffer by its address, @var{buffer}, and its size
 | |
| in bytes, @var{size}.  If the buffer is not big enough for the data to be
 | |
| stored in it, @code{tparam} calls @code{malloc} to get a larger buffer.  In
 | |
| either case, @code{tparam} returns the address of the buffer it ultimately
 | |
| uses.  If the value equals @var{buffer}, your original buffer was used.
 | |
| Otherwise, a new buffer was allocated, and you must free it after you are
 | |
| done with printing the results.  If you pass zero for @var{size} and
 | |
| @var{buffer}, @code{tparam} always allocates the space with @code{malloc}.
 | |
| 
 | |
| All capabilities that require parameters also have the ability to specify
 | |
| padding, so you should use @code{tputs} to output the string produced by
 | |
| @code{tparam}.  @xref{Padding}.  Here is an example.
 | |
| 
 | |
| @example
 | |
| @{
 | |
| char *buf;
 | |
| char buffer[40];
 | |
| 
 | |
| buf = tparam (command, buffer, 40, parm);
 | |
| tputs (buf, 1, fputchar);
 | |
| if (buf != buffer)
 | |
| free (buf);
 | |
| @}
 | |
| @end example
 | |
| 
 | |
| If a parameter whose value is zero is encoded with @samp{%.}-style
 | |
| encoding, the result is a null character, which will confuse @code{tputs}.
 | |
| This would be a serious problem, but luckily @samp{%.} encoding is used
 | |
| only by a few old models of terminal, and only for the @samp{cm}
 | |
| capability.  To solve the problem, use @code{tgoto} rather than
 | |
| @code{tparam} to encode the @samp{cm} capability.@refill
 | |
| 
 | |
| @node tgoto,  , tparam, Using Parameters
 | |
| @subsubsection @code{tgoto}
 | |
| 
 | |
| @findex tgoto
 | |
| The special case of cursor motion is handled by @code{tgoto}.  There
 | |
| are two reasons why you might choose to use @code{tgoto}:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| For Unix compatibility, because Unix termcap does not have @code{tparam}.
 | |
| 
 | |
| @item
 | |
| For the @samp{cm} capability, since @code{tgoto} has a special feature
 | |
| to avoid problems with null characters, tabs and newlines on certain old
 | |
| terminal types that use @samp{%.} encoding for that capability.
 | |
| @end itemize
 | |
| 
 | |
| Here is how @code{tgoto} might be declared in ANSI C:
 | |
| 
 | |
| @example
 | |
| char *tgoto (char *@var{cstring}, int @var{hpos}, int @var{vpos})
 | |
| @end example
 | |
| 
 | |
| There are three arguments, the terminal description's @samp{cm} string and
 | |
| the two cursor position numbers; @code{tgoto} computes the parametrized
 | |
| string in an internal static buffer and returns the address of that buffer.
 | |
| The next time you use @code{tgoto} the same buffer will be reused.
 | |
| 
 | |
| @vindex UP
 | |
| @vindex BC
 | |
| Parameters encoded with @samp{%.} encoding can generate null characters,
 | |
| tabs or newlines.  These might cause trouble: the null character because
 | |
| @code{tputs} would think that was the end of the string, the tab because
 | |
| the kernel or other software might expand it into spaces, and the newline
 | |
| becaue the kernel might add a carriage-return, or padding characters
 | |
| normally used for a newline.  To prevent such problems, @code{tgoto} is
 | |
| careful to avoid these characters.  Here is how this works: if the target
 | |
| cursor position value is such as to cause a problem (that is to say, zero,
 | |
| nine or ten), @code{tgoto} increments it by one, then compensates by
 | |
| appending a string to move the cursor back or up one position.
 | |
| 
 | |
| The compensation strings to use for moving back or up are found in global
 | |
| variables named @code{BC} and @code{UP}.  These are actual external C
 | |
| variables with upper case names; they are declared @code{char *}.  It is up
 | |
| to you to store suitable values in them, normally obtained from the
 | |
| @samp{le} and @samp{up} terminal capabilities in the terminal description
 | |
| with @code{tgetstr}.  Alternatively, if these two variables are both zero,
 | |
| the feature of avoiding nulls, tabs and newlines is turned off.
 | |
| 
 | |
| It is safe to use @code{tgoto} for commands other than @samp{cm} only if
 | |
| you have stored zero in @code{BC} and @code{UP}.
 | |
| 
 | |
| Note that @code{tgoto} reverses the order of its operands: the horizontal
 | |
| position comes before the vertical position in the arguments to
 | |
| @code{tgoto}, even though the vertical position comes before the horizontal
 | |
| in the parameters of the @samp{cm} string.  If you use @code{tgoto} with a
 | |
| command such as @samp{AL} that takes one parameter, you must pass the
 | |
| parameter to @code{tgoto} as the ``vertical position''.@refill
 | |
| 
 | |
| @node Data Base, Capabilities, Library, Top
 | |
| @chapter The Format of the Data Base
 | |
| 
 | |
| The termcap data base of terminal descriptions is stored in the file
 | |
| @file{/etc/termcap}.  It contains terminal descriptions, blank lines, and
 | |
| comments.
 | |
| 
 | |
| A terminal description starts with one or more names for the terminal type.
 | |
| The information in the description is a series of @dfn{capability names}
 | |
| and values.  The capability names have standard meanings
 | |
| (@pxref{Capabilities}) and their values describe the terminal.
 | |
| 
 | |
| @menu
 | |
| * Format::      Overall format of a terminal description.
 | |
| * Capability Format::  Format of capabilities within a description.
 | |
| * Naming::      Naming conventions for terminal types.
 | |
| * Inheriting::  Inheriting part of a description from
 | |
| a related terminal type.
 | |
| * Changing::    When changes in the data base take effect.
 | |
| @end menu
 | |
| 
 | |
| @node Format, Capability Format,  , Data Base
 | |
| @section Terminal Description Format
 | |
| @cindex description format
 | |
| 
 | |
| Aside from comments (lines starting with @samp{#}, which are ignored), each
 | |
| nonblank line in the termcap data base is a terminal description.
 | |
| A terminal description is nominally a single line, but it can be split
 | |
| into multiple lines by inserting the two characters @samp{\ newline}.
 | |
| This sequence is ignored wherever it appears in a description.
 | |
| 
 | |
| The preferred way to split the description is between capabilities: insert
 | |
| the four characters @samp{: \ newline tab} immediately before any colon.
 | |
| This allows each sub-line to start with some indentation.  This works
 | |
| because, after the @samp{\ newline} are ignored, the result is @samp{: tab
 | |
| :}; the first colon ends the preceding capability and the second colon
 | |
| starts the next capability.  If you split with @samp{\ newline} alone, you
 | |
| may not add any indentation after them.
 | |
| 
 | |
| Here is a real example of a terminal description:
 | |
| 
 | |
| @example
 | |
| dw|vt52|DEC vt52:\
 | |
|         :cr=^M:do=^J:nl=^J:bl=^G:\
 | |
|         :le=^H:bs:cd=\EJ:ce=\EK:cl=\EH\EJ:\
 | |
|         :cm=\EY%+ %+ :co#80:li#24:\
 | |
|         :nd=\EC:ta=^I:pt:sr=\EI:up=\EA:\
 | |
|         :ku=\EA:kd=\EB:kr=\EC:kl=\ED:kb=^H:
 | |
| @end example
 | |
| 
 | |
| Each terminal description begins with several names for the terminal type.
 | |
| The names are separated by @samp{|} characters, and a colon ends the last
 | |
| name.  The first name should be two characters long; it exists only for the
 | |
| sake of very old Unix systems and is never used in modern systems.  The
 | |
| last name should be a fully verbose name such as ``DEC vt52'' or ``Ann
 | |
| Arbor Ambassador with 48 lines''.  The other names should include whatever
 | |
| the user ought to be able to specify to get this terminal type, such as
 | |
| @samp{vt52} or @samp{aaa-48}.  @xref{Naming}, for information on how to
 | |
| choose terminal type names.
 | |
| 
 | |
| After the terminal type names come the terminal capabilities, separated by
 | |
| colons and with a colon after the last one.  Each capability has a
 | |
| two-letter name, such as @samp{cm} for ``cursor motion string'' or @samp{li}
 | |
| for ``number of display lines''.
 | |
| 
 | |
| @node Capability Format, Naming, Format, Data Base
 | |
| @section Writing the Capabilities
 | |
| 
 | |
| There are three kinds of capabilities: flags, numbers, and strings.  Each
 | |
| kind has its own way of being written in the description.  Each defined
 | |
| capability has by convention a particular kind of value; for example,
 | |
| @samp{li} always has a numeric value and @samp{cm} always a string value.
 | |
| 
 | |
| A flag capability is thought of as having a boolean value: the value is
 | |
| true if the capability is present, false if not.  When the capability is
 | |
| present, just write its name between two colons.
 | |
| 
 | |
| A numeric capability has a value which is a nonnegative number.  Write the
 | |
| capability name, a @samp{#}, and the number, between two colons.  For
 | |
| example, @samp{@dots{}:li#48:@dots{}} is how you specify the @samp{li}
 | |
| capability for 48 lines.@refill
 | |
| 
 | |
| A string-valued capability has a value which is a sequence of characters.
 | |
| Usually these are the characters used to perform some display operation.
 | |
| Write the capability name, a @samp{=}, and the characters of the value,
 | |
| between two colons.  For example, @samp{@dots{}:cm=\E[%i%d;%dH:@dots{}} is
 | |
| how the cursor motion command for a standard ANSI terminal would be
 | |
| specified.@refill
 | |
| 
 | |
| Special characters in the string value can be expressed using
 | |
| @samp{\}-escape sequences as in C; in addition, @samp{\E} stands for
 | |
| @key{ESC}.  @samp{^} is also a kind of escape character; @samp{^} followed
 | |
| by @var{char} stands for the control-equivalent of @var{char}.  Thus,
 | |
| @samp{^a} stands for the character control-a, just like @samp{\001}.
 | |
| @samp{\} and @samp{^} themselves can be represented as @samp{\\} and
 | |
| @samp{\^}.@refill
 | |
| 
 | |
| To include a colon in the string, you must write @samp{\072}.  You might
 | |
| ask, ``Why can't @samp{\:} be used to represent a colon?''  The reason is
 | |
| that the interrogation functions do not count slashes while looking for a
 | |
| capability.  Even if @samp{:ce=ab\:cd:} were interpreted as giving the
 | |
| @samp{ce} capability the value @samp{ab:cd}, it would also appear to define
 | |
| @samp{cd} as a flag.
 | |
| 
 | |
| The string value will often contain digits at the front to specify padding
 | |
| (@pxref{Padding}) and/or @samp{%}-sequences within to specify how to encode
 | |
| parameters (@pxref{Parameters}).  Although these things are not to be
 | |
| output literally to the terminal, they are considered part of the value of
 | |
| the capability.  They are special only when the string value is processed
 | |
| by @code{tputs}, @code{tparam} or @code{tgoto}.  By contrast, @samp{\} and
 | |
| @samp{^} are considered part of the syntax for specifying the characters
 | |
| in the string.
 | |
| 
 | |
| Let's look at the VT52 example again:
 | |
| 
 | |
| @example
 | |
| dw|vt52|DEC vt52:\
 | |
|         :cr=^M:do=^J:nl=^J:bl=^G:\
 | |
|         :le=^H:bs:cd=\EJ:ce=\EK:cl=\EH\EJ:\
 | |
|         :cm=\EY%+ %+ :co#80:li#24:\     
 | |
|         :nd=\EC:ta=^I:pt:sr=\EI:up=\EA:\
 | |
|         :ku=\EA:kd=\EB:kr=\EC:kl=\ED:kb=^H:
 | |
| @end example
 | |
| 
 | |
| Here we see the numeric-valued capabilities @samp{co} and @samp{li}, the
 | |
| flags @samp{bs} and @samp{pt}, and many string-valued capabilities.  Most
 | |
| of the strings start with @key{ESC} represented as @samp{\E}.  The rest
 | |
| contain control characters represented using @samp{^}.  The meanings of the
 | |
| individual capabilities are defined elsewhere (@pxref{Capabilities}).
 | |
| 
 | |
| @node Naming, Inheriting, Capability Format, Data Base
 | |
| @section Terminal Type Name Conventions
 | |
| @cindex names of terminal types
 | |
| 
 | |
| There are conventions for choosing names of terminal types.  For one thing,
 | |
| all letters should be in lower case.  The terminal type for a terminal in
 | |
| its most usual or most fundamental mode of operation should not have a
 | |
| hyphen in it.
 | |
| 
 | |
| If the same terminal has other modes of operation which require
 | |
| different terminal descriptions, these variant descriptions are given
 | |
| names made by adding suffixes with hyphens.  Such alternate descriptions
 | |
| are used for two reasons:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| When the terminal has a switch that changes its behavior.  Since the
 | |
| computer cannot tell how the switch is set, the user must tell the
 | |
| computer by choosing the appropriate terminal type name.
 | |
| 
 | |
| @cindex wrapping
 | |
| For example, the VT-100 has a setup flag that controls whether the
 | |
| cursor wraps at the right margin.  If this flag is set to ``wrap'',
 | |
| you must use the terminal type @samp{vt100-am}.  Otherwise you must
 | |
| use @samp{vt100-nam}.  Plain @samp{vt100} is defined as a synonym for
 | |
| either @samp{vt100-am} or @samp{vt100-nam} depending on the
 | |
| preferences of the local site.@refill
 | |
| 
 | |
| The standard suffix @samp{-am} stands for ``automatic margins''.
 | |
| 
 | |
| @item
 | |
| To give the user a choice in how to use the terminal.  This is done
 | |
| when the terminal has a switch that the computer normally controls.
 | |
| 
 | |
| @cindex screen size
 | |
| For example, the Ann Arbor Ambassador can be configured with many
 | |
| screen sizes ranging from 20 to 60 lines.  Fewer lines make bigger
 | |
| characters but more lines let you see more of what you are editing.
 | |
| As a result, users have different preferences.  Therefore, termcap
 | |
| provides terminal types for many screen sizes.  If you choose type
 | |
| @samp{aaa-30}, the terminal will be configured to use 30 lines; if you
 | |
| choose @samp{aaa-48}, 48 lines will be used, and so on.
 | |
| @end itemize
 | |
| 
 | |
| Here is a list of standard suffixes and their conventional meanings:
 | |
| 
 | |
| @table @samp
 | |
| @item -w
 | |
| Short for ``wide''.  This is a mode that gives the terminal more
 | |
| columns than usual.  This is normally a user option.
 | |
| 
 | |
| @item -am
 | |
| ``Automatic margins''.  This is an alternate description for use when
 | |
| the terminal's margin-wrap switch is on; it contains the @samp{am}
 | |
| flag.  The implication is that normally the switch is off and the
 | |
| usual description for the terminal says that the switch is off.
 | |
| 
 | |
| @item -nam
 | |
| ``No automatic margins''.  The opposite of @samp{-am}, this names an
 | |
| alternative description which lacks the @samp{am} flag.  This implies
 | |
| that the terminal is normally operated with the margin-wrap switch
 | |
| turned on, and the normal description of the terminal says so.
 | |
| 
 | |
| @item -na
 | |
| ``No arrows''.  This terminal description initializes the terminal to
 | |
| keep its arrow keys in local mode.  This is a user option.
 | |
| 
 | |
| @item -rv
 | |
| ``Reverse video''.  This terminal description causes text output for
 | |
| normal video to appear as reverse, and text output for reverse video
 | |
| to come out as normal.  Often this description differs from the usual
 | |
| one by interchanging the two strings which turn reverse video on and
 | |
| off.@refill
 | |
| 
 | |
| This is a user option; you can choose either the ``reverse video''
 | |
| variant terminal type or the normal terminal type, and termcap will
 | |
| obey.
 | |
| 
 | |
| @item -s
 | |
| ``Status''.  Says to enable use of a status line which ordinary output
 | |
| does not touch (@pxref{Status Line}).
 | |
| 
 | |
| Some terminals have a special line that is used only as a status line.
 | |
| For these terminals, there is no need for an @samp{-s} variant; the
 | |
| status line commands should be defined by default.  On other
 | |
| terminals, enabling a status line means removing one screen line from
 | |
| ordinary use and reducing the effective screen height.  For these
 | |
| terminals, the user can choose the @samp{-s} variant type to request
 | |
| use of a status line.
 | |
| 
 | |
| @item -@var{nlines}
 | |
| Says to operate with @var{nlines} lines on the screen, for terminals
 | |
| such as the Ambassador which provide this as an option.  Normally this
 | |
| is a user option; by choosing the terminal type, you control how many
 | |
| lines termcap will use.
 | |
| 
 | |
| @item -@var{npages}p
 | |
| Says that the terminal has @var{npages} pages worth of screen memory,
 | |
| for terminals where this is a hardware option.
 | |
| 
 | |
| @item -unk
 | |
| Says that description is not for direct use, but only for reference in
 | |
| @samp{tc} capabilities.  Such a description is a kind of subroutine,
 | |
| because it describes the common characteristics of several variant
 | |
| descriptions that would use other suffixes in place of @samp{-unk}.
 | |
| @end table
 | |
| 
 | |
| @node Inheriting, Changing, Naming, Data Base
 | |
| @section Inheriting from Related Descriptions
 | |
| 
 | |
| @cindex inheritance
 | |
| When two terminal descriptions are similar, their identical parts do not
 | |
| need to be given twice.  Instead, one of the two can be defined in terms of
 | |
| the other, using the @samp{tc} capability.  We say that one description
 | |
| @dfn{refers to} the other, or @dfn{inherits from} the other.
 | |
| 
 | |
| The @samp{tc} capability must be the last one in the terminal description,
 | |
| and its value is a string which is the name of another terminal type which
 | |
| is referred to.  For example,
 | |
| 
 | |
| @example
 | |
| N9|aaa|ambassador|aaa-30|ann arbor ambassador/30 lines:\
 | |
|         :ti=\E[2J\E[30;0;0;30p:\
 | |
|         :te=\E[60;0;0;30p\E[30;1H\E[J:\
 | |
|         :li#30:tc=aaa-unk:
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| defines the terminal type @samp{aaa-30} (also known as plain @samp{aaa}) in
 | |
| terms of @samp{aaa-unk}, which defines everything about the Ambassador that
 | |
| is independent of screen height.  The types @samp{aaa-36}, @samp{aaa-48}
 | |
| and so on for other screen heights are likewise defined to inherit from
 | |
| @samp{aaa-unk}.
 | |
| 
 | |
| The capabilities overridden by @samp{aaa-30} include @samp{li}, which says
 | |
| how many lines there are, and @samp{ti} and @samp{te}, which configure the
 | |
| terminal to use that many lines.
 | |
| 
 | |
| The effective terminal description for type @samp{aaa} consists of the text
 | |
| shown above followed by the text of the description of @samp{aaa-unk}.  The
 | |
| @samp{tc} capability is handled automatically by @code{tgetent}, which
 | |
| finds the description thus referenced and combines the two descriptions
 | |
| (@pxref{Find}).  Therefore, only the implementor of the terminal
 | |
| descriptions needs to think about using @samp{tc}.  Users and application
 | |
| programmers do not need to be concerned with it.
 | |
| 
 | |
| Since the reference terminal description is used last, capabilities
 | |
| specified in the referring description override any specifications of the
 | |
| same capabilities in the reference description.
 | |
| 
 | |
| The referring description can cancel out a capability without specifying
 | |
| any new value for it by means of a special trick.  Write the capability in
 | |
| the referring description, with the character @samp{@@} after the capability
 | |
| name, as follows:
 | |
| 
 | |
| @smallexample
 | |
| NZ|aaa-30-nam|ann arbor ambassador/30 lines/no automatic-margins:\
 | |
|         :am@@:tc=aaa-30:
 | |
| @end smallexample
 | |
| 
 | |
| @node Changing,  , Inheriting, Data Base
 | |
| @section When Changes in the Data Base Take Effect
 | |
| 
 | |
| Each application program must read the terminal description from the
 | |
| data base, so a change in the data base is effective for all jobs started
 | |
| after the change is made.
 | |
| 
 | |
| The change will usually have no effect on a job that have been in existence
 | |
| since before the change. The program probably read the terminal description
 | |
| once, when it was started, and is continuing to use what it read then.
 | |
| If the program does not have a feature for reexamining the data base, then
 | |
| you will need to run it again (probably killing the old job).
 | |
| 
 | |
| If the description in use is coming from the @code{TERMCAP} environment
 | |
| variable, then the data base file is effectively overridden, and changes in
 | |
| it will have no effect until you change the @code{TERMCAP} variable as
 | |
| well.  For example, some users' @file{.login} files automatically copy the
 | |
| terminal description into @code{TERMCAP} to speed startup of applications.
 | |
| If you have done this, you will need to change the @code{TERMCAP} variable
 | |
| to make the changed data base take effect.
 | |
| 
 | |
| @node Capabilities, Summary, Data Base, Top
 | |
| @chapter Definitions of the Terminal Capabilities
 | |
| 
 | |
| This section is divided into many subsections, each for one aspect of
 | |
| use of display terminals.  For writing a display program, you usually need
 | |
| only check the subsections for the operations you want to use.  For writing
 | |
| a terminal description, you must read each subsection and fill in the
 | |
| capabilities described there.
 | |
| 
 | |
| String capabilities that are display commands may require numeric
 | |
| parameters (@pxref{Parameters}).  Most such capabilities do not use
 | |
| parameters.  When a capability requires parameters, this is explicitly
 | |
| stated at the beginning of its definition.  In simple cases, the first or
 | |
| second sentence of the definition mentions all the parameters, in the order
 | |
| they should be given, using a name
 | |
| @iftex
 | |
| in italics
 | |
| @end iftex
 | |
| @ifinfo
 | |
| in upper case
 | |
| @end ifinfo
 | |
| for each one.  For example, the @samp{rp} capability is a command that
 | |
| requires two parameters; its definition begins as follows:
 | |
| 
 | |
| @quotation
 | |
| String of commands to output a graphic character @var{c}, repeated @var{n}
 | |
| times.
 | |
| @end quotation
 | |
| 
 | |
| In complex cases or when there are many parameters, they are described
 | |
| explicitly.
 | |
| 
 | |
| When a capability is described as obsolete, this means that programs should
 | |
| not be written to look for it, but terminal descriptions should still be
 | |
| written to provide it.
 | |
| 
 | |
| When a capability is described as very obsolete, this means that it should
 | |
| be omitted from terminal descriptions as well.
 | |
| 
 | |
| @menu
 | |
| * Basic::       Basic characteristics.
 | |
| * Screen Size::  Screen size, and what happens when it changes.
 | |
| * Cursor Motion::  Various ways to move the cursor.
 | |
| * Wrapping::    What happens if you write a character in the last column.
 | |
| * Scrolling::   Pushing text up and down on the screen.
 | |
| * Windows::     Limiting the part of the window that output affects.
 | |
| * Clearing::    Erasing one or many lines.
 | |
| * Insdel Line::  Making new blank lines in mid-screen; deleting lines.
 | |
| * Insdel Char::  Inserting and deleting characters within a line.
 | |
| * Standout::    Highlighting some of the text.
 | |
| * Underlining::  Underlining some of the text.
 | |
| * Cursor Visibility::  Making the cursor more or less easy to spot.
 | |
| * Bell::        Attracts user's attention; not localized on the screen.
 | |
| * Keypad::      Recognizing when function keys or arrows are typed.
 | |
| * Meta Key::    @key{META} acts like an extra shift key.
 | |
| * Initialization::  Commands used to initialize or reset the terminal.
 | |
| * Pad Specs::   Info for the kernel on how much padding is needed.
 | |
| * Status Line::  A status line displays ``background'' information.
 | |
| * Half-Line::   Moving by half-lines, for superscripts and subscripts.
 | |
| * Printer::     Controlling auxiliary printers of display terminals.
 | |
| @end menu
 | |
| 
 | |
| @node Basic, Screen Size,  , Capabilities
 | |
| @section Basic Characteristics
 | |
| 
 | |
| This section documents the capabilities that describe the basic and
 | |
| nature of the terminal, and also those that are relevant to the output
 | |
| of graphic characters.
 | |
| 
 | |
| @table @samp
 | |
| @item os
 | |
| @kindex os
 | |
| @cindex overstrike
 | |
| Flag whose presence means that the terminal can overstrike.  This
 | |
| means that outputting a graphic character does not erase whatever was
 | |
| present in the same character position before.  The terminals that can
 | |
| overstrike include printing terminals, storage tubes (all obsolete
 | |
| nowadays), and many bit-map displays.
 | |
| 
 | |
| @item eo
 | |
| @kindex eo
 | |
| Flag whose presence means that outputting a space erases a character
 | |
| position even if the terminal supports overstriking.  If this flag is
 | |
| not present and overstriking is supported, output of a space has no
 | |
| effect except to move the cursor.
 | |
| 
 | |
| (On terminals that do not support overstriking, you can always assume
 | |
| that outputting a space at a position erases whatever character was
 | |
| previously displayed there.)
 | |
| 
 | |
| @item gn
 | |
| @kindex gn
 | |
| @cindex generic terminal type
 | |
| Flag whose presence means that this terminal type is a generic type
 | |
| which does not really describe any particular terminal.  Generic types
 | |
| are intended for use as the default type assigned when the user
 | |
| connects to the system, with the intention that the user should
 | |
| specify what type he really has.  One example of a generic type
 | |
| is the type @samp{network}.
 | |
| 
 | |
| Since the generic type cannot say how to do anything interesting with
 | |
| the terminal, termcap-using programs will always find that the
 | |
| terminal is too weak to be supported if the user has failed to specify
 | |
| a real terminal type in place of the generic one.  The @samp{gn} flag
 | |
| directs these programs to use a different error message: ``You have
 | |
| not specified your real terminal type'', rather than ``Your terminal
 | |
| is not powerful enough to be used''.
 | |
| 
 | |
| @item hc
 | |
| @kindex hc
 | |
| Flag whose presence means this is a hardcopy terminal.
 | |
| 
 | |
| @item rp
 | |
| @kindex rp
 | |
| @cindex repeat output
 | |
| String of commands to output a graphic character @var{c}, repeated @var{n}
 | |
| times.  The first parameter value is the ASCII code for the desired
 | |
| character, and the second parameter is the number of times to repeat the
 | |
| character.  Often this command requires padding proportional to the 
 | |
| number of times the character is repeated.  This effect can be had by
 | |
| using parameter arithmetic with @samp{%}-sequences to compute the
 | |
| amount of padding, then generating the result as a number at the front
 | |
| of the string so that @code{tputs} will treat it as padding.
 | |
| 
 | |
| @item hz
 | |
| @kindex hz
 | |
| Flag whose presence means that the ASCII character @samp{~} cannot be
 | |
| output on this terminal because it is used for display commands.
 | |
| 
 | |
| Programs handle this flag by checking all text to be output and
 | |
| replacing each @samp{~} with some other character(s).  If this is not
 | |
| done, the screen will be thoroughly garbled.
 | |
| 
 | |
| The old Hazeltine terminals that required such treatment are probably
 | |
| very rare today, so you might as well not bother to support this flag.
 | |
| 
 | |
| @item CC
 | |
| @kindex CC
 | |
| @cindex command character
 | |
| String whose presence means the terminal has a settable command
 | |
| character.  The value of the string is the default command character
 | |
| (which is usually @key{ESC}).
 | |
| 
 | |
| All the strings of commands in the terminal description should be
 | |
| written to use the default command character.  If you are writing an
 | |
| application program that changes the command character, use the
 | |
| @samp{CC} capability to figure out how to translate all the display
 | |
| commands to work with the new command character.
 | |
| 
 | |
| Most programs have no reason to look at the @samp{CC} capability.
 | |
| 
 | |
| @item xb
 | |
| @kindex xb
 | |
| @cindex Superbee
 | |
| Flag whose presence identifies Superbee terminals which are unable to
 | |
| transmit the characters @key{ESC} and @kbd{Control-C}.  Programs which
 | |
| support this flag are supposed to check the input for the code sequences
 | |
| sent by the @key{F1} and @key{F2} keys, and pretend that @key{ESC}
 | |
| or @kbd{Control-C} (respectively) had been read.  But this flag is
 | |
| obsolete, and not worth supporting.
 | |
| @end table
 | |
| 
 | |
| @node Screen Size, Cursor Motion, Basic, Capabilities
 | |
| @section Screen Size
 | |
| @cindex screen size
 | |
| 
 | |
| A terminal description has two capabilities, @samp{co} and @samp{li},
 | |
| that describe the screen size in columns and lines.  But there is more
 | |
| to the question of screen size than this.
 | |
| 
 | |
| On some operating systems the ``screen'' is really a window and the
 | |
| effective width can vary.  On some of these systems, @code{tgetnum}
 | |
| uses the actual width of the window to decide what value to return for
 | |
| the @samp{co} capability, overriding what is actually written in the
 | |
| terminal description.  On other systems, it is up to the application
 | |
| program to check the actual window width using a system call.  For
 | |
| example, on BSD 4.3 systems, the system call @code{ioctl} with code
 | |
| @code{TIOCGWINSZ} will tell you the current screen size.
 | |
| 
 | |
| On all window systems, termcap is powerless to advise the application
 | |
| program if the user resizes the window.  Application programs must
 | |
| deal with this possibility in a system-dependent fashion.  On some
 | |
| systems the C shell handles part of the problem by detecting changes
 | |
| in window size and setting the @code{TERMCAP} environment variable
 | |
| appropriately.  This takes care of application programs that are
 | |
| started subsequently.  It does not help application programs already
 | |
| running.
 | |
| 
 | |
| On some systems, including BSD 4.3, all programs using a terminal get
 | |
| a signal named @code{SIGWINCH} whenever the screen size changes.
 | |
| Programs that use termcap should handle this signal by using
 | |
| @code{ioctl TIOCGWINSZ} to learn the new screen size.
 | |
| 
 | |
| @table @samp
 | |
| @item co
 | |
| @kindex co
 | |
| @cindex screen size
 | |
| Numeric value, the width of the screen in character positions.  Even
 | |
| hardcopy terminals normally have a @samp{co} capability.
 | |
| 
 | |
| @item li
 | |
| @kindex li
 | |
| Numeric value, the height of the screen in lines.
 | |
| @end table
 | |
| 
 | |
| @node Cursor Motion, Wrapping, Screen Size, Capabilities
 | |
| @section Cursor Motion
 | |
| @cindex cursor motion
 | |
| 
 | |
| Termcap assumes that the terminal has a @dfn{cursor}, a spot on the screen
 | |
| where a visible mark is displayed, and that most display commands take
 | |
| effect at the position of the cursor.  It follows that moving the cursor
 | |
| to a specified location is very important.
 | |
| 
 | |
| There are many terminal capabilities for different cursor motion
 | |
| operations.  A terminal description should define as many as possible, but
 | |
| most programs do not need to use most of them.  One capability, @samp{cm},
 | |
| moves the cursor to an arbitrary place on the screen; this by itself is
 | |
| sufficient for any application as long as there is no need to support
 | |
| hardcopy terminals or certain old, weak displays that have only relative
 | |
| motion commands.  Use of other cursor motion capabilities is an
 | |
| optimization, enabling the program to output fewer characters in some
 | |
| common cases.
 | |
| 
 | |
| If you plan to use the relative cursor motion commands in an application
 | |
| program, you must know what the starting cursor position is.  To do this,
 | |
| you must keep track of the cursor position and update the records each
 | |
| time anything is output to the terminal, including graphic characters.
 | |
| In addition, it is necessary to know whether the terminal wraps after
 | |
| writing in the rightmost column.  @xref{Wrapping}.
 | |
| 
 | |
| One other motion capability needs special mention: @samp{nw} moves the
 | |
| cursor to the beginning of the following line, perhaps clearing all the
 | |
| starting line after the cursor, or perhaps not clearing at all.  This
 | |
| capability is a least common denominator that is probably supported even by
 | |
| terminals that cannot do most other things such as @samp{cm} or @samp{do}.
 | |
| Even hardcopy terminals can support @samp{nw}.
 | |
| 
 | |
| @table @asis
 | |
| @item @samp{cm}
 | |
| @kindex cm
 | |
| String of commands to position the cursor at line @var{l}, column @var{c}.
 | |
| Both parameters are origin-zero, and are defined relative to the
 | |
| screen, not relative to display memory.
 | |
| 
 | |
| All display terminals except a few very obsolete ones support @samp{cm},
 | |
| so it is acceptable for an application program to refuse to operate on
 | |
| terminals lacking @samp{cm}.
 | |
| 
 | |
| @item @samp{ho}
 | |
| @kindex ho
 | |
| @cindex home position
 | |
| String of commands to move the cursor to the upper left corner of the
 | |
| screen (this position is called the @dfn{home position}).  In
 | |
| terminals where the upper left corner of the screen is not the same as
 | |
| the beginning of display memory, this command must go to the upper
 | |
| left corner of the screen, not the beginning of display memory.
 | |
| 
 | |
| Every display terminal supports this capability, and many application
 | |
| programs refuse to operate if the @samp{ho} capability is missing.
 | |
| 
 | |
| @item @samp{ll}
 | |
| @kindex ll
 | |
| String of commands to move the cursor to the lower left corner of the
 | |
| screen.  On some terminals, moving up from home position does this,
 | |
| but programs should never assume that will work.  Just output the
 | |
| @samp{ll} string (if it is provided); if moving to home position and
 | |
| then moving up is the best way to get there, the @samp{ll} command
 | |
| will do that.
 | |
| 
 | |
| @item @samp{cr}
 | |
| @kindex cr
 | |
| String of commands to move the cursor to the beginning of the line it
 | |
| is on.  If this capability is not specified, many programs assume
 | |
| they can use the ASCII carriage return character for this.
 | |
| 
 | |
| @item @samp{le}
 | |
| @kindex le
 | |
| String of commands to move the cursor left one column.  Unless the
 | |
| @samp{bw} flag capability is specified, the effect is undefined if the
 | |
| cursor is at the left margin; do not use this command there.  If
 | |
| @samp{bw} is present, this command may be used at the left margin, and
 | |
| it wraps the cursor to the last column of the preceding line.
 | |
| 
 | |
| @item @samp{nd}
 | |
| @kindex nd
 | |
| String of commands to move the cursor right one column.  The effect is
 | |
| undefined if the cursor is at the right margin; do not use this
 | |
| command there, not even if @samp{am} is present.
 | |
| 
 | |
| @item @samp{up}
 | |
| @kindex up
 | |
| String of commands to move the cursor vertically up one line.  The
 | |
| effect of sending this string when on the top line is undefined;
 | |
| programs should never use it that way.
 | |
| 
 | |
| @item @samp{do}
 | |
| @kindex do
 | |
| String of commands to move the cursor vertically down one line.  The
 | |
| effect of sending this string when on the bottom line is undefined;
 | |
| programs should never use it that way.
 | |
| 
 | |
| Some programs do use @samp{do} to scroll up one line if used at the
 | |
| bottom line, if @samp{sf} is not defined but @samp{sr} is.  This is
 | |
| only to compensate for certain old, incorrect terminal descriptions.
 | |
| (In principle this might actually lead to incorrect behavior on other
 | |
| terminals, but that seems to happen rarely if ever.)  But the proper
 | |
| solution is that the terminal description should define @samp{sf} as
 | |
| well as @samp{do} if the command is suitable for scrolling.
 | |
| 
 | |
| The original idea was that this string would not contain a newline
 | |
| character and therefore could be used without disabling the kernel's
 | |
| usual habit of converting of newline into a carriage-return newline
 | |
| sequence.  But many terminal descriptions do use newline in the
 | |
| @samp{do} string, so this is not possible; a program which sends the
 | |
| @samp{do} string must disable output conversion in the kernel
 | |
| (@pxref{Initialize}).
 | |
| 
 | |
| @item @samp{bw}
 | |
| @kindex bw
 | |
| Flag whose presence says that @samp{le} may be used in column zero
 | |
| to move to the last column of the preceding line.  If this flag
 | |
| is not present, @samp{le} should not be used in column zero.
 | |
| 
 | |
| @item @samp{nw}
 | |
| @kindex nw
 | |
| String of commands to move the cursor to start of next line, possibly
 | |
| clearing rest of line (following the cursor) before moving.
 | |
| 
 | |
| @item @samp{DO}, @samp{UP}, @samp{LE}, @samp{RI}
 | |
| @kindex DO
 | |
| @kindex LE
 | |
| @kindex RI
 | |
| @kindex UP
 | |
| Strings of commands to move the cursor @var{n} lines down vertically,
 | |
| up vertically, or @var{n} columns left or right.  Do not attempt to
 | |
| move past any edge of the screen with these commands; the effect of
 | |
| trying that is undefined.  Only a few terminal descriptions provide
 | |
| these commands, and most programs do not use them.
 | |
| 
 | |
| @item @samp{CM}
 | |
| @kindex CM
 | |
| String of commands to position the cursor at line @var{l}, column
 | |
| @var{c}, relative to display memory.  Both parameters are origin-zero.
 | |
| This capability is present only in terminals where there is a
 | |
| difference between screen-relative and memory-relative addressing, and
 | |
| not even in all such terminals.
 | |
| 
 | |
| @item @samp{ch}
 | |
| @kindex ch
 | |
| String of commands to position the cursor at column @var{c} in the
 | |
| same line it is on.  This is a special case of @samp{cm} in which the
 | |
| vertical position is not changed.  The @samp{ch} capability is
 | |
| provided only when it is faster to output than @samp{cm} would be in
 | |
| this special case.  Programs should not assume most display terminals
 | |
| have @samp{ch}.
 | |
| 
 | |
| @item @samp{cv}
 | |
| @kindex cv
 | |
| String of commands to position the cursor at line @var{l} in the same
 | |
| column.  This is a special case of @samp{cm} in which the horizontal
 | |
| position is not changed.  The @samp{cv} capability is provided only
 | |
| when it is faster to output than @samp{cm} would be in this special
 | |
| case.  Programs should not assume most display terminals have
 | |
| @samp{cv}.
 | |
| 
 | |
| @item @samp{sc}
 | |
| @kindex sc
 | |
| String of commands to make the terminal save the current cursor
 | |
| position.  Only the last saved position can be used.  If this
 | |
| capability is present, @samp{rc} should be provided also.  Most
 | |
| terminals have neither.
 | |
| 
 | |
| @item @samp{rc}
 | |
| @kindex rc
 | |
| String of commands to make the terminal restore the last saved cursor
 | |
| position.  If this capability is present, @samp{sc} should be provided
 | |
| also.  Most terminals have neither.
 | |
| 
 | |
| @item @samp{ff}
 | |
| @kindex ff
 | |
| String of commands to advance to the next page, for a hardcopy
 | |
| terminal.
 | |
| 
 | |
| @item @samp{ta}
 | |
| @kindex ta
 | |
| String of commands to move the cursor right to the next hardware tab
 | |
| stop column.  Missing if the terminal does not have any kind of
 | |
| hardware tabs.  Do not send this command if the kernel's terminal
 | |
| modes say that the kernel is expanding tabs into spaces.
 | |
| 
 | |
| @item @samp{bt}
 | |
| @kindex bt
 | |
| String of commands to move the cursor left to the previous hardware
 | |
| tab stop column.  Missing if the terminal has no such ability; many
 | |
| terminals do not.  Do not send this command if the kernel's terminal
 | |
| modes say that the kernel is expanding tabs into spaces.
 | |
| @end table
 | |
| 
 | |
| The following obsolete capabilities should be included in terminal
 | |
| descriptions when appropriate, but should not be looked at by new programs.
 | |
| 
 | |
| @table @samp
 | |
| @item nc
 | |
| @kindex nc
 | |
| Flag whose presence means the terminal does not support the ASCII
 | |
| carriage return character as @samp{cr}.  This flag is needed because
 | |
| old programs assume, when the @samp{cr} capability is missing, that
 | |
| ASCII carriage return can be used for the purpose.  We use @samp{nc}
 | |
| to tell the old programs that carriage return may not be used.
 | |
| 
 | |
| New programs should not assume any default for @samp{cr}, so they need
 | |
| not look at @samp{nc}.  However, descriptions should contain @samp{nc}
 | |
| whenever they do not contain @samp{cr}.
 | |
| 
 | |
| @item xt
 | |
| @kindex xt
 | |
| Flag whose presence means that the ASCII tab character may not be used
 | |
| for cursor motion.  This flag exists because old programs assume, when
 | |
| the @samp{ta} capability is missing, that ASCII tab can be used for
 | |
| the purpose.  We use @samp{xt} to tell the old programs not to use tab.
 | |
| 
 | |
| New programs should not assume any default for @samp{ta}, so they need
 | |
| not look at @samp{xt} in connection with cursor motion.  Note that
 | |
| @samp{xt} also has implications for standout mode (@pxref{Standout}).
 | |
| It is obsolete in regard to cursor motion but not in regard to
 | |
| standout.
 | |
| 
 | |
| In fact, @samp{xt} means that the terminal is a Teleray 1061.
 | |
| 
 | |
| @item bc
 | |
| @kindex bc
 | |
| Very obsolete alternative name for the @samp{le} capability.
 | |
| 
 | |
| @item bs
 | |
| @kindex bs
 | |
| Flag whose presence means that the ASCII character backspace may be
 | |
| used to move the cursor left.  Obsolete; look at @samp{le} instead.
 | |
| 
 | |
| @item nl
 | |
| @kindex nl
 | |
| Obsolete capability which is a string that can either be used to move
 | |
| the cursor down or to scroll.  The same string must scroll when used
 | |
| on the bottom line and move the cursor when used on any other line.
 | |
| New programs should use @samp{do} or @samp{sf}, and ignore @samp{nl}.
 | |
| 
 | |
| If there is no @samp{nl} capability, some old programs assume they can
 | |
| use the newline character for this purpose.  These programs follow a
 | |
| bad practice, but because they exist, it is still desirable to define
 | |
| the @samp{nl} capability in a terminal description if the best way to
 | |
| move down is @emph{not} a newline.
 | |
| @end table
 | |
| 
 | |
| @node Wrapping, Scrolling, Cursor Motion, Capabilities
 | |
| @section Wrapping
 | |
| @cindex wrapping
 | |
| 
 | |
| @dfn{Wrapping} means moving the cursor from the right margin to the left
 | |
| margin of the following line.  Some terminals wrap automatically when a
 | |
| graphic character is output in the last column, while others do not.  Most
 | |
| application programs that use termcap need to know whether the terminal
 | |
| wraps.  There are two special flag capabilities to describe what the
 | |
| terminal does when a graphic character is output in the last column.
 | |
| 
 | |
| @table @samp
 | |
| @item am
 | |
| @kindex am
 | |
| Flag whose presence means that writing a character in the last column
 | |
| causes the cursor to wrap to the beginning of the next line.
 | |
| 
 | |
| If @samp{am} is not present, writing in the last column leaves the
 | |
| cursor at the place where the character was written.
 | |
| 
 | |
| Writing in the last column of the last line should be avoided on
 | |
| terminals with @samp{am}, as it may or may not cause scrolling to
 | |
| occur (@pxref{Scrolling}).  Scrolling is surely not what you would
 | |
| intend.
 | |
| 
 | |
| If your program needs to check the @samp{am} flag, then it also needs
 | |
| to check the @samp{xn} flag which indicates that wrapping happens in a
 | |
| strange way.  Many common terminals have the @samp{xn} flag.
 | |
| 
 | |
| @item xn
 | |
| @kindex xn
 | |
| Flag whose presence means that the cursor wraps in a strange way.  At
 | |
| least two distinct kinds of strange behavior are known; the termcap
 | |
| data base does not contain anything to distinguish the two.
 | |
| 
 | |
| On Concept-100 terminals, output in the last column wraps the cursor
 | |
| almost like an ordinary @samp{am} terminal.  But if the next thing
 | |
| output is a newline, it is ignored.
 | |
| 
 | |
| DEC VT-100 terminals (when the wrap switch is on) do a different
 | |
| strange thing: the cursor wraps only if the next thing output is
 | |
| another graphic character.  In fact, the wrap occurs when the
 | |
| following graphic character is received by the terminal, before the
 | |
| character is placed on the screen.
 | |
| 
 | |
| On both of these terminals, after writing in the last column a
 | |
| following graphic character will be displayed in the first column of
 | |
| the following line.  But the effect of relative cursor motion
 | |
| characters such as newline or backspace at such a time depends on the
 | |
| terminal.  The effect of erase or scrolling commands also depends on
 | |
| the terminal.  You can't assume anything about what they will do on a
 | |
| terminal that has @samp{xn}.  So, to be safe, you should never do
 | |
| these things at such a time on such a terminal.
 | |
| 
 | |
| To be sure of reliable results on a terminal which has the @samp{xn}
 | |
| flag, output a @samp{cm} absolute positioning command after writing in
 | |
| the last column.  Another safe thing to do is to output carriage-return
 | |
| newline, which will leave the cursor at the beginning of the following
 | |
| line.
 | |
| 
 | |
| @item LP
 | |
| @kindex LP
 | |
| Flag whose presence means that it is safe to write in the last column of
 | |
| the last line without worrying about undesired scrolling.  @samp{LP}
 | |
| indicates the DEC flavor of @samp{xn} strangeness.
 | |
| @end table
 | |
| 
 | |
| @node Scrolling, Windows, Wrapping, Capabilities
 | |
| @section Scrolling
 | |
| @cindex scrolling
 | |
| 
 | |
| @dfn{Scrolling} means moving the contents of the screen up or down one or
 | |
| more lines.  Moving the contents up is @dfn{forward scrolling}; moving them
 | |
| down is @dfn{reverse scrolling}.
 | |
| 
 | |
| Scrolling happens after each line of output during ordinary output on most
 | |
| display terminals.  But in an application program that uses termcap for
 | |
| random-access output, scrolling happens only when explicitly requested with
 | |
| the commands in this section.
 | |
| 
 | |
| Some terminals have a @dfn{scroll region} feature.  This lets you limit
 | |
| the effect of scrolling to a specified range of lines.  Lines outside the
 | |
| range are unaffected when scrolling happens.  The scroll region feature
 | |
| is available if either @samp{cs} or @samp{cS} is present.
 | |
| 
 | |
| @table @samp
 | |
| @item sf
 | |
| @kindex sf
 | |
| String of commands to scroll the screen one line up, assuming it is
 | |
| output with the cursor at the beginning of the bottom line.
 | |
| 
 | |
| @item sr
 | |
| @kindex sr
 | |
| String of commands to scroll the screen one line down, assuming it is
 | |
| output with the cursor at the beginning of the top line.
 | |
| 
 | |
| @item do
 | |
| A few programs will try to use @samp{do} to do the work of @samp{sf}.
 | |
| This is not really correct---it is an attempt to compensate for the
 | |
| absence of a @samp{sf} command in some old terminal descriptions.
 | |
| 
 | |
| Since these terminal descriptions do define @samp{sr}, perhaps at one
 | |
| time the definition of @samp{do} was different and it could be used
 | |
| for scrolling as well.  But it isn't desirable to combine these two
 | |
| functions in one capability, since scrolling often requires more
 | |
| padding than simply moving the cursor down.  Defining @samp{sf} and
 | |
| @samp{do} separately allows you to specify the padding properly.
 | |
| Also, all sources agree that @samp{do} should not be relied on to do
 | |
| scrolling.
 | |
| 
 | |
| So the best approach is to add @samp{sf} capabilities to the
 | |
| descriptions of these terminals, copying the definition of @samp{do}
 | |
| if that does scroll.
 | |
| 
 | |
| @item SF
 | |
| @kindex SF
 | |
| String of commands to scroll the screen @var{n} lines up, assuming it
 | |
| is output with the cursor at the beginning of the bottom line.
 | |
| 
 | |
| @item SR
 | |
| @kindex SR
 | |
| String of commands to scroll the screen @var{n} lines down, assuming it
 | |
| is output with the cursor at the beginning of the top line.
 | |
| 
 | |
| @item cs
 | |
| @kindex cs
 | |
| String of commands to set the scroll region.  This command takes two
 | |
| parameters, @var{start} and @var{end}, which are the line numbers
 | |
| (origin-zero) of the first line to include in the scroll region and of
 | |
| the last line to include in it.  When a scroll region is set,
 | |
| scrolling is limited to the specified range of lines; lines outside
 | |
| the range are not affected by scroll commands.
 | |
| 
 | |
| Do not try to move the cursor outside the scroll region.  The region
 | |
| remains set until explicitly removed.  To remove the scroll region,
 | |
| use another @samp{cs} command specifying the full height of the
 | |
| screen.
 | |
| 
 | |
| The cursor position is undefined after the @samp{cs} command is set,
 | |
| so position the cursor with @samp{cm} immediately afterward.
 | |
| 
 | |
| @item cS
 | |
| @kindex cS
 | |
| String of commands to set the scroll region using parameters in
 | |
| different form.  The effect is the same as if @samp{cs} were used.
 | |
| Four parameters are required:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| Total number of lines on the screen.
 | |
| @item
 | |
| Number of lines above desired scroll region.
 | |
| @item
 | |
| Number of lines below (outside of) desired scroll region.
 | |
| @item
 | |
| Total number of lines on the screen, the same as the first parameter.
 | |
| @end enumerate
 | |
| 
 | |
| This capability is a GNU extension that was invented to allow the Ann
 | |
| Arbor Ambassador's scroll-region command to be described; it could
 | |
| also be done by putting non-Unix @samp{%}-sequences into a @samp{cs}
 | |
| string, but that would have confused Unix programs that used the
 | |
| @samp{cs} capability with the Unix termcap.  Currently only GNU Emacs
 | |
| uses the @samp{cS} capability.
 | |
| 
 | |
| @item ns
 | |
| @kindex ns
 | |
| Flag which means that the terminal does not normally scroll for
 | |
| ordinary sequential output.  For modern terminals, this means that
 | |
| outputting a newline in ordinary sequential output with the cursor on
 | |
| the bottom line wraps to the top line.  For some obsolete terminals,
 | |
| other things may happen.
 | |
| 
 | |
| The terminal may be able to scroll even if it does not normally do so.
 | |
| If the @samp{sf} capability is provided, it can be used for scrolling
 | |
| regardless of @samp{ns}.
 | |
| 
 | |
| @item da
 | |
| @kindex da
 | |
| Flag whose presence means that lines scrolled up off the top of the
 | |
| screen may come back if scrolling down is done subsequently.
 | |
| 
 | |
| The @samp{da} and @samp{db} flags do not, strictly speaking, affect
 | |
| how to scroll.  But programs that scroll usually need to clear the
 | |
| lines scrolled onto the screen, if these flags are present.
 | |
| 
 | |
| @item db
 | |
| @kindex db
 | |
| Flag whose presence means that lines scrolled down off the bottom of
 | |
| the screen may come back if scrolling up is done subsequently.
 | |
| 
 | |
| @item lm
 | |
| @kindex lm
 | |
| Numeric value, the number of lines of display memory that the terminal
 | |
| has.  A value of zero means that the terminal has more display memory
 | |
| than can fit on the screen, but no fixed number of lines.  (The number
 | |
| of lines may depend on the amount of text in each line.)
 | |
| @end table
 | |
| 
 | |
| Any terminal description that defines @samp{SF} should also define @samp{sf};
 | |
| likewise for @samp{SR} and @samp{sr}.  However, many terminals can only
 | |
| scroll by one line at a time, so it is common to find @samp{sf} and not
 | |
| @samp{SF}, or @samp{sr} without @samp{SR}.@refill
 | |
| 
 | |
| Therefore, all programs that use the scrolling facilities should be
 | |
| prepared to work with @samp{sf} in the case that @samp{SF} is absent, and
 | |
| likewise with @samp{sr}.  On the other hand, an application program that
 | |
| uses only @samp{sf} and not @samp{SF} is acceptable, though slow on some
 | |
| terminals.@refill
 | |
| 
 | |
| When outputting a scroll command with @code{tputs}, the @var{nlines}
 | |
| argument should be the total number of lines in the portion of the screen
 | |
| being scrolled.  Very often these commands require padding proportional to
 | |
| this number of lines.  @xref{Padding}.
 | |
| 
 | |
| @node Windows, Clearing, Scrolling, Capabilities
 | |
| @section Windows
 | |
| @cindex window
 | |
| 
 | |
| A @dfn{window}, in termcap, is a rectangular portion of the screen to which
 | |
| all display operations are restricted.  Wrapping, clearing, scrolling,
 | |
| insertion and deletion all operate as if the specified window were all the
 | |
| screen there was.
 | |
| 
 | |
| @table @samp
 | |
| @item wi
 | |
| @kindex wi
 | |
| String of commands to set the terminal output screen window.
 | |
| This string requires four parameters, all origin-zero:
 | |
| @enumerate
 | |
| @item
 | |
| The first line to include in the window.
 | |
| @item
 | |
| The last line to include in the window.
 | |
| @item
 | |
| The first column to include in the window.
 | |
| @item
 | |
| The last column to include in the window.
 | |
| @end enumerate
 | |
| @end table
 | |
| 
 | |
| Most terminals do not support windows.
 | |
| 
 | |
| @node Clearing, Insdel Line, Windows, Capabilities
 | |
| @section Clearing Parts of the Screen
 | |
| @cindex erasing
 | |
| @cindex clearing the screen
 | |
| 
 | |
| There are several terminal capabilities for clearing parts of the screen
 | |
| to blank.  All display terminals support the @samp{cl} string, and most
 | |
| display terminals support all of these capabilities.
 | |
| 
 | |
| @table @samp
 | |
| @item cl
 | |
| @kindex cl
 | |
| String of commands to clear the entire screen and position the cursor
 | |
| at the upper left corner.
 | |
| 
 | |
| @item cd
 | |
| @kindex cd
 | |
| String of commands to clear the line the cursor is on, and all the
 | |
| lines below it, down to the bottom of the screen.  This command string
 | |
| should be used only with the cursor in column zero; their effect is
 | |
| undefined if the cursor is elsewhere.
 | |
| 
 | |
| @item ce
 | |
| @kindex ce
 | |
| String of commands to clear from the cursor to the end of the current
 | |
| line.
 | |
| 
 | |
| @item ec
 | |
| @kindex ec
 | |
| String of commands to clear @var{n} characters, starting with the
 | |
| character that the cursor is on.  This command string is expected to
 | |
| leave the cursor position unchanged.  The parameter @var{n} should never
 | |
| be large enough to reach past the right margin; the effect of such a
 | |
| large parameter would be undefined.
 | |
| @end table
 | |
| 
 | |
| Clear to end of line (@samp{ce}) is extremely important in programs that
 | |
| maintain an updating display.  Nearly all display terminals support this
 | |
| operation, so it is acceptable for a an application program to refuse to
 | |
| work if @samp{ce} is not present.  However, if you do not want this
 | |
| limitation, you can accomplish clearing to end of line by outputting spaces
 | |
| until you reach the right margin.  In order to do this, you must know the
 | |
| current horizontal position.  Also, this technique assumes that writing a
 | |
| space will erase.  But this happens to be true on all the display terminals
 | |
| that fail to support @samp{ce}.
 | |
| 
 | |
| @node Insdel Line, Insdel Char, Clearing, Capabilities
 | |
| @section Insert/Delete Line
 | |
| 
 | |
| @cindex insert line
 | |
| @cindex delete line
 | |
| @dfn{Inserting a line} means creating a blank line in the middle
 | |
| of the screen, and pushing the existing lines of text apart.  In fact,
 | |
| the lines above the insertion point do not change, while the lines below
 | |
| move down, and one is normally lost at the bottom of the screen.
 | |
| 
 | |
| @dfn{Deleting a line} means causing the line to disappear from the screen,
 | |
| closing up the gap by moving the lines below it upward.  A new line
 | |
| appears at the bottom of the screen.  Usually this line is blank, but
 | |
| on terminals with the @samp{db} flag it may be a line previously moved
 | |
| off the screen bottom by scrolling or line insertion.
 | |
| 
 | |
| Insertion and deletion of lines is useful in programs that maintain an
 | |
| updating display some parts of which may get longer or shorter.  They are
 | |
| also useful in editors for scrolling parts of the screen, and for
 | |
| redisplaying after lines of text are killed or inserted.
 | |
| 
 | |
| Many terminals provide commands to insert or delete a single line at the
 | |
| cursor position.  Some provide the ability to insert or delete several
 | |
| lines with one command, using the number of lines to insert or delete as a
 | |
| parameter.  Always move the cursor to column zero before using any of
 | |
| these commands.
 | |
| 
 | |
| @table @samp
 | |
| @item al
 | |
| @kindex al
 | |
| String of commands to insert a blank line before the line the cursor
 | |
| is on.  The existing line, and all lines below it, are moved down.
 | |
| The last line in the screen (or in the scroll region, if one is set)
 | |
| disappears and in most circumstances is discarded.  It may not be
 | |
| discarded if the @samp{db} is present (@pxref{Scrolling}).
 | |
| 
 | |
| The cursor must be at the left margin before this command is used.
 | |
| This command does not move the cursor.
 | |
| 
 | |
| @item dl
 | |
| @kindex dl
 | |
| String of commands to delete the line the cursor is on.  The following
 | |
| lines move up, and a blank line appears at the bottom of the screen
 | |
| (or bottom of the scroll region).  If the terminal has the @samp{db}
 | |
| flag, a nonblank line previously pushed off the screen bottom may
 | |
| reappear at the bottom.
 | |
| 
 | |
| The cursor must be at the left margin before this command is used.
 | |
| This command does not move the cursor.
 | |
| 
 | |
| @item AL
 | |
| @kindex AL
 | |
| String of commands to insert @var{n} blank lines before the line that
 | |
| the cursor is on.  It is like @samp{al} repeated @var{n} times, except
 | |
| that it is as fast as one @samp{al}.
 | |
| 
 | |
| @item DL
 | |
| @kindex DL
 | |
| String of commands to delete @var{n} lines starting with the line that
 | |
| the cursor is on.  It is like @samp{dl} repeated @var{n} times, except
 | |
| that it is as fast as one @samp{dl}.
 | |
| @end table
 | |
| 
 | |
| Any terminal description that defines @samp{AL} should also define
 | |
| @samp{al}; likewise for @samp{DL} and @samp{dl}.  However, many terminals
 | |
| can only insert or delete one line at a time, so it is common to find
 | |
| @samp{al} and not @samp{AL}, or @samp{dl} without @samp{DL}.@refill
 | |
| 
 | |
| Therefore, all programs that use the insert and delete facilities should be
 | |
| prepared to work with @samp{al} in the case that @samp{AL} is absent, and
 | |
| likewise with @samp{dl}.  On the other hand, it is acceptable to write
 | |
| an application that uses only @samp{al} and @samp{dl} and does not look
 | |
| for @samp{AL} or @samp{DL} at all.@refill
 | |
| 
 | |
| If a terminal does not support line insertion and deletion directly,
 | |
| but does support a scroll region, the effect of insertion and deletion
 | |
| can be obtained with scrolling.  However, it is up to the individual
 | |
| user program to check for this possibility and use the scrolling
 | |
| commands to get the desired result.  It is fairly important to implement
 | |
| this alternate strategy, since it is the only way to get the effect of
 | |
| line insertion and deletion on the popular VT100 terminal.
 | |
| 
 | |
| Insertion and deletion of lines is affected by the scroll region on
 | |
| terminals that have a settable scroll region.  This is useful when it is
 | |
| desirable to move any few consecutive lines up or down by a few lines.
 | |
| @xref{Scrolling}.
 | |
| 
 | |
| The line pushed off the bottom of the screen is not lost if the terminal
 | |
| has the @samp{db} flag capability; instead, it is pushed into display
 | |
| memory that does not appear on the screen.  This is the same thing that
 | |
| happens when scrolling pushes a line off the bottom of the screen.
 | |
| Either reverse scrolling or deletion of a line can bring the apparently
 | |
| lost line back onto the bottom of the screen.  If the terminal has the
 | |
| scroll region feature as well as @samp{db}, the pushed-out line really
 | |
| is lost if a scroll region is in effect.
 | |
| 
 | |
| When outputting an insert or delete command with @code{tputs}, the
 | |
| @var{nlines} argument should be the total number of lines from the cursor
 | |
| to the bottom of the screen (or scroll region).  Very often these commands
 | |
| require padding proportional to this number of lines.  @xref{Padding}.
 | |
| 
 | |
| For @samp{AL} and @samp{DL} the @var{nlines} argument should @emph{not}
 | |
| depend on the number of lines inserted or deleted; only the total number of
 | |
| lines affected.  This is because it is just as fast to insert two or
 | |
| @var{n} lines with @samp{AL} as to insert one line with @samp{al}.
 | |
| 
 | |
| @node Insdel Char, Standout, Insdel Line, Capabilities
 | |
| @section Insert/Delete Character
 | |
| @cindex insert character
 | |
| @cindex delete character
 | |
| 
 | |
| @dfn{Inserting a character} means creating a blank space in the middle of a
 | |
| line, and pushing the rest of the line rightward.  The character in the
 | |
| rightmost column is lost.
 | |
| 
 | |
| @dfn{Deleting a character} means causing the character to disappear from
 | |
| the screen, closing up the gap by moving the rest of the line leftward.  A
 | |
| blank space appears in the rightmost column.
 | |
| 
 | |
| Insertion and deletion of characters is useful in programs that maintain an
 | |
| updating display some parts of which may get longer or shorter.  It is also
 | |
| useful in editors for redisplaying the results of editing within a line.
 | |
| 
 | |
| Many terminals provide commands to insert or delete a single character at
 | |
| the cursor position.  Some provide the ability to insert or delete several
 | |
| characters with one command, using the number of characters to insert or
 | |
| delete as a parameter.
 | |
| 
 | |
| @cindex insert mode
 | |
| Many terminals provide an insert mode in which outputting a graphic
 | |
| character has the added effect of inserting a position for that character.
 | |
| A special command string is used to enter insert mode and another is used
 | |
| to exit it.  The reason for designing a terminal with an insert mode rather
 | |
| than an insert command is that inserting character positions is usually
 | |
| followed by writing characters into them.  With insert mode, this is as
 | |
| fast as simply writing the characters, except for the fixed overhead of
 | |
| entering and leaving insert mode.  However, when the line speed is great
 | |
| enough, padding may be required for the graphic characters output in insert
 | |
| mode.
 | |
| 
 | |
| Some terminals require you to enter insert mode and then output a special
 | |
| command for each position to be inserted.  Or they may require special
 | |
| commands to be output before or after each graphic character to be
 | |
| inserted.
 | |
| 
 | |
| @cindex delete mode
 | |
| Deletion of characters is usually accomplished by a straightforward command
 | |
| to delete one or several positions; but on some terminals, it is necessary
 | |
| to enter a special delete mode before using the delete command, and leave
 | |
| delete mode afterward.  Sometimes delete mode and insert mode are the same
 | |
| mode.
 | |
| 
 | |
| Some terminals make a distinction between character positions in which a
 | |
| space character has been output and positions which have been cleared.  On
 | |
| these terminals, the effect of insert or delete character runs to the first
 | |
| cleared position rather than to the end of the line.  In fact, the effect
 | |
| may run to more than one line if there is no cleared position to stop the
 | |
| shift on the first line.  These terminals are identified by the @samp{in}
 | |
| flag capability.
 | |
| 
 | |
| On terminals with the @samp{in} flag, the technique of skipping over
 | |
| characters that you know were cleared, and then outputting text later on in
 | |
| the same line, causes later insert and delete character operations on that
 | |
| line to do nonstandard things.  A program that has any chance of doing this
 | |
| must check for the @samp{in} flag and must be careful to write explicit
 | |
| space characters into the intermediate columns when @samp{in} is present.
 | |
| 
 | |
| A plethora of terminal capabilities are needed to describe all of this
 | |
| complexity.  Here is a list of them all.  Following the list, we present
 | |
| an algorithm for programs to use to take proper account of all of these
 | |
| capabilities.
 | |
| 
 | |
| @table @samp
 | |
| @item im
 | |
| @kindex im
 | |
| String of commands to enter insert mode.
 | |
| 
 | |
| If the terminal has no special insert mode, but it can insert
 | |
| characters with a special command, @samp{im} should be defined with a
 | |
| null value, because the @samp{vi} editor assumes that insertion of a
 | |
| character is impossible if @samp{im} is not provided.
 | |
| 
 | |
| New programs should not act like @samp{vi}.  They should pay attention
 | |
| to @samp{im} only if it is defined.
 | |
| 
 | |
| @item ei
 | |
| @kindex ei
 | |
| String of commands to leave insert mode.  This capability must be
 | |
| present if @samp{im} is.
 | |
| 
 | |
| On a few old terminals the same string is used to enter and exit
 | |
| insert mode.  This string turns insert mode on if it was off, and off
 | |
| it it was on.  You can tell these terminals because the @samp{ei}
 | |
| string equals the @samp{im} string.  If you want to support these
 | |
| terminals, you must always remember accurately whether insert mode is
 | |
| in effect.  However, these terminals are obsolete, and it is
 | |
| reasonable to refuse to support them.  On all modern terminals, you
 | |
| can safely output @samp{ei} at any time to ensure that insert mode is
 | |
| turned off.
 | |
| 
 | |
| @item ic
 | |
| @kindex ic
 | |
| String of commands to insert one character position at the cursor.
 | |
| The cursor does not move.
 | |
| 
 | |
| If outputting a graphic character while in insert mode is sufficient
 | |
| to insert the character, then the @samp{ic} capability should be
 | |
| defined with a null value.
 | |
| 
 | |
| If your terminal offers a choice of ways to insert---either use insert
 | |
| mode or use a special command---then define @samp{im} and do not define
 | |
| @samp{ic}, since this gives the most efficient operation when several
 | |
| characters are to be inserted.  @emph{Do not} define both strings, for
 | |
| that means that @emph{both} must be used each time insertion is done.
 | |
| 
 | |
| @item ip
 | |
| @kindex ip
 | |
| String of commands to output following an inserted graphic character
 | |
| in insert mode.  Often it is used just for a padding spec, when padding
 | |
| is needed after an inserted character (@pxref{Padding}).
 | |
| 
 | |
| @item IC
 | |
| @kindex IC
 | |
| String of commands to insert @var{n} character positions at and after
 | |
| the cursor.  It has the same effect as repeating the @samp{ic} string
 | |
| and a space, @var{n} times.
 | |
| 
 | |
| If @samp{IC} is provided, application programs may use it without first
 | |
| entering insert mode.
 | |
| 
 | |
| @item mi
 | |
| @kindex mi
 | |
| Flag whose presence means it is safe to move the cursor while in insert
 | |
| mode and assume the terminal remains in insert mode.
 | |
| 
 | |
| @item in
 | |
| @kindex in
 | |
| Flag whose presence means that the terminal distinguishes between
 | |
| character positions in which space characters have been output and
 | |
| positions which have been cleared.
 | |
| @end table
 | |
| 
 | |
| An application program can assume that the terminal can do character
 | |
| insertion if @emph{any one of} the capabilities @samp{IC}, @samp{im},
 | |
| @samp{ic} or @samp{ip} is provided.
 | |
| 
 | |
| To insert @var{n} blank character positions, move the cursor to the place
 | |
| to insert them and follow this algorithm:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| If an @samp{IC} string is provided, output it with parameter @var{n}
 | |
| and you are finished.  Otherwise (or if you don't want to bother to
 | |
| look for an @samp{IC} string) follow the remaining steps.
 | |
| 
 | |
| @item
 | |
| Output the @samp{im} string, if there is one, unless the terminal is
 | |
| already in insert mode.
 | |
| 
 | |
| @item
 | |
| Repeat steps 4 through 6, @var{n} times.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ic} string if any.
 | |
| 
 | |
| @item
 | |
| Output a space.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ip} string if any.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ei} string, eventually, to exit insert mode.  There
 | |
| is no need to do this right away.  If the @samp{mi} flag is present,
 | |
| you can move the cursor and the cursor will remain in insert mode;
 | |
| then you can do more insertion elsewhere without reentering insert
 | |
| mode.
 | |
| @end enumerate
 | |
| 
 | |
| To insert @var{n} graphic characters, position the cursor and follow this
 | |
| algorithm:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| If an @samp{IC} string is provided, output it with parameter @var{n},
 | |
| then output the graphic characters, and you are finished.  Otherwise
 | |
| (or if you don't want to bother to look for an @samp{IC} string)
 | |
| follow the remaining steps.
 | |
| 
 | |
| @item
 | |
| Output the @samp{im} string, if there is one, unless the terminal is
 | |
| already in insert mode.
 | |
| 
 | |
| @item
 | |
| For each character to be output, repeat steps 4 through 6.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ic} string if any.
 | |
| 
 | |
| @item
 | |
| Output the next graphic character.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ip} string if any.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ei} string, eventually, to exit insert mode.  There
 | |
| is no need to do this right away.  If the @samp{mi} flag is present,
 | |
| you can move the cursor and the cursor will remain in insert mode;
 | |
| then you can do more insertion elsewhere without reentering insert
 | |
| mode.
 | |
| @end enumerate
 | |
| 
 | |
| Note that this is not the same as the original Unix termcap specifications
 | |
| in one respect: it assumes that the @samp{IC} string can be used without
 | |
| entering insert mode.  This is true as far as I know, and it allows you be
 | |
| able to avoid entering and leaving insert mode, and also to be able to
 | |
| avoid the inserted-character padding after the characters that go into the
 | |
| inserted positions.
 | |
| 
 | |
| Deletion of characters is less complicated; deleting one column is done by
 | |
| outputting the @samp{dc} string.  However, there may be a delete mode that
 | |
| must be entered with @samp{dm} in order to make @samp{dc} work.
 | |
| 
 | |
| @table @samp
 | |
| @item dc
 | |
| @kindex dc
 | |
| String of commands to delete one character position at the cursor.  If
 | |
| @samp{dc} is not present, the terminal cannot delete characters.
 | |
| 
 | |
| @item DC
 | |
| @kindex DC
 | |
| String of commands to delete @var{n} characters starting at the cursor.
 | |
| It has the same effect as repeating the @samp{dc} string @var{n} times.
 | |
| Any terminal description that has @samp{DC} also has @samp{dc}.
 | |
| 
 | |
| @item dm
 | |
| @kindex dm
 | |
| String of commands to enter delete mode.  If not present, there is no
 | |
| delete mode, and @samp{dc} can be used at any time (assuming there is
 | |
| a @samp{dc}).
 | |
| 
 | |
| @item ed
 | |
| @kindex ed
 | |
| String of commands to exit delete mode.  This must be present if
 | |
| @samp{dm} is.
 | |
| @end table
 | |
| 
 | |
| To delete @var{n} character positions, position the cursor and follow these
 | |
| steps:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| If the @samp{DC} string is present, output it with parameter @var{n}
 | |
| and you are finished.  Otherwise, follow the remaining steps.
 | |
| 
 | |
| @item
 | |
| Output the @samp{dm} string, unless you know the terminal is already
 | |
| in delete mode.
 | |
| 
 | |
| @item
 | |
| Output the @samp{dc} string @var{n} times.
 | |
| 
 | |
| @item
 | |
| Output the @samp{ed} string eventually.  If the flag capability
 | |
| @samp{mi} is present, you can move the cursor and do more deletion
 | |
| without leaving and reentering delete mode.
 | |
| @end enumerate
 | |
| 
 | |
| As with the @samp{IC} string, we have departed from the original termcap
 | |
| specifications by assuming that @samp{DC} works without entering delete
 | |
| mode even though @samp{dc} would not.
 | |
| 
 | |
| If the @samp{dm} and @samp{im} capabilities are both present and have the
 | |
| same value, it means that the terminal has one mode for both insertion and
 | |
| deletion.  It is useful for a program to know this, because then it can do
 | |
| insertions after deletions, or vice versa, without leaving insert/delete
 | |
| mode and reentering it.
 | |
| 
 | |
| @node Standout, Underlining, Insdel Char, Capabilities
 | |
| @section Standout and Appearance Modes
 | |
| @cindex appearance modes
 | |
| @cindex standout
 | |
| @cindex magic cookie
 | |
| 
 | |
| @dfn{Appearance modes} are modifications to the ways characters are
 | |
| displayed.  Typical appearance modes include reverse video, dim, bright,
 | |
| blinking, underlined, invisible, and alternate character set.  Each kind of
 | |
| terminal supports various among these, or perhaps none.
 | |
| 
 | |
| For each type of terminal, one appearance mode or combination of them that
 | |
| looks good for highlighted text is chosen as the @dfn{standout mode}.  The
 | |
| capabilities @samp{so} and @samp{se} say how to enter and leave standout
 | |
| mode.  Programs that use appearance modes only to highlight some text
 | |
| generally use the standout mode so that they can work on as many terminals
 | |
| as possible.  Use of specific appearance modes other than ``underlined''
 | |
| and ``alternate character set'' is rare.
 | |
| 
 | |
| Terminals that implement appearance modes fall into two general classes as
 | |
| to how they do it.
 | |
| 
 | |
| In some terminals, the presence or absence of any appearance mode is
 | |
| recorded separately for each character position.  In these terminals, each
 | |
| graphic character written is given the appearance modes current at the time
 | |
| it is written, and keeps those modes until it is erased or overwritten.
 | |
| There are special commands to turn the appearance modes on or off for
 | |
| characters to be written in the future.
 | |
| 
 | |
| In other terminals, the change of appearance modes is represented by a
 | |
| marker that belongs to a certain screen position but affects all following
 | |
| screen positions until the next marker.  These markers are traditionally
 | |
| called @dfn{magic cookies}.
 | |
| 
 | |
| The same capabilities (@samp{so}, @samp{se}, @samp{mb} and so on) for
 | |
| turning appearance modes on and off are used for both magic-cookie
 | |
| terminals and per-character terminals.  On magic cookie terminals, these
 | |
| give the commands to write the magic cookies.  On per-character terminals,
 | |
| they change the current modes that affect future output and erasure.  Some
 | |
| simple applications can use these commands without knowing whether or not
 | |
| they work by means of cookies.
 | |
| 
 | |
| However, a program that maintains and updates a display needs to know
 | |
| whether the terminal uses magic cookies, and exactly what their effect is.
 | |
| This information comes from the @samp{sg} capability.
 | |
| 
 | |
| The @samp{sg} capability is a numeric capability whose presence indicates
 | |
| that the terminal uses magic cookies for appearance modes.  Its value is
 | |
| the number of character positions that a magic cookie occupies.  Usually
 | |
| the cookie occupies one or more character positions on the screen, and these
 | |
| character positions are displayed as blank, but in some terminals the
 | |
| cookie has zero width.
 | |
| 
 | |
| The @samp{sg} capability describes both the magic cookie to turn standout
 | |
| on and the cookie to turn it off.  This makes the assumption that both
 | |
| kinds of cookie have the same width on the screen.  If that is not true,
 | |
| the narrower cookie must be ``widened'' with spaces until it has the same
 | |
| width as the other.
 | |
| 
 | |
| On some magic cookie terminals, each line always starts with normal
 | |
| display; in other words, the scope of a magic cookie never extends over
 | |
| more than one line.  But on other terminals, one magic cookie affects all
 | |
| the lines below it unless explicitly canceled.  Termcap does not define any
 | |
| way to distinguish these two ways magic cookies can work.  To be safe, it
 | |
| is best to put a cookie at the beginning of each line.
 | |
| 
 | |
| On some per-character terminals, standout mode or other appearance modes
 | |
| may be canceled by moving the cursor.  On others, moving the cursor has no
 | |
| effect on the state of the appearance modes.  The latter class of terminals
 | |
| are given the flag capability @samp{ms} (``can move in standout'').  All
 | |
| programs that might have occasion to move the cursor while appearance modes
 | |
| are turned on must check for this flag; if it is not present, they should
 | |
| reset appearance modes to normal before doing cursor motion.
 | |
| 
 | |
| A program that has turned on only standout mode should use @samp{se} to
 | |
| reset the standout mode to normal.  A program that has turned on only
 | |
| alternate character set mode should use @samp{ae} to return it to normal.
 | |
| If it is possible that any other appearance modes are turned on, use the
 | |
| @samp{me} capability to return them to normal.
 | |
| 
 | |
| Note that the commands to turn on one appearance mode, including @samp{so}
 | |
| and @samp{mb} @dots{} @samp{mr}, if used while some other appearance modes
 | |
| are turned on, may combine the two modes on some terminals but may turn off
 | |
| the mode previously enabled on other terminals.  This is because some
 | |
| terminals do not have a command to set or clear one appearance mode without
 | |
| changing the others.  Programs should not attempt to use appearance modes
 | |
| in combination except with @samp{sa}, and when switching from one single
 | |
| mode to another should always turn off the previously enabled mode and then
 | |
| turn on the new desired mode.
 | |
| 
 | |
| On some old terminals, the @samp{so} and @samp{se} commands may be the same
 | |
| command, which has the effect of turning standout on if it is off, or off
 | |
| it is on.  It is therefore risky for a program to output extra @samp{se}
 | |
| commands for good measure.  Fortunately, all these terminals are obsolete.
 | |
| 
 | |
| Programs that update displays in which standout-text may be replaced with
 | |
| non-standout text must check for the @samp{xs} flag.  In a per-character
 | |
| terminal, this flag says that the only way to remove standout once written is
 | |
| to clear that portion of the line with the @samp{ce} string or something
 | |
| even more powerful (@pxref{Clearing}); just writing new characters at those
 | |
| screen positions will not change the modes in effect there.  In a magic
 | |
| cookie terminal, @samp{xs} says that the only way to remove a cookie is to
 | |
| clear a portion of the line that includes the cookie; writing a different
 | |
| cookie at the same position does not work.
 | |
| 
 | |
| Such programs must also check for the @samp{xt} flag, which means that the
 | |
| terminal is a Teleray 1061.  On this terminal it is impossible to position
 | |
| the cursor at the front of a magic cookie, so the only two ways to remove a
 | |
| cookie are (1) to delete the line it is on or (2) to position the cursor at
 | |
| least one character before it (possibly on a previous line) and output the
 | |
| @samp{se} string, which on these terminals finds and removes the next
 | |
| @samp{so} magic cookie on the screen.  (It may also be possible to remove a
 | |
| cookie which is not at the beginning of a line by clearing that line.)  The
 | |
| @samp{xt} capability also has implications for the use of tab characters,
 | |
| but in that regard it is obsolete (@xref{Cursor Motion}).
 | |
| 
 | |
| @table @samp
 | |
| @item so
 | |
| @kindex so
 | |
| String of commands to enter standout mode.
 | |
| 
 | |
| @item se
 | |
| @kindex se
 | |
| String of commands to leave standout mode.
 | |
| 
 | |
| @item sg
 | |
| @kindex sg
 | |
| Numeric capability, the width on the screen of the magic cookie.  This
 | |
| capability is absent in terminals that record appearance modes
 | |
| character by character.
 | |
| 
 | |
| @item ms
 | |
| @kindex ms
 | |
| Flag whose presence means that it is safe to move the cursor while the
 | |
| appearance modes are not in the normal state.  If this flag is absent,
 | |
| programs should always reset the appearance modes to normal before
 | |
| moving the cursor.
 | |
| 
 | |
| @item xs
 | |
| @kindex xs
 | |
| Flag whose presence means that the only way to reset appearance modes
 | |
| already on the screen is to clear to end of line.  On a per-character
 | |
| terminal, you must clear the area where the modes are set.  On a magic
 | |
| cookie terminal, you must clear an area containing the cookie.
 | |
| See the discussion above.
 | |
| 
 | |
| @item xt
 | |
| @kindex xt
 | |
| Flag whose presence means that the cursor cannot be positioned right
 | |
| in front of a magic cookie, and that @samp{se} is a command to delete
 | |
| the next magic cookie following the cursor.  See discussion above.
 | |
| 
 | |
| @item mb
 | |
| @kindex mb
 | |
| String of commands to enter blinking mode.
 | |
| 
 | |
| @item md
 | |
| @kindex md
 | |
| String of commands to enter double-bright mode.
 | |
| 
 | |
| @item mh
 | |
| @kindex mh
 | |
| String of commands to enter half-bright mode.
 | |
| 
 | |
| @item mk
 | |
| @kindex mk
 | |
| String of commands to enter invisible mode.
 | |
| 
 | |
| @item mp
 | |
| @kindex mp
 | |
| String of commands to enter protected mode.
 | |
| 
 | |
| @item mr
 | |
| @kindex mr
 | |
| String of commands to enter reverse-video mode.
 | |
| 
 | |
| @item me
 | |
| @kindex me
 | |
| String of commands to turn off all appearance modes, including
 | |
| standout mode and underline mode.  On some terminals it also turns off
 | |
| alternate character set mode; on others, it may not.  This capability
 | |
| must be present if any of @samp{mb} @dots{} @samp{mr} is present.
 | |
| 
 | |
| @item as
 | |
| @kindex as
 | |
| String of commands to turn on alternate character set mode.  This mode
 | |
| assigns some or all graphic characters an alternate picture on the
 | |
| screen.  There is no standard as to what the alternate pictures look
 | |
| like.
 | |
| 
 | |
| @item ae
 | |
| @kindex ae
 | |
| String of commands to turn off alternate character set mode.
 | |
| 
 | |
| @item sa
 | |
| @kindex sa
 | |
| String of commands to turn on an arbitrary combination of appearance
 | |
| modes.  It accepts 9 parameters, each of which controls a particular
 | |
| kind of appearance mode.  A parameter should be 1 to turn its appearance
 | |
| mode on, or zero to turn that mode off.  Most terminals do not support
 | |
| the @samp{sa} capability, even among those that do have various
 | |
| appearance modes.
 | |
| 
 | |
| The nine parameters are, in order, @var{standout}, @var{underline},
 | |
| @var{reverse}, @var{blink}, @var{half-bright}, @var{double-bright},
 | |
| @var{blank}, @var{protect}, @var{alt char set}.
 | |
| @end table
 | |
| 
 | |
| @node Underlining, Cursor Visibility, Standout, Capabilities
 | |
| @section Underlining
 | |
| @cindex underlining
 | |
| 
 | |
| Underlining on most terminals is a kind of appearance mode, much like
 | |
| standout mode.  Therefore, it may be implemented using magic cookies or as
 | |
| a flag in the terminal whose current state affects each character that is
 | |
| output.  @xref{Standout}, for a full explanation.
 | |
| 
 | |
| The @samp{ug} capability is a numeric capability whose presence indicates
 | |
| that the terminal uses magic cookies for underlining.  Its value is the
 | |
| number of character positions that a magic cookie for underlining occupies;
 | |
| it is used for underlining just as @samp{sg} is used for standout.  Aside
 | |
| from the simplest applications, it is impossible to use underlining
 | |
| correctly without paying attention to the value of @samp{ug}.
 | |
| 
 | |
| @table @samp
 | |
| @item us
 | |
| @kindex us
 | |
| String of commands to turn on underline mode or to output a magic cookie
 | |
| to start underlining.
 | |
| 
 | |
| @item ue
 | |
| @kindex ue
 | |
| String of commands to turn off underline mode or to output a magic
 | |
| cookie to stop underlining.
 | |
| 
 | |
| @item ug
 | |
| @kindex ug
 | |
| Width of magic cookie that represents a change of underline mode;
 | |
| or missing, if the terminal does not use a magic cookie for this.
 | |
| 
 | |
| @item ms
 | |
| @kindex ms
 | |
| Flag whose presence means that it is safe to move the cursor while the
 | |
| appearance modes are not in the normal state.  Underlining is an
 | |
| appearance mode.  If this flag is absent, programs should always turn
 | |
| off underlining before moving the cursor.
 | |
| @end table
 | |
| 
 | |
| There are two other, older ways of doing underlining: there can be a
 | |
| command to underline a single character, or the output of @samp{_}, the
 | |
| ASCII underscore character, as an overstrike could cause a character to be
 | |
| underlined.  New programs need not bother to handle these capabilities
 | |
| unless the author cares strongly about the obscure terminals which support
 | |
| them.  However, terminal descriptions should provide these capabilities
 | |
| when appropriate.
 | |
| 
 | |
| @table @samp
 | |
| @item uc
 | |
| @kindex uc
 | |
| String of commands to underline the character under the cursor, and
 | |
| move the cursor right.
 | |
| 
 | |
| @item ul
 | |
| @kindex ul
 | |
| Flag whose presence means that the terminal can underline by
 | |
| overstriking an underscore character (@samp{_}); some terminals can do
 | |
| this even though they do not support overstriking in general.  An
 | |
| implication of this flag is that when outputting new text to overwrite
 | |
| old text, underscore characters must be treated specially lest they
 | |
| underline the old text instead.
 | |
| @end table
 | |
| 
 | |
| @node Cursor Visibility, Bell, Underlining, Capabilities
 | |
| @section Cursor Visibility
 | |
| @cindex visibility
 | |
| 
 | |
| Some terminals have the ability to make the cursor invisible, or to enhance
 | |
| it.  Enhancing the cursor is often done by programs that plan to use the
 | |
| cursor to indicate to the user a position of interest that may be anywhere
 | |
| on the screen---for example, the Emacs editor enhances the cursor on entry.
 | |
| Such programs should always restore the cursor to normal on exit.
 | |
| 
 | |
| @table @samp
 | |
| @item vs
 | |
| @kindex vs
 | |
| String of commands to enhance the cursor.
 | |
| 
 | |
| @item vi
 | |
| @kindex vi
 | |
| String of commands to make the cursor invisible.
 | |
| 
 | |
| @item ve
 | |
| @kindex ve
 | |
| String of commands to return the cursor to normal.
 | |
| @end table
 | |
| 
 | |
| If you define either @samp{vs} or @samp{vi}, you must also define @samp{ve}.
 | |
| 
 | |
| @node Bell, Keypad, Cursor Visibility, Capabilities
 | |
| @section Bell
 | |
| @cindex bell
 | |
| @cindex visible bell
 | |
| 
 | |
| Here we describe commands to make the terminal ask for the user to pay
 | |
| attention to it.
 | |
| 
 | |
| @table @samp
 | |
| @item bl
 | |
| @kindex bl
 | |
| String of commands to cause the terminal to make an audible sound.  If
 | |
| this capability is absent, the terminal has no way to make a suitable
 | |
| sound.
 | |
| 
 | |
| @item vb
 | |
| @kindex vb
 | |
| String of commands to cause the screen to flash to attract attention
 | |
| (``visible bell'').  If this capability is absent, the terminal has no
 | |
| way to do such a thing.
 | |
| @end table
 | |
| 
 | |
| @node Keypad, Meta Key, Bell, Capabilities
 | |
| @section Keypad and Function Keys
 | |
| 
 | |
| Many terminals have arrow and function keys that transmit specific
 | |
| character sequences to the computer.  Since the precise sequences used
 | |
| depend on the terminal, termcap defines capabilities used to say what the
 | |
| sequences are.  Unlike most termcap string-valued capabilities, these are
 | |
| not strings of commands to be sent to the terminal, rather strings that
 | |
| are received from the terminal.
 | |
| 
 | |
| Programs that expect to use keypad keys should check, initially, for a
 | |
| @samp{ks} capability and send it, to make the keypad actually transmit.
 | |
| Such programs should also send the @samp{ke} string when exiting.
 | |
| 
 | |
| @table @asis
 | |
| @item @samp{ks}
 | |
| @kindex ka@dots{}ku
 | |
| String of commands to make the keypad keys transmit.  If this
 | |
| capability is not provided, but the others in this section are,
 | |
| programs may assume that the keypad keys always transmit.
 | |
| 
 | |
| @item @samp{ke}
 | |
| String of commands to make the keypad keys work locally.  This
 | |
| capability is provided only if @samp{ks} is.
 | |
| 
 | |
| @item @samp{kl}
 | |
| String of input characters sent by typing the left-arrow key.  If this
 | |
| capability is missing, you cannot expect the terminal to have a
 | |
| left-arrow key that transmits anything to the computer.
 | |
| 
 | |
| @item @samp{kr}
 | |
| String of input characters sent by typing the right-arrow key.
 | |
| 
 | |
| @item @samp{ku}
 | |
| String of input characters sent by typing the up-arrow key.
 | |
| 
 | |
| @item @samp{kd}
 | |
| String of input characters sent by typing the down-arrow key.
 | |
| 
 | |
| @item @samp{kh}
 | |
| String of input characters sent by typing the ``home-position'' key.
 | |
| 
 | |
| @item @samp{K1} @dots{} @samp{K5}
 | |
| @kindex K1@dots{}K5
 | |
| Strings of input characters sent by the five other keys in a 3-by-3
 | |
| array that includes the arrow keys, if the keyboard has such a 3-by-3
 | |
| array.  Note that one of these keys may be the ``home-position'' key,
 | |
| in which case one of these capabilities will have the same value as
 | |
| the @samp{kh} key.
 | |
| 
 | |
| @item @samp{k0}
 | |
| String of input characters sent by function key 10 (or 0, if the terminal
 | |
| has one labeled 0).
 | |
| 
 | |
| @item @samp{k1} @dots{} @samp{k9}
 | |
| @kindex k1@dots{}k9
 | |
| Strings of input characters sent by function keys 1 through 9,
 | |
| provided for those function keys that exist.
 | |
| 
 | |
| @item @samp{kn}
 | |
| Number: the number of numbered function keys, if there are more than
 | |
| 10.
 | |
| 
 | |
| @item @samp{l0} @dots{} @samp{l9}
 | |
| @kindex l0@dots{}l9
 | |
| Strings which are the labels appearing on the keyboard on the keys
 | |
| described by the capabilities @samp{k0} @dots{} @samp{l9}.  These
 | |
| capabilities should be left undefined if the labels are @samp{f0} or
 | |
| @samp{f10} and @samp{f1} @dots{} @samp{f9}.@refill
 | |
| 
 | |
| @item @samp{kH}
 | |
| @kindex kA@dots{}kT
 | |
| String of input characters sent by the ``home down'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kb}
 | |
| String of input characters sent by the ``backspace'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{ka}
 | |
| String of input characters sent by the ``clear all tabs'' key, if there
 | |
| is one.
 | |
| 
 | |
| @item @samp{kt}
 | |
| String of input characters sent by the ``clear tab stop this column''
 | |
| key, if there is one.
 | |
| 
 | |
| @item @samp{kC}
 | |
| String of input characters sent by the ``clear screen'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kD}
 | |
| String of input characters sent by the ``delete character'' key, if
 | |
| there is one.
 | |
| 
 | |
| @item @samp{kL}
 | |
| String of input characters sent by the ``delete line'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kM}
 | |
| String of input characters sent by the ``exit insert mode'' key, if
 | |
| there is one.
 | |
| 
 | |
| @item @samp{kE}
 | |
| String of input characters sent by the ``clear to end of line'' key, if
 | |
| there is one.
 | |
| 
 | |
| @item @samp{kS}
 | |
| String of input characters sent by the ``clear to end of screen'' key,
 | |
| if there is one.
 | |
| 
 | |
| @item @samp{kI}
 | |
| String of input characters sent by the ``insert character'' or ``enter
 | |
| insert mode'' key, if there is one.
 | |
| 
 | |
| @item @samp{kA}
 | |
| String of input characters sent by the ``insert line'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kN}
 | |
| String of input characters sent by the ``next page'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kP}
 | |
| String of input characters sent by the ``previous page'' key, if there is
 | |
| one.
 | |
| 
 | |
| @item @samp{kF}
 | |
| String of input characters sent by the ``scroll forward'' key, if there
 | |
| is one.
 | |
| 
 | |
| @item @samp{kR}
 | |
| String of input characters sent by the ``scroll reverse'' key, if there
 | |
| is one.
 | |
| 
 | |
| @item @samp{kT}
 | |
| String of input characters sent by the ``set tab stop in this column''
 | |
| key, if there is one.
 | |
| 
 | |
| @item @samp{ko}
 | |
| String listing the other function keys the terminal has.  This is a
 | |
| very obsolete way of describing the same information found in the
 | |
| @samp{kH} @dots{} @samp{kT} keys.  The string contains a list of
 | |
| two-character termcap capability names, separated by commas.  The
 | |
| meaning is that for each capability name listed, the terminal has a
 | |
| key which sends the string which is the value of that capability.  For
 | |
| example, the value @samp{:ko=cl,ll,sf,sr:} says that the terminal has
 | |
| four function keys which mean ``clear screen'', ``home down'',
 | |
| ``scroll forward'' and ``scroll reverse''.@refill
 | |
| @end table
 | |
| 
 | |
| @node Meta Key, Initialization, Keypad, Capabilities
 | |
| @section Meta Key
 | |
| 
 | |
| @cindex meta key
 | |
| A Meta key is a key on the keyboard that modifies each character you type
 | |
| by controlling the 0200 bit.  This bit is on if and only if the Meta key is
 | |
| held down when the character is typed.  Characters typed using the Meta key
 | |
| are called Meta characters.  Emacs uses Meta characters as editing
 | |
| commands.
 | |
| 
 | |
| @table @samp
 | |
| @item km
 | |
| @kindex km
 | |
| Flag whose presence means that the terminal has a Meta key.
 | |
| 
 | |
| @item mm
 | |
| @kindex mm
 | |
| String of commands to enable the functioning of the Meta key.
 | |
| 
 | |
| @item mo
 | |
| @kindex mo
 | |
| String of commands to disable the functioning of the Meta key.
 | |
| @end table
 | |
| 
 | |
| If the terminal has @samp{km} but does not have @samp{mm} and @samp{mo}, it
 | |
| means that the Meta key always functions.  If it has @samp{mm} and
 | |
| @samp{mo}, it means that the Meta key can be turned on or off.  Send the
 | |
| @samp{mm} string to turn it on, and the @samp{mo} string to turn it off.
 | |
| I do not know why one would ever not want it to be on.
 | |
| 
 | |
| @node Initialization, Pad Specs, Meta Key, Capabilities
 | |
| @section Initialization
 | |
| @cindex reset
 | |
| @cindex initialization
 | |
| @cindex tab stops
 | |
| 
 | |
| @table @samp
 | |
| @item ti
 | |
| @kindex ti
 | |
| String of commands to put the terminal into whatever special modes are
 | |
| needed or appropriate for programs that move the cursor
 | |
| nonsequentially around the screen.  Programs that use termcap to do
 | |
| full-screen display should output this string when they start up.
 | |
| 
 | |
| @item te
 | |
| @kindex te
 | |
| String of commands to undo what is done by the @samp{ti} string.
 | |
| Programs that output the @samp{ti} string on entry should output this
 | |
| string when they exit.
 | |
| 
 | |
| @item is
 | |
| @kindex is
 | |
| String of commands to initialize the terminal for each login session.
 | |
| 
 | |
| @item if
 | |
| @kindex if
 | |
| String which is the name of a file containing the string of commands
 | |
| to initialize the terminal for each session of use.  Normally @samp{is}
 | |
| and @samp{if} are not both used.
 | |
| 
 | |
| @item i1
 | |
| @itemx i3
 | |
| @kindex i1
 | |
| @kindex i3
 | |
| Two more strings of commands to initialize the terminal for each login
 | |
| session.  The @samp{i1} string (if defined) is output before @samp{is}
 | |
| or @samp{if}, and the @samp{i3} string (if defined) is output after.
 | |
| 
 | |
| The reason for having three separate initialization strings is to make
 | |
| it easier to define a group of related terminal types with slightly
 | |
| different initializations.  Define two or three of the strings in the
 | |
| basic type; then the other types can override one or two of the
 | |
| strings.
 | |
| 
 | |
| @item rs
 | |
| @kindex rs
 | |
| String of commands to reset the terminal from any strange mode it may
 | |
| be in.  Normally this includes the @samp{is} string (or other commands
 | |
| with the same effects) and more.  What would go in the @samp{rs}
 | |
| string but not in the @samp{is} string are annoying or slow commands
 | |
| to bring the terminal back from strange modes that nobody would
 | |
| normally use.
 | |
| 
 | |
| @item it
 | |
| @kindex it
 | |
| Numeric value, the initial spacing between hardware tab stop columns
 | |
| when the terminal is powered up.  Programs to initialize the terminal
 | |
| can use this to decide whether there is a need to set the tab stops.
 | |
| If the initial width is 8, well and good; if it is not 8, then the
 | |
| tab stops should be set; if they cannot be set, the kernel is told
 | |
| to convert tabs to spaces, and other programs will observe this and do
 | |
| likewise.
 | |
| 
 | |
| @item ct
 | |
| @kindex ct
 | |
| String of commands to clear all tab stops.
 | |
| 
 | |
| @item st
 | |
| @kindex st
 | |
| String of commands to set tab stop at current cursor column on all
 | |
| lines.
 | |
| 
 | |
| @item NF
 | |
| @kindex NF
 | |
| Flag whose presence means that the terminal does not support XON/XOFF
 | |
| flow control.  Programs should not send XON (@kbd{C-q}) or XOFF
 | |
| (@kbd{C-s}) characters to the terminal.
 | |
| @end table
 | |
| 
 | |
| @node Pad Specs, Status Line, Initialization, Capabilities
 | |
| @section Padding Capabilities
 | |
| @cindex padding
 | |
| 
 | |
| There are two terminal capabilities that exist just to explain the proper
 | |
| way to obey the padding specifications in all the command string
 | |
| capabilities.  One, @samp{pc}, must be obeyed by all termcap-using
 | |
| programs.
 | |
| 
 | |
| @table @samp
 | |
| @item pb
 | |
| @kindex pb
 | |
| Numeric value, the lowest baud rate at which padding is actually
 | |
| needed.  Programs may check this and refrain from doing any padding at
 | |
| lower speeds.
 | |
| 
 | |
| @item pc
 | |
| @kindex pc
 | |
| String of commands for padding.  The first character of this string is
 | |
| to be used as the pad character, instead of using null characters for
 | |
| padding.  If @samp{pc} is not provided, use null characters.  Every
 | |
| program that uses termcap must look up this capability and use it to
 | |
| set the variable @code{PC} that is used by @code{tputs}.
 | |
| @xref{Padding}.
 | |
| @end table
 | |
| 
 | |
| Some termcap capabilities exist just to specify the amount of padding that
 | |
| the kernel should give to cursor motion commands used in ordinary
 | |
| sequential output.
 | |
| 
 | |
| @table @samp
 | |
| @item dC
 | |
| @kindex dC
 | |
| Numeric value, the number of msec of padding needed for the
 | |
| carriage-return character.
 | |
| 
 | |
| @item dN
 | |
| @kindex dN
 | |
| Numeric value, the number of msec of padding needed for the newline
 | |
| (linefeed) character.
 | |
| 
 | |
| @item dB
 | |
| @kindex dB
 | |
| Numeric value, the number of msec of padding needed for the backspace
 | |
| character.
 | |
| 
 | |
| @item dF
 | |
| @kindex dF
 | |
| Numeric value, the number of msec of padding needed for the formfeed
 | |
| character.
 | |
| 
 | |
| @item dT
 | |
| @kindex dT
 | |
| Numeric value, the number of msec of padding needed for the tab
 | |
| character.
 | |
| @end table
 | |
| 
 | |
| In some systems, the kernel uses the above capabilities; in other systems,
 | |
| the kernel uses the paddings specified in the string capabilities
 | |
| @samp{cr}, @samp{sf}, @samp{le}, @samp{ff} and @samp{ta}.  Descriptions of
 | |
| terminals which require such padding should contain the @samp{dC} @dots{}
 | |
| @samp{dT} capabilities and also specify the appropriate padding in the
 | |
| corresponding string capabilities.  Since no modern terminals require
 | |
| padding for ordinary sequential output, you probably won't need to do
 | |
| either of these things.
 | |
| 
 | |
| @node Status Line, Half-Line, Pad Specs, Capabilities
 | |
| @section Status Line
 | |
| 
 | |
| @cindex status line
 | |
| A @dfn{status line} is a line on the terminal that is not used for ordinary
 | |
| display output but instead used for a special message.  The intended use is
 | |
| for a continuously updated description of what the user's program is doing,
 | |
| and that is where the name ``status line'' comes from, but in fact it could
 | |
| be used for anything.  The distinguishing characteristic of a status line
 | |
| is that ordinary output to the terminal does not affect it; it changes only
 | |
| if the special status line commands of this section are used.
 | |
| 
 | |
| @table @samp
 | |
| @item hs
 | |
| @kindex hs
 | |
| Flag whose presence means that the terminal has a status line.  If a
 | |
| terminal description specifies that there is a status line, it must
 | |
| provide the @samp{ts} and @samp{fs} capabilities.
 | |
| 
 | |
| @item ts
 | |
| @kindex ts
 | |
| String of commands to move the terminal cursor into the status line.
 | |
| Usually these commands must specifically record the old cursor
 | |
| position for the sake of the @samp{fs} string.
 | |
| 
 | |
| @item fs
 | |
| @kindex fs
 | |
| String of commands to move the cursor back from the status line to its
 | |
| previous position (outside the status line).
 | |
| 
 | |
| @item es
 | |
| @kindex es
 | |
| Flag whose presence means that other display commands work while
 | |
| writing the status line.  In other words, one can clear parts of it,
 | |
| insert or delete characters, move the cursor within it using @samp{ch}
 | |
| if there is a @samp{ch} capability, enter and leave standout mode, and
 | |
| so on.
 | |
| 
 | |
| @item ds
 | |
| @kindex ds
 | |
| String of commands to disable the display of the status line.  This
 | |
| may be absent, if there is no way to disable the status line display.
 | |
| 
 | |
| @item ws
 | |
| @kindex ws
 | |
| Numeric value, the width of the status line.  If this capability is
 | |
| absent in a terminal that has a status line, it means the status line
 | |
| is the same width as the other lines.
 | |
| 
 | |
| Note that the value of @samp{ws} is sometimes as small as 8.
 | |
| @end table
 | |
| 
 | |
| @node Half-Line, Printer, Status Line, Capabilities
 | |
| @section Half-Line Motion
 | |
| 
 | |
| Some terminals have commands for moving the cursor vertically by half-lines,
 | |
| useful for outputting subscripts and superscripts.  Mostly it is hardcopy
 | |
| terminals that have such features.
 | |
| 
 | |
| @table @samp
 | |
| @item hu
 | |
| @kindex hu
 | |
| String of commands to move the cursor up half a line.  If the terminal
 | |
| is a display, it is your responsibility to avoid moving up past the
 | |
| top line; however, most likely the terminal that supports this is a
 | |
| hardcopy terminal and there is nothing to be concerned about.
 | |
| 
 | |
| @item hd
 | |
| @kindex hd
 | |
| String of commands to move the cursor down half a line.  If the
 | |
| terminal is a display, it is your responsibility to avoid moving down
 | |
| past the bottom line, etc.
 | |
| @end table
 | |
| 
 | |
| @node Printer,  , Half-Line, Capabilities
 | |
| @section Controlling Printers Attached to Terminals
 | |
| @cindex printer
 | |
| 
 | |
| Some terminals have attached hardcopy printer ports.  They may be able to
 | |
| copy the screen contents to the printer; they may also be able to redirect
 | |
| output to the printer.  Termcap does not have anything to tell the program
 | |
| whether the redirected output appears also on the screen; it does on some
 | |
| terminals but not all.
 | |
| 
 | |
| @table @samp
 | |
| @item ps
 | |
| @kindex ps
 | |
| String of commands to cause the contents of the screen to be printed.
 | |
| If it is absent, the screen contents cannot be printed.
 | |
| 
 | |
| @item po
 | |
| @kindex po
 | |
| String of commands to redirect further output to the printer.
 | |
| 
 | |
| @item pf
 | |
| @kindex pf
 | |
| String of commands to terminate redirection of output to the printer.
 | |
| This capability must be present in the description if @samp{po} is.
 | |
| 
 | |
| @item pO
 | |
| @kindex pO
 | |
| String of commands to redirect output to the printer for next @var{n}
 | |
| characters of output, regardless of what they are.  Redirection will
 | |
| end automatically after @var{n} characters of further output.  Until
 | |
| then, nothing that is output can end redirection, not even the
 | |
| @samp{pf} string if there is one.  The number @var{n} should not be
 | |
| more than 255.
 | |
| 
 | |
| One use of this capability is to send non-text byte sequences (such as
 | |
| bit-maps) to the printer.
 | |
| @end table
 | |
| 
 | |
| Most terminals with printers do not support all of @samp{ps}, @samp{po} and
 | |
| @samp{pO}; any one or two of them may be supported.  To make a program that
 | |
| can send output to all kinds of printers, it is necessary to check for all
 | |
| three of these capabilities, choose the most convenient of the ones that
 | |
| are provided, and use it in its own appropriate fashion.
 | |
| 
 | |
| @node Summary, Var Index, Capabilities, Top
 | |
| @chapter Summary of Capability Names
 | |
| 
 | |
| Here are all the terminal capability names in alphabetical order
 | |
| with a brief description of each.  For cross references to their definitions,
 | |
| see the index of capability names (@pxref{Cap Index}).
 | |
| 
 | |
| @table @samp
 | |
| @item ae
 | |
| String to turn off alternate character set mode.
 | |
| @item al
 | |
| String to insert a blank line before the cursor.
 | |
| @item AL
 | |
| String to insert @var{n} blank lines before the cursor.
 | |
| @item am
 | |
| Flag: output to last column wraps cursor to next line.
 | |
| @item as
 | |
| String to turn on alternate character set mode.like.
 | |
| @item bc
 | |
| Very obsolete alternative name for the @samp{le} capability.
 | |
| @item bl
 | |
| String to sound the bell.
 | |
| @item bs
 | |
| Obsolete flag: ASCII backspace may be used for leftward motion.
 | |
| @item bt
 | |
| String to move the cursor left to the previous hardware tab stop column.
 | |
| @item bw
 | |
| Flag: @samp{le} at left margin wraps to end of previous line.
 | |
| @item CC
 | |
| String to change terminal's command character.
 | |
| @item cd
 | |
| String to clear the line the cursor is on, and following lines.
 | |
| @item ce
 | |
| String to clear from the cursor to the end of the line.
 | |
| @item ch
 | |
| String to position the cursor at column @var{c} in the same line.
 | |
| @item cl
 | |
| String to clear the entire screen and put cursor at upper left corner.
 | |
| @item cm
 | |
| String to position the cursor at line @var{l}, column @var{c}.
 | |
| @item CM
 | |
| String to position the cursor at line @var{l}, column
 | |
| @var{c}, relative to display memory.
 | |
| @item co
 | |
| Number: width of the screen.
 | |
| @item cr
 | |
| String to move cursor sideways to left margin.
 | |
| @item cs
 | |
| String to set the scroll region.
 | |
| @item cS
 | |
| Alternate form of string to set the scroll region.
 | |
| @item ct
 | |
| String to clear all tab stops.
 | |
| @item cv
 | |
| String to position the cursor at line @var{l} in the same column.
 | |
| @item da
 | |
| Flag: data scrolled off top of screen may be scrolled back.
 | |
| @item db
 | |
| Flag: data scrolled off bottom of screen may be scrolled back.
 | |
| @item dB
 | |
| Obsolete number: msec of padding needed for the backspace character.
 | |
| @item dc
 | |
| String to delete one character position at the cursor.
 | |
| @item dC
 | |
| Obsolete number: msec of padding needed for the carriage-return character.
 | |
| @item DC
 | |
| String to delete @var{n} characters starting at the cursor.
 | |
| @item dF
 | |
| Obsolete number: msec of padding needed for the formfeed character.
 | |
| @item dl
 | |
| String to delete the line the cursor is on.
 | |
| @item DL
 | |
| String to delete @var{n} lines starting with the cursor's line.
 | |
| @item dm
 | |
| String to enter delete mode.
 | |
| @item dN
 | |
| Obsolete number: msec of padding needed for the newline character.
 | |
| @item do
 | |
| String to move the cursor vertically down one line.
 | |
| @item DO
 | |
| String to move cursor vertically down @var{n} lines.
 | |
| @item ds
 | |
| String to disable the display of the status line.
 | |
| @item dT
 | |
| Obsolete number: msec of padding needed for the tab character.
 | |
| @item ec
 | |
| String of commands to clear @var{n} characters at cursor.
 | |
| @item ed
 | |
| String to exit delete mode.
 | |
| @item ei
 | |
| String to leave insert mode.
 | |
| @item eo
 | |
| Flag: output of a space can erase an overstrike.
 | |
| @item es
 | |
| Flag: other display commands work while writing the status line.
 | |
| @item ff
 | |
| String to advance to the next page, for a hardcopy terminal.
 | |
| @item fs
 | |
| String to move the cursor back from the status line to its
 | |
| previous position (outside the status line).
 | |
| @item gn
 | |
| Flag: this terminal type is generic, not real.
 | |
| @item hc
 | |
| Flag: hardcopy terminal.
 | |
| @item hd
 | |
| String to move the cursor down half a line.
 | |
| @item ho
 | |
| String to position cursor at upper left corner.
 | |
| @item hs
 | |
| Flag: the terminal has a status line.
 | |
| @item hu
 | |
| String to move the cursor up half a line.
 | |
| @item hz
 | |
| Flag: terminal cannot accept @samp{~} as output.
 | |
| @item i1
 | |
| String to initialize the terminal for each login session.
 | |
| @item i3
 | |
| String to initialize the terminal for each login session.
 | |
| @item ic
 | |
| String to insert one character position at the cursor.
 | |
| @item IC
 | |
| String to insert @var{n} character positions at the cursor.
 | |
| @item if
 | |
| String naming a file of commands to initialize the terminal.
 | |
| @item im
 | |
| String to enter insert mode.
 | |
| @item in
 | |
| Flag: outputting a space is different from moving over empty positions.
 | |
| @item ip
 | |
| String to output following an inserted character in insert mode.
 | |
| @item is
 | |
| String to initialize the terminal for each login session.
 | |
| @item it
 | |
| Number: initial spacing between hardware tab stop columns.
 | |
| @item k0
 | |
| String of input sent by function key 0 or 10.
 | |
| @item k1 @dots{} k9
 | |
| Strings of input sent by function keys 1 through 9.
 | |
| @item K1 @dots{} K5
 | |
| Strings sent by the five other keys in 3-by-3 array with arrows.
 | |
| @item ka
 | |
| String of input sent by the ``clear all tabs'' key.
 | |
| @item kA
 | |
| String of input sent by the ``insert line'' key.
 | |
| @item kb
 | |
| String of input sent by the ``backspace'' key.
 | |
| @item kC
 | |
| String of input sent by the ``clear screen'' key.
 | |
| @item kd
 | |
| String of input sent by typing the down-arrow key.
 | |
| @item kD
 | |
| String of input sent by the ``delete character'' key.
 | |
| @item ke
 | |
| String to make the function keys work locally.
 | |
| @item kE
 | |
| String of input sent by the ``clear to end of line'' key.
 | |
| @item kF
 | |
| String of input sent by the ``scroll forward'' key.
 | |
| @item kh
 | |
| String of input sent by typing the ``home-position'' key.
 | |
| @item kH
 | |
| String of input sent by the ``home down'' key.
 | |
| @item kI
 | |
| String of input sent by the ``insert character'' or ``enter
 | |
| insert mode'' key.
 | |
| @item kl
 | |
| String of input sent by typing the left-arrow key.
 | |
| @item kL
 | |
| String of input sent by the ``delete line'' key.
 | |
| @item km
 | |
| Flag: the terminal has a Meta key.
 | |
| @item kM
 | |
| String of input sent by the ``exit insert mode'' key.
 | |
| @item kn
 | |
| Numeric value, the number of numbered function keys.
 | |
| @item kN
 | |
| String of input sent by the ``next page'' key.
 | |
| @item ko
 | |
| Very obsolete string listing the terminal's named function keys.
 | |
| @item kP
 | |
| String of input sent by the ``previous page'' key.
 | |
| @item kr
 | |
| String of input sent by typing the right-arrow key.
 | |
| @item kR
 | |
| String of input sent by the ``scroll reverse'' key.
 | |
| @item ks
 | |
| String to make the function keys transmit.
 | |
| @item kS
 | |
| String of input sent by the ``clear to end of screen'' key.
 | |
| @item kt
 | |
| String of input sent by the ``clear tab stop this column'' key.
 | |
| @item kT
 | |
| String of input sent by the ``set tab stop in this column'' key.
 | |
| @item ku
 | |
| String of input sent by typing the up-arrow key.
 | |
| @item l0
 | |
| String on keyboard labelling function key 0 or 10.
 | |
| @item l1 @dots{} l9
 | |
| Strings on keyboard labelling function keys 1 through 9.
 | |
| @item le
 | |
| String to move the cursor left one column.
 | |
| @item LE
 | |
| String to move cursor left @var{n} columns.
 | |
| @item li
 | |
| Number: height of the screen.
 | |
| @item ll
 | |
| String to position cursor at lower left corner.
 | |
| @item lm
 | |
| Number: lines of display memory.
 | |
| @item LP
 | |
| Flag: writing to last column of last line will not scroll.
 | |
| @item mb
 | |
| String to enter blinking mode.
 | |
| @item md
 | |
| String to enter double-bright mode.
 | |
| @item me
 | |
| String to turn off all appearance modes
 | |
| @item mh
 | |
| String to enter half-bright mode.
 | |
| @item mi
 | |
| Flag: cursor motion in insert mode is safe.
 | |
| @item mk
 | |
| String to enter invisible mode.
 | |
| @item mm
 | |
| String to enable the functioning of the Meta key.
 | |
| @item mo
 | |
| String to disable the functioning of the Meta key.
 | |
| @item mp
 | |
| String to enter protected mode.
 | |
| @item mr
 | |
| String to enter reverse-video mode.
 | |
| @item ms
 | |
| Flag: cursor motion in standout mode is safe.
 | |
| @item nc
 | |
| Obsolete flag: do not use ASCII carriage-return on this terminal.
 | |
| @item nd
 | |
| String to move the cursor right one column.
 | |
| @item NF
 | |
| Flag: do not use XON/XOFF flow control.
 | |
| @item nl
 | |
| Obsolete alternative name for the @samp{do} and @samp{sf} capabilities.
 | |
| @item ns
 | |
| Flag: the terminal does not normally scroll for sequential output.
 | |
| @item nw
 | |
| String to move to start of next line, possibly clearing rest of old line.
 | |
| @item os
 | |
| Flag: terminal can overstrike.
 | |
| @item pb
 | |
| Number: the lowest baud rate at which padding is actually needed.
 | |
| @item pc
 | |
| String containing character for padding.
 | |
| @item pf
 | |
| String to terminate redirection of output to the printer.
 | |
| @item po
 | |
| String to redirect further output to the printer.
 | |
| @item pO
 | |
| String to redirect @var{n} characters ofoutput to the printer.
 | |
| @item ps
 | |
| String to print the screen on the attached printer.
 | |
| @item rc
 | |
| String to move to last saved cursor position.
 | |
| @item RI
 | |
| String to move cursor right @var{n} columns.
 | |
| @item rp
 | |
| String to output character @var{c} repeated @var{n} times.
 | |
| @item rs
 | |
| String to reset the terminal from any strange modes.
 | |
| @item sa
 | |
| String to turn on an arbitrary combination of appearance modes.
 | |
| @item sc
 | |
| String to save the current cursor position.
 | |
| @item se
 | |
| String to leave standout mode.
 | |
| @item sf
 | |
| String to scroll the screen one line up.
 | |
| @item SF
 | |
| String to scroll the screen @var{n} lines up.
 | |
| @item sg
 | |
| Number: width of magic standout cookie.  Absent if magic cookies are
 | |
| not used.
 | |
| @item so
 | |
| String to enter standout mode.
 | |
| @item sr
 | |
| String to scroll the screen one line down.
 | |
| @item SR
 | |
| String to scroll the screen @var{n} line down.
 | |
| @item st
 | |
| String to set tab stop at current cursor column on all lines.
 | |
| programs.
 | |
| @item ta
 | |
| String to move the cursor right to the next hardware tab stop column.
 | |
| @item te
 | |
| String to return terminal to settings for sequential output.
 | |
| @item ti
 | |
| String to initialize terminal for random cursor motion.
 | |
| @item ts
 | |
| String to move the terminal cursor into the status line.
 | |
| @item uc
 | |
| String to underline one character and move cursor right.
 | |
| @item ue
 | |
| String to turn off underline mode
 | |
| @item ug
 | |
| Number: width of underlining magic cookie.  Absent if underlining
 | |
| doesn't use magic cookies.
 | |
| @item ul
 | |
| Flag: underline by overstriking with an underscore.
 | |
| @item up
 | |
| String to move the cursor vertically up one line.
 | |
| @item UP
 | |
| String to move cursor vertically up @var{n} lines.
 | |
| @item us
 | |
| String to turn on underline mode
 | |
| @item vb
 | |
| String to make the screen flash.
 | |
| @item ve
 | |
| String to return the cursor to normal.
 | |
| @item vi
 | |
| String to make the cursor invisible.
 | |
| @item vs
 | |
| String to enhance the cursor.
 | |
| @item wi
 | |
| String to set the terminal output screen window.
 | |
| @item ws
 | |
| Number: the width of the status line.
 | |
| @item xb
 | |
| Flag: superbee terminal.
 | |
| @item xn
 | |
| Flag: cursor wraps in a strange way.
 | |
| @item xs
 | |
| Flag: clearing a line is the only way to clear the appearance modes of
 | |
| positions in that line (or, only way to remove magic cookies on that
 | |
| line).
 | |
| @item xt
 | |
| Flag: Teleray 1061; several strange characteristics.
 | |
| @end table
 | |
| 
 | |
| @node Var Index, Cap Index, Summary, Top
 | |
| @unnumbered Variable and Function Index
 | |
| 
 | |
| @printindex fn
 | |
| 
 | |
| @node Cap Index, Index, Var Index, Top
 | |
| @unnumbered Capability Index
 | |
| 
 | |
| @printindex ky
 | |
| 
 | |
| @node Index,  , Cap Index, Top
 | |
| @unnumbered Concept Index
 | |
| 
 | |
| @printindex cp
 | |
| 
 | |
| @contents
 | |
| @bye
 | 
