TECO (pronounced /tee'koh/; originally an acronym for '[paper] Tape Editor and COrrector', but later 'Text Editor and COrrector') was a text editor developed at MIT and modified by just about everybody. With all the dialects included, TECO may have been the most prolific editor in use before Emacs, to which it was directly ancestral.
TECO, noted for its unspeakably hairy syntax, can be considered a general-purpose, interpreted programming language targeted for text manipulation. Almost every character is a command—a 1- or 2-character sequence replaces the usual keywords of more verbose languages—thus any character string is a TECO program, although not necessarily a useful one. One common game used to be mentally working out what the TECO commands corresponding to human names did.
Richard Stallman's original Emacs was implemented in TECO. Later versions of Emacs, first Multics Emacs and then GNU Emacs, however, were implemented in LISP.
TECO was originally developed at MIT for use on two PDP-1 computers, belonging to different departments, both housed in Building 26. On these machines, the normal development process involved the use of a Friden Flexowriter to prepare source code offline on a continuous strip of punched paper tape. Programmers of the big IBM computers customarily punched their source code on cards, using keypunches which printed human-readable dot-matrix characters along the top of every card at the same time as they punched each machine-readable character. Thus IBM programmers could read, insert, delete, and move lines of code by physically manipulating the cards in the deck. Punched paper tape offered no such amenities, and necessity was the mother of online editing.
The first such editor for the PDP-1 was (officially!) named "Expensive Typewriter." It was the most rudimentary imaginable line-oriented editor, lacking even search-and-replace capabilities. Its name reflected distaste for the expense and apparent inefficiency of a programmer's monopolizing an expensive computer for the purpose of editing text.
The original stated purpose of TECO was to make more efficient use of the PDP-1. As envisioned in the manual, rather than performing editing "expensively" by sitting at a console, one would simply examine the faulty text and prepare a "correction tape" describing the editing operations to be performed on the text. One would efficiently feed the source tape and the correction tape into the PDP-1 via its high-speed (200 characters per second) reader. Running TECO, it immediately would punch an edited tape with its high-speed (60 characters per second) punch. One could then immediately proceed to load and run the assembler, with no time wasted in online editing.
TECO's then-sophisticated searching operations were motivated by the fact that the offline Flexowriter printouts were not line-numbered; therefore editing locations needed to be specified by context rather than by line number. The various looping and conditional constructs (which made TECO Turing-complete) were included in order to provide sufficient descriptive power for the correction tape. The terse syntax minimized the amount of keystrokes needed to prepare the correction tape.
It was all nonsense, of course, because the correction tape was, in fact a program, and required debugging just like any other program. The pitfalls of even the simplest global search-and-replace soon became evident. In practice, TECO editing was performed online just as it had been with Expensive Typewriter.
TECO was available for several operating systems, including ITS on the PDP-6 and PDP-10, and TOPS-10 and TOPS-20 on the PDP-10. A descendant of the version DEC distributed for the PDP-10 is still available on the Internet, along with several partial implementations for the MS-DOS/Windows environment. A version of TECO was provided with all DEC operating systems; Compaq still provides TECO with VMS.
This is a simple interchange sort of the current text buffer, based on 1st character of each line, taken from the PDP-11 TECO User's Guide. A "goto" and "structured" version are shown. Note that TECO ignores case and whitespace (except tab, which is an insertion command).
Example 1
!CONT! l 0aub ! load first char of next line in register B !
qa-qb"g xa k -l ga 1uz ' ! if A>B, switch lines and set flag in register Z !
qbua ! load B into A !
l z-."g -l @o/CONT/ ' ! loop back if another line in buffer !
qz"g 0uz @o/START/ ' ! repeat if a switch was made on last pass !
qa-qb"g xa k -l ga -1uz ' ! if A>B, switch lines and set flag !
qbua ! load B into A !
l .-z;> ! loop back if another line in buffer !
qz;> ! repeat if a switch was made last pass !
Example TECO code
Example TECO program
!START! j 0aua ! jump to beginning, load 1st char in register A !
Example 2 0uz ! clear repeat flag !
This article is based on an entry in the Jargon File, which is in the public domain.