EEEEEEE CCCCCC CCCCCC EEEEEE
E C C E
EEE C C EEE
E C C E
EEEEEEE CCCCCC CCCCCC EEEEEE .
Edinburgh
Compatible
Context
Editor.
This is a quick guide to the early versions of ECCE, such as those
implemented on the PDP8 and on the PDP9 around 1970.
The PDP8 version ran completely stand-alone (no operating
system required) and edited from a paper tape reader on input
to a paper tape punch on output, using a dumb teletype for
console I/O. All the peripheral driving was done within the
editor itself.
An earlier version, written in the high-level Imp language,
which was a derivative of Atlas Autocode, ran on PDP9/15 systems
which added disk I/O, and later versions of Ecce written in
a wide array of languages have been ported to almost all
known computer systems, and are still in daily use by
Edinburgh University graduates world-wide!
This document gives a introduction to the ECCE command structure
but does not attempt to replace the full manual which you can
find in the Edinburgh Computer History archives.
There is also a Unix man page available.
Commands:
B<repeat> Break lines (insert newline)
D<range><text><repeat> Delete the next occurance of text
E<+/-><repeat> Erase characters
F<range><text><repeat> Find text
G<repeat> Get lines
I<text><repeat> Insert text
J<repeat> Join lines
K<repeat> Kill lines
L<repeat> Left move
M<+/-><repeat> Move down a line
P<repeat> Print (and move)
R<repeat> Right move
S<text> Substitute text
T<range><text><repeat> Traverse text
U<range><text><repeat> Uncover (by deleting Up to) text
V<text> Verify that the text is here
Syntax:
<+/-> This means that the command (eg M) can take a - which reverses
in some way the normal sense of the command; ie M normally moves
forwards so M- will move backwards.
<text> Commands which insert or search for text specify their text strings
by enclosing them in valid string delimiters.
The delimiters available are:
! . # $ % & ' + / < = > @ [ ] ~
<range> Text location commands can have their searches limited to a
specified number of lines, eg f/fred/ would normally search
up to the end of the file -- but f4/fred/ would limit the
search to the next four lines. Note that the 'dangerous'
commands U and D (which combine text searching with deletion)
have a default range of one line; ranges are otherwise up to
the end of the file.
<repeat> A simple command like M only does its action once, ie it moves
down one line. To make this more useful, you can put a repeat
count after the command, so that M10 will move down ten lines.
This repeat count is a general facility which can be applied
to most commands, for instance f/fred/3 will find the third
occurance of fred.
The special repeat count of "*" means 'lots'. It can also
be entered as "0" to save the use of the shift key :-)
Grouping:
( <command sequence> ) <repeat> This repeats a group of commands.
The description of how repeat counts
affect a single command applies
equally to a bracketed group.
Conditionals:
<command sequence>, <alternative 1>, <alternative 2>
! ! ! And if both fail, try this
! ! If it fails, try this next
! Try this one first
You are not limited to three tests - you can have as many comma units
as you can sensibly make use of.
<command>\ \ makes the command appear to fail if
it really succeeded, and appear to succeed
if it really failed.
<command>? ? says the command succeeded regardless of
whether it did or not.
Special commands:
Commands starting with % are special and
cannot be grouped with other commands.
%C
This Closes the edit, writing out the main
edit buffer to the output file, or in the
case of the PDP8, punching out the remaining
part of the file before exiting.
The following three commands had to do with the limited window of the
file which could be held in store, and the tedious business of re-punching.
%H Hold
%H (Hold) created a pseudo end-of-file condition on the portion of the file
which was then in store, preventing eg Find operations from causing further
reading which would generally provoke punching some text from the top of
the buffer.
%R Release
%R (Release) removed the end-of-file condition, allowing further input.
%P Punch
%P (Punch) allowed explicit control of output when finished editing a
section of the file, i.e. you could force the text before the current
point in the buffer to be punched, thus creating more buffer space to
edit text further down the file.
NOTE: with the exception of the three commands above, the description
of Ecce in this document also exactly matches the implementation of
Ecce (written in Imp) for the PDP9/15 systems, and indeed the version
implemented in Javascript at the head of this web page. For comparison
purposes, the original Imp version can be seen here:
http://history.dcs.ed.ac.uk/archive/apps/ecce/hmd/e915b.imp.html
and a literal C translation of the above - which you can compile and run
today - can be found here:
http://history.dcs.ed.ac.uk/archive/apps/ecce/hmd/e915c.c.html
This Javascript version of ECCE is almost completely compatible with the
above, except that it cannot load files from or save files to disk. It
is actually a machine translation of yet another version of ECCE, this
time one written in a simple language called LC.
The LC version was used recently as an example sample program for a
compiler class.
A more modern C reimplementation suitable for use on Unix or DOS/Windows
systems is available at SourceForge. The modern version extends ECCE slightly,
for example by allowing commands such as F-/text/ to search backwards
in a file. It also supports multiple buffers (known as 'contexts')
and does not suffer the size limitations of older versions. It is this
version we recommend if you wish to use ECCE on a day to day basis.
There is also a derivative of the modern C version which integrates with
the EMACS editor, allowing you to enter complex programmed commands within
EMACS by typing ^E followed by the ecce command. This is an ideal editing
environment, which uses a screen editor for things at which screen editors
excel, and ECCE for things which screen editors handle poorly.
Tutorial:
It is quite easy to learn how to use ECCE - half a dozen commands can get
you started, and the rest can be learned as you go along. Lets look at some
examples:
p Print the current line
m Move down a line
g Get a new line
k Kill the current line
'Move' is obvious...
'Get' gives you a ':' prompt, and you type a line of text at it.
When you press return, that line is inserted in your file.
'Kill' deletes the entire current line.
Two more concepts are needed and you will be able to edit any file with these
commands: firstly, if you put a number after a command, the command will be
executed that number of times, e.g.
p23 Print the next 23 lines
m10 Move down ten lines
g5 Make space for and accept 5 new lines of text
Secondly, the two commands which can be done in reverse (Move and Erase)
will do so if invoked with a '-', as in:
m-10 Move back up 10 lines
These are the simplest commands of ECCE, and lets you get started editing a
file. Here are a few others which are self-explanatory and the sort of thing
you will be used to in any modern command-line editor.
i/text/ Insert a text string here in the line.
f/text/ Find the quoted text.
r Move Right one character on the current line
l ditto Left
e Erase one character on this line
Similarly, all these can take repeat counts where appropriate:
f/text/4 Find the 4th occurance of "text"
r40 Move Right 40 characters
And can be strung together quite happily:
m23 f/text/ p3
Where ECCE comes in to its own is in its more advanced features:
Failures, Conditionals, and Repeat groups.
Any of the commands above can fail - for instance, if you try to print 25
lines, and you are only ten lines from the end of the file, then the print
command will fail with an error after those ten lines have been printed.
The smart bit about ECCE is that it allows you to test for such a failure,
and if one has happened, lets you do something else instead. The epitome of
this condition testing is the Verify command:
v/text/ Verify that the quoted text is at the
current point in the line.
This command does nothing at all if the text is present, and does nothing but
issue a failure message if it is not!
However, rather than print a failure message and abandon the command, we
can test whether the command worked and do something else instead.
v/text 1/ i/First text: /, i/Not first text: /
Finally the above can be executed multiple times by enclosing any
command in brackets, such as:
r0 (l v/ / e)*
which will remove all trailing spaces from a line, and
m-* (r0 (l v/ /e)* m, m)*
will remove all trailing spaces from all lines in the file.
Experienced ECCE users will have a repertoire of these combined sequences
which they can routinely use to perform complex edits. For instance the
following will align all "//" comments in a C++ file to column 50:
(f.//. l50m, l0f1.//. i/ /50l0r50(v/ /e)0 m, m)0
Once you get to the stage that you understand the line above on first
reading, you can award yourself an Ecce Certificate of Merit, and
I have nothing more I can teach you!
Ecce was written by Hamish Dewar
This document was written by Graham Toal