Download from
http://www.nyangau.org/terminfo/terminfo.zip.
Full screen text programs under UNIX usually use a code module called 'curses' get keyboard input and to do screen output.
When you run such a program, curses determines what sort of 'terminal'
you are running one by looking at the TERM environment variable.
Very often this will be vt100, or if you are using a shell in
an X Windows window, it will be xterm.
If TERM isn't set, the program should fail to run.
Curses then locates the 'terminal information database' by looking for it in
the directory specified by the TERMINFO environment variable.
If this variable isn't set, it looks in a fixed place, which is often
/usr/share/terminfo or /usr/lib/terminfo.
In this database there should be an entry for the type of terminal being used. If not, the program should fail to run.
The terminfo entry describes what escape sequences need to be output to the
terminal in order to get it to move the cursor, change colour, erase areas
etc..
If the terminfo entry is wrong, then the screen is likely to be corrupted as
the program runs.
If the TERM variable is wrong, the wrong terminfo entry will be
used and the effect can be the same.
Things to check if your curses program fails to run :-
TERM environment variable is set correctly.
TERMINFO environment variable points to a terminfo
database, or if it isn't set, there is a terminfo database installed
in the default location.
This default location is typically /usr/share/terminfo
or /usr/lib/terminfo.
The program itself includes this default location within it.
This default location has recently moved, so some programs will assume
one place, and more recent programs will assume the newer place.
So if (particularly on Linux) you get a 'can't open terminal' message,
try creating a symbolic link from one path to the other.
infocmp command displays a terminfo entry,
then there is an entry.
The terminfo database supplied on many UNIXes is rather limited.
For example, despite the fact that virtually every VT100 compliant
terminal you can lay your hands on supports color, virtually no
vt100 terminfo database entry supports this.
This is true of AIX, HP-UX and SunOS.
Even if you argue that VT100 doesn't support color, there really ought to be
a vt100-color database entry which adds the necessary extras.
There is a precedent for this sort of thing.
X terminals don't support color, and so the xterm terminfo
database entry doesn't support color.
However, there is are color_xterm, nxterm and
similar programs which do.
Accordingly, forward thinking UNIXes (ie: Linux) include an xterm
with color, and/or an xterm-color terminfo database entry.
The basic problem is that most UNIX vendors have no enthusiasm for making full screen text mode applications work well. Perhaps the view is that X Windows replaces all of that.
In fact the trend is that things will get worse.
IBM replaced their excellent 'hft' High Function Terminal, with a stripped
down functionality 'lft' Low Function Terminal.
Under AIXwindows you get an excellent aixterm terminal, with
full color and extensive keyboard support.
Unfortunately, IBM is moving towards the new CDE environment.
The new dtterm program supplied with CDE has no color and naff
keyboard support.
I wonder if Gnome/KDE will provide better tools.
The trick is to use the infocmp program to extract the
terminfo database entry for a given terminal type, and then to enhance it.
You can then use tic to compile up an enhanced terminfo database
entry.
This I did on my Linux system. After some annotation, it looks like :-
vt100|vt100-am|Digital VT100,
# Size
cols#80, lines#24,
# Automatic margins
am,
# Safe to move in standout modes
msgr,
# Ignores new-line after 80 columns
xenl,
# Padding won't work, need XON/XOFF
xon,
# Virtual terminal number
vt#3,
# Alternate character set mapping of glyph to characters
acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
# Clear screen and home cursor
clear=\E[H\E[J$<50>,
# Change scroll region
csr=\E[%i%p1%d;%p2%dr,
# Cursor motion
cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
cuf=\E[%p1%dC, cuf1=\E[C$<2>,
cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
home=\E[H, ht=^I,
# Set tabstops, tabstops initially every 8 chars, clear all tabstops
hts=\EH,
it#8,
tbc=\E[3g,
# Keycodes
bel=^G,
cr=^M,
ka1=\EOq, ka3=\EOs, kb2=\EOr,
kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw,
# Set reverse video
rev=\E[7m$<2>,
blink=\E[5m$<2>,
bold=\E[1m$<2>,
# Reset terminal to known modes
rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
# Scroll text up
ind=^J,
# Reverse scroll
ri=\EM$<5>,
# Set graphics rendition (combinations of bright, uline etc.)
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
sgr0=\E[m\017$<2>,
# Set/reset standout
smso=\E[7m$<2>, rmso=\E[m$<2>,
# Set/reset underline
smul=\E[4m$<2>, rmul=\E[m$<2>,
# Enable/set/reset alternate char set
enacs=\E(B\E)0, smacs=^N, rmacs=^O,
# Set/reset automatic margin mode
smam=\E[?7h, rmam=\E[?7l,
# Start/end keypad transmit mode
smkx=\E[?1h\E=, rmkx=\E[?1l\E>,
# Save/restore cursor position
sc=\E7, rc=\E8,
If you place this in a file, and add the following extra stuff, you have a way of making the terminfo entry for an enhanced colour VT100 terminal :-
vt100-color|vt100-colour|VT100 with ANSI colour support,
# 8 colours, 8x8 foreground/background pairs
colors#8, pairs#64,
# ANSI set-background and set-foreground
setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
# Set-background and set-foreground
setb=\E[%p1%{40}%+%dm, setf=\E[%p1%{30}%+%dm,
# Original pair (ie: default colour is white on black)
op=\E[m,
# Background erase
bce,
# Use of colour is incompatible with use of standout and underline
ncv#3,
# Everything else as from vt100 definition
use=vt100,
The op entry is necessary.
Colour pair 0, ie: the 'original pair', is defined to mean white on black,
and the terminal is assumed to be white on black before the curses program
starts.
When the program finishes, op is written to turn the terminal
back to its initial white on black state.
Also, when the curses program wants to set white on black, it will output
the op sequence, rather than the set-foreground and
set-background sequences.
If the op entry is missing, some curses implementations assume
the terminal cannot support colour, even if the set-foreground and
set-background sequences are defined.
The bce entry says that areas of the screen which are cleared
are cleared to the current background colour.
This is pretty much the norm for PC displays and most VT100 emulators, but
may not have been the case for the original VT100.
The enhanced terminfo entry can be compiled using tic
(or tic_colr on HP-UX).
However, mere users aren't usually allowed to modify or add to the
default system terminfo database.
So to avoid this problem, you can create a directory of your own, to hold
your own personal database.
Set TERMINFO to point there, and then run tic.
Compiled terminfo database entries appear to be compatible between Linux, HP-UX and SunOS, but of course, just to be awkward, AIX Extended Curses is different.
TH under AIX is implemented using Curses, but unfortunately AIX has two kinds :-
#include <curXX.h> headers and link with
-lcur -lcurses when using AIX Extended Curses.
#include <curses.h> and link with
-lcurses when using standard Curses.
The AIX aixterm terminfo definition, as shipped with AIX 4.3
and AIX 5.0 is broken.
It omits the bce entry, and incorrectly encodes the
op original pair as green on black rather than the
white on black it should be.
The old AIX Extended Curses implementation doesn't seem to mind these errors,
but the newer AIX Curses implementation ends up drawing swathes of background
in the wrong colour, and anything which should be white on black comes out
green on black.
Accordingly, this TERMINFO package will need to override the
standard aixterm entry, but doesn't yet.
You can enhance your terminal support by going through the steps explained above, or you can use my package.
Andys Terminfo Package consists of some files (including this HTML page)
which you can put in a directory below your home directory, called
~/terminfo.
You then arrange that whenever you fire up a C shell (csh
or tcsh), or one is fired within a window you start, that
the terminal definitions provided by the system get enhanced.
Add the following to ~/.cshrc or ~/.tcshrc :-
# Try to enhance terminal source ~/terminfo/setup.csh
setup.csh is a little script which looks at the current
system type and current terminal type.
If it reckons it has a better terminal definition it can use, it modifies
the TERMINFO and TERM environment variables.
Or if you use a Bourne style shell (bsh, sh, ksh, pdsh, bash, ash, zsh etc.),
then you would add the following to your ~/.kshrc,
~/.bashrc, ~/.zshrc.
Unfortunately this doesn't cover some of the shells, such as
sh, which doesn't read a configuration file when the shell is
started, only a log in time.
So in this case we must fall back to modifying the per-login
~/.profile instead.
# Try to enhance terminal . ~/terminfo/setup.sh
The advantage of getting the setup script run at every shell start is that the terminal is fixed up even if you run a nested shell within an xterm, dtterm or whatever.