Lisp Machine Museum Documentation Examiner
Genera Museum Documentation

EINE, the first Lisp Machine editor

EINE was already a substantial, Lisp-integrated graphical editor: it had live redisplay, named buffers, multiple views, a minibuffer, regions, histories, keyboard and mouse command dispatch, font changes, and evaluation and compilation. Its most historically revealing feature is its ability to treat individual Lisp definitions as separately resident buffers while preserving their relationship to a larger source file.

This page studies a coherent late-1977 source set, not an unspecified ideal version of EINE. The binding companion enumerates every initial keyboard and mouse cell, every named extended command, the Control-X and Help trees, and all source-visible EDT and recursive-minibuffer shadows in that set.

Inspected source set

The public source is preserved by the MIT Department of Distinctive Collections from ITS backup tapes. The archive contains multiple versions and branches, not a single release checkout. This study follows the 19-module recipe in eine/9004365/dlw/eine.8, resolving each named module to the latest archive-dated source in the adjacent dlw2 directory. This matters for EDFN: the selected edfn.46 is archive-later than numerically larger edfn.113. The recipe is 1,129 bytes with SHA-256 1ae9bed8b613e4bf1997b8a232e66de20c525f399c1cd15964c75f56282f4976. The resulting 276,909-byte corpus has aggregate manifest SHA-256 7aefec316b32dac5ec42db1721655c010a14c394ecb2c9b7f03b42a7261ed8f5. Each lexical-path-ordered record is the UTF-8 repository-relative pathname, one NUL byte, and the 32-byte binary file SHA-256; records are concatenated without a terminator and hashed again. The key findings rely principally on:

File Role Bytes SHA-256
etable.34 initial keyboard, prefix, extended-command, syntax, and mouse tables 23,814 90bbf97c2c4fa932549f52b50c51705a111dac6e4d22a92b1c0a7b74793cc06a
ecmd.50 command loop, lookup, installation, and dispatch 16,531 3f552b88c9064f5890938e4ebc0cbf6e662e7b0fe46205bba66a3abb62a5fc10
edefs.50 editor variables and data definitions 11,307 04e034a0f25c8a78e0b2ea270be8d1864d0fef679cacc70385fd38e7e9b635a3
ebasic.64 initialization, editor entry, buffers, and reset behavior 14,423 67495ebeeb5f66d6e1172edf5b66008e306be0c7ceb2e7f0854613a9e0312feb
edm.122 pointer regions and mouse commands 21,803 1c0c908101974bfd1f0b48619a9a30f8a41ab461db68ada964c20f177613f27b
edfn.46 definition- and file-oriented operations 18,106 7492479912fd11fdc030768b39360be8449a88b1e7fd57d9a91f11d4ed1250fb

The source repository is pinned at revision b12f5b7. Its provenance record identifies Software Heritage directory swh:1:dir:ebd75608d2ac37affde679d124999044214ea701. The archive states that, to the extent MIT holds rights in the material, it is released under GPL 2.0.

Because ITS version numbers and tape dates do not amount to a formal release manifest, “late-1977 EINE” below means this exact recipe-derived source selection. In particular, the recipe names EDFN, so the similarly situated edfn2.14 is not substituted. The contemporary EINE manual in the System 46 source distribution is supporting evidence, not proof that every paragraph describes exactly these files.

Screen and editing model

An EINE buffer is a named ART-Q array whose elements are line objects. A window is a rectangular view of a buffer; two windows can show the same buffer, and redisplay reflects a change in both. The normal screen has a large editing window, a status line, and a three-line area used either for echoes or as a small editable minibuffer.

Point is the insertion and command position. Mark can be on or off. When on, EINE underlines the region between point and mark; most text-changing commands turn it off while movement and redisplay preserve it. That behavior is a safety mechanism as well as feedback: region commands refuse to run when no active region is displayed.

The command loop reads from an editor stream, looks up a function in a four-row dispatch table, executes it, updates command history and mark state, and asks redisplay for only the necessary degree of repair. The rows represent unmodified, Control, Meta, and Control-Meta input. Control-X dispatches through a second table with the same four modifier rows. Meta-X completes over a named-command association list. Recursive string and Lisp minibuffers temporarily shadow activation, cancel, and exit cells in that same table and unwind those changes on return; they are not accurately modeled as an entirely separate permanent keymap.

Feature inventory

Basic editing and movement

  • insertion, quoted insertion, forward and backward deletion, line killing, horizontal-space deletion, joining and splitting lines;
  • character, real-line, word, s-expression, list, defun, buffer, screen, and screen-edge movement; the initial table also names sentence and paragraph commands whose implementations are absent from the exact build corpus;
  • point/mark exchange, active regions, word/sexp/line/paragraph/defun marking, and saved region text;
  • kill and yank history with append-next-kill and yank-pop;
  • case conversion of words and regions, word capitalization, indentation, code formatting, fill-related commands, and tab stops;
  • numeric arguments, a negative argument, and repeated commands;
  • incremental and single-character search;
  • redisplay, recentering, and position/count queries.

Buffers, windows, and temporary editing

  • create, rename, select, list, kill, and revert buffers;
  • one- and two-window layouts, other-window selection, arbitrary window creation, movement, resizing, burying, and deletion;
  • ordinary buffers and tab buffers;
  • a minibuffer that uses editor commands rather than line-oriented rubout processing;
  • a temporary-area mode for reclaiming short-lived editor storage.

Lisp development

  • evaluate or compile a buffer or active region;
  • evaluate or compile and leave the editor;
  • edit a definition, show an argument list, format a definition or expression, and load a whole source file;
  • ED, EDVAL, and EDPROP entry points that construct or select buffers for functions, values, and properties;
  • tag-table reading and defining-file associations;
  • optional visual error effects named BARFOLA and ZOWIE in the source.

The EDT editor top level

edt.84 is a specialized “editor top level” built from EINE rather than a separate editor lineage. It gives an Editor Top Level buffer to a stack group and installs that buffer as STANDARD-INPUT, STANDARD-OUTPUT, and ERROR-OUTPUT. Submitted input and printed output therefore share an editable interaction history. Six dynamic table changes add activation, clear, exit, and insert-previous-interaction behavior or suppress EINE's ordinary exit commands. The exact overlay is listed in the binding reference.

Text appearance

The command set can change the font of a character, word, or region, choose a default font, redefine a font, and choose the cursor blinker's font. These are embedded raster-font changes, not scalable vector styles. EINE's storage and redisplay code treat the font choice as part of character-level display state.

Files and definition sections

EINE supports two file models:

  • file style puts an entire file in one buffer, like a conventional Emacs visit;
  • section style scans the file into definition ranges and loads selected sections into separate buffers.

In section style, the editor records a sorted section list, the original character range, a defining-file property, and a modification tick. UPDATE FILE writes the modified definitions associated with a file; FORGET FILE discards the editor's associations; LIST FUNCTIONS reports what was read and what needs updating. LOAD WHOLE FILE populates all sections but the manual warns that this is the slow path the section design is intended to avoid.

The scanner normally recognizes top-level DEFUN, MACRO, DEFMACRO, and DEFSTRUCT forms. No-op BEGF and ENDF forms can delimit a logical definition explicitly. Special HEAD and TAIL sections hold file-wide prologue and initialization material. These are editor/source conventions, not Lisp evaluation constructs.

The internal documentation also records an ED-FILE-ID containing version, date, time, and size. If the current file no longer matches that identity, EINE can recognize that an external writer changed it. This conflict check is a source-confirmed feature that the short user-facing overview does not develop.

Mouse and tablet operation

The source supports either a mouse or tablet and divides the editing surface into three vertical semantic regions:

  • text, where horizontal position identifies a character;
  • line, where the gesture addresses a whole displayed line;
  • paragraph, where it addresses larger syntactic or textual units.

The pointer changes arrow glyph by region. A three-dimensional dispatch table selects a command from region, click count (one, two, or three-or-more), and button. Its implemented operations include moving point, marking and dragging a region, killing, saving, yanking, showing a line at the top or bottom of a window, and marking list, s-expression, line, line-list, or defun units.

Two table entries are important counterexamples to a naive keymap audit: EDM-SCROLL-FAST and EDM-MARK-PARAGRAPH are bound, but in edm.122 each function only rings the display bell and reports no redisplay work. The gestures were allocated without the named behavior being implemented in this source set. The mouse binding table labels them as stubs.

Customization and self-description

EINE can install a command on a key and exposes an extended INSTALL COMMAND operation. The source's initial-table comment deliberately reserves Control-period for the user. Lowercase Control/Meta key codes are aliases of their uppercase forms, so customization operates on the logical command character rather than a printed ASCII spelling alone.

Self-documentation is itself a command. Control-slash, Control-question-mark, Meta-slash, and Meta-question-mark reach it in the initial map. Prefix lookup is represented by a generated function, so asking about Control-X can continue into the prefix table instead of merely describing a single leaf command.

An exhaustive static audit of the 19 files named by the archived EINE build manifest found 413 unique functions and 170 command-like definitions. The main dispatch has 576 slots: 263 direct entries, 78 automatic aliases, one Control-X prefix, and 234 unbound slots. The prefix table has 19 direct, 104 alias, and 453 unbound slots. All 53 named extended commands and all 15 distinct mouse targets are defined in the corpus.

Five functions referenced by the main table are not present in those 19 files: backward/forward sentence, backward/forward paragraph, and format code. The bindings are real table entries, but their effects are not claimed as available without a separately loaded definition. A sixth apparently missing prefix symbol is generated at initialization with FSET and is therefore resolved.

What is and is not runtime-verified

No EINE load band compatible with the current CADR harness has yet been located. The museum's runnable System 303 band contains ZWEI/Zmacs, not this earlier EINE source. The feature and key claims on this page are therefore grounded in the pinned implementation and contemporary documentation, but are not presented as observations of a running 1977 editor.

TODO: locate or construct a redistributable EINE-capable load band, reproduce the screen layout, section-buffer workflow, and mouse-region behavior through the Xvfb harness, and add a runtime screenshot.

Sources

Try “search window system”, “open genera”, or “help”.