1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-20 08:28:43 +00:00

EMACS 142 from TENEX or SUMEX or something.

This commit is contained in:
Lars Brinkhoff
2018-02-01 19:41:43 +01:00
parent 91e36ee10f
commit 592ea9d844
84 changed files with 98352 additions and 0 deletions

12481
src/e142/atsign.mid Normal file

File diff suppressed because it is too large Load Diff

74
src/e142/changes.142 Normal file
View File

@@ -0,0 +1,74 @@
Changes to EMACS in version 142:
I believe this covers all of the visible changes; if you
find any more PLEASE let me (Rubenstein) know so I can add
it to the list. In addition to the following, the internal
documentation has been cleaned up and simplified considerably,
an attempt which is still going on. If you come across anything
that you think is unclear, please let me know.
1. File visiting changed somewhat; C-X C-E command removed.
See internal documentation for new behavior.
2. In autosave mode, C-X C-S does a normal save (i.e. with real
filename). If given an argument, saves under autosave filename
(i.e. sense of argument reversed).
3. C-X : (^R Set Column) removed.
4. The Count Lines command has been removed. In its place, C-X L
(which normally counts lines on a page) can be given an argument,
causing it to count lines in the whole buffer.
5. The command C-] has been changed from Macro Q-register to
Abort Recursive Edit. This can be used as an emergency exit
to commands which call EMACS recursively (e.g. Alter Options).
6. Comments which start with two comment start characters are
aligned as if they were code. Triple comment character
causes alignment at left margin. This will mostly interest
lisp people.
7. M-K now kills next sentence, rather than duplicating M-D.
8. C-M-X runs Instant Extended Command. Like M-X with no
arguments. See the internal doc.
9. All "Exchange" commands have been renamed "Transpose"
10. The "Lisp ) Hack" variable is now renamed to "Display matching
Paren" and defaults ON.
11. Variable Apropos, List One File have been deleted.
12. Count Lines, Make Variable and Set Variable Comment have
been made into subroutines.
13. Edit ..D has been renamed to Edit Syntax Table.
14. Get Date has been renamed to Insert Date.
15. Several new commands: Undo, Set Variable, Set Key, Delete File,
Copy File, and Rename File. See internal documentation for
description.
16. The Auto Save on exit now saves in the real filename.
17. Teleray 1061 and Heath terminals are now supported as
terminal types 17 and 18. Anyone using a terminal
other than a datamedia, please drop me a note... I'd
like to know what other terminal support is required.
18. Redisplay is much smarter about tabs, when to use I/D char, etc.
19. Most minor mode commands (Auto Fill, Auto Save, Overwrite, etc)
now toggle the mode if given no argument. They still turn the
mode on with arg > 0 and off with arg <= 0.
20. Auto save mode now takes only one argument, turning it on or off.
Number of versions and interval are now controlled by setting
the variables Auto Save Max and Auto Save Interval.
21. Libraries may now contain a macro called & Kill <libname> Library
which can do any necessary cleaning up if and when that library
is killed.

BIN
src/e142/chess._ej Normal file

Binary file not shown.

969
src/e142/conv. Normal file
View File

@@ -0,0 +1,969 @@
-*-Text-*-

File: CONV Node: Top Up: (DIR) Next: Init
Programming in TECO for EMACS
* Menu:
* Init Files: Init INIT files and what they can do.
* Syntax: Syntax Syntax library source files to be compiled by
the EMACS library compiler.
* Libraries: Lib Other conventions for Libraries and sources.
* Programming: Prog Conventions for TECO programs to be operated
in the EMACS enviromnment.
* Variables: Vars Named variable (QFoo, etc) conventions.
* Major Modes: Major How to define new major modes.
* Submodes:: How to define submodes.
* Prefix:: Prefix characters, such as C-X.
* Hooks:: Variables which EMACS will call at specific times.
* Dump:: Dumping EMACS environments.
* Build:: Building and dumping a new EMACS.
* Wall Charts:: Making wall charts.
* Q-registers: Qregs Conventions for use of Q-registers.
* FS ^R PREV$: FS^RPREV Conventions for setting/examining FS ^R PREV.
* Debugging: Debug Debugging aids in EMACS.

File: CONV Node: Init, Up: Top, Previous: Top, Next: Syntax
INIT Files.
Each user can have his own file of TECO commands for EMACS to
execute each time he starts it up. EMACS looks for the file
<hsname>;<user> EMACS and then for <hsname>;* EMACS, where <hsname>
stands for the user's home directory. If neither file exists, the
file EMACS;* EMACS (the default init file) is used instead.
On Twenex, the init file is called EMACS.INIT in your login directory,
and the default init file is <EMACS>EMACS.INIT.
You can cause an EMACS to read another user's init file by giving it
that user's name as its XUNAME; just do <user>^S in DDT immediately
before starting the EMACS.
Setting up the default ^R command definitions and named variables
need not be done in an init file, since that is done before the EMACS
environment is dumped out. As a result, your init file need only
define those commands which you wish to change. Use MM Load Lib to
load any additional libraries (or the :EJ command, for libraries which
have no & Setup <library> Library macro). To obtain a function as a
value so you can put it on a character, simply use M.M <name> . The
U command can define a character, as in for example U..^RX which puts
its argument on Meta-X. Use M.V to create and assign a variable, or
better yet M.C to give it some documentation as well.
When the init file is started, all q-registers not used by EMACS
(and described herein) will probably be zero. One exception is Q1,
which contains the version number of [PURE], as a string. The default
init file types this out as the "EMACS version number".
If you have no init file, EMACS runs the default init file, which is
the init file on the EMACS directory. This does various things such
as processing a command line from the superior, loading LISPT if
necessary, printing the EMACS version number and offering help,
checking for lower case characters on an upper-case only terminal, ...
Most people will find that they wish to perform the actions of the
default init file after their own peculiar initializations.
To do this, just end your own init file with
ER EMACS;* EMACS @Y ET@ > :M(HFX*)
(On Twenex, do EREMACS;EMACS INIT or ER<EMACS>EMACS.INIT instead)
This practice is recommended because some of the things in the default
init file are important for the proper functioning of EMACS.
If you wish to override the default init file's offer of help, or the
JCL processing, then instead of doing the :M with an empty buffer you
should put in the buffer a string to be treated as if it were the JCL.
FJ
Z"E I<what to use for JCL when there is none>'
ZJ .F[VB
ER EMACS;* EMACS ^Y ET@ >
:M( HFX*( F]VB))
Putting just Altmode Space in the buffer when there is no JCL will
prevent the default init file from offering help. For this, use
Z"E I ' in the above example.
If you have enough of your own macros to have a private library of
them, you need not have both the library and an init file to load the
library. You can just call your library <user> EMACS and give it a
~Filename~ of INIT and a & Setup INIT Library macro to perform the
other initialization. The & Setup INIT Library macro should end by
reading in the default init file, just as an ordinary init file
should, but the calling convention is slightly different:
:I..9 ER EMACS;* EMACS @Y ET@ > :M(HFX*)
This section does not intend to be intelligible without reference to
TECO ORDER and to the rest of this file.

File: CONV Node: Syntax, Up: Top, Previous: Init, Next: Lib
Syntactic Conventions for TECO Macro Files:
A source file of EMACS macros contains one macro on each page. Each
macro has a name and documentation as well as its definition. These
source files are processed by a compressor which deletes spaces and
comments and performs other syntactic transformations before they are
run. You can also ask to compress and install a single macro, for
testing, by pointing at it and using MM Compile.
Every macro's definition begins with the macro name, which is
preceded by a ! and followed by :!. You must not ever put a :!, even
with spaces in between, in a macro source file except to end a macro
name. The macro name must be the first thing on a page except for a
CRLF which must follow the previous formfeed on pages after the first.
The name conventions are that subroutine names start with "& " and
names of commands intended to be put on characters start with "^R ".
This is to keep them from limiting the user's ability to abbreviate
the names of commands he wishes to type. Another convention is that
"#" begins the names of commands which form a dispatch table. For
example, in INFO, the command M causes # INFO M to be run. If you
define a command named # INFO +, that will automatically give you an
INFO command called +.
After the macro name comes a space, an !, and then the macro class.
Then, after another space, the rest of the line is the "brief"
documentation which is used when only a single line is wanted. It
should be a complete sentence. The macro class should be the
character C for a command which users should call by name, S for a
command intended to be used as a subroutine, and ^R for a command
intended to be placed on a character. The macro class does not
restrict how the macro can actually be used; some of the
documentation commands filter commands to be described by class.
The macro may have only the brief documentation. In this case, the
brief documentation should be followed by an !. Otherwise, the lines
following the brief documentation are the full documentation, which
ends with the first !. The ! must be at the end of its line, and
should not be an excuse to omit punctuation for the last sentence,
since it will not be seen by the user. To put an ! in the text of the
documentation, use control-^.
After the line ending with !, the next line contains the beginning
of the macro definition proper. Usually, a blank line is put there to
improve readability. You must remember that the definition will not
be used as written, but will be processed syntactically first: all
spaces and tabs, except those following a ^Q, will be deleted. all
_'s not following a ^Q will be turned into spaces. !* is taken to
start a comment and everything from there up to and including the
following ! is deleted (again, a ^Q will prevent this). Double CRLFs
are converted to single ones. Normally, you should use ^]^Q to do
such quoting, since that is safe in all contexts. Inside search
commands and file commands a ^Q by itself is enough.
Every macro definition should end with a CRLF, after which may come
a ^L and the next macro definition. Macro definitions are separated
only by CRLF ^L CRLF. A ^L in the middle of the line is just part of
a macro. If you want to put CRLF ^L CRLF inside a macro, use CRLF
^]^Q^L CRLF.
The major mode TECO Mode is useful for editing EMACS source files.
Comments are defined to start with !* and end with !.
Tab is set to the command ^R Indent Nested, which normally moves the
current line to be under the previous line. With an argument, it
takes the argument to be the number of levels "up" to go, where up
means a lesser amount of indentation. Thus, Tab with an argument of 2
or more is good for the first line after the end of a conditional or
iteration. In addition, unindented lines and lines containing only
comments are ignored. In addition, Meta-' is defined to move forward
over a TECO conditional, and Meta-" to move back. You might wish to
set the variable QFS CTLMTA to -1 in your TECO Mode Hook variable,
thus making control-meta characters insert control characters. If you
do this, you must also make QSwitch Modes Process Options locally
nonzero.

File: CONV Node: Lib, Up: Top, Previous: Syntax, Next: Prog
Library File Conventions
The command Generate Library, in the library EMACS;PURIFY :EJ, is
used to generate :EJ'able libraries from source files following the
syntactic conventions. The operation has two logical subparts:
compression, which removes spaces and comments, and extracts the
documentation into separately named macros; and purification, which
converts the intermediate form into a :EJ'able library. It is
possible to divide the source for a large library into several
subfiles, which will be compressed separately but purified together.
This saves time if only some of the subfiles are modified, since the
compressed versions are saved in separate files and reused if more
recent than the sources. Generate Library handles such multi-file
sources automatically if all the source files' names are given to it.
One of the source files going into a library should define a
"command" named ~Filename~. The "definition" of this command should
be some kind of identification for the file. It should usually be the
same as the first filename of the library. The documentation for
~Filename~ should describe the purpose of the library as a whole.
Generate Library automatically creates a ~Directory~ object which
contains a list of all the macros in the file. A library should never
contain two macros with the same name (~Filename~ is an exception:
see below).
Sometimes it is desirable to merge several library sources into one
:EJ file. If you always like to use, say, TAGS :EJ, and have a
private library, you may save space and increase speed by including
the source of TAGS when generating your private library. This,
however, means that you need to be able to override the ~Filename~
macro which comes from the source of TAGS. Generate Library solves
this problem by deleting all but the first ~Filename~. Your private
source file must come first, and contain a ~Filename~, to override the
one in the TAGS source.
Libraries intended to be accessed via the Run Library command should
contain a macro named <ENTRY>, which will be the default entry point,
so that the user need not specify the entry point name. In addition,
they MUST have a ~FILENAME~ which is identical to the actual first
name of the file, so that Run Library can tell whether the library is
already loaded.
If a library contains a macro named & Setup <libname> Library, where
<libname> is the library's ~Filename~ name, then whenever the library
is loaded with MM Load Library that macro will be called. It can be
used to put some of the library's macros on ^R characters, for
example. If it is used for that purpose, then it should allow the
user to override it by setting up a named variable. For example, the
TAGS library has an & Setup TAGS Library macro, which defines Meta-..
However, if the variable TAGS Setup Hook is nonzero, & Setup TAGS
Library executes that variable instead of its default actions. Thus,
a user's init file can specify where the TAGS commands should go if
TAGS is ever loaded, by defining TAGS Setup Hook.
In addition to the names of macros, there are several names that
(usually or always) be found in purified files of EMACS macros. For
every macro FOO, an object named ~DOC~ FOO is available, that contains
FOO's documentation. In addition, ~DIRECTORY~ contains a list (one
per line) of all the macros that the file wishes to advertise that it
contains. Special things such as described in this section, and all
commands with ~ in their names, are not included.
~INVERT~ is supposed to be a macro that is the inverse of the loader
macro. That is, <object in file>,<pointer to file> fed to the
~INVERT~ macro should return a string containing the name of the
object. You should not have to be aware of ~INVERT~, because it will
be provided automatically, and called by & Macro Get Full Name when
necessary.
The BARE library, which contains definitions of the raw TECO ^R-mode
commands, has a different loader macro and so must be generated in a
special way. The command MM BARE Library Generatesource-file-name
will generate and write out the BARE library. The difference in the
loader macro is simply that if a macro's definition is three
characters long or fewer then it is treated as the name of a ^R
command character (as in .^RA for C-A) and that character's initial
raw-TECO definition is returned instead. If the macro's definition as
found in the ordinary way is longer than three characters, it really
is the definition. This way, documentation strings act normally but
the command names themselves can return the raw TECO commands as their
definitions. BARE has a ~INVERT~ macro which knows how to find the
names of raw TECO commands as well as strings in the library.
However, & Macro Get Full Name has to know specially that such
commands, which are positive numbers rather than strings, should be
passed to the BARE library to invert.

File: CONV Node: Prog, Up: Top, Previous: Lib, Next: Vars
Programming Conventions
For good programming practise, every CRLF that is not
part of a string argument should be followed by an indentation
to a position that indicates the current depth in iterations
and conditionals. Use of the Tab command will make this easy.
Since the FS S ERROR$ flag is normally set in EMACS, searches that
are followed by ";" must always be given the ":" modifier; otherwise,
they will cause errors when they fail, before noticing the ";". This
is because, if FS S ERROR$ is not set, a user who types an iteration
in the minibuffer and omits the ";" is likely to cause himself extreme
lossage. The Tab TECO command is disabled in the EMACS environment,
and is a no-op. Use 9I or I^]^Q<tab> to insert a tab.
Use named subroutines whenever convenient. The subroutine
should usually have documentation beginning with "S "
so that users doing a "List Commands" will not see it, and
a name beginning with "& " so that it will not interfere with the
user's attempt to abbreviate command names.
Call the subroutine with M( M.M&_Subroutine$) (note the
_ is used to get a space). MM&_Subroutine$ would work, but
macros are not supposed to depend on having no-dot q-regs
set up.
The normal EMACS command level is precisely the TECO ^R command,
with characters redefined to run EMACS macros or user-supplied macros.
All of the information in TECO ORDER on the ^R command, facilities
available for macros which are definitions of ^R characters, and what
values should be returned by such macros, are very important for
anyone who writes macros which are to be placed on characters.
The mark is kept in TECO's "Ring buffer of point". It's value can
be obtained with :^V with no argument; <arg>:^V will push a new value
of the mark. ^V with no colon can be used to pop the mark (read TECO
ORDER for details). One consequence of this scheme is that there is
always a mark somewhere. Note that the ^W EMACS command POPS the
mark, rather than leaving a useless mark at point.
Commands that take input should do M.I before actually reading it.
That will prompt for the input. The user may redefine .I if he wishes
to eliminate prompting, but even so he should still define all his
macros to use M.I so that other users will receive the behavior they
want.
Commands that call ^R on data that the user is likely not to regard
as "the thing he is editing" should do 0[..F before the ^R, to turn
off auto-saving, and inhibit window, buffer or file switching (either
of which would cause garbage results if allowed to proceed). See the
& Check Top Level subroutine. They should also bind the default
filenames to GAZONK .DEL, which will prevent the user from screwing
himself with a ^X^W.
No non-dotted Q-regs should be reserved by the macros, except for
user interfaces like MM. Also, avoid using double-dot Q-regs except
as defined in TECO ORDER. All temporary Q-regs should be pushed and
popped. All macros should return with ^\ if possible.
When you wish to make a ^R command that checks for the
presence of a ^U as an argument, the conditional to use is
F^XF^Y"N, which succeeds if there was an explicit argument (^U or
otherwise). This makes it convenient to use the macro as a
subroutine, since then one can give it an argument of 1 to mean
"^U", and no argument to mean "no ^U".
Anything that changes information which is displayed in the mode
line should do 1FS MODE CHANGE so that FS MODE MACRO will eventually
be run to update q-register ..J and thus the mode line.
If you wish to read input from the user, if it is only a few
characters you can use M.I. But if it can be long or complicated
then rather than writing your own editing facilities for the input
you should use the minibuffer to read it. Simply call & Minibuffer
with the buffer containing any initialization for the input, and on
return take the contents of the buffer as the user's string. See
the documentation of & Minibuffer for more details. Alternatively,
you can read the input with & Read Line, but then the only editing
available will be Rubout.
I suggest that, if you intend to do any significant programming, you
do MM List Subroutines to find out what is available to you, and read
some of the EMACS source code.

File: CONV Node: Vars, Up: Top, Previous: Prog, Next: Major
Named Variable Conventions
EMACS makes extensive use of named variables, and provides features
for creating, destroying, editing, and listing them.
The basic way of getting the value of a named variable that already
exists is to do Q<name>. See TECO ORDER for details. If you are
not sure whether a variable exists, you can do <default> FO..Q <name>
which will return the value if the variable exists, or <default> if
the variable does not exist. :FO can be used to tell whether a
variable exists. Any TECO command that can use a q-register, except
for ^], can also use an existing named variable if it is given the
name of the variable, surrounded by Altmodes, as the q-reg name.
Although TECO allows unambiguous abbreviations of the name to be used,
it is unwise to use abbreviations in a program.
To create a variable, do <value>M.V<name>. Unlike Q and FO, M.V
does not manage to handle leading, trailing, or multiple spaces; any
variable created with them in its name will be inaccessible (of
course, in a library source file, spaces and tabs are deleted anyway,
and to get a real space you must use "_"). If the variable already
exists, its value will be set, and the old value will be returned.
For a new variable, 0 is returned. A variable can have a comment as
well as a name and a value. To create a variable and give it a
comment, do <value>M.C<name><comment>. Aside from setting the
comment, M.C is just like M.V.
Sometimes it is more efficient for changing a variable's value to
redefine some command characters, instead of having one definition
which always checks the value of the variable. Do this by providing a
macro to be run whenever the variable's value is changed. This macro
is supplied by making it the variable's comment. Whenever the comment
begins with a "!" it is taken to be a macro to be run in this manner.
If you want a variable to be presented for editing by MM Alter
Options, you should give the variable a comment which starts with a
"*". If the variable is to have a macro to run when it changes, and
so the comment must start with a "!", then the variable is an option
if the comment starts with "!". NOTE: if you are not careful, the
TECO code to set up such a variable will contain "!*" which will be
taken as the beginning of a comment. Leaving a space (which will be
removed by compression) between the "!" and the "*" will prevent such
lossage. See where the file EINIT sets up such variables if this
isn't clear.
You can examine the value, and comment if any, of a variable by
doing MM Describe<name>, just as you would ask for the documentation
of a macro.
Variables can be local to an individual buffer. To make a variable
local to the current buffer, do <value>M.L<name>. From then on,
setting the variable when the current buffer is selected will not
affect its global value, which other buffers will continue to see,
nor will changing that global value affect the local value. Each
buffer in which the variable is made local has its own value for the
variable, while all other buffers share one global value.
Doing M.L has the side-effect of creating the variable globally
with the value of 0 if it did not already exist globally. Local
variables will be created automatically when a file is visited which
contains a local modes specification at the end. They are also the
way in which major modes perform their redefinitions.
There are two times when local variables are usually created: when
a buffer is created, and when a major mode is specified. EMACS
automatically creates several local variables for each new buffer;
the Buffer Creation Hook variable will be executed and can create some
more. These locals will remain permanently in existence. All local
variables created after that time will be killed whenever the major
mode is changed. This is how one major mode undoes the redefinitions
performed by the previous major mode. A consequence is that any
explicitly created local variables will also be lost when the major
mode is specified (and, therefore, whenever a file is visited which
specifies its mode).
Not only variables, but q-registers as well (including ^R command
character definitions), can be made local. To make a q-register
local, use the Make Local Q-register command, with the q-register name
as a string argument: M.QA makes QA local, and M.Q.^RF makes the
definition of Control-F local.
You can override the library definition of an M.M macro by defining
a variable named "MM " followed by the macro name. M.M checks for
such a variable before looking the name up in the loaded libraries.
MM Compile installs the compiled macro in just this way. A few such
MM variables are present in the default environment. This is to make
calling certain key subroutines more efficient; M.M takes less time
finding the variable than searching the libraries.
To see a list of all existing variables, do MM List Variables. Each
variable's name and value (abbreviated if too long) will be shown.
A list of variables whose names contain <string> can be seen by doing
MM Variable Apropos<string>.
To destroy a variable, do M(M.M Kill_Variable)<name> to run
MM Kill Variable. This is necessary only in special situations.

File: CONV Node: Major, Up: Top, Previous: Vars, Next: Submodes
Defining Major Modes.
Each major mode is embodied by a command, such as MM TECO Mode or
MM Lisp Mode. A major mode can be created simply by defining an
appropriate command. However, major mode commands must work in a
particular way.
Major modes make all their redefinitions by creating local
variables. This is how each buffer can have its own major mode.
Buffer switching does not consciously "switch" modes; it just swaps the
local variables, which has that effect.
The first thing which each major mode command must do is eliminate
the local variables, if any, made by the previous major mode. This is
done by calling M(M.M &_Init_Buffer_Locals). All local variables of
the current buffer, except those made when the buffer was created, are
killed, and the global values reassert themselves. In addition, &
Init Buffer Locals leaves Q.Q bound to the Make Local Q-register
command.
Then, the major mode macro should create any local variables and
local q-registers that it wants. Supplying a 1, argument to M.L
causes M.L to run much faster, assuming that the specified variable is
not already local. Example: 1,(:I*;) M.L Comment_Start. This is
recommended for major mode commands. Command characters can be
redefined by using M.Q, since character definitions count as
q-registers. Example: M.M ^R_Indent_for_Lisp M.Q ^^I makes the
Tab character local to the current buffer, and redefines it for Lisp.
Finally, the major mode macro should do
1M(M.M &_Set_Mode_Line <mode name>  ^\
& Set Mode Line makes the new mode appear in the mode line, and the 1
as argument tells it to do everything else appropriate for finishing
up the change of major mode: Setting the variable QMode, running
the value of <Mode> Mode Hook if it is defined.
Exiting with ^\ causes the binding of Q.Q, left by & Init Buffer
Locals, to be popped, as well as any other bindings made by the major
mode macro.

File: CONV Node: Submodes, Up: Top, Previous: Major, Next: Prefix
Submodes and ..F
A submode is just a command which rebinds commands or variables and
then calls ^R recursively on the same buffer. A submode's name
usually starts with the word "Edit", as in "Edit Picture". Submodes
are to be distinguished from commands such as Edit ..D which call ^R
recursively on some other text.
For submodes to indicate that they are active, the variable Submode
is provided. Binding QSubmode to FOO causes [FOO] to appear in the
mode line after the name of the major mode. However, you must call
& Set Mode Line yourself before entering ^R, and you must do an FN
command to cause & Set Mode Line to be called on the way out (even if
you come out via a throw or an MM Top Level). Usually, the Edit FOO
submode will put FOO in the Submode variable.
Submodes need not bind ..F to zero. Because the buffer is not
bound, it works reasonably well to switch files, buffers or windows
inside a submode. However, you stay inside the submode when you
switch, which you may not like. Someday there may be a different
implementation of Submodes which makes them local to a buffer.

File: CONV Node: Prefix, Up: Top, Previous: Submodes, Next: Hooks
Defining Prefix Characters.
An EMACS environment can contain any number of prefix characters,
although EMACS normally contains only one - C-X.
To define a prefix character, you must choose a single-dot
q-register to hold the dispatch table for it. Call MM Make Prefix
Character<q-reg name> which returns a string which is a definition
of a prefix character which will look in the specified q-register for
the dispatch table. Then put this string into the desired character's
definition. Normally, dispatch tables are made 96 characters long.
If you want Rubout to be available as a subcommand, you must make it
128 characters long, which you can do by providing 128 as an argument
to Make Prefix Character.
For example, a prefix character C-Y can be defined to dispatch
through q-register .Y by doing
M(M.M Make Prefix Character).Y U.Y
After this, you can define individual subcommands by doing things like
M.MFOO U:.Y(A) which puts MM FOO on C-Y A.
How Prefix Characters Dispatch.
All prefix characters made by Make Prefix Character, including the
initially present C-X, do their work by calling the contents of
q-register .P, providing the dispatch table as an argument. .P reads
the input character, extracts the definition of the subcommand, and
returns it. The prefix character itself then calls whatever .value P
returns. You are free to redefine .P to get different behavior, as
long as you respect the interface conventions. Take a look at the
source code for ^^ Prefix Character Driver, which is the default
contents of .P.
Making Self-documentation Work for Prefix Characters.
In order for Where Is and Apropos to list all the ways a command can
be reached as a subcommand of a prefix character, all prefix
characters must be listed in QPrefix Char List. This list has a
very ugly format: there are six characters for each prefix
character. The first two contain the 9-bit code for the prefix
character; the top 2 bits in the first and the bottom 7 bits in the
second. The next four characters are the name of the q-register which
contains the dispatch table used by the prefix character. For
example, the default EMACS value of QPrefix Char List is ".X ".

File: CONV Node: Hooks, Up: Top, Previous: Prefix, Next: Dump
Hooks Provided by EMACS
EMACS offers several hooks in the form of variables whose values
will be executed if nonzero at specific times.
Buffer Creation Hook
This variable is executed when a new EMACS buffer is made by Select
Buffer, just after that buffer has been selected. It might use M.L to
add a local variable, in case you want a certain variable to be local
in each buffer. If you do this, you might want to change the global
value of Initial Local Count to the number of initial locals you
expect most buffers to have. It works to have a different number, but
such buffers are given local values of Iitial Local Count, which is
wasteful if not necessary. But if you do change Initial Local Count
globally, make sure you either create the additional locals in the
Main buffer at the same time, or give that buffer a suitable local
definition of Initial Local Count.
The Buffer Creation Hook is not run when a buffer is created by
Append to Buffer. This is obviously wrong, but since the buffer thus
created is never actually selected, there is no easy way to fix this.
Buffer Selection Hook
This variable is executed whenever a buffer has just been selected.
It is most likely to be useful when made local to a particular buffer.
Buffer Deselection Hook
This variable is executed whenever a buffer is just about to be
deselected. It is most likely to be useful when made local to a
particular buffer.
Visit File Hook
This variable is executed whenever a file has been visited. All the
normal actions of visiting are already complete.
Set Mode Line Hook
This variable is executed by & Set Mode Line. If it returns a
string pointer as a value, that string will be stuck into the mode
line just before the closeparen. The purpose of this variable is to
allow libraries which have state variables to display them in the mode
line. So that several libraries can do this without interfering with
each other, each library should append its own hook to the variable
Set Mode Line Hook instead of setting it, and each library's
contribution must be able to accept an argument from a previous
library's contribution and append onto it. For example, a reasonable
string to add " FOO" into the mode line would be:
+0[1 FQ1"L :I1' :I* 1_FOO (]1)
This string, at the beginning of Set Mode Line Hook, would return a
string containing just " FOO"; if preceded by another such hook, it
would append the " FOO" onto what that other hook tried to return.
<libname> Setup Hook
Each library's & Setup <libname> Library macro should check for the
existence of a <libname> Setup Hook variable, using 0FO..Q. If the
variable exists and is nonzero, the setup macro should execute the
variable INSTEAD of its normal actions.
<Mode> Mode Hook
Each major mode executes a mode hook variable after making its
normal redefinitions, but before updating the mode line. Mode hooks
can create additional local variables or local q-registers (including
local ^R command redefinitions).

File: CONV Node: Dump, Up: Top, Previous: Hooks, Next: Build
Dumping an EMACS Environment.
Dumping an EMACS environment so that it can be loaded and run again
is no simple feat. Since the environment, when dumped (with @EJ),
contains absolute pointers into the main EMACS library, we must make
sure that when the environment is run again the same version of that
library will be at the same place in the address space. This is
accomplished by the Dump Environment command in the PURIFY library.
The Dump Environment command in the PURIFY library has the ability
to dump out an EMACS environment so that, when loaded, it will reload
the same libraries that were loaded at dumping time - the same
versions, even, if multiple versions of the libraries are maintained.
Before calling Dump Environment, you must decide which of the loaded
libraries are to be reloaded by the dump file. Given such a library,
called (say) "Mumble", you must set up a variable QMumble Library
Filename containing the filename to be used to reload that library.
This filename can contain a version number, if you are interested in
loading the same version as the dumped environment was made with (this
is necessary if any pointers to macros in that library exist in
q-registers or ^R character definitions, etc.).
Only libraries for which such variables are created will be reloaded
by the dumped environment. Not all loaded libraries must be included,
but those which are must be contiguous, and include the first one
loaded.
In addition, before calling Dump Environment you must specify the
TECO commands to be executed when the dump file is reloaded. This is
done by creating a variable named QMM & Startup Mumble, where Mumble
stands for the contents of QEditor Name. For EMACS, it is
called QMM & Startup EMACS. The contents of q-register ..L are NOT used
when the dump file is started up, but they will reappear in ..L after
start up so that they will be run if the restarted dump file is
stopped and started again. The QMM & Startup Mumble variable is killed
by Dump Environment, since it will be no use afterward. Actually, if
you wish, you can have a command named just & Startup Mumble in one of
the libraries to be reloaded by the dump file, instead.
The contents of q-register ..L when Dump Environment is called are
NOT used to initialize the dump file when it is reloaded. However,
they do persist in ..L when the reloaded dumped environment is
running, and if that job is stopped and restarted again, the ..L will
be used.
If your EMACS init file takes a long time to run, you can use Dump
Environment yourself after running the init file. The QEMACS Library
Filename variable remains set up, so you need not worry about getting
the right version of it. Just set up variables for the other
libraries that you want loaded, provide a suitable QMM & Startup
EMACS, and call Dump Environment.

File: CONV Node: Build, Up: Top, Previous: Dump, Next: Wall Charts
How to Build and Dump a New EMACS.
Before building a new dumped EMACS, you must of course Generate
up-to-date versions of the essential libraries. This can be done by
M-X RunEINIT? Generate
The visible procedure for building a new EMACS is simply to do
:NTECO EMACS;
which runs EMACS;.TECO. (INIT) in NTECO. This leaves you in the TECO
top-level loop, typing TECO command strings, and should display an
EMACS-style mode line. Then, to dump the EMACS, type
MMRunPURIFYDump<filename>
which will dump the environment you have built. Then kill the job.
How Building and Dumping Work
Building a new EMACS environment has three phases: loading
libraries, creating the "essential environment" necessary for EMACS
macros to work at all, and making the default set of command bindings.
Two other minor operations are the loading of the patch file, and the
purification of variable names. The first phase is straightforward:
it simply loads the latest version of [PURE] :EJ, and also the EINIT
library which contains the code for performing the rest of the
initialization.
Loading the essential environment is done by the & Load Essential
Environment command in EINIT. This sets up things like q-registers
.M, .L, .V, .A, etc. as well as the option variables which many
commands assume the existence of. Part of loading the essential
environment is loading the patch file EMACS;EPATCH >, which contains
corrected versions of macros changed since [PURE] was generated. The
format of EPATCH is just that of a library source file; EPATCH is
read in and MM Compile One Macro is done on each page of it.
Loading the default EMACS environment is done by & Load Default
Environment in EINIT. This is what defines C-N to run ^R Down Real.
The reason why it and & Load Essential Environment are not combined is
so that other command environments which use the EMACS execution
environment can be easily built. Building such an environment would
involve calling & Load Essential Environment, and then using something
else instead of & Load Default Environment.
At the end of building the environment, the variable names are
purified. In order to save a few hundred words of impure core for all
users, the predefined variables' names and their comments are made to
live inside the [PURE] file instead of in impure string space. The
necessary strings are created in [PURE] by the special file VARS,
which is included in the generation of the [PURE] library. It inserts
the strings into the [PURE] file inside of another string, so that
they are conveniently out of the way. Then, the Purify Variables
command in EINIT is used to look at each variable and replace its
impure name with the corresponding pure string, if there is one.
How Stand-alone RMAIL and INFO are Built and Dumped.
Stand-alone INFO differs from an EMACS in that, on start-up, instead
of running the user's or the default init file, a particular procedure
(that of entering ^R-mode and then running MM INFO) is followed.
INFO is built by an EMACS init file which calls Dump Environment,
setting Editor Name to INFO and providing an appropriate MM & Startup
INFO macro to be used to start up the dump file when it is reloaded.
On the practical level, the EMACS init file for INFO actually
dumps the INFO, instead of returning and letting the user dump it.
Stand-alone RMAIL is dumped by a TECO init file instead of an EMACS
init file, because while stand-alone INFO contains the standard EMACS
^R command definitions, stand-alone RMAIL contains the bare TECO ^R
command definitions. It therefore cannot be built starting from a
whole EMACS.
New versions of stand-alone RMAIL and INFO must be made for each new
TECO or EMACS version, just like new versions of the EMACS dump file.
The stand-alone RMAIL and INFO always load up the current version of
the RMAIL and INFO libraries, rather than the version which was
current when they were dumped, so new RMAIL and INFO dump files do not
generally need to be made when new versions of those libraries are
installed.

File: CONV Node: Wall Charts, Up: Top, Previous: Build, Next: Qregs
Making Wall Charts
Wall Charts are made by MM RunABSTRWall Chart<prefix chars>
with an empty buffer. This produces a wall chart in the buffer,
describing the environment as it exists. <prefix chars> is a list of
names of prefix characters, each of which should get a page describing
all of its subcommands. The prefix characters are named as if you
were accessing their definitions as q-registers, such as ".X" for
C-X. The names should be separated by Altmodes. Two Altmodes end the
list of prefix character names.
Writing the Documentation Files EMACS CHART and EMACS DOC.
These two files are produced from the self-documentation strings
within EMACS by the macros in the library ABSTR. Simply doing
M-X RunEINIT? Document
will update them according to the current environment. Make sure that
you do this as a user who does not have an init file! Otherwise, the
files will reflect your command definitions rather than the default.

File: CONV Node: Qregs, Up: Top, Previous: Wall Charts, Next: FS^RPREV
Usage of Q-registers in EMACS and Macros Intended for EMACS
EMACS makes no use of non-dot q-regs except as saved and restored
local variables, unless the user explicitly requests such use
with (say) ^XB or ^XX, except for M and R, and even those are not
depended on by the EMACS macros. User macros may use non-dot q-regs
freely, but those intended for general use should not do so except as
local variables (pushed and popped).
User macros should not use single or double dot q-regs except as
listed here. If it is really essential, you should ask RMS to
allocate another single-dot q-reg for a specific use. Normally, a
named variable is just as good.
.A MM & Autoload. This macro loads a library temporarily
and returns a pointer to a specified macro in it.
For example, M.A DIREDClean Dir loads the DIRED
library and returns a pointer to the Clean Dir macro
in it. FS :EJPAGE is pushed and left on the stack,
so that the library will be flushed when the macro
which invoked M.A exits and unwinds the stack.
.B The buffer table. This is a q-vector which is
subdivided into a section for each EMACS named buffer.
The details of the format are described in a comment
at the front of the EMACS source file BUFFER.
.C Set Variable Comment.
Like .V, but creates a comment for the variable.
<val>M.C <var> <comment> creates <var> if necessary,
giving it the comment <comment> and the value <val>.
<val> defaults to 0. If the comment starts with
"*", then the variable is an "option"
and MM Alter Options will let the user edit it.
.F The "normal" (top-level) contents of ..F.
When .F and ..F are not the same, EMACS knows that
it is not safe to switch buffers, windows or files.
.F should not be zero; that would lose. See ..F.
.H The horizontal position "goal" for ^N and ^P
commands. If it is a small positive number, it
is a temporary goal, which will be reset by
each ^N or ^P not following another such. The
other possible values in .H are 1000000. plus a
small number, which indicates a semipermanent goal
that was established by ^R Set Goal Column and
which it alone can alter.
.I ^^ Prepare for Input. Do M.I before doing an
FI to read input. The second argument, if any
is the character to prompt with (default is in Q..0).
The first argument is bit-decoded: 1 means that
the control and meta prefix characters should be
noticed, and 2 suppresses prompting and echoing
(acts as if the characater being read is an independent
command).
.L Make Local Variable. Do M.L <var>  to make <var>
into a local variable of the current buffer.
If it already is local, nothing is changed. If
<var> didn't exist at all, 0M.V <var> is implied.
The global value of <var> is not changed; the local
<var> starts off with that same value as well.
If M.L is given a numeric argument, it becomes
the new value of the (local) <var>.
.M ^^ Macro Get. M.M<name>$ returns a pointer to
the macro <name>. Normally, an error will
occur if the name is undefined or ambiguous,
but if 1, is given as argument, instead of an error,
the value 0 or 1 will be returned. Independently,
a pointer to a file can be given as an argument,
and the macro will be looked for in that file.
.N The ring buffer of minibuffer commands. All commands
that use the minibuffer and execute its contents
normally push their commands onto this ring,
so you can run them again easily. Q.N is a q-vector
whose 0th element is the most recent minibuffer.
.P M.P is the driver for "prefix" ^R characters,
which read another character and dispatch on it.
Whatever you put in .P should work like what is
usually put there: ^^ Prefix Character Driver.
See Make Prefix Character.
.V Named Variable maker. (Teco "altmode" Q-regs)
.W Is a flag that determines whether the word commands
refer to LISP atoms. It holds either a null string
(if they do not) or an "@" (if they do).
..F normally holds the auto-filing secretary macro.
Auto-saving is turned off by zeroing FS ^R MDLY,
not by changing ..F. Normally, .F contains the
same thing as ..F. Macros which call ^R recursively
should bind ..F to 0, thus inhibiting auto-saving.
Also, the fact that .F and ..F will then be different
will serve as an indication that it is not safe to
switch buffers, files or windows. If you use a
modified version of the secretary macro, you must
store it in both ..F and .F for proper operation.
To turn off the secretary macro globally, you should
not simply set .F and ..F to zero, because then the
functions that bind ..F to zero will not make it
different from .F. You must make a null string and
put it in .F and ..F.
..K A qvector used to hold strings of deleted text
by the ^R Kill ... and ^R Un-kill commands.
The elements are the strings, in the order they
were killed. The beginning may be filled with zeros,
if there are not enough remembered killed strings
to use the whole qvector.
..M holds the keyboard macro call stack.
See the file KBDMAC.

File: CONV Node: FS^RPREV, Up: Top, Previous: Qregs, Next: Debug
FS ^R LAST / FS ^R PREV Convention
Some commands set FS ^R LAST to a special value not in
the range of 9-bit characters, to make it possible to test
whether the previous command was in a certain class without
having to know which characters various macros are on.
These are the values used:
512+27 is set at times in minibuffering, when the
(1033 octal) most recent character was an altmode but a
following altmode should not exit.
1001 (decimal) is set by deleting commands.
This allows multiple consecutive deletions
to be combined in the ..K ring.
1002 is set by the vertical-motion commands
so that repeated vertical motion commands
can use the same horizontal position as a goal.
1003 signals that it is OK for m-Y (^R Un-kill Pop)
to work even though the current region is not
on the kill-ring. This is used by commands like
Fill Region which save the region then do a simple
but possibly dangerous transformation to it.

File: CONV Node: Debug, Up: Top, Previous: FS^RPREV
Debugging
For debugging, make use of the macro MM TCompile, which compresses
the definition of the macro you are pointing at and makes it available
to M.M. This makes it possible to test a new version of a macro
without purifying the whole file containing it. Insert a ^R command
into the definition to make a "breakpoint" which will allow you to
look around. Exiting the ^R will cause execution of the macro to
resume. To test-compile the macro and put it on a character, give the
name of the character as a q-register as an argument to MM Tcompile,
as in MM TCompile.N to set C-N's definition. Any q-register name
is allowed there.
The default EMACS error handler runs MM Backtrace after every
error, if the first character you type is "?". This feature allows
you to examine the stack, as well as all q-registers and other
variables. MM DescribeBacktrace for details. If QDebug is
nonzero, you can type "?" to get a backtrace after a quit as well as
after an error.
*note TDEBUG: (TDEBUG)Top, for info on the superb TDEBUG package
which allows you to step through the execution of a macro,
and examine the macro and q-register pdls.


1162
src/e142/datamedia. Normal file

File diff suppressed because it is too large Load Diff

1062
src/e142/datamedia._ej Normal file

File diff suppressed because it is too large Load Diff

77
src/e142/datamedia.basic Normal file
View File

@@ -0,0 +1,77 @@
Here's the barest minimum you need to get started with EMACS/Datamedia:
In EMACS as soon as you type any character, some action is
performed, and you see the resulting buffer. Generally, graphic,
printing characters insert themselves, while control characters do
the editing. So, to insert some text, just type it. To make
corrections, you use the control characters.
Control characters are designated by a prefix. "M-" stands for
meta. To type meta characters, hold down the "edit" key as you type
the character. "C-" stands for control. If the command has a "C-M-"
prefix, hold down both the ctrl and edit keys as you type. Here is
a simple description of what various control characters do:
M-> Move forward one character.
M-< Move backward one character.
M-D Delete next character.
Rubout Delete last character.
M-[ Move to beginning of this line.
M-] Move to end of this line.
M-lf Move to next line.
M-^ Move to previous line.
M-K Kill rest of line.
M-N uN-kill what was just killed, inserting it
into the buffer at the current position.
M-M Mark this place in the buffer.
C-M-K Kill from here to marked place.
(M-N will uN-kill C-M-K-killed text too.)
M-= Clear screen, redisplay buffer.
C-G "Quit". Stops whatever EMACS is doing.
C-C Exit from EMACS.
C-X or M-X
Prefix character: follow with another character to
make a 2-character C-X or M-X command. C-X and M-X
are equivalent in every way.
C-X C-V Visit a file. See below.
C-X C-S Save the file you are visiting.
An easy way to move text around is to kill it, move, then uN-kill.
You can uN-kill any number of times to create copies in different
places.
If you want to edit text and save it after one session, you must
put it in a "file". To do this, type the C-X C-V command, followed by
the name you would like to use for your file. When you have finished
typing the filename, end it with a carriage-return ("<CR>", as we say).
"(New File)" will be printed at the bottom of the screen, and the
file's name will appear in the line which starts with "EMACS (" near
the bottom. Now you are ready to type in the text of the file.
When you specify the name of a file, you should usually give only
the filename and the extension. The directory will default to your
own (or to that of the file you are already visiting). You need not
specify the directory unless it is different.
After you have typed for a while, type C-X C-S to "save" what you
have added to the file so far. The text doesn't really go into the
file until you save it. After saving, you can edit some more and
save again, etc. If the system crashes, you can't lose anything which
you have saved already. Each save writes a new version of the file,
with a larger version number, so that old saves do not go away.
When you want to switch to writing a different file, just use the
C-X C-V command again. The same command allows you to make changes in
an old file. If you do C-X C-V when you have made changes to a file
but not saved them, EMACS will ask you whether to save them. You
should type either "Y" or "N" as the answer. Or type C-G to quit,
look around to decide what to do, save or not, and repeat the C-X C-V.
Don't ever be afraid to quit.
If you need more help, you can get it by typing the Help
character which you used in order to see this. You typed Help B;
typing other things after Help gets other kinds of help.
Remember that the Help character is the same as the "hold" key on
the Datamedia terminal.

178
src/e142/datamedia.chart Normal file
View File

@@ -0,0 +1,178 @@
EMACS/DATAMEDIA COMMAND SET
as of November 17, 1978
(Parentheses indicate not implemented yet)
Ctrl or *Bare Edit Edit-Ctrl Edit-X
---- -- ----- ---- --------- ------
< Backward Character <
> Forward Character >
( Backward Word Backward End-of-Word (
) Forward Word Forward End-of-Word )
[ Beginning of Line Back to Indentation [
] Prefix Meta End of Line (Move to Comment Column) ]
^ Prefix Control Up Real Line Up Comment Line ^
lf * Indent New Line Down Real Line Indent New Comment Line lf
cr * insert CRLF Next Line Down Comment Line cr
{ Goto Beginning Mark Beginning {
} Goto End Mark End }
+ View Previous Screen +
\ Prefix Control-Meta View Next Screen \
| Move to Screen Edge |
~ Reposition Window ~
= New Window Where am I =
del * Delete Chars Bkwds Backward Kill Word Bkwd Kill to Word End del
_ [hold] Describe _
tab * insert tab Nested Indent Indent Rigidly tab
* Multiply Arg by 4 *
; Indent for Comment Set Comment Column ;
esc * Prefix Meta Prefix Control-Meta esc
/ Define Kbd Macro Call Last Kbd Macro /
? Describe ?
1 1 Window 1
2 2 Windows 2
@ Mark sentence Mark paragraph @
A (Again) Append Next Kill A
B Backward sentence Backward paragraph B
C Exit Center line [^C] (Center Region) C
D Delete Character Kill Word Kill to End-of-Word D
E Exchange Characters Exchange Words (Exchange Lines) E
F Forward sentence Forward paragraph F
G Abort Go to Fixed Mark [^G] G
H Set Bounds Region Set Bounds Full H
I [tab] Insert CRLF after point [Edit-tab] I
J [lf] [Edit-lf] J
K Kill Line Kill Region Kill into Q-reg K
L Insert Page Mark Lowercase Word Lowercase Region L
M [cr] Set Fixed Mark [Edit-cr] M
N No-op uNkill uNkill Pop Get Q-register N
O Complement Overwrite Mode Other Window O
P Go to Page Mark Page Set Bounds Page P
Q Quote next char Fill Paragraph Fill Region Set Fill Column Q
R Reverse Char Search Reverse Incr Search Query Replace R
S Character Search Incremental Search TECO Search S
T T
U Uppercase Word Uppercase Region Uppercase Initial U
V V
W Bkwd Kill Word Copy Line Copy Region Put Q-register W
X ^X Prefix ^X Prefix Execute MM Command Execute Minibuffer X
Y Select Buffer List Buffers Y
Z Quit Zap to Character Zap thru Character Z
COMMANDS REDEFINED IN LISP MODE:
* indicates functions defined only in the INTERLISP-EMACS interface
Ctrl Edit Edit-Ctrl Edit-X
---- ---- --------- ------
tab Indent for LISP tab
@ Mark sexp (Mark list) (Mark up list) Mark DEFUN @
A * ARGLIST A
B Backward sexp Backward list Backward list Backward DEFUN B
D Kill sexp D
E Exchange sexps E
F Forward sexp Forward list Forward up list Forward DEFUN F
T * Print to Level * Prettyprint T
Y * Up Eval Y
Z * Exit to LISP Z
(See the file <BOYER>NEMACS.DOC for a description of the INTERLISP-EMACS interface.)
COMMANDS REDEFINED IN SAIL MODE:
Ctrl Edit Edit-Ctrl Edit-X
---- ---- --------- ------
@ (Mark List) (Mark Block) (Mark Statement) (Mark Procedure) F
B Backward List (Backward Statement) Backward Block (Backward Procedure) B
F Forward List Forward Statement Forward Block (Forward Procedure) F
V Make BEGIN END Make Named BEGIN END V
COMMANDS REDEFINED IN MACRO MODE:
Ctrl Edit Edit-Ctrl Edit-X
---- ---- --------- ------
B Go to AC Field Go to Previous Label B
F Go to Address Field Go to Next Label F
COMMANDS REDEFINED IN TECO MODE:
Ctrl Edit Edit-Ctrl Edit-X
---- ---- --------- ------
B Backward conditional Backward iteration B
F Forward conditional Forward iteration F
File commands:
^X ^D Directory Display
^X ^E Edit File
^X ^F Find File
^X ^Q Do Not Write File
^X ^R Read File
^X ^S Save File
^X ^V Visit File
^X ^W Write File
New macros written for this package:
^R Forward Word: Move forward over one word.
^R Forward End-of-Word: Move forward to the next word end.
^R Backward End-of-Word: Like Backward Word, but moves to end of
previous word.
^R Kill Word: Kill next word and trailing delimiters.
^R Kill to End-of-Word: Kill to next word end.
^R Backward Kill to End-of-Word: Like Backward Kill Word,
but kills to end of previous word.
^R Complement Overwrite Mode:
If Overwrite Mode is on, turn it off. If it is off,
turn it on. When Overwrite Mode is on, typed non-meta characters
will delete and overwrite characters in the buffer instead
of being inserted. Meta characters still function normally.
Goto Page: If no arg, go to top of next page.
If arg is zero, go to top of page.
If arg is negative, go to top of page, unless already at top,
in which case go to top of preceding page.
If arg is positive (+n), go to top of page n of buffer.
If two args (m,n), go to line m of page whatever.
^R Copy Lines: Like killing lines and getting them back,
but doesn't mark buffer modified.
^R Set Fixed Mark: If no arg, set "ring-of-point" mark.
If arg is zero or positive, set corresponding fixed mark.
There are 10 fixed marks, numbered 0 to 9. They contain character
counts relative to the beginning of the buffer. Fixed marks may
be changed only by this macro, and are unaffected by killing, etc.
^R Goto Fixed Mark: If no arg, exchange point and "ring-of-point" mark.
If negative arg, pop the "ring-of-point" mark.
If zero or positive arg, set "ring-of-point" mark and goto fixed mark.
^R Zap to Character: Kills text up to but not including a
target character. Uses the macro ^R Character Search to obtain
the target character from the keyboard and search for it.
The search skips over the character pointed to.
^R Zap thru Character: Kills text up to and including a
target character. Uses the macro ^R Character Search to obtain
the target character from the keyboard and search for it.
^R No-op: Does nothing.
^R TECO Search: Search, using the basic TECO string search facility.
Special characters:
^B matches any delimiter char.
^N matches any char other than the char following it in the search
string (i.e., "not"). ^N^B matches non-delimiters, and
^N^X matches nothing. ^N^Q^B matches all but ^B, etc.
^O divides the string into substrings searched for simultaneously.
Any one of these strings, if found, satisfies the search.
^Q quotes the following char, i.e., deprives it of special
significance. (You must type ^Q twice in the minibuffer).
Escape and rubout cannot be quoted.
^X matches any char.
Quit: Return to caller. Tries very hard to do the right thing
whether returning to SNDMSG, LISP, the EXEC, or recursive ^R.
^R Define Kbd Macro: Begin defining keyboad macro.
After you type this command, until you type it again,
everything you type becomes part of the accumulating keyboard
macro as well as being executed.

View File

@@ -0,0 +1,195 @@
EMACS ^R-Command Chart (as of 06/20/78 23:44:32):
DATAMEDIA EQUIVALENTS (as of 6 Aug 78)
Non-Control Non-Meta Characters:
M-< Backspace moves back one character (or several).
Tab ^R Indent According to Mode
Linefeed ^R Indent New Line
Return ^R CRLF
Altmode ^R Prefix Meta
Rubout deletes characters backwards.
Control Characters:
 .. ^R Complement SAIL Mode
M-< Backspace moves back one character (or several).
Tab ^R Indent According to Mode
Linefeed ^R Indent New Line
Return ^R CRLF
C-Z Altmode exits from ^R mode.
M-M Space ^R Set/Pop Mark
none % .. ^R Replace String
- .. is part of the next command's argument.
0 thru 9 is part of the next command's argument.
M-; ; .. ^R Indent for Comment
^X-{ < .. ^R Mark Beginning
none = .. ^R Print Hpos
^X-} > .. ^R Mark End
M-M @ .. ^R Set/Pop Mark
M-[ A .. ^R Beginning of Real Line
M-< B .. moves back one character (or several).
M-esc C .. ^R Prefix Control-Meta
M-D D .. deletes one character (or several) forward.
M-] E .. ^R End of Real Line
M-> F .. moves forward one character (or several).
G .. quits execution of any command.
M-< H .. moves back one character (or several).
I .. ^R Indent According to Mode
J .. ^R Indent New Line
M-K K .. ^R Kill Line
M-= L .. ^R New Window
cr M .. is bare TECO's Control-M
M-lf N .. ^R Down Real Line
M-I O .. inserts one CRLF (or several) after point.
M-^ P .. ^R Up Real Line
Q .. ^R Quoted Insert
none R .. ^R Reverse Search (USE M-MINUS M-S)
C-M-S S .. ^R Incremental Search
M-E T .. ^R Exchange Characters
M-* U .. ^R Universal Argument
M-\ V .. ^R Next Screen
C-M-K W .. ^R Kill Region
M-X X .. is a prefix character. See below.
M-N Y .. ^R Un-kill
Z .. ^R Return to Superior
esc \ .. ^R Prefix Meta
] .. is bare TECO's Control-]
^ .. ^R Prefix Control
Rubout deletes backwards, turning tabs into spaces.
Meta Characters:
lf Linefeed ^R Indent New Comment Line
^X-[ Return ^R Back to Indentation
Altmode ^R Execute Minibuffer
# .. ^R Change Font Word
C-M-R % .. ^R Query Replace
none ( .. ^R Make ()
none ) .. ^R Move Over )
- .. is part of the next command's argument.
. .. ^R Find Tag
/ .. ^R Describe
0 thru 9 is part of the next command's argument.
; .. ^R Indent for Comment
M-{ < .. ^R Goto Beginning
= .. ^R Count Lines Region
M-} > .. ^R Goto End
? .. ^R Describe
none @ .. ^R Mark Word
M-B A .. ^R Backward Sentence
M-( B .. ^R Backward Word
^X-U C .. ^R Uppercase Initial
C-M-D D .. ^R Kill Word
M-F E .. ^R Forward Sentence
^X-) F .. ^R Forward Word
C-M-Q G .. ^R Fill Region
C-M-@ H .. ^R Mark Paragraph
tab I .. ^R Tab to Tab Stop
^X-lf J .. ^R Indent New Comment Line
^X-D K .. ^R Kill Word
M-L L .. ^R Lowercase Word
^X-[ M .. ^R Back to Indentation
^X-cr N .. ^R Down Comment Line
^X-^ P .. ^R Up Comment Line
M-Q Q .. ^R Fill Paragraph
M-| R .. ^R Move to Screen Edge
M-C S .. ^R Center Line
C-M-E T .. ^R Exchange Words
U .. ^R Uppercase Word
M-+ V .. ^R Previous Screen
C-M-W W .. ^R Copy Region
C-M-X X .. ^R Execute Completed MM Command
C-M-N Y .. ^R Un-kill Pop
C-M-B [ .. ^R Backward Paragraph
M-D \ .. ^R Delete Horizontal Space
C-M-F ] .. ^R Forward Paragraph
none ^ .. ^R Delete Indentation
none _ .. ^R Underline Word
~ .. ^R Not Modified
Rubout ^R Backward Kill Word
Control-Meta Characters:
^X-@ Backspace ^R Mark Defun
none Tab ^R Indent for LISP
^X-lf Linefeed ^R Indent New Comment Line
^X-[ Return ^R Back to Indentation
C-M-B ( .. ^R Backward Up List
C-M-F ) .. ^R Forward Up List
- .. is part of the next command's argument.
0 thru 9 is part of the next command's argument.
none ; .. ^R Kill Comment
hold ? .. ^R Documentation
C-@ @ .. ^R Mark Sexp
^X-B A .. ^R Beginning of DEFUN
C-B B .. ^R Backward Sexp
C .. exits from ^R mode.
none D .. ^R Down List
C-M-F E .. ^R End of DEFUN
C-F F .. ^R Forward Sexp
none G .. ^R Format Code
C-M-@ H .. ^R Mark Defun
none I .. ^R Indent for LISP
^X-lf J .. ^R Indent New Comment Line
C-D K .. ^R Kill Sexp
^X-[ M .. ^R Back to Indentation
M-F N .. ^R Forward List
none O .. ^R Split Line
M-B P .. ^R Backward List
none Q .. ^R Indent SEXP
M-~ R .. ^R Reposition Window
C-E T .. ^R Exchange Sexps
C-M-B U .. ^R Backward Up List
M-A W .. ^R Append Next Kill
X .. ^R Execute MM Command
C-M-B [ .. ^R Beginning of DEFUN
none \ .. ^R Indent Region
C-M-F ] .. ^R End of DEFUN
none ^ .. ^R Delete Indentation
none Rubout ^R Backward Kill Sexp
Control-X is an escape prefix command with these subcommands:
C-M-Y ^X ^B List Buffers
C-Z ^X ^C ^R Return to Superior
^X ^D ^R Directory Display
^X ^E ^R Edit File
^X ^F ^R Find File
^X Tab ^R Indent Rigidly
C-M-L ^X ^L ^R Lowercase Region
^X ^N ^R Set Goal Column
^X ^O ^R Delete Blank Lines
C-M-P ^X ^P ^R Mark Page
^X ^Q ^R Do Not Write File
^X ^R ^R Read File
^X ^S ^R Save File
^X ^T ^R Mini Visited File
C-M-U ^X ^U ^R Uppercase Region
^X ^V ^R Visit File
^X ^W Write File
M-G ^X ^X ^R Exchange Point and Mark
^X Altmode ^R Re-execute Minibuffer
^X # ^R Change Font Region
^X . ^R Set Fill Prefix
^X 1 ^R One Window
^X 2 ^R Two Windows
^X 3 ^R View Two Windows
^X : ^R Set Column
^X ; ^R Set Comment Column
^X = ^R Where am I
^X A ^R Append to Buffer
M-Y ^X B Select Buffer
none ^X D ^R Dired
^X-Q ^X F ^R Set Fill Column
^X-N ^X G ^R Open Get Q-reg
^X I ^R Info
none ^X K Kill Buffer
^X L ^R Count Lines Page
^X M Mail
M-H ^X N ^R Set Bounds Region
^X O ^R Other Window
^X P ^R Set Bounds Page
^X R ^R RMAIL
C-M-H ^X W ^R Set Bounds Full
^X-W ^X X ^R Put Q-reg
none ^X ^ ^R Grow Window
^X _ ^R Underline Region

63
src/e142/datamedia.doc Normal file
View File

@@ -0,0 +1,63 @@
DATAMEDIA is a macro library that attempts to make EMACS more
accessible to the SRI user. It does this in three ways:
1. The command set has been rearranged and regularized, making
it easier to learn and easier to remember.
2. The command set is optimized for the Datamedia keyboard.
Maximal use is made of the keypad at the right side. Almost all
editing commands use the edit-key, some use the control-key as well;
there are very few commands that use the control-key alone.
3. Some new functions have been added, and others have been
modified, to provide additional capability.
If interest warrants, the EMACS documentation under the INFO subsys
could be rewritten to reflect the new functions. But for the
present, users new to EMACS should follow the following procedure:
List yourself copies of <EMACS>DATAMEDIA.CHART (it's formatted for
wide paper) and <EMACS>DATAMEDIA.CONVERSION. Start up EMACS, type ^_
(the "hold" key) followed by "I" to get yourself into the INFO
system, then follow directions. Whenever the documentation talks
about a particular command, (for example C-F,) look in your listing
of DATAMEDIA.CONVERSION to find the new equivalent (M-> in this
example). Locate the new command in DATAMEDIA.CHART so you can see
the relationship of this command to other commands.
Users already somewhat familiar with EMACS should find DATAMEDIA.CHART
self-explanatory.
To use the new command set, use the command MM Load$DATAMEDIA. (Type
Edit-X, "LOAD", escape, "DATAMEDIA", carriage return.) To have new
new command set automatically load whenever you use EMACS, copy the
file <AGIN>EMACS.INIT or the equivalent to your own directory.
Note that the commands that move forward and back by words or delete
words always move to the beginnings of words. The same commands with
a ^X prefix move to the ends of words. In the original EMACS it
depended on which direction you approached from.
Ten "fixed marks" have been provided in addition to THE mark. "The
region" is still defined by the pointer and THE mark; the additional
fixed marks provide the capability of designating some particular
spot in your file that stays put while you copy text elsewhere. With
no arguments, the new command M-M sets THE mark and the command M-G
goes to THE mark (Exchange Point and Mark). With a numeric argument
(0-9) they set or go to the corresponding fixed mark.
C-X and M-X provide the identical function in the new command set.
They are redundant for convenience in typing commands like C-X C-D
(Directory Display) or M-X M-D (Kill Word) without shifting bits in
mid-command.
The functions for editing LISP code sometimes double up on
keystrokes. For example, M-F will either be Forward Sentence or
Forward List depending on whether you are in LISP mode or some other
mode. There are ties to the Interlisp/EMACS interface, which allows
you to call EMACS directly from Interlisp to edit LISP functions and
S-expressions. The interface is documented in the file
<BOYER>NEMACS.DOC.
If you plan to make regular use of EMACS/Datamedia, send me a message
so I can keep you up to date on changes.
Jerry Agin (AGIN@SRI-KL)

279
src/e142/datamedia.msg Normal file
View File

@@ -0,0 +1,279 @@
30-Aug-78 12:52:43-PDT,180;000000000001
Date: 30 Aug 1978 1252-PDT
From: Agin
Subject: EMACS Simplified
To: system
Users and prospective users of the text editor EMACS should read
<EMACS>DATAMEDIA.DOC
-------
1-Sep-78 10:32:54-PDT,1180;000000000001
Date: 1 Sep 1978 1032-PDT
From: Agin
Subject: Changes to EMACS/Datamedia
To: EMACS/Datamedia Users:
Commands have been set up to give the user several options in the
setting of control and meta bits. There are three conventions:
1. Use the Ctrl and Edit keys on the Datamedia Keyboard.
2. Use Escape for Meta and either Edit-Escape or
Escape-Escape for Control-Meta. This usage is
similar to TVEDIT.
3. Use the three unlabeled keys on the left of the keyboard
(between ^L and ^A). The bottom key, ^^, is Prefix
Control. The middle key, ^], is Prefix Meta. The
top key, ^\, is Prefix Control-Meta.
The Execute Minibuffer command has been moved to ^X-X to free M-escape.
The commands that exchange characters, words, etc. have been moved
from "T" to "E", where they will be more mnemonic.
Back to Indentation has been assigned to ^X-[ .
A No-op macro has been implemented and assigned to C-N. Try it after
documentation commands, ^C, etc.
Replace String is no longer assigned to M-R. It turns out that it
replaces EVERY occurrence of the string. You can get that by typing
"!" to Query Replace.
Jerry Agin
-------
7-Sep-78 13:51:17-PDT,499;000000000001
Date: 7 Sep 1978 1351-PDT
From: Agin
Subject: ^Z Changes
To: EMACS/Datamedia Users:
^Z had erroneously been assigned to Exit ^R Mode, instead of Return
to Superior. This has now been fixed. The problem of accidentally
hitting ^Z and finding yourself in TECO should not happen any more.
A new macro called ^R Save and Return to Superior has been
implemented and assigned to ^X ^Z. This is the command to use to
exit from EMACS when called from inside SNDMSG, LISP, etc.
-------
12-Sep-78 17:09:50-PDT,1632;000000000001
Date: 12 Sep 1978 1709-PDT
From: Agin
Subject: Miscellaneous
To: EMACS/Datamedia Users:
A new function, "TECO Search" has been defined and assigned to ^X S.
This function uses some powerful features of the underlying TECO
that just ain't available thru the fancied-up "Incremental Search"
function. TECO Search uses the special character ^B to match any
delimiter, and ^X to match any character. ^N is used to negate a
match to the following character. ^O is an "or" function, dividing
the search string into substrings to be searched for simultaneously.
Both TECO Search (^X S) and Query Replace (C-M-R) use the minibuffer
to obtain their arguments. I'm thinking that it is a mistake to
do it this way--they could just as easily obtain their arguments in
the prompt area the way MM commands do. The price is that carriage
return can't be part of any argument, but the advantage is that
there's one unusual mode of input the user need not learn. Does
anyone have reactions? If I don't hear objections, I'll make the
changes soon.
Another troublesome matter concerns the various flavors of ^Z. I
discovered that you need the original definition of ^Z (Exit ^R
Mode) to get out of the "Edit Tab Stops" function. One fix is to
redefine Edit Tab Stops so it temporarily re-assigns ^Z to the
do what is necessary. This seems rather unclean, but on the other
hand, a system where you need to remember three different exit
functions that depend on what you're doing isn't very clean either.
Comments anyone?
The "Where am I" function (^X =) now gives the page and line.
Jerry
-------
13-Sep-78 16:39:37-PDT,384;000000000001
Date: 13 Sep 1978 1639-PDT
From: Riseman
Subject: EMACS Documenatation
To: agin
Gerry,
Is there any documentation file for EMACS which gives
a nice summary of the basic commands. I have listed some
of the nodes in INFO, but they are often long-winded and
provide too much detail to start. I also have listed
the Datamedia chart and conversion tables.
--Ed--
-------
13-Sep-78 17:23:55-PDT,989;000000000001
Date: 13 Sep 1978 1723-PDT
From: Agin
Subject: Re: EMACS Documenatation
To: Riseman
cc: AGIN
In response to your message sent 13 Sep 1978 1639-PDT
The node "Basic" in the INFO file is a reasonable summary of the basic
commands (modulo conversion to the Datamedia command set). If you
don't like poking thru windy explanations, you might prefer to use
some of the self-documenting features of EMACS. ^_ is the help character;
it is equivalent to the "hold" key. "^_ A FOO" will type the names
of all commands that have FOO in their names. ("A" here stands for
"Apropos".) "^_ D ^R DOWN LINE" types a complete description of the
command "^R DOWN LINE". ("D" for describe.) "^_ C <any keystroke>"
tells you what command is assigned to the key, and its description.
The data base for all these features gets automatically updated
whenever commands are changed, so it always corresponds to the version
you have in core at that given moment.
Jerry
-------
18-Sep-78 10:54:35-PDT,1470;000000000001
Date: 18 Sep 1978 1054-PDT
From: Agin
Subject: New features
To: EMACS/Datamedia Users:
cc: Boyer
Commands for editing LISP code have been added to the command set.
See the latest edition of DATAMEDIA.CHART for where they go. I am
indebted to Bob Boyer for supplying some redefinitions and character
tables to make it edit Interlisp. See the file <BOYER>NEMACS.DOC for
the description of a very nice interface that allows you to call EMACS
directly from Interlisp to edit LISP functions and S-expressions.
Note that editing commands get placed on different keys in the Datamedia
environment than Boyer uses in the default environment. In particular,
^Z is the return-to-LISP function.
^Z is now the universal pop-a-level character within the EMACS/Datamedia
environment. You should use it to return to SNDMSG or LISP, and to
return from recursive ^R. If you use it at any other time, it is
equivalent to ^C. The implementation of ^Z requires that functions
which invoke recursive ^R set up the return function. At present
only Query Replace and Edit Tab Stops know about ^Z. If you use or
know about other functions that call recursive ^R please let me know
so I can set them up to use ^Z also.
Query Replace and TECO Search now take their arguments from the echo
area rather than the minibuffer.
The Incremental Search function now recognizes M-S as equivalent to
^S and M-R as equivalent to ^R.
Enjoy!
Jerry
-------
6-Oct-78 09:30:35-PDT,497;000000000001
Date: 6 Oct 1978 0930-PDT
From: Agin
Subject: Changes
To: EMACS/Datamedia Users:
There's a new SAIL major mode for editing SAIL programs. Commands
are summarized in the newest edition of DATAMEDIA.CHART. Very little
of it is implemented now, but it'll grow.
The Help function is improved.
Buffer creation is smarter: It takes its major mode from whatever
was in effect previously. Auto-filling is local to buffers now, and
gets copied when a new buffer is created.
-------
25-Oct-78 09:23:23-PDT,2279;000000000001
Date: 25 Oct 1978 0923-PDT
From: Agin
Subject: Changes
To: EMACS/Datamedia Users:
The implementation of the Quit function (^Z) has been changed to
avoid changing all the functions that call ^R recursively. The way
it works now is that ^Z always leaves ^R mode--the smarts about
buffer saving, returning to SNDMSG or LISP, etc, are in what called
^R in the first place.
^Z when you are at the top level (and not in SNDMSG or LISP)
will save whatever file you are editing and exit to the EXEC.
CONTINUE after ^Z will return you to the edit.
To take advantage of this, you will need to change your
EMACS.INIT file. Replace the cryptic last line of the file with the
following:
MM Startup Datamedia
Alternatively, copy <AGIN>EMACS.INIT to your own directory.
More goodies in SAIL mode:
Forward Statement and Forward Block now work. They both
recognize comments (either the word COMMENT or a bare exclamation
point) and quotes. M-F is now Forward Statement and C-M-F is Forward
Block--they used to be the other way around.
Backward Block does NOT understand comments or quotes.
Someday I might get around to fixing it.
Make BEGIN-END (M-V) creates a BEGIN END pair. The
indentation level is determined by the position of the cursor at the
time you call it. Make Labelled BEGIN-END (C-M-V) reads a block name
from the echo area and puts it in quotes after the BEGIN and the END.
With either function, a numeric argument will place a semicolon after
the END.
Edit-tab has been modified so that a negative argument will
indent yay-many levels to the right of the preceding line's
indentation. The number of spaces in one level is determined by the
variable Indentation Increment. This variable may be set in your
INIT file--see <AGIN>EMACS.INIT, for example. (Note that setting
Indentation Increment must occur AFTER the call to MM Datamedia.)
You can also change this variable using MM Alter Options. Its
initial value is 1.
The default search pattern for Character Search is now kept
separately from the default for incremental and string searches.
Forward and Back DEFUN have been added to LISP Mode.
TECO Mode has been modified to make M-F and M-B be Forward
and Back TECO Conditional.
Enjoy!
-------
9-Nov-78 14:01:52-PST,2083;000000000001
Date: 9 Nov 1978 1401-PST
From: Agin
Subject: New Goodies!
To: EMACS/Datamedia Users:
A new EMACS was put up November 6. It's winningest new feature is
Keyboard Macros!!! Your keystrokes can be remembered and played back
just like TVEDIT strings. I've adapted them for Datamedia.
To start a Keyboard macro definition, type M-/. The word
"Defining" will appear in your mode line. Everything you type will
be remembered, until you type another M-/ to end the definition.
M-X / re-executes the last defined keyboard macro.
Keyboard macros can be named and can also be assigned to
keystrokes. Use MM Name Kbd Macro$. You will be prompted for "^R
Command to define:" Type a control character (or M-X character).
If you try to redefine certain characters, EMACS will complain.
If you supply a text arg to MM Name Kbd Macro$ the keyboard
macro will be given a name. If you name your macro FOO, then MM FOO
will run it now.
MM View Kbd Macro will display the contents of any keyboard
macro. It needs either a control-character to which a keyboard macro
has been assigned, or M-X /.
Autosave Filename is now defaulted to AUTOSAVE..1000nn, where nn is
your job number, on your login directory. In this way, auto saving
needn't fill up your directory with multiple deleted files. ^X ^S
will write to the "permanent" file name rather than the Auto Save
File, unless you give it an arg of 0. ^Z saves your file and cleans
up (deletes) auto save files.
Goto Page (M-P) doesn't leave the mark behind any more.
Typing C-M-S in Incremental Search (C-M-S) will start a new search.
Either C-S or M-S will repeat the previous search.
You'll find Overwrite Mode (C-M-O) is much nicer to use now.
Other miscellaneous improvements have been reported in past BBOARD
messages from RMS@MIT-AI. Use MSG to peruse <BBOARD>MAIL.TXT.
I'm thinking of putting Reverse Character Search on M-R, Reverse
Incremental Search on C-M-R, and moving Query Replace over to M-X R.
Does anybody have any reactions or preferences?
Jerry Agin
-------

3
src/e142/datamedia.users Normal file
View File

@@ -0,0 +1,3 @@
EMACS/Datamedia Users: Agin, Barrow, Feiertag, Heathman, McGhie,
Quam, Riseman, Untulis, McLure
Rindfleisch@SUMEX-AIM, Rubenstein@SUMEX-AIM, Sweer@SUMEX-AIM

BIN
src/e142/dired._ej Normal file

Binary file not shown.

1167
src/e142/dmacs._ej Normal file

File diff suppressed because it is too large Load Diff

363
src/e142/dmacs.teach Normal file
View File

@@ -0,0 +1,363 @@
You are looking at the DMACS tutorial. Original authorship was by
Rubenstein@Sumex-AIM and McLure@SRI-KL. This version has been
adapted for the DMACS command set by Agin@SRI-KL.
DMACS commands are generally prefixed by the CONTROL key or the META
(sometimes labelled EDIT) key. Rather than write out META or CONTROL
each time we want you to prefix a character, we'll use the following
abbreviations:
C-<char> means hold the CONTROL key down and type a character.
M-<char> means hold the META key down while typing a character.
Thus, C-F would be hold the control key and type F. You will often
be asked to type characters to see how they work; don't actually do
this, however, until you see >> at the left of the screen.
For instance:
<<Blank lines inserted here by startup of TEACH-DMACS>>
>> Now type M-\ (View next screen) to move to the next screen.
(go ahead, do it by depressing the edit key and \ together).
Note that there is an overlap when going from screen to screen; this
provides some continuity when moving through the file.
The first thing that you need to know is how to move around from
place to place in the file. You already know how to move forward a
screen, with M-\. To move backwards a screen, type M-+ (depress the
edit key and type +.
>> Try typing M-\ and then M-+ to move back and forth a few times.
SUMMARY
-------
The following commands are useful for viewing screenfuls:
M-\ Move forward one screenful
M-+ Move backward one screenful
M-= 'Refresh' the current screen.
>> Try M-= now. (You'll notice that it centers the screen where
the cursor currently is. If this happens to move this text off the
screen, just do a M-\ to see it again.) Do a M-= for refresh.
BASIC CURSOR CONTROL
--------------------
Getting from screenful to screenful is useful, but how do you
reposition yourself within a given screen to a specific place?
There are several ways you can do this. One way (not the best, but
the most basic) is to use the commands previous, backward, forward
and next. As you can imagine these commands (which are given to
DMACS as M-^, M-<, M->, and M-lf respectively) move the cursor from
where it currently is to a new place in the given direction. Here,
in a more graphical form are the commands:
Previous line, M-^
:
:
Backward, M-< .... Current cursor position .... Forward, M->
:
:
Next line, M-lf
These are the basic cursor positioning commands and you'll be using
them ALL the time so it would be of great benefit if you learn them
now.
>> Try doing a few M-lf's to bring the cursor down to this line.
Move into the line with M-<'s and up with M-^'s. Now use
these four commands to play around a little. Try moving off
the top of this screen and see what happens.
When you go off the top or bottom of the screen, the text beyond
the edge is shifted onto the screen so that your instructions can
be carried out while keeping the cursor on the screen.
A faster way to move around is to move by words or even entire
sentences. Here is a summary of simple moving operations including
the word and sentence moving commands:
M-> Move forward a character
M-< Move backward a character
M-) Move forward a word
M-( Move backward a word
M-lf Move to next line
M-^ Move to previous line
M-[ Move to beginning of line
M-] Move to end of line
M-B Move back to beginning of sentence
M-F Move forward to end of sentence
M-{ Go to beginning of file
M-} Go to end of file
>> Try all of these commands now a few times for practice.
Since the last two will take you away from this screen,
you can come back here with M-+'s and M-\'s. These are
the most often used commands.
Like all other commands in DMACS, these commands can be given
arguments which cause them to be executed repeatedly. The way you
give arguments is by prefixing with M- the number of times you want
it repeated. For instance, M-8 M-> moves forward eight characters.
>> Try giving a suitable argument to M-lf or M-^ to come as close
as you can to this line in one jump.
The only apparent exception to this is the screen moving commands,
M-\ and M-+. When given an argument, they scroll the screen up or
down by that many lines, rather than screenfuls. This proves to be
much more useful.
>> Try typing M-8 M-\ now.
Did it scroll the screen up by 8 lines? If you would like to
scroll it down you can give an argument to M-+.
INSERTING AND DELETING
----------------------
If you want to type text, just do it. Characters which you can see,
such as A, 7, *, etc. are taken by DMACS as text and inserted
immediately. You can delete the last character you typed by doing
<Delete>. More generally, <Delete> will delete the character immediately
before the current cursor position.
>> Do this now, type a few characters and then delete them
by typing <Delete> a few times.
Remember that most DMACS commands can be given a repeat count; Note
that this includes characters which insert themselves.
>> Try that now -- type M-8 * and see what happens.
You've now learned the most basic way of typing something in
DMACS and correcting errors. You can delete by words or lines
as well. Here is a summary of the delete operations:
<Delete> delete the character just before the cursor
M-D delete the next character after the cursor
C-M-D kill the next word after the cursor
M-K kill from the cursor position to end of line
M-<Delete> kill the word immediately before the cursor
Now suppose you kill something, and then you decide that you want to
get it back? Well, whenever you kill something bigger than a
character, DMACS saves it for you. To uNkill it back, use M-N. Note
that you don't have to be in the same place to do M-N; This is a
good way to move text around. Also note that the difference between
"Killing" and "Deleting" something is that "Killed" things can be
uNkilled back, and "Deleted" things cannot.
For instance, type M-lf a couple times to postion the cursor
at some line on this screen.
>> Do this now, move the cursor and kill that line with M-K.
Note that a single M-K will kill the contents of the line, and a
second M-K will delete the line itself, and make all the other lines
move up. If you give M-K a repeat count, it will delete that many
lines AND their contents.
The text that has just disappeared is saved so that you can
retrieve it. To retrieve the last killed text and put it where
the cursor currently is type M-N.
>> Try it; type M-N to uNkill the text back.
Think of M-N as if you were uNkilling something back that someone
took away from you. Notice that if you do several M-K's all at once
the text that is killed is all saved for you so that if you want
it back you can uNkill it back.
>> Do this now, type M-K several times.
Now to retrieve that killed text:
>> Move the cursor down a few lines and type M-N to retrieve the
lines that you killed. This is how you move text from place
to place. You can even make copies of a line by killing it
and uNkilling it back as many times as you want. Remember
that when you have just killed text, it stays with you so
that if you move your cursor elsewhere in the text and
then M-N to uNkill back the killed text, you will have
a method for moving text around in a file.
MODE LINE
---------
If DMACS sees that you are typing commands slowly it shows them to
you at the bottom of the screen in an area called the echo lines.
This is just the last few lines at the bottom. The line immediately
above these is called the MODE LINE. You may notice that it begins
with DMACS (Text) ...more stuff... This is a very useful
'information' line. To understand DMACS it is best to consider that
it operates in a variety of modes. The default mode is Text which is
what you are in now. There are modes for editing different languages
and text, such as LISP mode, SAIL mode, etc. The mode line serves to
show you various things about your current state. For instance, on
the mode line here you'll notice that it says Main. DMACS operates
with things called buffers. This is a place that it puts your file
while you are editing it. There are names for buffers. The default
buffer upon startup of DMACS is Main. You'll notice that after the
Main and before the --nn%-- comes the filename DSK:<your directory>
TEACH-DMACS.TUTORIAL. This is the name of your own temporary copy of
the text of the DMACS tutorial; the file you are now visiting.
SEARCHING
---------
DMACS can do searches for strings (these are groups of
contiguous characters or words) either forward through the
file or backward through it. To search for the string
means that you are trying to locate it somewhere in the
file and have DMACS show you where the occurences of the
string exist. This type of search is somewhat different
from what you may be familiar with. It is a search that
is performed as you type in the thing to search for. The
command to inititate a search is C-M-S for forward search,
and C-M-R for reverse search. BUT WAIT! Don't do them now.
When you type C-M-S you'll notice that the mode line changes
to 'I-Search' and below it you get 'Search:' This tells
you that DMACS is in what is called an incremental search
waiting for you to type the thing that you want to search
for.
>> Now type C-M-S to start a search. SLOWLY, one letter at a time,
type the word 'cursor', pausing after you type each
character to notice what happens to the cursor.
Did you see what happened? DMACS, in an incremental search, tries
to go to the occurence of the string that you've typed out so far.
To go to the next occurence of 'cursor' just type M-S. If no
such occurence exists DMACS beeps and tells you that it is a failing
search. To get out of a search tell DMACS that you want to stop
searching with <ESC>. More generally, DMACS can be told to stop
whatever it is doing with C-G so you could also type C-G.
If you are in the middle of an incremental search and type <Delete>,
you'll notice that the last character in the search string is erased
and the search backs up to the previous occurence of that string. For
instance, suppose you currently have typed 'cu' and you see that your
cursor is at the first occurence of 'cu'. If you now type <Delete>,
the 'u' on the search line is erased and you'll be repositioned in the
text to the occurence of 'c' immediately before the first 'cu'. This
provides a useful means for backing up while you are searching. Also,
if you are in the middle of a search and happen to type a control
character, the cursor will go back to the place where you originally
started the search.
The C-M-S starts a search that looks for any occurence of the search
string AFTER the current cursor position. But what if you want to
search for something earlier in the text? To do this one should
type C-M-R for Reverse search. Everything that applies to C-M-S applies
to C-M-R except that the direction of the search is reversed.
EXTENDING THE COMMAND SET
-------------------------
There are many, many more DMACS commands than could possibly be put
on all the control and meta characters. DMACS gets around this with
the X (eXtend) command. This comes in two flavors:
C-X Character eXtend
M-X Character eXtend
C-X or M-X is always followed by another character that tells what to
do. The second character may or may not require the CONTROL key,
depending on the command. But the META key never has any effect.
There are many C-X commands. The ones you need immediately are:
C-X C-V Visit file. This is how you read in a file
to edit it. When you type this, DMACS asks
you for a file name to visit. You would respond
with the name of the file. Then DMACS brings it
in for editing. If the file doesn't exist, then
DMACS assumes that you are creating a new file.
C-X C-S Save file. This is a command that tells DMACS
to save the file you are currently looking at
onto disk. It is recommended you give this
ocassionally to prevent losing any work in the
case of a system crash.
There is another way to extend the DMACS command set:
C-M-X Named command eXtend
Named eXtend commands are commands which are used even less
frequently, or commands which are used only in certain modes. An
example of this type of command is the Replace command. When you
type C-M-X, DMACS will prompt you at the bottom of the screen with MM
(DMACS calls named eXtend commands MM commands) and then you can
type the name of the command you want to execute, in this case,
"Replace String". Just type "REP<esc>" and DMACS will complete the
command. Then you type the string that you want to replace, an
<esc>, the string you want to replace it with, and a return.
>> Try this now; type C-M-X rep<esc>try<esc>you can do<return>
See how the previous line changed? All the "try"s were
changed to "you can do"
GETTING MORE HELP
-----------------
In this tutorial we have tried to supply just enough information to
get you started using DMACS. There is so much available in DMACS that
it would be impossible to explain it all here. However, you may want
to learn more about DMACS since it has numerous desirable features
that you don't know about yet. DMACS has a great deal of internal
documentation. All of these commands can be accessed through the HELP
character, which is the <HOLD> key on Datamedia terminals. To use
the HELP features, type the <HELP> character, and then a character
saying what kind of help you want. If you are REALLY lost, type
<HELP> ? and DMACS will tell you what kinds of help it can give.
The options which are most useful are the following:
<HELP> C Character describe. You type in the character.
Multi-character commands such as C-X C-Z
and <ESC>V are also allowed.
<HELP> D Describe a named command. You type in a command.
<HELP> A Apropos. Type in a keyword and DMACS will
list all the commands containing that keyword.
More than one keyword can be specified,
seperated by C-O
<HELP> I Run the INFO program. INFO contains the
complete documentation for DMACS, in
great detail. Here is where you can find out
about, for instance, special commands for editing
LISP code, handling buffers, replacing text, filling
and justifying text, etc.
>> Go ahead and try some of these. Type <HELP> C M-K. DMACS will tell
you what that character does. Try typing <HELP> A WORD to find
out all the commands that have to do with words. When DMACS
prompts you with --MORE--, type a space to see more or a C-N
to get your text back. INFO is a fairly sophisticated
documentation finder and is somewhat complicated. It probably
isn't a good idea to try to use INFO just yet. Use DMACS for
a few days, gain some familiarity and confidence in giving
commands. And then try INFO out.
Another really valuable help is the file <EMACS>DMACS.CHART. It
lists all the commands available in DMACS. List the file on the line
printer using the exec command LLIST instead of LIST, because it's
formatted for wide paper. Don't try to learn everything on the chart
at once, but when you learn a new command, DO see where it's
mentioned in the chart to help fix the command in your mind.
CONCLUSION
----------
You'll probably find that if you use DMACS for a few days you won't
be able to give it up. Initially it may give you trouble. But remember
that this is the case with any editor, especially one that can do many,
many things. And DMACS can do practically everything.

519
src/e142/einit. Normal file
View File

@@ -0,0 +1,519 @@
!* -*-TECO-*-!
!~Filename~:! !Macros for installing a new EMACS.!
EINIT
!? Generate EMACS:! !? Create EMACS :EJ file from sources.
Compresses the source files that need compression,
then concatenates the COMPRS files and purifies, writing
the result out as EMACS;[PURE] >.!
1,m.m &_File_PURIFY_Loaded+1"G !* Load PURIFY if not loaded already.!
m(m.m Load_Library)EMACS;PURIFY'
fs osteco"e
m(m.mGenerate_Library) EMACS;DSK:[PURE]_> EMACS1;DOC  USRCOM  !*
! ^R BASE  WRDLST  INDENT  SEARCH  FILES  !*
! SUPPRT  ISEARC  WINDOW  BUFFER  CRL  VARS 
m(m.mGenerate_Library) EMACS;DSK:[PRFY]_> EMACS1;PURIFY  CCL
m(m.m Generate_Library) EMACS;DSK:EINIT EMACS1;EINIT '
"#
m(m.mGenerate_Library) EMACS;DSK:[PURE]_> DOC  USRCOM  !*
! ^R BASE  WRDLST  INDENT  SEARCH  FILES  !*
! SUPPRT  ISEARC  WINDOW  BUFFER  CRL  VARS 
m(m.mGenerate_Library) EMACS;PURIFY PURIFY  CCL
m(m.m Generate_Library) EMACS;DSK:EINIT EINIT '

!? Document EMACS:! !? Create EMACS DOC and EMACS CHART.!
m(m.m Load_Lib)EMACS;ABSTR
f[b bind f[d file
m(m.mWall_Chart).X
fs osteco"e
ji;NOXGP
;SKIP_1
'
et EMACS;EMACS_CHART eihpef
hk
fs osteco"e
ji;NOXGP
;SKIP_1
'
m(m.mAbstract_Redefinitions)
m(m.mAbstract_File)_CEMACS
m(m.mAbstract_File)_CTAGS
m(m.mAbstract_File)_CTMACS
m(m.mAbstract_File)_CSLOWLY
m(m.mAbstract_File)_CWORDAB
m(m.mAbstract_File)_CPICTUR
m(m.mAbstract_File)_CABSTR
m(m.mAbstract_File)_CPURIFY
et EMACS;EMACS_NDOC eihpef
1:< ed EMACS_ODOC>
1:< en EMACS_DOC EMACS_ODOC>
en EMACS_NDOC EMACS_DOC

!& Load Default Environment:! !S Create the default environment.
Assuming that the pure files are already loaded
and the "essential" environment is set up, set up the standard
EMACS ^R command definitions, etc.!
[0 [1 [2
@:I*| FSECHO LINES-3"G
3FSECHO LINES'
| FS TTY MACRO !* Must not be a pure string or use M.M.!
M.M &_Toplevel_^R U..L !* Put a macro to handle G in ..L!
M.M &_Secretary_Macro U..F !* ..F is nonzero when we aren't in an "inner ^R mode",!
!* but it isn't used unless FS ^R MDLY$ is positive.!
Q..FU.F !* Switching buffers, files or windows OK iff Q.F = Q..F.!
M.M &_Real-time_Interrupt FS CLK MACRO
M.M &_Recursive_^R_Set_Mode FS ^R ENTER
M.M ^R_Backwards_Kill_Characters FS RUB MACRO
-1UDisplay_Matching_Paren
:IR :,.F !* MR returns the region as two numbers.!
201.@FS ^R InitU1 255U0
400.+A @FS ^R InitU2
256< %0W !* Make all unassigned Meta characters into errors.!
Q0#Q2"E Q1U0'
>
Q1U.T
Q2U..I Q2U...L !* A few meta chars should self-insert.!
Q2U..._
M.M ^R_Complement_SAIL_Mode U.B !* Control-Alpha !
FS ^R INIT UH
M.M ^R_Indent_According_to_Mode UI
M.M ^R_Indent_New_Line UJ
M.M ^R_Indent_New_Comment_Line U..J Q..J U..J
M.M ^R_CRLF UM
M.M ^R_Set/Pop_Mark U._ Q._ U.@
M.M ^R_Replace_String U.%
M.M ^R_Query_Replace U..%
M.M ^R_Find_Tag U...
M.M ^R_Indent_For_Comment U.; Q.; U..;
M.M ^R_Kill_Comment U...;
M.M ^R_Mark_Beginning U.<
M.M ^R_Goto_Beginning U..<
M.M ^R_Where_Am_I U.=
M.M ^R_Count_Lines_Region U..=
M.M ^R_Mark_End U.>
M.M ^R_Goto_End U..>
M.M ^R_Describe U..? Q..?U../
M.M ^R_Documentation F(U...? )FS HELPMAC
M.M ^R_Kill_Line U.K
M.M ^R_New_Window U.L
M.M ^R_Down_Real_Line U.N
M.M ^R_Down_Comment_Line U..N
M.M ^R_Up_Real_Line U.P
M.M ^R_Up_Comment_Line U..P
M.M ^R_Quoted_Insert U.Q
M.M ^R_Reverse_Search  U.R
M.M ^R_Move_To_Screen_Edge U..R
M.M ^R_Reposition_Window U...R
M.M ^R_Incremental_Search U.S
M.M ^R_Transpose_Characters U.T
M.M ^R_Universal_Argument U.U
M.M ^R_Next_Screen U.V
M.M ^R_Previous_Screen U..V
M.M ^R_Scroll_Other_Window U...V
M.M ^R_Kill_Region U.W
M.M ^R_Copy_Region U..W
M.M ^R_Append_Next_Kill U...W
M.M ^R_Extended_Command U..X
M.M ^R_Instant_Extended_Command U...X
M.M ^R_Un-Kill U.Y
M.M ^R_Un-Kill_Pop U..Y
M.M ^R_Return_To_Superior U.Z
M.M ^R_Prefix_Meta U
33. FS ^R INIT U. Q. U...C
M.M ^R_Execute_Mini U..
433.^ FS ^R INIT U...
M.M ^R_Prefix_Meta U.\
M.M ^R_Prefix_Control U.^
M.M ^R_Prefix_Control-Meta U.C
M.M Abort_Recursive_Edit U.]
M.M ^R_Buffer_Not_Modified U..~
!* NOT EXACTLY WORD, NOT EXACTLY LIST COMMANDS!
M.M ^R_Back_to_Indentation U..M Q..M U...M
Q..M F( U..M ) U...M
M.M ^R_Delete_Horizontal_Space U..\
M.M ^R_Indent_Region U...\
M.M ^R_Split_Line U...O
!* LOAD THE WORD COMMANDS!
M.M ^R_Change_Font_Word U..#
M.M ^R_Upcase_Digit U..'
M.M ^R_Mark_Word U..@
M.M ^R_Backward_Sentence U..A
M.M ^R_Backward_Word U..B
M.M ^R_Uppercase_Initial U..C
M.M ^R_Kill_Word U..D
M.M ^R_Forward_Sentence U..E
M.M ^R_Forward_Word U..F
M.M ^R_Fill_Region U..G
M.M ^R_Mark_Paragraph U..H
M.M ^R_Tab_to_Tab_Stop U..I
M.M ^R_Kill_Sentence U..K
M.M ^R_Lowercase_Word U..L
M.M ^R_Fill_Paragraph U..Q
M.M ^R_Center_Line U..S
M.M ^R_Transpose_Words U..T
M.M ^R_Uppercase_Word U..U
M.M ^R_Backward_Paragraph U..[
M.M ^R_Forward_Paragraph U..]
M.M ^R_Delete_Indentation U..^
M.M ^R_Underline_Word U.._
M.M ^R_Backward_Kill_Word U..
!* LOAD THE LIST COMMANDS!
M.M ^R_Make_() U..(
M.M ^R_Move_Over_) U..)
M.M ^R_Backward_Up_List U...( Q...( U...U
M.M ^R_Forward_Up_List U...)
M.M ^R_Mark_Sexp U...@
M.M ^R_Backward_Sexp U...B
M.M ^R_Down_List U...D
M.M ^R_Forward_Sexp U...F
M.M ^R_Format_Code U...G
M.M ^R_Mark_Defun U...H Q...H U...H
M.M ^R_Indent_for_Lisp U...I Q...I U...I
M.M ^R_Kill_Sexp U...K
M.M ^R_Forward_List U...N
M.M ^R_Backward_List U...P
M.M ^R_Indent_Sexp U...Q
M.M ^R_Transpose_Sexps U...T
M.M ^R_Beginning_of_Defun U...[ Q...[ U...A
M.M ^R_End_of_Defun U...] Q...] U...E
M.M ^R_Delete_Indentation U...^
M.M ^R_Backward_Kill_Sexp U...
128M(M.M MAKE_PREFIX).X U.X
:IPrefix_Char_List X.X__
M.M List_Buffers U:.X()
M.M ^R_Return_to_Superior U:.X()
M.M ^R_Directory_Display U:.X()
M.M ^R_Command_^X_^E_Flushed U:.X()
M.M Find_File U:.X()
M.M ^R_Indent_Rigidly U:.X(9) !* ^X Tab.!
M.M ^R_Lowercase_Region U:.X( )
M.M ^R_Set_Goal_Column U:.X()
M.M ^R_Delete_Blank_Lines U:.X()
M.M ^R_Mark_Page U:.X()
M.M ^R_Do_Not_Write_File U:.X()
M.M ^R_Read_File U:.X()
M.M ^R_Save_File U:.X()
M.M ^R_Transpose_Lines U:.X()
M.M ^R_Uppercase_Region U:.X()
M.M ^R_Visit_File U:.X()
M.M Write_File U:.X()
M.M ^R_Exchange_Point_And_Mark U:.X()
M.M ^R_Re-execute_Mini U:.X()
M.M ^R_Change_Font_Region U:.X(#)
M.M ^R_Start_Kbd_Macro U:.X(()
M.M ^R_Set_Fill_Prefix U:.X(.)
M.M ^R_One_Window U:.X(1)
M.M ^R_Two_Windows U:.X(2)
M.M ^R_View_Two_Windows U:.X(3)
M.M ^R_Modified_Two_Windows U:.X(4)
M.M ^R_Set_Comment_Column U:.X(;)
M.M ^R_Where_Am_I U:.X(=)
M.M ^R_Append_to_Buffer U:.X(A)
M.M Select_Buffer U:.X(B)
M.M ^R_DIRED U:.X(D)
M.M ^R_Set_Fill_Column U:.X(F)
M.M ^R_Get_Q-reg U:.X(G)
M.M ^R_Mark_Whole_Buffer U:.X(H)
M.M ^R_Info U:.X(I)
M.M Kill_Buffer U:.X(K)
M.M ^R_Count_Lines_Page U:.X(L)
M.M MAIL U:.X(M)
M.M ^R_Set_Bounds_Region U:.X(N)
M.M ^R_Other_Window U:.X(O)
M.M ^R_Set_Bounds_Page U:.X(P)
M.M Read_Mail U:.X(R)
M.M ^R_Set_Bounds_Full U:.X(W)
M.M ^R_Put_Q-reg U:.X(X)
M.M ^R_Previous_Page U:.X([)
M.M ^R_Next_Page U:.X(])
M.M ^R_Grow_Window U:.X(^)
M.M ^R_Underline_Region U:.X(_)
M.M ^R_Backward_Kill_Sentence U:.X(127)
!* Make TWENEX changes!
fs osteco"n
@ft0
M.M ^R_Prefix_Control-Meta U.Z
33. FS ^R INIT U...Z
M.M ^R_Return_To_Superior U:.X()
37. FS HELP CHARW
0"n
M.M ^R_Exit_to_Exec U.C !* Make self-documentation!
632. @FS ^R INIT U...C
0U:.X() !* not confuse users!
'
'
@ft1
1FS TTMODEW
1FS ^R SCANW
1FS ^R ECHOW
1FS RUB CRLFW !* ^D AND RUBOUT TREAT CRLF AS ONE CHARACTER.!
0FS%TOPW !* WINDOWS ARE OK AS LONG AS CURSOR IS ON SCREEN!
0FS%BOTTOMW
35FS%ENDW !* WANT 35% BLANK SPACE WHEN DISPLAY NEAR END OF FILE!
500FS ^R MDLYW
M.M ^R_Auto-fill_Space FS ^R ECSD
@ft2
:I..J EMACS_ !* Set up ..J so that & Set Mode Line will correct it.!
:I*EMACS M.V Editor_Name !* Name of this editor. For ..J hackery!
!*** Speed up calls to certain subroutines by putting them in ..Q!
M.M &_Find_Buffer M.V MM_&_Find_Buffer
M.M &_Find_File M.V MM_&_Find_File
M.M &_Get_Library_Pointer M.V MM_&_Get_Library_Pointer
M.M &_Kill_Text M.V MM_&_Kill_Text
M.M &_Matching_Paren M.V MM_&_Matching_Paren
M.M &_Process_File_Options M.V MM_&_Process_File_Options
M.M &_Read_Line M.V MM_&_Read_Line
M.M &_Set_Mode_Line M.V MM_&_Set_Mode_Line
M.M Load_Library M.V MM_Load_Library
@ft3
!*** Now redo putting various functions in obscure places.!
!*** This duplicates what & Load Essential Environment does.!
!*** The reason is that these functions may be in the patch file,!
!*** in which case the patched versions must be installed.!
M.M &_Autoload U.A
M.M &_Set_Variable_Comment U.C
M.M &_Prepare_For_Input U.I
M.M Make_Local_Variable U.L
M.M &_Macro_Execute UM
M.M &_Macro_GetU.M
M.M &_Prefix_Character_DriverU.P
M.M &_Make_Variable U.V
M.M &_Set_Mode_Line FS MODE MAC
FS OSTECO"E !* Only on ITS!
M.M &_Default_FS_Superior FS SUPERIOR'
M.M &_F^K_Hook U*F _Hook*
M.M &_Subset_Directory_Listing UDirectory_Lister
@ft4
!*** NOW SET UP EMACS'S ERROR HANDLER. SAVE IT FOR LAST, SINCE IF THERE IS AN ERROR!
!*** AFTER SETTING IT UP, AND NOT ALL THE REST OF EMACS IS THERE, IT IS A SCREW.!
M.M &_Error_Handler U..P

!& Load Essential Environment:! !S Does what's needed for EMACS macros to work at all.
A given environment (such as EMACS, TME, etc.) may set up
other variables, and redefine ^R characters. That is all optional.
But code may fail to work if these variables are missing.!
5FS Q VECTOR U..Q
3U:..Q(0) !* We use 3 words per variable.!
1FS S ERROR !* Searches inside iterations can still fail.!
-1FS^I DISABLE !* Tab is a no-op.!
1FS _ DISABLE !* Don't allow backarrow.!
-1FSFNAM SYNTAX !* FN2s default to ">'!
1FSBOTHCASE !* Searches ignore case of letters.!
-1FS ECHO FLUSH
1FS ^L INSERT !* @Y should not discard ^L's.!
1FS VAR MAC
0U.H !* No goal for ^P, ^N known.!
:i.w !* Not in Atom Word Mode.!
10*5 FS Q VECTOR U..K !* Set up ..K, the kill vector.!
Q..K[..O J 5D ]..O
-1U0 9< 0U:..K(%0) >
5*5 FS Q VECTOR U..U !* Set up ..U, the Undo info vector. See Undo for doc.!
0U:..U(0) 10000000U:..U(2) !* Set it up so Undo will complain.!
6*8 FS Q VECTOR U.N !* Set up .N as qvector 8 words long, with 1 word gap.!
[..O Q.NU..O J 5D ]..O
:I*[1 -1[2
FQ.N/5< Q1 U:.N(%2)> !* Fill all words with null strings.!
!* If not in Lisp mode, don't do Lisp syntax hair, but do treat [,] and {,} as parens.!
!"! 1M(M.M &_Alter_..D) [( ]) {( }) |A /A 'A
!* Set up matching openparens for closeparens!
!"! 2M(M.M &_Alter_..D) ][ )( >< }{    '" !'!
M.M &_Macro_Execute UM
M.M &_Prepare_For_Input U.I
M.M &_Prefix_Character_DriverU.P
M.M &_Autoload U.A
M.M &_Make_Variable U.V
M.M &_Set_Variable_Comment U.C
M.M &_Set_Mode_Line FS MODE MAC !* Say what to do about updating ..J!
1FS MODE CHANGE !* and ask that it be done eventually.!
M.M &_F^K_Hook M.V *F _Hook*
!*** These MM variables are essential!
M.M &_Check_Top_Level M.V MM_&_Check_Top_Level
M.M &_Maybe_Push_Point M.V MM_&_Maybe_Push_Point
M.M &_Maybe_Display_Directory M.V MM_&_Maybe_Display_Directory
0M.V Abort_Resumption_Message
0M.C Atom_Word_Mode ! *_1_=>_word_commands_deal_with_LISP_atoms!
:I.W "n :I.W@' 1FS MODE CH
0M.C Auto_Directory_Display *_1_=>_display_dir_after_writes,_-1_=>_reads_too
0M.C Auto_Fill_Mode ! *_1_=>_Auto_Fill_(break_long_lines_at_margin)!
1FS MODE CH
32FS ^R INIT U_ "E'
M.M^R_Auto-Fill_SpaceU_
500M.C Auto_Push_Point_Option *_Searches_moving_this_far_set_mark_at_old_point
:I*_^@ M.C Auto_Push_Point_Notification *_Searches_setting_mark_type_this
500M.C Auto_Save_Interval ! *_number_of_characters_between_auto-saves!
fs^r mdlyw fs^r mcnt 
0M.C Auto_Save_Visited_File *_1 =>_auto_save_under_visited_filename
0M.C Autoarg_Mode ! *_1_=>_digits_before_control_chars_set_arg!
0 FS ^R INIT[2
"N M.M ^R_AutoargU2'
Q2-Q0"E '
Q2U0 Q2U1 Q2U2 Q2U3 Q2U4
Q2U5 Q2U6 Q2U7 Q2U8 Q2U9 
1M.C Case_Replace *_1_=>_Replace_commands_preserve_case
0M.C Comment_Begin *_String_for_beginning_new_comments
32M.C Comment_Column *_Column_to_start_comments_in
0M.C Comment_Start *_String_that_indicates_the_start_of_a_comment
:I* M.C Comment_End *_String_that_ends_comments
:I*/8+1*8 M.C Comment_Rounding *_Hairy_-_see_code_for_^R_Indent_for_Comment
0M.C Display_Matching_Paren ! *_Controls_action_of_)_in_showing_the_matching_(!
"N M.M &_Matching_Paren' "#0' FS ^R PAREN 
70M.C Fill_Column ! *_Page_width_for_filling_and_grinding!
 FS ADLINE 
:I*.?! M.C Fill_Extra_Space_List *_punctuations_that_need_2_spaces
:I* M.C Fill_Prefix *_String_to_put_before_each_line_when_filling
0M.C Find_File_Inhibit_Write *_initializes_Inhibit_Write_for_Find_File
0M.C FS_CTLMTA !! FS CTLMTA 
0M.C Inhibit_Write ! *_-1_=>_Never_save_automatically_on_switching_files!
1FS MODE CH 
0M.C LISP_Indent_Offset *_See_^R_Indent_for_LISP
0M.C Overwrite_Mode ! *_Overwrite_Mode_status_(see_MM_Overwrite_Mode)!
1FS MODE CH
FS ^R REPLACE 
:I*  M.C Page_Delimiter *_Search_string_for_finding_page_boundaries
:I*. _ M.C Paragraph_Delimiter *_Lines_starting_with_these_chars_start_paragraphs
-1M.C Permit_Unmatched_Paren *_1_=>_allow_unmatched_),_-1_=>_only_in_Lispish_modes
0M.C Read_Line_Delay Pausing_this_many_1/30_sec_causes_echoing
5000 M.C Region_Query_Size *_Some_commands_need_confirmation_if_region_this_big
:I* M.V Set_Mode_Line_Hook
0M.C Space_Indent_Flag *_If_nonzero,_Auto_Fill_indents_new_lines
:I*MEMO  XGP  @XGP  UNFASL  OUTPUT  OLREC _ !*
! M.C Temp_File_FN2_List *_Reap_File_deletes_these_FN2s
:I*Fundamental M.C Mode Do_MM_FOO_to_enter_FOO_mode
:I* M.C Submode !! 1FS MODE CH 
M.M &_Subset_Directory_Listing M.C Directory_Lister Macro_to_use_to_list_directories
15FS Q VECTOR[1 Q1 M.V Search_Default_Ring
:I:1(0) :I:1(1) :I:1(2) ]1
:I..G Q..H"E MDirectory_Lister'
0 M.V Backtrace_Temp
:I* M.V Editor_Name
:I* M.V Editor_Type
:I* M.V Prefix_Char_List
M.M &_Indent_with_Tabs M.V MM_&_Indent
M.M &_Xindent_with_Tabs M.V MM_&_Xindent
:I*________:_______:_______:_______:_______:_______:_______:_______:_______:_______:_______:_______: M.C Tab_Stop_Definitions *_Tab_stops_for_^R_Tab_to_Tab_Stop
!* Set up buffer table and related variables.!
0M.V Next_Bfr_Number
9*5 FS Q VECTOR U.B
9U:.B(0) !* Initialize the entry for the initial buffer.!
:I*Main U:.B(1) !* Its name is B.!
0U:.B(2) !* It contains no file.!
:I*Fundamental U:.B(3) !* It starts in fundamental mode!
Q..Z U:.B(4) !* It is the same one that TECO gave us to start with.!
0U:.B(5) !* Don't need to init FS DFILE and FS WINDOW slots!
0U:.B(6) !* Since they are used only when buffer not selected.!
%Next_Bfr_NumberU:.B(7)
0U:.B(8)
0M.V Buffer_Filenames
Q:.B(1) M.V Buffer_Name
0 M.V Buffer_Index
Q:.B(1) M.V Previous_Buffer
FS OSTECO"E !* Only on ITS!
M.M &_Default_FS_Superior FS SUPERIOR'
M.M Make_Local_Variable U.L
0M.V Auto_Save_Mode
M.L Auto_Save_Mode
0M.C Auto_Save_Default ! *_Default_value_of_Auto_Save_Mode_for_new_files!
1FS MODE CH 
:I* M.C Auto_Save_Filenames *_Filename_for_Auto_Save_Files
2M.C Auto_Save_Max *_#_of_saves_to_keep
M.L Auto_Save_Delete
M.L Auto_Save_Size
M.L Auto_Save_Count
M.L Inhibit_Write
5M.V Initial_Local_Count !* This is the number of M.L's above!

!Purify Variables:! !C Make var names in symtab pure.
For each symbol, sees whether there is a pure string for
its name, and if so makes the sym tab point at that pure string.!
[1 [2 [3
m.m &&_Variable_Name_Listu2 !* Q2 has pure string before the first var name.!
< q2+fq2+4u2 -fq2; !* Look at each available pure string.!
:fo..q2u1 !* Look for a variable with that name.!
q1"g f~:..q(q1)2"e !* If it exists and is an exact match,!
q2u:..q(q1) !* stick the pure string in as the variable name.!
q2+fq2+4u3 !* See if the next pure string matches that var's comment.!
q:..q(q1+2)"n
f~:..q(q1+2)3"e !* If so, purify the comment too.!
q3u:..q(q1+2)'''
!* Now, purify anything in .B which matches this string.!
0u3
fq.b/5< fq:.b(q3)"g f~:.b(q3)2"e
q2u:.b(q3)''
%3 >
'>

!& Load Patches:! !S Load patches (made since [pure] file) before dumping.
Essentially, we do a Compile One Macro on each page of
the patch file EMACS;PATnnn >!
f[b bind qEMACS_Version:\[1
f[d file et emacs;pat1_>
1:< er @y>"l ' !* Read in the patch file. Exit if there is none.!
z"e ' !* Exit fast if it's empty.!
@f
 k !* Kill extra CRLF and ^L at front of file.!
f[:ej page
m(m.m Load_Library)PURIFY !* Otherwise, temporarily load PURIFY!
< m(m.m TCompile) !* and compile each macro in the patch file.!
:s

; >
hk 
!*
** Local Modes:
** Compile Command: M(M.M Generate Library)EMACS;EINITEMACS1;EINIT
** End:
*!

442
src/e142/einit._ej Normal file
View File

@@ -0,0 +1,442 @@
xW
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
)#2| /f/ozT^.e.o5,531z2 2j2}4V4b1X1e0m0z3x40O0Y0D0K5u5{? Generate EMACS81,m.m& File PURIFY Loaded+1"G
m(m.mLoad Library)EMACS;PURIFY'
fsosteco"e
m(m.mGenerate Library)EMACS;DSK:[PURE] >EMACS1;DOCUSRCOM^RBASEWRDLSTINDENTSEARCHFILESSUPPRTISEARCWINDOWBUFFERCRLVARS
m(m.mGenerate Library)EMACS;DSK:[PRFY] >EMACS1;PURIFYCCL
m(m.mGenerate Library)EMACS;DSK:EINITEMACS1;EINIT'
"#
m(m.mGenerate Library)EMACS;DSK:[PURE] >DOCUSRCOM^RBASEWRDLSTINDENTSEARCHFILESSUPPRTISEARCWINDOWBUFFERCRLVARS
m(m.mGenerate Library)EMACS;PURIFYPURIFYCCL
m(m.mGenerate Library)EMACS;DSK:EINITEINIT'
? Document EMACS>m(m.mLoad Lib)EMACS;ABSTR
f[bbindf[dfile
m(m.mWall Chart).X
fsosteco"e
ji;NOXGP
;SKIP 1
'
etEMACS;EMACS CHARTeihpef
hk
fsosteco"e
ji;NOXGP
;SKIP 1
'
m(m.mAbstract Redefinitions)
m(m.mAbstract File) CEMACS
m(m.mAbstract File) CTAGS
m(m.mAbstract File) CTMACS
m(m.mAbstract File) CSLOWLY
m(m.mAbstract File) CWORDAB
m(m.mAbstract File) CPICTUR
m(m.mAbstract File) CABSTR
m(m.mAbstract File) CPURIFY
etEMACS;EMACS NDOCeihpef
1:<edEMACS ODOC>
1:<enEMACS DOCEMACS ODOC>
enEMACS NDOCEMACS DOC
& Load Default Environment/[0[1[2
@:I*|FSECHOLINES-3"G
3FSECHOLINES'
|FSTTYMACRO
M.M& Toplevel ^RU..L
M.M& Secretary MacroU..F
Q..FU.F
M.M& Real-time InterruptFSCLKMACRO
M.M& Recursive ^R Set ModeFS^RENTER
M.M^R Backwards Kill CharactersFSRUBMACRO
-1UDisplay Matching Paren
:IR:,.F
201.@FS^RInitU1255U0
400.+A@FS^RInitU2
256<%0W
Q0#Q2"EQ1U0'
>
Q1U.T
Q2U..IQ2U...L
Q2U..._
M.M^R Complement SAIL ModeU.B
FS^RINITUH
M.M^R Indent According to ModeUI
M.M^R Indent New LineUJ
M.M^R Indent New Comment LineU..JQ..JU..J
M.M^R CRLFUM
M.M^R Set/Pop MarkU. Q. U.@
M.M^R Replace StringU.%
M.M^R Query ReplaceU..%
M.M^R Find TagU...
M.M^R Indent For CommentU.;Q.;U..;
M.M^R Kill CommentU...;
M.M^R Mark BeginningU.<
M.M^R Goto BeginningU..<
M.M^R Where Am IU.=
M.M^R Count Lines RegionU..=
M.M^R Mark EndU.>
M.M^R Goto EndU..>
M.M^R DescribeU..?Q..?U../
M.M^R DocumentationF(U...?)FSHELPMAC
M.M^R Kill LineU.K
M.M^R New WindowU.L
M.M^R Down Real LineU.N
M.M^R Down Comment LineU..N
M.M^R Up Real LineU.P
M.M^R Up Comment LineU..P
M.M^R Quoted InsertU.Q
M.M^R Reverse SearchU.R
M.M^R Move To Screen EdgeU..R
M.M^R Reposition WindowU...R
M.M^R Incremental SearchU.S
M.M^R Transpose CharactersU.T
M.M^R Universal ArgumentU.U
M.M^R Next ScreenU.V
M.M^R Previous ScreenU..V
M.M^R Scroll Other WindowU...V
M.M^R Kill RegionU.W
M.M^R Copy RegionU..W
M.M^R Append Next KillU...W
M.M^R Extended CommandU..X
M.M^R Instant Extended CommandU...X
M.M^R Un-KillU.Y
M.M^R Un-Kill PopU..Y
M.M^R Return To SuperiorU.Z
M.M^R Prefix MetaU
33.FS^RINITU.Q.U...C
M.M^R Execute MiniU..
433.^FS^RINITU...
M.M^R Prefix MetaU.\
M.M^R Prefix ControlU.^
M.M^R Prefix Control-MetaU.C
M.MAbort Recursive EditU.]
M.M^R Buffer Not ModifiedU..~
M.M^R Back to IndentationU..MQ..MU...M
Q..MF(U..M)U...M
M.M^R Delete Horizontal SpaceU..\
M.M^R Indent RegionU...\
M.M^R Split LineU...O
M.M^R Change Font WordU..#
M.M^R Upcase DigitU..'
M.M^R Mark WordU..@
M.M^R Backward SentenceU..A
M.M^R Backward WordU..B
M.M^R Uppercase InitialU..C
M.M^R Kill WordU..D
M.M^R Forward SentenceU..E
M.M^R Forward WordU..F
M.M^R Fill RegionU..G
M.M^R Mark ParagraphU..H
M.M^R Tab to Tab StopU..I
M.M^R Kill SentenceU..K
M.M^R Lowercase WordU..L
M.M^R Fill ParagraphU..Q
M.M^R Center LineU..S
M.M^R Transpose WordsU..T
M.M^R Uppercase WordU..U
M.M^R Backward ParagraphU..[
M.M^R Forward ParagraphU..]
M.M^R Delete IndentationU..^
M.M^R Underline WordU.._
M.M^R Backward Kill WordU..
M.M^R Make ()U..(
M.M^R Move Over )U..)
M.M^R Backward Up ListU...(Q...(U...U
M.M^R Forward Up ListU...)
M.M^R Mark SexpU...@
M.M^R Backward SexpU...B
M.M^R Down ListU...D
M.M^R Forward SexpU...F
M.M^R Format CodeU...G
M.M^R Mark DefunU...HQ...HU...H
M.M^R Indent for LispU...IQ...IU...I
M.M^R Kill SexpU...K
M.M^R Forward ListU...N
M.M^R Backward ListU...P
M.M^R Indent SexpU...Q
M.M^R Transpose SexpsU...T
M.M^R Beginning of DefunU...[Q...[U...A
M.M^R End of DefunU...]Q...]U...E
M.M^R Delete IndentationU...^
M.M^R Backward Kill SexpU...
128M(M.MMAKE PREFIX).XU.X
:IPrefix Char ListX.X 
M.MList BuffersU:.X()
M.M^R Return to SuperiorU:.X()
M.M^R Directory DisplayU:.X()
M.M^R Command ^X ^E FlushedU:.X()
M.MFind FileU:.X()
M.M^R Indent RigidlyU:.X(9)
M.M^R Lowercase RegionU:.X( )
M.M^R Set Goal ColumnU:.X()
M.M^R Delete Blank LinesU:.X()
M.M^R Mark PageU:.X()
M.M^R Do Not Write FileU:.X()
M.M^R Read FileU:.X()
M.M^R Save FileU:.X()
M.M^R Transpose LinesU:.X()
M.M^R Uppercase RegionU:.X()
M.M^R Visit FileU:.X()
M.MWrite FileU:.X()
M.M^R Exchange Point And MarkU:.X()
M.M^R Re-execute MiniU:.X()
M.M^R Change Font RegionU:.X(#)
M.M^R Start Kbd MacroU:.X(()
M.M^R Set Fill PrefixU:.X(.)
M.M^R One WindowU:.X(1)
M.M^R Two WindowsU:.X(2)
M.M^R View Two WindowsU:.X(3)
M.M^R Modified Two WindowsU:.X(4)
M.M^R Set Comment ColumnU:.X(;)
M.M^R Where Am IU:.X(=)
M.M^R Append to BufferU:.X(A)
M.MSelect BufferU:.X(B)
M.M^R DIREDU:.X(D)
M.M^R Set Fill ColumnU:.X(F)
M.M^R Get Q-regU:.X(G)
M.M^R Mark Whole BufferU:.X(H)
M.M^R InfoU:.X(I)
M.MKill BufferU:.X(K)
M.M^R Count Lines PageU:.X(L)
M.MMAILU:.X(M)
M.M^R Set Bounds RegionU:.X(N)
M.M^R Other WindowU:.X(O)
M.M^R Set Bounds PageU:.X(P)
M.MRead MailU:.X(R)
M.M^R Set Bounds FullU:.X(W)
M.M^R Put Q-regU:.X(X)
M.M^R Previous PageU:.X([)
M.M^R Next PageU:.X(])
M.M^R Grow WindowU:.X(^)
M.M^R Underline RegionU:.X(_)
M.M^R Backward Kill SentenceU:.X(127)
fsosteco"n
@ft0
M.M^R Prefix Control-MetaU.Z
33.FS^RINITU...Z
M.M^R Return To SuperiorU:.X()
37.FSHELPCHARW
0"n
M.M^R Exit to ExecU.C
632.@FS^RINITU...C
0U:.X()
'
'
@ft1
1FSTTMODEW
1FS^RSCANW
1FS^RECHOW
1FSRUBCRLFW
0FS%TOPW
0FS%BOTTOMW
35FS%ENDW
500FS^RMDLYW
M.M^R Auto-fill SpaceFS^RECSD
@ft2
:I..JEMACS 
:I*EMACSM.VEditor Name
M.M& Find BufferM.VMM & Find Buffer
M.M& Find FileM.VMM & Find File
M.M& Get Library PointerM.VMM & Get Library Pointer
M.M& Kill TextM.VMM & Kill Text
M.M& Matching ParenM.VMM & Matching Paren
M.M& Process File OptionsM.VMM & Process File Options
M.M& Read LineM.VMM & Read Line
M.M& Set Mode LineM.VMM & Set Mode Line
M.MLoad LibraryM.VMM Load Library
@ft3
M.M& AutoloadU.A
M.M& Set Variable CommentU.C
M.M& Prepare For InputU.I
M.MMake Local VariableU.L
M.M& Macro ExecuteUM
M.M& Macro GetU.M
M.M& Prefix Character DriverU.P
M.M& Make VariableU.V
M.M& Set Mode LineFSMODEMAC
FSOSTECO"E
M.M& Default FS SuperiorFSSUPERIOR'
M.M& F^K HookU*F Hook*
M.M& Subset Directory ListingUDirectory Lister
@ft4
M.M& Error HandlerU..P
 & Load Essential Environment2#5FSQVECTORU..Q
3U:..Q(0)
1FSSERROR
-1FS^IDISABLE
1FS_DISABLE
-1FSFNAMSYNTAX
1FSBOTHCASE
-1FSECHOFLUSH
1FS^LINSERT
1FSVARMAC
0U.H
:i.w
10*5FSQVECTORU..K
Q..K[..OJ5D]..O
-1U09<0U:..K(%0)>
5*5FSQVECTORU..U
0U:..U(0)10000000U:..U(2)
6*8FSQVECTORU.N
[..OQ.NU..OJ5D]..O
:I*[1-1[2
FQ.N/5<Q1U:.N(%2)>
!"!1M(M.M& Alter ..D)[(]){(})|A/A'A
!"!2M(M.M& Alter ..D)][)(><}{'"!'!
M.M& Macro ExecuteUM
M.M& Prepare For InputU.I
M.M& Prefix Character DriverU.P
M.M& AutoloadU.A
M.M& Make VariableU.V
M.M& Set Variable CommentU.C
M.M& Set Mode LineFSMODEMAC
1FSMODECHANGE
M.M& F^K HookM.V*F Hook*
M.M& Check Top LevelM.VMM & Check Top Level
M.M& Maybe Push PointM.VMM & Maybe Push Point
M.M& Maybe Display DirectoryM.VMM & Maybe Display Directory
0M.VAbort Resumption Message
0M.CAtom Word Mode!* 1 => word commands deal with LISP atoms!
:I.W"n:I.W@'1FSMODECH
0M.CAuto Directory Display* 1 => display dir after writes, -1 => reads too
0M.CAuto Fill Mode!* 1 => Auto Fill (break long lines at margin)!
1FSMODECH
32FS^RINITU "E'
M.M^R Auto-Fill SpaceU 
500M.CAuto Push Point Option* Searches moving this far set mark at old point
:I* ^@M.CAuto Push Point Notification* Searches setting mark type this
500M.CAuto Save Interval!* number of characters between auto-saves!
fs^rmdlywfs^rmcnt
0M.CAuto Save Visited File* 1=> auto save under visited filename
0M.CAutoarg Mode!* 1 => digits before control chars set arg!
0FS^RINIT[2
"NM.M^R AutoargU2'
Q2-Q0"E'
Q2U0Q2U1Q2U2Q2U3Q2U4
Q2U5Q2U6Q2U7Q2U8Q2U9
1M.CCase Replace* 1 => Replace commands preserve case
0M.CComment Begin* String for beginning new comments
32M.CComment Column* Column to start comments in
0M.CComment Start* String that indicates the start of a comment
:I*M.CComment End* String that ends comments
:I*/8+1*8M.CComment Rounding* Hairy - see code for ^R Indent for Comment
0M.CDisplay Matching Paren!* Controls action of ) in showing the matching (!
"NM.M& Matching Paren'"#0'FS^RPAREN
70M.CFill Column!* Page width for filling and grinding!
FSADLINE
:I*.?!M.CFill Extra Space List* punctuations that need 2 spaces
:I*M.CFill Prefix* String to put before each line when filling
0M.CFind File Inhibit Write* initializes Inhibit Write for Find File
0M.CFS CTLMTA!!FSCTLMTA
0M.CInhibit Write!* -1 => Never save automatically on switching files!
1FSMODECH
0M.CLISP Indent Offset* See ^R Indent for LISP
0M.COverwrite Mode!* Overwrite Mode status (see MM Overwrite Mode)!
1FSMODECH
FS^RREPLACE
:I* M.CPage Delimiter* Search string for finding page boundaries
:I*.  M.CParagraph Delimiter* Lines starting with these chars start paragraphs
-1M.CPermit Unmatched Paren* 1 => allow unmatched ), -1 => only in Lispish modes
0M.CRead Line DelayPausing this many 1/30 sec causes echoing
5000M.CRegion Query Size* Some commands need confirmation if region this big
:I*M.VSet Mode Line Hook
0M.CSpace Indent Flag* If nonzero, Auto Fill indents new lines
:I*MEMOXGP@XGPUNFASLOUTPUTOLREC M.CTemp File FN2 List* Reap File deletes these FN2s
:I*FundamentalM.CModeDo MM FOO to enter FOO mode
:I*M.CSubmode!!1FSMODECH
M.M& Subset Directory ListingM.CDirectory ListerMacro to use to list directories
15FSQVECTOR1M.VSearch Default Ring
:I:1(0):I:1(1):I:1(2)]1
:I..GQ..H"EMDirectory Lister'
0M.VBacktrace Temp
:I*M.VEditor Name
:I*M.VEditor Type
:I*M.VPrefix Char List
M.M& Indent with TabsM.VMM & Indent
M.M& Xindent with TabsM.VMM & Xindent
:I* : : : : : : : : : : : :M.CTab Stop Definitions* Tab stops for ^R Tab to Tab Stop
0M.VNext Bfr Number
9*5FSQVECTORU.B
9U:.B(0)
:I*MainU:.B(1)
0U:.B(2)
:I*FundamentalU:.B(3)
Q..ZU:.B(4)
0U:.B(5)
0U:.B(6)
%Next Bfr NumberU:.B(7)
0U:.B(8)
0M.VBuffer Filenames
Q:.B(1)M.VBuffer Name
0M.VBuffer Index
Q:.B(1)M.VPrevious Buffer
FSOSTECO"E
M.M& Default FS SuperiorFSSUPERIOR'
M.MMake Local VariableU.L
0M.VAuto Save Mode
M.LAuto Save Mode
0M.CAuto Save Default!* Default value of Auto Save Mode for new files!
1FSMODECH
:I*M.CAuto Save Filenames* Filename for Auto Save Files
2M.CAuto Save Max* # of saves to keep
M.LAuto Save Delete
M.LAuto Save Size
M.LAuto Save Count
M.LInhibit Write
5M.VInitial Local Count
Purify Variablesm[1[2[3
m.m&& Variable Name Listu2
<q2+fq2+4u2-fq2;
:fo..q2u1
q1"gf~:..q(q1)2"e
q2u:..q(q1)
q2+fq2+4u3
q:..q(q1+2)"n
f~:..q(q1+2)3"e
q3u:..q(q1+2)'''
0u3
fq.b/5<fq:.b(q3)"gf~:.b(q3)2"e
q2u:.b(q3)''
%3>
'>
& Load Patches*f[bbindqEMACS Version:\[1
f[dfileetemacs;pat1 >
1:<er@y>"l'
z"e'
@f
 k
f[:ejpage
m(m.mLoad Library)PURIFY
<m(m.mTCompile)
:s

;>
hk~Filename~ EINIT~DOC~ ~Filename~(Macros for installing a new EMACS.
~DOC~ ? Generate EMACS<? Create EMACS :EJ file from sources.
Compresses the source files that need compression,
then concatenates the COMPRS files and purifies, writing
the result out as EMACS;[PURE] >.
~DOC~ ? Document EMACS)? Create EMACS DOC and EMACS CHART.
$~DOC~ & Load Default Environment<S Create the default environment.
Assuming that the pure files are already loaded
and the "essential" environment is set up, set up the standard
EMACS ^R command definitions, etc.
&~DOC~ & Load Essential EnvironmentvS Does what's needed for EMACS macros to work at all.
A given environment (such as EMACS, TME, etc.) may set up
other variables, and redefine ^R characters. That is all optional.
But code may fail to work if these variables are missing.
~DOC~ Purify Variables"C Make var names in symtab pure.
For each symbol, sees whether there is a pure string for
its name, and if so makes the sym tab point at that pure string.
~DOC~ & Load PatchesS Load patches (made since [pure] file) before dumping.
Essentially, we do a Compile One Macro on each page of
the patch file EMACS;PATnnn >
~DIRECTORY~? Generate EMACS
? Document EMACS
& Load Default Environment
& Load Essential Environment
Purify Variables
& Load Patches
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

View File

@@ -0,0 +1,81 @@
Changes in EMACS version 133:
*) The self documentation features now know about names for the
built-in TECO ^R command definitions. For example, Apropos of "Line"
will now show ^R Open Line on C-O. You can't actually call those
commands by those names, unless you load the library BARE; this
library is temporarily loaded by the documentation commands that need
it. MM& Load BARE loads BARE and causes BARE to remain loaded until
its caller returns.
*) C-U C-Y differs from plain C-Y in that it leaves point before
the un-killed text and the mark after.
*) C-U C-L causes the line point is on to be redisplayed.
Actual numeric arguments (not just C-U) still specify
a line to display point on.
*) C-; and M-; (^R Indent for Comment) now inserts the comment
terminator as well as the comment starter, leaving point in between
them. M-N and M-P (^R Down Comment Line, and .. Up ..), have been
modified for this behavior.
*) M-G and M-Q (^R Fill Paragraph and ^R Fill Region) now by default
remove excess spaces such as are produced by filling.
*) Return now will not gobble a blank line followed by a nonblank
line.
*) C-K will now treat a blank line as if it were empty, killing
through the CRLF instead of to it. More specifically, if point is
followed by a CRLF with only whitespace in between, C-K will kill
through the CRLF.
*) M-[ and M-] (^R Backward Paragraph, and ... Forward ...), now treat
"\" at the front of a line just like "." and "-", for the sake of TEX
files. This special treatment is that if those characters are
declared (using QParagraph Delimiter) to start paragraphs, then
whenever a paragraph starts for that reason, that paragraph is only
one line long.
*) You can now put MM Query Replace on a character. It will read its
arguments in the echo area.
*) Errors in auto-saving will type out "(Auto Save Error!)".
*) ^R Indent Nested (the definition of Tab in certain modes) now does
something useful with negative arguments. It indents the line more
than the previous line, (* (ABS ARGUMENT) (MAX 1 QIndent Increment))
spaces more. QIndent Increment is not initially defined.
*) There is now an autoloading definition for C-X ( which loads in
KBDMAC and transfers to it. People need no longer load KBDMAC in
their init files. You will now see "Def" in the mode line while
defining a keyboard macro.
*) Exiting from the top-level ^R invocation now returns to EMACS's
superior. To exit from it back to TECO command level, do
1MM Top Level. This will advise you to re-enter ^R mode by doing
:M..L. Returning to the superior will now clear out the mode line
completely.
*) Creating a new buffer initializes it in the same mode as the
previous selected buffer. This uses the new @F^G command in TECO.
*) Making variables like QAuto Fill Mode local now works
straightforwardly; it is no longer necessary to deal with the crock
Switch Modes Process Options, which no longer exists. These variables
have been equipped with macros which are run whenever their values
change. Thus, simply doing 1UAuto Fill Mode is enough to turn on
the mode. MM & Process Options no longer exists. A side effect of
this is that buffer switching is much faster. This uses the new
FS VAR MACRO feature of TECO. QProcess Options Hook no longer
exists; instead, you must make macros to be run when your variables'
values change. This will be documented in CONV later.
*) Instead of calling MM & Set Mode Line, macros should simply do
1FS Mode Change, which will cause MM & Set Mode Line to be called
when the mode line comes up for redisplay. Thus, multiple reasons for
calling it will not cause it to be called more than once.
QSet Mode Line Hook still exists and works as before.

BIN
src/e142/emacs._ej Normal file

Binary file not shown.

BIN
src/e142/emacs._ej.135 Normal file

Binary file not shown.

25
src/e142/emacs.ctl Normal file
View File

@@ -0,0 +1,25 @@
@midas teco
*2
*11.
*12.
*
*
*
*
*
*
*
*
*13.
*
*10.
*
*
*
*
*
*17.
@iddt
*;yteco.sav
*;wteco
*purifygmmrunpurifydumpnemacs.savfsexit;h

75
src/e142/emacs.init Normal file
View File

@@ -0,0 +1,75 @@
!* -*-TECO-*- *!
!* This is the default init file for EMACS.
Anything in the buffer when you start this
will be used instead of the JCL.
*!
Q..9"E Q..LU..9' !* ..9 is what to run on the way out.!
!* Maybe same as ..L.!
FT
NEMACS (emacs version 135) has been renamed to EMACS and the old
version (133) to <OLDSYS>EMACS. The most recent version (142)
has been brought up as <NEWSYS>EMACS. A summary of the changes
(there are many) is available in <EMACS>CHANGES.142. In a week
or two, <NEWSYS>EMACS.SAV;142 will go onto <SUBSYS>, so try out
the new version before then. Any questions to <RUBENSTEIN>.

FQ(0FO..QAuto Save Filenames)-1"L
FS MSNAME:F6[0
:I*DSK:0;Autosave > M.VAuto Save Filenames ]0'
FS XJNAME :F6 [J
FS MSNAME FS D SNAME !* Make connected dir default name!
QFind File Inhibit Write UInhibit Write
!* On non-meta keyboards, allow Alt 1 2 to mean an arg of 12.!
FS %TOFCI"E
M.M ^R Autoarg[0 460.-1[1
10< Q0,%1^ FS ^R CMAC> Q0U..-
]1 ]0'
!* Process the JCL!
0[0 0[1
Z"E FJ' ZJ !* Get JCL, or use whatever previous init file left in buffer.!
."N !* Process JCL command - extract filenames and commands!
0,0A-
"E -D' !* REMOVE LF AT END IF ANY *!
J :S"N .,Z^ FX1 -D' !* IF COMMANDS TO EXECUTE, PUT THEM IN Q1!
HFX0' !* IF FILE TO BE READ, PUT NAME IN Q0!
'
FS LISPT"N FS CCL FNAMU0
0FS SUPERIOR !* Dont try to suck in LISPT.!
0U1 F~JSNDMSG"E M(M.M TEXT MODE)''
qEMACS Version-132"G M(M.MLoad Library)PATCH'
1fs Echo Errors
8FS HELP CHAR
Q0"E Q1"E !* If no commands / file to read, offer help.!
HK FS Date FS FD Convert
9J \ [4 HK
FS Version :\ [2
qEMACS Version:\[1 !* get version no. as string!
Q4-12 "L FTGood Morning.'
"# Q4-18 "L FTGood Afternoon.'
"# FTGood Evening.''
FT
EMACS Editor, version 1.2 - type ^H for help.
''
FQ0-1"L Q1"N M1' !* No file specified => execute commands from JCL!
0FS QP Unwind :M..9' !* and enter ^R mode.!
QInhibit Write,M(M.M Visit File)0 !* VISIT SPECIFIED FILE, USING ">' AS DEFAULT FN2!
FSLISPT"N F~JSNDMSG"N !* If called by EXEC EDIT command...!
QBuffer Filenames F[ DFILE
0 FS DVERS !* Reset version number defaults.!
FS DFILE UBuffer Filenames
M(M.M& Set Mode Line)
F]D FILE''
Q1"N M1' !* If JCL held commands, execute them.!
f~JLISP"E M(M.MLoad Library)Intermacs !* if under a LISP then load Intermacs!
FS Exit'
0FS QP Unwind :M..9

100
src/e142/emacs.log Normal file
View File

@@ -0,0 +1,100 @@
Tenex Batch System. Version 3.0
Batch job number 246 Started Monday, November 26, 1979 16:17:23
Maximum log length (lines): 1000
Maximum elapsed time (minutes): 360
Maximum CPU time (seconds): 3600
Input file : <EMACS>EMACS.CTL;2;ASTAFF,26-Nov-79 14:46:11
Output file : <EMACS>EMACS.LOG;1;ASTAFF,26-Nov-79 14:42:50
SUMEX-AIM Tenex 1.31.33, SUMEX-AIM Exec 1.54.22
!!! Hardware problems - save your files often. Running on 1 CPU !!!
@LOG SCHOEN STAFF
Job 26 on TTY144 26-Nov-79 16:17
Previous login: 26-Nov-79 16:12
Tenex will go down Thu 11-29-79 1730 til Thu 11-29-79 2359
for preventive maintenance
@;end of COMAND.CMD
@
@connect emacs
EMACS over allocation by 2041 pages.
@usestat
26-Nov-79 16:17, used 0:00:01 in 0:00:13, sched=10%, 1/23
17!+22! Jobs, LA 4.49 6.34 6.70
@<10/20-sources>midas
******* [ 16:17:55 (PRIV) USED 0:00:02 IN 0:00:26 ] *******
NOTPUR MIDAS.417
*teco
TECO
END OF LOW IMPURE = 3341
IIT JSYS TYPE (0 - NONE, 1 - BBN, 2 - SUMEX): 2
GTTYP index for DM2500 = 11.
GTTYP index for H1500 = 12.
GTTYP index for VT52 =
GTTYP index for DM1520 =
GTTYP index for IMLAC =
GTTYP index for VT05 =
GTTYP index for TK4025 =
GTTYP index for VT61 =
GTTYP index for TL4041 =
GTTYP index for FOX =
GTTYP index for HP2645 = 13.
GTTYP index for I400 =
GTTYP index for TK4023 = 10.
GTTYP index for ANNARB =
GTTYP index for C100 =
GTTYP index for IQ120 =
GTTYP index for VT100 =
GTTYP index for I100 =
GTTYP index for TL1061 = 17.
GTTYP index for H19 = 18.
CHNTAB+3 35742 21. 316-061 .ICPOV Undefined in BLOCK
CHNTAB+4 35743 21. 316-063 .ICTOD Undefined in BLOCK
CHNTAB+5 35744 21. 316-065 .ICNXP Undefined in BLOCK
TOP OF PURE = 41755
TECO
GOZ+20 4024 0. 20-044 .TICCC Undefined in literal
SETTTM+1 4223 0. 24-005 .TICCG Undefined
FSNQIT+11 20043 0. 141-085 .TICCG Undefined
FSNQT2+2 20050 0. 141-090 .TICCG Undefined
SETFRK+17 22317 0. 164-031 .TICCG Undefined
RETFRK+4 22341 0. 164-056 .TICCG Undefined
CHNTAB+3 35742 0. 316-061 .ICPOV Undefined in BLOCK
CHNTAB+4 35743 0. 316-063 .ICTOD Undefined in BLOCK
CHNTAB+5 35744 0. 316-065 .ICNXP Undefined in BLOCK
Constants area inclusive
From To
3334 3341
37700 41554
Run time = 1:20.14
5816 Symbols including initial ones (72% used)
******* [ 16:24:54 EXEC USED 0:01:23 IN 0:07:25 ] *******
@usestat
26-Nov-79 16:24, used 0:01:22 in 0:07:21, sched=2%, 2/34
15!+21!+1 Jobs, LA 4.61 5.16 5.91
@iddt
******* [ 16:24:59 IDDT USED 0:01:24 IN 0:07:29 ] *******
;yANK FILE: teco.sav;786
;wRITE SYMBOLS ON FILE: teco.SYMBOLS;785 [Confirm]
purify$$g[_TECO$:PURIFY]
~`u~
TECO&GETCHR+4/ LDB 15,TECO&BTAB(12) mmrun$pU urify$dU ump$nU emacs.sav$fU sexit$$;hU
^C
******* [ 16:27:28 EXEC USED 0:01:31 IN 0:09:59 ] *******
@usestat
26-Nov-79 16:27, used 0:01:30 in 0:09:55, sched=2%, 3/99
18!+21! Jobs, LA 6.06 5.60 5.96
@^C
@LOGOUT
[New mail from SYSTEM sent 26-Nov-79 16:26]
EMACS over allocation by 2097 pages.
[Confirm]
Tenex will go down Thu 11-29-79 1730 til Thu 11-29-79 2359
for preventive maintenance
KILLED JOB 26, USER SCHOEN, ACCT STAFF, TTY 144, AT 11/26/79 1628
USED 0:1:32 IN 0:10:43

2258
src/e142/emacs.odoc Normal file

File diff suppressed because it is too large Load Diff

238
src/e142/emacs.old Normal file
View File

@@ -0,0 +1,238 @@
This is the file <EMACS>EMACS.NEWS. It contains news about EMACS,
recent news first. If you have anything you want to add, use the
Post EMACS News command in the ENEWS library.
Format of this file is ^A<Date>^B<Author>^C<Subject>^DMessage^E
05/23/79 14:55:24RUBENSTEINPAGE library screwing up INFOThe PAGE library shouldn't be screwing up INFO any more. The problem
was a complex one, based on the fact that PAGE's visit file hook
didn't end with a ^\, so id didn't pop the q-register stack, which
was pushed by Visit File, so & Info Select Node's q-registers were
still on the stack when Visit File returned. Anyway, it should
work fine now...
Stew
04/21/79 23:32:55RUBENSTEINEMACS 133EMACS 133 is now the default version of EMACS. You can still get
EMACS 131 for a little while by running <SUBSYS>OEMACS
Stew
04/21/79 23:31:25RUBENSTEINFind File Inhibit WriteThis variable is used to determine whether you like ^X ^F, ^X ^V or
^X ^E as your default file-visiting command. It is used by ^X ^F
to determine which method to use, and it is also used to determine
how to read in a file requested by the exec EDIT command. If you like
^X ^E, do 0U$Find File Inhibit Write$ in your init file. ^X ^V and
^X ^R are 1 and -1, respectively.
Stew
04/14/79 16:39:42RUBENSTEINEMACS version 133Changes in EMACS version 133:
*) The self documentation features now know about names for the
built-in TECO ^R command definitions. For example, Apropos of "Line"
will now show ^R Open Line on C-O. You can't actually call those
commands by those names, unless you load the library BARE; this
library is temporarily loaded by the documentation commands that need
it. MM& Load BARE loads BARE and causes BARE to remain loaded until
its caller returns.
*) C-U C-Y differs from plain C-Y in that it leaves point before
the un-killed text and the mark after.
*) C-U C-L causes the line point is on to be redisplayed.
Actual numeric arguments (not just C-U) still specify
a line to display point on.
*) C-; and M-; (^R Indent for Comment) now inserts the comment
terminator as well as the comment starter, leaving point in between
them. M-N and M-P (^R Down Comment Line, and .. Up ..), have been
modified for this behavior.
*) M-G and M-Q (^R Fill Paragraph and ^R Fill Region) now by default
remove excess spaces such as are produced by filling.
*) Return now will not gobble a blank line followed by a nonblank
line.
*) C-K will now treat a blank line as if it were empty, killing
through the CRLF instead of to it. More specifically, if point is
followed by a CRLF with only whitespace in between, C-K will kill
through the CRLF.
*) M-[ and M-] (^R Backward Paragraph, and ... Forward ...), now treat
"\" at the front of a line just like "." and "-", for the sake of TEX
files. This special treatment is that if those characters are
declared (using QParagraph Delimiter) to start paragraphs, then
whenever a paragraph starts for that reason, that paragraph is only
one line long.
*) You can now put MM Query Replace on a character. It will read its
arguments in the echo area.
*) Errors in auto-saving will type out "(Auto Save Error!)".
*) ^R Indent Nested (the definition of Tab in certain modes) now does
something useful with negative arguments. It indents the line more
than the previous line, (* (ABS ARGUMENT) (MAX 1 QIndent Increment))
spaces more. QIndent Increment is not initially defined.
*) There is now an autoloading definition for C-X ( which loads in
KBDMAC and transfers to it. People need no longer load KBDMAC in
their init files. You will now see "Def" in the mode line while
defining a keyboard macro.
*) Exiting from the top-level ^R invocation now returns to EMACS's
superior. To exit from it back to TECO command level, do
1MM Top Level. This will advise you to re-enter ^R mode by doing
:M..L. Returning to the superior will now clear out the mode line
completely.
*) Creating a new buffer initializes it in the same mode as the
previous selected buffer. This uses the new @F^G command in TECO.
*) Making variables like QAuto Fill Mode local now works
straightforwardly; it is no longer necessary to deal with the crock
Switch Modes Process Options, which no longer exists. These variables
have been equipped with macros which are run whenever their values
change. Thus, simply doing 1UAuto Fill Mode is enough to turn on
the mode. MM & Process Options no longer exists. A side effect of
this is that buffer switching is much faster. This uses the new
FS VAR MACRO feature of TECO. QProcess Options Hook no longer
exists; instead, you must make macros to be run when your variables'
values change. This will be documented in CONV later.
*) Instead of calling MM & Set Mode Line, macros should simply do
1FS Mode Change, which will cause MM & Set Mode Line to be called
when the mode line comes up for redisplay. Thus, multiple reasons for
calling it will not cause it to be called more than once.
QSet Mode Line Hook still exists and works as before.
04/02/79 15:07:56USECSA request fo a new featureWould it be possible to have a command to fork a new EXEC from emacs?
Michael Toy
03/30/79 11:58:37RUBENSTEINPDL overflows and other EMACS lossagesIf you get any of these, the best thing to do is save your core
image and then give the START command. This will cause EMACS
to re-initialize itself, but your buffers will still remain
intact -- you won't lose any work. Then send me a message
giving as many details as possible...
Stew
03/30/79 11:54:13RUBENSTEIN^E "bug"C-E is redefined (in ALL modes) to do ^R Exchange Characters. This
used to be on C-T. To get end of line, use C-M->. If you want, a couple
of people have adopted the AI lab editor's convention of M-tab for
end of line and M-^L for beginning (or reversed, I don't remember. I
personally like to have those two commands self inserting, as they are
in vanilla EMACS.
Stew
03/26/79 12:55:27USECSNews featureI vote to keep the news. It seems to be an effective way for
EMACS users to report bugs and also to find out about bugs that
others have caught. I don't really like the # hack, but it is
just a small irritation. I would rather have to invoke the news
manually instead of having the first character I type echo
incorrectly.
Michael Toy
03/25/79 22:14:06SCHOENanother bug
Beware of pushdown overflow...I got one when trying to get INFO
through the documentation package.
Eric03/25/79 09:25:53SCHOEN^E bug
Watch out! At least in MIDAS mode, ^E doesn't go to the end of the line,
but splits the carriage return-linefeed sequence separating the current
line from the previous line around the first character of the current line,
like:
start: reset
move 17,[iowd....]
becomes when ^E is typed on the second line:
start: reset^Mm^Jove 17,[iowd....]
Eric03/20/79 22:54:36VANMELLEI second the motionThe users of this news facility so far are myself, SRISW, and
Rubenstein; of these, SRISW and I hate it -- what's wrong with BBD
anyway? If this feature is desirable, where are the users who like it?
I say flush it if there is no great clamor for it.
SRISW's point about changing the system too often is also well taken. I
have no objection to people developing and advertising macro libraries
with new features. But changing the default system (in particular all
the nonsense that has been creeping into <EMACS>EMACS.INIT) without definite
user support is a bad idea. Publicize things and let people try them
optionally (e.g. let them put something in their init), but don't do it
in such a way that it is difficult or even impossible to avoid if the
user deems the feature undesirable. Poll the community and see what
they really want!!03/19/79 21:18:26SRISWEMACS changing too oftenIt would seem that SUMEX is having a problem with EMACS that other sites
on the network have experienced. Specifically, the maintainer, in
wanting to bring the most features and usefulness to the local EMACS,
changes it too often thus rendering the entire EMACS user community
angry and confused a great deal of the time. Let me suggest a simple
solution. I maintain EMACS at SRI-KL and SRI-KA, and when I want to make
a change or add a feature, I always send a note to the bulletin board
and wait for the response. If at least 90% of the people approve of the
change, then the new EMACS is generated and put on NEW:. If not, then
the change is simply not put in. I keep these changes to a bare minimum
and never take more than one poll a month. The results have been
graitfying and you might do well to implement your scheme in this manner,
including flushing this silly ENEWS frob. That is what bulletin boards
are for, and your BBD system certainly should carry all these notes.
Not some local software hack.03/19/79 10:59:31SCHOENI vote for consistency
Sorry for sounding like an ass, but I say EMACS should remain the same
for at least two days at a time....
Eric
03/17/79 16:12:18VANMELLEFlush the news!I agree with srisw. This news system is superfluous. There already
exists a mechanism for communication among emacs users, viz. the
bulletin board (BBD). Interested users can put the EMACS topic on their
interest lists and use BBD or BBREAD to read them when they appear;
they can also POST notices of interest to others.
Besides, I'd prefer not to add any more to the initial emacs startup
time, and certainly not for this news system.
Bill03/17/79 12:59:48SRISWIll
I think this news frob is somewhat ill and slightly dumb. If
people want to send mail, they can do it with the mail system,
not some non-standard thing03/17/79 11:07:59RUBENSTEINKEYPAD library no longer loaded by defaultA few users have objected to the idea that Sumex-AIM EMACS be any
different from EMACS anywhere else, so I have decided to make
the default EMACS not load the KEYPAD library by default. It can
still, of course, be loaded with MM Load Library$KEYPAD$ either
from your INIT file or explicitly.
I would appreciate hearing from users about this and other issues
(on either side)... There will be a message when EMACS starts up
to the effect that the KEYPAD lib is no longer loaded (unless you
happen to have 1M.VKEYPAD Inhibit$ in your init file!) for a few days.
Also, comments on the news facility would be appreciated. In fact,
use M-X Run Library$ENEWS$Post to post your opinions!
Stew
03/15/79 02:44:40RUBENSTEINWhen is the KEYPAD library NOT loaded?The KEYPAD library is not loaded if
1) You are not on a datamedia, or
2) You make Q$KEYPAD Inhibit$ non-zero in your INIT file.
Someone suggested to me that KEYPAD should NEVER be loaded by default
although those who wished to have it loaded could put it in their
INIT file.
Comments, anyone?
Stew
P.S. In case I never mentioned it, part of my job is to write INIT
files at users request. If there's anything that you want loaded
automatically, or any command that you want redefined, let me know.
03/15/79 01:09:34RUBENSTEINEMACS News ServiceThe EMACS news file can be accessed via two commands in the
ENEWS library:
Post EMACS News
This command will ask for a subject, then let you type
your news into a buffer. When you exit the recursive
EMACS with C-M-C, your news will be posted.
Read EMACS News
This command enables you to read recent EMACS news. It types
the date, author, and subject of each news item, most recent
first, and asks you if you want to see the rest. If you
answer Y or <Space>, it types it at you and asks for the next.
If you answer N or <delete>, it asks about the next without
typing it. If you answer X or Q, it quits asking and returns.
Try it!


91
src/e142/emacs.timing Normal file
View File

@@ -0,0 +1,91 @@
!* -*-TECO-*- *!
!* This is the default init file for EMACS.
Anything in the buffer when you start this
will be used instead of the JCL.
*!
0[y 0[X
FTA qy ux FS Runtime uy qy-qx=
Q..9"E Q..LU..9' !* ..9 is what to run on the way out.!
!* Maybe same as ..L.!
FQ(0FO..QAuto Save Filenames)-1"L
FS MSNAME:F6[0
:I*DSK:0;Autosave > M.VAuto Save Filenames ]0'
FS XJNAME :F6 [J
FS MSNAME FS D SNAME !* Make connected dir default name!
QFind File Inhibit Write UInhibit Write
!* On non-meta keyboards, allow Alt 1 2 to mean an arg of 12.!
FS %TOFCI"E
M.M ^R Autoarg[0 460.-1[1
10< Q0,%1^ FS ^R CMAC> Q0U..-
]1 ]0'
FTB qy ux FS Runtime uy qy-qx=
!* Process the JCL!
0[0 0[1
Z"E FJ' ZJ !* Get JCL, or use whatever previous init file left in buffer.!
."N !* Process JCL command - extract filenames and commands!
0,0A-
"E -D' !* REMOVE LF AT END IF ANY *!
J :S"N .,Z^ FX1 -D' !* IF COMMANDS TO EXECUTE, PUT THEM IN Q1!
HFX0' !* IF FILE TO BE READ, PUT NAME IN Q0!
'
FS LISPT"N FS CCL FNAMU0
0FS SUPERIOR !* Dont try to suck in LISPT.!
0U1 F~JSNDMSG"E M(M.M TEXT MODE)''
FTC qy ux FS Runtime uy qy-qx=
1fs Echo Errors
8FS HELP CHAR
HK FS Date FS FD Convert
9J \ [4 [3
HK
:I3
FTD qy ux FS Runtime uy qy-qx=
FS Rgetty-1"E !* If it's a DM!
0fo..qKEYPAD Inhibit "E !* and he has not inhibited it!
:I3Keypad 
M(M.MLoad Library)KEYPAD''
FTE qy ux FS Runtime uy qy-qx=
! FS MSNAME[0 F=0RUBENSTEIN "N
! MMRUNRECORD' ]0
FTF qy ux FS Runtime uy qy-qx=
Q0"E Q1"E !* If no commands / file to read, offer help.!
fs version :\ [2
qEMACS Version:\[1 !* get version no. as string!
Q4-12 "L FTGood Morning.'
"# Q4-18 "L FTGood Afternoon.'
"# FTGood Evening.''
FT
Sumex-AIM 3EMACS, version 1.2 - type ^H for help, # for news.

FTG qy ux FS Runtime uy qy-qx=
ER<EMACS>EMACS.NEWS
12FS IF FDB FS FD Convert EC ET@ >
FTLast news written  HT HK FT

FTH qy ux FS Runtime uy qy-qx=
:FI-#"E
FIW
M(M.MRun Library)ENEWSRead EMACS News'
]1 ]2
''
FQ0-1"L Q1"N M1' !* No file specified => execute commands from JCL!
0FS QP Unwind FTI qy ux FS Runtime uy qy-qx= :M..9' !* and enter ^R mode.!
QInhibit Write,M(M.M Visit File)0 !* VISIT SPECIFIED FILE, USING ">' AS DEFAULT FN2!
FSLISPT"N F~JSNDMSG"N !* If called by EXEC EDIT command...!
QBuffer Filenames F[ DFILE
0 FS DVERS !* Reset version number defaults.!
FS DFILE UBuffer Filenames
M(M.M& Set Mode Line)
F]D FILE''
Q1"N M1' !* If JCL held commands, execute them.!
f~JLISP"E M(M.MLoad Library)Intermacs !* if under a LISP then load Intermacs!
FS Exit'
0FS QP Unwind :M..9

28
src/e142/emacs.users Normal file
View File

@@ -0,0 +1,28 @@
Current EMACS users:Achenbach,Barr,Bennett,Bonnet,Brutlag,Gilmurray,JFinger,
Kennard,Rubenstein,Sacon,Schoen,Scott,Tajnai,Usecs,Vanmelle
EMACS users list as of 3/16/79
Name # times first last
used time time
Achenbach 31 3/1 3/16
Barr 28 3/12 3/16
Bennett 24 3/1 3/16
Bonnet 11 3/12 3/16
Brutlag 31 3/1 3/16
Clayton 1 3/16 3/16
Cower 2 3/14 3/14
Decsys 1 3/8 3/8
Gilmurray 11 3/1 3/14
Hedberg 1 2/28 2/28
JFinger 43 3/2 3/15
Kennard 1 3/16 3/16
Rubenstein ***** ***** *****
Sacon 7 3/14 3/16
Schoen 23 3/11 3/16
Scott 1 3/1 3/1
Srisw 1 3/3 3/3
Tajnai 2 3/16 3/16
Usecs 158 3/2 3/16
Vanmelle 47 3/2 3/15
Yeager 3 3/8 3/13

54
src/e142/enews. Normal file
View File

@@ -0,0 +1,54 @@
!~Filename~:! !Macros relating to the EMACS news file!
ENEWS
!Post EMACS News:! !C Post news in the EMACS news file
Asks for a subject, then gives you a buffer to type your news into.!
1,M(M.M&_ Read_ Line)Subject:_[0
Q0"E <FG M(M.M&_ Read_ Line)Subject:_u0 -q0:;>'
F[B Bind
F+ FTType_your_news.__Exit_with_C-M-C_(M-<esc>_C).
[..J :I..J Post_EMACS_News

[1 HFX1
F[ D File
ER<EMACS>EMACS.NEWS @Y
S -C
1I FS Date FS FD Convert
2I FS HSNAME [0 I0 ]0
3I G0
4I G1
5I
@:EW<EMACS>EMACS.NEWS HP :EF
@FT
Your_News_has_been_posted.
1fs Echo Active

!Read EMACS news:! !Prints out EMACS news.
Prints out subject, time, author for each news item and asks if the
user wants to see more.!
F[ B Bind F[ D File [0
ER <EMACS>EMACS.NEWS @Y
< :S;
FT
News_posted_ .,(S).-1t FT_by_ .,(.+1,(S).FC).-1t FT.
Subject:__ .,(S).-1T FT___Read_it?_
FI :FC U0
FT0

(Q0 - Q) * (Q0 - X) "E F+ '
(Q0 - N) * (Q0 - ) "E !<!>'
(Q0 - Y) * (Q0 - _) "E .,(S).-1T !<!>'
(Q0 - ?) "E FT
Q_or_X:_______Quit
N_or_Delete:__Go_on_to_next_message
Y_or_Space:___Type_this_message,_then_ask_about_next_message
?:____________Type_this_message

-S'
"# FG'
> FT
No_more_messages
 

57
src/e142/enews._ej Normal file
View File

@@ -0,0 +1,57 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
Y,6nw!
P]mwbi4:Post EMACS Newsp1,M(M.M& Read Line)Subject: [0
Q0"E<FGM(M.M& Read Line)Subject: u0-q0:;>'
F[BBind
F+FTType your news. Exit with C-M-C (M-<esc> C).
[..J:I..JPost EMACS News

[1HFX1
F[DFile
ER<EMACS>EMACS.NEWS@Y
S-C
1IFSDateFSFDConvert
2IFSHSNAME0]0
3IG0
4IG1
5I
@:EW<EMACS>EMACS.NEWSHP:EF
@FT
Your News has been posted.
1fsEchoActive
Read EMACS newsUF[BBindF[DFile[0
ER<EMACS>EMACS.NEWS@Y
<:S;
FT
News posted .,(S).-1tFT by .,(.+1,(S).FC).-1tFT.
Subject: .,(S).-1TFT Read it? 
FI:FCU0
FT0

(Q0-Q)*(Q0-X)"EF+'
(Q0-N)*(Q0-)"E!<!>'
(Q0-Y)*(Q0- )"E.,(S).-1T!<!>'
(Q0-?)"EFT
Q or X: Quit
N or Delete: Go on to next message
Y or Space: Type this message, then ask about next message
?: Type this message

-S'
"#FG'
>FT
No more messages
~Filename~ ENEWS~DOC~ ~Filename~,Macros relating to the EMACS news file
~DOC~ Post EMACS NewsmC Post news in the EMACS news file
Asks for a subject, then gives you a buffer to type your news into.
~DOC~ Read EMACS newszPrints out EMACS news.
Prints out subject, time, author for each news item and asks if the
user wants to see more.
~DIRECTORY~&Post EMACS News
Read EMACS news
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

62
src/e142/fork._ej Normal file
View File

@@ -0,0 +1,62 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
m6BSW
dsW_FP;B39& Setup FORK Library!:i*Fork EXECm.VLastfork
0Fork{1f[noquit
[2[30[4[..o
f Fork name: :FCU2
fq2"EQLastforku3
q3"E@FTLast fork was killed
''
"#:i3Fork 2'
f~3Fork EXEC"N
FF"N0fo..q3f"N,0fz'0M.V3
5,fq3:g3u2'
0FO..Q3f"NU4
q4fz'"#
1:<fz<SUBSYS>2.SAVu4>"N
1:<fz<USESYS>2.SAVu4>"N
1:<fz2.SAVu4>"N
fshsname[1
fz<1>2.SAVu4]1'''
q4M.V3'
'"#fz
:i3Fork EXEC'
q3uLastfork'
0 KForkE1f[noquit
[2[3[..o
f Handle name: :FCu2
q2"E'
fq2"N:i2Fork 2'"#
QLastforku2
Q2"E@FTLast fork already killed
'
@FTKill 21M(M.M& Yes or No)"E'''
f~2Fork EXEC"E
@FTCannot kill the EXEC fork!'
0FO..Q2u3
q3"E@FTNo such fork'
q3,0fz
0u2
qLastfork"N
F=Lastfork2"E0uLastfork''
0~Filename~FORK~DOC~ ~Filename~(Command to go to an inferior fork.
~DOC~ & Setup FORK Library*S Initialize for handling inferiors.
~DOC~ ForkC Invoke an inferior process.
Takes as string argument the name of the program to invoke. If a
fork by that name already exists, it is resumed. If given an
argument, kills the fork and restarts it. Name defaults to the last
fork run. We look for the program on <SUBSYS>, <USESYS>, your
connected directory, and your login directory, in that order. Use
KFork command to kill the fork.
~DOC~ KForkrC Kill an inferior process.
Follow command with the name of the fork to kill.
No name kills last fork run.
~DIRECTORY~'& Setup FORK Library
Fork
KFork
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

62
src/e142/fork._ej.2 Normal file
View File

@@ -0,0 +1,62 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
m6BSW"gv ZbIS>E6<& Setup FORK Library!:i*Fork EXECm.VLastfork
0Fork1f[noquit
[2[30[4[..o
f Fork name: :FCU2
fq2"EQLastforku3
q3"E@FTLast fork was killed
''
"#:i3Fork 2'
@ft
f~3Fork EXEC"N
FF"N0fo..q3f"N,0fz'0M.V3
5,fq3:g3u2'
0FO..Q3f"NU4
q4fz'"#
1:<fz<SUBSYS>2.SAVu4>"N
1:<fz<USESYS>2.SAVu4>"N
1:<fz2.SAVu4>"N
fshsname[1
fz<1>2.SAVu4]1'''
q4M.V3'
'"#fz
:i3Fork EXEC'
q3uLastfork'
0 KForkE1f[noquit
[2[3[..o
f Handle name: :FCu2
q2"E'
fq2"N:i2Fork 2'"#
QLastforku2
Q2"E@FTLast fork already killed
'
@FTKill 21M(M.M& Yes or No)"E'''
f~2Fork EXEC"E
@FTCannot kill the EXEC fork!'
0FO..Q2u3
q3"E@FTNo such fork'
q3,0fz
0u2
qLastfork"N
F=Lastfork2"E0uLastfork''
0~Filename~FORK~DOC~ ~Filename~(Command to go to an inferior fork.
~DOC~ & Setup FORK Library*S Initialize for handling inferiors.
~DOC~ ForkC Invoke an inferior process.
Takes as string argument the name of the program to invoke. If a
fork by that name already exists, it is resumed. If given an
argument, kills the fork and restarts it. Name defaults to the last
fork run. We look for the program on <SUBSYS>, <USESYS>, your
connected directory, and your login directory, in that order. Use
KFork command to kill the fork.
~DOC~ KForkrC Kill an inferior process.
Follow command with the name of the fork to kill.
No name kills last fork run.
~DIRECTORY~'& Setup FORK Library
Fork
KFork
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

62
src/e142/fork._ej.3 Normal file
View File

@@ -0,0 +1,62 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
m6BSW#hw [bJT?F6<& Setup FORK Library!:i*Fork EXECm.VLastfork
0Fork1f[noquit
[2[30[4[..o
f Fork name: :FCU2
fq2"EQLastforku3
q3"E@FTLast fork was killed
''
"#:i3Fork 2'
@ft 
f~3Fork EXEC"N
FF"N0fo..q3f"N,0fz'0M.V3
5,fq3:g3u2'
0FO..Q3f"NU4
q4fz'"#
1:<fz<SUBSYS>2.SAVu4>"N
1:<fz<USESYS>2.SAVu4>"N
1:<fz2.SAVu4>"N
fshsname[1
fz<1>2.SAVu4]1'''
q4M.V3'
'"#fz
:i3Fork EXEC'
q3uLastfork'
0 KForkE1f[noquit
[2[3[..o
f Handle name: :FCu2
q2"E'
fq2"N:i2Fork 2'"#
QLastforku2
Q2"E@FTLast fork already killed
'
@FTKill 21M(M.M& Yes or No)"E'''
f~2Fork EXEC"E
@FTCannot kill the EXEC fork!'
0FO..Q2u3
q3"E@FTNo such fork'
q3,0fz
0u2
qLastfork"N
F=Lastfork2"E0uLastfork''
0~Filename~FORK~DOC~ ~Filename~(Command to go to an inferior fork.
~DOC~ & Setup FORK Library*S Initialize for handling inferiors.
~DOC~ ForkC Invoke an inferior process.
Takes as string argument the name of the program to invoke. If a
fork by that name already exists, it is resumed. If given an
argument, kills the fork and restarts it. Name defaults to the last
fork run. We look for the program on <SUBSYS>, <USESYS>, your
connected directory, and your login directory, in that order. Use
KFork command to kill the fork.
~DOC~ KForkrC Kill an inferior process.
Follow command with the name of the fork to kill.
No name kills last fork run.
~DIRECTORY~'& Setup FORK Library
Fork
KFork
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

62
src/e142/fork._ej.4 Normal file
View File

@@ -0,0 +1,62 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
m6BSW#hw [bJT?F6<& Setup FORK Library!:i*Fork EXECm.VLastfork
0Fork1f[noquit
[2[30[4[..o
f Fork name: :FCU2
fq2"EQLastforku3
q3"E@FTLast fork was killed
''
"#:i3Fork 2'
@ft
f~3Fork EXEC"N
FF"N0fo..q3f"N,0fz'0M.V3
5,fq3:g3u2'
0FO..Q3f"NU4
q4fz'"#
1:<fz<SUBSYS>2.SAVu4>"N
1:<fz<USESYS>2.SAVu4>"N
1:<fz2.SAVu4>"N
fshsname[1
fz<1>2.SAVu4]1'''
q4M.V3'
'"#fz
:i3Fork EXEC'
q3uLastfork'
0 KForkE1f[noquit
[2[3[..o
f Handle name: :FCu2
q2"E'
fq2"N:i2Fork 2'"#
QLastforku2
Q2"E@FTLast fork already killed
'
@FTKill 21M(M.M& Yes or No)"E'''
f~2Fork EXEC"E
@FTCannot kill the EXEC fork!'
0FO..Q2u3
q3"E@FTNo such fork'
q3,0fz
0u2
qLastfork"N
F=Lastfork2"E0uLastfork''
0~Filename~FORK~DOC~ ~Filename~(Command to go to an inferior fork.
~DOC~ & Setup FORK Library*S Initialize for handling inferiors.
~DOC~ ForkC Invoke an inferior process.
Takes as string argument the name of the program to invoke. If a
fork by that name already exists, it is resumed. If given an
argument, kills the fork and restarts it. Name defaults to the last
fork run. We look for the program on <SUBSYS>, <USESYS>, your
connected directory, and your login directory, in that order. Use
KFork command to kill the fork.
~DOC~ KForkrC Kill an inferior process.
Follow command with the name of the fork to kill.
No name kills last fork run.
~DIRECTORY~'& Setup FORK Library
Fork
KFork
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

BIN
src/e142/grind._ej Normal file

Binary file not shown.

188
src/e142/intermacs. Normal file
View File

@@ -0,0 +1,188 @@
!~Filename~:! !Commands for Interlisp interface!
INTERMACS
!Grind Sexp:! !C Grind the sexp after the pointer.
A modification of the MIT Grind Sexp that recognizes that
in Interlisp, % quotes a character, " starts a long
string, and ; has no significance.
Uses QMiser Column to decide where to start using "Miser" format,
and QFill Column as the page width to aim for.
Saves the old sexp on the kill ring.!
1:<
FDL R !* Find the next list.!
F[VB F[VZ FL FSBOUND !* Narrow bounds to that list.!
F=MODELISP"N OConfirm'
z-b-1000"g !Confirm! ^FTDo_you_really_want_to_Grind_this_s-expression?_(Y_or_N):
FI :FC - Y(  FS Echo Display C FS Echo Display)"N ''
Z:
M(M.M &_Save_Region_and_Query) !* No arg so no query, just save region.!
W J
[2 [3
!*** Now normalize the expression; put it into the form PRIN1 would print.!
[D 128*5,32:ID !* In QD make a dispatch that!
11.*5:F D -D :M2  !* turns any whitespace into a single space,!
15.*5:F D RK :M2  !* deletes CRLFs and the indentation after them,!
12.*5:F D -D :M2 
%*5:F D C !* Handle %'s and "'s right.!
"*5:F D R ^FLL 
(*5:F D :M3  !* Make sure no whitespace follows ('s and ''s!
!"! '*5:F D :M3 
)*5:F D R M3 C  !* or precedes )'s.!
:I2 Z-.< 1A F_ :; D> 32I 
:I3 Z-.< 1A F_ :; D> 
HFD
J .( 0FS VBW 0L .FS VB )J !* Include all of line, up to (, after B,!
!* so that FS HPOS is accurate.!
!*** Now decode the grinding parameters.!
FS WIDTH-10[W !* Figure the width to aim at!
FS WIDTH*2/3[C !* and the comment column.!
0FO ..Q Fill_Column F"N UW
QWUC'
-1FO ..Q Comment_Column +1F"G -1UC'
QC[M !* Figure the place to switch to Miser fmt.!
-1FO ..Q Miser_Column +1F"G -1UM'
[R :IR /8+1*8
0FO ..Q Comment_Rounding F"N UR'
M.M &_Indent [I
!* G gets recursive macro to grind and pass 1 sexp.!
!* It expects numerc arg = depth in parens.!
[G ^:IG`
[2 S' R !* Pass by all leading quotes.!
1A-("N ^FWL ' !* Atoms, just skip over.!
FL-.-QW++(FS HPOSU2 Q2)"L FLL ' !* Lists that fit in line, skip over.!
C Q2-QM"L !* If not yet far enough for Miser fmt,!
!"! 1A F';()"L ^FWL 1A-32"E C''' !* Skip 1st element, so get 2 on 1st line.!
!* But if 1st element is a list, use miser fmt anyway.!
FS HPOS U2 !* Q2 gets column to put rest of elements at.!
!LP! 1a-32"E D O LP' !* Don't be confused by whitespace.!
1A-)"E C ' !* Until end of this list,!
FS HPOSU3
Q3-Q2"N 13I 10I !* and for lists, indent to right place!
Q2/8,9I Q2&7,32I'
+1MG O LP !* and recursively grind.!
`
0MG !* DO IT!
J 7F~ (DEFUN_"E !* Now, if list is (DEFUN FOO<cr>..., then!
^FLL 8F=
______"E
8D .U3 L !* Get the thing after FOO onto first line,!
Q3,. F~FEXPR
*(Q3,. F~MACRO
)"E !* and if it is a function property name,!
-2D 6D''' !* get it on that line too.!
J HU2U3
> !* end errset!
J Z: !* Leave region around the ground sexp.!
Q3,Q2
!& LISP SUPERIOR:! !S Insert as directed by call from LISP.!
[A
[B
[0
.U0 ZJ Z-3"G
0A-3"E -4D''
Q0J !* We delete the four characters at the!
!* end that are used to stop LISP from!
!* reading too far!
"N
FSIFILEUA !* The most recently opened input file!
QLISPFILEUB !* The EMACS.TEMP.FILE!
FS UREAD"N !* If anything is open,!
F~AB"N !* then if it's not EMACS.TEMP.FILE!
E[ !* push the input!
F[ D FILE !* push the default!
FN E] !* pop the input on exit from here!
ERB' !* and open up EMACS.TEMP.FILE!
0FSIFACCESS' !* start reading at the beginning!
FS UREAD"E !* if nothing is open!
ERB' !* read EMACS.TEMP.FILE!
U0
"L -Q0U0' !* The absolute value of the arg in 0!
"G MM^R_SET/POP_MARK
ZJ'
Q0FY
"L
.+,.FXA !* If the arg is negative we put!
MA' !* the stuff in A, delete and macro it.!
"G
R
.,ZFSBOUNDARIES'
' !* We do nothing on a zero arg!
+1"G F+ !* If arg nonnegative, clear screen and refresh.!
:F'

!^R UP EVAL:! !^R Return to LISP and evaluate sexp after point.!
1000MM^R_Exit_To_LISP

!^R ARGLIST:! !^R Write into lower buffer arglist atom after point.
Writes into lower buffer LISP arglist of function after point (or after
open parenthesis after point.)!
1001MM^R_Exit_To_LISP

!^R Pretty Print:! !^R Pretty print buffer (using LISP pretty printer).
Leaves point close to where it was, namely after the rightmost close
parenthesis before point.!
[0
0u0
<-:S(; %0>
1003MM^R_Exit_To_LISP
.-B"E Q0:S('

!^R Print to Level:! !^R Print sexp after point with PRINTLEVEL set.
Prints sexpression after point into lower buffer with PRINTLEVEL
set to EMACS.P.PRINT.LEVEL.!
1002MM^R_Exit_To_LISP

!^R Exit To LISP:! !^R Simply return to LISP.
Follows the protocol of closing the gap and
leaving at the end of the buffer a string
guaranteed to stop a LISP read.!
[0
.U0
ZJ
I_"
1F? !* Close the gap, so LISP can!
!* read from the buffer!
Q0J
FSEXIT

!& Setup INTERMACS Library:! !S SETUP!
[J
1M.VLISPFILE
FSJNAMEUJ
F~JLISP"E
FS MSNAME FS D SNAME
EREMACS.TEMP.FILE.0
FS I FILE ULISPFILE
F~Editor_NameEMACS/Datamedia"E
M.M^R_Pretty_PrintU...T
M.M^R_Pretty_PrintU:.X(T)
M.M^R_Print_To_Level U..T
M.M^R_Exit_To_LISPM.VMM_Quit
M.M^R_ARGLIST U.A
M.M^R_Up_EVAL U.Y'
"#M.M^R_Pretty_PrintU...P
M.M^R_Print_To_Level U..P
M.M^R_Exit_To_LISP U ..Z
M.M^R_Exit_To_LISP U...Z
M.M^R_ARGLIST U...?
M.M^R_Up_EVAL U...Y'
M.M&_LISP_SuperiorFSSUPERIOR'
1m.vLISP_)_HACK
mmLISP_MODE
MM&_Process_Options
:I..D_A____A____A____A____A____A____A____A____A______________A_________
____A____A____A____A____A____A____A____A____A____A____A____A____A____A____A____A____A____A_________A____|____A___AA___A/____A____'____(____)____A____A____A____A___AA____A___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA____A____A____A____A____A____A____A___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA____A____A____A____A____A____A___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA___AA____A____A____A____A________


178
src/e142/intermacs._ej Normal file
View File

@@ -0,0 +1,178 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
Q[dho_h&FPqx
D
Pp
 $gtAN
g
q p z b iTZGrind SexpW1:<
FDLR
F[VBF[VZFLFSBOUND
F=MODELISP"NOConfirm'
z-b-1000"g!Confirm!^FTDo you really want to Grind this s-expression? (Y or N):
FI:FC-Y(FSEchoDisplayCFSEchoDisplay)"N''
Z:
M(M.M& Save Region and Query)
WJ
[2[3
[D128*5,32:ID
11.*5:FD-D:M2
15.*5:FDRK:M2
12.*5:FD-D:M2
%*5:FDC
"*5:FDR^FLL
(*5:FD:M3
!"!'*5:FD:M3
)*5:FDRM3C
:I2Z-.<1AF  :;D>32I
:I3Z-.<1AF  :;D>
HFD
J.(0FSVBW0L.FSVB)J
FSWIDTH-10[W
FSWIDTH*2/3[C
0FO..QFill ColumnF"NUW
QWUC'
-1FO..QComment Column+1F"G-1UC'
QC[M
-1FO..QMiser Column+1F"G-1UM'
[R:IR/8+1*8
0FO..QComment RoundingF"NUR'
M.M& Indent
[G^:IG`
[2S'R
1A-("N^FWL'
FL-.-QW++(FSHPOSU2Q2)"LFLL'
CQ2-QM"L
!"!1AF';()"L^FWL1A-32"EC'''
FSHPOSU2
!LP!1a-32"EDOLP'
1A-)"EC'
FSHPOSU3
Q3-Q2"N13I10I
Q2/8,9IQ2&7,32I'
+1MGOLP
`
0MG
J7F~(DEFUN "E
^FLL8F=
"E
8D.U3L
Q3,.F~FEXPR
*(Q3,.F~MACRO
)"E
-2D6D'''
JHU2U3
>
JZ:
Q3,Q2& LISP SUPERIOR[A
[B
[0
.U0ZJZ-3"G
0A-3"E-4D''
Q0J
"N
FSIFILEUA
QLISPFILEUB
FSUREAD"N
F~AB"N
E[
F[DFILE
FNE]
ERB'
0FSIFACCESS'
FSUREAD"E
ERB'
U0
"L-Q0U0'
"GMM^R SET/POP MARK
ZJ'
Q0FY
"L
.+,.FXA
MA'
"G
R
.,ZFSBOUNDARIES'
'
+1"GF+
:F'
^R UP EVAL1000MM^R Exit To LISP
^R ARGLIST1001MM^R Exit To LISP
^R Pretty Print@[0
0u0
<-:S(;%0>
1003MM^R Exit To LISP
.-B"EQ0:S('
^R Print to Level1002MM^R Exit To LISP
^R Exit To LISP.[0
.U0
ZJ
I "
1F?
Q0J
FSEXIT
& Setup INTERMACS Library) [J
1M.VLISPFILE
FSJNAMEUJ
F~JLISP"E
FSMSNAMEFSDSNAME
EREMACS.TEMP.FILE.0
FSIFILEULISPFILE
F~Editor NameEMACS/Datamedia"E
M.M^R Pretty PrintU...T
M.M^R Pretty PrintU:.X(T)
M.M^R Print To LevelU..T
M.M^R Exit To LISPM.VMM Quit
M.M^R ARGLISTU.A
M.M^R Up EVALU.Y'
"#M.M^R Pretty PrintU...P
M.M^R Print To LevelU..P
M.M^R Exit To LISPU..Z
M.M^R Exit To LISPU...Z
M.M^R ARGLISTU...?
M.M^R Up EVALU...Y'
M.M& LISP SuperiorFSSUPERIOR'
1m.vLISP ) HACK
mmLISP MODE
MM& Process Options
:I..D A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A | A AA A/ A ' ( ) A A A A AA A AA AA AA AA AA AA AA AA AA AA A A A A A A A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A A A A A A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A A A A 
~Filename~
INTERMACS~DOC~ ~Filename~&Commands for Interlisp interface
~DOC~ Grind SexpZC Grind the sexp after the pointer.
A modification of the MIT Grind Sexp that recognizes that
in Interlisp, % quotes a character, " starts a long
string, and ; has no significance.
Uses QMiser Column to decide where to start using "Miser" format,
and QFill Column as the page width to aim for.
Saves the old sexp on the kill ring.
~DOC~ & LISP SUPERIOR-S Insert as directed by call from LISP.
~DOC~ ^R UP EVAL6^R Return to LISP and evaluate sexp after point.
~DOC~ ^R ARGLIST#^R Write into lower buffer arglist atom after point.
Writes into lower buffer LISP arglist of function after point (or after
open parenthesis after point.)
~DOC~ ^R Pretty Print^R Pretty print buffer (using LISP pretty printer).
Leaves point close to where it was, namely after the rightmost close
parenthesis before point.
~DOC~ ^R Print to Level^R Print sexp after point with PRINTLEVEL set.
Prints sexpression after point into lower buffer with PRINTLEVEL
set to EMACS.P.PRINT.LEVEL.
~DOC~ ^R Exit To LISP^R Simply return to LISP.
Follows the protocol of closing the gap and
leaving at the end of the buffer a string
guaranteed to stop a LISP read.
#~DOC~ & Setup INTERMACS Library
S SETUP
~DIRECTORY~ Grind Sexp
& LISP SUPERIOR
^R UP EVAL
^R ARGLIST
^R Pretty Print
^R Print to Level
^R Exit To LISP
& Setup INTERMACS Library
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

196
src/e142/kbdmac. Normal file
View File

@@ -0,0 +1,196 @@
!*-*-TECO-*-!
!* A keyboard macro's data is represented using two ascii characters
to describe each 9-bit character. The first ascii character holds
the top 2 bits of the 9-bit character, and the second ascii character
holds the low 7 bits. When the macro is run, pairs of characters are
converted back into single 9-bit characters.
Keyboard macros are encapsulated in TECO macros by putting the 36 chars
"<Excl>temp<Excl>m(m.m& Immediate Kbd Macro)" in front.
This serves to make the TECO macro recognizable and to make
it push the kbd macro when invoked.
The keyboard macro call stack is a qvector in q..m.
It has three slots for each call on the stack.
The first slot contains the macro string.
This string includes the call to & Immediate Kbd Macro.
The second slot contains the index at which we are fetching from the string.
The initial value of this slot is 36.
The third slot contains the repeat count.!
!~Filename~:! !Defining and calling keyboard macros.!
KBDMAC
!& Setup KBDMAC Library:! !S Put commands on keys. Create execution stack.!
m.m ^R_Start_Kbd_Macro u:.x(()
m.m ^R_End_Kbd_Macro u:.x())
m.m ^R_Call_Last u:.x(E)
m.m ^R_Kbd_Macro_Query u:.x(Q)
:i* m.v Last_Kbd_Macro
20.*5fs q vectoru..m
q..m[..o hk 
!& Run Kbd Macro:! !S This is the FS TYI SOURCE for running keyboard macros.!
fq..m/5-3[2
q:..m(q2)[0 !* Get innermost running keyboard macro string.!
q:..m(%2)[1 !* Fetch and increment the index at which we are fetching.!
q1:g0*200.+(%1:g0) fs reread !* Form next input character, from next!
!* two elements of string.!
%1u:..m(q2) !* Store back index into string.!
q1-fq0"l 0' !* If string is exhausted,!
q:..m(%2)-1u0 !* decrement repeat count,!
q0f"nf"gu:..m(q2)' !* If not exhausted, decrement count unless it was 0!
36u:..m(q2-1) 0' !* and anyway jump back to start of macro.!
q..m[..o zj -15d !* Repeat count exhausted => pop it off the pdl,!
z"e 0 fs tyi source' !* and if the pdl is empty we are no longer in a macro.!
0 !* Return value for ^R, in case ^R is reading the char.!
!& Immediate Kbd Macro:! !S Push a kbd macro onto the execution stack of such.
Supply the repeat count as pre-comma argument
and a string pointer to the macro as post-comma argument.!
q..m[..o
fs tyi source"e hk' !* If an error turned off macro execution,!
!* clear out macro call stack.!
zj 15,0i !* Make three more words in the call stack.!
-1fsback str,.-15fs word !* Fill them with string, starting index, and rpt count.!
36,.-10fs word
,.-5fs word
m.m &_Run_Kbd_Macro fs tyi source
0
!^R Call Last Kbd Macro:! !^R Run the last defined temporary keyboard macro.
A numeric argument is a repeat count.!
:mLast_Kbd_Macro
!^R Start Kbd Macro:! !C Begin defining keyboad macro.
After you type this command, everything you type becomes
part of the accumulating keyboard macro as well as being executed.!
0 fs b consm.v Kbd_Macro_Defining_Body
0 m.v Kbd_Macro_Defining_Index
m.m &_Define_Kbd_Macro fs tyi sink
1:<1fs mode ch>
0
!& Define Kbd Macro:! !S FS TYI SINK for defining kbd macros.
Takes characters typed and accumulates them in a buffer
which will be formed into a keyboard macro when the definition is finished.!
qKbd_Macro_Defining_Body[..o zj !* Select the buffer we use to accumulate.!
fs tyi beg-(fs tyi count-1)"e !* If this is 1st char of ^R command,!
zuKbd_Macro_Defining_Index' !* update index in buffer of last such.!
/200.i &177.i 0 !* Insert the two characters for this command character.!
!^R End Kbd Macro:! !C Terminate definition of a keyboard macro.
All that you have typed since starting the definition,
except this command itself, becomes the definition.
An argument means re-execute the macro immediately, with the
argument as repeat count, counting defining the macro as once.
^R Call Last Kbd Macro re-executes the last macro defined.!
qKbd_Macro_Defining_Body[..o
qKbd_Macro_Defining_Indexj .,zk !* Flush the End Kbd Macro command from the string.!
j i !temp!m(m.m&_immediate_Kbd_Macro) !* Put command to call kbd macro at beginning.!
hx* m.v Last_Kbd_Macro !* make mLast_Kbd_Macro call the macro.!
Q..o( ]..o
) fs bkill !* Flush the data structures used in defining.!
0 fs tyi sink
1:<1 fs mode ch>
-1"e 0' !* If arg is 1, we are done.!
f"g-1'mLast_Kbd_Macro' !* Else, repeat appropriate number of extra times.!
0
!Name Kbd Macro:! !C Give a name to the last kbd macro defined.
An MM command is created with the name you specify,
which when invoked runs that keyboard macro.
Then, you are asked to give the command character to
put the macro on. Type Return or Rubout if you don't want
to put it on any character. Otherwise, type a character
which is undefined or is already a keyboard macro.
Prefix characters such as Altmode and ^X may be used.!
1,f Command_Name[1 !* Read name of MM command, and define it unless null.!
fq1"g qLast_Kbd_Macro m.v MM_1'
:i..0 ^R_Command_to_define:_
m(m.m &_Read_Q-reg)[2 !* Ask what character to put it in.!
f=2
"e 0'
f=2"e 0' !* If he said CR or rubout, don't.!
q2m(m.m &_Check_Redefinition) !* Verify that this char is ok to redefine.!
qLast_Kbd_Macrou2 !* Redefine it.!
0
!View Kbd Macro:! !C Print definition of a keyboard macro.
Supply a suffix string argument containing the command name.
If the string argument is null, you will be asked to type
the character which runs the macro.!
:i*[0 !* Get the string arg.!
:i..0 Kbd_Macro_Command:_
fq0"e m(m.m &_Read_Q-reg)u0' !* If null, read character from terminal.!
q0[1 !* Get contents of string.!
m.m ^R_Call_Last_Kbd-q1"e !* If it's the ^X^E command,!
qLast_Kbd_Macrou1 !* get the macro it would run.!
:i0Last_Kbd_Macro'
f[b bind g1 !* Get the thing in a buffer.!
j s) 0,.k !* Flush the call to & immediate kbd macro.!
ft
Definition_of_keyboard_macro_0:


m.m&_Charprint[2
j z/2< 1a*200.+(2c0a) m2 ft_>
ft

0
!& Check Redefinition:! !S Verify that a certain command can be redefined.
Do not allow a command to be redefined unless it is undefined,
self-inserting, or a string starting with Temp.
The command is specified with a q-register name in a string
passed as a string pointer.!
[1
q1[0 !* Q0 gets old definition.!
fq0+1"g !* If old definition is a string not made by this macro,!
f~(0,6:g0)!Temp!"n !* don't let user clobber useful command.!
!lose! !"! :I*Can't_clobber_specified_character_1 fs err''
"# Afs^r init-q0"n
200.@ fs^rinit-q0"n !* Don't redefine built-ins except error and self-insert.!
q0"n !* Undefined slots in dispatch prefix are 0.!
o lose''''

!^R Kbd Macro Query:! !^R Query and continue macro execution.
If called from a macro, reads a character:
Space continues execution.
Rubout terminates this repetition of the macro.
Altmode terminates all repetitions of the macro.
. terminates after the end of this repetition of the macro.
^R enters a recursive edit; when you exit, you are asked again.
^L clears the screen and asks you again.
Anything else exits all macros and is reread as a command.!
fs tyi source"e 0' !* if not from inside macro, do nothing!
[0[1 [..j :i..j Kbd_Macro_Query
0f[ tyi source 0f[ tyi sink
!Read!
2,m.i @:fiu1 fiu0 !* get character, really from tty!
q0- "e f+ Oread'
q0-"e 0 Oread'
-2fsqpun !* pop tyi source and tyi sink!
q0-32"e 0' !* space continues on!
q0-."e 1u:..m(fq..m/5-1) 0' !* . ends after this, set rpt count to 1.!
q0-"e 1u:..m(fq..m/5-1)' !* For Altmode, set rpt count to 1 so flush all repeats.!
q0f:"l !* Both Rubout and Altmode end this repetition!
fq:..m(fq..m/5-3)-2 !* by skipping up to the last char
! u:..m(fq..m/5-2)
fi ' !* and reading it, causing macro to be popped.!
0fs tyi source !* Other characters quit macro execution!
q1fs reread !* and are unread.!

BIN
src/e142/kbdmac._ej Normal file

Binary file not shown.

Binary file not shown.

32
src/e142/maze. Normal file
View File

@@ -0,0 +1,32 @@
:-:-:-:-:-: :-:-:-:-:-:-:-:-:-:
| | | |
: :-:-:-: :-: :-: : : :-:-:-:-:
| | | | | | | |
: : :-: :-: : :-:-: : :-: :-: :
| | | | | | | | |
:-:-: :-:-:-:-: : : :-: :-: : :
| | | | | | | | |
: :-:-: :-: : :-:-:-: : : :-: :
| | | | | | |
: :-:-:-:-:-: : :-: :-: :-: : :
| | | | | | | |
:-:-: : : : :-:-: :-:-:-: :-:-:
| | | | | | |
:-:-:-:-: :-:-: :-:-: : :-: :-:
| | | | | | | | |
: : :-: :-: : : : : : : : :-: :
| | | | | | | | | | |
: :-: :-:-:-: :-:-:-:-: : : : :
| | | | | | | |
:-:-:-: :-: :-: :-: :-: : :-: :
| | | | | | | | |
:-: :-:-: : : : : : : :-:-: : :
| | | | | | | | | |
: :-: :-:-:-:-:-:-:-: : : : : :
| | | | | | | |
:-:-:-:-: : :-: : :-:-: : : : :
| | | | | | | | |
: :-:-: :-: : :-:-:-: : : : :-:
| | | | | |
:-:-: :-:-:-:-:-:-:-:-:-:-:-:-:


BIN
src/e142/mazlib._ej Normal file

Binary file not shown.

848
src/e142/monsym. Normal file
View File

@@ -0,0 +1,848 @@
;*****************************************
;JSYS SPECIFIC ARGUMENTS
;THE FOLLOWING ARE ORDERED ALPHABETICALLY BY JSYS NAME
;******************************************
;ATTACH
AT%CCJ==:1B0 ;^C JOB WHEN ATTACHED
AT%NAT==:1B1 ;NO ATTACH
AT%TRM==:1B2 ;7 TERMINAL IN 4, NOT CONTROLLING TERM
AT%DIR==:777777B35 ;DIRECTORY NUMBER
;CFORK
CR%MAP==:1B0 ;SET MAP FOR NEW FORK TO POINT TO
; THIS PROCESS
CR%CAP==:1B1 ;MAKE CAPABILITIES IDENTICAL
CR%ACS==:1B3 ;SET ACS FROM BLOCK
CR%ST==:1B4 ;START PROCESS AT PC
CR%PCV==:777777B35 ;VALUE OF PC
;CHFDB
CF%NUD==:1B0 ;NO UPDATE DIRECTORY
CF%DSP==:777B17 ;FDB DISPLACEMENT
CF%JFN==:777777B35 ;JFN
;CLOSF
CO%NRJ==:1B0 ;NO RELEASE JFN
CO%WCL==:1B1 ;TOPS20AN ;WAIT UNTIL MATCHING CLS IS RECEIVED
CO%JFN==:777777B35 ;JFN
;CLZFF
CZ%NIF==:1B0 ;NO INFERIOR FORK FILES
CZ%NSF==:1B1 ;NO SELF FORK FILES
CZ%NRJ==:1B2 ;NO RELEASE JFN
CZ%NCL==:1B3 ;NO CLOSE FILE
CZ%UNR==:1B4 ;UNRESTRICT
CZ%ARJ==:1B5 ;ALWAYS RELEASE JFN
CZ%ABT==:1B6 ;ABORT
CZ%NUD==:1B7 ;NO UPDATE DIRECTORY
CZ%PRH==:777777B35 ;PROCESS HANDLE
;CNDIR
CN%CKP==:1B0 ;CHECK PASSWORD ONLY
CN%NOC==:1B1 ;NO CONNECT
CN%JOB==:1B2 ;DOING CONNECT FOR ANOTHER JOB
CN%DIR==:777777B35 ;DIRECTORY NUMBER
;DELDF
DD%DTF==:1B0 ;DELETE TEMPORARY FILES
DD%DNF==:1B1 ;DELETE NONEXISTENT FILES
DD%RST==:1B2 ;REBUILD THE SYMBOL TABLE
DD%CHK==:1B3 ;CHECK THE DIR FOR CONSISTENCY ONLY
DD%DIR==777777B35 ;DIRECTORY NUMBER
;DELF
DF%NRJ==:1B0 ;DON'T RELEASE JFN
DF%EXP==:1B1 ;EXPUNGE CONTENTS
DF%FGT==:1B2 ;FORGET (EXPUNGE W/O DEASSIGNING ADDRESSES)
DF%DIR==:1B3 ;DELETE, FORGET, AND EXPUNGE A DIRECTORY
; FILE. (ONLY IF ^E-CREATE KILL FAILED)
DF%JFN==777777B35 ;JFN
;DUMPI/DUMPO
DM%NWT==:1B0 ;NO WAIT FOR COMPLETION
DM%FIN==:1B1 ;FINISH PREVIOUS REQUEST
;***NOT INPLEMENTED YET***
DM%PTR==:777777B35 ;POINTER TO COMMAND LIST
;DVCHR AND DVCH1 BIT DEFINITIONS
DV%OUT==:1B0 ;DEVICE CAN DO OUTPUT
DV%IN==:1B1 ;DEVICE CAN DO INPUT
DV%DIR==:1B2 ;DEVICE HAS A DIRECTORY
DV%AS==:1B3 ;DEVICE IS ASSIGNABLE
DV%MDD==:1B4 ;DEVICE IS A MULTIPLE DIRECTORY DEVICE
DV%AV==:1B5 ;DEVICE IS AVAILABLE TO THIS JOB
DV%ASN==:1B6 ;DEVICE IS ASSIGNED BY ASND
DV%MDV==:1B7 ;DEVICE IS A MOUNTABLE DEVICE
DV%MNT==:1B8 ;DEVICE IS MOUNTED
DV%TYP==:777B17 ;DEVICE TYPE FIELD
DV%MOD==:177777B35 ;DEVICE DATA MODE
DV%M0==:1B35 ;DEVICE CAN BE OPENED IN MODE 0
DV%M1==:1B34 ;DEVICE CAN BE OPENED IN MODE 1
DV%M2==:1B33 ;DEVICE CAN BE OPENED IN MODE 2
DV%M3==:1B32 ;DEVICE CAN BE OPENED IN MODE 3
DV%M4==:1B31 ;DEVICE CAN BE OPENED IN MODE 4
DV%M5==:1B30 ;DEVICE CAN BE OPENED IN MODE 5
DV%M6==:1B29 ;DEVICE CAN BE OPENED IN MODE 6
DV%M7==:1B28 ;DEVICE CAN BE OPENED IN MODE 7
DV%M10==:1B27 ;DEVICE CAN BE OPENED IN MODE 10
DV%M11==:1B26 ;DEVICE CAN BE OPENED IN MODE 11
DV%M12==:1B25 ;DEVICE CAN BE OPENED IN MODE 12
DV%M13==:1B24 ;DEVICE CAN BE OPENED IN MODE 13
DV%M14==:1B23 ;DEVICE CAN BE OPENED IN MODE 14
DV%M15==:1B22 ;DEVICE CAN BE OPENED IN MODE 15
DV%M16==:1B21 ;DEVICE CAN BE OPENED IN MODE 16
DV%M17==:1B20 ;DEVICE CAN BE OPENED IN MODE 17
D1%SPL==:1B0 ;DEVICE IS SPOOLED
D1%ALC==:1B1 ;DEVICE IS UNDER CONTROL OF ALLOCATOR
D1%VVL==:1B2 ;VOLUME VALID
;DEVICE TYPE DEFINITIONS
.DVDSK==:0 ;DISK
.DVMTA==:2 ;MAGTAPE
.DVDTA==:3 ;DECTAPE
.DVPTR==:4 ;PAPER TAPE READER
.DVPTP==:5 ;PAPER TAPE PUNCH
.DVDSP==:6 ;DISPLAY
.DVLPT==:7 ;LINE PRINTER
.DVCDR==:10 ;CARD READER
.DVFE==:11 ;FRONT END DEVICE
.DVTTY==:12 ;TERMINAL
.DVPTY==:13 ;PTY
.DVNUL==:15 ;NULL DEVICE
.DVNET==:16 ;ARPA NETWORK
.DVPLT==:17 ;PLOTTER
;FLOUT/DFOUT
;FORMAT CONTROL WORD
FL%SGN==:3B1 ;FIRST FIELD SIGN CONTROL
.FLDIG==:0 ;DIGIT
.FLSPC==:1 ;SPACE
.FLPLS==:2 ;PLUS SIGN
.FLSPA==:3 ;SPACE
FL%JUS==:3B3 ;FIRST FIELD JUSTIFICATION CONTROL
.FLLSP==:0 ;LEADING SPACES
.FLLZR==:1 ;LEADING ZEROS
.FLLAS==:2 ;LEADING ASTERISKS
.FLTSP==:3 ;TRAILING SPACES
FL%ONE==:1B4 ;FIRST FIELD NONBLANK
FL%DOL==:1B5 ;DOLLAR SIGN PREFIX
FL%PNT==:1B6 ;DECIMAL POINT
FL%EXP==:3B8 ;THIRD FIELD EXPONENT CONTROL
.FLEXN==:0 ;NO EXPONENT
.FLEXE==:1 ;E EXPONENT PREFIX
.FLEXD==:2 ;D EXPONENT PREFIX
.FLEXM==:3 ;*10^ EXPONENT PREFIX
FL%ESG==:3B10 ;EXPONENT SIGN CONTROL
.FLDGE==:0 ;DIGIT
.FLPLE==:1 ;PLUS SIGN
.FLSPE==:2 ;SPACE
.FLDGT==:3 ;DIGIT
FL%OVL==:1B11 ;COLUMN OVERFLOW
FL%RND==:37B17 ;DIGIT POSITION FOR ROUNDING
FL%FST==:77B23 ;FIRST FIELD WIDTH
FL%SND==:77B29 ;SECOND FIELD WIDTH
FL%THD==:77B35 ;THIRD FIELD WIDTH
;GDSTS
;SEE MTOPR FOR CARD READER AND LINE PRINTER STATUS BITS
;SEE GENERAL FIELD AND VALUE SECTION FOR MAGTAPE STATUS BITS
;SEE TOPS20AN SECTION FOR NETWORK STATUS BITS
.GDFSM==:17B3 ;TOPS20AN ;FINITE MACHINE STATE
;GET
GT%ADR==1B19 ;USE ADDRESS LIMITS IN AC2
;GFRKS
GF%GFH==:1B0 ;GET RELATIVE FORK HANDLES
GF%GFS==:1B1 ;GET FORK STATUS
;GTJFN DEFINITIONS
;FLAGS PROVIDED TO GTJFN ON CALL
GJ%FOU==:1B0 ;FILE IS FOR OUTPUT USE
GJ%NEW==:1B1 ;NEW FILE ONLY
GJ%OLD==:1B2 ;OLD FILE ONLY
GJ%MSG==:1B3 ;PRINT AN APPROPRIATE MESSAGE
GJ%CFM==:1B4 ;CONFIRMATION IS REQUIRED
GJ%TMP==:1B5 ;TEMPORARY
GJ%NS==:1B6 ;DONT SEARCH SEARCH LISTS
GJ%ACC==:1B7 ;NO ACCESS BY OTHER FORKS
GJ%DEL==:1B8 ;IGNORE "DELETED" BIT
GJ%JFN==:3B10 ;JFN USE FIELD
.GJDNU==:0 ;DO NOT USE JFN PROVIDED
.GJERR==:2 ;ERROR IF CANNOT USE JFN PROVIDED
.GJALT==:3 ;USE ALTERNATE IF CANNOT USE GIVEN JFN
GJ%IFG==:1B11 ;ACCEPT INPUT FILE GROUP DESCRIPTORS
GJ%OFG==:1B12 ;ACCEPT OUTPUT FILE GROUP DESCRIPTORS
GJ%FLG==:1B13 ;RETURN FLAGS
GJ%PHY==:1B14 ;PHYSICAL DEVICE ONLY
GJ%XTN==:1B15 ;EXTENDED FORMAT (E+11 EXISTS)
GJ%FNS==:1B16 ;ACCUMULATOR 2 CONTAINS JOB FILE NUMBERS
GJ%SHT==:1B17 ;SHORT CALL FORMAT
;FLAGS PROVIDED TO GTJFN (IN SECOND FLAG WORD)
G1%RND==:1B0 ;RETURN ON NULL(IN ALTERNATE FLAG WORD)
G1%RBF==:1B1 ;^R BUFFER IS DISJOINT
G1%NLN==:1B2 ;NO LONG NAMES
G1%RCM==:1B3 ;RETURN CONFIRM MESSAGE
;FLAGS RETURNED BY GTJFN
GJ%DEV==:1B0 ;ASTERISK WAS GIVEN FOR DEVICE
GJ%UNT==:1B1 ;ASTERISK WAS GIVEN FOR UNIT
GJ%DIR==:1B2 ;ASTERISK WAS GIVEN FOR DIRECTORY
GJ%NAM==:1B3 ;ASTERISK WAS GIVEN FOR NAME
GJ%EXT==:1B4 ;ASTERISK WAS GIVEN FOR EXTENSION
GJ%VER==:1B5 ;ASTERISK WAS GIVEN FOR GENERATION
GJ%UHV==:1B6 ;USE HIGHEST GENERATION
GJ%NHV==:1B7 ;USE NEXT HIGHER GENERATION
GJ%ULV==:1B8 ;USE LOWEST GENERATION
GJ%PRO==:1B9 ;PROTECTION GIVEN
GJ%ACT==:1B10 ;ACCOUNT GIVEN
GJ%TFS==:1B11 ;TEMPORARY FILE SPECIFIED (;T)
GJ%GND==:1B12 ;COMPLEMENT OF GJ%DEL ON CALL
;GTJFN TABLE OFFSETS
.GJGEN==:0 ;FLAGS ,, GENERATION
.GJDEF==:0 ;DEFAULT GENERATION
.GJNHG==:-1 ;NEXT HIGHER GENERATION
.GJLEG==:-2 ;LOWEST EXISTING GENERATION
.GJALL==:-3 ;ALL GENERATIONS (I.E., ;*)
.GJSRC==:1 ;SOURCE JFN ,, OUTPUT JFN
.GJDEV==:2 ;DEFAULT DEVICE
.GJDIR==:3 ;DEFAULT DIRECTORY
.GJNAM==:4 ;DEFAULT NAME
.GJEXT==:5 ;DEFAULT EXTENSTION
.GJPRO==:6 ;DEFAULT PROTECTION
.GJACT==:7 ;DEFAULT ACCOUNT
.GJJFN==:10 ;DESIRED JFN
.GJF2==:11 ;SECOND GROUP FLAGS,,COUNT
.GJCPP==:12 ;COPY BUFFER POINTER
.GJCPC==:13 ;COPY BUFFER COUNT
.GJRTY==:14 ;RETYPE (^R) POINTER
.GJBFP==:15 ;TOP OF BUFFER POINTER
;GNJFN - FLAGS RETURNED
GN%DIR==:1B14 ;DIRECTORY CHANGED
GN%NAM==:1B15 ;NAME CHANGED
GN%EXT==:1B16 ;EXTENSION CHANGED
;GTRPW
PF%USR==:1B0 ;PAGE FAIL WORD - USER MODE REFERENCE
PF%WRT==:1B5 ; " - WRITE REFERENCE
TSW%RD==:1B14 ;TRAP STATUS WORD - READ
TSW%WT==:1B15 ; " - WRITE
TSW%WR==:1B15 ; (ANOTHER NAME FOR ABOVE)
TSW%EX==:1B16 ; " - EXECUTE
TSW%MN==:1B17 ; " - MONITOR MODE REFERENCE
;GTSTS BITS RETURNED IN 2
GS%OPN==:1B0 ;FILE IS OPEN
GS%RDF==:1B1 ;IF OPEN, FILE IS OPEN FOR READ
GS%WRF==:1B2 ;IF OPEN, FILE IS OPEN FOR WRITE
GS%XCF==:1B3 ;IF OPEN, FILE IS OPEN FOR EXECUTE
GS%RND==:1B4 ;OK TO RESET BYTE POINTER
; (FILE IS NOT APPEND)
GS%APT==:1B5 ;ACCESS PER PAGE TABLE
; (NOT IMPLEMENTED -- OBSOLETE)
GS%CAL==:1B6 ;OK TO CALL AS A PROCEDURE
; (NOT IMPLEMENTED -- OBSOLETE)
GS%LNG==:1B7 ;FILE IS LONG
GS%EOF==:1B8 ;AT END OF FILE ON READ
GS%ERR==:1B9 ;FILE MAY BE IN ERROR
GS%NAM==:1B10 ;FILE HAS A NAME (JFN EXISTS)
GS%AST==:1B11 ;ONE OR MORE FIELDS OF NAME
; IS WILD
GS%ASG==:1B12 ;JFN IS BEING ASSIGNED
GS%HLT==:1B13 ;TERMINATE ON I/O ERROR
GS%FRK==:1B17 ;FILE IS RESTRICTED TO SOME FORK
GS%MOD==:17B35 ;DATA MODE
.GSNRM==:0 ;NORMAL MODE
.GSIMG==:10 ;IMAGE (BINARY) MODE
.GSDMP==:17 ;DUMP MODE
;IDCNV (ALSO IDTNC AND ODCNV)
IC%DSA==:1B0 ;DAYLIGHT SAVINGS IF APPROPRIATE
IC%ADS==:1B1 ;APPLY DAYLIGHT SAVINGS
IC%UTZ==:1B2 ;USE TIME ZONE GIVEN
IC%TMZ==:77B17 ;TIME ZONE
IC%TIM==777777B35 ;LOCAL TIME
;IDTIM & IDTNC
IT%NDA==:1B0 ;NO DATE
IT%NNM==:1B1 ;NO NUMERIC MONTH
IT%SNM==:1B2 ;SECOND NUMBER IS MONTH
IT%ERR==:1B3 ;ERROR IF NUMBERS ARE NOT IN SPECIFIED
; ORDER
IT%NTI==:1B6 ;NO TIME
IT%NIS==:1B7 ;NO SECONDS
IT%AIS==:1B8 ;ALWAYS INCLUDE SECONDS
IT%NAC==:1B9 ;NO COLON ALLOWED BETWEEN HH AND MM
IT%AAC==:1B10 ;ALWAYS ALLOW COLON
IT%AMS==:1B11 ;ALWAYS INTERPERET ONE COLON AS HHMM:SS
IT%AHM==:1B12 ;ALWAYS INTERPRET ONE COLON AS HH:MM
IT%N24==:1B14 ;NO 24-HOUR FORMAT
IT%NTM==:1B15 ;NO TIME MODIFIER (AM, PM)
IT%NTZ==:1B16 ;NO TIME ZONE
;JFNS
JS%DEV==7B2 ;DEVICE FIELD OUTPUT CONTROL
JS%DIR==:7B5 ;DIRECTORY FIELD OUTPUT CONTROL
JS%NAM==:7B8 ;NAME FIELD OUTPUT CONTROL
JS%TYP==:7B11 ;FILE TYPE FIELD OUTPUT CONTROL
JS%GEN==:7B14 ;GENERATION FIELD OUTPUT CONTROL
JS%PRO==:7B17 ;PROTECTION FIELD OUTPUT CONTROL
JS%ACT==:7B20 ;ACCOUNT FIELD OUTPUT CONTROL
;VALUES FOR ABOVE 7 FIELDS:
.JSNOF==:0 ;NEVER OUTPUT FIELD
.JSAOF==:1 ;ALWAYS OUTPUT FIELD
.JSSSD==:2 ;SUPPRESS IF SYSTEM DEFAULT
JS%TMP==:1B21 ;RETURN ;T IF TEMP FILE
JS%SIZ==:1B22 ;RETURN SIZE
JS%CDR==:1B23 ;RETURN CREATION DATE
JS%LWR==:1B24 ;RETURN LAST WRITE
JS%LRD==:1B25 ;RETURN LAST READ
JS%PTR==:1B26 ;AC 2 HOLDS STRING POINTER NOT JFN
JS%PSD==:1B32 ;PUCTUATE SIZE AND DATE
JS%TBR==:1B33 ;TAB BEFORE FIELDS RETURNED
JS%TBP==:1B34 ;TAB BEFORE POSSIBLE FIELDS
JS%PAF==:1B35 ;PUNCTUATE ALL FIELDS
;MTOPR - FUNCTION CODES
.MOCLE==:0 ;CLEAR ERRORS
.MONOP==:31 ;NOP (WAIT FOR ACTIVITY TO STOP)
.MOREW==:1 ;REWIND
.MOEOF==:3 ;WRITE EOF
.MODTE==:4 ;ASSIGN FE DEVICE TO A DTE
.MOFWR==:6 ;FORWARD SPACE RECORD
.MOBKR==:7 ;BACKSPACE RECORD
.MORUL==:11 ;REWIND AND UNLOAD
.MOERS==:13 ;ERASE TAPE
.MOFWF==:16 ;FORWARD SPACE FILE
.MOBKF==:17 ;BACKSPACE FILE
.MOSPD==:26 ;SET TTY SPEED (FOR KL ONLY)
.MORSP==:27 ;READ LINE SPEED (FOR KL ONLY)
.MOSDR==:2 ;SET READ DIRECTION
.MORDR==:26 ;READ READ DIRECTION
.MOEOT==:10 ;SKIP TO LOGICAL END OF TAPE
.MOSRS==:5 ;SET RECORD SIZE
.MORRS==:15 ;READ RECORD SIZE
.MOSDN==:24 ;SET DENSITY
.MORDN==:12 ;READ DENSITY
.MOSDM==:4 ;SET DATA MODE
.MORDM==:14 ;READ DATA MODE
.MOSPR==:20 ;SET PARITY
.MORPR==:21 ;READ PARITY
.MONRB==:22 ;GET NUMBER OF REMAINING BYTES IN RECORD
.MOFOU==:23 ;FORCE OUT RECORD
.MOINF==:25 ;GET INFORMATION ABOUT TAPE
.MOICT==:0 ;COUNT OF ARGUMENTS TO BE RETURNED
.MOITP==:1 ;MAGTAPE TYPE CODE
.MTT16==:1 ;MAGTAPE TYPE TU16
.MTT45==:2 ;MAGTAPE TYPE TU45
.MOIID==:2 ;MAGTAPE REEL ID
.MOISN==:3 ;CHAN,CONTROLLER,UNIT ,, SERIAL #
.MOIRD==:4 ;# OF READS DONE
.MOIWT==:5 ;# OF WRITES DONE
.MOIRC==:6 ;RECORD # FROM BOT
.MOIFC==:7 ;FILE COUNT ON TAPE
.MOISR==:10 ;# OF SOFT READ ERRORS
.MOISW==:11 ;# OF SOFT WRITE ERRORS
.MOIHR==:12 ;# OF HARD READ ERRORS
.MOIHW==:13 ;# OF HARD WRITE ERRORS
.MOPSI==:27 ;SET ERROR PSI FOR LPT AND CDR
MO%MSG==:1B0 ;SUPPRESS STANDARD CTY MESSAGES
.MOSID==:27 ;SET REEL I.D.
.MOIEL==:30 ;INHIBIT ERROR LOGGING
.MOLVF==:32 ;LOAD DEVICE'S VFU
.MORVF==:33 ;READ VFU FILE NAME
.MOLTR==:34 ;LOAD TRANSLATION RAM
.MORTR==:35 ;READ RAM FILE NAME
.MOSTS==:36 ;SET SOFTWARE STATUS
.MORST==:37 ;READ SOFTWARE STATUS
MO%LPC==1 ;PAGE COUNTER OVERFLOW
MO%LCI==2 ;CHARACTER INTERRUPT (HARD ERROR)
MO%LVF==4 ;VFU ERROR. PAPER MUST BE RE-ALIGNED
MO%LVU==20 ;LINE PRINTER HAS OPTICAL VFU
MO%RPE==40 ;RAM PARITY ERROR
MO%RCK==:1 ;READ CHECK
MO%PCK==:2 ;PICK CHECK
MO%SCK==:4 ;STACK CHECK
MO%HEM==:10 ;HOPPER EMPTY
MO%SFL==:20 ;STACKER FULL
MO%FNX==:1B17 ;NON-EXISTENT DEVICE
MO%OL==:1B16 ;DEVICE IS OFF-LINE
MO%HE==:1B15 ;HARDWARE ERROR
MO%SER==:1B14 ;SOFTWARE ERROR
MO%IOP==:1B13 ;I/O IN PROGRESS
MO%EOF==:1B12 ;END OF FILE
; 1B11 ;RESERVED
MO%FER==:1B10 ;FATAL ERROR
MO%LCP==:1B0 ;LOWER CASE PRINTER
.MOFLO==:40 ;FLUSH OUTPUT
;SEE SETJB FOR VARIOUS ARGUMENT VALUES
;NET MTOPR NUMBERS
.MOACP==:20 ;TOPS20AN ;ACCEPT CONNECTION ON SOCKET IN .NSRCR STATE
.MOSND==:21 ;TOPS20AN ;SEND ALL CURENTLY BUFFERED BYTES
.MOSIN==:22 ;TOPS20AN ;SEND INS/INR COMMAND
.MOAIN==:24 ;TOPS20AN ;ASSIGN INS/INR AND FSM PSI CHANNELS
MO%NIN==:77B5 ;TOPS20AN ;INS/INR SOFTWARE INTERRUPT CHANNEL
MO%FSM==:77B17 ;TOPS20AN ;FSM CHANGE OF STATE INTERRUPT CHANNEL
;NOUT
NO%MAG==:1B0 ;OUTPUT MAGNITUDE
NO%SGN==:1B1 ;OUTPUT SIGN
NO%LFL==:1B2 ;LEADING FILLER
NO%ZRO==:1B3 ;FILL WITH ZERO'S
NO%OOV==:1B4 ;OUTPUT ON COLUMN OVERFLOW
NO%AST==:1B5 ;OUTPUT ASTERISKS ON OVERFLOW
NO%COL==:177B17 ;NUMBER OF COLUMNS TO USE
NO%RDX==:777777 ;RADIX
;ODCNV -- SEE IDCNV FOR BITS
;ODTIM
OT%NDA==:1B0 ;DO NOT OUTPUT DATE
OT%DAY==:1B1 ;OUTPUT DAY OF WEEK
OT%FDY==:1B2 ;OUTPUT NUMERIC MONTH
OT%NMN==:1B3 ;OUTPUT NUMERIC MONTH
OT%FMN==:1B4 ;OUTPUT MONTH IN FULL
OT%4YR==:1B5 ;OUTPUT 4-DIGIT YEAR
OT%DAM==:1B6 ;OUTPUT DAY AFTER MONTH
OT%SPA==:1B7 ;OUTPUT SPACES IN DATE
OT%SLA==:1B8 ;OUTPUT SLASHES IN DATE
OT%NTM==:1B9 ;DO NOT OUTPUT TIME
OT%NSC==:1B10 ;DO NOT OUTPUT SECONDS
OT%12H==:1B11 ;OUTPUT 12-HOUR FORMAT
OT%NCO==:1B12 ;DO NOT OUTPUT COLON
OT%TMZ==:1B13 ;OUTPUT TIME ZONE
OT%SCL==:1B17 ;SUPPRESS COLUMNIZATION
;ODTNC -- SEE IDCNV FOR BITS
;OPENF
OF%BSZ==:77B5 ;BYTE SIZE
OF%MOD==:17B9 ;MODE
OF%HER==:1B18 ;HALT ON IO ERROR
OF%RD==:1B19 ;READ
OF%WR==:1B20 ;WRITE
OF%EX==:1B21 ;EXECUTE
OF%APP==:1B22 ;APPEND
OF%THW==:1B25 ;THAWED
OF%AWT==:1B26 ;ALWAYS WAIT
OF%PDT==:1B27 ;PRESERVE DATES
OF%NWT==:1B28 ;NEVER WAIT
OF%RTD==:1B29 ;RESTRICTED
OF%PLN==:1B30 ;SET TO DISABLE LINE NUMBER CHECKING FOR
; NON-LINE NUMBER FILES
;PMAP BIT DEFINITIONS
PM%RD==:1B2 ;READ
PM%WT==:1B3 ;WRITE
PM%WR==:1B3 ; (ANOTHER NAME FOR ABOVE)
PM%EX==:1B4 ;EXECUTE
PM%RWX==:7B4 ;CONVENIENT ABBREV FOR RD+WT+EX
PM%PLD==:1B5 ;PRELOAD PAGES BEING MAPPED
PM%CPY==:1B9 ;COPY ON WRITE
;RFSTS
RF%FRZ==:1B0 ;PROCESS IS FROZEN
RF%STS==:377777B17 ;PROCESS STATUS CODE
.RFRUN==:0 ;RUNABLE
.RFIO==:1 ;DISMISSED FOR I/O
.RFHLT==:2 ;HALTED
.RFFPT==:3 ;FORCED PROCESS TERMINATION
.RFWAT==:4 ;WAITING FOR INFERIOR PROCESS
.RFSLP==:5 ;SLEEP
.RFTRP==:6 ;7 JSYS trapped
RF%SIC==:777777B35 ;SOFTWARE INTERRUPT CHANNNEL
;RMAP
RM%RD==1B2 ;READ ACCESS ALLOWED
RM%WR==:1B3 ;WRITE ACCESS ALLOWED
RM%EX==:1B4 ;EXECUTE ACCESS ALLOWED
RM%PEX==:1B5 ;PAGE EXISTS
RM%CPY==:1B9 ;COPY ON WRITE
;RPACS/SPACS BIT DEFINITIONS
PA%RD==:1B2 ;READ ACCESS ALLOWED
PA%WT==:1B3 ;WRITE ACCESS ALLOWED
PA%WR==:1B3 ; (ANOTHER NAME FOR ABOVE)
PA%EX==:1B4 ;EXECUTE ACCESS ALLOWED
PA%PEX==:1B5 ;PAGE EXISTS
PA%IND==:1B6 ;INDIRECT POINTER
PA%TPU==:1B8 ;TRAP TO USER
; (NOT IMPLEMENTED -- OBSOLETE)
PA%CPY==:1B9 ;COPY ON WRITE
PA%PRV==:1B10 ;PRIVATE
P1%RD==:1B20 ;READ ACCESS ALLOWED IN 1ST POINTER
P1%WR==:1B21 ;WRITE ACCESS ALLOWED IN 1ST POINTER
P1%WT==:1B21 ; (ANOTHER NAME FOR ABOVE)
P1%EX==:1B22 ;EXECUTE ACCESS ALLOWED IN 1ST POINTER
P1%PEX==:1B23 ;PAGE EXISTS IN 1ST POINTER
P1%CPY==:1B27 ;COPY-ON-WRITE IN 1ST POINTER
;RTIW
RT%DIM==:1B0 ;DEFFERED TERMINAL INTERRUPT MASK GIVEN
RT%PRH==:377777B35 ;PROCESS HANDLE
;SCVEC
.SVEAD==:0 ;ENTRY ADDRESS
.SVINE==:1 ;INITIAL ENTRY FOR SETUP
.SVGET==:2 ;ENTRY ADDRESS FOR GET SHARE FILE ROUTINE
.SV40==:3 ;ADDRESS TO GET LOCATION 40
.SVRPC==:4 ;ADDRESS TO GET RETURN PC
.SVMAK==:5 ;ENTRY FOR MAKE SHARE FILE ROUTINE
.SVCST==:6 ;2 WORD BLOCK FOR CONTROL-C/START PROCESSING
;SSAVE
SS%NNP==777777B17 ;NEGATIVE NUMBER OF PAGES
SS%CPY==:1B18 ;ALLOW COPY-ON-WRITE
SS%UCA==:1B19 ;USE CURRENT ACCESS
SS%RD==:1B20 ;ALLOW READ ACCESS
SS%WR==:1B21 ;ALLOW WRITE ACCESS
SS%EXE==:1B22 ;ALLOW EXECUTE ACCESS
SS%FPN==:777B37 ;FIRST PAGE NUMBER
;STDIR
ST%DIR==:1B0 ;FILES ONLY DIRECTORY
ST%ANA==:1B1 ;ALPHANUMERIC ACCOUNTS
ST%RLM==:1B2 ;REPEAT LOGIN MESSAGE
;STIW
ST%PRH==:777777B35 ;PROCESS HANDLE
;TLINK
TL%CRO==:1B0 ;CLEAR REMOTE TO OBJECT LINK
TL%COR==:1B1 ;CLEAR OBJECT TO REMOTE LINK
TL%EOR==:1B2 ;ESTABLIST OBJECT TO REMOTE LINK
TL%ERO==:1B3 ;ESTABLISH REMOTE TO OBJECT LINK
TL%SAB==:1B4 ;SET ACCEPT BIT FOR OBJECT
TL%ABS==:1B5 ;ACCEPT BIT STATE
TL%STA==:1B6 ;SET OR CLEAR ADVICE
TL%AAD==1B7 ;ACCEPT ADVICE
TL%OBJ==:777777B35 ;OBJECT DESIGNATOR
;***********************************************
;GENERAL FIELD AND VALUE DEFINITIONS
;USED BY MANY JSYS'S
;***********************************************
;GENERAL FORK HANDLES
.FHSLF==:400000 ;SELF
.FHSUP==:-1 ;SUPERIOR
.FHTOP==:-2 ;TOP IN JOB
.FHSAI==:-3 ;SELF AND INFERIORS
.FHINF==:-4 ;INFERIORS
.FHJOB==:-5 ;ALL IN JOB
;FIELDS OF JFN MODE WORD
TT%OSP==:1B0 ;OUTPUT SUPPRESS
TT%MFF==:1B1 ;MECHANICAL FORMFEED PRESENT
TT%TAB==:1B2 ;MECHANICAL TAB PRESENT
TT%LCA==:1B3 ;LOWER CASE CAPABILITIES PRESENT
TT%LEN==:177B10 ;PAGE LENGTH
TT%WID==:177B17 ;PAGE WIDTH
TT%WAK==:77B23 ;WAKEUP FIELD
TT%WK0==:1B18 ;WAKEUP CLASS 0 (UNUSED)
TT%WK1==:1B19 ;WAKEUP CLASS 1 (UNUSED)
TT%WKF==:1B20 ;WAKEUP ON FORMATING CONTROL CHARS
TT%WKN==:1B21 ;WAKEUP ON NON-FORMATTING CONTROLS
TT%WKP==:1B22 ;WAKEUP ON PUNCTUATION
TT%WKA==:1B23 ;WAKEUP ON ALPHANUMERICS
TT%ECO==:1B24 ;ECHOS ON
TT%ECM==:1B25 ;ECHO MODE
TT%ALK==:1B26 ;ALLOW LINKS
TT%AAD==:1B27 ;ALLOW ADVICE (NOT IMPLEMENTED)
TT%DAM==:3B29 ;DATA MODE
.TTBIN==:0 ;BINARY
.TTASC==:1 ;ASCII
.TTATO==:2 ;ASCII AND TRANSLATE OUTPUT ONLY
.TTATE==:3 ;ASCII AND TRANSLATE ECHOS ONLY
TT%UOC==:1B30 ;UPPER CASE OUTPUT CONTROL
TT%LIC==:1B31 ;LOWER CASE INPUT CONTROL
TT%DUM==:3B33 ;DUPLEX MODE
.TTFDX==:0 ;FULL DUPLEX
.TT0DX==:1 ;NOT USED, RESERVED
.TTHDX==:2 ;HALF DUPLEX (CHARACTER)
.TTLDX==:3 ;LINE HALF DUPLEX
TT%PGM==:1B34 ;PAGE MODE
TT%CAR==:1B35 ;CARRIER STATE
;DIRECTORY PROTECTION DEFINITIONS (3 6-BIT FIELDS: OWNER, GROUP, WORLD)
DP%RD==:40 ;READING DIRECTORY IS ALLOWED
DP%CN==:10 ;CONNECT TO DIR, OR CHANGE PROT/ACCOUNT
DP%CF==:4 ;CREATING FILES IN DIR IS ALLOWED
;FILE PROTECTION DEFINITIONS (3 6-BIT FIELDS: OWNER, GROUP, WORLD)
FP%DIR==:2 ;DIRECTORY LISTING
FP%APP==:4 ;APPEND
FP%EX==:10 ;EXECUTE
FP%WR==:20 ;WRITE
FP%RD==:40 ;READ
;INPUT AND OUTPUT IDENTIFIERS
.PRIIN==:100 ;PRIMARY INPUT
.PRIOU==:101 ;PRIMARY OUTPUT
.NULIO==:377777 ;NULL DESIGNATOR
.CTTRM==:777777 ;JOB'S CONTROLLING TERMINAL
.DVDES==:600000 ;UNIVERSAL DEVICE CODE
.TTDES==:400000 ;UNIVERSAL TERMINAL CODE
;MAGTAPE DEVICE STATUS BITS
MT%ILW==:1B18 ;ILLEGAL WRITE
MT%DVE==:1B19 ;DEVICE ERROR
MT%DAE==:1B20 ;DATA ERROR
MT%SER==:1B21 ;SUPPRESS ERROR RECOVERY PROCEDURES
MT%EOF==:1B22 ;EOF (FILE MARK)
MT%IRL==:1B23 ;INCORRECT RECORD LENGTH
MT%BOT==:1B24 ;BEGINNING OF TAPE
MT%EOT==:1B25 ;END OF TAPE
MT%EVP==:1B26 ;EVEN PARITY
MT%DEN==:3B28 ;DENSITY (0 IS 'NORMAL')
.MTLOD==:1 ;LOW DENSITY (200 BPI)
.MTMED==:2 ;MEDIUM DENSITY (556 BPI)
.MTHID==:3 ;HIGH DENSITY (800 BPI)
MT%CCT==:7B31 ;CHARACTER COUNTER
;DEVICE DATA MODES
.DMASC==:1 ;ASCII
.DMIMG==:10 ;IMAGE
.DMIMB==:13 ;IMAGE BINARY
.DMBIN==:14 ;BINARY
;DEFINED PSI CHANNELS
RADIX 5+5
.ICAOV==:6 ;ARITHMETIC OVERFLOW
.ICFOV==:7 ;FLOATING OVERFLOW
.ICPOV==:9 ;PDL OVERFLOW
.ICEOF==:10 ;END OF FILE
.ICDAE==:11 ;DATA ERROR
.ICTOD==:14 ;TIME OF DAY (NOT IMPLEMENTED)
.ICILI==:15 ;ILLEG INSTRUCTION
.ICIRD==:16 ;ILLEGAL READ
.ICIWR==:17 ;ILLEGAL WRITE
.ICIEX==:18 ;ILLEGAL EXECUTE (NOT IMPLEMENTED)
.ICIFT==:19 ;INFERIOR FORK TERMINATION
.ICMSE==:20 ;MACHINE SIZE EXCEEDED
.ICTRU==:21 ;TRAP TO USER (NOT IMPLEMENTED)
.ICNXP==:22 ;NONEXISTENT PAGE REFERENCED
;TERMINAL TYPE NUMBERS
.TT33==:0 ;MODEL 33
.TT35==:1 ;MODEL 35
.TT37==:2 ;MODEL 37
.TTEXE==:3 ;EXECUPORT
.ttdm==:11 ; Datamedia
.tthp==:6 ; [SRI] HP2640A
.TTDEF==:8 ;DEFAULT
.TTIDL==:9 ;IDEAL
.TTV05==:10 ;VT05
.TTL30==:12 ;LA30
.TTG40==:13 ;GT40
.TTL36==:14 ;LA36
.TTV52==:15 ;VT52
;DEFINED TERMINAL CODES
.TICBK==:0 ;BREAK
.TICCA==:1 ;^A
.TICCB==:2 ;^B
.TICCC==:3 ;^C
.TICCD==:4 ;^D
.TICCE==:5 ;^E
.TICCF==:6 ;^F
.TICCG==:7 ;^G
.TICCH==:8 ;^H
.TICCI==:9 ;^I
.TICCJ==:10 ;^J
.TICCK==:11 ;^K
.TICCL==:12 ;^L
.TICCM==:13 ;^M
.TICCN==:14 ;^N
.TICCO==:15 ;^O
.TICCP==:16 ;^P
.TICCQ==:17 ;^Q
.TICCR==:18 ;^R
.TICCS==:19 ;^S
.TICCT==:20 ;^T
.TICCU==:21 ;^U
.TICCV==:22 ;^V
.TICCW==:23 ;^W
.TICCX==:24 ;^X
.TICCY==:25 ;^Y
.TICCZ==:26 ;^Z
.TICES==:27 ;ESC
.TICRB==:28 ;RUBOUT
.TICSP==:29 ;SPACE
.TICRF==:30 ;CARRIER OFF
RADIX 8
;CAPABILITIES
SC%CTC==:1B0 ;CONTROL-C
SC%GTB==:1B1 ;GETAB
SC%MMN==:1B2 ;MAP MONITOR
SC%LOG==:1B3 ;LOGGING FUNCTIONS
SC%MPP==:1B4 ;MAP PRIVILEGED PAGES
SC%SDV==:1B5 ;SPECIAL DEVICES
SC%SUP==:1B9 ;SUPERIOR ACCESS
SC%FRZ==:1B17 ;FREEZE ON TERMINATING CONDITIONS
SC%WHL==:1B18 ;WHEEL
SC%OPR==:1B19 ;OPERATOR
SC%CNF==:1B20 ;CONFIDENTIAL INFORMATION ACCESS
SC%MNT==:1B21 ;MAINTENANCE
SC%IPC==:1B22 ;IPCF PRIVILEGES
SC%ENQ==:1B23 ;ENQ/DEQ PRIVILEGES
SC%NWZ==:1B24 ;TOPS20AN ;NET WIZARD PRIVILEGES (ASNSQ, ETC.)
SC%NAS==:1B25 ;TOPS20AN ;NETWORK ABSOLUTE SOCKET PRIVILEGE
;DDBMOD WORD BIT DEFINITIONS
MD%FO==:1B0 ;FILES ONLY DIRECTORY
MD%SA==:1B1 ;STRING ACCOUNT ALLOWED
MD%RLM==:1B2 ;REPEAT LOGIN MESSAGE
;FDB DEFINITIONS
FB%TMP==:1B0 ;FILE IS TEMPORARY
FB%PRM==:1B1 ;FILE IS PERMANENT
FB%NEX==:1B2 ;FILE DOES NOT HAVE AN EXTENSION YET
FB%DEL==:1B3 ;FILE IS DELETED
FB%NXF==:1B4 ;FILE IS NONEXISTENT
FB%LNG==:1B5 ;FILE IS A LONG FILE
FB%SHT==:1B6 ;FILE HAS COMPRESSED PAGE TABLE
FB%DIR==:1B7 ;FILE IS A DIRECTORY FILE
FB%NOD==:1B8 ;FILE IS NOT TO BE DUMPED BY BACKUP SYSTEM
FB%BAT==:1B9 ;FILE HAS AT LEAST ONE BAD PAGE
;6 Begin addition
fb%eph==1b17
fb%und==1b10
;6 End
; IN IT
FB%FCF==:17B17 ;FILE CLASS FIELD
.FBNRM==:0 ;NON-RMS
.FBRMS==:1 ;RMS FILES
.FBHDR==:0 ;HEADER WORD
.FBCTL==:1 ;FLAGS
.FBEXL==:2 ;LINK TO FDB OF NEXT EXTENSION
.FBADR==:3 ;DISK ADDRESS OF INDEX BLOCK
.FBPRT==:4 ;PROTECTION OF THE FILE
.FBCRE==:5 ;TIME AND DATE OF LAST WRITE
.FBUSE==:6 ;LAST WRITER ,, AUTHOR
.FBGEN==:7 ;GENERATION ,, DIR #
FB%GEN==:777777B17 ;GENERATION NUMBER
.FBDRN==:7 ;GENERATION ,, DIR #
FB%DRN==:777777 ;DIR NUMBER
.FBACT==:10 ;ACCOUNT
.FBBYV==:11 ;RETENTION+BYTE SIZE+MODE ,, # OF PAGES
FB%RET==:77B5 ;RETENTION COUNT
FB%BSZ==:77B11 ;BYTE SIZE
FB%MOD==:17B17 ;LAST OPENF MODE
FB%PGC==:777777 ;PAGE COUNT
.FBSIZ==:12 ;EOF POINTER
.FBCRV==:13 ;TIME AND DATE OF CREATION OF FILE
.FBWRT==:14 ;TIME AND DATE OF LAST USER WRITE
.FBREF==:15 ;TIME AND DATE OF LAST NON-WRITE ACCESS
.FBCNT==:16 ;# OF WRITES ,, # OF REFERENCES
.FBBK0==:17 ;BACKUP WORDS (5)
.FBBK1==:20
.FBBK2==:21
.FBBK3==:22
.FBBK4==:23
.FBUSW==:24 ;USER SETTABLE WORD
.FBLEN==:25 ;LENGTH OF THE FDB
;***********************************************
;GENERAL FIELD AND VALUE DEFINITIONS
;USED BY TOPS20AN JSYS'S
;***********************************************
;STATES OF A CONNECTION IN ARPANET NCP
; RETURNED IN B0-B3 OF GDSTS ON A NET CONNECTION
; ALSO AVAILABLE IN A GETAB, BUT THAT'S NOT THE PREFERRED WAY
; TO READ THEM, IF YOU HAVE A JFN FOR THE CONNECTION.
.NSCZD==:01 ;CLOSED
.NSPND==:02 ;PENDING
.NSLSN==:03 ;LISTENING
.NSRCR==:04 ;REQUEST FOR CONNECTION RECEIVED
.NSCW1==:05 ;CLOSE WAIT SUB ONE (NCP CLOSE)
.NSRCS==:06 ;REQUEST FOR CONNECTION SENT
.NSOPN==:07 ;OPENED
.NSCSW==:10 ;CLOSE WAIT (NCP CLOSE)
.NSDTW==:11 ;FINAL DATA WAIT
.NSRF1==:12 ;RFNM WAIT SUB ONE (NORMAL NCP CLOSE)
.NSCSW==:13 ;CLOSE WAIT (PROGRAM CLOSE)
.NSRF2==:14 ;RFNM WAIT SUB TWO (UNEXPECTED NCP CLOSE)
.NSFRE==:16 ;FREE

BIN
src/e142/mqrepl._ej Normal file

Binary file not shown.

BIN
src/e142/nabstr._ej Normal file

Binary file not shown.

1071
src/e142/nemacs. Normal file

File diff suppressed because it is too large Load Diff

785
src/e142/nemacs.com Normal file
View File

@@ -0,0 +1,785 @@
(FILECREATED " 3-Feb-79 15:21:46" ("compiled on " <RUBENSTEIN>NEMACS.;11) (2 . 2
))
(FILECREATED " 3-Feb-79 15:21:16" <RUBENSTEIN>NEMACS.;11 29497 changes to:
START.EMACS previous date: "27-Jan-79 17:19:41" <RUBENSTEIN>NEMACS.;9)
,, BINARY
-. (B ,>,> GBx,^/,,~(VARIABLE-VALUE-CELL X . 3)
(VARIABLE-VALUE-CELL Y . 7)
(MKN BHC ENTERF)h`
BINARYMODE BINARY
-.^" ,>,>^"(BF,>,>^" @@#+ + + ABx,^/ ,^/@$+ + + Z,~0(KNIL BHC ENTER0)
8
CF BINARY
-.ZB,~(VARIABLE-VALUE-CELL NAME . 3)
EMACS.GETDEF
(ENTERF)
CP BINARY

-.Z2B+ZXBZ,<,<$Z3B+-,+,<ZDZ3B+3B+-,+,<,<,,<Z D,<ZD,<[
,B,<ZD ,~,<D
,~Z+MX(VARIABLE-VALUE-CELL X . 37)
(VARIABLE-VALUE-CELL LASTWORD . 8)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 41)
PRINT
"(SETPROPLIST "
PRIN3
QUOTE
PRIN4
1
SPACES
DUMPX
")
"
DOWN
"No editable property list: "
ERROR
(ALIST2 LIST2 SKNNM SKLA KT KNIL ENTERF)
 `80
CV BINARY
-.Z2B+ZXBZ,<,<$ZB3B+,<ZDZ,<ZD,<Z
DZ BB,<Z D ,~Z
,<,<$,~t5l`(VARIABLE-VALUE-CELL X . 34)
(VARIABLE-VALUE-CELL LASTWORD . 8)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 30)
PRINT
GETTOPVAL
NOBIND
"(RPAQQ "
PRIN3
PRIN4
1
SPACES
DUMPX
")
"
DOWN
" has no value."
ERROR
(KT KNIL ENTERF)`0
DISPLAY.IN.ECHO.AND.DIVE BINARY

-.
,< ZD Z ,<ZD ,<ZD ,<
ZD ,<
,<$,~<(VARIABLE-VALUE-CELL LIST . 8)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 14)
"MM^R Two Windows
MMSELECT BUFFERPRINT
HK
I"
PRIN3
CONCAT
APPLY
"
0J
QWINDOW 2 SIZE-3%"N 3-QWINDOW 2 SIZEMM^R GROW WINDOW'
MM^R OTHER WINDOW
MM& MULTI-WINDOW REFRESH"
DOWN
((DOWN T) . 0)
RETEVAL
(ENTERF)
DOWN BINARY
1&0-.0&@*,~Z,,XB ,<Z3B+  " $+
Z,,\ BZ,<,<*$+^" ,>&,>Z2B+^" $+, ,^/@+ + + Z,<,<,<,<+,<*,XB ,Z1B+#,<-,<$-,<.".Z,<,<,<,<,<*,XB
+ /ZB/Z,~DD)\ (VARIABLE-VALUE-CELL NEGATE.ARG.FLG . 12)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 23)
(VARIABLE-VALUE-CELL EMACS.ARG.LOC . 10)
(VARIABLE-VALUE-CELL CLEAR.SCREEN.NUMBER . 30)
(VARIABLE-VALUE-CELL LASTEMACS . 69)
(VARIABLE-VALUE-CELL EMACS.EXTRAC . 54)
(VARIABLE-VALUE-CELL DUMP.SCREEN.AMOUNT . 72)
(NIL VARIABLE-VALUE-CELL TEMP . 19)
0
SETFILEPTR
START
SUBSYS2
GET.EMACS.BUFFER
"
Illegal exit from EMACS. Exit from EMACS only with meta-Z.
(The gap is not closed.) Returning to EMACS.
"
PRIN1
3000
DISMISS
EMACS.RETURN
DUMP.SCREEN
(ASZ KT BHC GUNBOX FIXT KNIL MKN FGFPTR ENTERF) H0 `" !xPH
DUMP.SCREEN BINARY
%$-.@ ,~Z3B+ !Z2B+^" ,>,>Z2B+ ^" $+ , ,^/@+ + + ZB"XB ,>,> ,^//,XB,<,<"$#3B+Z"XBZ,<,<Z,<ZH#Z,~2D@@(VARIABLE-VALUE-CELL N . 37)
(VARIABLE-VALUE-CELL DISPLAYTERMFLG . 6)
(VARIABLE-VALUE-CELL FANCY.DRIBBLE.FILE . 51)
(VARIABLE-VALUE-CELL CLEAR.SCREEN.NUMBER . 16)
(NIL VARIABLE-VALUE-CELL TEMP . 56)
(NIL VARIABLE-VALUE-CELL TEMP1 . 54)
DRIBBLEFILE
GETEOFPTR
0
LESSP
COPYBYTES
(KT ASZ MKN BHC GUNBOX FIXT KNIL ENTERF)X@0`
DUMPX BINARY
! -.Z-,+Z2B+[-,+[[2B+[Z-,+[Z[-,+[
Z[[2B+,<ZD[ ZZ,<ZD,<ZD[Z[ZB
,<
ZD,~ZB
,~d"
H(VARIABLE-VALUE-CELL X . 52)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 49)
DEFINEQ
"(DEFINEQ ("
PRIN3
PRIN4
" "
DUMPX1
"))
"
(KNIL SKLST ENTERF)x  0
DUMPX1 BINARY
Q>O-.>,<A"A,<@B ,~,<AZ,<,,Z,XBXB`,<D,<D,<@E`+5ZZFXBZBG,<@G +3,<GZ,<,,Z,XBXB`,<I,<D,<@E`+*ZZFXB,<J"J3B+!@K+!Z,<,<K,<K,<L(JZ,~+(ZLZ,,<@@ +(Z,<,<KZFMZ,~Zw}XB8Z,~2B+,ZMXB[`XB,<GZ`Z[DNZ,3B+2 N,~Z`,~ZwXB8Z,~2B+7ZMXB0[`XB-,<AZ`Z[DNZ73B+= N,~Z`,~TVU6O%bb(VARIABLE-VALUE-CELL X . 74)
(VARIABLE-VALUE-CELL DEF . 77)
(VARIABLE-VALUE-CELL RESETVARSLST . 112)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 27)
(VARIABLE-VALUE-CELL PRETTYPRINTMACROS . 68)
79
LINELENGTH
(VARIABLE-VALUE-CELL OLDVALUE . 34)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 118)
((DUMMY) . 0)
INTERNAL
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
OUTFILE
(VARIABLE-VALUE-CELL OLDVALUE . 0)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 0)
((DUMMY) . 0)
PPRIND
GETD
(1000 VARIABLE-VALUE-CELL FORCEIN . 0)
0
(((* . GETCOMMENT) (QUOTE . MAKE.QUOTE)) . 0)
((* . GETCOMMENT) . 0)
PRINTDEF
ERROR
APPLY
ERROR!
(KT CF KNIL CONS CONSNL LIST2 ENTERF)5(
<h18(p #Hx0
DWN BINARY
 -.Z,<,<$,<ZD ,~X(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 8)
0
SETFILEPTR
"
"
PRIN3
DOWN
(ENTER0)
E! BINARY
3)2-.)Z-,+@++Z"XB ,>(,>  ,^/3b+ Z`,~ , .",XB ++'@,+'Z,,XB,<ZB-B-,A"?,>(,>ZB..Bx,^/."[A" 0B+Zp+ZB.+/Z,,,<Z,<,</$/D03B+&Z,<ZD0 ,+,~,<1"1,~"!h
`@(VARIABLE-VALUE-CELL N . 14)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 71)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 44)
(VARIABLE-VALUE-CELL EMACS.Z . 64)
NIL
(NIL VARIABLE-VALUE-CELL I . 26)
E.
(NIL VARIABLE-VALUE-CELL OLDLOC . 73)
PEEKC
CHCON1
GETREADTABLE
READC
4
DIFFERENCE
LESSP
SETFILEPTR
((8) . 0)
PACKC
(IUNBOX KNIL FGFPTR MKN BHC ASZ SKNM ENTERF)P8
XhX0
E. BINARY
S?P-. ?@A+>@B+Z,<ZDB,~XB,<C,<ZFC,<D"D,<@E +",<DZ,<,,Z,XBXB`,<G,<G,<@H`+ZZIXBZ,<,<$JZw~XB8Z,~2B+ZJXB[`XB,<DZ`Z[DKZ3B+! K,~Z`,~ZBLXB",<L"D,<@M +=,<DZ
,<,,Z,XB)XB`,<O,<G,<@H`+4ZZIXBZ#,<,<$JZw~XB8Z,~2B+6ZJXB
[`XB*,<DZ`Z[DKZ53B+< K,~Z`,~Z0,~,<O"P,~"',*Dak5!(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 9)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 11)
(VARIABLE-VALUE-CELL LISPXHISTORY . 17)
(VARIABLE-VALUE-CELL RESETVARSLST . 109)
(NIL VARIABLE-VALUE-CELL TEMP . 122)
(T VARIABLE-VALUE-CELL NORMALCOMMENTSFLG . 0)
READ
_
PROMPTCHAR
((3 . 4) . 0)
PRINTLEVEL
(VARIABLE-VALUE-CELL OLDVALUE . 79)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 115)
((DUMMY) . 0)
INTERNAL
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
PRINT
ERROR
APPLY
ERROR!
LISPXEVAL
((3 . 4) . 0)
(VARIABLE-VALUE-CELL OLDVALUE . 0)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 0)
((DUMMY) . 0)
((8) . 0)
PACKC
(KT CF CONS CONSNL LIST2 KNIL ENTER0)@2/P0*x;P-0 
EDIT.DRIBBLE.FILE BINARY
 -.  B ,<,<,<& ,<
ZD
Z,<ZD
,<ZD
,<",~45(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 17)
(VARIABLE-VALUE-CELL FANCY.DRIBBLE.FILE . 12)
DRIBBLE
IOFILE
"MMSelect BufferDRIBBLE
ER"
PRIN3
"HK
^A
ZJ
-1MM^R New Window"
DOWN
(KT ENTER0)(@
EMACS. BINARY
-.ZB,< D,~@(VARIABLE-VALUE-CELL DUMP.SCREEN.AMOUNT . 3)
DUMP.SCREEN
DOWN
E.
RETFROM
(ENTER0)
EMACS.?= BINARY
5-4-.-@.,~Z,<ZD.XB2B/+ Z,<ZD.XBB/3B+*Z,<B0-,+Z
B0,+&Z
B0,<,<,<,<Zw~-,+Zw+&,<@0 +Z,<[2B+Z+Z1,,,~XBp-,+$Zw3B+ ZpQD+!ZpXBw  [2D+"XBw[w~XBw~+/,<Z1,D2Z2,,++Z3,B3Z,~(!0$@ 3 (VARIABLE-VALUE-CELL EMACS.MAP.FILE . 13)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 15)
(NIL VARIABLE-VALUE-CELL NAME . 30)
RATOM
%(
GETD
ARGLIST
(VARIABLE-VALUE-CELL ARGLIST . 47)
","
"]"
NCONC
"["
"Not a function."
DISPLAY.IN.ECHO.AND.DIVE
(CONS21 BHC SKLST CONSS1 CONSNL SKNLST KNIL ENTER0) pX(,p8
-@
 (

EMACS.GETDEF BINARY
ZHW-.H@J(
,~Z2B+ZXBZ,<,<$LZBMXB-,+,<MZ,<,<,,BN N,~Z
,<,<O$O3B+,<MZ,<,<,<O$O,,BN N,~ZBPZXB3B+F,<,<P$OXB2B+%,<Z,<,<Q$OZ[,<,<,<(QZ,<,<P$OXBZ,<Z",<,<P$O[Z[Z[[DRXB3B+DZ&,<,<Q$OZ[XB-,<,<$L,<RZDS,<SZ2DSZ0,<Z4DS,<TZ6DS[+Z,<Z7DS,<TZ:DS[8[,<[<ZDU,<Z;DS,<UZ@DS,<"N,~,<VZ%DV+G,<WZDDVZ,~ S
d,FA@IAZ4j](VARIABLE-VALUE-CELL NAME . 141)
(VARIABLE-VALUE-CELL LASTWORD . 11)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 131)
(NIL VARIABLE-VALUE-CELL DEF . 17)
(NIL VARIABLE-VALUE-CELL FILE . 106)
(NIL VARIABLE-VALUE-CELL SPOT . 124)
(NIL VARIABLE-VALUE-CELL MAP . 73)
(NIL VARIABLE-VALUE-CELL WHEREIS . 0)
PRINT
VIRGINFN
DEFINEQ
DUMPX
DOWN
EXPR
GETP
WHEREIS
FILEMAP
FILEDATES
LOADFNS
ASSOC
"[0E[FNE]ZJ.U0
I(DEFINEQ "
PRIN3
"ER"
"
"
"FSIFACCESS"
DIFFERENCE
"FY
I)

0FSDVERSION
Q0J
.,ZFSBOUNDARIES
F+
0:F
:F
"
"No Definition Found For"
ERROR
"No Definition Found. "
(ALIST2 LIST2 SKLST KT KNIL ENTERF)X
C "x -(P
EMACS.P BINARY
4$2-.($,<'ZD'@(+!ZB(,<@) ,~,<(Z,<,,Z,XB
XB`,<+,<+,<@,`+ZZ-XB@.+Z,<ZD.,~,<ZD'Zw~XB8Z,~2B+Z/XB[`XB ,<(Z`Z[D/Z3B+  0,~Z`,~,<0ZD',<1,<1$2,~*
*AD&(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 67)
(VARIABLE-VALUE-CELL EMACS.P.PRINT.LEVEL . 9)
(VARIABLE-VALUE-CELL RESETVARSLST . 53)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 36)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 38)
"MM^R Two Windows
MMSELECT BUFFERPRINT
HK
I"
PRIN3
(T VARIABLE-VALUE-CELL PLVLFILEFLG . 0)
PRINTLEVEL
(VARIABLE-VALUE-CELL OLDVALUE . 16)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 59)
((DUMMY) . 0)
INTERNAL
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
(T VARIABLE-VALUE-CELL NORMALCOMMENTSFLG . 0)
READ
ERROR
APPLY
ERROR!
"
0J
QWINDOW 2 SIZE-3%"N 3-QWINDOW 2 SIZEMM^R GROW WINDOW'
MM^R OTHER WINDOW
MM& MULTI-WINDOW REFRESH"
DOWN
((DOWN T) . 0)
RETEVAL
(KT CF KNIL CONS CONSNL LIST2 ENTER0)p`8( 
EMACS.PP BINARY
D1B-.(1Z,<ZD3@4+/Z,,XB,<ZB5B6,A"?,>0,>ZB6.Bx,^/."[A" 0B+Zp+ZB7+/Z,,,<Z,<,<7$8D83B+-Z,<ZD3,<9,<,<@9`+!ZZ;XBZ,<Z D;+XB2B+),<<,<$<,<="=Z,<,<>$3,<>,<?$?+Z!B@Z%B@Z*B@+,<>,<A$?,~,<A"B,~P
@:(#sz_0(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 62)
(VARIABLE-VALUE-CELL EMACS.BEGV . 5)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 64)
(VARIABLE-VALUE-CELL EMACS.Z . 42)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 87)
SETFILEPTR
(NIL VARIABLE-VALUE-CELL OLDLOC . 51)
(NIL VARIABLE-VALUE-CELL TEMP . 83)
(T VARIABLE-VALUE-CELL NORMALCOMMENTSFLG . 0)
PEEKC
CHCON1
GETREADTABLE
READC
4
DIFFERENCE
LESSP
((DUMMY) . 0)
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
READ
"Unbalanced Sexpression!
"
PRIN1
3000
DISMISS
0
DOWN
((DOWN) . 0)
RETEVAL
DUMPX
TERPRI
((DOWN) . 0)
((8) . 0)
PACKC
(KT CONSNL CF BHC IUNBOX KNIL MKN FGFPTR ENTER0)H h8
#HpH
EMACS.RETURN BINARY
-.Z,<ZD[B,~ (VARIABLE-VALUE-CELL EMACS.FSEXIT.ARG . 3)
(VARIABLE-VALUE-CELL EMACS.RETURN.ALIST . 5)
SASSOC
EVAL
(ENTER0)
ENABLE.CONTROL.C.CAPABILITY BINARY
 -.,<Z,<,<,<,<$H,~x(VARIABLE-VALUE-CELL OURPROCESS . 4)
105
0
131072
,,
JSYS
(ENTER0)
FLUSH.EMACS BINARY
=/;-.0/Z2Z7@7ZZ-,+ Z2Z7@7ZZB3Z3Z7@7Z3B4+Z-,+B43B+Z B5Z5Z7@7Z3B4+Z-,+B43B+ZB5Z6Z7@7Z3B4+
Z-,+
B43B+
,<"6,<7,<,<@7`+'ZZ9XBZ,,<ZD9Z,~,<:,<,<@7`+/ZZ9XBZ,,<,<:$9+,~ VV kJC(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 31)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 46)
(VARIABLE-VALUE-CELL FANCY.DRIBBLE.FILE . 55)
(VARIABLE-VALUE-CELL OUR.BLOCK.START . 72)
(VARIABLE-VALUE-CELL EMACS.BLK.SIZE . 75)
(VARIABLE-VALUE-CELL EMACS.AC.BLK.START . 88)
LASTEMACS
KFORK
EMACS.MAP.FILE
NOBIND
OPENP
CLOSEF
EMACS.TEMP.FILE
FANCY.DRIBBLE.FILE
DRIBBLE
((DUMMY) . 0)
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
RELBLK
((DUMMY) . 0)
1
(CONSNL KT GUNBOX CF KNIL SKLA SKI KNOB ENTER0)/'-X8#)!
hxP`X(8@
GET.EMACS.BUFFER BINARY
 -.(  Z,<ZDZ,<ZD3B+
Z,<ZDZXBZ,<ZD,~E(VARIABLE-VALUE-CELL EMACS.BEG . 4)
(VARIABLE-VALUE-CELL EMACS.Z . 18)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE.EOF . 19)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 20)
(VARIABLE-VALUE-CELL EMACS.PT . 22)
SET.EMACS.VARS
MAP.BYTES
GREATERP
SETFILEPTR
(KNIL ENTER0)
HK BINARY
-.,<",~"HK"
TECO
(ENTER0)
INFO BINARY
-.,<",~"MMINFO"
TECO
(ENTER0)
MAKE.QUOTE BINARY

-. [-,+ [Z-,+ [[2B+ ,< [ZD ,~Z
[,,~J(VARIABLE-VALUE-CELL X . 20)
'
PACK*
QUOTE
(CONS KNIL SKLA SKLST ENTERF) 
MAP.BYTES BINARY
-.@,~ZBXB ,>,>ZB, ,^/3b+ Z`,~Z,<ZD2B+Z,<Z ,<ZFZZ ,XB .",XB+I(VARIABLE-VALUE-CELL START . 6)
(VARIABLE-VALUE-CELL END . 12)
(VARIABLE-VALUE-CELL MAPPED.PAGES . 37)
(VARIABLE-VALUE-CELL LASTEMACS . 28)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE.JFN . 32)
NIL
(NIL VARIABLE-VALUE-CELL I . 41)
PAGE.OF.BYTE
MEMBER
MAP.PROCESS.TO.FILE
(MKN CONS KNIL BHC IUNBOX ENTERF) 
MAP.PROCESS.TO.FILE BINARY
-.,<Z,<ZD,<Z,<ZD,<,<,<$H,<Z,<ZD,<Z,<Z
D,<,<,<$H,~B|!<(VARIABLE-VALUE-CELL PROCESS . 24)
(VARIABLE-VALUE-CELL PAGE . 26)
(VARIABLE-VALUE-CELL JFN . 19)
46
,,
61440
0
JSYS
61440
(ENTERF)
PAGE.OF.BYTE BINARY

-. @ ,~ &",XB &" ,XB0B+
 ."+
 (B{,,~(VARIABLE-VALUE-CELL BYTE . 10)
(NIL VARIABLE-VALUE-CELL QUO . 20)
(NIL VARIABLE-VALUE-CELL REM . 14)
(ASZ MKN ENTERF) x
PUTSTRING BINARY
1*0-.*@+ +(ZXBZ"XBZ,<ZB-,.",D-3B+ Z`,~Z"XB@.+#Z"XB 1b+Z`,~ (B,XB ,>),>Z,<ZB-D-3B+^"+Z,<ZD/B/,GBx,^/,XB .",XB .",XB + ,< (B,\ B #.",XB&+Z,~
5  (VARIABLE-VALUE-CELL STR . 50)
(VARIABLE-VALUE-CELL ADDR . 81)
NIL
(NIL VARIABLE-VALUE-CELL LOC . 79)
(NIL VARIABLE-VALUE-CELL WORD . 72)
(NIL VARIABLE-VALUE-CELL CHAR . 64)
NCHARS
GREATERP
NIL
(NIL VARIABLE-VALUE-CELL J . 68)
NTHCHAR
CHCON1
(BHC KNIL MKN IUNBOX ASZ ENTERF) "0 h P
READ.AC BINARY
-.Z2B+^" $+,,>,>Z2B+ ^" $+ , ,^/@8+ + +  ,>,> GBx,^/ ,,~(H@(VARIABLE-VALUE-CELL ACN . 30)
(VARIABLE-VALUE-CELL PROCESS . 3)
(VARIABLE-VALUE-CELL EMACS.AC.BLK.START . 27)
(MKN BHC GUNBOX FIXT KNIL ENTERF)8  Hx
SET.EMACS.VARS BINARY
-. ,XB ,XB ,XB ,XB ,XB ,XB ,XB,<ZDXB,~
(VARIABLE-VALUE-CELL EMACS.BEG.LOC . 3)
(VARIABLE-VALUE-CELL EMACS.BEG . 6)
(VARIABLE-VALUE-CELL EMACS.BEGV.LOC . 7)
(VARIABLE-VALUE-CELL EMACS.BEGV . 10)
(VARIABLE-VALUE-CELL EMACS.PT.LOC . 11)
(VARIABLE-VALUE-CELL EMACS.PT . 14)
(VARIABLE-VALUE-CELL EMACS.ZV.LOC . 15)
(VARIABLE-VALUE-CELL EMACS.ZV . 18)
(VARIABLE-VALUE-CELL EMACS.Z.LOC . 19)
(VARIABLE-VALUE-CELL EMACS.Z . 22)
(VARIABLE-VALUE-CELL EMACS.EXTRAC.LOC . 23)
(VARIABLE-VALUE-CELL EMACS.EXTRAC . 26)
(VARIABLE-VALUE-CELL EMACS.MODIFF.LOC . 27)
(VARIABLE-VALUE-CELL EMACS.MODIFF . 30)
(VARIABLE-VALUE-CELL LASTEMACS . 32)
(VARIABLE-VALUE-CELL EMACS.FSEXIT.ARG . 34)
3
READ.AC
(MKN ENTER0)x
8 x8
SETUP.FANCY.DRIBBLE BINARY
 -.  3B+Z,XB,~,< "
B
XBBZBZ,<,<,<&,~P@(VARIABLE-VALUE-CELL FANCY.DRIBBLE.FILE . 17)
DRIBBLEFILE
LISP.DRIBBLE;-1;T
OUTFILE
OUTPUT
CLOSEF
IOFILE
DRIBBLE
(KT CONSNL KNIL ENTER0)0
0
SFCOC BINARY
-.^" @@%+ + + ,,<^" @@%+ + + ,,,<Z3B+,<,<Z ,<[ZH,\,~B(VARIABLE-VALUE-CELL TUPLE . 31)
75
65
JSYS
(KNIL ALIST2 MKN ENTERF)
h
START.EMACS BINARY
?:-.x@!,~ZB"XB,<#,<#F$,<$,<$,<"%D%,<ZF$Z3B+  &,<&"'B'XB,<ZD(,<(Z
D)ZB)   ?+ + + ,B*B*XB,<+"+,<(",,XB,<,,<,<,<,<*-XB
Z3B++ B+,<(",,XB,<-ZD.XB #(B{,,<Z$,<,<.$/,(B{,D/3B+,Z"XB+-Z"XB+B,,XB@0 +DZ"XBZ`-,+3+CZXBZ4,<Z1,< .,>,>^",>,> &ABx,^/GBx,^/,D/ ,\,[`XB` 5.",XB@+1Z`,~Z",< 9(B{,D22B+I^"+I,,>,>Z,< 6(B{,D22B+O^"+P, ,^/,>,>,>,>,<2,<3$22B+W^"+W, ,^/,^/+ + + Z-,<,<-$/3B+xZD,< E(B{.",D22B+d^"+e,,>,>ZJ,< K(B{.",D22B+k^"+l, ,^/,>,>,>,>,<3,<3$22B+s^"+s, ,^/,^/+ + + Z_2B+z^"+{,,>,>,<(Z`,<,<4$/D22B+^"+, ,^/ B+ + + ,<4"'B'XBB)ZB5Z"XBZB5XBZXBZ,<,<6$6 7Z,,<,<($7,<"8Z
,<,<8,<9&9Z,<,<8,<9&9Z,~_2>p7H'eE(0 (
B] P 
uTj:D4s@(VARIABLE-VALUE-CELL FILERDTBL . 6)
(VARIABLE-VALUE-CELL EMACS.READ.TABLE . 18)
(VARIABLE-VALUE-CELL LASTEMACS . 240)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 298)
(VARIABLE-VALUE-CELL MAX.EMACS.INPUT . 29)
(VARIABLE-VALUE-CELL EMACS.AC.BLK.START . 67)
(VARIABLE-VALUE-CELL EMACS.BUFFER.BLOCK . 249)
(VARIABLE-VALUE-CELL EMACS.BLK.SIZE . 184)
(VARIABLE-VALUE-CELL OUR.BLOCK.START . 206)
(VARIABLE-VALUE-CELL OURPROCESS . 204)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE . 293)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE.EOF . 275)
(VARIABLE-VALUE-CELL EMACS.MAP.FILE.JFN . 278)
(VARIABLE-VALUE-CELL MAPPED.PAGES . 280)
(VARIABLE-VALUE-CELL CLEAR.SCREEN.NUMBER . 281)
(NIL VARIABLE-VALUE-CELL TEMP . 0)
(NIL VARIABLE-VALUE-CELL NAME . 60)
(NIL VARIABLE-VALUE-CELL RSCAN.BLK . 286)
COPYREADTABLE
3
((MACRO IMMEDIATE (LAMBDA (FL RDTBL) (ERROR "End of EMACS buffer!"))) . 0)
SETSYNTAX
'
GETREADTABLE
GETSYNTAX
FLUSH.EMACS
EMACS.TEMP;-1;T
OUTFILE
OUTPUT
SETFILEPTR
1
SPACES
CLOSEF
SIXBIT
MKATOM
LISP
SETNM
GETBLK
<SUBSYS>EMACS.SAV
SUBSYS2
2
READ.AC
9
PLUS
EQP
((EMACS.BEG.LOC EMACS.BEGV.LOC EMACS.PT.LOC EMACS.GPT.LOC EMACS.ZV.LOC
EMACS.Z.LOC EMACS.EXTRAC.LOC EMACS.RESTART.LOC EMACS.ARG.LOC EMACS.MODIFF.LOC) .
0)
NIL
(NIL VARIABLE-VALUE-CELL VAR . 105)
(NIL VARIABLE-VALUE-CELL I . 132)
,,
53248
0
53248
7
EMACS.MAP;-1;T
IOFILE
OPNJFN
REAL
ECHOCONTROL
SETUP.FANCY.DRIBBLE
RELBLK
TERPRI
CLOSEALL
NO
WHENCLOSE
(GUNBOX SET BHC SKNLST ASZ IUNBOX MKN KNIL KT ENTER0)8vXn (Y
=@0 1X,8t
He P )i (MpB`/ & h y j 8_
`N +XH8(
STIW BINARY
-.^"}@@=+ + + ,,<Z3B+^"},>,>Z2B+ ^" $+
, ,^/@>+ + + ,\,~(H(VARIABLE-VALUE-CELL W . 19)
(BHC GUNBOX FIXT KNIL MKN ENTERF)pXH0
SUBSYS1 BINARY
UBR-.(B@E,~Z-,+ GZXB GXB HXB+
ZXB[ZXB[ [ZXBZ
BG,<@H ,~,<GZ,<,,Z,XBXB`,<J,<K,<@K`+9ZZMXBZ BH,<@M +7,<HZ,<,,Z,XBXB`,<O,<K,<@K`+.ZZMXBZ3B+' PZ ,<Z,<Z,<ZHP@G@H,Zw|XB8Z,~2B+0ZQXB[`XB
,<HZ`Z[DQZ03B+6 R,~Z`,~Zw~XB8Z,~2B+;ZQXB4[`XB1,<GZ`Z[DQZ;3B+A R,~Z`,~2P$*+5F`1 1 @(VARIABLE-VALUE-CELL THREE . 22)
(VARIABLE-VALUE-CELL INCOMFILE . 80)
(VARIABLE-VALUE-CELL OUTCOMFILE . 82)
(VARIABLE-VALUE-CELL ENTRYPOINTFLG . 84)
(VARIABLE-VALUE-CELL BINARYMODE . 74)
(VARIABLE-VALUE-CELL RESETVARSLST . 120)
(NIL VARIABLE-VALUE-CELL FORK . 78)
(NIL VARIABLE-VALUE-CELL TIW . 26)
(NIL VARIABLE-VALUE-CELL COC . 50)
ENABLE.CONTROL.C.CAPABILITY
STIW
SFCOC
(VARIABLE-VALUE-CELL OLDVALUE . 57)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 126)
((DUMMY) . 0)
INTERNAL
(0 . 1)
(0 . 1)
(0 . 1)
ERRORSET
(VARIABLE-VALUE-CELL OLDVALUE . 0)
NIL
NIL
(NIL VARIABLE-VALUE-CELL RESETSTATE . 0)
((DUMMY) . 0)
BINARYMODE
SUBSYS0
ERROR
APPLY
ERROR!
(KT ALIST3 CF KNIL CONS CONSNL LIST2 SKLA ENTERF).-$:X/h"h
0h
SUBSYS2 BINARY
$#-.(@!,~Z,<Z,<Z,<Z,<ZJ!XB ,>,>Z2B+
^" $+
,@@.+ + + ABx,^/1B+@@@<+ + + ,<"""Z
,<,<,<,<,<*!XB+Z,~ ,$ (VARIABLE-VALUE-CELL THREE . 6)
(VARIABLE-VALUE-CELL INCOMFILE . 8)
(VARIABLE-VALUE-CELL OUTCOMFILE . 10)
(VARIABLE-VALUE-CELL ENTRYPOINTFLG . 12)
(VARIABLE-VALUE-CELL BINARYMODE . 14)
(NIL VARIABLE-VALUE-CELL FORKTHREE . 57)
SUBSYS1
1000
DISMISS
(KT BHC GUNBOX FIXT KNIL ENTERF)80`P0 
TECO BINARY

-.
@ ,~,< ZD Z,<ZD ,< ZD ,<"
Z,~#((VARIABLE-VALUE-CELL MESS . 9)
(VARIABLE-VALUE-CELL EMACS.TEMP.FILE . 14)
(NIL VARIABLE-VALUE-CELL DISPLAYTERMFLG . 0)
"
F+
0:F
:F
"
PRIN3
"
MM^R Exit To LISP"
DOWN
(KNIL KT ENTERF)

WRITE.RSCAN BINARY
 -. Z,<ZD
 (B ,> ,> GBx,^/@@ + + + ,,~A`P(VARIABLE-VALUE-CELL STR . 3)
(VARIABLE-VALUE-CELL RSCAN.BLK . 11)
PUTSTRING
(MKN BHC ENTERF) 
(PRETTYCOMPRINT NEMACSCOMS)
(RPAQQ NEMACSCOMS ((FNS * NEMACSFNS) (VARS * NEMACSVARS) (P (PUTD (QUOTE SUBSYS0
) (VIRGINFN (QUOTE SUBSYS)))) (ADDVARS (ERRORTYPELST (16 (COND ((AND (NEQ (QUOTE
NOBIND) (GETATOMVAL (QUOTE EMACS.MAP.FILE))) (EQ (CADR ERRORMESS)
EMACS.MAP.FILE)) (ERROR "End of EMACS buffer!")) ((AND (NEQ (QUOTE NOBIND) (
GETATOMVAL (QUOTE EMACS.TEMP.FILE))) (EQ (CADR ERRORMESS) EMACS.TEMP.FILE)) (
ERROR "End of EMACS temporary file!")))))) (DECLARE: DONTEVAL@LOAD
DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML)))))
(RPAQQ NEMACSFNS (,, BINARYMODE CF CP CV DISPLAY.IN.ECHO.AND.DIVE DOWN
DUMP.SCREEN DUMPX DUMPX1 DWN E! E. EDIT.DRIBBLE.FILE EMACS. EMACS.?=
EMACS.GETDEF EMACS.P EMACS.PP EMACS.RETURN ENABLE.CONTROL.C.CAPABILITY
FLUSH.EMACS GET.EMACS.BUFFER HK INFO MAKE.QUOTE MAP.BYTES MAP.PROCESS.TO.FILE
PAGE.OF.BYTE PUTSTRING READ.AC SET.EMACS.VARS SETUP.FANCY.DRIBBLE SFCOC
START.EMACS STIW SUBSYS1 SUBSYS2 TECO WRITE.RSCAN))
(RPAQQ NEMACSVARS ((DUMP.SCREEN.AMOUNT 500) EMACS.P.PRINT.LEVEL
EMACS.RETURN.ALIST OURPROCESS MAX.EMACS.INPUT (LASTEMACS NIL) (
CLEAR.SCREEN.NUMBER 30) (BL (CHARACTER CLEAR.SCREEN.NUMBER))))
(RPAQ DUMP.SCREEN.AMOUNT 500)
(RPAQQ EMACS.P.PRINT.LEVEL (2 . 7))
(RPAQQ EMACS.RETURN.ALIST ((1000 EMACS.) (1001 EMACS.?=) (1002 EMACS.P) (1003
EMACS.PP)))
(RPAQQ OURPROCESS 131072)
(RPAQQ MAX.EMACS.INPUT 896000)
(RPAQ LASTEMACS NIL)
(RPAQ CLEAR.SCREEN.NUMBER 30)
(RPAQ BL (CHARACTER CLEAR.SCREEN.NUMBER))
(PUTD (QUOTE SUBSYS0) (VIRGINFN (QUOTE SUBSYS)))
(ADDTOVAR ERRORTYPELST (16 (COND ((AND (NEQ (QUOTE NOBIND) (GETATOMVAL (QUOTE
EMACS.MAP.FILE))) (EQ (CADR ERRORMESS) EMACS.MAP.FILE)) (ERROR
"End of EMACS buffer!")) ((AND (NEQ (QUOTE NOBIND) (GETATOMVAL (QUOTE
EMACS.TEMP.FILE))) (EQ (CADR ERRORMESS) EMACS.TEMP.FILE)) (ERROR
"End of EMACS temporary file!")))))
(PRETTYCOMPRINT NEMACSCOMS)
(RPAQQ NEMACSCOMS ((FNS * NEMACSFNS) (VARS * NEMACSVARS) (P (PUTD (QUOTE SUBSYS0
) (VIRGINFN (QUOTE SUBSYS)))) (ADDVARS (ERRORTYPELST (16 (COND ((AND (NEQ (QUOTE
NOBIND) (GETATOMVAL (QUOTE EMACS.MAP.FILE))) (EQ (CADR ERRORMESS)
EMACS.MAP.FILE)) (ERROR "End of EMACS buffer!")) ((AND (NEQ (QUOTE NOBIND) (
GETATOMVAL (QUOTE EMACS.TEMP.FILE))) (EQ (CADR ERRORMESS) EMACS.TEMP.FILE)) (
ERROR "End of EMACS temporary file!")))))) (DECLARE: DONTEVAL@LOAD
DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA)))))
NIL

334
src/e142/nemacs.doc Normal file
View File

@@ -0,0 +1,334 @@
Documentation of an interface between EMACS and INTERLISP.
Robert Boyer, August 1978
(MMCM provided the solutions to most of the hard problems.)
0. Advertisement
Why would anyone want to use EMACS together with Interlisp?
a. When you are typing to Interlisp, you are already using
a text editor, one of the world's worst: it has only delete,
control-U, control-W, and control-R (which works poorly).
If you use EMACS, you get far more control over your type-in
because you can arbitrarily backup and edit. But far more
importantly, it becomes very difficult to make parenthesis
mistakes: if you type line feed instead of carriage return,
the next line is indented to the correct place; when you
type a close parenthesis, you see displayed automatically
the open parenthesis to which it corresponds.
b. When you use EDITF, you have to keep doing P commands to
see where you are and what you have done. That is probably
just right for a 100 baud teletype. But it is silly for a
9600 baud display, with its ability to keep constantly
before your eyes what you are working on. Until EMACS came,
however, the only available display oriented editors working
on Datamedia's were for text, not code. Working on LISP
code with, say, TV or TVEDIT commands, is arguably worse
than using EDITF which knows so much about the structure of
LISP sexpressions. But EMACS is approximately as informed
about the structure of LISP as is EDITF. And EMACS, besides
keeping your work right before your eyes, is far better at
the character and single parenthesis level than EDITF. Read
about all the control-meta commands in the EMACS
documentation. The TECO under EMACS really knows the syntax
of LISP (including ', %, and ").
1. User's Guide To Use The Interface
To use the interface, start LISP and load the file
<BOYER>NEMACS.COM into LISP and call (START.EMACS). When
that returns (it takes a cpu second or two), you can edit
functions, variables, and property lists with EMACS. To
edit a function, invoke the function CF on the name of the
function (for example CF(FOO)). The function definition is
written into the EMACS buffer surrounded in a (DEFINEQ...).
The virtual buffer boundaries are narrowed to the contents
of the definition. You are placed in EMACS, where you may
edit away. To return to LISP, type meta-z. But first
put point at the beginning of the
"(DEFINEQ", which can usually be gotten to by control-meta-a
or control-<. When you return to LISP nothing has yet
happened to your function. But if you execute the function
E. (that's E followed by a period to remind you of the TECO
point) of no arguments (e.g. "E.]"), then the (modified)
DEFINEQ is executed. When you return to LISP, your display
is refreshed to contain some of the text it held before the
descent into CF. You may resume ordinary LISP interaction
now, or you can call CF on another function and it will also
be inserted in the buffer (and you will be put down into
EMACS again). Again you edit, exit with meta-z, and then
you can execute E. if you want. If you wish to pop up to
LISP in the middle of an edit, then type meta-z and return
to EMACS by invoking (DOWN).
To edit a variable, use CV. To edit a property list, use
CP.
The foregoing is all you need to know to edit. It may be
useful to know a little more. To get rid of an EMACS
interface, call (FLUSH.EMACS). To get EMACS to insert into
its buffer anything you want, simply write to the file that
is the value of the variable EMACS.TEMP.FILE. Then call
(DOWN) and the stuff written to the temp file will appear in
the buffer at the end (as with the A command). The virtual
buffer is narrowed to the text that is inserted. (If
nothing has been written to EMACS.TEMP.FILE since the last
return to LISP, (DOWN) simply returns you to the state in
which you last left EMACS. are returned to lisp. If you
execute E.], then the sexp Repeated E.]'s will evaluate
through the buffer. If you want to read from the buffer
yourself, feel free: the file is named EMACS.MAP.FILE.
Upon return to LISP, the file pointer of EMACS.MAP.FILE
is set to the point of the EMACS buffer.
Warning: never close EMACS.TEMP.FILE or EMACS.MAP.FILE "by
hand." Use FLUSH.EMACS to get rid of them. CLOSEALL()
will not close them, but CLOSEF and CLOSEALL(T) will. A
dribble file is used by the interface to refresh the screen.
If you are using DRIBBLE when you start using NEMACS, or
if you start using DRIBBLE after you start using NEMACS,
then the screen refreshment will not occur.
If you call (DOWN T), then instead of being inserted, the
text that would have been inserted upon entry to EMACS is
executed (as TECO code, of course).
2. Guide to the implementation.
START.EMACS creates a fork (via SUBSYS) and opens up two
files, the values of the variables EMACS.MAP.FILE and
EMACS.TEMP.FILE. EMACS is passed the instruction MMLOAD
LIB<BOYER>INTERMACSFSEXIT via the FJ (RSCAN) command.
The library INTERMACS contains several EMACS ^R commands.
The library initialization initializes the communication
between the two forks. The EMACS fork handle is the CAR of
LASTEMACS. Whenever control is passed to the EMACS fork,
(by a call to DOWN), a teco macro in FS SUPERIOR is invoked,
given a single numeric argument. The number's absolute
value is the file pointer of EMACS.TEMP.FILE at the time of
descent. If the number is positive, then the FSSUPERIOR
macro inserts the contents of EMACS.TEMP.FILE (up to the
file pointer) at the end of the buffer, narrows the virtual
buffer boundaries to the test inserted, and refreshes the
screen. If the arg is negative, the stuff that would have
been inserted is macroed (in q-register a). Nothing happens
if the arg is 0 except that the screen is refreshed. When
the FSSUPERIOR macro exits, you are in ordinary EMACS
control-r mode.
Before returning to LISP, the command meta-z closes the gap.
Upon return to LISP, we make sure that every page of the
current EMACS buffer is PMAPed into a page of EMACS.MAP.FILE
(the same page numbers for both). We further set the
variables EMACS.BEG, EMACS.PT, and EMACS.Z to the appropriate
numbers so that they can serve as file pointers into EMACS.MAP.FILE
for the beginning, point, and end of the EMACS buffer.
We set the file pointer of EMACS.MAP.FILE to EMACS.PT. That's
why E. reads from point. But you can read anywhere from EMACS.BEG
to EMACS.Z. You should read with EMACS.READ.TABLE (or a
modification thereof that leaves the handling of control-c
the same) to catch reading past the end of the buffer by
mistake. We place a sequence of four characters (space,
control-c, double quote mark, control-c) at the bottom of the
buffer (and delete them upon return) to catch unbalanced
expression reading. The file pointer of EMACS.TEMP.FILE is
set to 0 upon return to LISP.
The full details of the hook EMACS has for doing these
things are found in the last few pages of <INFO>TECORD.
3. Miscellaneous Notes on IO
The variable DUMP.SCREEN.AMOUNT controls how many characters
of the dribble file are written to the screen after
returning to LISP from EMACS. Nothing is written unless
DISPLAYTERMFLG is non-NIL.
In the file INTERMACS, the delimiter table (what's in ..D)
is fixed to reflect Interlisp (as opposed to the default
Maclisp). In particular,
all control characters except tab, carriage return, and
line feed are "OTHER" (i.e. just like ordinary alphabetic letters);
% quotes the next character,
" delimits strings (it takes the place of | in Maclisp,
which has no strings (on DEC machines), but uses | to
delimit weird atoms);
/,|, and ; have no significance.
Square brackets mean nothing to EMACS. If you (SETQ #RPARS
NIL), then the Interlisp pretty printer (PRINTDEF) will not
use square brackets for parentheses, even during MAKEFILE.
You can still type them in to LISP. But you should set
#RPARS (in your init file, perhaps) because often CF gets
the text of a function from your files, where MAKEFILE might
have written square brackets. The function would still
be editable in EMACS, but the parenthesis commands of
EMACS would not respect the square brackets.
When you are down in EMACS, you can pretty print expressions
in two ways. ^R Format Code (on control-meta-g, which may
be entered by typing hold-g) will pretty print the
expression after point. It works well on small expressions,
less well on large. On large expressions, (particularly the
on the result of editing previously reasonably formatted
expressions), ^R Indent Sexp (control-meta-q) works well.
The reason it works well is that it inserts no carriage
returns at all, but merely fixes the number of leading
spaces on each line. ^R Format Code is a version of the ITS
grinder modified to know about %, ", etc.
If you set NORMALCOMMENTSFLG to NIL and if you print to
EMACS.TEMP.FILE yourself, be sure to readjust
PRETTYPRINTMACROS by consing (* . GETTCOMMENT) on or you'll
get your comments mapped into the EMACS temp file.
If you set NORMALCOMMENTSFLG to NIL and if you read from
EMACS.MAP.FILE yourself, then you should bind
NORMALCOMMENTSFLG to NIL during the read.
When typing into EMACS, your close parentheses will cause
the cursor to bounce back to the balancing open parentheses.
The cursor will stay there 1 second or until you type
another character. To suppress this feature, execute
0m.vLISP ) Hack$ in a minibuffer. To get a longer delay,
use the integral number of seconds you want instead of 0.
To get bouncing to occur only when the corresponding
open parenthesis is on the screen, use the
negative of the number of seconds.
4. Specification of the Interlisp commands
START.EMACS[] creates a new fork containing the EMACS editor
and returns to LISP.
DOWN[NEGATE.ARG.FLG] passes control to the EMACS fork. If
negate.arg.flg is NIL, then EMACS will insert at the end of
the buffer everything in the file EMACS.TEMP.FILE from 0 to
the current file pointer. If there is something to insert,
then the virtual buffer boundaries are narrowed to what is
inserted. (The buffer boundaries can be widened to the
whole buffer with ^R Set Bound Full (on control-x-w)). The
screen is refreshed. If negate.arg.flg is non-NIL the text
that would have been inserted is put in q-register a and
executed.
All of the following commands that descend to EMACS do so
through calls to DOWN. Upon return to LISP, the file pointer
of EMACS.TEMP.FILE is set to 0. The screen is refreshed
with the last DUMP.SCREEN.AMOUNT characters from the in the
dribble file. All the pages of EMACS containing the current
EMACS buffer are mapped into the file EMACS.MAP.FILE.
EMACS.BEG, EMACS.PT, EMACS.Z, and EMACS.MODIFF are set to
the corresponding values in the buffer block (see
<INFO>TECORD). EMACS.PT is an appropriate file pointer to
use to read from EMACS.MAP.FILE starting at the point. The
file pointer of EMACS.MAP.FILE is set to EMACS.PT. An error
is caused if EMACS returns to LISP without first closing the
gap. (The proper return is via meta-z, but 1F? FSEXIT is
sufficient if you want to do it yourself.)
E.[] executes the sexpression starting at the current point
in the EMACS buffer. The execution is recorded as an event
on the history list just as if it had been typed into the
top level read-print-eval loop. The appearance of the execution
on the dribble file is "faked" by printing it to a shallow
depth so that when the screen is refreshed, it looks vaguely
like you typed something in. But the event is really there,
so that ??, REDO, UNDO, etc. all work.
E![N] executes sexpressions starting at the current point
in the EMACS buffer using E. (above). If N is a number,
then N sexpressions are read and executed. If N is NIL,
then all the sexpressions in the buffer after point are
executed.
CF[FNNAME] writes the definition of a function into the end
of the EMACS buffer and dives down to EMACS with point at
the beginning of the insertion. The definition is inside a
DEFINEQ and hence suitable for later execution with E.[].
The definition of the function is fetched much the way that
EDITF does except that no spelling correction is attempted.
In particular, if fnname is NIL, lastword is used. If
fnname has an expr definition, the unadvised, unbroken
version is used. If fn does not have a expr definition but
does have an EXPR property, that is used. Otherwise, the
definition of the function in the first file said to contain
it is used. (Using WHEREIS to find it and using filemaps to
get it quickly into the EMACS buffer without going through
LISP). When CF returns, the function has not been changed at
all; to cause the redefinition, use E., E!, (or C-M-Y from
TECO).
CV[X] writes a variable name and definition inside an RPAQQ
into the EMACS buffer at the end and descends to EMACS. The
variable has not been affected when you return to LISP; to
cause the resetting, use E., E!, (or C-M-Y from TECO).
CP[X] writes a litatom and its property list inside a
SETPROPLIST into the EMACS buffer at the end and descends to
EMACS. The property list has not been changed when you
return to EMACS; to set the property list, use E., E!,
(or C-M-Y from TECO).
TECO[STR] runs the lower level EMACS on the result
of PRIN1ing STR and then exits. For example, TECO(HK)
clear the EMACS buffer and returns to LISP.
EDIT.DRIBBLE.FILE[] runs EMACS on the Lisp dribble
file in a buffer called DRIBBLE.
INFO[] runs the INFO program.
5. The commands available in the EMACS fork.
Besides the ordinary control-meta commands that are
part of EMACS and the linefeed and LISP ) hack that
come with EMACS lisp mode, there are a few other commands
useful in the Interlisp EMACS interface.
Meta-z runs the macro ^R Exit to LISP. Simply returns
control to LISP after control has been passed to EMACS
by DOWN (or CF, CV, or CP which call DOWN). Closes the
gap so that LISP can read from the buffer. Places the
sequence space, control-c, ", control-c at the end of
the buffer to stop reading beyond the end of the buffer.
If the new release of TOPS-20 permits the effective
setting of the end of file pointer for a file without
the necessity of closing it, these characters will not be
inserted (eventually).
Control-p runs the macro ^R Print to Level. Prints into
a second window what EDITF prints for the P command. Useful
if the current sexpression is bigger than a screen full.
To get rid of a second window, you can call ^R One Window,
which is hung on ^X-1.
Control-meta-? runs the macro ^R ARGLIST. Prints into
a second window the arglist of the function after point
(or after the ( after point if there is one.) On a datamedia,
this command is entered by typing hold (control-_) followed
by ?. To get rid of a second window, you can call ^R One Window,
which is hung on ^X-1.
Control-meta-y runs the macro ^R UP EVAL. Does an exit
up to lisp and then E.'s the expression after point and
retfrom's DOWN. Approximately identical to meta-z followed
by E.
Currently, the above 3 commands all work by calling ^R Exit
to LISP with an argument. That argument is deposited in
AC3 when EMACS exits. When DOWN gets control back, it
retrieves the argument and sassoc's down the alist
EMACS.RETURN.ALIST. If a pair is found, then the CDR of the
pair is LISPXEVALED. After evaluation, or if no pair is
found, DOWN refreshes the LISP screen and exits.
Control-meta-y, for example does the E. and then retfrom's
DOWN.

1045
src/e142/nemacs.kl Normal file

File diff suppressed because it is too large Load Diff

36
src/e142/newwin. Normal file
View File

@@ -0,0 +1,36 @@
!~Filename~:! !New Windowing command!
NEWWIN
!& Setup NEWWIN Library:! !S Setup lib!
M.M^R_ New_ Universal_ Argument u.U
M.M^R_ Scroll_ Screen/Lines u.V
0
!^R New Universal Argument:! !^R Sets argument or multiplies it by four.
Followed by digits, uses them to specify the
argument for the command after the digits.
Not followed by digits, multiplies the argument by four.!
[0 :i0 [1 0fs ^r last !* Set flag to say this is arg-setting command.!
< 4,m.i !* loop, reading as many argument characters as follow.!
:fi--"e fq0-1; !* Allow a minus sign as first character only.!
fs ^R argp # 4 fs ^R argp
fi
!<!>'
:fi f 0123456789-:;
fiu1 :i001 > !* Accumulate them as string in Q0.!
!* Get here on 1st non-arg char.!
fq0  (fs ^R argp & 4)"e
fs ^r argp 1 fs ^r argp !* If no digits, act like built-in ^U.!
fs ^r expt +1 fs ^r expt '
m0 fs ^r arg !* If got some digits, set arg value from them.!
fq0 "N fs ^R argp  3 fs ^r argp'

!^R Scroll Screen/lines:! !^R Scrolls forward one screen
If given an argument of just "-", scrolls backward 1 screen
any other arg scrolls by lines!
FS ^R ARGP & 6 - 4 "E :@M(M.M^R_ Previous_ Several_ Screens)'
FF "E :@M(M.M^R_ Next_ Several_ Screens)'
@M(M.M^R_ Next_ Screen)


38
src/e142/newwin._ej Normal file
View File

@@ -0,0 +1,38 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
m6Chvhu3:Wgocs?I3:bh& Setup NEWWIN LibraryIM.M^R New Universal Argumentu.U
M.M^R Scroll Screen/Linesu.V
0^R New Universal Argumentc[0:i0s^rlast
<4,m.i
:fi--"efq0-1;
fs^Rargp#4fs^Rargp
fi
!<!>'
:fif0123456789-:;
fiu1:i001>
fq0(fs^Rargp&4)"e
fs^rargp1fs^rargp
fs^rexpt+1fs^rexpt'
m0fs^rarg
fq0"Nfs^Rargp3fs^rargp'
^R Scroll Screen/lines}FS^RARGP&6-4"E:@M(M.M^R Previous Several Screens)'
FF"E:@M(M.M^R Next Several Screens)'
@M(M.M^R Next Screen)
~Filename~
NEWWIN~DOC~ ~Filename~New Windowing command
 ~DOC~ & Setup NEWWIN LibraryS Setup lib
#~DOC~ ^R New Universal ArgumentD^R Sets argument or multiplies it by four.
Followed by digits, uses them to specify the
argument for the command after the digits.
Not followed by digits, multiplies the argument by four.
 ~DOC~ ^R Scroll Screen/lines^R Scrolls forward one screen
If given an argument of just "-", scrolls backward 1 screen
any other arg scrolls by lines
~DIRECTORY~O& Setup NEWWIN Library
^R New Universal Argument
^R Scroll Screen/lines
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

235
src/e142/page. Normal file
View File

@@ -0,0 +1,235 @@
!~Filename~:! !Commands for handling pages intelligently. -*-TECO-*-!
PAGE
!& Setup PAGE Library:! !S Put macros on appropriate characters.!
0FO..Q PAGE_Setup_Hook[0
fq0"G M0'
"#
M.M^R_Insert_Pagemark u:.X(P) !* Insert Pagemark on ^X P!
M.M^R_Goto_Next_Page u:.X(]) !* Goto Next Page on C-X ]!
M.M^R_Goto_Previous_Page u:.X([) !* Goto Prev Page on C-X [!
M.M^R_Join_Next_Page u:.X(J) !* Join Pages on ^X J !
M.M^R_Widen_Bounds u:.X(W) !* Widen Bounds on ^X W !
M.M^R_Incremental_Search [0
M.M^R_String_Search [1
(q.S-q0)*(q.S-Q1)"E !* if Search is on C-S !
q.S M.V Real_Search_Macro
M.M^R_PAGE_Search u.S !* Then PAGE Search on C-S !
M.M^R_PAGE_Reverse_Search u.R !* Reverse Search on C-R!
'"# (q..S-q0)*(q..S-q1)"E !* else if Search is on M-S!
q..S M.V Real_Search_Macro
M.M^R_PAGE_Search u..S !* then PAGE Search on M-S !
M.M^R_PAGE_Reverse_Search u..R !* Reverse Search on M-R !
'"# FTCannot_find_Search!!!__Send_a_note_to_Rubenstein.''
M.M^R_Go_To_Page U..G !* Go to page on C-X C-P !
M.M^R_Fill_Region U...G !* Fill Region on C-M-G !
'
0M.LPAGE_Flush_Crlf
0M.LCurrent_Page
qSet_Mode_Line_Hook[1
:i*1 M(M.M&_Set_PAGE_Mode_Line) uSet_Mode_Line_Hook
0fo..q TECO_ mode_ hook F"E
M.VTECO_ mode_ hook
:i*'u1
:i*1
1uPAGE_ Flush_ Crlf

 uTECO_ mode_ hook
0fo..q Visit_ File_ Hookf"E
M.VVisit_ File_ Hook
:i*'u1
:i*1
M.LCurrent_Page
0fo..q PAGE_ Flush_ Crlf M.LPAGE_Flush_Crlf

 uVisit_File_Hook
0
!& Set PAGE Mode Line:! !S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.!
qCurrent_Page"E ' !* if Current Page is 0, return argument!
"E :i*' "#' [1 !* if no argument, cons up a blank string!
qCurrent_Page :\ [2
:I*1_Page_2 (]1 ]2) 
!^R Insert Pagemark:! !^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.!
13i 10i 12i !* insert a pagemark!
qCurrent_Page"N
%Current_Page
0:M(M.M^R_Goto_Next_Page)'
!^R Goto Next Page:! !^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.!
[0 .[1
M(M.M^R_Set_Bounds_Full)
qCurrent_Page"E !* if no virtual bounds then!
FF "E 0U0' !* if no args then narrow to current page!
0[3
0j <%3 !* increment counter!
qPAGE_Flush_Crlf"E
:s
 '"#:s

'; !* Search for page delim, throw ifn found!
.-3-Q1;> !* if past point then we're there!
q3 uCurrent_Page ]3
q1j'
qCurrent_Page+q0 [2
q2:"G !* if page num is not positive then!
0M(M.M^R_Goto_Next_Page) !* set bounds to this page!
@FENIB Fs Err' !* generate an error!
q0 M(M.M^R_Mark_Page)
q2 uCurrent_Page !* Update page number!
z-."E M(M.M^R_Widen_Bounds) !* If at end (tried to go to far)!
0M(M.M^R_Goto_Next_Page) !* Set bounds to this page!
@FENIB FS Err' !* Generate a "NOT IN BUFFER" error!
."'N & qPAGE_flush_Crlf"N2c' !* if not at beginning then skip crlf!
.(W): !* exchange point and mark!
z-."N -3c' !* if not end then back over crlf and ^L!
M(M.M^R_Set_Bounds_Region) !* set bounds to this region!
1:<q1J>"N BJ' !* go back to where we were if we can!
]2 ]1 ]0
M(M.M&_Set_Mode_Line)
0
!^R Go to Page:! !^R Go to a specific page, arg is page number.
If no arg then go to next page!
"L -1[0' !* Negative arg -=> Goto previous page!
"# FF"N !* if explicit argument!
-1[0
M(M.M^R_Set_Bounds_Full) !* widen the bounds!
1uCurrent_Page
0j' !* Jump to the beginning!
"# 1[0''
Q0 M(M.M^R_Goto_Next_Page) !* get to the right page!
0
!^R PAGE Search:! !C Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.!
QReal_ Search_ Macro, @:M(M.M&_ Macro_ on_ Whole_ Buffer)
!& Macro on whole buffer:! !S Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)!
F F & 2 "E @FEWNA FS Err' !* if no pre-comma arg, then explode!
qCurrent_ Page"E
F F & 8 "N @:M()' "# :M()''
M(M.M^R_Set_Bounds_Full)
F F & 8 "N @M()' "# M()'
0uCurrent_Page
@M(M.M^R_Goto_Next_Page)
0
!^R PAGE Reverse Search:! !C Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.!
-1:M(M.M^R_PAGE_Search)
!& File Directory:! !S Returns a string pointer to the file directory!
.[1 0[2 0[3 0[4 [5 [6 [7 [c
FS V Z+B "N FS Boundaries u2 u3 !* Remember if we had any bounds!
@M(M.M^R_Set_Bounds_Full)'
0j
q..o [A !* remember our buffer!
FS B Cons [B !* and make a scratch buffer!
< .,(@f
_ L %4 !* Advance over CRLF's, increment page no.!
3,Q4 :\ u5
1X6
QPAGE_ Flush_ Crlf "E
:S
 ' "# :S

'uc
qc"E zj').FS Boundaries
M(M.MCount_Lines) u7
4,q7 :\ u7
qB u..o
I5_7__6 !* Print the page number!
qA u..O
0,fs z FS Boundaries
qc;>
Q1J
q2"N Q3, Q2 FS Boundaries'
qb u..o HFX* (qA u..o qB FS B Kill) 
!Print File Directory:! !C Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.!
M(M.M&_ File_ Directory) [0
FTPage__#_Lines___First_Non-blank_Line
0
]0 0
!Make File Directory:! !Inserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end!
M(M.M&_ File_ Directory) [0
BJ
I0

FF"N
.[1 BJ
QComment_ Start [2
QComment_ End [3
<G2 :L G3 2c .-q1"'L;>
]3 ]2 ]1'
]0 b,.
!^R Widen Bounds:! !^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.!
@M(M.M^R_Set_Bounds_Full) !* widen the bounds!
0uCurrent_Page
:M(M.M&_Set_Mode_Line)
!^R Goto Previous Page:! !^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.!
FF "E -1'"#-' :M(M.M^R_Goto_Next_Page) !* go do it!
!^R Join Next Page:! !^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.!
"L BJ
M(M.M^R_Set_Bounds_Full)
."E @FENIB FS Err'
"# -3D''
"# ZJ
M(M.M^R_Set_Bounds_Full)
Z-."E @FENIB FS Err'
"# 3D''
0M(M.M^R_Goto_Next_Page)
0

235
src/e142/page..75 Normal file
View File

@@ -0,0 +1,235 @@
!~Filename~:! !Commands for handling pages intelligently. -*-TECO-*-!
PAGE
!& Setup PAGE Library:! !S Put macros on appropriate characters.!
0FO..Q PAGE_Setup_Hook[0
fq0"G M0'
"#
M.M^R_Insert_Pagemark u:.X(P) !* Insert Pagemark on ^X P!
M.M^R_Goto_Next_Page u:.X(]) !* Goto Next Page on C-X ]!
M.M^R_Goto_Previous_Page u:.X([) !* Goto Prev Page on C-X [!
M.M^R_Join_Next_Page u:.X(J) !* Join Pages on ^X J !
M.M^R_Widen_Bounds u:.X(W) !* Widen Bounds on ^X W !
M.M^R_Incremental_Search [0
M.M^R_String_Search [1
(q.S-q0)*(q.S-Q1)"E !* if Search is on C-S !
q.S M.V Real_Search_Macro
M.M^R_PAGE_Search u.S !* Then PAGE Search on C-S !
M.M^R_PAGE_Reverse_Search u.R !* Reverse Search on C-R!
'"# (q..S-q0)*(q..S-q1)"E !* else if Search is on M-S!
q..S M.V Real_Search_Macro
M.M^R_PAGE_Search u..S !* then PAGE Search on M-S !
M.M^R_PAGE_Reverse_Search u..R !* Reverse Search on M-R !
'"# FTCannot_find_Search!!!__Send_a_note_to_Rubenstein.''
M.M^R_Go_To_Page U..G !* Go to page on C-X C-P !
M.M^R_Fill_Region U...G !* Fill Region on C-M-G !
'
0M.LPAGE_Flush_Crlf
0M.LCurrent_Page
qSet_Mode_Line_Hook[1
:i*1 M(M.M&_Set_PAGE_Mode_Line) uSet_Mode_Line_Hook
0fo..q TECO_ mode_ hook F"E
M.VTECO_ mode_ hook
:i*'u1
:i*1
1uPAGE_ Flush_ Crlf

 uTECO_ mode_ hook
0fo..q Visit_ File_ Hookf"E
M.VVisit_ File_ Hook
:i*'u1
:i*1
M.LCurrent_Page
0fo..q PAGE_ Flush_ Crlf M.LPAGE_Flush_Crlf

 uVisit_File_Hook
0
!& Set PAGE Mode Line:! !S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.!
qCurrent_Page"E ' !* if Current Page is 0, return argument!
"E :i*' "#' [1 !* if no argument, cons up a blank string!
qCurrent_Page :\ [2
:I*1_Page_2 (]1 ]2) 
!^R Insert Pagemark:! !^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.!
13i 10i 12i !* insert a pagemark!
qCurrent_Page"N
%Current_Page
0:M(M.M^R_Goto_Next_Page)'
!^R Goto Next Page:! !^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.!
[0 .[1
M(M.M^R_Set_Bounds_Full)
qCurrent_Page"E !* if no virtual bounds then!
FF "E 0U0' !* if no args then narrow to current page!
0[3
0j <%3 !* increment counter!
qPAGE_Flush_Crlf"E
:s
 '"#:s

'; !* Search for page delim, throw ifn found!
.-3-Q1;> !* if past point then we're there!
q3 uCurrent_Page ]3
q1j'
qCurrent_Page+q0 [2
q2:"G !* if page num is not positive then!
0M(M.M^R_Goto_Next_Page) !* set bounds to this page!
@FENIB Fs Err' !* generate an error!
q0 M(M.M^R_Mark_Page)
q2 uCurrent_Page !* Update page number!
z-."E M(M.M^R_Widen_Bounds) !* If at end (tried to go to far)!
0M(M.M^R_Goto_Next_Page) !* Set bounds to this page!
@FENIB FS Err' !* Generate a "NOT IN BUFFER" error!
."'N & qPAGE_flush_Crlf"N2c' !* if not at beginning then skip crlf!
.(W): !* exchange point and mark!
z-."N -3c' !* if not end then back over crlf and ^L!
M(M.M^R_Set_Bounds_Region) !* set bounds to this region!
1:<q1J>"N BJ' !* go back to where we were if we can!
]2 ]1 ]0
M(M.M&_Set_Mode_Line)
0
!^R Go to Page:! !^R Go to a specific page, arg is page number.
If no arg then go to next page!
"L -1[0' !* Negative arg -=> Goto previous page!
"# FF"N !* if explicit argument!
-1[0
M(M.M^R_Set_Bounds_Full) !* widen the bounds!
1uCurrent_Page
0j' !* Jump to the beginning!
"# 1[0''
Q0 M(M.M^R_Goto_Next_Page) !* get to the right page!
0
!^R PAGE Search:! !C Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.!
QReal_ Search_ Macro, @:M(M.M&_ Macro_ on_ Whole_ Buffer)
!& Macro on whole buffer:! !S Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)!
F F & 2 "E @FEWNA FS Err' !* if no pre-comma arg, then explode!
qCurrent_ Page"E
F F & 8 "N @:M()' "# :M()''
M(M.M^R_Set_Bounds_Full)
F F & 8 "N @M()' "# M()'
0uCurrent_Page
@M(M.M^R_Goto_Next_Page)
0
!^R PAGE Reverse Search:! !C Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.!
-1:M(M.M^R_PAGE_Search)
!& File Directory:! !S Returns a string pointer to the file directory!
.[1 0[2 0[3 0[4 [5 [6 [7 [c
FS V Z+B "N FS Boundaries u2 u3 !* Remember if we had any bounds!
@M(M.M^R_Set_Bounds_Full)'
0j
q..o [A !* remember our buffer!
FS B Cons [B !* and make a scratch buffer!
< .,(@f
_ L %4 !* Advance over CRLF's, increment page no.!
3,Q4 :\ u5
1X6
QPAGE_ Flush_ Crlf "E
:S
 ' "# :S

'uc
qc"E zj').FS Boundaries
M(M.MCount_Lines) u7
4,q7 :\ u7
qB u..o
I5__7__6 !* Print the page number!
qA u..O
0,fs z FS Boundaries
qc;>
Q1J
q2"N Q3, Q2 FS Boundaries'
qb u..o HFX* (qA u..o qB FS B Kill) 
!Print File Directory:! !C Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.!
M(M.M&_ File_ Directory) [0
FTPage__#_Lines___First_Non-blank_Line
0
]0 0
!Make File Directory:! !Inserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end!
M(M.M&_ File_ Directory) [0
BJ
I0

FF"N
.[1 BJ
QComment_ Start [2
QComment_ End [3
<G2 :L G3 2c .-q1"'L;>
]3 ]2 ]1'
]0 b,.
!^R Widen Bounds:! !^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.!
@M(M.M^R_Set_Bounds_Full) !* widen the bounds!
0uCurrent_Page
:M(M.M&_Set_Mode_Line)
!^R Goto Previous Page:! !^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.!
FF "E -1'"#-' :M(M.M^R_Goto_Next_Page) !* go do it!
!^R Join Next Page:! !^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.!
"L BJ
M(M.M^R_Set_Bounds_Full)
."E @FENIB FS Err'
"# -3D''
"# ZJ
M(M.M^R_Set_Bounds_Full)
Z-."E @FENIB FS Err'
"# 3D''
0M(M.M^R_Goto_Next_Page)
0

236
src/e142/page..76 Normal file
View File

@@ -0,0 +1,236 @@
!~Filename~:! !Commands for handling pages intelligently. -*-TECO-*-!
PAGE
!& Setup PAGE Library:! !S Put macros on appropriate characters.!
0FO..Q PAGE_Setup_Hook[0
fq0"G M0'
"#
M.M^R_Insert_Pagemark u:.X(P) !* Insert Pagemark on ^X P!
M.M^R_Goto_Next_Page u:.X(]) !* Goto Next Page on C-X ]!
M.M^R_Goto_Previous_Page u:.X([) !* Goto Prev Page on C-X [!
M.M^R_Join_Next_Page u:.X(J) !* Join Pages on ^X J !
M.M^R_Widen_Bounds u:.X(W) !* Widen Bounds on ^X W !
M.M^R_Incremental_Search [0
M.M^R_String_Search [1
(q.S-q0)*(q.S-Q1)"E !* if Search is on C-S !
q.S M.V Real_Search_Macro
M.M^R_PAGE_Search u.S !* Then PAGE Search on C-S !
M.M^R_PAGE_Reverse_Search u.R !* Reverse Search on C-R!
'"# (q..S-q0)*(q..S-q1)"E !* else if Search is on M-S!
q..S M.V Real_Search_Macro
M.M^R_PAGE_Search u..S !* then PAGE Search on M-S !
M.M^R_PAGE_Reverse_Search u..R !* Reverse Search on M-R !
'"# FTCannot_find_Search!!!__Send_a_note_to_Rubenstein.''
M.M^R_Go_To_Page U..G !* Go to page on C-X C-P !
M.M^R_Fill_Region U...G !* Fill Region on C-M-G !
'
0M.LPAGE_Flush_Crlf
0M.LCurrent_Page
qSet_Mode_Line_Hook[1
:i*1 M(M.M&_Set_PAGE_Mode_Line) uSet_Mode_Line_Hook
0fo..q TECO_ mode_ hook F"E
M.VTECO_ mode_ hook
:i*'u1
:i*1
1uPAGE_ Flush_ Crlf

 uTECO_ mode_ hook
0fo..q Visit_ File_ Hookf"E
M.VVisit_ File_ Hook
:i*'u1
:i*1
M.LCurrent_Page
0fo..q PAGE_ Flush_ Crlf M.LPAGE_Flush_Crlf

 uVisit_File_Hook
0
!& Set PAGE Mode Line:! !S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.!
qCurrent_Page"E ' !* if Current Page is 0, return argument!
"E :i*' "#' [1 !* if no argument, cons up a blank string!
qCurrent_Page :\ [2
:I*1_Page_2 (]1 ]2) 
!^R Insert Pagemark:! !^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.!
13i 10i 12i !* insert a pagemark!
qCurrent_Page"N
%Current_Page
0:M(M.M^R_Goto_Next_Page)'
!^R Goto Next Page:! !^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.!
[0 .[1
M(M.M^R_Set_Bounds_Full)
qCurrent_Page"E !* if no virtual bounds then!
FF "E 0U0' !* if no args then narrow to current page!
0[3
0j <%3 !* increment counter!
qPAGE_Flush_Crlf"E
:s
 '"#:s

'; !* Search for page delim, throw ifn found!
.-3-Q1;> !* if past point then we're there!
q3 uCurrent_Page ]3
q1j'
qCurrent_Page+q0 [2
q2:"G !* if page num is not positive then!
0M(M.M^R_Goto_Next_Page) !* set bounds to this page!
@FENIB Fs Err' !* generate an error!
q0 M(M.M^R_Mark_Page)
q2 uCurrent_Page !* Update page number!
z-."E M(M.M^R_Widen_Bounds) !* If at end (tried to go to far)!
0M(M.M^R_Goto_Next_Page) !* Set bounds to this page!
@FENIB FS Err' !* Generate a "NOT IN BUFFER" error!
."'N & qPAGE_flush_Crlf"N2c' !* if not at beginning then skip crlf!
.(W): !* exchange point and mark!
z-."N -3c' !* if not end then back over crlf and ^L!
M(M.M^R_Set_Bounds_Region) !* set bounds to this region!
1:<q1J>"N BJ' !* go back to where we were if we can!
]2 ]1 ]0
M(M.M&_Set_Mode_Line)
0
!^R Go to Page:! !^R Go to a specific page, arg is page number.
If no arg then go to next page!
"L -1[0' !* Negative arg -=> Goto previous page!
"# FF"N !* if explicit argument!
-1[0
M(M.M^R_Set_Bounds_Full) !* widen the bounds!
1uCurrent_Page
0j' !* Jump to the beginning!
"# 1[0''
Q0 M(M.M^R_Goto_Next_Page) !* get to the right page!
0
!^R PAGE Search:! !C Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.!
QReal_ Search_ Macro, @:M(M.M&_ Macro_ on_ Whole_ Buffer)
!& Macro on whole buffer:! !S Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)!
F F & 2 "E @FEWNA FS Err' !* if no pre-comma arg, then explode!
qCurrent_ Page"E
F F & 8 "N @:M()' "# :M()''
M(M.M^R_Set_Bounds_Full)
F F & 8 "N @M()' "# M()'
0uCurrent_Page
@M(M.M^R_Goto_Next_Page)
0
!^R PAGE Reverse Search:! !C Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.!
-1:M(M.M^R_PAGE_Search)
!& File Directory:! !S Returns a string pointer to the file directory!
.[1 0[2 0[3 0[4 [5 [6 [7 [c
FS V Z+B "N FS Boundaries u2 u3 !* Remember if we had any bounds!
@M(M.M^R_Set_Bounds_Full)'
0j
q..o [A !* remember our buffer!
FS B Cons [B !* and make a scratch buffer!
< .,(@f
_ L %4 !* Advance over CRLF's, increment page no.!
3,Q4 :\ u5
1X6
QPAGE_ Flush_ Crlf "E
:S
 ' "# :S

'uc
qc"E zj').FS Boundaries
M(M.MCount_Lines) u7
4,q7 :\ u7
qB u..o
I5_7__ !* Print the page number!
0,(fswidth-10)g6
qA u..O
0,fs z FS Boundaries
qc;>
Q1J
q2"N Q3, Q2 FS Boundaries'
qb u..o HFX* (qA u..o qB FS B Kill) 
!Print File Directory:! !C Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.!
M(M.M&_ File_ Directory) [0
FTPage_Lines__First_Non-blank_Line
0
]0 0
!Make File Directory:! !Inserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end!
M(M.M&_ File_ Directory) [0
BJ
I0

FF"N
.[1 BJ
QComment_ Start [2
QComment_ End [3
<G2 :L G3 2c .-q1"'L;>
]3 ]2 ]1'
]0 b,.
!^R Widen Bounds:! !^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.!
@M(M.M^R_Set_Bounds_Full) !* widen the bounds!
0uCurrent_Page
:M(M.M&_Set_Mode_Line)
!^R Goto Previous Page:! !^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.!
FF "E -1'"#-' :M(M.M^R_Goto_Next_Page) !* go do it!
!^R Join Next Page:! !^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.!
"L BJ
M(M.M^R_Set_Bounds_Full)
."E @FENIB FS Err'
"# -3D''
"# ZJ
M(M.M^R_Set_Bounds_Full)
Z-."E @FENIB FS Err'
"# 3D''
0M(M.M^R_Goto_Next_Page)
0

238
src/e142/page..77 Normal file
View File

@@ -0,0 +1,238 @@
!~Filename~:! !Commands for handling pages intelligently. -*-TECO-*-!
PAGE
!& Setup PAGE Library:! !S Put macros on appropriate characters.!
0FO..Q PAGE_Setup_Hook[0
fq0"G M0'
"#
M.M^R_Insert_Pagemark u:.X(P) !* Insert Pagemark on ^X P!
M.M^R_Goto_Next_Page u:.X(]) !* Goto Next Page on C-X ]!
M.M^R_Goto_Previous_Page u:.X([) !* Goto Prev Page on C-X [!
M.M^R_Join_Next_Page u:.X(J) !* Join Pages on ^X J !
M.M^R_Widen_Bounds u:.X(W) !* Widen Bounds on ^X W !
M.M^R_Incremental_Search [0
M.M^R_String_Search [1
(q.S-q0)*(q.S-Q1)"E !* if Search is on C-S !
q.S M.V Real_Search_Macro
M.M^R_PAGE_Search u.S !* Then PAGE Search on C-S !
M.M^R_PAGE_Reverse_Search u.R !* Reverse Search on C-R!
'"# (q..S-q0)*(q..S-q1)"E !* else if Search is on M-S!
q..S M.V Real_Search_Macro
M.M^R_PAGE_Search u..S !* then PAGE Search on M-S !
M.M^R_PAGE_Reverse_Search u..R !* Reverse Search on M-R !
'"# FTCannot_find_Search!!!__Send_a_note_to_Rubenstein.''
M.M^R_Go_To_Page U..G !* Go to page on C-X C-P !
M.M^R_Fill_Region U...G !* Fill Region on C-M-G !
'
0M.LPAGE_Flush_Crlf
0M.LCurrent_Page
qSet_Mode_Line_Hook[1
:i*1 M(M.M&_Set_PAGE_Mode_Line) uSet_Mode_Line_Hook
0fo..q TECO_ mode_ hook F"E
M.VTECO_ mode_ hook
:i*'u1
:i*1
1uPAGE_ Flush_ Crlf

 uTECO_ mode_ hook
0fo..q Visit_ File_ Hookf"E
M.VVisit_ File_ Hook
:i*'u1
:i*1
M.LCurrent_Page
0fo..q PAGE_ Flush_ Crlf M.LPAGE_Flush_Crlf

 uVisit_File_Hook
0
!& Set PAGE Mode Line:! !S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.!
qCurrent_Page"E ' !* if Current Page is 0, return argument!
"E :i*' "#' [1 !* if no argument, cons up a blank string!
qCurrent_Page :\ [2
:I*1_Page_2 (]1 ]2) 
!^R Insert Pagemark:! !^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.!
13i 10i 12i !* insert a pagemark!
qCurrent_Page"N
%Current_Page
0:M(M.M^R_Goto_Next_Page)'
!^R Goto Next Page:! !^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.!
[0 .[1
M(M.M^R_Set_Bounds_Full)
qCurrent_Page"E !* if no virtual bounds then!
FF "E 0U0' !* if no args then narrow to current page!
0[3
0j <%3 !* increment counter!
qPAGE_Flush_Crlf"E
:s
 '"#:s

'; !* Search for page delim, throw ifn found!
.-3-Q1;> !* if past point then we're there!
q3 uCurrent_Page ]3
q1j'
qCurrent_Page+q0 [2
q2:"G !* if page num is not positive then!
0M(M.M^R_Goto_Next_Page) !* set bounds to this page!
@FENIB Fs Err' !* generate an error!
q0 M(M.M^R_Mark_Page)
q2 uCurrent_Page !* Update page number!
z-."E M(M.M^R_Widen_Bounds) !* If at end (tried to go to far)!
0M(M.M^R_Goto_Next_Page) !* Set bounds to this page!
@FENIB FS Err' !* Generate a "NOT IN BUFFER" error!
."'N & qPAGE_flush_Crlf"N2c' !* if not at beginning then skip crlf!
.(W): !* exchange point and mark!
z-."N -3c' !* if not end then back over crlf and ^L!
M(M.M^R_Set_Bounds_Region) !* set bounds to this region!
1:<q1J>"N BJ' !* go back to where we were if we can!
]2 ]1 ]0
M(M.M&_Set_Mode_Line)
0
!^R Go to Page:! !^R Go to a specific page, arg is page number.
If no arg then go to next page!
"L -1[0' !* Negative arg -=> Goto previous page!
"# FF"N !* if explicit argument!
-1[0
M(M.M^R_Set_Bounds_Full) !* widen the bounds!
1uCurrent_Page
0j' !* Jump to the beginning!
"# 1[0''
Q0 M(M.M^R_Goto_Next_Page) !* get to the right page!
0
!^R PAGE Search:! !C Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.!
QReal_ Search_ Macro, @:M(M.M&_ Macro_ on_ Whole_ Buffer)
!& Macro on whole buffer:! !S Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)!
F F & 2 "E @FEWNA FS Err' !* if no pre-comma arg, then explode!
qCurrent_ Page"E
F F & 8 "N @:M()' "# :M()''
M(M.M^R_Set_Bounds_Full)
F F & 8 "N @M()' "# M()'
0uCurrent_Page
@M(M.M^R_Goto_Next_Page)
0
!^R PAGE Reverse Search:! !C Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.!
-1:M(M.M^R_PAGE_Search)
!& File Directory:! !S Returns a string pointer to the file directory!
.[1 0[2 0[3 0[4 [5 [6 [7 [c
FS V Z+B "N FS Boundaries u2 u3 !* Remember if we had any bounds!
@M(M.M^R_Set_Bounds_Full)'
0j
q..o [A !* remember our buffer!
FS B Cons [B !* and make a scratch buffer!
< .,(@f
_ L %4 !* Advance over CRLF's, increment page no.!
3,Q4 :\ u5
1X6
QPAGE_ Flush_ Crlf "E
:S
 ' "# :S

'uc
qc"E zj').FS Boundaries
M(M.MCount_Lines) u7
4,q7 :\ u7
qB u..o
I5_7__ !* Print the page number!
0,(fswidth-11)g6
i

qA u..O
0,fs z FS Boundaries
qc;>
Q1J
q2"N Q3, Q2 FS Boundaries'
qb u..o HFX* (qA u..o qB FS B Kill) 
!Print File Directory:! !C Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.!
M(M.M&_ File_ Directory) [0
FTPage_Lines__First_Non-blank_Line
0
]0 0
!Make File Directory:! !Inserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end!
M(M.M&_ File_ Directory) [0
BJ
I0

FF"N
.[1 BJ
QComment_ Start [2
QComment_ End [3
<G2 :L G3 2c .-q1"'L;>
]3 ]2 ]1'
]0 b,.
!^R Widen Bounds:! !^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.!
@M(M.M^R_Set_Bounds_Full) !* widen the bounds!
0uCurrent_Page
:M(M.M&_Set_Mode_Line)
!^R Goto Previous Page:! !^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.!
FF "E -1'"#-' :M(M.M^R_Goto_Next_Page) !* go do it!
!^R Join Next Page:! !^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.!
"L BJ
M(M.M^R_Set_Bounds_Full)
."E @FENIB FS Err'
"# -3D''
"# ZJ
M(M.M^R_Set_Bounds_Full)
Z-."E @FENIB FS Err'
"# 3D''
0M(M.M^R_Goto_Next_Page)
0

238
src/e142/page..78 Normal file
View File

@@ -0,0 +1,238 @@
!~Filename~:! !Commands for handling pages intelligently. -*-TECO-*-!
PAGE
!& Setup PAGE Library:! !S Put macros on appropriate characters.!
0FO..Q PAGE_Setup_Hook[0
fq0"G M0'
"#
M.M^R_Insert_Pagemark u:.X(P) !* Insert Pagemark on ^X P!
M.M^R_Goto_Next_Page u:.X(]) !* Goto Next Page on C-X ]!
M.M^R_Goto_Previous_Page u:.X([) !* Goto Prev Page on C-X [!
M.M^R_Join_Next_Page u:.X(J) !* Join Pages on ^X J !
M.M^R_Widen_Bounds u:.X(W) !* Widen Bounds on ^X W !
M.M^R_Incremental_Search [0
M.M^R_String_Search [1
(q.S-q0)*(q.S-Q1)"E !* if Search is on C-S !
q.S M.V Real_Search_Macro
M.M^R_PAGE_Search u.S !* Then PAGE Search on C-S !
M.M^R_PAGE_Reverse_Search u.R !* Reverse Search on C-R!
'"# (q..S-q0)*(q..S-q1)"E !* else if Search is on M-S!
q..S M.V Real_Search_Macro
M.M^R_PAGE_Search u..S !* then PAGE Search on M-S !
M.M^R_PAGE_Reverse_Search u..R !* Reverse Search on M-R !
'"# FTCannot_find_Search!!!__Send_a_note_to_Rubenstein.''
M.M^R_Go_To_Page U..G !* Go to page on C-X C-P !
M.M^R_Fill_Region U...G !* Fill Region on C-M-G !
'
0M.LPAGE_Flush_Crlf
0M.LCurrent_Page
qSet_Mode_Line_Hook[1
:i*1 M(M.M&_Set_PAGE_Mode_Line) uSet_Mode_Line_Hook
0fo..q TECO_ mode_ hook F"E
M.VTECO_ mode_ hook
:i*'u1
:i*1
1uPAGE_ Flush_ Crlf

 uTECO_ mode_ hook
0fo..q Visit_ File_ Hookf"E
M.VVisit_ File_ Hook
:i*'u1
:i*1
M.LCurrent_Page
0fo..q PAGE_ Flush_ Crlf M.LPAGE_Flush_Crlf

 uVisit_File_Hook
0
!& Set PAGE Mode Line:! !S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.!
qCurrent_Page"E ' !* if Current Page is 0, return argument!
"E :i*' "#' [1 !* if no argument, cons up a blank string!
qCurrent_Page :\ [2
:I*1_Page_2 (]1 ]2) 
!^R Insert Pagemark:! !^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.!
13i 10i 12i !* insert a pagemark!
qCurrent_Page"N
%Current_Page
0:M(M.M^R_Goto_Next_Page)'
!^R Goto Next Page:! !^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.!
[0 .[1
M(M.M^R_Set_Bounds_Full)
qCurrent_Page"E !* if no virtual bounds then!
FF "E 0U0' !* if no args then narrow to current page!
0[3
0j <%3 !* increment counter!
qPAGE_Flush_Crlf"E
:s
 '"#:s

'; !* Search for page delim, throw ifn found!
.-3-Q1;> !* if past point then we're there!
q3 uCurrent_Page ]3
q1j'
qCurrent_Page+q0 [2
q2:"G !* if page num is not positive then!
0M(M.M^R_Goto_Next_Page) !* set bounds to this page!
@FENIB Fs Err' !* generate an error!
q0 M(M.M^R_Mark_Page)
q2 uCurrent_Page !* Update page number!
z-."E M(M.M^R_Widen_Bounds) !* If at end (tried to go to far)!
0M(M.M^R_Goto_Next_Page) !* Set bounds to this page!
@FENIB FS Err' !* Generate a "NOT IN BUFFER" error!
."'N & qPAGE_flush_Crlf"N2c' !* if not at beginning then skip crlf!
.(W): !* exchange point and mark!
z-."N -3c' !* if not end then back over crlf and ^L!
M(M.M^R_Set_Bounds_Region) !* set bounds to this region!
1:<q1J>"N BJ' !* go back to where we were if we can!
]2 ]1 ]0
M(M.M&_Set_Mode_Line)
0
!^R Go to Page:! !^R Go to a specific page, arg is page number.
If no arg then go to next page!
"L -1[0' !* Negative arg -=> Goto previous page!
"# FF"N !* if explicit argument!
-1[0
M(M.M^R_Set_Bounds_Full) !* widen the bounds!
1uCurrent_Page
0j' !* Jump to the beginning!
"# 1[0''
Q0 M(M.M^R_Goto_Next_Page) !* get to the right page!
0
!^R PAGE Search:! !C Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.!
QReal_ Search_ Macro, @:M(M.M&_ Macro_ on_ Whole_ Buffer)
!& Macro on whole buffer:! !S Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)!
F F & 2 "E @FEWNA FS Err' !* if no pre-comma arg, then explode!
qCurrent_ Page"E
F F & 8 "N @:M()' "# :M()''
M(M.M^R_Set_Bounds_Full)
F F & 8 "N @M()' "# M()'
0uCurrent_Page
@M(M.M^R_Goto_Next_Page)
0
!^R PAGE Reverse Search:! !C Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.!
-1:M(M.M^R_PAGE_Search)
!& File Directory:! !S Returns a string pointer to the file directory!
.[1 0[2 0[3 0[4 [5 [6 [7 [c
FS V Z+B "N FS Boundaries u2 u3 !* Remember if we had any bounds!
@M(M.M^R_Set_Bounds_Full)'
0j
q..o [A !* remember our buffer!
FS B Cons [B !* and make a scratch buffer!
< .,(@f
_ L %4 !* Advance over CRLF's, increment page no.!
3,Q4 :\ u5
.,(:l).X6
QPAGE_ Flush_ Crlf "E
:S
 ' "# :S

'uc
qc"E zj').FS Boundaries
M(M.MCount_Lines) u7
4,q7 :\ u7
qB u..o
I5__7___ !* Print the page number!
0,(fswidth-13)g6
i

qA u..O
0,fs z FS Boundaries
qc;>
Q1J
q2"N Q3, Q2 FS Boundaries'
qb u..o HFX* (qA u..o qB FS B Kill) 
!Print File Directory:! !C Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.!
M(M.M&_ File_ Directory) [0
FTPage_Lines__First_Non-blank_Line
0
]0 0
!Make File Directory:! !Inserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end!
M(M.M&_ File_ Directory) [0
BJ
I0

FF"N
.[1 BJ
QComment_ Start [2
QComment_ End [3
<G2 :L G3 2c .-q1"'L;>
]3 ]2 ]1'
]0 b,.
!^R Widen Bounds:! !^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.!
@M(M.M^R_Set_Bounds_Full) !* widen the bounds!
0uCurrent_Page
:M(M.M&_Set_Mode_Line)
!^R Goto Previous Page:! !^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.!
FF "E -1'"#-' :M(M.M^R_Goto_Next_Page) !* go do it!
!^R Join Next Page:! !^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.!
"L BJ
M(M.M^R_Set_Bounds_Full)
."E @FENIB FS Err'
"# -3D''
"# ZJ
M(M.M^R_Set_Bounds_Full)
Z-."E @FENIB FS Err'
"# 3D''
0M(M.M^R_Goto_Next_Page)
0

216
src/e142/page._ej Normal file
View File

@@ -0,0 +1,216 @@
PW
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
I h rhv'$0 i t 6 B~ d qR]

 M ZBK 6 @GOTaEV8G"GU| ]h-&4y LX
j
t
_
f^d& Setup PAGE LibraryU0FO..QPAGE Setup Hook[0
fq0"GM0'
"#
M.M^R Insert Pagemarku:.X(P)
M.M^R Goto Next Pageu:.X(])
M.M^R Goto Previous Pageu:.X([)
M.M^R Join Next Pageu:.X(J)
M.M^R Widen Boundsu:.X(W)
M.M^R Incremental Search[0
M.M^R String Search[1
(q.S-q0)*(q.S-Q1)"E
q.SM.VReal Search Macro
M.M^R PAGE Searchu.S
M.M^R PAGE Reverse Searchu.R
'"#(q..S-q0)*(q..S-q1)"E
q..SM.VReal Search Macro
M.M^R PAGE Searchu..S
M.M^R PAGE Reverse Searchu..R
'"#FTCannot find Search!!! Send a note to Rubenstein.''
M.M^R Go To PageU..G
M.M^R Fill RegionU...G
'
0M.LPAGE Flush Crlf
0M.LCurrent Page
qSet Mode Line Hook[1
:i*1M(M.M& Set PAGE Mode Line)uSet Mode Line Hook
0fo..qTECO mode hookF"E
M.VTECO mode hook
:i*'u1
:i*1
1uPAGE Flush Crlf

uTECO mode hook
0fo..qVisit File Hookf"E
M.VVisit File Hook
:i*'u1
:i*1
M.LCurrent Page
0fo..qPAGE Flush CrlfM.LPAGE Flush Crlf

uVisit File Hook
0& Set PAGE Mode LineVqCurrent Page"E'
"E:i*'"#'[1
qCurrent Page:\[2
:I*1 Page 2(]1]2)^R Insert PagemarkN13i10i12i
qCurrent Page"N
%Current Page
0:M(M.M^R Goto Next Page)'^R Goto Next Page_[0.[1
M(M.M^R Set Bounds Full)
qCurrent Page"E
FF"E0U0'
0[3
0j<%3
qPAGE Flush Crlf"E
:s
 '"#:s

';
.-3-Q1;>
q3uCurrent Page]3
q1j'
qCurrent Page+q0[2
q2:"G
0M(M.M^R Goto Next Page)
@FENIBFsErr'
q0M(M.M^R Mark Page)
q2uCurrent Page
z-."EM(M.M^R Widen Bounds)
0M(M.M^R Goto Next Page)
@FENIBFSErr'
."'N&qPAGE flush Crlf"N2c'
.(W):
z-."N-3c'
M(M.M^R Set Bounds Region)
1:<q1J>"NBJ'
]2]1]0
M(M.M& Set Mode Line)
0^R Go to Pagex"L-1[0'
"#FF"N
-1[0
M(M.M^R Set Bounds Full)
1uCurrent Page
0j'
"#1[0''
Q0M(M.M^R Goto Next Page)
0^R PAGE Search:QReal Search Macro,@:M(M.M& Macro on Whole Buffer)& Macro on whole buffer.FF&2"E@FEWNAFSErr'
qCurrent Page"E
FF&8"N@:M()'"#:M()''
M(M.M^R Set Bounds Full)
FF&8"N@M()'"#M()'
0uCurrent Page
@M(M.M^R Goto Next Page)
0^R PAGE Reverse Search-1:M(M.M^R PAGE Search)& File Directory .[10[20[30[4[5[6[7[c
FSVZ+B"NFSBoundariesu2u3
@M(M.M^R Set Bounds Full)'
0j
q..o[A
FSBCons
<.,(@f
 L%4
3,Q4:\u5
.,(:l).X6
QPAGE Flush Crlf"E
:S
 '"#:S

'uc
qc"Ezj').FSBoundaries
M(M.MCount Lines)u7
4,q7:\u7
qBu..o
I5 7 
0,(fswidth-13)g6
i

qAu..O
0,fszFSBoundaries
qc;>
Q1J
q2"NQ3,Q2FSBoundaries'
qbu..oHFX*(qAu..oqBFSBKill)Print File DirectoryMM(M.M& File Directory)[0
FTPage Lines First Non-blank Line
0
]00Make File DirectoryM(M.M& File Directory)[0
BJ
I0

FF"N
.[1BJ
QComment Start[2
QComment End[3
<G2:LG32c.-q1"'L;>
]3]2]1'
]0b,.^R Widen BoundsI@M(M.M^R Set Bounds Full)
0uCurrent Page
:M(M.M& Set Mode Line)^R Goto Previous Page+FF"E-1'"#-':M(M.M^R Goto Next Page)^R Join Next Page"LBJ
M(M.M^R Set Bounds Full)
."E@FENIBFSErr'
"#-3D''
"#ZJ
M(M.M^R Set Bounds Full)
Z-."E@FENIBFSErr'
"#3D''
0M(M.M^R Goto Next Page)
0~Filename~PAGE~DOC~ ~Filename~=Commands for handling pages intelligently. -*-TECO-*-
~DOC~ & Setup PAGE Library-S Put macros on appropriate characters.
~DOC~ & Set PAGE Mode Line=S Add Page <n> onto the mode line, maybe.
If given a string argument, appends Page <n> onto the end of the
string, if there are buffer bounds in effect, and returns the
new string.
~DOC~ ^R Insert Pagemark'^R Insert a page mark, leaving new second page current
Inserts a formfeed and a crlf, sets the virtual buffer
boundaries to be the second half of the old page.
~DOC~ ^R Goto Next Page^R Make the next page current.
Set the virtual buffer boundaries to the next page. If given
a negative argument, goes to previous page.
~DOC~ ^R Go to PageS^R Go to a specific page, arg is page number.
If no arg then go to next page
~DOC~ ^R PAGE SearchOC Search that crosses virtual buffer boundaries.
Uses ^R Incremental Search or ^R String Search, whichever you had on C-S
or M-S when you loaded the PAGE library. See the documentation of
whichever search you use for details. You can change the search used by
doing, for instance, M.M^R String Search$ u$Real Search Macro$.
!~DOC~ & Macro on whole bufferlS Macros its precomma arg on the whole buffer.
The post-comma argument and @ flag are passed on to the macro.
If Q$Current Page$ is non-zero, then the bounds are widened, the argument
is macroed, and the bounds are narrowed again to the current page. Thus,
the way to do, say, a search is:
M.M^R Incremental Search$, @M(M.M& Macro on Whole Buffer$)
 ~DOC~ ^R PAGE Reverse SearchqC Reverse Search that crosses virtual buffer
boundaries. See documentation of ^R PAGE Search for details.
~DOC~ & File Directory6S Returns a string pointer to the file directory
~DOC~ Print File DirectorywC Prints a directory of the file
Prints out the first non-blank line on each page, preceded by its
page number.
~DOC~ Make File DirectorymInserts a directory of the file at the beginning
Prints out the first non-blank line on each page, preceded by its
page number. If given an argument, puts Q$Comment Start$ at the start
of each line and Q$Comment End$ at the end
~DOC~ ^R Widen Bounds ^R Widen the virtual buffer bounds to include the whole file
Calls ^R Set Bounds Full and clears the page number from the mode line.

~DOC~ ^R Goto Previous Page^R Make the previous page current.
Set the virtual buffer boundaries to the previous page. If given
a negative argument, goes to the next page.
~DOC~ ^R Join Next Page^R Combine two pages together
Combines this page with next. If given negative arg,
combines previous page with this one.
~DIRECTORY~
& Setup PAGE Library
& Set PAGE Mode Line
^R Insert Pagemark
^R Goto Next Page
^R Go to Page
^R PAGE Search
& Macro on whole buffer
^R PAGE Reverse Search
& File Directory
Print File Directory
Make File Directory
^R Widen Bounds
^R Goto Previous Page
^R Join Next Page
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

64
src/e142/patch. Normal file
View File

@@ -0,0 +1,64 @@
!* -*-Teco-*-!
!~Filename~:! !Patches to EMACS macros!
PATCH
!Select Buffer:! !C Select or create buffer, given its name.
If called from a ^R character, read the buffer name from the terminal
or should be given a buffer number as a numeric arg.
As a subroutine, needs a buffer number (or buffer name pointer) as a
prefix arg, or a buffer name as a string arg.
If there is a buffer with that name, it is selected.
Otherwise, a buffer with that name is created and selected.
When a new buffer is selected the first time, if QBuffer Creation Hook
is nonzero, it is run after the buffer is selected.!
MMM_&_Check_Top_Levelbuffers
[..h [4 0[3 !* Make sure we can display the bfr we switch to.!
FF&1"N U3' !* Numeric arg => use it as buffer or buffer # to select.!
"# "E :F "G :i3'' !* No postcomma arg or precomma arg => read string arg.!
Q3"E M.M List_BuffersF[HELPMAC !* Else must read from tty.!
"N u4' !* Precomma arg is prompt string to use.!
"# :i4 Select_Buffer'
QPrevious_Buffer[3 !* Get name of default new buffer to put in prompt.!
1,Q3M(M.M &_Find_Buffer)"L Q:.B(1)U3'
3,m(m.m &_Read_Line)4_(3):_u3'' !* Read name of buffer to select.!
Q3[5 !* Save name (or buffer #) in Q5.!
FQ3"E QPrevious_BufferU3' !* Null string means previous buffer.!
1,Q3 M(M.M&_Find_Buffer)[1 !* Get index in buffer table of this name or number.!
Q1u4 !* Q4 remains negative, for a new buffer.!
Q1"L !* No such buffer => make one now.!
FQ3"L :I*No_such_buffer FS ERR' !* Refuse to create buffer if bfr number spec'd.!
FQ5"E 0U1 0U4' !* If ^XB<cr> and prev bfr non ex, use 1st buffer instead.!
"# Q3 M(M.M &_Create_Buffer)U1'' !* Else create the specified buffer.!
QBuffer_IndexU3
Q1-Q3"E 0'
1F[Noquit !* Prevent quitting half-switched.!
0FO..Q Buffer_Deselection_Hook[5
Q5"N M5'
Q.B[..O ZJ 0K ]..O !* Get gap in buffer table out of the way.!
Q3,9F.B !* Swap old buffer's locals back into its entry.!
QBuffer_FilenamesU:.B(Q3+2) !* Stick its filenames back into entry.!
QMode U:.B(Q3+3) !* Stick selected mode into entry.!
!* Simultaneously swap out old buffer's TECO default filenames
and window address, and swap in the new buffer's.!
Q:.B(Q1+6) FS WINDOW U:.B(Q3+6)
Q:.B(Q1+5)F"E W' FS D FILE U:.B(Q3+5)
!* We now are "between buffers".!
Q:.B(Q1+2) UBuffer_Filenames !* Get filenames of new buffer.!
Q:.B(Q1+1)UBuffer_Name !* For our records, save its name!
Q:.B(Q1+3)UMode
Q1 UBuffer_Index !* and its index, for when we deselect it.!
Q:.B(Q3+1) UPrevious_Buffer !* remember previously selected buffer's name.!
Q:.B(Q1+3) U3
Q1,9F.B !* Get new buffer's local variable values.!
1FSMODE CHANGE !* Recompute mode line eventually.!
Q:.B(Q1+4) U..O !* Now really switch to this buffer.!
0FO..Q Buffer_Selection_HookF"N [..N'
Q:.B(Q1+5)"N ' !* If buffer has been selected before, that's all.!
Q:.B(Q1+1)U4
FS OS TECO "E F64'"#Q4' FS DFN1 !* If buffer selected for 1st time, set default fn1 from name.!
0FO..QBuffer_Creation_HookU4 !* If buffer selecetd for 1st time, maybe run user's hook.!
Q4"N M4'


63
src/e142/patch._ej Normal file
View File

@@ -0,0 +1,63 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
E"+<D'2
MSSelect Buffer0MMM & Check Top Levelbuffers
[..h[40[3
FF&1"NU3'
"#"E:F "G:i3''
Q3"EM.MList BuffersF[HELPMAC
"Nu4'
"#:i4Select Buffer'
QPrevious Buffer[3
1,Q3M(M.M& Find Buffer)"LQ:.B(1)U3'
3,m(m.m& Read Line)4 (3): u3''
Q3[5
FQ3"EQPrevious BufferU3'
1,Q3M(M.M& Find Buffer)[1
Q1u4
Q1"L
FQ3"L:I*No such bufferFSERR'
FQ5"E0U10U4'
"#Q3M(M.M& Create Buffer)U1''
QBuffer IndexU3
Q1-Q3"E0'
1F[Noquit
0FO..QBuffer Deselection Hook[5
Q5"NM5'
Q.B[..OZJ0K]..O
Q3,9F.B
QBuffer FilenamesU:.B(Q3+2)
QModeU:.B(Q3+3)
Q:.B(Q1+6)FSWINDOWU:.B(Q3+6)
Q:.B(Q1+5)F"EW'FSDFILEU:.B(Q3+5)
Q:.B(Q1+2)UBuffer Filenames
Q:.B(Q1+1)UBuffer Name
Q:.B(Q1+3)UMode
Q1UBuffer Index
Q:.B(Q3+1)UPrevious Buffer
Q:.B(Q1+3)U3
Q1,9F.B
1FSMODECHANGE
Q:.B(Q1+4)U..O
0FO..QBuffer Selection HookF"N[..N'
Q:.B(Q1+5)"N'
Q:.B(Q1+1)U4
FSOSTECO"EF64'"#Q4'FSDFN1
0FO..QBuffer Creation HookU4
Q4"NM4'
~Filename~ PATCH~DOC~ ~Filename~Patches to EMACS macros
~DOC~ Select BufferC Select or create buffer, given its name.
If called from a ^R character, read the buffer name from the terminal
or should be given a buffer number as a numeric arg.
As a subroutine, needs a buffer number (or buffer name pointer) as a
prefix arg, or a buffer name as a string arg.
If there is a buffer with that name, it is selected.
Otherwise, a buffer with that name is created and selected.
When a new buffer is selected the first time, if QBuffer Creation Hook
is nonzero, it is run after the buffer is selected.
~DIRECTORY~Select Buffer
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

BIN
src/e142/pl1lib._ej Normal file

Binary file not shown.

22
src/e142/qp. Normal file
View File

@@ -0,0 +1,22 @@
!~Filename~:! !QP Printer -*-TECO-*-!
QP
!<Entry>:! !C print QP!
M(M.M Qprint)
!Qprint:! !Print Q-reg PDL!
fs qp ptr [0 -1[1 [2 [3
q0< %1 :\ u2
q1 FS QP Home u3
ft2__3__
Q1 FS QP Slot u3
q3 FP u2
q2 "L Q3 :='
"# Q2 "E FT<Buffer>'
"# Q2-1 "E FT<Q-Vector>'
"# Q2-100 "E Q3 M(M.M&_ Macro_ Get_ Full_ Name) U3
FT[Purstr]__3'
"# FT[String] "3"''''''''
FT
>
]3]2]1]0

28
src/e142/qp._ej Normal file
View File

@@ -0,0 +1,28 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
Y,2:?
`hpxHR>E <Entry>M(M.MQprint)
Qprint~fsqpptr[0-1[1[2[3
q0<%1:\u2
q1FSQPHomeu3
ft2 3 
Q1FSQPSlotu3
q3FPu2
q2"LQ3:='
"#Q2"EFT<Buffer>'
"#Q2-1"EFT<Q-Vector>'
"#Q2-100"EQ3M(M.M& Macro Get Full Name)U3
FT[Purstr] 3'
"#FT[String]"3"''''''''
FT
>
]3]2]1]0~Filename~QP~DOC~ ~Filename~QP Printer -*-TECO-*-
~DOC~ <Entry>C print QP
~DOC~ QprintPrint Q-reg PDL
~DIRECTORY~<Entry>
Qprint
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

24
src/e142/record. Normal file
View File

@@ -0,0 +1,24 @@
!~Filename~:! !appends name to file -*-Teco-*-!
RECORD
!<ENTRY>:! !append the name to <EMACS>Startup.;1!
F[ B Bind [0
 "E ER<EMACS>STARTUP.;1'
"# -1 "E ER<RUBENSTEIN>PAGE-USERS.;1'
"# -2 "E ER<EMACS>DM-USERS.;1'
"# :I*URF Unknown_ RECORD_ filename FS ERR'''
@Y EC
z[1 ZJ
FS Date FS FD Convert
FS MSname :F6 u1
i__1

 "E @:EW<EMACS>STARTUP.;1'
"# -1 "E @:EW<RUBENSTEIN>PAGE-USERS.;1'
"# -2 "E ER<EMACS>DM-USERS.;1'
"# :I*URF Unknown_ RECORD_ filename FS ERR'''
HP
:EF
ET<1>Foo.;0


30
src/e142/record._ej Normal file
View File

@@ -0,0 +1,30 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
E"(07vjq>D <ENTRY>F[BBind[0
"EER<EMACS>STARTUP.;1'
"#-1"EER<RUBENSTEIN>PAGE-USERS.;1'
"#-2"EER<EMACS>DM-USERS.;1'
"#:I*URF Unknown RECORD filenameFSERR'''
@YEC
z[1ZJ
FSDateFSFDConvert
FSMSname:F6u1
i 1

"E@:EW<EMACS>STARTUP.;1'
"#-1"E@:EW<RUBENSTEIN>PAGE-USERS.;1'
"#-2"EER<EMACS>DM-USERS.;1'
"#:I*URF Unknown RECORD filenameFSERR'''
HP
:EF
ET<1>Foo.;0
~Filename~
RECORD~DOC~ ~Filename~%appends name to file -*-Teco-*-
~DOC~ <ENTRY>*append the name to <EMACS>Startup.;1
~DIRECTORY~
<ENTRY>
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

46
src/e142/sa. Normal file
View File

@@ -0,0 +1,46 @@
In the past, I have been involved in several different areas of both Chemistry and
Computer Science. Ideally, I would like to find a topic for research (and,
eventually, a career) which encompasses aspects of both of those interests.
My interest in both chemistry and computer science goes back to high school, where my
chemistry instructor, Dr. George Biehl, sparked not only my initial interest in
chemistry, but also served as my instructor when I enrolled in a lunch-time
minicourse in computer programming. The following year, as my interest increased, I
actually taught the course, with Dr. Biehl serving as my adviser.
For some time, I was undecided as to whether to specialize in chemistry or computer
science; my first technically oriented job was actually in computers: operator and,
later, systems programmer for the Stanford University Medical Experimental center for
Artificial Intelligence in Medicine (SUMEX-AIM). I was primarily responsible for
improving and maintaining the file backup system and other systems and user-support
programming. This job gave me considerable exposure to current research activities,
such as Lederberg's "Dendral" programs for structure enumeration and elucidation and
Wipke's "Strategic Evaluation off Chemical Synthesis (SECS)" program.
My second technical position, which I continue to hold, is that of a member of the
technical staff of the medical/analytical instrumentation division of Hewlett/Packard
laboratories. In this diverse group of scientists and engineers, I have been
carrying out research towards the development of new instrumentation. Specifically,
I have worked with another organic chemist and an optical engineer in a study of the
feasibility of using visible ATR spectroscopy and surface bound indicators in a
device for rapid blood pH determination. My contribution to this project consisted
of the synthesis and characterization of several models for surface bound indicators,
such as N-substituted sulfonamides of phenolsulfonphthaleins. More recently, I have
been working with a physical chemist studying the effect of oxygen on room
temperature phosphorescence, with the idea of using that effect to rapidly measure
atmospheric and/or dissolved (blood) oxygen. I have been preparing dyes which show
phosphorescence while adsorbed to a surface such as silica gel or filter paper for
testing of their usefulness in such a device.
Finally, I am presently engaged in research with Dr. E. E. van Tamelen. Here, I am
continuing work begun by one of his graduate students, developing a total synthesis
of the natural products Triptolide and Stemolide.
At the present time, I have not formulated a detailed plan of study and research. If
ind synthetic organic chemistry very interesting and challenging, but I hope not to
restrict myself to that relatively narrow field. I believe that computers are going
to become increasingly more useful to the chemist; particularly interesting are
Artificial Intelligence applications, such as Dr. Corey's work in computer aided
synthesis. While computer controlled instrumentation is becoming increasingly
commonplace, very few of these systems are actually "smart" about the chemistry which
is being controlled.

Binary file not shown.

626
src/e142/teach-emacs.txt Normal file
View File

@@ -0,0 +1,626 @@
Things to put in:
Lesson 2:
Mode line, searching, point/mark already in. What else?
Lesson 3:
Need Init files, Two window mode, buffers descriptions. What else?
Autosave mode
DOCOND declarations for operating-system dependencies:
{Alternatives:ITS,Tops20,Sumex}
{Flag:?Sumex}
{Flag:?ITS}
{Flag:?Tops20}
{Replace:+ITS=>C-Z->C-C}
{Replace:+ITS=><Esc>-><Alt>}
{Replace:+ITS=><delete>-><Rubout>}
{end}
You are looking at the EMACS tutorial. Comments should be sent to
Rubenstein@Sumex-AIM and McLure@SRI-KL.
EMACS commands are generally prefixed by the CONTROL key or the META
(EDIT on datamedias) key (<ESC> if you don't have META or EDIT on your
keyboard). Rather than write out META or CONTROL each time we want
you to prefix a character, we'll use the following abbreviations:
C-<char> means hold the CONTROL key down and type a character.
M-<char> means hold the META key down while typing a character.
if you don't have a META or EDIT key, then type <ESC>,
release it, then type the character.
Thus, C-F would be hold the control key and type F. You will often
be asked to type characters to see how they work; don't actually do
this, however, until you see >> at the left of the screen. For instance:
<<Blank lines inserted here by startup of TEACH-EMACS>>
>> Now type C-V (View next screen) to move to the next screen.
(go ahead, do it by depressing the control key and V together).
From now on, you'll be expected to do this whenever you finish
reading the screen.
Note that there is an overlap when going from screen to screen; this
provides some continuity when moving through the file.
The first thing that you need to know is how to move around from place
to place in the file. You already know how to move forward a screen,
with C-V. To move backwards a screen, type M-V (depress the META or
EDIT key and type V, <ESC>V if you don't have a META or EDIT key}).
>> Try typing M-V and C-V to move back and forth a few times.
SUMMARY
-------
The following commands are useful for viewing screenfuls:
C-V View next screenful
M-V View previous screenful
C-L 'Refresh' the current screen.
>> Try C-L now. (You'll notice that it centers the screen where
the cursor currently is. If this happens to move this text off the
screen, just do C-V's or M-V's to see it again.) Do a C-L for refresh.
BASIC CURSOR CONTROL
--------------------
Getting from screenful to screenful is useful, but how do you
reposition yourself within a given screen to a specific place?
There are several ways you can do this. One way (not the best, but
the most basic) is to use the commands previous, backward, forward
and next. As you can imagine these commands (which are given to
EMACS as {+Sumex:M-^, M-<, M->, M-<lf>}{-Sumex:C-P, C-B, C-F, and C-N} respectively) move the cursor from
where it currently is to a new place in the given direction. {-Sumex:Here,
in a more graphical form are the commands:
Previous line, C-P
:
:
Backward, C-B .... Current cursor position .... Forward, C-F
:
:
Next line, C-N
You'll probably find it easy to think of these by letter. P for
previous, N for next, B for backward and F for forward. These are
the basic cursor positioning commands and you'll be using them ALL
the time so it would be of great benefit if you learn them now.
}{+Sumex:Note
that these commands are placed in the logical place on the Datamedia
keypad.}
>> Try doing a few {-Sumex:C-N}{+Sumex:M-<lf>}'s to bring the cursor down to this line.
Move into the line with {-Sumex:C-F}{+Sumex:M->}'s and up with {-Sumex:C-P}{+Sumex:M-^}'s. Now use
these four commands to play around a little. Try moving off
the top of this screen and see what happens.
When you go off the top or bottom of the screen, the text beyond
the edge is shifted onto the screen so that your instructions can
be carried out while keeping the cursor on the screen.
A faster way to move around is to move by words or even entire
sentences. Here is a summary of simple cursor moving operations
including the word and sentence moving commands:
{-Sumex:C-F}{+Sumex:M->} Move forward a character
{-Sumex:C-B}{+Sumex:M-<} Move backward a character
M-{-Sumex:F}{+Sumex:)} Move forward a word
M-{-Sumex:B}{+Sumex:(} Move backward a word
{-Sumex:C-N}{+Sumex:M-<lf>} Move to next line
{-Sumex:C-P}{+Sumex:M-^} Move to previous line
{-Sumex:C-A}{+Sumex:M-<esc> M-<} Move to beginning of line
{-Sumex:C-E}{+Sumex:M-<esc> M->} Move to end of line
{-Sumex:M-A}{+Sumex:M-<esc> M-(} Move back to beginning of sentence
{-Sumex:M-E}{+Sumex:M-<esc> M-)} Move forward to end of sentence
M-{-Sumex:<}{+Sumex:{*Brace:}} Go to beginning of file
M-{-Sumex:>}{+Sumex:}} Go to end of file
{+Sumex:
Just as the <esc> key means "Add the EDIT key to the next command,"
typing M-<esc> or <esc><esc> means "Add both the EDIT and the CONTROL
keys to the next command." Generally, if C-A does something, M-A will
do it bigger, and C-M-A will do it even bigger.
}
>> Try all of these commands now a few times for practice.
Since the last two will take you away from this screen,
you can come back here with M-V's and C-V's. These are
the most often used commands.
Like all other commands in EMACS, these commands can be given
arguments which cause them to be executed repeatedly. The way you
give arguments is by prefixing with M-<number> or C-U<number>. For
instance, C-U 12 C-V scrolls forward twelve lines, and M-8
M-{+Sumex:)}{-Sumex:F} moves forward eight words. Use whichever of
these methods is more convenient for you.
>> Try giving a suitable argument to {-Sumex:C-N or C-P}{+Sumex:M-^ or M-Lf} to come as close
as you can to this line in one jump.
The only apparent exception to this is the screen moving commands,
C-V and M-V. When given an argument, they scroll the screen up or
down by that many lines, rather than screenfuls. This proves to be
much more useful.
>> Try typing M-8 C-V now.
Did it scroll the screen up by 8 lines? If you would like to
scroll it down you can give an argument to M-V.
INSERTING AND DELETING
----------------------
If you want to type text, just do it. Characters which you can see,
such as A, 7, *, etc. are taken by EMACS as text and inserted
immediately. You can delete the last character you typed by doing
<Delete>. More generally, <Delete> will delete the character immediately
before the current cursor position.
>> Do this now, type a few characters and then delete them
by typing <Delete> a few times.
Remember that most EMACS commands can be given a repeat count; Note
that this includes characters which insert themselves.
>> Try that now -- type M-8 * and see what happens.
You've now learned the most basic way of typing something in
EMACS and correcting errors. You can delete by words or lines
as well. Here is a summary of the delete operations:
C-D delete the next character after the cursor
<Delete> delete the character just before the cursor
M-D kill the next word after the cursor
M-<Delete> kill the word immediately before the cursor
C-K kill from the cursor position to end of line
Note that C-K kills text ONLY TO THE RIGHT of the cursor; if you put
the cursor in the middle of the line, C-K will delete the right half
of the line. Another C-K will delete the CRLF and join the next line
to the end of the current one.
Now suppose you kill something, and then you decide that you want to
get it back? Well, whenever you kill something bigger than a
character, EMACS saves it for you. To yank it back, use C-Y. Note
that you don't have to be in the same place to do C-Y; This is a
good way to move text around. Also note that the difference between
"Killing" and "Deleting" something is that "Killed" things can be
yanked back, and "Deleted" things cannot.
For instance, type {-Sumex:C-N}{+Sumex:M-Linefeed} a couple of times to
postion the cursor at some line on this screen.{*Refill:}
>> Do this now, move the cursor and kill that line with C-K.
Note that a single C-K will kill the contents of the line, and a
second C-K will delete the line itself, and make all the other lines
move up. If you give C-K a repeat count, it will delete that many
lines AND their contents.
The text that has just disappeared is saved so that you can retrieve
it. To retrieve the last killed text and put it where the cursor
currently is type C-Y.
>> Try it; type C-Y to yank the text back.
Think of C-Y as if you were yanking something back that someone took
away from you. Notice that if you do several C-K's all at once the
text that is killed is all saved for you so that if you want it back
you can yank it back.
>> Do this now, type C-K several times.
Now to retrieve that killed text:
>> Move the cursor down a few lines and type C-Y to retrieve the
lines that you killed. This is how you move text from place
to place. You can even make copies of a line by killing it
and yanking it back as many times as you want. Remember
that when you have just killed text, it stays with you so
that if you move your cursor elsewhere in the text and
then C-Y to yank back the killed text, you will have
a method for moving text around in a file.
EXTENDING THE COMMAND SET
-------------------------
There are many, many more EMACS commands than could possibly be put
on all the control and meta characters. EMACS gets around this with
the X (eXtend) command. This comes in three flavors:
C-X Character eXtend
M-X Named command eXtend
{-Sumex:M-<esc>}{+Sumex:C-M-X} TECO extend
These are commands that are generally useful but used less than the
commands you have already learned about. As an example, one command
that is used infrequently is the command to tell EMACS that you'd
like to stop editing. The command to do this is C-X C-Z.{-ITS: Think of
it as Z for zapping yourself.}
There are many C-X commands. The ones you need immediately are:
C-X C-V Visit file. This is how you read in a file
to edit it. When you type this, EMACS asks
you for a file name to visit. You would respond
with the name of the file. Then EMACS brings it
in for editing. If the file doesn't exist, then
EMACS assumes that you are creating a new file.
C-X C-S Save file. This is a command that tells EMACS
to save the file you are currently looking at
onto disk. It is recommended you give this
ocassionally to prevent losing any work in the
case of a system crash.
C-X C-Z Quit EMACS. This does NOT automatically save your
file. If given any argument, it will save your
file before exiting. Thus, the standard way to
save and exit is C-U C-X C-Z. If you don't like
this, there is a way to have EMACS save your buffer
at frequent intervals and when you exit. This is
called "Auto Save Mode", and is explained below.
Named eXtend commands are commands which are used even less
frequently, or commands which are used only in certain modes. An
example of this type of command is the Replace command. When you type
M-X, EMACS will prompt you at the bottom of the screen with MM (EMACS
calls named eXtend commands MM commands) and then you can type the
name of the command you want to execute, in this case, "Replace
String". Just type "REP<esc>" and EMACS will complete the command.
Then you type the string that you want to replace, an <esc>, the
string you want to replace it with, and a return.
>> Try this now; type M-X rep<esc>try<esc>you can do<return>
See how the previous line changed? All the "try"s were
changed to "you can do"
The last kind of extend command is the TECO extend. If you type
{+Sumex:C-M-X}{-Sumex:M-<esc>}, then you can type TECO commands,
terminated with <esc><esc>. You probably will never have to use this,
but it's there if you do.{*Refill:}
CONCLUSION
----------
This is the end of the first lesson in Teach{-ITS:-}Emacs. You now
know all the commands that you really need to edit a file. To learn
some more about Searching, doing things with arbitrary regions of
text, special context oriented commands relating to paragraphs, pages,
LISP S-expressions or lists, you should run Teach{-ITS:-}Emacs
again and go through the intermediate lesson. For now, you ought to
get some practice editing files.{*Refill:}
In this lesson, you will learn about some of the additional things
that EMACS can help you do. If you need to review what was in the
previous lesson, please do so. This lesson is an intermediate level
description of some more advanced and useful features.
MODE LINE
---------
If EMACS sees that you are typing commands slowly it shows them to you
at the bottom of the screen in an area called the echo lines. This is
just the last few lines at the bottom. The line immediately above
these is called the MODE LINE. You may notice that it begins with
EMACS (Fundamental) ...more stuff... This is a very useful
'information' line. To understand EMACS it is best to consider that
it operates in a variety of modes. The default mode is Fundamental
which is what you are in now. There are modes for editing different
languages and text, such as LISP mode, Text mode, etc. The mode line
serves to show you various things about your current state. For
instance, on the mode line here you'll notice that it says Main.
EMACS operates with things called buffers. This is a place that it
puts your file while you are editing it. There are names for buffers.
The default buffer upon startup of EMACS is Main. You'll notice that
after the Main comes the filename
{-ITS:DSK:<your-directory>TEACH-EMACS.TUTORIAL}{+ITS:your-directory;
machine: TEACH TEXT}. This is the name of your own temporary copy of
the text of the EMACS tutorial; the file you are now visiting.
After the name of the file comes --64%--. This indicates that you are
64% of the way through the file. When you are at the top or the
bottom of the file, EMACS will say --TOP-- or --BOT--, respectively.{*Refill:}
SEARCHING
---------
EMACS can do searches for strings (these are groups of contiguous
characters or words) either forward through the file or backward
through it. To search for the string means that you are trying to
locate it somewhere in the file and have EMACS show you where the
occurences of the string exist. EMACS searches are somewhat different
from what you may be familiar with. The usual search is called
"Incremental Search" -- it is performed as you type in the thing to
search for. The command to inititate an incremental search is C-S for
forward search, and C-R for reverse search. BUT WAIT! Don't do them
now. When you type C-S you'll notice that the mode line changes to
'I-Search' and below it you get 'Search:' This tells you that EMACS is
in incremental search mode, waiting for you to type the thing that you
want to search for.{*Refill:}
>> Now type C-S to start a search. SLOWLY, one letter at a time,
type the word 'cursor', pausing after you type each
character to notice what happens to the cursor.
Did you see what happened? EMACS, in an incremental search, tries
to go to the occurence of the string that you've typed out so far.
To go to the next occurence of 'cursor' just type C-S again. If no
such occurence exists EMACS beeps and tells you that it is a failing
search. To get out of Incremental Search Mode, type any EMACS command
except C-Q, C-R or C-S. C-Q can be used to "quote" control characters
so that you can include them in search strings. C-S and C-R repeat
the search in the specified direction.{*Refill:}
If you are in the middle of an incremental search and type <Delete>,
you'll notice that the last character in the search string is erased
and the search backs up to the previous occurence of that string. For
instance, suppose you currently have typed 'cu' and you see that your
cursor is at the first occurence of 'cu'. If you now type <Delete>,
the 'u' on the search line is erased and you'll be repositioned in the
text to the occurence of 'c' immediately before the first 'cu'. This
provides a useful means for backing up while you are searching.{*Refill:}
The C-S starts a search that looks for any occurence of the search
string AFTER the current cursor position. But what if you want to
search for something earlier in the text? To do this one should type
C-R for Reverse search. Everything that applies to C-S applies to C-R
except that the direction of the search is reversed.{*Refill:}
POINT, MARK and REGION
----------------------
Another useful facility would be the ability to perform editing
operations on arbitrary regions of text within the buffer. In EMACS,
this facility is available in the form of many commands which operate
on "the region" or "between point and mark." "Point" is simply where
the cursor currently is (cf. the assembly language programmer's "."
meaning the current location). The "mark" is another place in the
file that, for some reason, EMACS is remembering. This "mark" can be
set in many ways. The simplest way is for you to give the command
C-@{+Sumex: (That is, <NULL>)}, which places the mark at the current
point. Also, you may have noticed that after terminating an
Incremental Search, EMACS typed out ^@ in the echo region. This
indicates that the mark has been set at the point where you started
searching. This mark is not set (and ^@ is not typed out) if you
didn't move very far in your search.
Suppose you moved the cursor to the beginning of this line and placed
the mark with the above command and then moved the cursor elsewhere in
the file. The area between the mark and the point is called the
"region". This is a very important notion within EMACS. It enables
one to do wonderous manipulations of text within your buffer, often
doing enormous amounts of work within a very small amount of time. We
will discuss this region concept at great length.{*Refill:}
At any time, if you want to reassure yourself of where the mark is
currently placed, you can use the C-X C-X (exchange point and mark)
command. What happens when you give this command is that the point is
relocated to the location of the mark and vice versa. For instance,
if you had the mark at the beginning of the buffer and the point
somewhere in the middle, you could say C-X C-X and your point would go
to the beginning of the buffer and the mark would be placed in the
middle of the file, where you had just come from.{*Refill:}
>> Try this; Move the cursor somewhere on the screen, give the Set
Mark command ({-Sumex:C-@}{+Sumex:<NULL>}), move the cursor somewhere
else on the screen, and then give the command C-X C-X.
The following commands are useful for delimiting, manipulating and
performing other various and sundry actions on the region:
Setting the mark and/or region:
{+Sumex:<NULL>}{-Sumex:C-@} Place the mark where the cursor currently is
C-X C-X Interchange mark and point.
M-@ Set mark after end of next word.
C-< Set mark at beginning of buffer.
C-> Set mark at end of buffer.
M-H Put region around current paragraph.
C-X C-P Put region around current page.
C-X H Put region around entire buffer.
Doing things to the region:
C-W Kill region (can be retrieved with C-Y)
M-W Copy region (Just puts the region where C-Y
can get it later)
TEXT HANDLING COMMANDS
----------------------
There are a number of other commands useful for specialized kinds of
files. Some of the most general commands are those used to handle
text. Some of the commands which you have already learned, such as
the sentence handling commands {+Sumex:M-<esc> M-(}{-Sumex:M-A} and
{+Sumex:M-<esc> M-)}{-Sumex:M-E}, are particularly useful for text. Here
are some others:{*Refill:}
M-U Uppercase word -- converts words to all upper case
M-L Lowercase word
M-C Capitalize word
C-X C-U Uppercase region
C-X C-L Lowercase region
M-[ Backwards paragraph
M-] Forwards paragraph
M-H Mark paragraph
M-Q Fill paragraph
M-G Fill Region. Given a positive argument, the fill
commands will justify too. A negative argument will
cause it to remove extra spaces before filling
(de-justifying).
INIT FILES
----------
Not yet written
MULTIPLE BUFFERS, TWO WINDOW MODE
---------------------------------
Not yet written.
GETTING MORE HELP
-----------------
In this tutorial we have tried to supply just enough information to
get you started using EMACS. There is so much available in EMACS that
it would be impossible to explain it all here. However, you may want
to learn more about EMACS since it has numerous desirable features
that you don't know about yet. EMACS has a great deal of internal
documentation. All of these commands can be accessed through the HELP
character. If there is no key labelled "HELP" on your keyboard, you
can type the <HELP> character as {+ITS:C-_ H (two
keystrokes)}{+Sumex:^H}{+Tops20:^_}. To use the HELP features, type
the <HELP> character, and then a character saying what kind of help
you want. If you are REALLY lost, type <HELP> ? and EMACS will tell
you what kinds of help it can give. The options which are most useful
are the following:{*Refill:}
<HELP> C Character describe. You type in the character.
Multi-character commands such as C-X C-Z
and (if you have no META or EDIT key) <ESC>V
are also allowed.
<HELP> D Describe a named command. You type in a command.
<HELP> A Apropos. Type in a keyword and EMACS will
list all the commands containing that keyword.
More than one keyword can be specified,
seperated by C-O
<HELP> I Run the INFO program. INFO contains the
complete documentation for EMACS, in
great detail. Here is where you can find out
about, for instance, special commands for editing
LISP code, handling buffers, replacing text, filling
and justifying text, etc.
>> Go ahead and try some of these. Type <HELP> C C-K. EMACS will tell
you what that character does. Try typing <HELP> A WORD to find
out all the commands that have to do with words. When EMACS
prompts you with --MORE--, type a space to see more or a C-L
to get your text back. INFO is a fairly sophisticated
documentation finder and is somewhat complicated. It probably
isn't a good idea to try to use INFO just yet. Use EMACS for
a few days, gain some familiarity and confidence in giving
commands. And then try INFO out.
TV users guide to EMACS
-----------------------
This is meant as a tutorial to introduce the veteran TV user to EMACS,
an editor written at MIT. It has many advantages over TV in terms of
capabilities and flexibility; some of these will be detailed below. It
also has a few drawbacks, but I think you'll find that the advantages to
be gained are worth it.
In order to get TVUSER EMACS loaded automatically when you start up EMACS
(it's loaded right now, by the way, so this will get you the same EMACS you
are running now), I have copied the file <EMACS>TVUSER.INIT into your
directory as <your-directory>EMACS.INIT. When EMACS starts up, it will read
in and execute the TECO commands in this file, which will load the TVUSER
library. The TVUSER library contains many things suggested by and for TV
users who are trying to switch over to EMACS. Many of the commands are
exactly the same in TVUSER EMACS as in TV. If in doubt (at least when reading
this file), try it. You'll learn later how to check what a character does.
>> Go ahead and do [W] to move to the next window.
You'll be expected to do [W] when necessary to window forward...
The notation used in this document will be pretty much a hodge-podge --
You are certainly familiar with the [X] notation for characters typed
with the EDIT key held down, and with the ^X notation for control
characters. In EMACS, there is a distinction between control characters
(ascii codes 0-37, 177) and characters with the Control modifier bit
(exactly like the EDIT bit). This means, for instance, that the
character Control-> is possible in EMACS, althugh it has no ascii
representation. At MIT, where EMACS was written, and at SU-AI, the
keyboards have two "EDIT" keys, called Control and Meta. These were
BOTH true modifier bits, so you could meaningfully talk about Control->.
For Tenex and Tops-20 sites, the Meta key is exactly the same as the
EDIT key on Datamedias, and every effort is made to insure that ^X will
have the same effect as C-X. In EMACS, you will often see the notation
C-X to mean ^X and M-X to mean [X]. Usually a direct translation will
be sufficient, but if you hold down the control key and type ">", for
instance, you will get a Control-uparrow, because Datamedias can only
generate ASCII codes plus the EDIT bit, and C-> is not an ASCII
character. In any case, M-X may be typed by holding down the edit key
and typing "X", or by typing <ESC> or <ALTMODE> and then typing "X". ^X
may be typed by either holding down the control key and typing "X" or
typing ^^ (that's control-uparrow) and then typing "X". There is even
Control-Meta-X, which you type by holding down BOTH the control and edit
keys while typing "X", or typing M-$ (that is, hold down the edit key
and type <ESC> or <ALTMODE>) and then typing "X", or by typing <ESC>
twice and then typing X. In summary (if you're still with us):
Character How to type it
--------- --------------
C-X, ^X Hold down the control key while typing "X"
or Type C-^ (the bottom unlabeled key on DM'S) and then "X"
M-X, [X] Hold down the "edit" key while typing "X"
or Type <ESC>or <ALTMODE> and then type "X"
C-M-X, [^X] Hold down both the EDIT and CONTROL keys while typing "X"
or Hold down the EDIT key and type <ESC> X (that is [$X] OR [$]X)
or Type <ESC> twice and then type "X" (That is, $$X)
Advantages of EMACS: a quick rundown.
-------------------------------------
EMACS permits handling of numerous files at once. Also permits you to
view two files at once on the same screen for comparison purposes, or to
move text between them. EMACS has commands for justifying and filling
text, and automatically breaking long lines on typein ("autofill" mode).
EMACS has good self-documentation. You can find out what any given
command does while in EMACS, or ask for a command that does a certain
thing given a keyword.
It is possible to put any EMACS function on any character. It is this
ability that permits the TV library described below, and you can further
change even these settings to suit your own preferences. If you know
TECO (which, unfortunately, tends to be incomprehensible to all but MIT
hackers), you can extend the command set almost arbitrarily.
EMACS processes input and screen updating asynchronously, hence often is
much better about not writing more than it needs to; TVEDIT makes you
wait for display to be completed before obeying the next command. E.g.
if you type two window commands in quick succession in TV, it will
completely display the first before moving on to the second. In EMACS,
as soon as it has processed the second command it knows you want to see
a different window, and it will stop writing the first one and go right
on to the second.
EMACS has commands for string substitution.
Disadvantages of EMACS, or things TVEDIT does better:
----------------------------------------------------
EMACS does not remember which file you edited last, or where you were
in the file (though you can continue after quitting out of emacs and
your file will still be there; this only applies to starting up EMACS
afresh).
EMACS does not view pages very specially. Due to some fundamental
limitation, it can't tell you what page it is on, though it can find
pages (i.e. there is a "go to next page" command). It does not maintain
a directory like TVEDIT does, so locating an arbitrary page in the file
may take longer (I have no data on this; emacs seems as fast as TV in
most operations). However, there is a library of commands to treat
pages in a manner similar to SU-AI's E editor, called the PAGE library.
While EMACS is smart about your typeahead, it often updates the screen
after changes less than perfectly optimally. This is usually not a
problem, but can be annoying at times.
EMACS so far has no good commands for refreshing portions of the screen
if your display gets trashed by line noise or system messages.
Differences that you need to know about between TV and TVUSER EMACS
-------------------------------------------------------------------

184
src/e142/teco.files Normal file
View File

@@ -0,0 +1,184 @@
This is a list of all the files composing EMACS as distributed,
what they do, where they belong on a Twenex system,
and where they are copied from on the MIT-AI machine.
-- FOR EMACS --
Files on SYS:
TECO.EXE ;Runnable bare ITS TECO
;(optional; need not be kept around at all).
EMACS.EXE ;The runnable EMACS
XINFO.EXE ;A stand-alone INFO program
TAGS.EXE ;The runnable TAGS program
Files on <EMACS>
Those without homes on AI.
INFO..TECO. ;TECO init file used in building stand-alone INFO
TECPUR.EXE ;The shared portions of TECO
TAGS.FAI ;The source for the Twenex TAGS program
EMACS.CHART ;EMACS "wall chart" command list
EMACS.DOC ;Complete printout of EMACS self-documentation
;EMACS.CHART and EMACS.DOC are not the same
;on Twenex as on ITS. They should be generated
;afresh on Twenex (using ABSTR), not copied.
Those with homes on AI:.TECO.;
TECO.FILES ;This file.
TECO.nnn ;TECO source
TECO.ARCHIV ;TECO changes (documentation)
TWENEX.DIFS ;Differences between EMACS on ITS and EMACS on Twenex
TWENEX.INSTALL ;Instructions for installing EMACS on Twenex.
EMACS.CTL ;Batch file for assembling TECO and building EMACS.
Those with homes on AI:EMACS;
EMACS.INIT ;Default EMACS init file. Home on AI is TWENEX.INIT.
ABSTR.:EJ ;Macros for generating EMACS.CHART and EMACS.DOC
BASIC.EMACS ;Help B prints this file.
CONV ;INFO documentation on EMACS internals.
DIRED.:EJ ;Directory editor. No home on AI.
;The home is on <EMACS> on the pumpkin.
DOCOND.:EJ ;Document conditionalizer and macro processor.
EINIT.:EJ ;Library of commands used for building EMACS.
EPATCH ;File of patches to be loaded in when building EMACS.
GRIND.:EJ ;Commands for grinding Lisp and Macsyma code.
INFO.:EJ ;the TECO code for INFO.
INFO.EMACS ;EMACS change announcements in chronological order.
INFO.OEMACS ;More change announcements.
IVORY.:EJ ;An alternate purifier used for WORDAB, PL1LIB, TMACS.
LUNAR.:EJ ;Some macros that might be useful.
MAZLIB.:EJ ;Commands for solving mazes.
MQREPL.:EJ ;Commands to perform several Query Replaces over several files.
PICTUR.:EJ ;Commands for editing pictures made out of characters.
PL1LIB.:EJ ;Commands for editing PL/1
PURIFY.:EJ ;Commands for building :EJ files from sources.
TAGS.:EJ ;Commands for finding labels fast using tag tables.
TDEBUG.:EJ ;Commands for debugging new EMACS macros.
TEMACS.:EJ ;Miscelaneous commands.
TMACS.:EJ ;Miscelaneous commands.
TWENEX.:EJ ;Commands only for Twenex.
VARG.:EJ ;Makes the arrow keys and numeric keypad work on VT52's.
WORDAB.:EJ ;Implements Word Abbreviation Mode.
[PURE] ;The fundamental EMACS macro library.
Those with homes on AI:EMACS1;
Unless otherwise noted, these are sources for the
similarly named :EJ files, or, if no :EJ file is
mentioned above, part of the source of EMACS.:EJ.
ABSTR
BASIC-EMACS.TXT ;DOCOND source from which BASIC.EMACS is made.
;Home on AI is EMACS1;BASIC EMACS
BUFFER
CCL ;Part of the source for PURIFY.:EJ
CRL
DIRED ;No home on AI. Home is on <EMACS> on pumpkin.
DOC
DOCOND
EINIT
FILES
INDENT
INFO
ISEARC
MQREPL
PICTUR
PURIFY
SEARCH
SUPPRT
TAGS
TWENEX
USRCOM
VARS
WINDOW
WRDLST
^RBASE
Other random sources that belong on <EMACS>
TDEBUG ;Home on MC:EMACS;
GRIND ;Home on MC:EMACS;
LUNAR ;Home on MC:MOON;. Note that the Twiddle
;macros are exact, superfluous duplicates
;of the Exchange macros built into EMACS.
WORDAB ;Home on MC:ECC;. Must be purified with IVORY.
PL1LIB ;Home on MC:ECC;. Must be purified with IVORY.
TMACS ;Home on MC:ECC;. Must be purified with IVORY.
VARG ;Home on MC:BAK;
Even more random:
sample init files, to give you an idea of how it's done.
MMCM.INIT ;MMCM's EMACS.INIT file, as a sample.
;Home is AI:MMCM;.EMACS (INIT).
RMS.INIT ;RMS's EMACS.INIT file.
;Home is AI:RMS;.EMACS (INIT).
HENRY.INIT ;HENRY's EMACS.INIT library.
;Home is AI:HENRY;.EMACS (INIT).
HENRY. ;Source for HENRY's library.
;Home is AI:HENRY;.EMACS >
Also, MOON's init file is essentially LUNAR.:EJ.
-- The INFO hierarchy --
Unless otherwise noted, each file documents the
program or :EJ library of the same name.
ATSIGN ;Info on the ATSIGN program (v.i.)
DIR ;INFO Directory. Do NOT copy this from ITS!
DOCOND
EMACS
INFO
MIDAS
MIDAS.ARCHIV ;Chronological MIDAS change announcements.
PL1LIB
TAGS
TDEBUG
TECORD ;Info on TECO. Not really part of the INFO
;hierarchy, but on <INFO> for MM Tecdoc to find.
TMACS
WORDAB
-- FOR MIDAS --
MIDAS is the assembler used to assemble TECO, @, and MIDAS.
These files can live wherever it is convenient for you.
MIDAS ;Source of MIDAS. Home on AI:MIDAS;.
TSRTNS ;More of source of MIDAS. Home on AI:MIDAS;.
XJSYS ;Convenient interface to JSYS's (no fixed ACs).
MIDAS.REL ;REL file for MIDAS.
MIDAS.EXE ;Executable MIDAS.
These have their homes on AI:SYS;.
They should be somewhere on SYS: when
assembling TECO (or MIDAS, etc.)
ITSDFS.MID ;Definitions of ITS system calls.
ITSBTS.MID ;Definitions of arguments to ITS system calls.
DECDFS.MID ;Similar definitions for Bottoms-10.
DECBTS.MID
TWXDFS.MID ;Similar definitions for Twenex.
TWXBTS.MID ;This is the only one needed for TECO itself
-- FOR @ --
@ is a program used for making multiple-file
cross-reference listings. Use @ when you would
expect to make an assembly listing.
These files can live wherever is convenient for you.
ATSIGN.MID ;Source of @. Home is AI:QUUX;@ >
ATSIGN.EXE ;Runnable @ program.
-- FOR FUN --
EMACS.LETTER ;Letter to sites receiving EMACS. Home is on AI:.TECO.;
JARGON.TXT ;MIT-Stanford glossary of jargon. Home is AI:GLS;JARGON >

69
src/e142/teco.init Normal file
View File

@@ -0,0 +1,69 @@
!* -*-TECO-*- *!
!* This is the TECO INIT for EMACS. It sets up the EMACS environment
necessary for dumping a new EMACS EJ file. *!
ft entering teco.init 
-1fs^Idisablew !* do this first for comments!
:ejDSK:EMACS;EMACS :EJu0 !* load in the EMACS library!
er ec fs i fileu1 fs if versionu2 !* save filename and version of!
1u4 !* EMACS library!
fs osteco"n !* Twenex!
:ejDSK:<EMACS>TWENEX.:EJw !* load in the TWENEX library!
er ec fs i fileu3 !* save filename of TWENEX library!
'
:i*& Macro Get,q0m(q0+4)u.m !* call the loader in the EMACS library!
!* to find .M!
f[ :ej page !* save :EJ page for flushing EINIT!
:ejDSK:EMACS;EINIT :EJw !* load EINIT library!
2u4
m(m.m& Load Essential Environment)
3u4
q1m.vEMACS Library Filename !* save EMACS library filename!
q2m.vEMACS Versionw !* version no. too!
fs osteco"n !* Twenex!
q3m.vTWENEX Library Filenamew' !* save TWENEX library filename!
4u4
m(m.m& Load Patches) !* Load fixes written since [PURE] was made!
5u4
m.vMM ^R Exit to EXEC
m(m.m& Load Default Environment)
6u4
m(m.mPurify Variables) !* smash variable names to point to pure!
!* space if there is a copy there!
f] :ej page !* flush EINIT!
7u4
!* Now create a Startup to be called from the ..L!
fsosteco"e @:i*| !* ITS!
etDSK:EMACS !* set device name and FN2!
fs hsname fs dsnamew !* fill in directory!
fs xuname fs dfn1w !* and FN1!
1:<er>"l
1:<er*>"l
erEMACS;*''
fs d file[2 et@ >
!** end of system-dependent code!
fs msname fs dsname
qEMACS Version:\u1 !* sigh, still need this!
@y 1a-127"n ]2 :m(.,zfx*)' !* if init doesnt begin with rubout then!
!* execute it as TECO commands!
hk 1,m(m.mLoad Library)2 !* else load it as a library,!
!* saving the filename!
]2 :m..l
|m.vMM & Startup EMACS'
"# @:i*| !* Twenex!
etDSK:EMACS.INIT fs hsname fs dsname
1:<er>"l erDSK:<EMACS>'
fs d file[2 et foo..
!** end of system-dependent code!
fs msname fs dsname
qEMACS Version:\u1 !* sigh, still need this!
@y 1a-127"n ]2 :m(.,zfx*)' !* if init doesnt begin with rubout then!
!* execute it as TECO commands!
hk 1,m(m.mLoad Library)2 !* else load it as a library!
!* saving the filename!
]2 :m..l
|m.vMM & Startup EMACS'
0u4
0u0 0u1 0u2 0u3 !* zero the q-regs we've used!
hk

21685
src/e142/teco.mid Normal file

File diff suppressed because it is too large Load Diff

21705
src/e142/teco.mid.783 Normal file

File diff suppressed because it is too large Load Diff

23050
src/e142/teco.mid.886 Normal file

File diff suppressed because it is too large Load Diff

BIN
src/e142/teco.symbols Normal file

Binary file not shown.

BIN
src/e142/teco.symbols.783 Normal file

Binary file not shown.

BIN
src/e142/teco.symbols.784 Normal file

Binary file not shown.

View File

@@ -0,0 +1,54 @@
DIFFERENCES BETWEEN ITS TECO AND TWENEX TECO, VERSION 589
EG does not insert a 3-digit number with leap year information,
but rather a blank line.
EO (set dumped on tape bit) does not exist.
EQ (create link) does not exist.
<n>ER is the same as ER.
EX<file>$
if a file is open for output, does EE<file>$, then instructs the EXEC
to repeat the last CCL type command (load, execute, compile, debug).
FS CCL FNAME$
a string, in the same format as FS D FILE$, of the jfn given in AC1 if
TECO was started at the CCL entry point; or zero if it was not or the
filename has already been read.
FS D VERSION$
-1 has its usual meaning, since all versions are numeric.
FS FDCONVERT$
when given two args, will use the first as the ODTIM format. When given
no arg, will do an IDTIM from the buffer, and can thus parse formats
other than those created by FS FDCONV$ with an arg.
FS HELP MAC$
there is no way to input a HELP on 20X.
FS OS TECO$
returns the operating system TECO is running on, 0 for ITS, 1 for 20X.
FS UPTIME$
returns its value in milliseconds, rather than 30ths of seconds.
SIXBIT quantities.
commands which return a SIXBIT word as a value, actually return string
pointers on twenex. The F6 commands do not convert strings to sixbit,
but just pass strings through, so that the difference can be made trans-
parent by using them after any command that returns a SIXBIT quantity.
filenames.
TECO attempts to convert as much as possible ITS style filenames to
20X style, including quoting special characters, to allow many more
macros to work without conversion.

67
src/e142/tvedit. Normal file
View File

@@ -0,0 +1,67 @@
!* -*-TECO-*- !
!~Filename~:! !Commands for somewhat TVEDIT like EMACS environment.!
EMACS
!& Setup EMACS Library:! !S Set up for TVEDIT environment.!
0fo..q TVEDIT_setup_hook[0
fq0"g m0 ' !* Run users macro if any.!
m.m^R_Exchange_Characters u.T
m.m^R_Down_Real_Line u..J
16.fs ^R init u..M
m.m^R_Up_Real_Line u..^
m.m^R_Forward_Word u..)
m.m^R_Backward_Word u..(
m.m^R_TVEDIT_Next_page u..N
m.m^R_TVEDIT_Previous_page u..P
2fs ^R init u..<
6fs  init u..>
q..>, 440.fs ^R c macro
q..<, 577.fs ^R c macro
m.m^R_Goto_Beginning u..{
m.m^R_Goto_End u..}
m.m^R_End_of_Real_Line u..]
m.m^R_Beginning_of_Real_Line u..[
4fs ^R init u..K
m.m^R_TVEDIT_Return_to_superior u:.X()
q.Z u:.X()
er<emacs>emacs.init @y :m(hfx*)
!^R TVEDIT Next Page:! !^R Move to the next page in the buffer.!
1m(m.m^R_Set_Bounds_Page)
0,fs z fs bound

!^R TVEDIT Previous Page:! !^R Move to the previous page in the buffer.!
-1m(m.m^R_Set_Bounds_Page)
0,fs z fs bound

!& Read Filename:! !S Read a filename from the tty.
A non-zero argument means file will be use for output
(for version number defaulting). The prompt should be
supplied as a string argument, without trailing colon or
space. Returns a string of the filename read.!
:I*[1 !* Read prompt argument.!
ET:<>FOO..0 ET !* Clear all defaults.!
FN FS RGETTY"N !* Set up for when done (in case ^G).!
0FO..QFlush_Prompts"N !* Maybe erase what just happened.!
FS ECHO DIS
CFS ECHO DIS ''
"# FS ECHO LINES-1"N !* Else at least a crlf.!
^ FT !* Provided it wont erase it.!
'' 
FS LISTEN"E !* Prompt unless user's starting typing.!
FS RGETTY"N
FS ECHO DIS CFS ECHO DIS' !* Clear echo area.!
^ FT 1:_' !* Give prompt.!
"N 400000.+' 60000. :ET !* Get filename from tty.!
FS D FILE !* And return a string of it.!

41
src/e142/tvedit._ej Normal file
View File

@@ -0,0 +1,41 @@
(W
[0+8+FQ(+4)[1
0FO10F"G+Q1
'W+FQ()+4U1
FQ1"L0'
,Q1:M(Q1+4(]1]0))
@I9E]kkrZfy/GZ3='."(& Setup TVEDIT`0fo..qTVEDIT setup hook[0
fq0"gm0'
m.m^R Down Real Lineu..J
m.m^R Up Real Lineu..^
m.m^R Forward Wordu..)
m.m^R Backward Wordu..(
m.m^R TVEDIT Next pageu..N
m.m^R TVEDIT Previous pageu..P
2fs^Rinitu..<
6fsinitu..>
q..>,440.fs^Rcmacro
q..<,577.fs^Rcmacro
m.m^R Goto Beginningu..{
m.m^R Goto Endu..}
m.m^R End of Real Lineu..]
m.m^R Beginning of Real Lineu..[
4fs^Rinitu..K
m.m^R TVEDIT Return to superioru.Z
q.Zu:.X()
0^R TVEDIT Next Page11m(m.m^R Set Bounds Page)
0,fszfsbound
^R TVEDIT Previous Page2-1m(m.m^R Set Bounds Page)
0,fszfsbound
 ^R TVEDIT Return to Superior'f+
fm(m.m^R Return to Superior)~Filename~
TVEDIT~DOC~ ~Filename~:Commands for somewhat TVEDIT like EMACS environment.
~DOC~ & Setup TVEDIT&S Set up for TVEDIT environment.
~DOC~ ^R TVEDIT Next Page-^R Move to the next page in the buffer.
!~DOC~ ^R TVEDIT Previous Page1^R Move to the previous page in the buffer.
&~DOC~ ^R TVEDIT Return to Superior!^R Clears the screen first.
~DIRECTORY~`& Setup TVEDIT
^R TVEDIT Next Page
^R TVEDIT Previous Page
^R TVEDIT Return to Superior
 ~INVERT~[1<Q1-1U1Q1FP;>Q1

216
src/e142/tvlib.chart Normal file
View File

@@ -0,0 +1,216 @@
EMACS ^R-Command Chart (as of 03/10/79 11:05:44):
Non-Control Non-Meta Characters:
Backspace moves back one character (or several).
Tab ^R Tab to Tab Stop
Linefeed ^R Indent New Line
Return ^R CRLF
Altmode ^R Prefix Meta
Rubout deletes characters backwards.
Control Characters:
 .. ^R Complement SAIL Mode
Backspace moves back one character (or several).
Tab ^R Tab to Tab Stop
Linefeed ^R Indent New Line
Return ^R CRLF
Altmode exits from ^R mode.
Space ^R Set/Pop Mark
% .. ^R Replace String
- .. is part of the next command's argument.
0 thru 9 is part of the next command's argument.
; .. ^R Indent for Comment
< .. ^R Mark Beginning
= .. ^R Where Am I
> .. ^R Mark End
@ .. ^R Set/Pop Mark
A .. ^R Backward Sentence
B .. moves back one character (or several).
C .. ^R Prefix Control-Meta
D .. ^R Backward Kill Word
E .. ^R Forward Sentence
F .. moves forward one character (or several).
G .. quits execution of any command.
H .. moves back one character (or several).
I .. ^R Tab to Tab Stop
J .. ^R Indent New Line
K .. ^R Kill Line
L .. ^R Next Screen
M .. is bare TECO's Control-M
N .. ^R Down Comment Line
O .. inserts one CRLF (or several) after point.
P .. ^R Up Real Line
Q .. ^R Quoted Insert
R .. ^R Reverse Search
S .. ^R Incremental Search
U .. ^R Universal Argument
V .. ^R Quote Control Char
W .. ^R Backward Kill Word
X .. is a prefix character. See below.
Y .. ^R Un-kill
Z .. ^R Prefix Control-Meta
\ .. ^R Half Window Up
] .. ^R Half Window Down
^ .. ^R Prefix Control
Rubout deletes backwards, turning tabs into spaces.
Meta Characters:
Tab ^R End of Real Line
Linefeed ^R Down Real Line
Return moves to the beginning of the next line.
Altmode ^R Prefix Control-Meta
Space moves forward one character (or several).
# .. ^R Change Font Word
% .. ^R Query Replace
' .. ^R Upcase Digit
( .. ^R Backward Word
) .. ^R Forward Word
, .. ^R Kill Region
- .. is part of the next command's argument.
. .. ^R Copy Region
/ .. ^R Describe
0 thru 9 is part of the next command's argument.
; .. ^R Indent for Comment
< .. moves back one character (or several).
= .. ^R Where Am I
> .. moves forward one character (or several).
? .. ^R Describe
@ .. ^R Mark Word
A .. ^R Repeat Skip/Zap
B .. ^R Reverse Skip
C .. ^R Uppercase Initial
D .. ^R Kill Word
E .. ^R Forward Sentence
F .. ^R Forward Word
G .. ^R Nth Page
H .. ^R Mark Paragraph
J .. ^R Indent New Comment Line
K .. deletes one character (or several) forward.
L .. ^R Lowercase Word
M .. ^R Mark Paragraph
N .. ^R Refresh Line
P .. ^R Nth Page
Q .. ^R Fill Paragraph
R .. ^R Move to Screen Edge
S .. ^R Skip to Character
T .. ^R Exchange Words
U .. ^R Uppercase Word
V .. ^R Previous Screen
W .. ^R Next Window
X .. ^R Execute Completed MM Command
Y .. ^R Un-kill Pop
Z .. ^R Zap to Character
[ .. ^R Backward Paragraph
\ .. ^R Delete Horizontal Space
] .. ^R Forward Paragraph
^ .. ^R Up Real Line
_ .. ^R Indent Rigidly
{ .. ^R Goto Beginning
} .. ^R Goto End
Rubout moves back one character (or several).
Control-Meta Characters:
Backspace ^R Mark Defun
Tab ^R Indent for LISP
Linefeed ^R Down Real Line
Return ^R Back to Indentation
( .. ^R Beginning of Real Line
) .. ^R End of Real Line
- .. is part of the next command's argument.
0 thru 9 is part of the next command's argument.
; .. ^R Kill Comment
< .. ^R Beginning of Real Line
= .. ^R Indicate Page/line
> .. ^R End of Real Line
? .. ^R Documentation
@ .. ^R Set/Pop Mark
A .. ^R Backward Kill Sentence
B .. ^R Backward Sexp
C .. exits from ^R mode.
D .. ^R Kill Sentence
E .. ^R End of DEFUN
F .. ^R TV Return to Superior
G .. ^R Format Code
H .. ^R Mark Defun
I .. ^R Indent for LISP
J .. ^R Down Real Line
K .. ^R Kill Line
L .. ^R Beginning of Real Line
M .. ^R Mark Sentence
N .. ^R New Window
O .. ^R Split Line
P .. ^R Backward List
Q .. ^R Fill Region
R .. ^R Reposition Window
S .. ^R Center Line
T .. ^R Exchange Sexps
U .. ^R Backward Up List
V .. ^R Scroll Other Window
W .. ^R Scroll Other Window
X .. ^R Execute Minibuffer
Y .. ^R Append Next Kill
Z .. exits from ^R mode.
[ .. ^R Beginning of DEFUN
\ .. ^R Bottom of Screen
] .. ^R End of DEFUN
^ .. ^R Top of Screen
Rubout ^R Backward Kill Sexp
Control-X is an escape prefix command with these subcommands:
^X ^B List Buffers
^X ^C ^R Return to Superior
^X ^D ^R Directory Display
^X ^E ^R Edit File
^X ^F ^R Find File
^X Tab ^R Toggle Overwrite Mode
^X ^L ^R Lowercase Region
^X ^N ^R Set Goal Column
^X ^O ^R Delete Blank Lines
^X ^P ^R Mark Page
^X ^Q ^R Do Not Write File
^X ^R ^R Read File
^X ^S ^R Save File
^X ^T ^R Mini Visited File
^X ^U ^R Uppercase Region
^X ^V ^R Visit File
^X ^W Write File
^X ^X ^R Exchange Point and Mark
^X ^Z ^R TV Return to Superior
^X Altmode ^R Re-execute Minibuffer
^X # ^R Change Font Region
^X ( ^R Define Keyboard Macro
^X . ^R Set Fill Prefix
^X 1 ^R One Window
^X 2 ^R Two Windows
^X 3 ^R View Two Windows
^X 4 ^R Modified Two Windows
^X : ^R Set Column
^X ; ^R Set Comment Column
^X = ^R Where Am I
^X A ^R Append to Buffer
^X B Select Buffer
^X D ^R Dired
^X F ^R Set Fill Column
^X G ^R Get Q-reg
^X H ^R Mark Whole Buffer
^X I ^R Toggle Overwrite Mode
^X K Kill Buffer
^X L ^R Count Lines Page
^X M Mail
^X N ^R Set Bounds Region
^X O ^R Other Window
^X P ^R Set Bounds Page
^X R ^R RMAIL
^X W ^R Set Bounds Full
^X X ^R Put Q-reg
^X [ ^R Previous Page
^X ] ^R Next Page
^X ^ ^R Grow Window
^X _ ^R Underline Region
^X { ^R Mark Beginning
^X } ^R Mark End
^X ~ ^R Not Modified
^X Rubout ^R Backward Kill Sentence

65
src/e142/twenex.instal Normal file
View File

@@ -0,0 +1,65 @@
@. Note: The file TECO.FILES describes all of the files and what
they are used for.
A. TECO
The TECO that supports EMACS is written in MIDAS, a dialect
of assembly language; assembling will require the MIDAS
assembler, MIDAS.EXE, and the JSYS bit definitions,
TWXBTS.MID, in addition to the source file, TECO.nnn.
[Note: since the MIDAS assembler doesn't understand TWENEX
version numbers, the version number of the source of TECO
must be contained in the file's extension. It must be there,
in order for TECO dump files to appropriately point to one
another.]
1. <EMACS> vs EMACS: and <INFO> vs INFO:
If the system configuration does not include an <EMACS>
directory, and one cannot be easily setup, it is possible to
have TECO translate references to this directory to the
correspondingly named device, which can then point to any
directory. If the assembly switch EMCSDV is set non-zero,
this translation is enabled; the batch control file,
EMACS.CTL has the correct provisions for setting this
switch. Likewise INFODV will cause tranlation of the INFO
directory.
If your system has more than one structure, then you should
also setup system logical names for EMACS: and INFO:, in order
that files will be found that are on PS:, even when you are
connected to another structure, and turn on these switches.
2. Terminal types
TECO has display support for various common terminal types,
which are conditionally assembled and assigned to GTTYP
indices. On pass 1, the assembler will type a prompt for
each known terminal type and expect either the GTTYP index
for that terminal type (which can be the corresponding JSYS
mnemonic), or just a CR to assemble out that terminal type
altogether. The batch control file shows assembly for DEC
VT52s and VT05s, and blank lines for other types, and should
be appropriately modified to correspond to the system
configuration.
3. Files produced
After the assembly, starting the resultant program at
symbolic location PURIFY will generate two binary files,
TECO.EXE.nnn, and TECPUR.EXE.nnn, the former is a stand
alone version of the TECO, and need not be kept around
after EMACS.EXE and INFO.EXE have been made, and
the latter the binary file that EMACS will load when started
up.
B. EMACS
The NEMACS.EXE produced by the DUMP macro (see batch control
file) should be installed as SYS:EMACS.EXE, perhaps after
verifying that it basically runs. Other EMACS binary files
live in either <EMACS> or EMACS: depending on the
configuration (vide supra).
C. INFO
In addition to EMACS' self documenting features, the INFO
library provides a means of perusing the EMACS documentation
(or any documentation suitably formatted for that matter).
Most files are of the form <INFO>SUBJECT.., but see above
about INFO:. <INFO>TECORD.nnn is the complete documentation
of the TECO itself that supports EMACS.


BIN
src/e142/varg._ej Normal file

Binary file not shown.

1055
src/e142/wordab. Normal file

File diff suppressed because it is too large Load Diff

BIN
src/e142/wordab._ej Normal file

Binary file not shown.

820
src/e142/wordab._ej.547 Normal file
View File

@@ -0,0 +1,820 @@
pW[0 +8+fq(+4)[1
0fo10 f"g +q1 '
+fq()+4u1
fq1"l 0'
,q1:m(q1+4(]1 ]0))]T^8H  mw3(32:c:u::n{ t ~5?-=)
))6)B)b)r!n!}1~2
22)/:/H11GR&y'%0&&alu$7+3m3z(](h8!8-(#(x 5=5J#6p2N2\u!DRN`Te$g$v"I"W . :!/!>ijV)V6KKA[AdA8ADdd i.iCh/hB;o;YY*OON\NkA A^F^U_#_2``Z4ZFb4bEbVbh`saazb G%G3\\ GjGx[k[{GGGUII==*MM)dBdR]|^
ff C'C<C4C<KcKyee%?
? @'@<b}c>@>OTaTsRqSPmQO+O@[$[6Z_ZpB1BAYRYd;D;N;8;?nOnU& Setup WORDAB LibraryQ[1[2
6*5fsQVectoru.e
m.m& WRDAB Mode or Global Expandu:.e(0)
m.m& Expandu:.e(1)
0u:.e(2)
0u:.e(3)
0u:.e(4)
0u:.e(5)
1,m.m& Setup Compressed WORDAB Librariesu1
q1"n fm1'
0fo..qWORDAB SETUP HOOKu1
q1"n m1'
m.m& WRDAB Set Mode Line Hooku1
0fo..qSet Mode Line Hooku2
q2"e q1'"# :i*21'm.vSet Mode Line Hookw
&Old Word Abbrev Character Describe}[0[1
1,(:i*Type word abbrev key to describe: )m.i
@fiu0
q0fs^RCMacro-(m.m^R Abbrev Expand And Call Old Char)"n
q0m(m.m& Charprint)
ft does not run ^R Abbrev Expand And Call Old Char. It runs
 q0fs^RCMacro :m(m.mDescribe)'
8[..e q0:\u1 ]..e
qMM # WRDAB Old 1u1
ftAfter possibly expanding,  q0m(m.m& Charprint) ft runs 
q1:m(m.mDescribe) ^R Abbrev Expand OnlyB!^R Abbrev Expand !
.(
0,0a"c m:.e(0)'
)-."e ff"g fg'' 1&^R Abbrev Expand And Call Old Charu!^R Abbrev Expand !
ff"E
0,0a"c m:.e(0)''
[.1 8[..e q..0fs^RIndirect:\u.1 ]..e
f @:mMM # WRDAB Old .1$^R Abbrev Expand And Self-InsertU!^R Abbrev Expand !
ff"e 0,0a"c m:.e(0)''
f@:m(q..0fs^RIndirectfs^Rinit)!& WRDAB Mode or Global Expand`-fwx*[.1 qMode[.2
:fo..qX .1 .2 Abbrevf"lw :fo..qX .1 * Abbrevf"lw''u.2
:m:.e(1)& Global Expand7-fwx*[.1
:fo..qX .1 * Abbrevf"lw'[.2
:m:.e(1) & Expand+[..0
q:..q(q.2+2)[.3
q.3fp-101"N :i:..q(q.2+2)1'
"# .(g.3)j .(\+1:\u:..q(q.2+2))j fq.3d'
-fq.1d
0,0a--"E
-1fo..qWord Abbrev Prefix Mark+1-."E
:i.1-.1
-d''
.u:.e(3)
.[.4
g:..q(q.2+1)
.[.5
-1[.7
fq.1[.8
<%.7-q.8;
q.7 :g.1"a0;'>
q.7 :g.1"u
q.4j :fwl
1 @fc
q.8-1 :g.1"u
0fo..qWordab All Caps"e
0u.3
:< 2:fwl .-q.5; %.3w
1 @fc >w
q.3"e q.4,q.5 @fc''
"#
q.4,q.5 @fc''
'
q.1u:.e(2)
:i:.e(5)
q.5j
q.4,q.5 f
ff-1"G oUPDATE '
0fo..qAuto Fill Mode"E oUPDATE '
0fo..qFill Columnf"e w fsWidth-10'u.1
fsSHpos-q.1-2"l oUPDATE'
m.m^R Indent New Comment Line
q.5(:fx.5
)-q.4f<!OUT!
fsSHpos-q.1-2:;
<.-1,(0l.):fb "e f;OUT'
q.1-fsHpos;>
.-q.4"L .u:.e(3)
.,q.4x:.e(5)
.u.4'
@f k
:fx.3
@mIw
:0L.,(:2Lg.3).f>
:l .(g.5)j
!UPDATE!
q.4,.x:.e(4)
^R Unexpand Last Word>z-.[.4
fn z-q.4j
q:.e(2)"e fg @ft
No last expansion 0fsEchoActivew 1 '
q:.e(2)[.1
q:.e(4)[.3
0,1 :g.1 [.2
.2--"E
1,fq.1 :g.1 u.1'
"# :i.2'
q:.e(3)[.5
1:<q.5j>"N zj'
fq.3f~.3"n fg @ft
No last expansion 0fsEchoActivew 1 '
fq.3d
.,(g:.e(5)
g.2
g.1). f
:i*Fundamental fo..qMODEu.2
:fo..qX .1 .2 Abbrevf"G u.2'
"# :fo..qX .1 * Abbrevf"G u.2''
q:..q(q.2+2)[.3
.(g.3)j .(\-1:\u:..q(q.2+2))j fq.3d
1 Word Abbrev Mode
WORDAB= [.2[.3
ff&1"E 1u.3'
"# "'N,0u.3'
q.3m.vWord Abbrev Modew
ff&2"n "n m.m& Global Expandu:.e(0)'
"# m.m& WRDAB Mode or Global Expandu:.e(0)''
0fo..qWord Abbrev Hooku.2
q.2"N q.3 m.2'
q.3"E
q.2"E 0u:.x(U)
0u:.x()
0u:.x()
0u:.x(-)
0u:.x(+)'
m(m.m& Set Mode Line)
'
0fo..qWORDAB Ins Chars"E
:i*!~@#;$%^&*-_=+[]()\|:`"'{},<.>/?
 m.vWORDAB Ins Charsw
:i* m.vWORDAB Old Charsw'
q.2"E
m.m^R Unexpand Last Word u:.x(U)
m.m^R Add Mode Word Abbrev u:.x()
m.m^R Inverse Add Mode Word Abbrev u:.x()
m.m^R Add Global Word Abbrev u:.x(+)
m.m^R Inverse Add Global Word Abbrev u:.x(-)
m.m^R Abbrev Expand Only u... w
m.m^R Word Abbrev Prefix Mark(!"!) u..'
ff&2"n q:.x()(q:.x(+)u:.x())u:.x(+)
q:.x()(q:.x(-)u:.x())u:.x(-)''
:m(m.m& Set Mode Line)Define Word Abbrevs[.1[.2[.4
g(q..o(f[BBindw))
bj 0s <:s;ric>
zj i

bj
< .-z;
:s:; -d
0fx.1
@f  k
0,1a-("E d :flfx.2 d'
"# :i.2*'
@f  k
@f0123456789 fx.4
fq.4"E :i.40'
@f  k
0,1a-34"N :i*No quote to start expansionfsErr
'
d i:i*
0s" !'! <:s"e :i*No quote to end expansionfsErr'
0,1a-":@; c> !'!
0,1a-15."n :i*Possible unquoted " in expansion -- final " not at end of linefsErr !''!'
-d
iM.VX .1 .2 Abbrevw
i M.CX .1 .2 Abbrev.4
l>
j 0s"" <:s; -d>
m( hx* )
List Word Abbrevsr[.1 f[BBindw
m(m.mInsert Word Abbrevs)
bj i
abbrev: (mode) count "expansion"

ht ft
Done.
 Insert Word Abbrevs [1[2[3[4[5[6
q..ou1
f[BBind q..ou6 [..o
:fo..qX u2
q2"L -q2u2'
q1u..o i
 -l
fq..q/5-q2/3(
q2-1u2
)< q:..Q(%2)u3
q:..Q(%2)u4
q:..Q(%2)u5
q4fp"L oNEXT'
f~(0,2:g3)X "N oNEXT'
f~(fq3-7,fq3:g3) Abbrev"N oNEXT'
2,fq3-7g3
-s d i: 
1a-*"E d'"# i( :l i)'
9i g5 i " !'!
"f4:"l q6u..o g4
j 0s" <:s; i"> !''! hx4 q1u..o' !'!
g4 i"
 !'!
!NEXT! >
Make Word Abbrevr:i*( :i*( :i*[.3)[.2)[.1
fq.3"E qMODEu.3'
q.1,q.2 m(m.m& Check And Make Word Abbrev).3
w 1  & Check And Make Word Abbrev`:i*[2 [1 [3
q1[4 [5
fq1< 0,1:g4u5
5"b fg @ft
Break chars not allowed in abbrev 0fsEchoActivew 1 '
1,fq4:g4u4>
m.m& Shorten String
0fo..qX 1 2 Abbrevu4
q4"N f=34"N FG
q4mSu4
@ftRedefine "1" from "4"?  !''''!
1m(m.m& Yes or No)"E @ftNot redefined.
0fsEchoActivew 1 ''
"# @ftAlready so defined.
0fsEchoActivew 1 ''
q3m.vX 1 2 Abbrevw
m.cX 1 2 Abbrev0
@:i*|m.m& Make Non-Usage Abbrev Variable
q..q[..o
| fo..qLately Changed Abbrevsu4
q3m(m.m& Teco Quote String)u3
@:i*|4
MVX 1 2 Abbrev30|(
)m.vLately Changed Abbrevsw
&Write Incremental Word Abbrev File[1
e[e\ fne^e] f[DFile 1f[FNamSyntax
etDSK: fsHSNamefsDSNamew etINCABS >
4,f Incremental Filef"e w'u1
f[BBind g(:i* fo..qLately Changed Abbrevs)
z"e :i*No incremental abbrevs to write fsErr'
eihpef1
er fsIFileu1 ec @ft
Written: 1
 0fsEchoActivew 1%Read Incremental Word Abbrev FileJ[1 f[DFile
e[ fne] f[DFile 1f[FNamSyntax
etDSK: fsHSNamefsDSNamew etINCABS >
4,f Incremental word abbrev filef"e w'u1
et1
f[BBindw er @y
m( hx*f(m.vLately Changed Abbrevsw) )
& Teco Quote String3f[BBind g()
bm(m.m& Teco Quote Area)
hx* & Teco Quote Area).-z(
< .,:fb; ir >
)+zj #^R Inverse Add Mode Word AbbrevQqMode[.4
.-z[.0
-:fwl
-fwx*[.1
1,m(m.m& Read Line)Expansion for .4 abbrev ".1": [.2 !''!
q.2"e 1'
fq.2"e 1'
m(m.mMake Word Abbrev).1.2
@m(m.m^R Abbrev Expand Only)f
q.0+zj
1%^R Inverse Add Global Word AbbrevH.-z[.0
-:fwl
-fwx*[.1
1,m(m.m& Read Line)Expansion for global abbrev ".1": [.2 !''!
q.2"e 1'
fq.2"e 1'
m(m.mMake Word Abbrev).1.2*
@m(m.m^R Abbrev Expand Only)f
q.0+zj
1^R Add Mode Word Abbrev"L f @:m(m.m^R Kill Mode Word Abbrev) '
:i*FUNDAMENTAL fo..qMODE [.1
f @m(m.m& Add Word Abbrev).1.1 Abbrev
w 1 ^R Add Global Word Abbreve"L f @:m(m.m^R Kill Global Word Abbrev) '
f @m(m.m& Add Word Abbrev)*Global Abbrev
w 1 & Add Word Abbrev+:i* [.2
[.3[.4[.5.[.6 fnq.6j
1:<fs^RMark+1f"G-1 u.3 1;'
"E .(:f(j)u.3)j 1;'
"N -fwl .u.3 fwl 1;'
>"N FG F*w 1 '
Q.3,. fx.3
m.m& Shorten String
m.m& Read Line
q.3mSu.4
1,mR for ".4": [.1 !''!
q.1"E 1 '
q.1,q.3 m(m.m& Check And Make Word Abbrev).2
1 
0fo..qAbbrev Auto Save Mode"N
0fo..qAbbrev Auto Save Count+1u.4
q.4-(20fo..qAbbrev Auto Save Delay)"G
0m.vAbbrev Auto Save Countw
@ft
(Abbrev Auto Save) m(m.mWrite Word Abbrev File)
0fsEchoActive
'"# q.4m.vAbbrev Auto Save Countw''
1 & Shorten Stringb[.3[.4[.5
fq.3-40"G
0,16:g.3u.4
fq.3-16,fq.3:g.3u.5
:i.4.4.....5'
"# q.3u.4'
q.4 ^R Word Abbrev Prefix Marka!^R Abbrev Expand !
ff"E
0,0a"c m:.e(0)''
. m.vWord Abbrev Prefix Markw
.,(i-). 
& WRDAB Set Mode Line Hook+0(fsQPPtr
)[.0
m(m.m& WRDAB Process Options Hook)
0fo..qWord Abbrev Mode"N
q.0"E :i.0 Abbrev'"# :i.0.0 Abbrev''
q.0( qQfsQPUnwindw
)^R Kill Mode Word Abbrev
:i*Fundamental fo..qMODE[.2
1, m(m.m& Read Line)Kill .2 Abbrev: [.1
q.1"E '
0fo..qX .1 .2 Abbrev"E
0fo..qX .1 * Abbrev"E
FG @ft".1" is neither .2 mode nor global abbrev. !''!
0fsEchoActivew 1 '
"# FG @ft".1" is not a .2 mode abbrev, but is a global abbrev.
Kill it? !''!
1m(m.m& Yes Or No)"E
@ft Not killed. 0fsEchoActivew 1 '
:i.2*''
m(m.mKill Variable)X .1 .2 Abbrev
:i* fo..qLately Changed Abbrevsu.4
@:i*|.4
m(m.mKill Variable)X .1 .2 Abbrev| m.vLately Changed Abbrevsw
w 1 ^R Kill Global Word Abbrev61, m(m.m& Read Line)Kill Global Abbrev: [.1
q.1"E '
0fo..qX .1 * Abbrev"E
FG @ft".1" is not a global abbrev.
0fsEchoActivew 1  !''! '
m(m.mKill Variable)X .1 * Abbrev
:i* fo..qLately Changed Abbrevsu.4
@:i*|.4
m(m.mKill Variable)X .1 * Abbrev| m.vLately Changed Abbrevsw
w 1 Kill All Word Abbrevs8[.1[.2[.3
q..q[..o zj
:f<!DONE! 15r
1<
0,2:g(.fsWord)u.3
f~.3X f"N "L f;DONE'
1;'
.fsWordu.3
.+5fsWordu.2
q.2fp:;
fq.3-7,fq.3 :g.3 u.3
f~.3 Abbrev"E 15d'
>
>
Edit Word Abbrevs3@:i*| 1m.vAbort Edit Word Abbrevsw
fs^RExitw |[.G
0m.vAbort Edit Word Abbrevsw
f[BBind
m(m.mInsert Word Abbrevs) bj
:i*Edit Word Abbrevs[..J

fsEchoDisw CfsEchoDisw
0fo..qAbort Edit Word Abbrevs"E
m(m.mKill All Word Abbrevs)
m(m.mDefine Word Abbrevs)
@ftWord abbrevs redefined.
0fsEchoActivew
'
"# FG @ftWord abbrevs NOT redefined.
0fsEchoActivew'
m(m.mKill Variable)Abort Edit Word Abbrevs
Sort Word AbbrevsEbj < .-z;
.-(:l)."E k'"# l'>
: 
:s"$f"Lw
-fwl \'!'!
l
& WRDAB Off PO Check@-1[.4[.5
< %.4-fq.1;
q.4:g.1u.5
q.5-q.6"E q.5m.7' >
& WRDAB On PO Check@-1[.4[.5
< %.4-fq.1;
q.4:g.1u.5
q.5-q.6"N q.5m.7' >
 & WRDAB Process Options Hook [.0[.1[.6[.7[.8
0fo..qMM ^R Abbrev Expand for Tabf"EoRST'u.0
0fo..qWord Abbrev Mode"N
qI-q.0"n
qIm(m(m.m& Global or Local)I)MM # WRDAB Old 11
q.0uI'
0fo..qMM & WRDAB On PO Checkf"EoRST'u.0
0fo..qMM & WRDAB Turn On Ins Charf"EoRST'u.7
0fo..qMM & WRDAB Turn On Old Charf"EoRST'u.8
'
"# qI-q.0"E
qMM # WRDAB Old 11uI'
0fo..qMM & WRDAB Off PO Checkf"EoRST'u.0
0fo..qMM & WRDAB Turn Off Ins Charf"EoRST'u.7
0fo..qMM & WRDAB Turn Off Old Charf"EoRST'u.8
'
0fo..qWORDAB Ins Charsu.1
q.1"E :i.1'
0fo..qMM ^R Abbrev Expand And Self-Insertf"EoRST'u.6
m.0
0fo..qWORDAB Old Charsu.1
q.1"E :i.1'
0fo..qMM ^R Abbrev Expand And Call Old Charf"EoRST'u.6
q.8u.7
m.0

!RST!
m.m& WRDAB Process Options Hookm.vMM & WRDAB Process Options Hookw
m.m^R Abbrev Expand for Tabm.vMM ^R Abbrev Expand for Tabw
m.m& WRDAB On PO Checkm.vMM & WRDAB On PO Checkw
m.m& WRDAB Turn On Ins Charm.vMM & WRDAB Turn On Ins Charw
m.m& WRDAB Turn On Old Charm.vMM & WRDAB Turn On Old Charw
m.m& WRDAB Off PO Checkm.vMM & WRDAB Off PO Checkw
m.m& WRDAB Turn Off Ins Charm.vMM & WRDAB Turn Off Ins Charw
m.m& WRDAB Turn Off Old Charm.vMM & WRDAB Turn Off Old Charw
m.m^R Abbrev Expand And Self-Insertm.vMM ^R Abbrev Expand And Self-Insertw
m.m^R Abbrev Expand And Call Old Charm.vMM ^R Abbrev Expand And Call Old Charw
f:m(m.m& WRDAB Process Options Hook)
& WRDAB Turn On Ins Char[.0
q.0[.4
q.4fp"L
m.m^R Abbrev Expand And Self-Insertu.0
'
f~.4!^R Abbrev Expand -19"e '
qWORDAB Ins Chars[.1
f.1[.2
0,q.2:g.1[.3
q.2+1,fq.1:g.1u.1
:iWORDAB Ins Chars.3.1
qWORDAB Old Charsu.1
:i.2
:iWORDAB Old Chars.1.2
m.m^R Abbrev Expand And Call Old Charu.0
[.6 8[..e :\u.6 ]..e
q.4m(m(m.m& Global or Local).0)MM # WRDAB Old .6
& WRDAB Turn On Old Char@[.0
q.0[.1
q.1fp"G
f~.1!^R Abbrev Expand -19"E
''
m.m^R Abbrev Expand And Call Old Charu.0
[.6 8[..e :\u.6 ]..e
q.1m(m(m.m& Global or Local).0)MM # WRDAB Old .6
& WRDAB Turn Off Ins Char[.0
fs^RInitu.0 & WRDAB Turn Off Old CharJ[.6 8[..e :\u.6 ]..e
0fo..qMM # WRDAB Old .6[.1
[.2
q.1u.2 ^R Abbrev Expand for Tab!^R Abbrev Expand !
0,0a[.1
.,.f
f@mMM # WRDAB Old 11f
0,0a"B q.1"C
ff"E
-@f k
0,0a"c m:.e(0)'
f @mMM # WRDAB Old 11f'''
1& Global or Localv[1[2[3[9
[ -1:fsQPHome(]*w)u3
qBuffer Indexu9 q9+8u2
q:.b(q9)-9/2u1
q1< q:.b(%2)-q3"e q.L ' %2w >
q.V Read Word Abbrev Filef[DFile 1f[FnamSyntax
0fo..qLast Word Abbrev Filef"n fsDFilew'
"#w etDSK:WORDAB DEFNS fsHSnamefsDSnamew'
4,f Word Abbrev Filef"ew'fsDFilew
fsDFilem.vLast Word Abbrev Filew
f[BBind er @y
10f~m.m& Make "n
fsDFile[1
m(m.mRun Library)WABCONConvert Old Word Abbrev File1
er @y hx*m.vQWABL Definitionsw
'
hx* m.vQWABL Definitionsw
mQWABL definitions Write Word Abbrev File/[.0[.1[.2[.3[.4[.5 f[DFile
1f[FnamSyntax
0fo..qLast Word Abbrev Filef"n fsDFilew'
"#w etDSK:WORDAB DEFNS fsHSnamefsDSnamew'
4,f Word Abbrev Filef"ew'u.0
et.0 fsDFileu.0
q.0m.vLast Word Abbrev Filew
f[BBind
m.m& Teco Quote Area
:fo..qX u.2
q.2"L -q.2u.2'
ff&1"E
^i|m.m& Make Usage Abbrev Variable
|'"#
^i|m.m& Make Non-Usage Abbrev Variable
|'
iq..q[..o

fq..q/5-q.2/3(
q.2-1u.2
)< q:..Q(%.2)u.3
q:..Q(%.2)u.4
q:..Q(%.2)u.5
q.4fp"L oNEXT'
f~(0,2:g.3)X "N oNEXT'
f~(fq.3-7,fq.3:g.3) Abbrev"N oNEXT'
iMV.3
.(g.4)mQ i
ff&1"E g.5 i'
i

!NEXT! >
hx* m.vQWABL Definitionsw
1,m(m.m Write File).0
Word Abbrev Apropos.:i*[0[1
f[BBindw
0fo..qQWABL Definitionsu1
q1"n g1 j 2:k'
0fo..qLately Changed Abbrevsu1
q1"n .(g1)j 2:k'
j <:s
m(m.mKill Variable)X ; 2r .,(:lr).x1
0lk fsZ-.fsVZw
j<:s
MV1; 0l .,(3s).k>
0fsVZw >
bj <:s
MVX ; 
 >
bj l
< :s0;
-s
 fkc .,(fwl).t ft: 
c 0,1a-*"N
ft( .,(s Abbrev fkc).t ft)'
ft "!'!
s Abbrev
.,(sr).t
ft"
 !'!
:s
; >
ftDone.

 & Make Usage Abbrev Variable
:i*[.1
:i*[.2
:i*[.0
:FO..Q.1[.3
Q.3"L -Q.3*5J 15,0I 15R q.1,.FSWORDW 0,.+10FSWORDW
-Q.3U.3'
q.3+1*5j q.2,.fswordw
5c q.0,.fswordw $& Make Non-Usage Abbrev Variable:i*[.1
:i*[.2
:FO..Q.1[.3
Q.3"L -Q.3*5J 15,0I 15R q.1,.FSWORDW 0,.+10FSWORDW
-Q.3U.3'
q.3+1*5j q.2,.fswordw

~FILENAME~
WORDAB~DOC~ ~FILENAME~CWord Abbrev Mode package. Documentation in INFO under EMACS.
 ~DOC~ & Setup WORDAB Library*S Run when WORDAB is loaded. Calls a hook.
Calls WORDAB SETUP HOOK, if it exists. That can do things like
auto-loading a file of abbreviations.
Then appends & WRDAB Set Mode Line Hook to Set Mode Line Hook.
Thus, anything put on those hook variables should not return by ^\.
,~DOC~ Old Word Abbrev Character Describe+C Tell what char does after expanding.
This command will ask you to type a character, e.g. Space, which runs the
word abbrev expander and then calls the old definition for that
character. The description for that old definition will be given, e.g.
the description for ^R Auto-Fill Space.

~DOC~ ^R Abbrev Expand Onlyv^R Expand last word, but insert nothing after it.
If given an argument, will feep if last word isn't an abbrev.
,~DOC~ ^R Abbrev Expand And Call Old Char
^R Expand last word, then run old char.
The "old" function run by the character after the expansion check may be
described by MM Old Word Abbrev Character Describe which will ask you to
type the character to describe.
Explicit ARG inhibits expanding.
*~DOC~ ^R Abbrev Expand And Self-InsertS Expand last word if an abbrev.
Giving an explicit numeric argument inhibits expansion, just inserting that
many copies of char that ran this.
'~DOC~ & WRDAB Mode or Global Expand6S Expand previous word if mode or global abbrev.
~DOC~ & Global Expand.S Expand previous word if global abbrev.
~DOC~ & ExpandS .1 is abbrev, .2 is ..Q offset
A pre-comma ARG inhibits auto-filling. (Since ^^M, e.g. is called by
some to insert CRLF but not auto-fill.)

~DOC~ ^R Unexpand Last WordL^R Undo last expansion, leaving the abbrev.
If there was a prefix that was glued onto the expansion, it will be separated
from the abbrev by a hyphen.
The abbrev's usage-count is decremented.
~DOC~ Word Abbrev Mode~DOC~ WORDABRC Mode for expanding word-abbrevs.
No arg or non-zero arg sets the mode, Word Abbrev Mode.
0 arg clears the mode.
Runs Word Abbrev Hook if any, with arg of new mode setting. If none,
the following keys are set:
^X ^A runs ^R Add Mode Word Abbrev,
^X ^H runs ^R Inverse Add Mode Word Abbrev,
^X + runs ^R Add Global Word Abbrev,
^X - runs ^R Inverse Add Global Word Abbrev,
M-' runs ^R Word Abbrev Prefix Mark,
C-M-Space runs ^R Abbrev Expand Only, and
^XU runs ^R Unexpand Last Word.
Giving this command 1 as a pre-comma argument means that you only use global
abbrevs, and things are set up to be faster (e.g. faster expansion
checking since it doesn't have to check both global and local abbrevs).
Each of the following chars:
~@#;$%^&*()-_=+[]\|:'`"{},<.>/?!, Space, Return,
will run ^R Abbrev Expand And Self-Insert, or ^R Abbrev Expand And Call Old
Char.
Tab runs ^R Abbrev Expand for Tab.
~DOC~ Define Word Abbrevs(C Define word abbrevs from buffer.
~DOC~ List Word Abbrevs*C List abbrevs and their expansions.
~DOC~ Insert Word AbbrevsC Insert abbrevs defined and their expansions.
Format is acceptable to MM Define Word Abbrevs.
In particular, any double-quotes (the '"' character) in an expansion will be
quoted with another double-quote. E.g. HE SAID "HELLO" becomes HE SAID
""HELLO"".
~DOC~ Make Word AbbrevfC Make first string argument expand to second one.
After doing MM Make Word Abbrevfoofind outer otter, typing "foo" will
automatically expand to "find outer otter".
3rd string argument, if any, is the mode for the abbrev.
No 3rd string argument means use the current mode.
3rd string argument = "*" means this make a global abbrev.
This command defines just one abbrev, as compared to Define Word
Abbrevs which defines several abbrevs from a list in the buffer.
&~DOC~ & Check And Make Word Abbrev
S ARG1 abbrev, ARG2 expn, string arg mode.
String argument is "*" or space-modename, e.g. " TECO".
Checks for break characters in abbrev (not allowed).
,~DOC~ Write Incremental Word Abbrev File5C Write file of changed abbrevs.
Writes to file given by string argument.
(This does not reset the default filename for Write Word Abbrev File and
Read Word Abbrev File. I'm not sure of the correctness of this, though.)
Defaults to home directory, INCABS >.
See Read Incremental Word Abbrev File.
+~DOC~ Read Incremental Word Abbrev FilefC Load some abbrevs that changed.
String argument is filename that contains incremental abbrev definitions,
e.g. written by Write Incremental Word Abbrev File.
Default is home directory, INCABS >.
(This does not reset the default filename for Write Word Abbrev File and
Read Word Abbrev File. I'm not sure of this, but it seems correct.)
~DOC~ & Teco Quote String9S Takes string as NUMARG, returns with ^]^]s, ^]s.
~DOC~ & Teco Quote Area-S Quote altmodes and ^]s in ARG1,point.
)~DOC~ ^R Inverse Add Mode Word AbbrevZ^R Define expansion for word before point.
Numeric argument n means nth word before point is to be an abbrev (e.g.
you thought it already was, and you are now n words beyond).
No numeric argument means the word just before point, same as argument
of 1.
Reads a one-line expansion for the abbrev, defines it, and expands it.
+~DOC~ ^R Inverse Add Global Word Abbrev]^R Define expansion for word before point.
Numeric argument n means nth word before point is to be an abbrev (e.g.
you thought it already was, and you are now n words beyond).
No numeric argument means the word just before point, same as argument
of 1.
Calls & Read Line to get the expansion for that abbrev. (No multi-line.)
Defines that abbrev, and then expands the abbrev before point.
Aborts if & Read Line is aborted, or if the expansion is null.
!~DOC~ ^R Add Mode Word Abbrev@^R Reads mode abbrev for words before point.
Negative ARG means to delete the word abbrev. (If there is no such mode
abbrev, but there is a global, it asks if it should kill the global.)
Positive ARG (>0) means expansion is last ARG words.
Zero ARG means expansion is between point and MARK.
If FS ^R Mark set, then for any ARG expansion between . and FS ^RMark.
The abbrev is only effective when in the current mode (e.g. LISP).
#~DOC~ ^R Add Global Word Abbrevl^R Reads global abbrev for words before point.
Negative ARG means to delete the word abbrev,
calls ^R Kill Global Word Abbrev.
Positive ARG (>0) means expansion is last ARG words.
Zero ARG means expansion is between point and MARK.
If FS ^R Mark set, then for any ARG expansion between . and FS ^RMark.
The abbrev is effective in all major modes.
~DOC~ & Add Word AbbrevMS Reads an abbrev for words before point.
Stringarg1 is "*" for global abbrev, and space-modename for a mode abbrev,
e.g. " TECO".
Stringarg2 is & Read Line prompt.
Calls & Read Line to read the abbrev.
ARG non-0 means expansion is last ARG words. (Includes breaks in between
words, but not those before first or after last word.)
ARG 0 means expansion is between point and MARK.
If FS ^R Mark set, then for any ARG expansion between . and FS ^RMark.
If the abbrev is already defined, user is asked if redefinition wanted.
The abbrev must not contain any break characters.
Abbrev variable is constructed: X abbreviation <mode/*> Abbrev. It
contains a string which is the expansion.
~DOC~ & Shorten StringPS Produce a short string, showing beginning/end.
ARG is a string pointer.
$~DOC~ ^R Word Abbrev Prefix Mark!^R Mark point as end of a prefix.
Expansion of the prefix may occur unless an ARG is given.
Sets Word Abbrev Prefix Mark to point and inserts a hyphen.
$~DOC~ & WRDAB Set Mode Line Hook2S Tell & Set Mode Line if display " Abbrev".
"~DOC~ ^R Kill Mode Word Abbrevg^R Causes mode abbrev typed to be expunged.
Same as ^R Add Mode Word Abbrev with a negative ARG.
$~DOC~ ^R Kill Global Word Abbrevk^R Causes global abbrev typed to be expunged.
Same as ^R Add Global Word Abbrev with a negative ARG.

~DOC~ Kill All Word Abbrevs/C No word abbrevs are defined after this.
~DOC~ Edit Word Abbrevs9C Go into ^R mode, editing word abbrev definitions.
Note that any '"'s are doubled so that the syntax is unambiguous. E.g.
if the abbrev 'xsay' is to expand to 'He said "Hello"', then it will be:
xsay: 1 "He said ""Hello"""
^R mode is entered. When exited normally, (e.g. by ^C^C) the buffer will
be considered as new definitions of word abbrevs.
^G will abort MM Edit Word Abbrevs, leaving word abbrevs untouched.
~DOC~ Sort Word AbbrevsxC Sort a word abbrev list in the buffer by count.
The most-frequently used abbrevs appear at the top of the list.
~DOC~ & WRDAB Off PO CheckS Check list of chars for expanders, fix.
q.1: List of characters.
q.6: ^R Macro to check against.
q.7: Subroutine to call if char runs .6.
~DOC~ & WRDAB On PO Check$S Check list of expand characters for changes and fix.
q.1: List of characters.
q.6: ^R Macro to check against.
q.7: Subroutine to call if change.
&~DOC~ & WRDAB Process Options Hook9S Check for characters to change.
Calls a subroutine to see-if/do any expand characters need updating.
Is a little slow for someone who makes Word Abbrev Mode local. Could fix.
"~DOC~ & WRDAB Turn On Ins CharlS Make a ^R Abbrev Expand And Self-Insert key.
ARG: 9-bit of key to use.
If is FS^RInit, then becomes expand-ins.
Otherwise becomes a call-old expander, and character is moved from WORDAB
Ins Chars to WORDAB Old Chars.
"~DOC~ & WRDAB Turn On Old CharQS Make a ^R Abbrev Expand And Call Old Char key.
ARG: 9-bit of key to use.
#~DOC~ & WRDAB Turn Off Ins Char"S Reset char ARG to builtin.
#~DOC~ & WRDAB Turn Off Old Char*S Reset char ARG to what was before.
"~DOC~ ^R Abbrev Expand for Tab ^R Expands abbrevs when Tab inserts at point.
If Tab will not insert any whitespace at point, no expansion is attempted.
(E.g. the Tab is reindenting the line, but point is mid-line.)
Old Tab is in MM # WRDAB Old 11.
Explicit ARG inhibits expanding.
~DOC~ & Global or LocalES Return Q.L if argument is a local q-register. Q.V otherwise.

~DOC~ Read Word Abbrev FileC Define word abbrevs from a file of definitions.
Stringarg is word abbrev definition file. Default is <homedir>;WORDAB DEFNS.
 ~DOC~ Write Word Abbrev FileZC Write a definition file for all defined abbrevs.
Stringarg filename. Default is WORDAB DEFNS.
Argument present means do not write out usage counts.
Default filenames come from last definition filename used.
~DOC~ Word Abbrev AproposC List abbrevs or expansions containing stringarg.
String argument is some pattern to find, either in abbrev, modename, or
expansion. It is a standard Teco search string; e.g. you can do:
MM Word Abbrev Apropos$foo^Obar$ which will match foo OR bar.
Currently this command only works "approximately" -- it may miss definitions
that have changed via Edit Word Abbrevs, or were only defined by Define
Word Abbrevs. It will however catch all definitions read in from a file
or defined one by one by the user.
&~DOC~ & Make Usage Abbrev VariableXS Like .V and .C combined, for speed.
STRARG1 is abbrev variable name.
STRARG2 is abbrev expansion with altmodes, ^]s quoted with ^]s.
STRARG3 is usage-count string.
Assumes ..Q is selected as buffer (..O).
*~DOC~ & Make Non-Usage Abbrev VariableyS Like .V and .C combined, for speed.
STRARG1 is abbrev variable name string.
STRARG2 is abbrev expansion string.
~DIRECTORY~ & Setup WORDAB Library
Old Word Abbrev Character Describe
^R Abbrev Expand Only
^R Abbrev Expand And Call Old Char
^R Abbrev Expand And Self-Insert
& WRDAB Mode or Global Expand
& Global Expand
& Expand
^R Unexpand Last Word
Word Abbrev Mode
WORDAB
Define Word Abbrevs
List Word Abbrevs
Insert Word Abbrevs
Make Word Abbrev
& Check And Make Word Abbrev
Write Incremental Word Abbrev File
Read Incremental Word Abbrev File
& Teco Quote String
& Teco Quote Area
^R Inverse Add Mode Word Abbrev
^R Inverse Add Global Word Abbrev
^R Add Mode Word Abbrev
^R Add Global Word Abbrev
& Add Word Abbrev
& Shorten String
^R Word Abbrev Prefix Mark
& WRDAB Set Mode Line Hook
^R Kill Mode Word Abbrev
^R Kill Global Word Abbrev
Kill All Word Abbrevs
Edit Word Abbrevs
Sort Word Abbrevs
& WRDAB Off PO Check
& WRDAB On PO Check
& WRDAB Process Options Hook
& WRDAB Turn On Ins Char
& WRDAB Turn On Old Char
& WRDAB Turn Off Ins Char
& WRDAB Turn Off Old Char
^R Abbrev Expand for Tab
& Global or Local
Read Word Abbrev File
Write Word Abbrev File
Word Abbrev Apropos
& Make Usage Abbrev Variable
& Make Non-Usage Abbrev Variable
 ~INVERT~[1 <Q1-1U1 Q1FP;> Q1

BIN
src/e142/xworda._ej Normal file

Binary file not shown.