TECO
Das Jargon-File berichtet mit einigem Pathos über die Frühzeit der sich ausbreitenden "Hackerkultur", über Lochkarten, Fernschreiber, Freaks und die Bereitwilligkeit, sich auch auf die bescheuertsten Programme einzulassen, nicht zuletzt auch, um sich einen Nimbus der Geheimwissenschaft zu verschaffen. Das Paradebeispiel ist TECO (Tape Editor and Corrector), ein Editor (Oh nein, nicht bloß ein Editor!), der zwischen 1979 und 1985 (in einer Zeit, als die Zivilisation eigentlich schon einen recht hohen Stand erreicht hatte) von DEC für die VAX-11, PDP-8, PDP-10 und PDP-11 entwickelt wurde und dessen Makrosprache einfach nur bescheuert ist. Nie wieder wurde etwas so kryptisches und kontraintuitives von Menschenhand geschaffen (außer ABPS, natürlich) und gleichzeitig so gefeiert.
Immerhin gibt das TECO-Manual von 1985 zu: TECO's syntax is terse; commands are designed to minimize keystrokes. Also, the versatility of TECO "in all its glory" makes it complex. However, just a few commands suffice to get real work done, and a novice TECO user can begin creating and editing text files after only a few hours of instruction. More powerful features can be learned one at a time, and at leisure.
Den Satz "and a novice TECO user can begin creating and editing text files after only a few hours of instruction" finde ich bemerkenswert: Warum über den vi stöhnen, wo es doch offensichtlich so viel schlimmeres gibt. (TECO war allerdings für die Entwicklung des vi nicht ganz unbedeutend...) Das überragend neue an TECO war, daß er kein zeilenorientierter Editor ist, sondern seitenorientiert, d.h. es wird immer eine Seite (was immer das genau ist, hängt von vielen Dingen ab) in den Puffer geladen und kann über einzugebende Kommandos bearbeitet werden. So positioniert L den Pointer (die Position im Text, die natürlich nicht automatisch angezeigt wird) auf den Anfang der nächsten Zeile, nL bewegt den Pointer n Zeilen nach unten (und an den Anfang der betreffenden Zeile). Negative Werte für n springen nach oben, bei n=0 wird der Cursor auf den Anfang der aktuellen Zeile gesetzt. T zeigt den Puffer bis zur aktuellen Position an. Um nun den Text bescheuert einzufügen, genügt bereits das Kommando Ibescheuert' (ein Schelm, wer dabei an vi denkt!). Das ist ja nun fürchterlich einfach, ließe sich denken. Doch jetzt geht's los: TECO arbeitet mit den Datenstrukturen String und Integer, die sich in Puffern und Registern speichern und manipulieren lassen. TECO-Kommandos liefern natürlich auch Werte und bestehen immer aus möglichst wenig Zeichen (damit man sie auch tippen kann!). Makros mit (nahezu) beliebiger Komplexität können geschrieben werden (und wurden es tatsächlich auch, der erste Emacs bestand komplett aus TECO Makros), hier ein paar Beispiele:
- (0A-32)I$D$$
- Wandelt einen Kleinbuchstaben in einen Grossbuchstaben um ($ steht für Escape), D löscht einen Buchstaben, I fügt einen ein, und zwar in diesem Fall das Zeichen, dessen ASCII-Wert um 32 kleiner als der des Originalzeichens ist.
- 0A"A0A"V(0A-32)I$D|C''$$
- Dieses Makro wandelt einen unter dem Pointer stehenden Buchstaben wenn möglich in einen Kleinbuchstaben um und bewegt den Pointer eine Position weiter, wenn das Zeichen ein Buchstabe war. Dieses Makro benutzt schon Tests ("V, "A) und einen else-Zweig (|C').
- <0A"A0A"V(0A-32)I$D|C'|0;'>$$
- Und hier das fertige Makro in seiner ganzen Pracht: Das ganze wird nun wiederholt (Schleife: <..>, 0; verläßt die Schleife. Dabei gibt es wirklich keinen Grund für 0; als Schleifenabbruch, man muß es sich einfach merken (und nicht nur das)), bis das aktuelle Wort zuende ist. Dieses Makro wandelt also alle Buchstaben eines Wort in Großbuchstaben um.
- Folgendes Makro wandelt alle Tabs in Leerzeichen um
- ^A^UFEB^[H:XF27:^UF^[HKMFY<:N ^["U1;
'.UB0L.UAQB-QAUC9-QCUD
S ^[-DQD<I ^[>>EX^[^[ - Und ein letztes, das das aktuelle Datum und Uhrzeit einfügt
- !DATE.TES!EI^[[M[D[Y[W[H[M[S[0[1^
BU0(Q0/32)&15UM(Q0)&31UD(Q0/512)UYQDUW
QM-2"=31W'QM-4"=90%W'QM-5
"=120W'QM-7"=181%W'
QM-8"=212W'QM-10"=273%W'
QM-11"=304W'QY&3"=
QW-59">1%W''QY+QW+(QY-1/4)U1Q1-(Q1/7*7)
U1Q1"=^UWSUN^['Q1-1"=^UWMON^['
Q1-2"=^UWTUE^['Q1-3"=^UWWED^['Q1-4"=^UWTHU
^['Q1-5"=^UWFRI^['Q1-6"=^UWSAT^['^H*2U0
Q0/3600UHQH*3600U1(Q0-Q1)/60UN(Q0-Q1)-
(QN*60)US:GW32^TQM-10"<48^T'QM:=
47^TQD-10"<48^T'QD:=47^T1900+QY:=32
^TQH-10"<48^T'QH:=58^TQN-10"<48^T'QN:=58^T
QS-10"<48^T'QS=]1]0]S]M]H]W]Y]D]M^[^[^M
Und, schön gegruselt?
Hier noch, der Vollständigkeit halber, der TECO-Eintrag aus dem Jargon-File:
- TECO
- /tee'koh/ /n.,v. obs./
1. [originally an acronym for `[paper] Tape Editor and COrrector'; later, `Text Editor and COrrector'] /n./ 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. Noted for its powerful programming-language-like features and its unspeakably hairy syntax. It is literally the case that every string of characters is a valid TECO program (though probably not a useful one); one common game used to be mentally working out what the TECO commands corresponding to human names did. 2. /vt./ Originally, to edit using the TECO editor in one of its infinite variations (see below). 3. vt.,obs. To edit even when TECO is *not* the editor being used! This usage is rare and now primarily historical. ... In mid-1991, TECO is pretty much one with the dust of history, having been replaced in the affections of hackerdom by {EMACS}. Descendants of an early (and somewhat lobotomized) version adopted by DEC can still be found lurking on VMS and a couple of crufty PDP-11 operating systems, however, and ports of the more advanced MIT versions remain the focus of some antiquarian interest. See also {retrocomputing}, {write-only language}.