<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!-- 
  * t
  * DO NOT EDIT THIS FILE BY HAND!
  * It is generated from terminfo.head, Caps, and terminfo.tail.
  * Note: this must be run through tbl before nroff.
  * The magic cookie on the first line triggers this under some man programs.
  ****************************************************************************
  * Copyright (c) 1998-2004,2006 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  * "Software"), to deal in the Software without restriction, including      *
  * without limitation the rights to use, copy, modify, merge, publish,      *
  * distribute, distribute with modifications, sublicense, and/or sell       *
  * copies of the Software, and to permit persons to whom the Software is    *
  * furnished to do so, subject to the following conditions:                 *
  *                                                                          *
  * The above copyright notice and this permission notice shall be included  *
  * in all copies or substantial portions of the Software.                   *
  *                                                                          *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
  *                                                                          *
  * Except as contained in this notice, the name(s) of the above copyright   *
  * holders shall not be used in advertising or otherwise to promote the     *
  * sale, use or other dealings in this Software without prior written       *
  * authorization.                                                           *
  ****************************************************************************
  * @Id: terminfo.head,v 1.16 2007/03/04 00:09:46 tom Exp @
  * Head of terminfo man page ends here
  * @Id: terminfo.tail,v 1.49 2008/02/16 20:57:43 tom Exp @
  * Beginning of terminfo.tail file
  * This file is part of ncurses.
  * See "terminfo.head" for copyright.
  *.in -2
  *.in +2
  *.in -2
  *.in +2
  *.TH
-->
<HTML>
<HEAD>
<TITLE>terminfo 5   File Formats</TITLE>
<link rev=made href="mailto:bug-ncurses@gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<H1>terminfo 5   File Formats</H1>
<HR>
<PRE>
<!-- Manpage converted by man2html 3.0.1 -->
<STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>                   File Formats                  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>




</PRE>
<H2>NAME</H2><PRE>
       terminfo - terminal capability data base


</PRE>
<H2>SYNOPSIS</H2><PRE>
       /usr/share/terminfo/*/*


</PRE>
<H2>DESCRIPTION</H2><PRE>
       <EM>Terminfo</EM>  is  a  data  base  describing terminals, used by
       screen-oriented programs  such  as  <STRONG><A HREF="nvi.1.html">nvi(1)</A></STRONG>,  <STRONG><A HREF="rogue.1.html">rogue(1)</A></STRONG>  and
       libraries  such  as <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>.  <EM>Terminfo</EM> describes termi-
       nals by giving a set of capabilities which they  have,  by
       specifying how to perform screen operations, and by speci-
       fying padding requirements and  initialization  sequences.
       This describes <STRONG>ncurses</STRONG> version 5.6 (patch 20081011).

       Entries in <EM>terminfo</EM> consist of a sequence of `,' separated
       fields (embedded commas may be escaped with a backslash or
       notated  as \054).  White space after the `,' separator is
       ignored.  The first entry  for  each  terminal  gives  the
       names  which  are known for the terminal, separated by `|'
       characters.  The first  name  given  is  the  most  common
       abbreviation  for the terminal, the last name given should
       be a long name fully identifying  the  terminal,  and  all
       others  are  understood as synonyms for the terminal name.
       All names but the last should be in lower case and contain
       no  blanks;  the last name may well contain upper case and
       blanks for readability.

       Lines beginning with a `#' in the first column are treated
       as  comments.  While comment lines are legal at any point,
       the output of <STRONG>captoinfo</STRONG> and <STRONG>infotocap</STRONG>  (aliases  for  <STRONG>tic</STRONG>)
       will move comments so they occur only between entries.

       Newlines  and  leading  tabs  may  be  used for formatting
       entries for readability.  These are  removed  from  parsed
       entries.   The  <STRONG>infocmp</STRONG> <STRONG>-f</STRONG> option relies on this to format
       if-then-else expressions: the result can be read by <STRONG>tic</STRONG>.

       Terminal names (except for the last, verbose entry) should
       be chosen using the following conventions.  The particular
       piece of hardware making up the  terminal  should  have  a
       root  name, thus ``hp2621''.  This name should not contain
       hyphens.  Modes that the hardware can be in, or user pref-
       erences,  should  be indicated by appending a hyphen and a
       mode suffix.  Thus, a vt100 in 132 column  mode  would  be
       vt100-w.  The following suffixes should be used where pos-
       sible:


      <STRONG>Suffix</STRONG>                  <STRONG>Meaning</STRONG>                   <STRONG>Example</STRONG>
      -<EM>nn</EM>      Number of lines on the screen            aaa-60
      -<EM>n</EM>p      Number of pages of memory                c100-4p
      -am      With automargins (usually the default)   vt100-am
      -m       Mono mode; suppress color                ansi-m
      -mc      Magic cookie; spaces when highlighting   wy30-mc
      -na      No arrow keys (leave them in local)      c100-na
      -nam     Without automatic margins                vt100-nam
      -nl      No status line                           att4415-nl
      -ns      No status line                           hp2626-ns
      -rv      Reverse video                            c100-rv
      -s       Enable status line                       vt100-s

      -vb      Use visible bell instead of beep         wy370-vb
      -w       Wide mode (&gt; 80 columns, usually 132)    vt100-w

       For more on terminal naming conventions, see  the  <STRONG>term(7)</STRONG>
       manual page.

   <STRONG>Capabilities</STRONG>
       The  following  is  a  complete  table of the capabilities
       included in a terminfo description block and available  to
       terminfo-using code.  In each line of the table,

       The  <STRONG>variable</STRONG>  is the name by which the programmer (at the
       terminfo level) accesses the capability.

       The <STRONG>capname</STRONG> is the short name used  in  the  text  of  the
       database,  and  is used by a person updating the database.
       Whenever possible, capnames are chosen to be the  same  as
       or similar to the ANSI X3.64-1979 standard (now superseded
       by ECMA-48, which uses identical or very  similar  names).
       Semantics are also intended to match those of the specifi-
       cation.

       The termcap code is the old <STRONG>termcap</STRONG> capability name  (some
       capabilities are new, and have names which termcap did not
       originate).

       Capability names have no hard length limit, but an  infor-
       mal  limit  of  5 characters has been adopted to keep them
       short and to allow the tabs in the  source  file  <STRONG>Caps</STRONG>  to
       line up nicely.

       Finally,  the  description  field  attempts  to convey the
       semantics of the capability.  You may find some  codes  in
       the description field:

       (P)    indicates that padding may be specified

       #[1-9] in  the description field indicates that the string
              is passed through tparm with parms as given (#<EM>i</EM>).

       (P*)   indicates that padding may vary  in  proportion  to
              the number of lines affected

       (#<EM>i</EM>)   indicates the <EM>i</EM>th parameter.


       These are the boolean capabilities:


               <STRONG>Variable</STRONG>          <STRONG>Cap-</STRONG>  <STRONG>TCap</STRONG>      <STRONG>Description</STRONG>
               <STRONG>Booleans</STRONG>          <STRONG>name</STRONG>  <STRONG>Code</STRONG>
       auto_left_margin          bw    bw    cub1 wraps from col-
                                             umn 0 to last column
       auto_right_margin         am    am    terminal has auto-
                                             matic margins
       back_color_erase          bce   ut    screen erased with
                                             background color
       can_change                ccc   cc    terminal can re-
                                             define existing col-
                                             ors
       ceol_standout_glitch      xhp   xs    standout not erased
                                             by overwriting (hp)
       col_addr_glitch           xhpa  YA    only positive motion
                                             for hpa/mhpa caps


       cpi_changes_res           cpix  YF    changing character
                                             pitch changes reso-
                                             lution
       cr_cancels_micro_mode     crxm  YB    using cr turns off
                                             micro mode
       dest_tabs_magic_smso      xt    xt    tabs destructive,
                                             magic so char
                                             (t1061)
       eat_newline_glitch        xenl  xn    newline ignored
                                             after 80 cols (con-
                                             cept)
       erase_overstrike          eo    eo    can erase over-
                                             strikes with a blank
       generic_type              gn    gn    generic line type
       hard_copy                 hc    hc    hardcopy terminal
       hard_cursor               chts  HC    cursor is hard to
                                             see
       has_meta_key              km    km    Has a meta key
                                             (i.e., sets 8th-bit)
       has_print_wheel           daisy YC    printer needs opera-
                                             tor to change char-
                                             acter set
       has_status_line           hs    hs    has extra status
                                             line
       hue_lightness_saturation  hls   hl    terminal uses only
                                             HLS color notation
                                             (Tektronix)
       insert_null_glitch        in    in    insert mode distin-
                                             guishes nulls
       lpi_changes_res           lpix  YG    changing line pitch
                                             changes resolution
       memory_above              da    da    display may be
                                             retained above the
                                             screen
       memory_below              db    db    display may be
                                             retained below the
                                             screen
       move_insert_mode          mir   mi    safe to move while
                                             in insert mode
       move_standout_mode        msgr  ms    safe to move while
                                             in standout mode
       needs_xon_xoff            nxon  nx    padding will not
                                             work, xon/xoff
                                             required
       no_esc_ctlc               xsb   xb    beehive (f1=escape,
                                             f2=ctrl C)
       no_pad_char               npc   NP    pad character does
                                             not exist
       non_dest_scroll_region    ndscr ND    scrolling region is
                                             non-destructive
       non_rev_rmcup             nrrmc NR    smcup does not
                                             reverse rmcup
       over_strike               os    os    terminal can over-
                                             strike
       prtr_silent               mc5i  5i    printer will not
                                             echo on screen
       row_addr_glitch           xvpa  YD    only positive motion
                                             for vpa/mvpa caps
       semi_auto_right_margin    sam   YE    printing in last
                                             column causes cr
       status_line_esc_ok        eslok es    escape can be used
                                             on the status line
       tilde_glitch              hz    hz    cannot print ~'s
                                             (hazeltine)


       transparent_underline     ul    ul    underline character
                                             overstrikes
       xon_xoff                  xon   xo    terminal uses
                                             xon/xoff handshaking

       These are the numeric capabilities:


            <STRONG>Variable</STRONG>         <STRONG>Cap-</STRONG>     <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
             <STRONG>Numeric</STRONG>         <STRONG>name</STRONG>     <STRONG>Code</STRONG>
       columns               cols     co     number of columns in
                                             a line
       init_tabs             it       it     tabs initially every
                                             # spaces
       label_height          lh       lh     rows in each label
       label_width           lw       lw     columns in each
                                             label
       lines                 lines    li     number of lines on
                                             screen or page
       lines_of_memory       lm       lm     lines of memory if &gt;
                                             line. 0 means varies
       magic_cookie_glitch   xmc      sg     number of blank
                                             characters left by
                                             smso or rmso
       max_attributes        ma       ma     maximum combined
                                             attributes terminal
                                             can handle
       max_colors            colors   Co     maximum number of
                                             colors on screen
       max_pairs             pairs    pa     maximum number of
                                             color-pairs on the
                                             screen
       maximum_windows       wnum     MW     maximum number of
                                             defineable windows
       no_color_video        ncv      NC     video attributes
                                             that cannot be used
                                             with colors
       num_labels            nlab     Nl     number of labels on
                                             screen
       padding_baud_rate     pb       pb     lowest baud rate
                                             where padding needed
       virtual_terminal      vt       vt     virtual terminal
                                             number (CB/unix)
       width_status_line     wsl      ws     number of columns in
                                             status line

       The following numeric  capabilities  are  present  in  the
       SVr4.0  term  structure, but are not yet documented in the
       man page.  They came in with SVr4's printer support.


             <STRONG>Variable</STRONG>         <STRONG>Cap-</STRONG>    <STRONG>TCap</STRONG>       <STRONG>Description</STRONG>
             <STRONG>Numeric</STRONG>          <STRONG>name</STRONG>    <STRONG>Code</STRONG>
       bit_image_entwining    bitwin  Yo     number of passes for
                                             each bit-image row
       bit_image_type         bitype  Yp     type of bit-image
                                             device
       buffer_capacity        bufsz   Ya     numbers of bytes
                                             buffered before
                                             printing
       buttons                btns    BT     number of buttons on
                                             mouse
       dot_horz_spacing       spinh   Yc     spacing of dots hor-
                                             izontally in dots
                                             per inch

       dot_vert_spacing       spinv   Yb     spacing of pins ver-
                                             tically in pins per
                                             inch
       max_micro_address      maddr   Yd     maximum value in
                                             micro_..._address
       max_micro_jump         mjump   Ye     maximum value in
                                             parm_..._micro
       micro_col_size         mcs     Yf     character step size
                                             when in micro mode
       micro_line_size        mls     Yg     line step size when
                                             in micro mode
       number_of_pins         npins   Yh     numbers of pins in
                                             print-head
       output_res_char        orc     Yi     horizontal resolu-
                                             tion in units per
                                             line
       output_res_horz_inch   orhi    Yk     horizontal resolu-
                                             tion in units per
                                             inch
       output_res_line        orl     Yj     vertical resolution
                                             in units per line
       output_res_vert_inch   orvi    Yl     vertical resolution
                                             in units per inch
       print_rate             cps     Ym     print rate in char-
                                             acters per second
       wide_char_size         widcs   Yn     character step size
                                             when in double wide
                                             mode

       These are the string capabilities:


               <STRONG>Variable</STRONG>          <STRONG>Cap-</STRONG>   <STRONG>TCap</STRONG>     <STRONG>Description</STRONG>
                <STRONG>String</STRONG>           <STRONG>name</STRONG>   <STRONG>Code</STRONG>
       acs_chars                 acsc   ac   graphics charset
                                             pairs, based on
                                             vt100
       back_tab                  cbt    bt   back tab (P)
       bell                      bel    bl   audible signal
                                             (bell) (P)
       carriage_return           cr     cr   carriage return (P*)
                                             (P*)
       change_char_pitch         cpi    ZA   Change number of
                                             characters per inch
                                             to #1
       change_line_pitch         lpi    ZB   Change number of
                                             lines per inch to #1
       change_res_horz           chr    ZC   Change horizontal
                                             resolution to #1
       change_res_vert           cvr    ZD   Change vertical res-
                                             olution to #1
       change_scroll_region      csr    cs   change region to
                                             line #1 to line #2
                                             (P)
       char_padding              rmp    rP   like ip but when in
                                             insert mode
       clear_all_tabs            tbc    ct   clear all tab stops
                                             (P)
       clear_margins             mgc    MC   clear right and left
                                             soft margins
       clear_screen              clear  cl   clear screen and
                                             home cursor (P*)
       clr_bol                   el1    cb   Clear to beginning
                                             of line


       clr_eol                   el     ce   clear to end of line
                                             (P)
       clr_eos                   ed     cd   clear to end of
                                             screen (P*)
       column_address            hpa    ch   horizontal position
                                             #1, absolute (P)
       command_character         cmdch  CC   terminal settable
                                             cmd character in
                                             prototype !?
       create_window             cwin   CW   define a window #1
                                             from #2,#3 to #4,#5
       cursor_address            cup    cm   move to row #1
                                             columns #2
       cursor_down               cud1   do   down one line
       cursor_home               home   ho   home cursor (if no
                                             cup)
       cursor_invisible          civis  vi   make cursor invisi-
                                             ble
       cursor_left               cub1   le   move left one space
       cursor_mem_address        mrcup  CM   memory relative cur-
                                             sor addressing, move
                                             to row #1 columns #2
       cursor_normal             cnorm  ve   make cursor appear
                                             normal (undo
                                             civis/cvvis)
       cursor_right              cuf1   nd   non-destructive
                                             space (move right
                                             one space)
       cursor_to_ll              ll     ll   last line, first
                                             column (if no cup)
       cursor_up                 cuu1   up   up one line
       cursor_visible            cvvis  vs   make cursor very
                                             visible
       define_char               defc   ZE   Define a character
                                             #1, #2 dots wide,
                                             descender #3
       delete_character          dch1   dc   delete character
                                             (P*)
       delete_line               dl1    dl   delete line (P*)
       dial_phone                dial   DI   dial number #1
       dis_status_line           dsl    ds   disable status line
       display_clock             dclk   DK   display clock
       down_half_line            hd     hd   half a line down
       ena_acs                   enacs  eA   enable alternate
                                             char set
       enter_alt_charset_mode    smacs  as   start alternate
                                             character set (P)
       enter_am_mode             smam   SA   turn on automatic
                                             margins
       enter_blink_mode          blink  mb   turn on blinking
       enter_bold_mode           bold   md   turn on bold (extra
                                             bright) mode
       enter_ca_mode             smcup  ti   string to start pro-
                                             grams using cup
       enter_delete_mode         smdc   dm   enter delete mode
       enter_dim_mode            dim    mh   turn on half-bright
                                             mode
       enter_doublewide_mode     swidm  ZF   Enter double-wide
                                             mode
       enter_draft_quality       sdrfq  ZG   Enter draft-quality
                                             mode
       enter_insert_mode         smir   im   enter insert mode
       enter_italics_mode        sitm   ZH   Enter italic mode
       enter_leftward_mode       slm    ZI   Start leftward car-
                                             riage motion

       enter_micro_mode          smicm  ZJ   Start micro-motion
                                             mode
       enter_near_letter_quality snlq   ZK   Enter NLQ mode
       enter_normal_quality      snrmq  ZL   Enter normal-quality
                                             mode
       enter_protected_mode      prot   mp   turn on protected
                                             mode
       enter_reverse_mode        rev    mr   turn on reverse
                                             video mode
       enter_secure_mode         invis  mk   turn on blank mode
                                             (characters invisi-
                                             ble)
       enter_shadow_mode         sshm   ZM   Enter shadow-print
                                             mode
       enter_standout_mode       smso   so   begin standout mode
       enter_subscript_mode      ssubm  ZN   Enter subscript mode
       enter_superscript_mode    ssupm  ZO   Enter superscript
                                             mode
       enter_underline_mode      smul   us   begin underline mode
       enter_upward_mode         sum    ZP   Start upward car-
                                             riage motion
       enter_xon_mode            smxon  SX   turn on xon/xoff
                                             handshaking
       erase_chars               ech    ec   erase #1 characters
                                             (P)
       exit_alt_charset_mode     rmacs  ae   end alternate char-
                                             acter set (P)
       exit_am_mode              rmam   RA   turn off automatic
                                             margins
       exit_attribute_mode       sgr0   me   turn off all
                                             attributes
       exit_ca_mode              rmcup  te   strings to end pro-
                                             grams using cup
       exit_delete_mode          rmdc   ed   end delete mode
       exit_doublewide_mode      rwidm  ZQ   End double-wide mode
       exit_insert_mode          rmir   ei   exit insert mode
       exit_italics_mode         ritm   ZR   End italic mode
       exit_leftward_mode        rlm    ZS   End left-motion mode
       exit_micro_mode           rmicm  ZT   End micro-motion
                                             mode
       exit_shadow_mode          rshm   ZU   End shadow-print
                                             mode
       exit_standout_mode        rmso   se   exit standout mode
       exit_subscript_mode       rsubm  ZV   End subscript mode
       exit_superscript_mode     rsupm  ZW   End superscript mode
       exit_underline_mode       rmul   ue   exit underline mode
       exit_upward_mode          rum    ZX   End reverse charac-
                                             ter motion
       exit_xon_mode             rmxon  RX   turn off xon/xoff
                                             handshaking
       fixed_pause               pause  PA   pause for 2-3 sec-
                                             onds
       flash_hook                hook   fh   flash switch hook
       flash_screen              flash  vb   visible bell (may
                                             not move cursor)
       form_feed                 ff     ff   hardcopy terminal
                                             page eject (P*)
       from_status_line          fsl    fs   return from status
                                             line
       goto_window               wingo  WG   go to window #1
       hangup                    hup    HU   hang-up phone
       init_1string              is1    i1   initialization
                                             string
       init_2string              is2    is   initialization
                                             string

       init_3string              is3    i3   initialization
                                             string
       init_file                 if     if   name of initializa-
                                             tion file
       init_prog                 iprog  iP   path name of program
                                             for initialization
       initialize_color          initc  Ic   initialize color #1
                                             to (#2,#3,#4)
       initialize_pair           initp  Ip   Initialize color
                                             pair #1 to
                                             fg=(#2,#3,#4),
                                             bg=(#5,#6,#7)
       insert_character          ich1   ic   insert character (P)
       insert_line               il1    al   insert line (P*)
       insert_padding            ip     ip   insert padding after
                                             inserted character
       key_a1                    ka1    K1   upper left of keypad
       key_a3                    ka3    K3   upper right of key-
                                             pad
       key_b2                    kb2    K2   center of keypad
       key_backspace             kbs    kb   backspace key
       key_beg                   kbeg   @1   begin key
       key_btab                  kcbt   kB   back-tab key
       key_c1                    kc1    K4   lower left of keypad
       key_c3                    kc3    K5   lower right of key-
                                             pad
       key_cancel                kcan   @2   cancel key
       key_catab                 ktbc   ka   clear-all-tabs key
       key_clear                 kclr   kC   clear-screen or
                                             erase key
       key_close                 kclo   @3   close key
       key_command               kcmd   @4   command key
       key_copy                  kcpy   @5   copy key
       key_create                kcrt   @6   create key
       key_ctab                  kctab  kt   clear-tab key
       key_dc                    kdch1  kD   delete-character key
       key_dl                    kdl1   kL   delete-line key
       key_down                  kcud1  kd   down-arrow key
       key_eic                   krmir  kM   sent by rmir or smir
                                             in insert mode
       key_end                   kend   @7   end key
       key_enter                 kent   @8   enter/send key
       key_eol                   kel    kE   clear-to-end-of-line
                                             key
       key_eos                   ked    kS   clear-to-end-of-
                                             screen key
       key_exit                  kext   @9   exit key
       key_f0                    kf0    k0   F0 function key
       key_f1                    kf1    k1   F1 function key
       key_f10                   kf10   k;   F10 function key
       key_f11                   kf11   F1   F11 function key
       key_f12                   kf12   F2   F12 function key
       key_f13                   kf13   F3   F13 function key
       key_f14                   kf14   F4   F14 function key
       key_f15                   kf15   F5   F15 function key
       key_f16                   kf16   F6   F16 function key
       key_f17                   kf17   F7   F17 function key
       key_f18                   kf18   F8   F18 function key
       key_f19                   kf19   F9   F19 function key
       key_f2                    kf2    k2   F2 function key
       key_f20                   kf20   FA   F20 function key
       key_f21                   kf21   FB   F21 function key
       key_f22                   kf22   FC   F22 function key
       key_f23                   kf23   FD   F23 function key
       key_f24                   kf24   FE   F24 function key

       key_f25                   kf25   FF   F25 function key
       key_f26                   kf26   FG   F26 function key
       key_f27                   kf27   FH   F27 function key
       key_f28                   kf28   FI   F28 function key
       key_f29                   kf29   FJ   F29 function key
       key_f3                    kf3    k3   F3 function key
       key_f30                   kf30   FK   F30 function key
       key_f31                   kf31   FL   F31 function key
       key_f32                   kf32   FM   F32 function key
       key_f33                   kf33   FN   F33 function key
       key_f34                   kf34   FO   F34 function key
       key_f35                   kf35   FP   F35 function key
       key_f36                   kf36   FQ   F36 function key
       key_f37                   kf37   FR   F37 function key
       key_f38                   kf38   FS   F38 function key
       key_f39                   kf39   FT   F39 function key
       key_f4                    kf4    k4   F4 function key
       key_f40                   kf40   FU   F40 function key
       key_f41                   kf41   FV   F41 function key
       key_f42                   kf42   FW   F42 function key
       key_f43                   kf43   FX   F43 function key
       key_f44                   kf44   FY   F44 function key
       key_f45                   kf45   FZ   F45 function key
       key_f46                   kf46   Fa   F46 function key
       key_f47                   kf47   Fb   F47 function key
       key_f48                   kf48   Fc   F48 function key
       key_f49                   kf49   Fd   F49 function key
       key_f5                    kf5    k5   F5 function key
       key_f50                   kf50   Fe   F50 function key
       key_f51                   kf51   Ff   F51 function key
       key_f52                   kf52   Fg   F52 function key
       key_f53                   kf53   Fh   F53 function key
       key_f54                   kf54   Fi   F54 function key
       key_f55                   kf55   Fj   F55 function key
       key_f56                   kf56   Fk   F56 function key
       key_f57                   kf57   Fl   F57 function key
       key_f58                   kf58   Fm   F58 function key
       key_f59                   kf59   Fn   F59 function key
       key_f6                    kf6    k6   F6 function key
       key_f60                   kf60   Fo   F60 function key
       key_f61                   kf61   Fp   F61 function key
       key_f62                   kf62   Fq   F62 function key
       key_f63                   kf63   Fr   F63 function key
       key_f7                    kf7    k7   F7 function key
       key_f8                    kf8    k8   F8 function key
       key_f9                    kf9    k9   F9 function key
       key_find                  kfnd   @0   find key
       key_help                  khlp   %1   help key
       key_home                  khome  kh   home key
       key_ic                    kich1  kI   insert-character key
       key_il                    kil1   kA   insert-line key
       key_left                  kcub1  kl   left-arrow key
       key_ll                    kll    kH   lower-left key (home
                                             down)
       key_mark                  kmrk   %2   mark key
       key_message               kmsg   %3   message key
       key_move                  kmov   %4   move key
       key_next                  knxt   %5   next key
       key_npage                 knp    kN   next-page key
       key_open                  kopn   %6   open key
       key_options               kopt   %7   options key
       key_ppage                 kpp    kP   previous-page key
       key_previous              kprv   %8   previous key
       key_print                 kprt   %9   print key
       key_redo                  krdo   %0   redo key

       key_reference             kref   &amp;1   reference key
       key_refresh               krfr   &amp;2   refresh key
       key_replace               krpl   &amp;3   replace key
       key_restart               krst   &amp;4   restart key
       key_resume                kres   &amp;5   resume key
       key_right                 kcuf1  kr   right-arrow key
       key_save                  ksav   &amp;6   save key
       key_sbeg                  kBEG   &amp;9   shifted begin key
       key_scancel               kCAN   &amp;0   shifted cancel key
       key_scommand              kCMD   *1   shifted command key
       key_scopy                 kCPY   *2   shifted copy key
       key_screate               kCRT   *3   shifted create key
       key_sdc                   kDC    *4   shifted delete-char-
                                             acter key
       key_sdl                   kDL    *5   shifted delete-line
                                             key
       key_select                kslt   *6   select key
       key_send                  kEND   *7   shifted end key
       key_seol                  kEOL   *8   shifted clear-to-
                                             end-of-line key
       key_sexit                 kEXT   *9   shifted exit key
       key_sf                    kind   kF   scroll-forward key
       key_sfind                 kFND   *0   shifted find key
       key_shelp                 kHLP   #1   shifted help key
       key_shome                 kHOM   #2   shifted home key
       key_sic                   kIC    #3   shifted insert-char-
                                             acter key
       key_sleft                 kLFT   #4   shifted left-arrow
                                             key
       key_smessage              kMSG   %a   shifted message key
       key_smove                 kMOV   %b   shifted move key
       key_snext                 kNXT   %c   shifted next key
       key_soptions              kOPT   %d   shifted options key
       key_sprevious             kPRV   %e   shifted previous key
       key_sprint                kPRT   %f   shifted print key
       key_sr                    kri    kR   scroll-backward key
       key_sredo                 kRDO   %g   shifted redo key
       key_sreplace              kRPL   %h   shifted replace key
       key_sright                kRIT   %i   shifted right-arrow
                                             key
       key_srsume                kRES   %j   shifted resume key
       key_ssave                 kSAV   !1   shifted save key
       key_ssuspend              kSPD   !2   shifted suspend key
       key_stab                  khts   kT   set-tab key
       key_sundo                 kUND   !3   shifted undo key
       key_suspend               kspd   &amp;7   suspend key
       key_undo                  kund   &amp;8   undo key
       key_up                    kcuu1  ku   up-arrow key
       keypad_local              rmkx   ke   leave 'key-
                                             board_transmit' mode
       keypad_xmit               smkx   ks   enter 'key-
                                             board_transmit' mode
       lab_f0                    lf0    l0   label on function
                                             key f0 if not f0
       lab_f1                    lf1    l1   label on function
                                             key f1 if not f1
       lab_f10                   lf10   la   label on function
                                             key f10 if not f10
       lab_f2                    lf2    l2   label on function
                                             key f2 if not f2
       lab_f3                    lf3    l3   label on function
                                             key f3 if not f3
       lab_f4                    lf4    l4   label on function
                                             key f4 if not f4


       lab_f5                    lf5    l5   label on function
                                             key f5 if not f5
       lab_f6                    lf6    l6   label on function
                                             key f6 if not f6
       lab_f7                    lf7    l7   label on function
                                             key f7 if not f7
       lab_f8                    lf8    l8   label on function
                                             key f8 if not f8
       lab_f9                    lf9    l9   label on function
                                             key f9 if not f9
       label_format              fln    Lf   label format
       label_off                 rmln   LF   turn off soft labels
       label_on                  smln   LO   turn on soft labels
       meta_off                  rmm    mo   turn off meta mode
       meta_on                   smm    mm   turn on meta mode
                                             (8th-bit on)
       micro_column_address      mhpa   ZY   Like column_address
                                             in micro mode
       micro_down                mcud1  ZZ   Like cursor_down in
                                             micro mode
       micro_left                mcub1  Za   Like cursor_left in
                                             micro mode
       micro_right               mcuf1  Zb   Like cursor_right in
                                             micro mode
       micro_row_address         mvpa   Zc   Like row_address #1
                                             in micro mode
       micro_up                  mcuu1  Zd   Like cursor_up in
                                             micro mode
       newline                   nel    nw   newline (behave like
                                             cr followed by lf)
       order_of_pins             porder Ze   Match software bits
                                             to print-head pins
       orig_colors               oc     oc   Set all color pairs
                                             to the original ones
       orig_pair                 op     op   Set default pair to
                                             its original value
       pad_char                  pad    pc   padding char
                                             (instead of null)
       parm_dch                  dch    DC   delete #1 characters
                                             (P*)
       parm_delete_line          dl     DL   delete #1 lines (P*)
       parm_down_cursor          cud    DO   down #1 lines (P*)
       parm_down_micro           mcud   Zf   Like parm_down_cur-
                                             sor in micro mode
       parm_ich                  ich    IC   insert #1 characters
                                             (P*)
       parm_index                indn   SF   scroll forward #1
                                             lines (P)
       parm_insert_line          il     AL   insert #1 lines (P*)
       parm_left_cursor          cub    LE   move #1 characters
                                             to the left (P)
       parm_left_micro           mcub   Zg   Like parm_left_cur-
                                             sor in micro mode
       parm_right_cursor         cuf    RI   move #1 characters
                                             to the right (P*)
       parm_right_micro          mcuf   Zh   Like parm_right_cur-
                                             sor in micro mode
       parm_rindex               rin    SR   scroll back #1 lines
                                             (P)
       parm_up_cursor            cuu    UP   up #1 lines (P*)
       parm_up_micro             mcuu   Zi   Like parm_up_cursor
                                             in micro mode
       pkey_key                  pfkey  pk   program function key
                                             #1 to type string #2


       pkey_local                pfloc  pl   program function key
                                             #1 to execute string
                                             #2
       pkey_xmit                 pfx    px   program function key
                                             #1 to transmit
                                             string #2
       plab_norm                 pln    pn   program label #1 to
                                             show string #2
       print_screen              mc0    ps   print contents of
                                             screen
       prtr_non                  mc5p   pO   turn on printer for
                                             #1 bytes
       prtr_off                  mc4    pf   turn off printer
       prtr_on                   mc5    po   turn on printer
       pulse                     pulse  PU   select pulse dialing
       quick_dial                qdial  QD   dial number #1 with-
                                             out checking
       remove_clock              rmclk  RC   remove clock
       repeat_char               rep    rp   repeat char #1 #2
                                             times (P*)
       req_for_input             rfi    RF   send next input char
                                             (for ptys)
       reset_1string             rs1    r1   reset string
       reset_2string             rs2    r2   reset string
       reset_3string             rs3    r3   reset string
       reset_file                rf     rf   name of reset file
       restore_cursor            rc     rc   restore cursor to
                                             position of last
                                             save_cursor
       row_address               vpa    cv   vertical position #1
                                             absolute (P)
       save_cursor               sc     sc   save current cursor
                                             position (P)
       scroll_forward            ind    sf   scroll text up (P)
       scroll_reverse            ri     sr   scroll text down (P)
       select_char_set           scs    Zj   Select character
                                             set, #1
       set_attributes            sgr    sa   define video
                                             attributes #1-#9
                                             (PG9)
       set_background            setb   Sb   Set background color
                                             #1
       set_bottom_margin         smgb   Zk   Set bottom margin at
                                             current line
       set_bottom_margin_parm    smgbp  Zl   Set bottom margin at
                                             line #1 or (if smgtp
                                             is not given) #2
                                             lines from bottom
       set_clock                 sclk   SC   set clock, #1 hrs #2
                                             mins #3 secs
       set_color_pair            scp    sp   Set current color
                                             pair to #1
       set_foreground            setf   Sf   Set foreground color
                                             #1
       set_left_margin           smgl   ML   set left soft margin
                                             at current column.
                                             See smgl. (ML is not
                                             in BSD termcap).
       set_left_margin_parm      smglp  Zm   Set left (right)
                                             margin at column #1
       set_right_margin          smgr   MR   set right soft mar-
                                             gin at current col-
                                             umn
       set_right_margin_parm     smgrp  Zn   Set right margin at
                                             column #1

       set_tab                   hts    st   set a tab in every
                                             row, current columns
       set_top_margin            smgt   Zo   Set top margin at
                                             current line
       set_top_margin_parm       smgtp  Zp   Set top (bottom)
                                             margin at row #1
       set_window                wind   wi   current window is
                                             lines #1-#2 cols
                                             #3-#4
       start_bit_image           sbim   Zq   Start printing bit
                                             image graphics
       start_char_set_def        scsd   Zr   Start character set
                                             definition #1, with
                                             #2 characters in the
                                             set
       stop_bit_image            rbim   Zs   Stop printing bit
                                             image graphics
       stop_char_set_def         rcsd   Zt   End definition of
                                             character set #1
       subscript_characters      subcs  Zu   List of subscript-
                                             able characters
       superscript_characters    supcs  Zv   List of superscript-
                                             able characters
       tab                       ht     ta   tab to next 8-space
                                             hardware tab stop
       these_cause_cr            docr   Zw   Printing any of
                                             these characters
                                             causes CR
       to_status_line            tsl    ts   move to status line,
                                             column #1
       tone                      tone   TO   select touch tone
                                             dialing
       underline_char            uc     uc   underline char and
                                             move past it
       up_half_line              hu     hu   half a line up
       user0                     u0     u0   User string #0
       user1                     u1     u1   User string #1
       user2                     u2     u2   User string #2
       user3                     u3     u3   User string #3
       user4                     u4     u4   User string #4
       user5                     u5     u5   User string #5
       user6                     u6     u6   User string #6
       user7                     u7     u7   User string #7
       user8                     u8     u8   User string #8
       user9                     u9     u9   User string #9
       wait_tone                 wait   WA   wait for dial-tone
       xoff_character            xoffc  XF   XOFF character
       xon_character             xonc   XN   XON character
       zero_motion               zerom  Zx   No motion for subse-
                                             quent character

       The  following  string  capabilities  are  present  in the
       SVr4.0 term structure, but were originally not  documented
       in the man page.


               <STRONG>Variable</STRONG>          <STRONG>Cap-</STRONG>     <STRONG>TCap</STRONG>    <STRONG>Description</STRONG>
                <STRONG>String</STRONG>           <STRONG>name</STRONG>     <STRONG>Code</STRONG>
       alt_scancode_esc          scesa    S8   Alternate escape
                                               for scancode emu-
                                               lation
       bit_image_carriage_return bicr     Yv   Move to beginning
                                               of same row
       bit_image_newline         binel    Zz   Move to next row
                                               of the bit image

       bit_image_repeat          birep    Xy   Repeat bit image
                                               cell #1 #2 times
       char_set_names            csnm     Zy   Produce #1'th item
                                               from list of char-
                                               acter set names
       code_set_init             csin     ci   Init sequence for
                                               multiple codesets
       color_names               colornm  Yw   Give name for
                                               color #1
       define_bit_image_region   defbi    Yx   Define rectan-
                                               gualar bit image
                                               region
       device_type               devt     dv   Indicate lan-
                                               guage/codeset sup-
                                               port
       display_pc_char           dispc    S1   Display PC charac-
                                               ter #1
       end_bit_image_region      endbi    Yy   End a bit-image
                                               region
       enter_pc_charset_mode     smpch    S2   Enter PC character
                                               display mode
       enter_scancode_mode       smsc     S4   Enter PC scancode
                                               mode
       exit_pc_charset_mode      rmpch    S3   Exit PC character
                                               display mode
       exit_scancode_mode        rmsc     S5   Exit PC scancode
                                               mode
       get_mouse                 getm     Gm   Curses should get
                                               button events,
                                               parameter #1 not
                                               documented.
       key_mouse                 kmous    Km   Mouse event has
                                               occurred
       mouse_info                minfo    Mi   Mouse status
                                               information
       pc_term_options           pctrm    S6   PC terminal
                                               options
       pkey_plab                 pfxl     xl   Program function
                                               key #1 to type
                                               string #2 and show
                                               string #3
       req_mouse_pos             reqmp    RQ   Request mouse
                                               position
       scancode_escape           scesc    S7   Escape for scan-
                                               code emulation
       set0_des_seq              s0ds     s0   Shift to codeset 0
                                               (EUC set 0, ASCII)
       set1_des_seq              s1ds     s1   Shift to codeset 1
       set2_des_seq              s2ds     s2   Shift to codeset 2
       set3_des_seq              s3ds     s3   Shift to codeset 3
       set_a_background          setab    AB   Set background
                                               color to #1, using
                                               ANSI escape
       set_a_foreground          setaf    AF   Set foreground
                                               color to #1, using
                                               ANSI escape
       set_color_band            setcolor Yz   Change to ribbon
                                               color #1
       set_lr_margin             smglr    ML   Set both left and
                                               right margins to
                                               #1, #2.  (ML is
                                               not in BSD term-
                                               cap).
       set_page_length           slines   YZ   Set page length to
                                               #1 lines

       set_tb_margin             smgtb    MT   Sets both top and
                                               bottom margins to
                                               #1, #2

        The XSI Curses  standard  added  these.   They  are  some
        post-4.1  versions  of System V curses, e.g., Solaris 2.5
        and IRIX 6.x.  The <STRONG>ncurses</STRONG> termcap  names  for  them  are
        invented; according to the XSI Curses standard, they have
        no termcap names.  If your compiled terminfo entries  use
        these,  they  may  not be binary-compatible with System V
        terminfo entries after SVr4.1; beware!


                <STRONG>Variable</STRONG>         <STRONG>Cap-</STRONG>   <STRONG>TCap</STRONG>     <STRONG>Description</STRONG>
                 <STRONG>String</STRONG>          <STRONG>name</STRONG>   <STRONG>Code</STRONG>
        enter_horizontal_hl_mode ehhlm  Xh   Enter horizontal
                                             highlight mode
        enter_left_hl_mode       elhlm  Xl   Enter left highlight
                                             mode
        enter_low_hl_mode        elohlm Xo   Enter low highlight
                                             mode
        enter_right_hl_mode      erhlm  Xr   Enter right high-
                                             light mode
        enter_top_hl_mode        ethlm  Xt   Enter top highlight
                                             mode
        enter_vertical_hl_mode   evhlm  Xv   Enter vertical high-
                                             light mode
        set_a_attributes         sgr1   sA   Define second set of
                                             video attributes
                                             #1-#6
        set_pglen_inch           slengthsL   YI Set page length
                                             to #1 hundredth of
                                             an inch

   <STRONG>A</STRONG> <STRONG>Sample</STRONG> <STRONG>Entry</STRONG>
       The following entry, describing an ANSI-standard terminal,
       is  representative  of  what a <STRONG>terminfo</STRONG> entry for a modern
       terminal typically looks like.

     ansi|ansi/pc-term compatible with color,
             mc5i,
             colors#8, ncv#3, pairs#64,
             cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC,
             cuu=\E[%p1%dA, dch=\E[%p1%dP, dl=\E[%p1%dM,
             ech=\E[%p1%dX, el1=\E[1K, hpa=\E[%p1%dG, ht=\E[I,
             ich=\E[%p1%d@, il=\E[%p1%dL, indn=\E[%p1%dS, .indn=\E[%p1%dT,
             kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
             kcuf1=\E[C, kcuu1=\E[A, kf1=\E[M, kf10=\E[V,
             kf11=\E[W, kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P,
             kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U,
             kich1=\E[L, mc4=\E[4i, mc5=\E[5i, nel=\r\E[S,
             op=\E[37;40m, rep=%p1%c\E[%p2%{1}%-%db,
             rin=\E[%p1%dT, s0ds=\E(B, s1ds=\E)B, s2ds=\E*B,
             s3ds=\E+B, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
             setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
             setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
             sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;12%;m,
             sgr0=\E[0;10m, tbc=\E[2g, u6=\E[%d;%dR, u7=\E[6n,
             u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%p1%dd,

       Entries may continue onto multiple lines by placing  white
       space  at  the  beginning  of  each line except the first.
       Comments may be included on lines  beginning  with  ``#''.
       Capabilities in <EM>terminfo</EM> are of three types: Boolean capa-
       bilities which indicate that the terminal has some partic-
       ular  feature, numeric capabilities giving the size of the
       terminal or the size  of  particular  delays,  and  string
       capabilities,  which  give a sequence which can be used to
       perform particular terminal operations.


   <STRONG>Types</STRONG> <STRONG>of</STRONG> <STRONG>Capabilities</STRONG>
       All capabilities have names.  For instance, the fact  that
       ANSI-standard  terminals  have <EM>automatic</EM> <EM>margins</EM> (i.e., an
       automatic return and line-feed when the end of a  line  is
       reached)  is  indicated  by  the capability <STRONG>am</STRONG>.  Hence the
       description of ansi includes <STRONG>am</STRONG>.  Numeric capabilities are
       followed  by  the character `#' and then a positive value.
       Thus <STRONG>cols</STRONG>, which indicates the number of columns the  ter-
       minal  has,  gives  the  value  `80' for ansi.  Values for
       numeric capabilities may be specified in decimal, octal or
       hexadecimal,  using the C programming language conventions
       (e.g., 255, 0377 and 0xff or 0xFF).

       Finally, string valued capabilities, such as <STRONG>el</STRONG> (clear  to
       end of line sequence) are given by the two-character code,
       an `=', and then a string ending  at  the  next  following
       `,'.

       A  number  of  escape sequences are provided in the string
       valued capabilities for easy encoding of characters there.
       Both  <STRONG>\E</STRONG>  and  <STRONG>\e</STRONG> map to an ESCAPE character, <STRONG>^x</STRONG> maps to a
       control-x for any appropriate x, and the sequences  <STRONG>\n</STRONG>  <STRONG>\l</STRONG>
       <STRONG>\r</STRONG>  <STRONG>\t</STRONG>  <STRONG>\b</STRONG>  <STRONG>\f</STRONG>  <STRONG>\s</STRONG> give a newline, line-feed, return, tab,
       backspace, form-feed, and space.  Other escapes include <STRONG>\^</STRONG>
       for  <STRONG>^</STRONG>, <STRONG>\\</STRONG> for <STRONG>\</STRONG>, <STRONG>\</STRONG>, for comma, <STRONG>\:</STRONG> for <STRONG>:</STRONG>, and <STRONG>\0</STRONG> for null.
       (<STRONG>\0</STRONG> will produce \200, which does not terminate  a  string
       but behaves as a null character on most terminals, provid-
       ing CS7 is specified.  See <STRONG><A HREF="stty.1.html">stty(1)</A></STRONG>.)  Finally,  characters
       may be given as three octal digits after a <STRONG>\</STRONG>.

       A  delay  in  milliseconds may appear anywhere in a string
       capability, enclosed in $&lt;..&gt; brackets, as in  <STRONG>el</STRONG>=\EK$&lt;5&gt;,
       and  padding  characters  are supplied by <EM>tputs</EM> to provide
       this delay.  The delay must be a number with at  most  one
       decimal place of precision; it may be followed by suffixes
       `*' or '/' or both.  A  `*'  indicates  that  the  padding
       required  is  proportional to the number of lines affected
       by the  operation,  and  the  amount  given  is  the  per-
       affected-unit  padding  required.   (In the case of insert
       character,  the  factor  is  still  the  number  of  <EM>lines</EM>
       affected.)   Normally,  padding  is advisory if the device
       has the <STRONG>xon</STRONG> capability; it is used  for  cost  computation
       but  does not trigger delays.  A `/' suffix indicates that
       the padding is mandatory and forces a delay of  the  given
       number  of  milliseconds  even on devices for which <STRONG>xon</STRONG> is
       present to indicate flow control.

       Sometimes individual capabilities must be  commented  out.
       To  do this, put a period before the capability name.  For
       example, see the second <STRONG>ind</STRONG> in the example above.


   <STRONG>Fetching</STRONG> <STRONG>Compiled</STRONG> <STRONG>Descriptions</STRONG>
       If the environment variable TERMINFO is set, it is  inter-
       preted  as the pathname of a directory containing the com-
       piled description you are working on.  Only that directory
       is searched.

       If  TERMINFO  is  not set, the <STRONG>ncurses</STRONG> version of the ter-
       minfo reader code  will  instead  look  in  the  directory
       <STRONG>$HOME/.terminfo</STRONG>  for  a compiled description.  If it fails
       to find one  there,  and  the  environment  variable  TER-
       MINFO_DIRS  is set, it will interpret the contents of that
       variable as a list of colon- separated directories  to  be
       searched  (an  empty  entry is interpreted as a command to
       search <EM>/usr/share/terminfo</EM>).  If no description  is  found
       in  any of the TERMINFO_DIRS directories, the fetch fails.

       If neither TERMINFO nor TERMINFO_DIRS  is  set,  the  last
       place   tried  will  be  the  system  terminfo  directory,
       <EM>/usr/share/terminfo</EM>.

       (Neither the  <STRONG>$HOME/.terminfo</STRONG>  lookups  nor  TERMINFO_DIRS
       extensions   are  supported  under  stock  System  V  ter-
       minfo/curses.)


   <STRONG>Preparing</STRONG> <STRONG>Descriptions</STRONG>
       We now outline how to prepare descriptions  of  terminals.
       The  most  effective way to prepare a terminal description
       is by imitating the description of a similar  terminal  in
       <EM>terminfo</EM>  and  to  build up a description gradually, using
       partial descriptions with <EM>vi</EM> or some other screen-oriented
       program  to  check that they are correct.  Be aware that a
       very unusual terminal may expose deficiencies in the abil-
       ity  of  the  <EM>terminfo</EM>  file to describe it or bugs in the
       screen-handling code of the test program.

       To get the padding for insert line right (if the  terminal
       manufacturer did not document it) a severe test is to edit
       a large file at 9600 baud, delete 16 or so lines from  the
       middle  of  the screen, then hit the `u' key several times
       quickly.  If the terminal messes up, more padding is  usu-
       ally  needed.  A similar test can be used for insert char-
       acter.


   <STRONG>Basic</STRONG> <STRONG>Capabilities</STRONG>
       The number of columns on each line  for  the  terminal  is
       given  by the <STRONG>cols</STRONG> numeric capability.  If the terminal is
       a CRT, then the number of lines on the screen is given  by
       the <STRONG>lines</STRONG> capability.  If the terminal wraps around to the
       beginning of the next line when it reaches the right  mar-
       gin, then it should have the <STRONG>am</STRONG> capability.  If the termi-
       nal can clear its screen, leaving the cursor in  the  home
       position,  then this is given by the <STRONG>clear</STRONG> string capabil-
       ity.  If the terminal overstrikes (rather than clearing  a
       position  when  a character is struck over) then it should
       have the <STRONG>os</STRONG> capability.  If the  terminal  is  a  printing
       terminal,  with no soft copy unit, give it both <STRONG>hc</STRONG> and <STRONG>os</STRONG>.
       (<STRONG>os</STRONG> applies to storage scope terminals, such as  TEKTRONIX
       4010  series, as well as hard copy and APL terminals.)  If
       there is a code to move the cursor to the left edge of the
       current row, give this as <STRONG>cr</STRONG>.  (Normally this will be car-
       riage return, control M.)  If there is a code  to  produce
       an audible signal (bell, beep, etc) give this as <STRONG>bel</STRONG>.

       If  there is a code to move the cursor one position to the
       left (such as backspace) that capability should  be  given
       as  <STRONG>cub1</STRONG>.   Similarly, codes to move to the right, up, and
       down should be given as <STRONG>cuf1</STRONG>, <STRONG>cuu1</STRONG>, and <STRONG>cud1</STRONG>.  These local
       cursor  motions  should not alter the text they pass over,
       for example, you would not normally use  `<STRONG>cuf1</STRONG>= '  because
       the space would erase the character moved over.

       A  very  important  point  here  is  that the local cursor
       motions encoded in <EM>terminfo</EM> are undefined at the left  and
       top  edges  of  a  CRT  terminal.   Programs  should never
       attempt to backspace around the left edge,  unless  <STRONG>bw</STRONG>  is
       given, and never attempt to go up locally off the top.  In
       order to scroll text up, a program will go to  the  bottom
       left corner of the screen and send the <STRONG>ind</STRONG> (index) string.

       To scroll text down, a program goes to the top left corner
       of  the  screen  and  sends the <STRONG>ri</STRONG> (reverse index) string.
       The strings <STRONG>ind</STRONG> and <STRONG>ri</STRONG> are undefined  when  not  on  their
       respective corners of the screen.

       Parameterized versions of the scrolling sequences are <STRONG>indn</STRONG>
       and <STRONG>rin</STRONG> which have the same semantics as <STRONG>ind</STRONG> and <STRONG>ri</STRONG> except
       that  they take one parameter, and scroll that many lines.
       They are also undefined except at the appropriate edge  of
       the screen.

       The  <STRONG>am</STRONG>  capability tells whether the cursor sticks at the
       right edge of the screen when text  is  output,  but  this
       does not necessarily apply to a <STRONG>cuf1</STRONG> from the last column.
       The only local motion which is defined from the left  edge
       is  if  <STRONG>bw</STRONG>  is  given, then a <STRONG>cub1</STRONG> from the left edge will
       move to the right edge of the previous row.  If <STRONG>bw</STRONG> is  not
       given,  the effect is undefined.  This is useful for draw-
       ing a box around the edge of the screen, for example.   If
       the  terminal has switch selectable automatic margins, the
       <EM>terminfo</EM> file usually assumes that this is on;  i.e.,  <STRONG>am</STRONG>.
       If  the  terminal  has  a command which moves to the first
       column of the next line, that command can be given as  <STRONG>nel</STRONG>
       (newline).   It  does not matter if the command clears the
       remainder of the current line, so if the terminal  has  no
       <STRONG>cr</STRONG>  and <STRONG>lf</STRONG> it may still be possible to craft a working <STRONG>nel</STRONG>
       out of one or both of them.

       These  capabilities  suffice  to  describe  hard-copy  and
       "glass-tty"  terminals.   Thus  the  model  33 teletype is
       described as

       33|tty33|tty|model 33 teletype,
            bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,

       while the Lear Siegler ADM-3 is described as

       adm3|3|lsi adm3,
            am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
            ind=^J, lines#24,


   <STRONG>Parameterized</STRONG> <STRONG>Strings</STRONG>
       Cursor addressing and other strings  requiring  parameters
       in  the  terminal  are described by a parameterized string
       capability, with <STRONG><A HREF="printf.3.html">printf(3)</A></STRONG> like escapes  <STRONG>%x</STRONG>  in  it.   For
       example,  to  address  the  cursor,  the <STRONG>cup</STRONG> capability is
       given, using two parameters: the row and column to address
       to.  (Rows and columns are numbered from zero and refer to
       the physical screen visible to the user, not to any unseen
       memory.)   If  the  terminal  has  memory  relative cursor
       addressing, that can be indicated by <STRONG>mrcup</STRONG>.

       The parameter mechanism uses a stack and special  <STRONG>%</STRONG>  codes
       to  manipulate  it.  Typically a sequence will push one of
       the parameters onto the stack and then print  it  in  some
       format.   Print  (e.g.,  "%d")  is  a special case.  Other
       operations, including "%t"  pop  their  operand  from  the
       stack.  It is noted that more complex operations are often
       necessary, e.g., in the <STRONG>sgr</STRONG> string.

       The <STRONG>%</STRONG> encodings have the following meanings:


       %%   outputs `%'

       %<EM>[[</EM>:<EM>]flags][width[.precision]][</EM>doxXs<EM>]</EM>
            as in <STRONG>printf</STRONG>, flags are [-+#] and space.  Use  a  `:'
            to  allow the next character to be a `-' flag, avoid-
            ing interpreting "%-" as an operator.

       %c   print pop() like %c in <STRONG>printf</STRONG>

       %s   print pop() like %s in <STRONG>printf</STRONG>

       %p[1-9]
            push <EM>i</EM>'th parameter

       %P[a-z]
            set dynamic variable [a-z] to pop()

       %g[a-z]
            get dynamic variable [a-z] and push it

       %P[A-Z]
            set static variable [a-z] to pop()

       %g[A-Z]
            get static variable [a-z] and push it

            The terms  "static"  and  "dynamic"  are  misleading.
            Historically,  these are simply two different sets of
            variables, whose values are not reset  between  calls
            to  <STRONG>tparm</STRONG>.   However,  that fact is not documented in
            other implementations.  Relying on it will  adversely
            impact portability to other implementations.

       %'<EM>c</EM>' char constant <EM>c</EM>

       %{<EM>nn</EM>}
            integer constant <EM>nn</EM>

       %l   push strlen(pop)

       %+ %- %* %/ %m
            arithmetic (%m is mod): push(pop() op pop())

       %&amp; %| %^
            bit operations (AND, OR and exclusive-OR): push(pop()
            op pop())

       %= %&gt; %&lt;
            logical operations: push(pop() op pop())

       %A, %O
            logical AND and OR operations (for conditionals)

       %! %~
            unary  operations  (logical  and   bit   complement):
            push(op pop())

       %i   add 1 to first two parameters (for ANSI terminals)

       %? <EM>expr</EM> %t <EM>thenpart</EM> %e <EM>elsepart</EM> %;
            This  forms  an  if-then-else.   The  %e  <EM>elsepart</EM> is
            optional.  Usually the %? <EM>expr</EM> part  pushes  a  value
            onto  the stack, and %t pops it from the stack, test-
            ing if it is nonzero (true).  If it is zero  (false),
            control passes to the %e (else) part.

            It is possible to form else-if's a la Algol 68:
            %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e %;

            where ci are conditions, bi are bodies.

            Use the <STRONG>-f</STRONG> option of <STRONG>tic</STRONG> or <STRONG>infocmp</STRONG> to see the struc-
            ture  of  if-the-else's.  Some strings, e.g., <STRONG>sgr</STRONG> can
            be very complicated when written on one line.  The <STRONG>-f</STRONG>
            option  splits  the  string into lines with the parts
            indented.

       Binary operations are in postfix form with the operands in
       the  usual  order.   That  is,  to  get  x-5 one would use
       "%gx%{5}%-".  %P and %g variables  are  persistent  across
       escape-string evaluations.

       Consider the HP2645, which, to get to row 3 and column 12,
       needs to be sent \E&amp;a12c03Y  padded  for  6  milliseconds.
       Note  that  the  order of the rows and columns is inverted
       here, and that the row and column are printed as two  dig-
       its.  Thus its <STRONG>cup</STRONG> capability is "cup=6\E&amp;%p2%2dc%p1%2dY".

       The Microterm ACT-IV needs the current row and column sent
       preceded  by  a <STRONG>^T</STRONG>, with the row and column simply encoded
       in binary, "cup=^T%p1%c%p2%c".  Terminals which  use  "%c"
       need  to  be  able  to backspace the cursor (<STRONG>cub1</STRONG>), and to
       move the cursor up one line on the screen (<STRONG>cuu1</STRONG>).  This is
       necessary  because it is not always safe to transmit <STRONG>\n</STRONG> <STRONG>^D</STRONG>
       and <STRONG>\r</STRONG>, as the system may change or  discard  them.   (The
       library  routines  dealing  with terminfo set tty modes so
       that tabs are never expanded, so \t is safe to send.  This
       turns out to be essential for the Ann Arbor 4080.)

       A final example is the LSI ADM-3a, which uses row and col-
       umn  offset  by  a  blank  character,  thus  "cup=\E=%p1%'
       '%+%c%p2%'  '%+%c".   After sending `\E=', this pushes the
       first parameter, pushes the ASCII value for a space  (32),
       adds  them  (pushing  the sum on the stack in place of the
       two previous values) and outputs that value as  a  charac-
       ter.   Then  the  same  is  done for the second parameter.
       More complex arithmetic is possible using the stack.


   <STRONG>Cursor</STRONG> <STRONG>Motions</STRONG>
       If the terminal has a fast way to home the cursor (to very
       upper  left  corner  of  screen) then this can be given as
       <STRONG>home</STRONG>; similarly a fast way of getting to the  lower  left-
       hand  corner can be given as <STRONG>ll</STRONG>; this may involve going up
       with <STRONG>cuu1</STRONG> from the home position,  but  a  program  should
       never  do this itself (unless <STRONG>ll</STRONG> does) because it can make
       no assumption about the effect of moving up from the  home
       position.   Note  that  the  home  position is the same as
       addressing to (0,0): to the top left corner of the screen,
       not  of  memory.   (Thus, the \EH sequence on HP terminals
       cannot be used for <STRONG>home</STRONG>.)

       If the terminal has row or column absolute cursor address-
       ing,  these  can be given as single parameter capabilities
       <STRONG>hpa</STRONG> (horizontal position absolute) and <STRONG>vpa</STRONG> (vertical posi-
       tion absolute).  Sometimes these are shorter than the more
       general two parameter sequence (as with  the  hp2645)  and
       can   be   used  in  preference  to  <STRONG>cup</STRONG>.   If  there  are
       parameterized local motions (e.g., move <EM>n</EM>  spaces  to  the
       right) these can be given as <STRONG>cud</STRONG>, <STRONG>cub</STRONG>, <STRONG>cuf</STRONG>, and <STRONG>cuu</STRONG> with a
       single parameter  indicating  how  many  spaces  to  move.
       These  are  primarily useful if the terminal does not have
       <STRONG>cup</STRONG>, such as the TEKTRONIX 4025.

       If the terminal needs to be in a special mode when running
       a program that uses these capabilities, the codes to enter
       and exit this mode can be given as <STRONG>smcup</STRONG> and <STRONG>rmcup</STRONG>.   This
       arises,  for example, from terminals like the Concept with
       more than one page of memory.  If the  terminal  has  only
       memory  relative cursor addressing and not screen relative
       cursor addressing, a one screen-sized window must be fixed
       into  the terminal for cursor addressing to work properly.
       This is also used for the TEKTRONIX 4025, where <STRONG>smcup</STRONG> sets
       the  command character to be the one used by terminfo.  If
       the <STRONG>smcup</STRONG> sequence will not restore the  screen  after  an
       <STRONG>rmcup</STRONG> sequence is output (to the state prior to outputting
       <STRONG>rmcup</STRONG>), specify <STRONG>nrrmc</STRONG>.


   <STRONG>Area</STRONG> <STRONG>Clears</STRONG>
       If the terminal can clear from the current position to the
       end  of  the  line,  leaving  the cursor where it is, this
       should be given as <STRONG>el</STRONG>.  If the terminal can clear from the
       beginning  of  the line to the current position inclusive,
       leaving the cursor where it is, this should  be  given  as
       <STRONG>el1</STRONG>.   If the terminal can clear from the current position
       to the end of the display, then this should  be  given  as
       <STRONG>ed</STRONG>.   <STRONG>Ed</STRONG>  is only defined from the first column of a line.
       (Thus, it can be simulated by a request to delete a  large
       number of lines, if a true <STRONG>ed</STRONG> is not available.)


   <STRONG>Insert/delete</STRONG> <STRONG>line</STRONG> <STRONG>and</STRONG> <STRONG>vertical</STRONG> <STRONG>motions</STRONG>
       If  the terminal can open a new blank line before the line
       where the cursor is, this should be given as <STRONG>il1</STRONG>; this  is
       done  only  from the first position of a line.  The cursor
       must then appear on the newly blank line.  If the terminal
       can  delete  the  line  which  the cursor is on, then this
       should be given as <STRONG>dl1</STRONG>; this is done only from  the  first
       position  on  the line to be deleted.  Versions of <STRONG>il1</STRONG> and
       <STRONG>dl1</STRONG> which take a single parameter  and  insert  or  delete
       that many lines can be given as <STRONG>il</STRONG> and <STRONG>dl</STRONG>.

       If  the terminal has a settable scrolling region (like the
       vt100) the command to set this can be described  with  the
       <STRONG>csr</STRONG>  capability,  which  takes two parameters: the top and
       bottom lines of the scrolling region.  The cursor position
       is, alas, undefined after using this command.

       It  is possible to get the effect of insert or delete line
       using <STRONG>csr</STRONG> on a properly chosen region; the <STRONG>sc</STRONG> and <STRONG>rc</STRONG> (save
       and  restore  cursor)  commands may be useful for ensuring
       that your synthesized insert/delete string does  not  move
       the  cursor.  (Note that the <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG> library does this
       synthesis  automatically,  so   you   need   not   compose
       insert/delete strings for an entry with <STRONG>csr</STRONG>).

       Yet another way to construct insert and delete might be to
       use a combination of index with  the  memory-lock  feature
       found  on some terminals (like the HP-700/90 series, which
       however also has insert/delete).

       Inserting lines at the top or bottom  of  the  screen  can
       also  be  done using <STRONG>ri</STRONG> or <STRONG>ind</STRONG> on many terminals without a
       true insert/delete line, and is often faster even on  ter-
       minals with those features.

       The  boolean  <STRONG>non_dest_scroll_region</STRONG> should be set if each
       scrolling window is effectively a view port on  a  screen-
       sized  canvas.   To  test  for  this  capability, create a
       scrolling region in the middle of the screen, write  some-
       thing  to  the  bottom line, move the cursor to the top of
       the region, and do <STRONG>ri</STRONG> followed by <STRONG>dl1</STRONG> or <STRONG>ind</STRONG>.  If the data
       scrolled  off  the  bottom  of  the  region  by the <STRONG>ri</STRONG> re-
       appears, then scrolling is non-destructive.  System V  and
       XSI  Curses  expect that <STRONG>ind</STRONG>, <STRONG>ri</STRONG>, <STRONG>indn</STRONG>, and <STRONG>rin</STRONG> will simu-
       late destructive scrolling; their  documentation  cautions
       you  not  to  define <STRONG>csr</STRONG> unless this is true.  This <STRONG>curses</STRONG>
       implementation is more liberal and will do explicit erases
       after scrolling if <STRONG>ndstr</STRONG> is defined.

       If the terminal has the ability to define a window as part
       of memory, which all commands affect, it should  be  given
       as the parameterized string <STRONG>wind</STRONG>.  The four parameters are
       the starting and ending lines in memory and  the  starting
       and ending columns in memory, in that order.

       If  the terminal can retain display memory above, then the
       <STRONG>da</STRONG> capability should be given; if display  memory  can  be
       retained  below,  then <STRONG>db</STRONG> should be given.  These indicate
       that deleting a line  or  scrolling  may  bring  non-blank
       lines  up  from  below  or that scrolling back with <STRONG>ri</STRONG> may
       bring down non-blank lines.


   <STRONG>Insert/Delete</STRONG> <STRONG>Character</STRONG>
       There are two basic kinds of  intelligent  terminals  with
       respect  to insert/delete character which can be described
       using <EM>terminfo.</EM>  The most common  insert/delete  character
       operations  affect only the characters on the current line
       and shift characters off the  end  of  the  line  rigidly.
       Other  terminals,  such  as the Concept 100 and the Perkin
       Elmer Owl, make a distinction between  typed  and  untyped
       blanks  on  the  screen, shifting upon an insert or delete
       only to an untyped blank on the  screen  which  is  either
       eliminated,  or  expanded  to two untyped blanks.  You can
       determine the kind of terminal you have  by  clearing  the
       screen  and  then typing text separated by cursor motions.
       Type "abc    def" using local cursor motions (not  spaces)
       between the "abc" and the "def".  Then position the cursor
       before the "abc" and put the terminal in insert mode.   If
       typing  characters  causes  the  rest of the line to shift
       rigidly and characters to fall off the end, then your ter-
       minal  does  not  distinguish  between  blanks and untyped
       positions.  If the "abc" shifts over to  the  "def"  which
       then  move together around the end of the current line and
       onto the next as you insert, you have the second  type  of
       terminal,  and should give the capability <STRONG>in</STRONG>, which stands
       for "insert null".  While these are two logically separate
       attributes  (one  line  versus multi-line insert mode, and
       special treatment of untyped spaces) we have seen no  ter-
       minals whose insert mode cannot be described with the sin-
       gle attribute.

       Terminfo can describe both terminals which have an  insert
       mode, and terminals which send a simple sequence to open a
       blank position on the current  line.   Give  as  <STRONG>smir</STRONG>  the
       sequence  to  get  into  insert  mode.   Give  as <STRONG>rmir</STRONG> the
       sequence to leave insert  mode.   Now  give  as  <STRONG>ich1</STRONG>  any
       sequence  needed  to  be  sent  just  before  sending  the
       character to be inserted.   Most  terminals  with  a  true
       insert  mode  will  not  give <STRONG>ich1</STRONG>; terminals which send a
       sequence to open a screen position should give it here.

       If your terminal has both, insert mode is usually  prefer-
       able  to  <STRONG>ich1</STRONG>.   Technically,  you  should  not give both
       unless the terminal actually requires both to be  used  in
       combination.   Accordingly,  some  non-curses applications
       get confused if both are present; the symptom  is  doubled
       characters in an update using insert.  This requirement is
       now rare; most <STRONG>ich</STRONG> sequences do not require previous smir,
       and most smir insert modes do not require <STRONG>ich1</STRONG> before each
       character.  Therefore, the  new  <STRONG>curses</STRONG>  actually  assumes
       this  is the case and uses either <STRONG>rmir</STRONG>/<STRONG>smir</STRONG> or <STRONG>ich</STRONG>/<STRONG>ich1</STRONG> as
       appropriate (but not both).  If you have to write an entry
       to  be  used under new curses for a terminal old enough to
       need both, include the <STRONG>rmir</STRONG>/<STRONG>smir</STRONG> sequences in <STRONG>ich1</STRONG>.

       If post insert padding is needed, give this as a number of
       milliseconds  in <STRONG>ip</STRONG> (a string option).  Any other sequence
       which may need to be sent after  an  insert  of  a  single
       character may also be given in <STRONG>ip</STRONG>.  If your terminal needs
       both to be placed into an `insert mode' and a special code
       to  precede  each  inserted character, then both <STRONG>smir</STRONG>/<STRONG>rmir</STRONG>
       and <STRONG>ich1</STRONG> can be given, and both will  be  used.   The  <STRONG>ich</STRONG>
       capability, with one parameter, <EM>n</EM>, will repeat the effects
       of <STRONG>ich1</STRONG> <EM>n</EM> times.

       If padding is necessary between characters typed while not
       in  insert  mode,  give  this  as a number of milliseconds
       padding in <STRONG>rmp</STRONG>.

       It is occasionally  necessary  to  move  around  while  in
       insert  mode  to delete characters on the same line (e.g.,
       if there is a tab after the insertion position).  If  your
       terminal  allows  motion while in insert mode you can give
       the capability <STRONG>mir</STRONG> to speed up  inserting  in  this  case.
       Omitting  <STRONG>mir</STRONG>  will  affect  only  speed.   Some terminals
       (notably Datamedia's) must not have <STRONG>mir</STRONG> because of the way
       their insert mode works.

       Finally,  you  can specify <STRONG>dch1</STRONG> to delete a single charac-
       ter, <STRONG>dch</STRONG> with one parameter, <EM>n</EM>, to  delete  <EM>n</EM>  <EM>characters,</EM>
       and  delete mode by giving <STRONG>smdc</STRONG> and <STRONG>rmdc</STRONG> to enter and exit
       delete mode (any mode the terminal needs to be  placed  in
       for <STRONG>dch1</STRONG> to work).

       A  command to erase <EM>n</EM> characters (equivalent to outputting
       <EM>n</EM> blanks without moving the cursor) can be  given  as  <STRONG>ech</STRONG>
       with one parameter.


   <STRONG>Highlighting,</STRONG> <STRONG>Underlining,</STRONG> <STRONG>and</STRONG> <STRONG>Visible</STRONG> <STRONG>Bells</STRONG>
       If  your  terminal  has  one  or  more  kinds  of  display
       attributes, these can be represented in a number  of  dif-
       ferent ways.  You should choose one display form as <EM>stand-</EM>
       <EM>out</EM> <EM>mode</EM>, representing a good, high contrast, easy-on-the-
       eyes,  format  for  highlighting  error messages and other
       attention getters.  (If you have a choice,  reverse  video
       plus  half-bright  is  good, or reverse video alone.)  The
       sequences to enter and exit standout  mode  are  given  as
       <STRONG>smso</STRONG>  and  <STRONG>rmso</STRONG>, respectively.  If the code to change into
       or out of standout mode  leaves  one  or  even  two  blank
       spaces  on the screen, as the TVI 912 and Teleray 1061 do,
       then <STRONG>xmc</STRONG> should be given to tell how many spaces are left.

       Codes  to  begin  underlining  and  end underlining can be
       given as <STRONG>smul</STRONG> and <STRONG>rmul</STRONG> respectively.  If the terminal  has
       a  code  to  underline  the current character and move the
       cursor one space to the right, such as the Microterm Mime,
       this can be given as <STRONG>uc</STRONG>.

       Other  capabilities  to  enter  various highlighting modes
       include <STRONG>blink</STRONG> (blinking) <STRONG>bold</STRONG> (bold or extra  bright)  <STRONG>dim</STRONG>
       (dim  or  half-bright)  <STRONG>invis</STRONG> (blanking or invisible text)
       <STRONG>prot</STRONG> (protected) <STRONG>rev</STRONG> (reverse video) <STRONG>sgr0</STRONG>  (turn  off  <EM>all</EM>
       attribute  modes)  <STRONG>smacs</STRONG>  (enter  alternate  character set
       mode) and  <STRONG>rmacs</STRONG>  (exit  alternate  character  set  mode).
       Turning  on  any of these modes singly may or may not turn
       off other modes.

       If there is a sequence to set  arbitrary  combinations  of
       modes,  this should be given as <STRONG>sgr</STRONG> (set attributes), tak-
       ing 9 parameters.  Each parameter is either 0 or  nonzero,
       as the corresponding attribute is on or off.  The 9 param-
       eters are, in order: standout, underline, reverse,  blink,
       dim,  bold,  blank, protect, alternate character set.  Not
       all modes need be supported by <STRONG>sgr</STRONG>, only those  for  which
       corresponding separate attribute commands exist.

       For example, the DEC vt220 supports most of the modes:


           <STRONG>tparm</STRONG> <STRONG>parameter</STRONG>   <STRONG>attribute</STRONG>    <STRONG>escape</STRONG> <STRONG>sequence</STRONG>

           none              none         \E[0m
           p1                standout     \E[0;1;7m
           p2                underline    \E[0;4m
           p3                reverse      \E[0;7m
           p4                blink        \E[0;5m
           p5                dim          not available
           p6                bold         \E[0;1m
           p7                invis        \E[0;8m
           p8                protect      not used
           p9                altcharset   ^O (off) ^N (on)

       We  begin each escape sequence by turning off any existing
       modes, since there is no quick way  to  determine  whether
       they are active.  Standout is set up to be the combination
       of reverse and bold.  The vt220  terminal  has  a  protect
       mode,  though  it  is  not commonly used in sgr because it
       protects characters on the screen  from  the  host's  era-
       sures.   The  altcharset mode also is different in that it
       is either ^O or ^N, depending on whether it is off or  on.
       If  all  modes  are  turned  on, the resulting sequence is
       \E[0;1;4;5;7;8m^N.

       Some sequences are common to different modes.   For  exam-
       ple,  ;7  is output when either p1 or p3 is true, that is,
       if either standout or reverse modes are turned on.

       Writing out the above sequences, along with  their  depen-
       dencies yields


         <STRONG>sequence</STRONG>    <STRONG>when</STRONG> <STRONG>to</STRONG> <STRONG>output</STRONG>     <STRONG>terminfo</STRONG> <STRONG>translation</STRONG>

         \E[0       always              \E[0
         ;1         if p1 or p6         %?%p1%p6%|%t;1%;
         ;4         if p2               %?%p2%|%t;4%;
         ;5         if p4               %?%p4%|%t;5%;

         ;7         if p1 or p3         %?%p1%p3%|%t;7%;
         ;8         if p7               %?%p7%|%t;8%;
         m          always              m
         ^N or ^O   if p9 ^N, else ^O   %?%p9%t^N%e^O%;

       Putting this all together into the sgr sequence gives:

           sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;
               %?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,

       Remember  that  if  you specify sgr, you must also specify
       sgr0.  Also, some implementations rely on sgr being  given
       if  sgr0  is, Not all terminfo entries necessarily have an
       sgr string, however.  Many terminfo  entries  are  derived
       from  termcap  entries which have no sgr string.  The only
       drawback to adding an sgr  string  is  that  termcap  also
       assumes  that  sgr0  does not exit alternate character set
       mode.

       Terminals with the ``magic cookie'' glitch  (<STRONG>xmc</STRONG>)  deposit
       special   ``cookies''   when   they  receive  mode-setting
       sequences, which affect the display algorithm rather  than
       having  extra  bits  for  each character.  Some terminals,
       such as the HP 2621,  automatically  leave  standout  mode
       when  they  move to a new line or the cursor is addressed.
       Programs using standout mode  should  exit  standout  mode
       before  moving the cursor or sending a newline, unless the
       <STRONG>msgr</STRONG> capability, asserting that it  is  safe  to  move  in
       standout mode, is present.

       If  the terminal has a way of flashing the screen to indi-
       cate an error quietly (a bell replacement) then  this  can
       be given as <STRONG>flash</STRONG>; it must not move the cursor.

       If  the  cursor  needs to be made more visible than normal
       when it is not on the bottom line (to make, for example, a
       non-blinking  underline  into  an  easier to find block or
       blinking underline) give this sequence as <STRONG>cvvis</STRONG>.  If there
       is  a  way  to  make the cursor completely invisible, give
       that as <STRONG>civis</STRONG>.  The capability <STRONG>cnorm</STRONG> should be given which
       undoes the effects of both of these modes.

       If your terminal correctly generates underlined characters
       (with no special codes needed) even  though  it  does  not
       overstrike,  then you should give the capability <STRONG>ul</STRONG>.  If a
       character overstriking another leaves both  characters  on
       the screen, specify the capability <STRONG>os</STRONG>.  If overstrikes are
       erasable with a blank, then this should  be  indicated  by
       giving <STRONG>eo</STRONG>.


   <STRONG>Keypad</STRONG> <STRONG>and</STRONG> <STRONG>Function</STRONG> <STRONG>Keys</STRONG>
       If the terminal has a keypad that transmits codes when the
       keys are pressed, this information  can  be  given.   Note
       that it is not possible to handle terminals where the key-
       pad only works in local (this applies, for example, to the
       unshifted  HP  2621  keys).   If  the keypad can be set to
       transmit or not transmit, give these  codes  as  <STRONG>smkx</STRONG>  and
       <STRONG>rmkx</STRONG>.  Otherwise the keypad is assumed to always transmit.
       The codes sent by the left arrow, right arrow,  up  arrow,
       down  arrow,  and  home keys can be given as <STRONG>kcub1,</STRONG> <STRONG>kcuf1,</STRONG>
       <STRONG>kcuu1,</STRONG> <STRONG>kcud1,</STRONG> and <STRONG>khome</STRONG> respectively.  If there are  func-
       tion  keys  such  as f0, f1, ..., f10, the codes they send
       can be given as <STRONG>kf0,</STRONG> <STRONG>kf1,</STRONG> <STRONG>...,</STRONG> <STRONG>kf10</STRONG>.  If these  keys  have
       labels  other  than the default f0 through f10, the labels
       can  be  given  as  <STRONG>lf0,</STRONG>  <STRONG>lf1,</STRONG>  <STRONG>...,</STRONG>  <STRONG>lf10</STRONG>.    The   codes
       transmitted  by  certain  other special keys can be given:
       <STRONG>kll</STRONG> (home down), <STRONG>kbs</STRONG> (backspace), <STRONG>ktbc</STRONG> (clear  all  tabs),
       <STRONG>kctab</STRONG>  (clear  the  tab  stop in this column), <STRONG>kclr</STRONG> (clear
       screen or  erase  key),  <STRONG>kdch1</STRONG>  (delete  character),  <STRONG>kdl1</STRONG>
       (delete line), <STRONG>krmir</STRONG> (exit insert mode), <STRONG>kel</STRONG> (clear to end
       of line), <STRONG>ked</STRONG> (clear to  end  of  screen),  <STRONG>kich1</STRONG>  (insert
       character  or  enter insert mode), <STRONG>kil1</STRONG> (insert line), <STRONG>knp</STRONG>
       (next  page),  <STRONG>kpp</STRONG>  (previous  page),  <STRONG>kind</STRONG>  (scroll  for-
       ward/down), <STRONG>kri</STRONG> (scroll backward/up), <STRONG>khts</STRONG> (set a tab stop
       in this column).  In addition, if the keypad has a 3 by  3
       array  of  keys  including  the four arrow keys, the other
       five keys can be given as <STRONG>ka1</STRONG>, <STRONG>ka3</STRONG>,  <STRONG>kb2</STRONG>,  <STRONG>kc1</STRONG>,  and  <STRONG>kc3</STRONG>.
       These  keys are useful when the effects of a 3 by 3 direc-
       tional pad are needed.

       Strings to program function keys can be  given  as  <STRONG>pfkey</STRONG>,
       <STRONG>pfloc</STRONG>,  and <STRONG>pfx</STRONG>.  A string to program screen labels should
       be specified as <STRONG>pln</STRONG>.  Each  of  these  strings  takes  two
       parameters:  the function key number to program (from 0 to
       10) and the string to program it with.  Function key  num-
       bers  out  of  this  range may program undefined keys in a
       terminal dependent manner.   The  difference  between  the
       capabilities  is  that <STRONG>pfkey</STRONG> causes pressing the given key
       to be the same as the user typing the given string;  <STRONG>pfloc</STRONG>
       causes the string to be executed by the terminal in local;
       and <STRONG>pfx</STRONG> causes the string to be transmitted  to  the  com-
       puter.

       The capabilities <STRONG>nlab</STRONG>, <STRONG>lw</STRONG> and <STRONG>lh</STRONG> define the number of pro-
       grammable screen labels and their width  and  height.   If
       there  are  commands  to  turn the labels on and off, give
       them in <STRONG>smln</STRONG> and <STRONG>rmln</STRONG>.  <STRONG>smln</STRONG> is normally output after  one
       or more pln sequences to make sure that the change becomes
       visible.


   <STRONG>Tabs</STRONG> <STRONG>and</STRONG> <STRONG>Initialization</STRONG>
       If the terminal has hardware tabs, the command to  advance
       to  the  next tab stop can be given as <STRONG>ht</STRONG> (usually control
       I).  A ``back-tab'' command which moves  leftward  to  the
       preceding tab stop can be given as <STRONG>cbt</STRONG>.  By convention, if
       the teletype modes indicate that tabs are  being  expanded
       by  the  computer  rather than being sent to the terminal,
       programs should not  use  <STRONG>ht</STRONG>  or  <STRONG>cbt</STRONG>  even  if  they  are
       present,  since  the user may not have the tab stops prop-
       erly set.  If the terminal has  hardware  tabs  which  are
       initially  set every <EM>n</EM> spaces when the terminal is powered
       up, the numeric parameter <STRONG>it</STRONG> is given, showing the  number
       of  spaces  the tabs are set to.  This is normally used by
       the <EM>tset</EM> command to determine whether to set the mode  for
       hardware  tab expansion, and whether to set the tab stops.
       If the terminal has tab stops that can be  saved  in  non-
       volatile  memory, the terminfo description can assume that
       they are properly set.

       Other capabilities include <STRONG>is1</STRONG>, <STRONG>is2</STRONG>, and <STRONG>is3</STRONG>,  initializa-
       tion  strings  for the terminal, <STRONG>iprog</STRONG>, the path name of a
       program to be run to initialize the terminal, and <STRONG>if</STRONG>,  the
       name  of  a  file  containing long initialization strings.
       These strings are expected to set the terminal into  modes
       consistent  with  the  rest  of  the terminfo description.
       They are normally sent to the terminal, by the <EM>init</EM> option
       of  the  <EM>tput</EM>  program,  each time the user logs in.  They
       will be printed in the following order:

              run the program
                     <STRONG>iprog</STRONG>

              output <STRONG>is1</STRONG> <STRONG>is2</STRONG>

              set the margins using
                     <STRONG>mgc</STRONG>, <STRONG>smgl</STRONG> and <STRONG>smgr</STRONG>

              set tabs using
                     <STRONG>tbc</STRONG> and <STRONG>hts</STRONG>

              print the file
                     <STRONG>if</STRONG>

              and finally
                     output <STRONG>is3</STRONG>.

       Most initialization is done with  <STRONG>is2</STRONG>.   Special  terminal
       modes can be set up without duplicating strings by putting
       the common sequences in <STRONG>is2</STRONG> and special cases in  <STRONG>is1</STRONG>  and
       <STRONG>is3</STRONG>.

       A set of sequences that does a harder reset from a totally
       unknown state can be given as <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG>, <STRONG>rf</STRONG> and <STRONG>rs3</STRONG>, analo-
       gous  to  <STRONG>is1</STRONG>  <STRONG>,</STRONG>  <STRONG>is2</STRONG>  <STRONG>,</STRONG>  <STRONG>if</STRONG>  and <STRONG>is3</STRONG> respectively.  These
       strings are output by the <EM>reset</EM>  program,  which  is  used
       when  the terminal gets into a wedged state.  Commands are
       normally placed in <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG> <STRONG>rs3</STRONG> and <STRONG>rf</STRONG> only if  they  pro-
       duce  annoying effects on the screen and are not necessary
       when logging in.  For example,  the  command  to  set  the
       vt100  into  80-column mode would normally be part of <STRONG>is2</STRONG>,
       but it causes an annoying glitch of the screen and is  not
       normally  needed  since the terminal is usually already in
       80 column mode.

       The <EM>reset</EM> program writes strings including <STRONG>iprog</STRONG>, etc., in
       the  same  order  as  the  <EM>init</EM>  program, using <STRONG>rs1</STRONG>, etc.,
       instead of <STRONG>is1</STRONG>, etc.  If any of <STRONG>rs1</STRONG>, <STRONG>rs2</STRONG>, <STRONG>rs3</STRONG>, or <STRONG>rf</STRONG> reset
       capability  strings  are  missing, the <EM>reset</EM> program falls
       back  upon  the  corresponding  initialization  capability
       string.

       If there are commands to set and clear tab stops, they can
       be given as <STRONG>tbc</STRONG> (clear all tab stops) and <STRONG>hts</STRONG> (set  a  tab
       stop  in the current column of every row).  If a more com-
       plex sequence is needed  to  set  the  tabs  than  can  be
       described  by  this,  the sequence can be placed in <STRONG>is2</STRONG> or
       <STRONG>if</STRONG>.

   <STRONG>Delays</STRONG> <STRONG>and</STRONG> <STRONG>Padding</STRONG>
       Many older and slower  terminals  do  not  support  either
       XON/XOFF or DTR handshaking, including hard copy terminals
       and some very archaic CRTs (including,  for  example,  DEC
       VT100s).   These may require padding characters after cer-
       tain cursor motions and screen changes.

       If the terminal uses xon/xoff handshaking for flow control
       (that  is, it automatically emits ^S back to the host when
       its input buffers are close to full), set <STRONG>xon</STRONG>.  This capa-
       bility  suppresses  the emission of padding.  You can also
       set it for memory-mapped console devices effectively  that
       do  not  have  a  speed limit.  Padding information should
       still be included so that routines can make  better  deci-
       sions about relative costs, but actual pad characters will
       not be transmitted.

       If <STRONG>pb</STRONG> (padding baud rate) is given, padding is  suppressed
       at  baud rates below the value of <STRONG>pb</STRONG>.  If the entry has no
       padding baud rate, then whether padding is emitted or  not
       is completely controlled by <STRONG>xon</STRONG>.

       If  the terminal requires other than a null (zero) charac-
       ter as a pad, then this can be given  as  <STRONG>pad</STRONG>.   Only  the
       first character of the <STRONG>pad</STRONG> string is used.


   <STRONG>Status</STRONG> <STRONG>Lines</STRONG>
       Some  terminals  have  an extra `status line' which is not
       normally used by software (and thus  not  counted  in  the
       terminal's <STRONG>lines</STRONG> capability).

       The  simplest  case  is  a  status  line  which is cursor-
       addressable but not part of the main scrolling  region  on
       the  screen;  the  Heathkit  H19 has a status line of this
       kind, as would a 24-line VT100 with  a  23-line  scrolling
       region  set up on initialization.  This situation is indi-
       cated by the <STRONG>hs</STRONG> capability.

       Some terminals with status lines need special sequences to
       access  the  status  line.   These  may  be expressed as a
       string with single parameter <STRONG>tsl</STRONG> which takes the cursor to
       a  given zero-origin column on the status line.  The capa-
       bility <STRONG>fsl</STRONG> must return to the main-screen cursor positions
       before  the  last  <STRONG>tsl</STRONG>.   You may need to embed the string
       values of <STRONG>sc</STRONG> (save cursor) and <STRONG>rc</STRONG> (restore cursor) in  <STRONG>tsl</STRONG>
       and <STRONG>fsl</STRONG> to accomplish this.

       The  status  line is normally assumed to be the same width
       as the width of the terminal.  If this is untrue, you  can
       specify it with the numeric capability <STRONG>wsl</STRONG>.

       A  command to erase or blank the status line may be speci-
       fied as <STRONG>dsl</STRONG>.

       The  boolean  capability  <STRONG>eslok</STRONG>  specifies   that   escape
       sequences, tabs, etc., work ordinarily in the status line.

       The <STRONG>ncurses</STRONG> implementation does not yet use any  of  these
       capabilities.   They are documented here in case they ever
       become important.


   <STRONG>Line</STRONG> <STRONG>Graphics</STRONG>
       Many terminals have alternate character  sets  useful  for
       forms-drawing.   Terminfo  and <STRONG>curses</STRONG> build in support for
       the drawing characters supported by the VT100,  with  some
       characters  from  the  AT&amp;T  4410v1 added.  This alternate
       character set may be specified by the <STRONG>acsc</STRONG> capability.


                <STRONG>Glyph</STRONG>             <STRONG>ACS</STRONG>            <STRONG>Ascii</STRONG>      <STRONG>VT100</STRONG>
                 <STRONG>Name</STRONG>             <STRONG>Name</STRONG>           <STRONG>Default</STRONG>    <STRONG>Name</STRONG>
       UK pound sign              ACS_STERLING   f          }
       arrow pointing down        ACS_DARROW     v          .
       arrow pointing left        ACS_LARROW     &lt;          ,
       arrow pointing right       ACS_RARROW     &gt;          +
       arrow pointing up          ACS_UARROW     ^          -
       board of squares           ACS_BOARD      #          h
       bullet                     ACS_BULLET     o          ~
       checker board (stipple)    ACS_CKBOARD    :          a
       degree symbol              ACS_DEGREE     \          f
       diamond                    ACS_DIAMOND    +          `
       greater-than-or-equal-to   ACS_GEQUAL     &gt;          z
       greek pi                   ACS_PI         *          {
       horizontal line            ACS_HLINE      -          q
       lantern symbol             ACS_LANTERN    #          i
       large plus or crossover    ACS_PLUS       +          n
       less-than-or-equal-to      ACS_LEQUAL     &lt;          y

       lower left corner          ACS_LLCORNER   +          m
       lower right corner         ACS_LRCORNER   +          j
       not-equal                  ACS_NEQUAL     !          |
       plus/minus                 ACS_PLMINUS    #          g
       scan line 1                ACS_S1         ~          o
       scan line 3                ACS_S3         -          p
       scan line 7                ACS_S7         -          r
       scan line 9                ACS_S9         _          s
       solid square block         ACS_BLOCK      #          0
       tee pointing down          ACS_TTEE       +          w
       tee pointing left          ACS_RTEE       +          u
       tee pointing right         ACS_LTEE       +          t
       tee pointing up            ACS_BTEE       +          v
       upper left corner          ACS_ULCORNER   +          l
       upper right corner         ACS_URCORNER   +          k
       vertical line              ACS_VLINE      |          x

       The best way to define a new device's graphics set  is  to
       add  a  column  to a copy of this table for your terminal,
       giving  the  character   which   (when   emitted   between
       <STRONG>smacs</STRONG>/<STRONG>rmacs</STRONG>  switches) will be rendered as the correspond-
       ing graphic.  Then read off the VT100/your terminal  char-
       acter  pairs  right  to left in sequence; these become the
       ACSC string.


   <STRONG>Color</STRONG> <STRONG>Handling</STRONG>
       Most color terminals are either `Tektronix-like'  or  `HP-
       like'.   Tektronix-like terminals have a predefined set of
       N colors (where N usually 8), and can  set  character-cell
       foreground and background characters independently, mixing
       them into N * N color-pairs.  On  HP-like  terminals,  the
       use must set each color pair up separately (foreground and
       background are  not  independently  settable).   Up  to  M
       color-pairs  may  be  set  up  from  2*M different colors.
       ANSI-compatible terminals are Tektronix-like.

       Some basic color capabilities are independent of the color
       method.  The numeric capabilities <STRONG>colors</STRONG> and <STRONG>pairs</STRONG> specify
       the maximum numbers of colors and color-pairs that can  be
       displayed  simultaneously.   The <STRONG>op</STRONG> (original pair) string
       resets foreground and background colors to  their  default
       values  for the terminal.  The <STRONG>oc</STRONG> string resets all colors
       or color-pairs to their default values for  the  terminal.
       Some  terminals  (including  many  PC  terminal emulators)
       erase screen  areas  with  the  current  background  color
       rather  than the power-up default background; these should
       have the boolean capability <STRONG>bce</STRONG>.

       To change the current foreground or background color on  a
       Tektronix-type  terminal,  use <STRONG>setaf</STRONG> (set ANSI foreground)
       and <STRONG>setab</STRONG> (set ANSI background) or <STRONG>setf</STRONG>  (set  foreground)
       and  <STRONG>setb</STRONG> (set background).  These take one parameter, the
       color  number.   The  SVr4  documentation  describes  only
       <STRONG>setaf</STRONG>/<STRONG>setab</STRONG>;  the  XPG4  draft  says that "If the terminal
       supports ANSI escape sequences to set background and fore-
       ground,  they  should be coded as <STRONG>setaf</STRONG> and <STRONG>setab</STRONG>, respec-
       tively.  If the terminal supports other  escape  sequences
       to  set background and foreground, they should be coded as
       <STRONG>setf</STRONG> and <STRONG>setb</STRONG>, respectively.  The <EM>vidputs()</EM>  function  and
       the  refresh  functions  use  <STRONG>setaf</STRONG>  and <STRONG>setab</STRONG> if they are
       defined."

       The <STRONG>setaf</STRONG>/<STRONG>setab</STRONG> and <STRONG>setf</STRONG>/<STRONG>setb</STRONG> capabilities take  a  single
       numeric argument each.  Argument values 0-7 of <STRONG>setaf</STRONG>/<STRONG>setab</STRONG>
       are portably defined as follows (the middle column is  the
       symbolic #define available in the header for the <STRONG>curses</STRONG> or
       <STRONG>ncurses</STRONG> libraries).  The terminal hardware is free to  map
       these  as  it  likes,  but  the RGB values indicate normal
       locations in color space.


             <STRONG>Color</STRONG>       <STRONG>#define</STRONG>       <STRONG>Value</STRONG>       <STRONG>RGB</STRONG>
             black     <STRONG>COLOR_BLACK</STRONG>       0     0, 0, 0
             red       <STRONG>COLOR_RED</STRONG>         1     max,0,0
             green     <STRONG>COLOR_GREEN</STRONG>       2     0,max,0
             yellow    <STRONG>COLOR_YELLOW</STRONG>      3     max,max,0
             blue      <STRONG>COLOR_BLUE</STRONG>        4     0,0,max
             magenta   <STRONG>COLOR_MAGENTA</STRONG>     5     max,0,max
             cyan      <STRONG>COLOR_CYAN</STRONG>        6     0,max,max
             white     <STRONG>COLOR_WHITE</STRONG>       7     max,max,max

       The argument values of <STRONG>setf</STRONG>/<STRONG>setb</STRONG>  historically  correspond
       to a different mapping, i.e.,

             <STRONG>Color</STRONG>       <STRONG>#define</STRONG>       <STRONG>Value</STRONG>       <STRONG>RGB</STRONG>
             black     <STRONG>COLOR_BLACK</STRONG>       0     0, 0, 0
             blue      <STRONG>COLOR_BLUE</STRONG>        1     0,0,max
             green     <STRONG>COLOR_GREEN</STRONG>       2     0,max,0
             cyan      <STRONG>COLOR_CYAN</STRONG>        3     0,max,max
             red       <STRONG>COLOR_RED</STRONG>         4     max,0,0
             magenta   <STRONG>COLOR_MAGENTA</STRONG>     5     max,0,max
             yellow    <STRONG>COLOR_YELLOW</STRONG>      6     max,max,0
             white     <STRONG>COLOR_WHITE</STRONG>       7     max,max,max
       It is important to not confuse the two sets of color capa-
       bilities; otherwise red/blue will be interchanged  on  the
       display.

       On  an  HP-like terminal, use <STRONG>scp</STRONG> with a color-pair number
       parameter to set which color pair is current.

       On a Tektronix-like terminal, the capability  <STRONG>ccc</STRONG>  may  be
       present  to  indicate that colors can be modified.  If so,
       the <STRONG>initc</STRONG> capability will take a color number (0 to <STRONG>colors</STRONG>
       -  1)and  three  more parameters which describe the color.
       These three parameters default to being interpreted as RGB
       (Red,  Green, Blue) values.  If the boolean capability <STRONG>hls</STRONG>
       is present, they are instead as HLS (Hue, Lightness, Satu-
       ration) indices.  The ranges are terminal-dependent.

       On  an  HP-like  terminal, <STRONG>initp</STRONG> may give a capability for
       changing a color-pair value.  It will take  seven  parame-
       ters;  a  color-pair  number (0 to <STRONG>max_pairs</STRONG> - 1), and two
       triples describing first background  and  then  foreground
       colors.   These  parameters  must be (Red, Green, Blue) or
       (Hue, Lightness, Saturation) depending on <STRONG>hls</STRONG>.

       On some color terminals, colors collide  with  highlights.
       You can register these collisions with the <STRONG>ncv</STRONG> capability.
       This is a bit-mask of attributes not to be used when  col-
       ors  are  enabled.  The correspondence with the attributes
       understood by <STRONG>curses</STRONG> is as follows:


                      <STRONG>Attribute</STRONG>      <STRONG>Bit</STRONG>   <STRONG>Decimal</STRONG>
                      A_STANDOUT     0     1
                      A_UNDERLINE    1     2
                      A_REVERSE      2     4
                      A_BLINK        3     8
                      A_DIM          4     16
                      A_BOLD         5     32
                      A_INVIS        6     64
                      A_PROTECT      7     128
                      A_ALTCHARSET   8     256

       For example,  on  many  IBM  PC  consoles,  the  underline
       attribute  collides  with the foreground color blue and is
       not available in color mode.  These  should  have  an  <STRONG>ncv</STRONG>
       capability of 2.

       SVr4  curses  does nothing with <STRONG>ncv</STRONG>, ncurses recognizes it
       and optimizes the output in favor of colors.


   <STRONG>Miscellaneous</STRONG>
       If the terminal requires other than a null (zero)  charac-
       ter  as  a  pad,  then this can be given as pad.  Only the
       first character of the pad string is used.  If the  termi-
       nal does not have a pad character, specify npc.  Note that
       ncurses implements  the  termcap-compatible  <STRONG>PC</STRONG>  variable;
       though  the  application  may  set this value to something
       other than a null, ncurses will test  <STRONG>npc</STRONG>  first  and  use
       napms if the terminal has no pad character.

       If  the terminal can move up or down half a line, this can
       be indicated with <STRONG>hu</STRONG>  (half-line  up)  and  <STRONG>hd</STRONG>  (half-line
       down).  This is primarily useful for superscripts and sub-
       scripts on hard-copy terminals.  If a  hard-copy  terminal
       can  eject  to  the next page (form feed), give this as <STRONG>ff</STRONG>
       (usually control L).

       If there is a command to repeat a given character a  given
       number  of times (to save time transmitting a large number
       of identical characters) this can be  indicated  with  the
       parameterized  string  <STRONG>rep</STRONG>.   The  first  parameter is the
       character to be repeated and the second is the  number  of
       times  to repeat it.  Thus, tparm(repeat_char, 'x', 10) is
       the same as `xxxxxxxxxx'.

       If the terminal has a settable command character, such  as
       the  TEKTRONIX  4025, this can be indicated with <STRONG>cmdch</STRONG>.  A
       prototype command character is chosen which is used in all
       capabilities.   This character is given in the <STRONG>cmdch</STRONG> capa-
       bility to identify it.  The following convention  is  sup-
       ported  on  some  UNIX  systems:  The environment is to be
       searched for a <STRONG>CC</STRONG> variable, and if found, all  occurrences
       of the prototype character are replaced with the character
       in the environment variable.

       Terminal descriptions that do  not  represent  a  specific
       kind of known terminal, such as <EM>switch</EM>, <EM>dialup</EM>, <EM>patch</EM>, and
       <EM>network</EM>, should include the  <STRONG>gn</STRONG>  (generic)  capability  so
       that  programs  can  complain that they do not know how to
       talk to the terminal.  (This capability does not apply  to
       <EM>virtual</EM>   terminal   descriptions  for  which  the  escape
       sequences are known.)

       If the terminal has a ``meta key'' which acts as  a  shift
       key,  setting  the  8th  bit of any character transmitted,
       this fact can be indicated with <STRONG>km</STRONG>.   Otherwise,  software
       will assume that the 8th bit is parity and it will usually
       be cleared.  If strings exist to turn this  ``meta  mode''
       on and off, they can be given as <STRONG>smm</STRONG> and <STRONG>rmm</STRONG>.

       If  the terminal has more lines of memory than will fit on
       the screen at once, the number of lines of memory  can  be
       indicated  with  <STRONG>lm</STRONG>.   A  value of <STRONG>lm</STRONG>#0 indicates that the
       number of lines is not fixed, but that there is still more
       memory than fits on the screen.

       If the terminal is one of those supported by the UNIX vir-
       tual terminal protocol, the terminal number can  be  given
       as <STRONG>vt</STRONG>.

       Media copy strings which control an auxiliary printer con-
       nected to the terminal can be given as <STRONG>mc0</STRONG>: print the con-
       tents  of  the screen, <STRONG>mc4</STRONG>: turn off the printer, and <STRONG>mc5</STRONG>:
       turn on the printer.  When the printer  is  on,  all  text
       sent  to  the terminal will be sent to the printer.  It is
       undefined whether the text is also displayed on the termi-
       nal screen when the printer is on.  A variation <STRONG>mc5p</STRONG> takes
       one parameter, and leaves the printer on for as many char-
       acters  as  the  value  of  the  parameter, then turns the
       printer off.  The parameter should not  exceed  255.   All
       text,  including  <STRONG>mc4</STRONG>,  is  transparently  passed  to  the
       printer while an <STRONG>mc5p</STRONG> is in effect.


   <STRONG>Glitches</STRONG> <STRONG>and</STRONG> <STRONG>Braindamage</STRONG>
       Hazeltine terminals, which do not allow `~' characters  to
       be displayed should indicate <STRONG>hz</STRONG>.

       Terminals which ignore a line-feed immediately after an <STRONG>am</STRONG>
       wrap, such as the Concept and vt100, should indicate <STRONG>xenl</STRONG>.

       If  <STRONG>el</STRONG>  is  required  to  get  rid of standout (instead of
       merely writing normal text on top of it),  <STRONG>xhp</STRONG>  should  be
       given.

       Teleray  terminals,  where  tabs turn all characters moved
       over to blanks, should  indicate  <STRONG>xt</STRONG>  (destructive  tabs).
       Note:    the    variable    indicating    this    is   now
       `dest_tabs_magic_smso'; in older  versions,  it  was  tel-
       eray_glitch.  This glitch is also taken to mean that it is
       not possible to position the cursor on top  of  a  ``magic
       cookie'', that to erase standout mode it is instead neces-
       sary to use delete and insert line.  The ncurses implemen-
       tation ignores this glitch.

       The  Beehive Superbee, which is unable to correctly trans-
       mit the escape or control C characters, has <STRONG>xsb</STRONG>,  indicat-
       ing  that the f1 key is used for escape and f2 for control
       C.  (Only certain Superbees have this  problem,  depending
       on  the  ROM.)  Note that in older terminfo versions, this
       capability  was  called  `beehive_glitch';   it   is   now
       `no_esc_ctl_c'.

       Other  specific  terminal  problems  may  be  corrected by
       adding more capabilities of the form <STRONG>x</STRONG><EM>x</EM>.


   <STRONG>Similar</STRONG> <STRONG>Terminals</STRONG>
       If there are two very similar terminals, one (the variant)
       can  be  defined  as  being just like the other (the base)
       with certain exceptions.  In the definition of  the  vari-
       ant,  the string capability <STRONG>use</STRONG> can be given with the name
       of the base terminal.  The capabilities given  before  <STRONG>use</STRONG>
       override  those  in  the base type named by <STRONG>use</STRONG>.  If there
       are multiple <STRONG>use</STRONG> capabilities, they are merged in  reverse
       order.   That is, the rightmost <STRONG>use</STRONG> reference is processed
       first, then the one to its left, and so forth.   Capabili-
       ties  given explicitly in the entry override those brought
       in by <STRONG>use</STRONG> references.

       A capability can be canceled by placing <STRONG>xx@</STRONG> to the left of
       the  use  reference that imports it, where <EM>xx</EM> is the capa-
       bility.  For example, the entry

                   2621-nl, smkx@, rmkx@, use=2621,

       defines a 2621-nl that does not  have  the  <STRONG>smkx</STRONG>  or  <STRONG>rmkx</STRONG>
       capabilities,  and hence does not turn on the function key
       labels when in visual mode.  This is useful for  different
       modes for a terminal, or for different user preferences.


   <STRONG>Pitfalls</STRONG> <STRONG>of</STRONG> <STRONG>Long</STRONG> <STRONG>Entries</STRONG>
       Long  terminfo  entries  are  unlikely to be a problem; to
       date, no entry has even  approached  terminfo's  4096-byte
       string-table maximum.  Unfortunately, the termcap transla-
       tions are much more strictly limited (to 1023 bytes), thus
       termcap  translations  of  long terminfo entries can cause
       problems.

       The man pages for 4.3BSD and older versions  of  <STRONG>tgetent()</STRONG>
       instruct  the  user to allocate a 1024-byte buffer for the
       termcap entry.  The  entry  gets  null-terminated  by  the
       termcap library, so that makes the maximum safe length for
       a termcap entry 1k-1 (1023) bytes.  Depending on what  the
       application  and  the termcap library being used does, and
       where in the termcap file the terminal type that <STRONG>tgetent()</STRONG>
       is searching for is, several bad things can happen.

       Some  termcap libraries print a warning message or exit if
       they find an entry that's longer than 1023  bytes;  others
       do  not;  others truncate the entries to 1023 bytes.  Some
       application programs allocate more than the recommended 1K
       for the termcap entry; others do not.

       Each termcap entry has two important sizes associated with
       it: before "tc" expansion, and after "tc" expansion.  "tc"
       is  the  capability that tacks on another termcap entry to
       the end of the current one, to add  on  its  capabilities.
       If  a termcap entry does not use the "tc" capability, then
       of course the two lengths are the same.

       The "before tc expansion" length  is  the  most  important
       one,  because it affects more than just users of that par-
       ticular terminal.  This is the length of the entry  as  it
       exists in /etc/termcap, minus the backslash-newline pairs,
       which <STRONG>tgetent()</STRONG> strips out while reading it.  Some termcap
       libraries  strip  off  the final newline, too (GNU termcap
       does not).  Now suppose:

       *    a termcap entry before expansion is  more  than  1023
            bytes long,

       *    and the application has only allocated a 1k buffer,

       *    and  the  termcap library (like the one in BSD/OS 1.1
            and GNU) reads the whole entry into  the  buffer,  no
            matter  what its length, to see if it is the entry it
            wants,

       *    and <STRONG>tgetent()</STRONG> is searching for a terminal  type  that
            either is the long entry, appears in the termcap file
            after the long entry, or does not appear in the  file
            at  all  (so  that  <STRONG>tgetent()</STRONG> has to search the whole
            termcap file).

       Then <STRONG>tgetent()</STRONG> will overwrite memory, perhaps  its  stack,
       and  probably core dump the program.  Programs like telnet
       are particularly vulnerable;  modern  telnets  pass  along
       values  like the terminal type automatically.  The results
       are almost as undesirable with  a  termcap  library,  like
       SunOS  4.1.3  and Ultrix 4.4, that prints warning messages
       when it reads an overly long termcap entry.  If a  termcap
       library  truncates  long  entries,  like  OSF/1 3.0, it is
       immune to dying here but will return  incorrect  data  for
       the terminal.

       The "after tc expansion" length will have a similar effect
       to the above, but only for people who actually set TERM to
       that  terminal type, since <STRONG>tgetent()</STRONG> only does "tc" expan-
       sion once it is found the terminal  type  it  was  looking
       for, not while searching.

       In summary, a termcap entry that is longer than 1023 bytes
       can cause, on various combinations  of  termcap  libraries
       and  applications,  a  core  dump,  warnings, or incorrect
       operation.  If it is too long even before "tc"  expansion,
       it will have this effect even for users of some other ter-
       minal types and users whose TERM variable does not have  a
       termcap entry.

       When in -C (translate to termcap) mode, the <STRONG>ncurses</STRONG> imple-
       mentation of <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG> issues warning messages when the pre-
       tc  length  of  a termcap translation is too long.  The -c
       (check) option also checks resolved (after  tc  expansion)
       lengths.

   <STRONG>Binary</STRONG> <STRONG>Compatibility</STRONG>
       It  is not wise to count on portability of binary terminfo
       entries between commercial UNIX versions.  The problem  is
       that  there  are  at least two versions of terminfo (under
       HP-UX and AIX) which diverged from System V terminfo after
       SVr1,  and have added extension capabilities to the string
       table that (in the binary format) collide  with  System  V
       and XSI Curses extensions.


</PRE>
<H2>EXTENSIONS</H2><PRE>
       Some  SVr4  <STRONG>curses</STRONG>  implementations,  and  all previous to
       SVr4, do not interpret the %A and %O operators in  parame-
       ter strings.

       SVr4/XPG4  do  not  specify whether <STRONG>msgr</STRONG> licenses movement
       while in an alternate-character-set mode (such modes  may,
       among  other  things,  map CR and NL to characters that do
       not trigger local motions).   The  <STRONG>ncurses</STRONG>  implementation
       ignores  <STRONG>msgr</STRONG>  in <STRONG>ALTCHARSET</STRONG> mode.  This raises the possi-
       bility that an XPG4  implementation  making  the  opposite
       interpretation  may need terminfo entries made for <STRONG>ncurses</STRONG>
       to have <STRONG>msgr</STRONG> turned off.

       The <STRONG>ncurses</STRONG> library handles insert-character  and  insert-
       character modes in a slightly non-standard way to get bet-
       ter update efficiency.  See  the  <STRONG>Insert/Delete</STRONG>  <STRONG>Character</STRONG>
       subsection above.

       The   parameter   substitutions  for  <STRONG>set_clock</STRONG>  and  <STRONG>dis-</STRONG>
       <STRONG>play_clock</STRONG> are not documented in SVr4 or  the  XSI  Curses
       standard.  They are deduced from the documentation for the
       AT&amp;T 505 terminal.

       Be careful assigning the <STRONG>kmous</STRONG>  capability.   The  <STRONG>ncurses</STRONG>
       wants  to  interpret it as <STRONG>KEY_MOUSE</STRONG>, for use by terminals
       and emulators like xterm that  can  return  mouse-tracking
       information in the keyboard-input stream.

       Different  commercial ports of terminfo and curses support
       different subsets of the XSI Curses standard and (in  some
       cases) different extension sets.  Here is a summary, accu-
       rate as of October 1995:

       <STRONG>SVR4,</STRONG> <STRONG>Solaris,</STRONG> <STRONG>ncurses</STRONG> -- These support all SVr4 capabili-
       ties.

       <STRONG>SGI</STRONG>  --  Supports  the  SVr4  set,  adds  one undocumented
       extended string capability (<STRONG>set_pglen</STRONG>).

       <STRONG>SVr1,</STRONG> <STRONG>Ultrix</STRONG> -- These support a restricted subset of  ter-
       minfo  capabilities.   The booleans end with <STRONG>xon_xoff</STRONG>; the
       numerics with  <STRONG>width_status_line</STRONG>;  and  the  strings  with
       <STRONG>prtr_non</STRONG>.

       <STRONG>HP/UX</STRONG>  --  Supports  the  SVr1  subset,  plus the SVr[234]
       numerics <STRONG>num_labels</STRONG>, <STRONG>label_height</STRONG>, <STRONG>label_width</STRONG>, plus func-
       tion  keys  11  through  63, plus <STRONG>plab_norm</STRONG>, <STRONG>label_on</STRONG>, and
       <STRONG>label_off</STRONG>, plus some incompatible extensions in the string
       table.

       <STRONG>AIX</STRONG>  --  Supports  the  SVr1 subset, plus function keys 11
       through 63, plus a number  of  incompatible  string  table
       extensions.

       <STRONG>OSF</STRONG>  -- Supports both the SVr4 set and the AIX extensions.


</PRE>
<H2>FILES</H2><PRE>
       /usr/share/terminfo/?/*  files     containing     terminal
                                descriptions


</PRE>
<H2>SEE ALSO</H2><PRE>
       <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>, <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="printf.3.html">printf(3)</A></STRONG>, <STRONG><A HREF="term.5.html">term(5)</A></STRONG>.


</PRE>
<H2>AUTHORS</H2><PRE>
       Zeyd  M.  Ben-Halim,  Eric  S.  Raymond, Thomas E. Dickey.
       Based on pcurses by Pavel Curtis.



                                                            <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
</PRE>
<HR>
<ADDRESS>
Man(1) output converted with
<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
</ADDRESS>
</BODY>
</HTML>
