114 Terminal Insanity
For many years programs kludged around the lack of a graphical API,
hard-wiring into themselves the escape sequences for the most popular
terminals. Eventually, with the advent of vi, Bill Joy provided his own API
based on a terminal descriptor file called termcap. This API had two
fundamental flaws:
- The format of the termcap file—the cursor movement commands
included, those left out, and the techniques for representing
complex escape sequences—was, and remains to this day, tailored
to the idiosyncracies of vi. It doesn’t attempt to describe the
different capabilities of terminals in general. Instead, only those
portions that are relevant for vi are considered. Time has somewhat
ameliorated this problem, but not enough to overcome initial design
flaws. - The API engine, developed for vi, could not be used by other
programmers in their own code.
Thus, other programs could read the escape sequences stored in a termcap
file but had to make their own sense of which sequences to send when to
the terminal.^1
As a result, Ken Arnold took it upon himself to write a library called curses
to provide a general API for VDTs. This time, three problems arose. First,
Ken inherited the vi brain damage when he decided to use the termcap file.
Starting over, learning from the mistakes of history, would have been the
right choice. Second, curses is not a very professional piece of code. Like
most Unix tools, it believes in simplicity over robustness. Third, it’s just a
library with no standing, just like /etc/termcap itself has no standing.
Therefore, it’s not a portable solution. As a result of these problems, only
part of the Unix community uses curses. And you can always tell a curses
program from the rest: curses programs are the ones that have slow screen
update and extraneous cursor movement, and eschew character attributes
that could make the screen easier to understand. They use characters like
“|” and “-” and “+” to draw lines, even on terminals that sport line-drawing
character sets. In 1994, there is still no standard API for character-based
VDTs.
(^1) And if that wasn’t bad enough, AT&T developed its own, incompatible terminal
capability representation system called terminfo.