# IEEE Annals of the History of Computing, Anecdotes # The Beginnings of TECO > By: Dan Murphy > Editor: Dave Walden I came up with the name TECO in 1962 while sitting in Ye Hong Guey, my favorite restaurant in Boston's Chinatown during my undergraduate years at the Massachusetts Institute of Technology. I had been working on a little program to help me write other programs, a common activity in the day when a computer (the Digital Equipment Corporation PDP-1) would be delivered with almost no software. My program had gotten to the point that it needed a name, so my friend Pete Peterson and I were kicking around possibilities and their acronyms. Years later, TECO would be known to mean Text Editor and Corrector and so described in its documentation. However, the original meaning—the one we came up with that night at the corner of Oxford and Beach streets—was Tape Editor and Corrector. ## Interactive computer use on the PDP-1 We used the term "tape" because punched paper tape was the only medium for the storage of program source on our PDP-1. There was no hard disk, floppy disk, magnetic tape (magtape), or network. There was no operating system, only the paper tape reader and punch and a console typewriter. The paper tape reader was fast (or so it seemed at the time), reading 300 characters per second. The punch was considerably slower at 20 characters per second. The console device was an office-style electric typewriter that had been interfaced to the PDP-1 for character-at-a-time input and output. The PDP-1 was the first computer built and sold by DEC and thus the leading edge of the minicomputer revolution. It was anything but "mini" by today's standards, however; it occupied several tall cabinets in its minimum configuration. All that, and it had a main memory of only 4,096 18-bit words (effectively 8Kbytes). This was core memory made of tiny magnetic toroids strung on thin wires in a 3D mesh. It had a cycle time of 5 microseconds. The processor executed most instructions in two cycles (10 microseconds)—one cycle to fetch the instruction from memory, and the second to load and/or store the memory operand. Some instructions did not reference memory and so required only one cycle. All this notwithstanding, it was exciting to actually be able to sit at the console and use the computer interactively. My prior experience was with mainframe class machines like the IBM 709 or 7090. Those required preparing a program on punched cards, submitting the deck to the computer center for a batch run, and getting a paper listing of the results the next day. With the PDP-1, the code-compile-debug cycle was shortened from hours to minutes. I could do it several times on the machine in a one-hour session. In a smart move for a young corporation, DEC had donated a PDP-1 to the Research Laboratory for Electronics (RLE) at MIT, and it was sitting in a room more-or-less available for anyone, including undergraduates, to play with. There were soon many takers. Because only one person could be using the PDP-1 at a time, computer time quickly became scarce, and it was still necessary to do as much program preparation as possible offline. We did this with Frieden Flexowriters, typewriter-like devices with a paper tape reader and punch. Programs had to be handwritten first because editing capabilities on the Flexowriter were nonexistent. The most you could do was nullify a previously punched character by backing up the tape punch and over punching the same line. Paper tape was more convenient than punched cards in some ways. It was lighter than cards for a given number of lines of program, and if you accidentally dropped it, it did not shuffle all your lines of code. This was also its biggest weakness. When you needed to modify a program—add, change, or delete a few lines—you could not just replace those lines as you did with the cards; you had to punch a whole new tape. Hence, editing on the Flexowriter was a painstaking process of reading an existing source tape and simultaneously punching a new one, while stopping at each point where changes were to be made to type new material and skip over unwanted old material. It was also possible to edit on the computer, which is what we did while debugging and recompiling during our slots of computer time. The editor on the PDP-1 had a simple line-oriented interface that let users step through an existing paper tape, adding or replacing lines to produce a new generation of the source. Using this editor consumed precious computer time, however, and it used the whole computer to do a "simple" task, so it was known as Expensive Typewriter. That Expensive Typewriter could only add, delete, or replace entire lines of text annoyed me considerably. It was a bothersome fact of punched cards that making any change on a line required retyping that whole line on a new card, and I didn't see why that limitation needed to exist for this new medium where there was no physical separation between one line and the next other than the carriage-return character. ## The birth of TECO Thus, I decided to write a program that, like Expensive Typewriter, would let me copy a paper tape while making changes along the way and would let me make those changes character by character. Accordingly, the first few commands would include these types of functions: * delete a character, * delete a line (it was still convenient to work on lines sometimes), * insert text (any amount from one character to multiple lines), and * search for text at the point where you wanted to make changes. TECO was not initially intended to be an interactive, online editor. Because of the scarcity of computer time, online editing was still considered somewhat squanderous, and we really did not want to wait until our next time slot to get the next source revision ready. Therefore, TECO was intended to be used offline, on the Flexowriter, where we would prepare a separate paper tape with the commands needed to edit our existing source tape. As people often say, "it seemed like a good idea at the time." In other words, the idea was to hand-mark changes on your source listing and enter the TECO commands necessary to make those changes on the Flexowriter (i.e. find a spot, delete, insert, move on). Then, when our computer time came, we would load TECO and read in our commands tape, so TECO could read our old source tape and quickly punch a new one. Hence, in the beginning, TECO was a language for describing changes to a source program or, more generally, a stream of text. This turned out to be its real power as time passed and its evolution continued. ## TECO becomes interactive In the short term, however, offline command preparation proved to be impractical. It was impossible for most ordinary mortals, myself included, to consistently prepare command tapes that would work right. Like any other program, they would have bugs that would only become evident while on the computer. Thus, I added a mode toTECO early on that would dispense with reading the command tape first and simply let us enter commands at the console typewriter. Needless to say, this was an entirely different experience. We could enter one or a few commands, make sure the result was right, and then move on. Although quite interactive, TECO was not a screen editor at this point. Although our PDP-1 did have a CRT display device, neither the paradigm nor the code existed for displaying text. Hence, source was kept on paper printouts, and editing online meant looking at a few lines at a time typed out on paper. With interactive editing, a number of other enhancements were soon required. It quickly became clear that moving through a source tape in only one direction was still awkward. An especially easy, but painful mistake would be to mistype a search command so that the text you wanted would not be found and the copying would continue to the end of the tape. To solve this problem, I decided it would make sense to read a chunk of the source into memory where a number of edits could be made before committing it to the new paper tape. The natural unit for this was one typewritten page. Most sources were paginated to this size because we were using letter-size fanfold paper stock in the Flexowriters and console typewriter. This was a big help. The usual search was limited to the current page, so a failed search was no problem. Just go back to the top of the page and try again. Plus, we could make some changes, see how they looked, and if still not right, do some further edits. Page-at-a-time editing required new commands for keeping track of the location that editing would take place (the point), for moving to the next page or to the end of the tape, and for searching that was not limited to the current page. This search still carried the risk of going too far, but since it was used less often and only to get you to the right page, that risk was much lower. You might ask, why only one page at a time? Why not read in the whole source tape? As I noted earlier, our PDP-1 had a total memory component of about 8 Kbytes, and that had to hold the entire TECO program as well as whatever text was being edited. It was not until many years later that memories became large enough that yanking in the whole file became practical and routine. One enhancement in that direction became possible when the RLE PDP-1 had a swapping drum added to it. Although this device was not large enough to serve as permanent storage for programs or sources, it was fast and could be used to work around the limited main memory size. For TECO, I implemented a kind of paging mechanism that allowed the main editing buffer to be many times larger than could fit in memory. I would draw on some of these paging ideas a few years later in the implementation of other multiuser systems culminating in TENEX and TOPS-20.[1][2] Punched paper tape remained in common use through at least the late 1960s on a number of systems, but TECO supported other media almost as soon as it became available on any machine we used. One of the other PDP-1s at MIT had a magnetic tape drive, and I quickly added a magtape driver to TECO. Again, there was no operating system, or even common I/O libraries at that time, so each program had separate commands and I/O routines added for each device. Magtape was never practical for program storage, of course, even though it was wonderfully fast compared to paper tape. Much better was DECtape (or MicroTape), the block-addressable small-reel tape system eventually added to the PDP-1 and available on all DEC systems for many years. DECtape had a basic file system that supported a modest number of named files on each reel and the ability to rewrite files any number of times. This required TECO to grow the ability to open a file by name, not just yank a stream from a serial input device. Even when timesharing and disk-based file systems came into common use, TECO editing continued to be a page at a time for the most part. Conservative memory use was still important, and for all its power, TECO was economical to run. ## The TECO language I did not give much thought to the TECO's "human interface" design at the beginning. The concept really didn't exist around program tools at that point. The most commonly used interactive program was the DDT debugger[3] and it had a set of single-letter commands with numeric arguments preceding. For example, to examine location 123 in your program, you would type 123/. DDT would act immediately on the slash and print the contents, so the line would then appear as 123/ lac foo. TECO followed that form with commands such as * 5d, meaning delete five characters; * 3c , meaning move forward three characters; * 10l, meaning move forward 10 lines; * 2k, meaning kill (delete) two lines; and * iTEXT, meaning insert "TEXT," or everything from the initial i to the special text termination character. As I noted earlier, I based the initial design of the TECO commands on entering them offline, but they continued to work well when interactive use became the rule. (See the sidebar for an interesting side note on character-based command dispatching.) From that relatively simple start, I went on to add further enhancements. Some of them were around making the language more consistent and general. For example, we did not need a separate command to move the pointer in reverse (the original r command); a negative argument to the character-moveforward command was quite natural. The same applied to commands that operated on lines, -3l meant move backward three lines, and -5k meant kill the preceding five lines. 0 (zero) meant the current line, so 0l meant to move to the beginning of the current line. A number of simple constructs quickly became a habit for any TECO user, such as using 0kk to kill all the current line regardless of where the pointer is on it. (TECO uses the convention that the default argument is 1 for most commands.) ## TECO becomes a programming language By late 1962, TECO had about the level of capabilities that simple editors would have for years to come, but TECO's development didn't stop there. Many of the subsequent enhancements were done simply because something occurred to me that I could easily do or someone suggested something, and it seemed like a cool idea. Our mindset was that cool ideas were fun to pursue, even if we couldn't think of a practical use or need right away. More significant additions—the ones that began to give TECO some power as a programming language or text engine—included text buffers and the looping construct. TECO handled simple program modification fairly well at that point, but it did not offer a way to do significant restructuring (e.g., move a sizeable amount of text from one place to another or replicate a segment of text a number of times). To provide this, I added the concept of text variables—that is, a variable that would hold an arbitrary section of text. The command to move a range of text into a text variable was x. (I was running low on unused letters by then.) Its prefix argument(s) identified a range of text in the buffer in the same way as the k command, and the single letter following the x was the variable name from the set a–z, 0–9. g (get) was used to copy the contents of a text variable into the main buffer at the editing point and could be used any number of times to replicate copes of the text. Despite the lack of a mnemonic association for x, it quickly came to seem natural, almost intuitive. To x something became as easily spoken and understood by TECO users as "store" would have been. Then, given that we had the ability to store any text in a variable, I implemented a command to execute a text variable as a TECO command string. An optional argument could be given in the form of a preceding expression. Thus, TECO came to have a form of macro or callable function, and it followed from the original concept that a concise string of text would represent commands to modify other text. Around that same time, I also found that I wanted to be able to make repetitive and systematic changes to the source text. This included simple cases like changing all occurrences of "foo" to "fie" (which would later be supported by the replace command) and things beyond simple search and replace, such as "find every line with 'foo' in it and add a comment at the end." This gave rise to the original loop construct: ( commands boolean ; commands ). The loop would be executed zero or more times until the test was false. A search variant was available that returned true only if the text was found, so search and modify loops were straightforward. The loop-begin and loop-end commands appeared as parentheses with a dot in the middle on the PDP-1. Subsequent ASCII-based versions of TECO used angle brackets for this purpose. Integer variables were also added around this time, again from the single-letter set a–z, 0–9. u (use) would store its argument into the variable, and q (quantity) would stand as the stored value in an expression. The same variable name could have both a text and numeric value; the command determined which was being referenced. Because simple arithmetic expression were accepted, a loop to run, say, five times could be written as > 5ua ( qa; commands qa-1ua ) Spaces and line breaks were not syntactically significant. As this simple quasi-example shows, TECO was nothing if not terse. Fairly complex loops and other command sequences could be written in TECO, and mostly looked like line noise. TECO was one of the first languages to spawn the practice of handing someone a one-line string of near gibberish and asking with a grin, "tell me what it does." Nonetheless, TECO made it onto Jean Sammet's list of known programming languages sometime in the late 1960s.[4] There have been innumerable comments over the years about how obscure the TECO language is. Few would dispute the premise that it is easier to write than to read. As an editor however, its brevity was one of its advantages. Regular users quickly learned the more frequent command sequences and did not even need to think about them. Especially after WYSIWYG editors became common, the claim that ordinary users could only handle verbose, line-oriented editors disappeared. This was hotly debated within DEC for some years, pitting developers against the business and marketing folks. Today, if we considers all the obscure keystroke sequences available in the most commonly used software, with modifiers Control, Alt, Shift, and others, TECO seems almost simple. ## TECO moves to new machines Within a few months, TECO was being used in several PDP-1s around MIT. Besides the first one in RLE, there was one being used for analysis of bubble chamber photographs by Professor Martin Deutsch. In my last undergraduate year or so, Deutsch hired me to do further work on TECO and some other programming tools that I had developed. A PDP-1 had also been installed in the new Tech Square building where Marvin Minsky had his AI lab. This was also where the first DEC PDP-6 at MIT would be installed in 1965, and it become the first machine to which TECO would be ported. I did not do that port myself; it was done by Stewart Nelson, Richard Greenblatt, and Jack Holloway, who had been using the AI PDP-1 and were among the first to get their hands on the new PDP-6. Some enhancements had already been made to the PDP-1 version by the AI group, and it was used heavily there. Hence, porting it to the new PDP-6 was an urgent project. I had earlier been offered a parttime job by DEC to do that port for their new, still-in-development machine, but I was trying to finish my senior year without flunking out, so wisely I declined. PDP-1 TECO was written in assembly language, and simply recompiling the source, even with a few edits, was impossible. However, the PDP-6 had a far more powerful and general instruction set, so much of TECO could be simply (if only manually) translated instruction by instruction while still remaining in assembly language. One big difference was the change of character set. The PDP-1 used an encoding called FIO-DEC (the Frieden paper tape code as adopted by DEC). The PDP-6 used a Teletype Model 35 or 33, which supported ASCII (upper-case only). Another enhancement begun in the AI PDP1 TECO and made fundamental on the PDP-6 was to use the display to show the text around the editing point. This was not yet on-screen editing in the current sense; commands were still entered and echoed on the console teletype, but the feedback to the user was much enhanced. It wasn't until some years later that CRT-based terminals became common. Until then, most users could only use TECO in the traditional way on a hard-copy device. Many other enhancements were made in the next few years, fostered by the PDP-6's much larger memory, greater power, and programming ease. The command set for that version can still be found with a Web search today and, as far as I know, was by far the most complex version of TECO ever in common use. Although there were numerous other ports for other machines in the following years, most of them were much more basic and similar to the PDP-1 version. Even the version of TECO included by DEC in its initial release of the PDP-10 (DecSystem-10) was more basic. Bob Clements (at DEC at the time) had taken a relatively early version of the PDP-6 AI TECO, stripped it down to remove things that were not available on most installations (e.g., the expensive CRT display) or to timesharing terminal users, and that became the version shipped by DEC on the PDP-10 and later PDP-6 installations. It was also the version that came into my hands when Bolt Beranek & Newman (BBN) got a PDP-10 (1969), which I would evolve from then through about 1986. ## The Spirit of Open Source From the time of TECO's original development through the PDP-6 port, we were all happy to have DEC or anyone else take the programs we had written to use or even sell. For an undergraduate like myself, having people use and like them was the reward. Besides, nobody had any idea how or whether software could be copyrighted or otherwise protected. This was the open-source model in action long before that term came into use. Starting with the PDP-6, TECO was included in the base software set of every system that DEC offered, including the PDP-8, PDP-11, DecSystems 10 and 20, and VAX/ VMS. It also continued to be heavily used and enhanced by the hackers[5] in Minsky's AI lab, eventually including Richard Stallman. In the early to mid-1970s, Stallman would make some key enhancements to TECO that allowed it to become a fully interactive, WYSIWYG-style onscreen editor. A key piece of this implementation was an enhancement where an individual keystroke could be made to immediately invoke a macro (i.e., a function to be executed). This included the normal graphic keys, so typing an a in normal text entry mode invoked a function to insert a into the buffer and, of course, update the onscreen display. This resulted in many users creating keystroketriggered editing operations, and before long, an effort was made to collect the most useful of them into a set that could be documented and used by others. This became the original Editor Macros (Emacs). TECO would continue to be the text engine for EMACS for several years, but it was ultimately replaced by a Lisp-like text manipulation language known as Emacs-Lisp. Several versions of TECO for soft-copy terminals would also be done, including one by me called VTECO for TENEX and TOPS-20. A number of dialects of the TECO command language also grew up, as various branches of development and evolution continued in different places. The DEC Users Group (DECUS) had a TECO Special Interest Group (TECO-SIG). Although DEC products continued to be where TECO was most consistently available and used, it was ported to many other products as well. The lineage of many of these versions is now difficult or impossible to determine. ## Reflections Clearly, TECO has had numerous users over the years. A relative few wrote or attempted to write actual programs in TECO. One of my early exercises was to write an arithmetic expression compiler in TECO. This would take an expression like x = a + (b - c) *3 / d and translate it to a sequence of PDP-1 assembler instruction to perform the computation. I never attempted to make it a practical compiler though; it was mainly a way to test the completeness of the TECO command set and a cool hack. Other known TECO programs included an early email interface—a set of TECO macros from Larry Roberts at ARPA that let you selectively read messages from your email inbox. Although this level of TECO hacking was unusual, many users would come up with their own customizations in the form of handy command sequences that could be saved as TECO macros and quickly invoked in an ordinary editing session. Unlike the keystroke captures in some of today's editors, TECO macros were plain text, so they could be edited like any other text to debug and enhance them. With that and the ability to use programming constructs like loops and conditional searches at any time, TECO offered capabilities that many former TECO users, myself included, find lacking in contemporary editors. Things I used to do in TECO on the fly must now be done more laboriously, or if that isn't tolerable, not done in the editor at all but rather using other tools such as Grep, Sed, Awk, and Perl. For anyone who would like to run TECO now, at least occasionally, there are versions available on the Web for most common systems.[6] ## Alleged Patent Infringement (story) As simple as it seemed, even at the time, this method of command processing became the subject of a patent infringement case some years later. This was in the late 1980s, and I was working for DEC in the VAX/VMS group. One day, I got a call from someone in the DEC legal office. It seems that IBM was being sued by some small company because of alleged patent infringement by the IBM PC. Some basic programming techniques were asserted as patented IP by this company, and in looking to defend itself, IBM had done a search for prior art. One of the issues was characterbased command dispatching, and somehow, IBM found TECO, which was originally implemented years before the claims of this challenger. IBM identified me as the original implementer, traced me to DEC, and contacted the DEC legal department to ask for assistance. I consulted with some IBM attorneys and was looking forward to a full-blown trial. I never got the call though, so I presume the case was settled well short of that. ### References and notes 1. D.G. Bobrow et al., "TENEX: A Paged Time Sharing System for the PDP-10," Comm. ACM, vol. 15, no. 3, 1972, pp. 135–143. 2. See Dan Murphy's TENEX and TOPS-20 papers at http://tenex.opost.com/ 3. DDT originally stood for "DEC Debugging Tape" as, like all programs for the PDP-1, it was loaded from a paper tape. DEC later changed that to "Dynamic Debugging Technique" as paper tape faded away. 4. Jean Sammet's list appeared periodically in the Comm. of the ACM (see vol. 19, no. 12, 1976). 5. S. Levy, Hackers: Heroes of the Computer Revolution, Doubleday, 1984. 6. Two good places to find them are http://almy.us/teco.html and the Wikipedia article on TECO at http://en.wikipedia.org/wiki/Text_Editor_and_Corrector. Readers may contact Dan Murphy at dan.murphy@dlmmx.com Contact. department editor David Walden at annalsanecdotes@computer.org .