From d0bdad77c9e5e3b19ad00db778eff6cbb3479e25 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 12 Dec 2016 21:57:51 +0100 Subject: [PATCH] Add more EMACS libraries: AUTO-S, DIRED, TAGGEN, VT100, VT52. --- build/build.tcl | 5 + doc/emacs1/modlin.info | 66 ++++++++ doc/emacs1/vt100.info | 40 +++++ src/emacs1/auto-s.118 | 235 +++++++++++++++++++++++++++ src/emacs1/dired.205 | Bin 0 -> 32717 bytes src/emacs1/taggen.45 | 316 ++++++++++++++++++++++++++++++++++++ src/emacs1/vt100.49 | 352 +++++++++++++++++++++++++++++++++++++++++ src/emacs1/vt52.4 | 55 +++++++ 8 files changed, 1069 insertions(+) create mode 100755 doc/emacs1/modlin.info create mode 100755 doc/emacs1/vt100.info create mode 100755 src/emacs1/auto-s.118 create mode 100755 src/emacs1/dired.205 create mode 100755 src/emacs1/taggen.45 create mode 100755 src/emacs1/vt100.49 create mode 100755 src/emacs1/vt52.4 diff --git a/build/build.tcl b/build/build.tcl index 0c92bb0a..40e4e684 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -260,7 +260,10 @@ respond "EMACS Editor" "\033xload\033purify\r" respond "\n" "\033xgenerate\033emacs;info\033emacs1;info\r" respond ":EJ" "\033xbare\033emacs1;bare\r" respond "\n" "\033xgenerate\033emacs;abstr\033emacs1;abstr\r" +#respond ":EJ" "\033xgenerate\033emacs;auto-s\033emacs1;auto-s\r" +respond ":EJ" "\033xgenerate\033emacs;dired\033emacs1;dired\r" respond ":EJ" "\033xgenerate\033emacs;tags\033emacs1;tags\r" +respond ":EJ" "\033xgenerate\033emacs;taggen\033emacs1;taggen\r" respond ":EJ" "\033xgenerate\033emacs;slowly\033emacs1;slowly\r" respond ":EJ" "\033xgenerate\033emacs;pictur\033emacs1;pictur\r" respond ":EJ" "\033xgenerate\033emacs;sort\033emacs1;sort\r" @@ -268,6 +271,8 @@ respond ":EJ" "\033xgenerate\033emacs;page\033emacs1;page\r" respond ":EJ" "\033xgenerate\033emacs;scrlin\033emacs1;scrlin\r" respond ":EJ" "\033xgenerate\033emacs;delim\033emacs1;delim\r" respond ":EJ" "\033xgenerate\033emacs;modlin\033emacs1;modlin\r" +respond ":EJ" "\033xgenerate\033emacs;vt100\033emacs1;vt100\r" +respond ":EJ" "\033xgenerate\033emacs;vt52\033emacs1;vt52\r" respond ":EJ" "\033xrun\033einit\033? Document\r" respond "\n" "\030\003" diff --git a/doc/emacs1/modlin.info b/doc/emacs1/modlin.info new file mode 100755 index 00000000..4385487e --- /dev/null +++ b/doc/emacs1/modlin.info @@ -0,0 +1,66 @@ +The MODLIN Library Monday, February 4, 1980 + Updated Saturday, July 16, 1983 + +The mode line has the following form: + +{editor} {time} [{superior}: {modeinfo} {options} {type} {buffer}] {file} + +{editor} is the value of Emacs' "Editor Name" variable. + +{time} is time and date, or just time (see below). This gets updated even + if in a recursive ^R mode. + +{superior} is displayed on ITS if this Emacs is not at toplevel (eg, when + a LISPT lives under its lisp, you will see LISP: or in a MAILT + you will see MAIL:) + +{type} is the value of the Emacs "Editor Type" variable enclosed in angle + brackets, or a "-" if no such value is assigned. If {buffer} is + omitted (see below) and this would have displayed as a "-", it is + also omitted. + +{buffer} is now omitted if the buffer name is the same as fielname1 of {file} + +{modeinfo} now shows the submode if any attached to the mode with a hyphen. + eg, if you load the PICTUR library and do MM Edit Picture you + might see something like: + [MAIL: Fundamental-Picture ...] + +{options} A number of new options now display. They include: + + NoSave - Autosave, if normally on, has been disabled + Save - Autosave turned on + SaveOld - Save this file automatically if new file read + into buffer + NoSaveOld - Don't ask and don't save file if new file read + into buffer + ReadOnlyFile - Saving, as in C-X C-S, will query before allowing + file to be written back. Saving via C-X C-W will + not bother to query since it reads a new filename. + ReadOnlyBuf - Buffer is protected from modification. + ReadOnlyFile/Buf - Same as ReadOnlyFile+ReadOnlyBuf + OverWrite - Overwrite mode enabled + Def - Keyboard Macro definition underway + Narrow - Buffer bounds have been narrowed. + + Following these options, other user-set options, such as Abbrev + mode, are inserted. + +{file} is the file being visited. If the file is a ">" or "<" file (ITS) + or ".0" or ".-2" file (Twenex), a designator "=nnn" where the nnn + is the version number of the file which was actually visited. + If the ">" or "<" file is not a numbered file, then the designation + "~fn2" will appear where fn2 is the actual second filename of the + visited file. Odd cases of fn2's which are not understood by MODLIN + will appear as "#" in place of "=nnn" or "~fn2". + +The following switch variables are of interest: + + Time Only:0 Show date and time. This is the default. + Time Only:1 Show time only. + + Invert Filenames:0 Show filenames normally. This is the default. + Invert Filenames:1 Show filenames in funny order. Useful if filenames + are frequently too long to fit. + FOO BAR JDOE; on ITS + FOO.BAR PS: on Twenex diff --git a/doc/emacs1/vt100.info b/doc/emacs1/vt100.info new file mode 100755 index 00000000..72eb0d91 --- /dev/null +++ b/doc/emacs1/vt100.info @@ -0,0 +1,40 @@ + +KMP@MIT-MC 11/02/79 17:55:47 +To: INFO-EMACS at MIT-MC +For those of you with VT100 terminals if you run in ANSII mode, the +VT100 library, which you can get via + + MM Load LibraryVT100 + +will set up the keypad to do pretty reasonable things as follows: + +(1) Keypad digits and minus are args to the next command automatically. + [Normal digits in main key area are self-inserting still]. + +(2) Comma will eventually be an arg separator for advanced commands that + take precomma args. I haven't coded this yet. + +(3) Dot runs ^R Documentation like ^_H or Top-H would normally do. + +(4) Arrows go vertically up, down, back and forth, independent of what + you define ^B,^F,^N,or ^P to do ... + +(5) PF1-4 run macros you can define. They are initially undefined. + +(6) Enter followed by a PF-key will read characters like the ^X(...^X) does + up until the next ^X), C-M-C, or Enter that you type. You can abort + a definition by doing ^]. + +Sorry for the length of the message, but hopefully this will be of interest +to enough of you to make it worthwhile. + +Interestingly enuf, this will not work on AI. No, I am not boycotting -- I +just don't know what the new Emacs over there has done and I am nearly sure +that my stuff is wholely incompatible at this point ... when the new emacs +works its way back over to MC (which is happening slowly now), I will work +on an all-ITS compatible version of the handler. + +-kmp + + + \ No newline at end of file diff --git a/src/emacs1/auto-s.118 b/src/emacs1/auto-s.118 new file mode 100755 index 00000000..44b5c0f1 --- /dev/null +++ b/src/emacs1/auto-s.118 @@ -0,0 +1,235 @@ +!* -*-TECO-*- *! + +!~FILENAME~:! !New version of Auto Save Mode and its associates.! +AUTO-SAVE-MODE + +!& Setup AUTO-SAVE-MODE Library:! !S Install hooks, create variables. +Runs Auto-Save-Mode Setup Hook, if it is non-0, in which case it +must take care of setting keys, fsClkMacro, fsClkInterval, ..F and +.F. We set those only when there is no hook.! + + m(m.m& Declare Load-Time Defaults) + Auto-Save-Mode Setup Hook, + If non-0, called when AUTO-SAVE-MODE is loaded: 0 + + [1[k + + !* First make sure no previous MM-variables are going to cover our functions:! + + m.mKill Variableuk !* K: Killer.! + mkMM & Auto Save Setupw !* Kill kill kill! + mkMM & Auto Save Filew !* ...! + mkMM ^R Save Filew !* ...! + mkMM & Secretary Macrow !* ...! + mkMM & Auto Save All Buffersw !* ...! + mkMM & Real-time Interruptw !* ...! + + !* Now do some of our own installing: ! + + !* Note that we will PREpend our exit hook, so that in case there! + !* was already some other auto-saver hook there, we go first and! + !* theirs probably will be a no-op since the buffers wont be! + !* modified any more.! + + 0fo..qExit Hookf"ew :i*'u1 !* 1: Old hook.! + @:i*|ff"e m(m.m& Auto Save All Buffers)' !* Prepend our hook.! + 1|m.vExit Hookw !* ...! + + !* Some installing is only if there is no hook: ! + + qAuto-Save-Mode Setup Hookf"nu1 m1' !* Run hook, if non-0.! + "#w !* No hook. We install.! + m.m& Secretary Macrof(u.f)u..f !* .F, ..F: Install our one.! + m.m& Real-time InterruptfsClkMacrow !* Install our clock! + !* interrupt handler.! + fsClkInterval"e 4*60*60fsClkIntervalw' !* set interval if none! + m.m^R Save Fileu:.x()' !* C-X C-S: our save file function! + +  + +!& Auto Save Setup:! !S Decide whether to turn on auto saving for file! + 0[1 !* 1: to save or not to save! + qBuffer Index[2 !* 2: index into .B of current buffer! + qBuffer Filenamesf"nf[DFile !* if buffer filenames, examine them! + fsDVersion"e !* saving to >! + q:.b(q2+12)"e !* and not read-only! + 1u1''' !* then we save! + q1u:.b(q2+10)  !* just store the answer! + +!& Auto Save File:! !S Subroutine that may write out an auto save file. +NUMARG is Buffer Index of buffer in .B to save. +We run Before Auto Save Hook and After Auto Save Hook if non-0.! + + m(m.m& Declare Load-Time Defaults) + Before Auto Save Hook, If non-0 is run just before auto saving: 0 + After Auto Save Hook, If non-0 is run just after auto saving: 0 + Auto Save Star, * If non-0, user wants * in mode line after auto-save: 0 + + + [1[2[3[4 0f[VB 0f[VZ !* Wide bounds.! + + -qBuffer Index"e qBuffer filenamesu1' !* 1: buffer filenames! + "# q:.b(+2)u1' !* ...! + q1"e @ftNo auto save filenames.  0fsEchoActivew ' + + q1f[DFile !* set default to buffer filenames.! + + !* Now figure what version to use.! + + fsURead"n e[fne]' !* maybe push input file! + 1:< 1,er fsIFileu3 fsIFVersionu4 fsIFCDateu2 ec + !* 3: Full filename of highest version.! + !* 4: Its version number.! + !* 2: Its creation date.! + + q2-(0fo..qASav 3 File)"e !* Was an auto save version already.! + q4fsDVersionw !* so save to that version again! + fsDFileu1 !* ...! + etASAVE OUTPUT' !* but open ASAVE.OUTPUT on TNX to! + !* prevent a crash from leaving a zero! + !* length file! + >w !* end of errset! + + qBefore Auto Save Hookf"nu2 m2'w !* Run before hook if non-0.! + + fsUWrite"n e\fne^' !* maybe push output file! + ei fsOFCDateu2 !* 2: Its creation date.! + hp ef1 !* restore filenames to force EF to! + !* rename, and write it out.! + fsOFVersionf"gu:.b(+9) 1fsModeChange'w !* save actual version number! + zu:.b(+5+6) !* Update size last read/saved.! + fsOFileu1 !* 1: Auto save files full name.! + q2u:.b(+8) !* Update buffer date field.! + q2m.vASav 1 Filew !* Declare it an autosave file.! + @ftAuto saved: 1 + !* tell user exact filename written! + + qAfter Auto Save Hookf"nu1 m1'w !* Run after hook if non-0.! + + 0fsXModifiedw !* Lets not save it again.! + qAuto Save Star"e 0fsModifiedw' !* if user wants star to go away, make it! + !* go away! + 0fsEchoActivew  + +!^R Save File:! !^R Write out a user-save file if needs it. +A user-save file is one written by user decision, and therefore never to + be touched by auto saving. E.g. a high-level backup point. +Declares this version to be a user-saved file, i.e. NOT an auto saved + one. Thus, auto saving will not occur to this version again. +Given an explicit NUMARG, we just run & Auto Save File, to ensure that the + file is currently safe, if not user-level consistent: thus this will + keep the file declared an auto save file. +A NUMARG of 16 or greater calls & Auto Save All Buffers.! + + -16:"l m(m.m& Auto Save All Buffers)w 1' + :i*CfsEchoDis !* clear echo area! + ff"g !* NUMARG.! + fsXModified"e @ft(No changes need to be written) + 0fsEchoActivew 1' !* tell user buffer doesnt need changing! + @ft(auto save) + !* or tell him auto save started! + qBuffer Indexm(m.m& Auto Save File) !* auto save current buffer! + 1' !* ! + + [1[2[3[4 f[DFile !* Should we be saving default?! + 0f[VB 0f[VZ !* Wide bounds.! + qBuffer Filenamesf"ew :i*No filenames to save underfsErr + 'u1 !* 1: User-save filenames.! + et1 !* Set default! + q1u2 !* 2: Start with filename in case the! + !* input below gives an error.! + fsURead"n e[fne]' !* maybe push input file! + 1:< 1,er fsIFileu2 fsIFVersionu3 fsIFCDateu4 ec + !* 2: Highest version filename.! + !* 3: Its version number.! + !* 4: Its creation date.! + q4-(0fo..qASav 2 File)"e !* That is an auto save file.! + q3fsDVersionw !* So re-use that version.! + fsDFileu1 !* ...! + etASAVE OUTPUT' !* on TNX, open different filename to! + !* prevent a crash from leaving a zero! + !* length file! + + + q:.b(qBuffer Index+8)u3 !* read or wrote the file.! + q4"n q3"n q4-q3"n !* If not, warn user he may be losing.! + ftThis file has been written on disk since you last read or wrote it. +Should I write it anyway + m(m.m& Yes or No)(f 0u..h)"e 0'''' + >w + + fsXModified"e @ft(No changes need to be written) +' + "# fsUWrite"n e\fne^' !* maybe push output file! + ei fsOFCDateu3 !* 3: Its creation date.! + hp ef1 !* restore filenames to force EF to! + !* rename, and write it out.! + fsOFVersionf"gu:.b(+9) 1fsModeChange'w !* save actual version number! + zu:.b(qBuffer Index+5+6) !* Update size last read/saved.! + fsOFileu2 !* 2: User save files full name.! + q3u:.b(qBuffer Index+8) !* Update buffer date field.! + @ftUser saved: 2 + + 0fsXModifiedw' !* no longer needs auto saving! + fs^RMDlyfs^RMCntw !* not even in near future! + 0fsModifiedw !* no longer needs user saving! + + m(m.mKill Variable)ASav 2 Filew + !* Remove any assertion that this was an auto save file. Note! + !* that this is not conditional on fsModified since the buffer! + !* may have just been written out due to an auto save.! + !* However, we must at least declare that auto saved file to! + !* now be a user saved file.! + + 0fsEchoActivew 1  + +!& Secretary Macro:! !S ..F: Auto save for use in ^R mode editing. +The buffer is auto saved after every fs^RMDly characters. +Auto saving happens by calling & Auto Save File.! +!* I (ECC) think that Teco must be the one to reset fs^RMCnt, and it + * does it after we are done -- and if we get an error it is not reset. + * So if we are not careful if someone gets a write error (e.g. no + * access) the ..F will go off again the very next character they type. + * For now, until we have a better solution, I am having ..F reset + * fs^RMCnt from fs^RMDly itself once it decides to call & Auto Save File.! + + qBuffer Index[1 !* 1: index of current buffer! + q:.b(q1+4)[..o !* Teco-select the current EMACS! + !* buffer -- i.e. dont let any temp! + !* teco buffers get in the way.! + fsXModified"e 1' !* Buffer doesnt need saving.! + q:.b(q1+10)"e 1' !* Not supposed to save it.! + + :i*CfsEchoDis @ft(auto save) + 0fsEchoActivew !* tell user what we are up to.! + fs^RMDlyfs^RMCntw !* Reset count before chance of bad error! + q1m(m.m& Auto Save File) !* auto save current buffer! + 1 + +!& Auto Save All Buffers:! !S For each buffer that requires it. +I.e. for each that is modified and has auto saving on. +& Auto Save File is called.! + + 0[1 [2 -1[3 [..o !* 1: .B index, 3: saved count! + < 1f !* end auto save test catch! + q1+q:.b(q1)u1 !* 1: move to next buffer slot.! + q1-(fq.b/5); > !* Continue till done .B! +  + +!& Real-time Interrupt:! !S Save file after 5 minutes of idle time.! + 0fsTyiCount"n 0' !* User has been typing in last 5 minutes! + !* so dont save -- this is an easy way of! + !* avoiding possible messup of the screen! + !* at funny times (like in & Read Line) or! + !* to avoid being obnoxious to use and! + !* saving the current buffer 2 characters! + !* after it was just saved.! + m(m.m& Auto Save All Buffers) + 0@v 0 diff --git a/src/emacs1/dired.205 b/src/emacs1/dired.205 new file mode 100755 index 0000000000000000000000000000000000000000..f782187bb38ec8e0e87a691a89429ef057da01dc GIT binary patch literal 32717 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 literal 0 HcmV?d00001 diff --git a/src/emacs1/taggen.45 b/src/emacs1/taggen.45 new file mode 100755 index 00000000..d6e43cf1 --- /dev/null +++ b/src/emacs1/taggen.45 @@ -0,0 +1,316 @@ +!*-*- Teco -*-*! + +!~Filename~:! !Macros for supporting Emacs TAGS file setup! +TAGGEN + +!Generate Tags File:! !S Make updates to an existing TAGS file as needed +Reads a string argument of a TAGS file to be updated. The file must be in +standard tags file format... eg, + + , + + + + , + + + ...etc... +! + + f[dfile !* Bind Teco Default File ! + f[bbind !* Bind temp buffer ! + fsmsnamefsdsname !* Default file uses working dir ! + et FOO_TAGS  !* Default fn1,fn2 is FOO TAGS ! + 5,f Tags_File !* Get filename in qF ! + etF !* Use defaults ! + e?"n :i*NSF No_Such_Filefserr' !* Err if no such file ! + er @y !* Yank file ! + + !* Purge stale data if any ! + + <.-z;2l.,(sr.)kl>j !* Delete cruft ! + + !* Process new tags stuff ! + + + [T[F[N[L[P[X !* qT = Main Tags Table Buffer ! + !* qF = Temp Filehacking Buffer ! + !* qN = Filename being hacked ! + !* qL = Language being hacked ! + !* qP = Point of file data start ! + !* qX = Random Temporary ! + + q..OuT !* Current buffer is qT ! + f[bbindw q..OuF !* Make new buffer for qF ! + qTu..O !* Get back tags buffer ! + <.-z; .uP !* Stop at end of tags buffer ! + 1:xN !* Get filename into qN ! + l 1a"d \w 1a-,"e oGoodSyntax'' + :i*SYN Illegal_Syntax_in_Tags_File fserr + !GoodSyntax! !* Come here if syntax correct ! + d 0k i00000, !* Insert 5 digits ! + 1:xL !* Get language in qL ! + l !* Put cursor in position ! + qFu..O !* Get filehacking buffer ! + f[dfile !* Bind default file ! + e?N"n :i*FNF File_Not_Foundfserr' + er@y !* Yank file into buffer ! + f]dfile !* Unbind default file ! + 1,m.m &_Tags_Process_L_Bufferf"n[0 + qT m0 w ]0' !* Macro hook if exists ! + "#w :i*UTL Unknown_TAGS_Language:_"L"!''!fserr' + hk qTu..O !* Get Tags buffer back ! + l .( .-qP:\uX fqX-5"g :i*FTL File_Too_Largefserr' + qPj l 5d 5-fqX,0i gX !* Insert Number of chars to jump ! + )j !* Return where we started ! + > !* Loop getting more files ! + ew hp ef !* Write it out ! + qFu..O !* Set up for unwinding ! +  !* Pop the world ! + +!& Tags Default Snarf:! !& Snarf start of line to point into arg buffer +with a precomma arg, get arg1,point into arg2 buffer ! + + g( .( !* Get point ! + g( ff&2"n,.'"#0'x*( !* ... but first preceding cruft ! + [..O )) !* ... but first change buffer ! + i› !* ... and insert rubout ! + )) iî  w !* Return ! + + +!& Tags Process LSPDOC Buffer:! !& Process tags for a buffer of Lisp doc ! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:sBegin-Entry:; !* Find entry starts ! + :l mS !* Snarf data ! +> !* Loop ! + !* Return ! + +!& Tags Process MAXDOC Buffer:! !& Process tags for a buffer of Macsyma doc ! + +m.m &_Tags_Default_Snarf !* Get temp ! +:<:s&; !* Search for & not preceded by ^Q ! + fk+1+.,(@fll)mS !* Snarf data ! + > !* Loop ! + !* Return ! + +!& Tags Process BLISS Buffer:! !& Process tags for a buffer of BLISS code ! + +m.m &_Tags_Default_Snarf !* Get temp ! +:<:S routine; !* Search for `routine` ! + fk+1+.,(fwl)mS> !* Snarf the data, looping ! + !* Return ! + +!& Tags Process Macsyma Buffer:! !& Process tags for a buffer of Macsyma code ! + +!* *! +!* In MACSYMA code, a function definition is recognized when there is *! +!* a symbol at the beginning of a line, terminated with a "(" or "[", *! +!* and there is a ":" later on in the line. If the symbol itself is *! +!* terminated with a ":", a variable definition is recognized. *! +!* *! + +m.m &_Tags_Default_Snarf !* S: Useful tagging macro ! + +[1 !* 1: Temp for holding old position ! +< .u1 !* q1 remembers this place ! + :s;$"\/*;!'!; !* Search for interesting chars ! + 0a-* "e s*/ oEnd' !* Ignore comments ! + 0a-"!'!"e r s\" !'! oEnd' !* Ignore strings ! + 0a-\ "e c oEnd' !* Ignore \'d stuff ! + !"l + !* Finally, find label for line ! + :l mS !* if it is there, snarf it ! + q1j' !* Move to end of field ! + !End! > !* End of loop ! + !* Return ! + +!& Tags Process LISP Buffer:! !& Process tags for a buffer of LISP code ! + +m.m &_Tags_Default_Snarf [S !* S: Useful tagging macro ! + 0 [0 !* 0: Temp ! + :i* (DEF (SETQ [1 !* 1: Kinds of defs we seek ! + !* ! +j < :s(@DEFINE; !* Search for other stuff ! + -@fll .-1,( 2@fll ),mS !* Index that, too, just for fun ! + -@flx0 :i11 (0 !* Get new @DEFINE thing to find ! + > !* Loop ! + !* ! +j < :s1; !* Search for one of these ! + -@fll 2@fll mS > !* and index it if found ! + !* ! + !* Return ! + + +!& Tags Process SCHEME Buffer:! !& Process tags for a buffer of Scheme code ! + +f:m(m.m &_Tags_Process_Lisp_Buffer) !* Go where we shoulda been ! + + +!& Tags Process TJ6 Buffer:! !& Process tags for a buffer of TJ6 code ! + +!* *! +!* In TJ6 text, any line which starts with .C TAG starts a tag. The *! +!* name of the tag is whatever follows the spaces which should follow the *! +!* "C TAG", up to the next space or the end of the line. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s .C_TAG_; !* Find tags ! + @f_l :fb_"e :l' mS !* Snarf data ! +> !* Loop ! + !* Return ! + + +!& Tags Process MUDDLE Buffer:! !& Process tags in a buffer full of MDL code! + +!* *! +!* In MUDDLE code, a tag is identified by a line that starts with *! +!* " !* Loop ! + !* Return ! + + +!& Tags Process TECO Buffer:! !& Process tags in a buffer full of Teco code! + +!* *! +!* In TECO code, a tag starts with an exclamation mark and ends with a *! +!* colon followed by an exclamation mark. There may be any number of tags *! +!* on a line, but the first one must start at the beginning of a line. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s î !; !* Search for ^L ! + <:fb:!; !* Search for ! + :fb!"e :l 0; '> !* Hop across any number of tags ! + mS >  !* Snarf, Loop, Return ! + + +!& Tags Process R Buffer:! !& Process tags in a buffer full of R code! + +!* In R code, any line which starts with ".de" or ".am" or ".rtag" *! +!* defines a tag. The name of the tag is what follows, up to the second *! +!* run of spaces or the end of the line. There is no ".rtag" in R; *! +!* define it to be a null macro, if you like, and use it to put in tags *! +!* for chapters, or anything else. Any macro whose name starts with "de" *! +!* or "am" or "rtag", such as ".define" or ".amplify", also defines a *! +!* tag. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +< :s .de .am .rtag; !* Find the tags ! + -fwl @fll @f_ l !* Skip spaces ! + :fb_"e :l ' !* Find next spaces set or end of line ! +  mS !* Snarf the tag ! +>  !* Loop and return ! + + +!& Tags Process MIDAS Buffer:! !& Process tags for buffer of MIDAS code! + +!* *! +!* In MIDAS code, a tag is any symbol that occurs at the beginning *! +!* of a line and is terminated with a colon or =. Thus, MIDAS mode is *! +!* good for MACRO-10 also. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s ; r fwl !* Go over first token ! + 1af:=:"l c  mS' !* If token ends in : or =, take it ! +> !* Loop ! + !* Return ! + + +!& Tags Process MACRO Buffer:! !& Process tags for MACRO assembly language! + +!* *! +!* This is copied intact from the MIDAS code. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s ; r fwl !* Go over first token ! + 1af:=:"l c  mS' !* If token ends in : or =, take it ! +> !* Loop ! + !* Return ! + + +!& Tags Process FAIL Buffer:! !& Process tags for FAIL assembly language! + +!* *! +!* FAIL code is like MIDAS code, except that one or two 's or "^"'s *! +!* are allowed before a tag, and spaces are allowed between the tag name *! +!* and the colon or =, and _ is recogniized as equivalent to =. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s   ^; !* Look for Linefeed + ^A, ^ or alpha ! + r @f^ l @fll @f_ l !* Go over first token ! + 1af:=_:"l c mS' !* If it ends in a :, _, or =, take it ! +> !* Loop ! + !* Return ! + + +!& Tags Process TEXT Buffer:! !& Process tags in a buffer full of text! + +!* Text buffers have no tags, BUT they are useful to have in tags tables for *! +!* Emacs Tags Search mapping harmlessly through them ... *! + + !* Just return ! + + +!& Tags Process PALX Buffer:! !& Process tags in a buffer full of PALX code! + +!* *! +!* PALX code is like MIDAS code, except that spaces are allowed between *! +!* a tag and the following colon or equals, and local tags such as "10$" *! +!* are ignored. *! +!* *! + +m.m &_Tags_Default_Snarf !* Get temp ! +<:s ; r fwl !* Go over first token ! + 0a-$"n !* If not a $ tag ! + @f_ l !* Go over any whitespace ! + 1af:=:"l c  mS'' !* If token ends in : or =, take it ! +>  !* Loop and return ! + + +!Make Tags File:! !S Make a skeleton tags file for other routines to fill in. +Asks for output filename (the new TAGS file), and a list of (possibly wild) +input filespecs. Terminate list by typing just CR. +! + + [0 [1 [2 [3 [4 !* Save q-regs! + f[ D File !* Save default filespec! + f[ B Bind !* Scratch buffer! + f6TAGS fs d fn2 !* Default ext is tags! + :i*Output_tag_file:_,400001.:et !* Get output filespec! + :g(fs d file)u4 q4u1 !* Save it! + f6 fs d fn2 !* Default extension is nul! + < !* Loop to get input files! + 0fs d version q1u2 !* Default to the highest generation! + :i*Files:_,100.:et !* Get files to examine! + :g(fs d file)u1 !* Get name we just parsed! + f=12@; !* Exit if were the same (user typed CR)! + 1,111110000001.ez1 !* Put listing in buffer! + > !* Got all input filespecs! + j <.-z; !* For whole list! + .u0 :l !* Remember where line starts! + -2s. c .u1 s. .-1u2 !* Locate extension field! + :k 0\ !* Change generation to zero! + :i3NONE !* Default is NONE mode! + q1,q2f=MAC"e :i3MACRO' !* Midas assembler! + q1,q2f=MID"e :i3MIDAS' !* Macro assembler! + q1,q2f=TECO"e :i3TECO' !* Raw Teco! + q1,q2f=EMACS"e :i3TECO' !* Emacs Teco! + 13i 10i i, g3 13i 10i i !* Rest of skeleton! + .+7-q0u1 !* How long, including count and CRLF! + -l q1\ fku0 q0c q0+5,0i !* Put in length field, left fill zeros! + 2l> !* Done with loop! + e\ et4 :ew hp :ef !* Dump the tag table! + m(m.mGenerate_Tags_File)4 !* Flesh out skeleton! +  !* Bye! diff --git a/src/emacs1/vt100.49 b/src/emacs1/vt100.49 new file mode 100755 index 00000000..5513335e --- /dev/null +++ b/src/emacs1/vt100.49 @@ -0,0 +1,352 @@ +!* -*- TECO -*- ! +!* [MIT-XX]PS:VT100.EMACS.46, 14-Apr-85 21:55:07, Edit by SRA! +!* Left and right arrows were reversed for keypad, fixed.! +!* [WASHINGTON]PS:VT100.EMACS.45, 11-Oct-83 18:53:46, Edit by FHSU! +!~Filename~:! !A library for hacking EMACS on VT100's! +VT100 + +!& Setup VT100 Library:! !Things to do when this library loads +Define keypad handler, Redefine ^X), etc... ! + + [0 [1 + + 0fo..q Exit_to_Inferior_hooku1 + fq1"l :i1' + @:i*`1wm(m.m VT100_Normal_Keypad)`m.v Exit_to_Inferior_Hook + + 0fo..q Exit_to_Superior_Hooku1 + fq1"l :i1' + @:i*`1wm(m.m VT100_Normal_Keypad)`m.v Exit_to_superior_hook + + 0fo..q Return_From_Superior_hooku1 + fq1"l :i1' + @:i*`1wm(m.m VT100_Alternate_Keypad)`m.vReturn_From_Superior_hook + + 0fo..q Return_From_Inferior_hooku1 + fq1"l :i1' + @:i*`1wm(m.m VT100_Alternate_Keypad)`m.vReturn_From_Inferior_Hook + + m(m.m VT100_Alternate_Keypad) !* Put terminal in alt keypad mode! +0"n + fs osteco"n + m(m.aTRMTYP#_Trmtyp_VT100V)-fsrgetty"'e+( + m(m.aTRMTYP#_Trmtyp_VT100X)-fsrgetty"'e)"n + FT VT100_library_works_with_terminal_in_ANSII_mode_only. + Use_terminal_type_VT100_or_VT100W.''' + m.v VT100_Dispatch_Table + 128m(m.m Make_Prefix_Char)VT100_Dispatch_Tableu..O + qVT100_Dispatch_Table[0 + qPrefix_Char_List[3 + :iPrefix_Char_List3 Keypad__qVT100_Dispatch_Table + + m.m ^R_Up_Real_Lineu:0(A) !* Uparrow! + m.m ^R_Down_Real_Lineu:0(B) !* Downarrow! + 2fs^R Init u:0(D) !* Leftarrow = C-B.! + 6fs^R Init u:0(C) !* Rightarrow = C-F.! + m.m ^R_VT100_Define_KBD_Mac u:0(M) !* Enter starts or stops keyboard macro.! + m.m ^R_VT100_Comma u:0(l) !* Comma! + m.m ^R_VT100_Minus u:0(m) !* Minus sign on numeric keypad.! + m.m ^R_Documentation u:0(n) !* Dot! + m.m ^R_VT100_Arg_Digit[1 + p-1[2 + 10< q1u:0(%2) > !* Digits on numeric keypad.! + 0fo..q VT100_Setup_Hooku1 + q1"n m1' +  + +!VT100 Alternate Keypad:! !C Sets alternate keypad mode for VT100's +When this command is executed, the numeric keypad can be used to enter +arguments for the following function. Numbers are entered as themselves, +dot and "enter" key on the pad are also changed.! + + :I*=[?1hFS IMAGE OUT !* Put VT100 in application mode ! + +!VT100 Normal Keypad:! !C Undos alternate keypad mode for VT100's +When this command is executed from a VT100, the keys on the keypad become +functionally identical to the standard digit keys. See VT100 Alternate Keypad +for a description of the alternative.! + + :I*[?1l>FS IMAGE OUT + +!^R VT100 Define Kbd Macro:! !^R Start or Stop defining kbd macro. +When stopping, we ask for a key to to place the kbd macro on.! + + fs tyi sink"e !* If not defining something, ! + F@:m(m.m ^R_Start_Kbd_Macro)' !* Start definition ! + "# + 1m(m.m ^R_End_Kbd_Macro) !* Else stop defining! + m(m.mName_Kbd_Macro)' !* and put the definition somewhere.! +  + +!^R VT100 Minus:! !^R Negate numeric argument.! + -u..1 :m(q..1+200.@fs^R Init) + +!^R VT100 Arg Digit:! !^R Digit of numeric argument.! + q..1-p+0u..0 :m(q..0+200.@fs^R Init) + +!^R VT100 Comma:! !^R Run precomma arg! + + 0fs^RArg 0fs^RArgp !* Zero argument ! + ,@m(@fif(f(fs^Rlastw)u..0)@fs^RCmacro)@v !* Call first char specially ! + q0(]0)'( + )')@m(@fif(f(fs^Rlastw)u..0)@fs^RCmacro)@v> + 0 + +!C132 Mode:! !C Put VT100 in 132 column mode and change ^S/^Q +^R Incremental search becomes ^\. ^Q inside search becomes ^^. +Outside of searches, you must use ^^Q to quote a character.! + + m(m.mVT100_Page_Mode) !* Set new incremental search cmds! + :i*[?3hfs image out !* Set 132 column mode! + 131fs width + -1fs pjatyf+ !* Need to refresh whole screen! + +!C80 Mode:! !C Put Vt100 in 80 column mode (see C132 Mode)! + + -1m(m.mVT100_Page_Mode) !* Set new incremental search cmds! + :i*[?3lfs image out !* Set 80 column mode! + 79fs width + -1 fs pjatyf+ !* Refresh screen! + +!VT100 Page Mode:! !C Set Page Mode and change incremental search cmds. + C-X C-S becomes C-X S + C-X C-Q becomes C-X ~ + C-S becomes C-\ + C-Q within a search becomes C-^ (C-` on the VT100 keyboard). + C-Q outside a search becomes C-^^ (C-` C-`) + +To search for ^Q or ^S, do within search C-^ Q or C-^ S, resp. M-* inserts a +^Q into the buffer. A negative arg turns this lossage off.! + + "L + Qm.vSearch_Quote + m.m^R_Incremental_SearchFO..qControl_S_CommandU.S + m.m^R_Quoted_Insertfo..qControl_Q_CommandU.Q + q.\fo..qControl_\_Commandu.\ + q:.X(~)fo..qPrefix_~_Commandu:.X(~) + q:.X(S)fo..qPrefix_S_Commandu:.X(S) + q..*fo..qMeta_*_Commandu..* + 1fsttpagwfsttyinit + ' + -1fsttpagmode + q.Sm.vControl_S_Command + q.Qm.vControl_Q_Command + q.\m.vControl_\_Command + q:.X(S)m.vPrefix_S_Command + q:.X(~)m.vPrefix_~_Command + q..*m.vMeta_*_Command + ^m.vSearch_Quote + m.m^R_VT100_Incr_SearchU.\ + m.m^R_Quoted_Insertu. + Q:.X()U:.X(S) + Q:.X()U:.X(~) + :i*-1fsttpagmodeu.S + :i*-1fsttpagmodeu.Q + :i*21.iU..* +  + +!^R VT100 Incr Search:! !^R Search for character string as you type it. +C-^ quotes special characters. Rubout cancels last character. +C-\ repeats the search, forward, and C-R repeats it backward. +C-R or C-\ with search string empty changes the direction of search +or brings back search string from previous search. +Altmode exits the search; with search string empty +it switches to non-incremental ^R String Search. +Other Control and Meta chars exit the search and then are executed. +If not all the input string can be found, the rest is not discarded. +You can rub it out, discard it all with C-G, exit, +or use C-R or C-\ to search the other way. +Quitting a successful search aborts the search and moves point back; +quitting a failing search just discards whatever input wasn't found. +On printing terminals, C-L types line found but doesn't exit the search.! + + [D !* QD is direction and # times to search.! + 0[L !* QL > 0 iff failed to find current search string,! + 10.[R !* QR is state register: ! + !* 40. => ^R or ^S repeating search or gobbling default.! + !* 10. => just starting.! + !* 4 => printing char just read.! + !* 2 => rubout just done wants full redisplay.! + !* 1 => rubout just done.! + + [Q @:iQ` !* MQ pushes current info: ., qL, q2, q0, qD.! + q4+1*5-fq3"e !* We are going to push in q3, so make sure space exists.! + q3[..o zj + 200,0i ]..o' + .u:3(%4) !* Push point, search string,! + qLu:3(%4) + q2u:3(%4) + q0u:3(%4) !* this character, and current direction of search.! + qDu:3(%4) + ` + + [T + fs tyi sourc"e + @:iT` !* MT updates the echo area.! + Q9-Q.9"N 2[R' Q9U.9 !* Q9 holds prompt for echo area. Redisplay if changed.! + fs rgetty"n 2&qR"n !* If we need to redisplay the whole thing,! + qc fs echo dis !* home up and clear line first,! + @ft 9:_ q2u8'' !* then type the prompt and decide to retype whole string.! + @ft 8 :i8  !* Update displayed search string.! + ` ' + "# :iT' !* Don't display if inside a macro.! + + [C :IC TL !* QC has string to home up in echo area and clear line.! + [0 !* Q0 holds type-in character being processed.! + [2 :i2 !* Q2 holds accumulated search string.! + [8 :i8 !* Q8 has accumulated stuff to type in echo area.! + [9 !* Q9 has [Failing ][Reverse ]Search for echo area.! + 0[.9 !* Q.9 has last value of Q9 actually displayed.! + 1fo..qSearch_Exit_Option !* QE nonzero => random control chars exit.! + 200fs q vector [3 !* Q3 holds stack for partial search strings.! + -1[4 !* Q4 is stack pointer.! + [5 !* Q5 is random temp.! + .[P !* QP has old point (to maybe push at end).! + [S :IS M.M&_Isearch_RuboutUS :MS !* QS has & Isearch Rubout (autoloading)! + :I* M(M.M&_Isearch_Help) F[Help Mac + 1f[noquit + [6 [7 !* Q6 and Q7 are the success and failure echo strings.! + qD"g :i6I-Search :i7Failing_I-Search' + qD"l :i6Reverse_I-Search :i7Failing_Reverse_I-Search' + q6u9 !* Search starts out successful.! + + 0[I !* QI is nonzero when we are reading input.! + + fs rgetty"e + fs tyi sourc"e @ft _S:_' !* On printing tty, start typing out.! + 1fstypeo'' + + !Restart! + + 1:< 1uI -2f[noquit !* Set up an errset to catch quits.! + < qL"e q6' "# q7'u9 q9-q.9"n mt' !* Display direction and status in echo area.! + 0@V 1uI :fiu0 0uI @fiu5 + q5fs^r indir-qSearch_Exit_Char"e fq2:@; + ! 0fsnoquitw qD:m(m.m ^R_String_Search)' + q5-8"e o Funny' + q5-176."g o Funny' + q5-"e o Control' !* If Altmode isn't the exit char, it's like a ctl char! + q5-î"e  FS REREAD' + + !Normal! + + 4uR !* Handle printing char.! + mQ !* Push ., qL, q2, q0 and qD into q3, for rubbing out.! + :i2 2 0 !* stick this char at end of search string,! + fs tyi source"e !* If not inside a keyboard macro,! + fq8"n mt' !* Update the display.! + @ft 0 + "# + + !Try! !* Note if fall through we are inside a failing conditional.! + + mt !* Update the displayed search string.! + '' + qL"n !' !* No point in searching if know it would fail.! + + .u5 + 40.&qR"e !* For ^S, ^R suppress the moving back so don't no-op.! + qD"g fq2-1r' !* Move back, so that from FO/\O we find the FOO.! + "# fsz-qP f[ vz + fq2-1"g fq2:c"e zj'' + f]vz'' !* After finding FO backwd, move fwd 3 so can find FOO.! + qD:s2"l !' + q5j 1uL fg ! !* But if search fails, undo that motion back.! + + !Funny! + + q5-177."e o Rubout' + !* Only control characters and backspace get past here.! + q5&537.-\"e o Forward' !* Check for C-S and C-s (ignore case bit).! + q5&537.-R"e o Backward' !* Note: mustn't change q5 since Control rereads it.! + q5&537.-qSearch_Quote"e o Quote' + q5&537.-L"e fs rgetty"e o Reprint' o Control' + qE"e o normal' + o Control + + !Reprint! !* ^L on printing tty prints current line.! + 0t ft..a t + ft _S:_2 !* Then re-prompt.! + ! + + !Quote! !* ^Q quotes the next character.! + + 1f[noquit + fs osteco"n -1f[helpch' + fiu0 + q0-S"e u0' + q0-s"e u0' + q0-Q"e u0' + q0-q"e u0' + fs osteco"n f]helpch' + 0fs quitw f]noquit + o normal + + !Forward! !* ^S means search again forward.! + + qD"l :i6I-Search :i7Failing_I-Search' + q4"L qD"g o Default' !* ^S as 1st char going fwd => gobble default string.! + "# 1uD !'' !* ^S as 1st char, going backward, changed to fwd.! + mQ !* Push ., qL, q2, q0 and qD into q3.! + qD"L 0uL' !* If reversing direction, don't assume search will fail.! + 1uD !* String not null: make sure going fwd,! + 40.uR !* Mark us as a ^S so don't change search string,! + o try !* just search for it a second time.! + + !Backward! !* ^R means search again backward.! + + qD"g :i6Reverse_I-Search :i7Failing_Reverse_I-Search' + q4"L qD"l o Default' !* ^R as 1st char going backwd => gobble default string.! + "# -1uD !'' !* ^R as 1st char, going forward, changed to backwd.! + mQ !* Push ., qL, q2, q0 and qD into q3.! + qD"g 0uL' !* If reversing direction, don't assume search will fail.! + -1uD !* String not null: make sure going backwd,! + 40.uR !* Mark us as a ^R so don't change search string,! + o try + + !Default! !* Come here to use default search string.! + + mQ !* Push current state so can rub the default out.! + qSearch_Default_Ring[..o !* Find the default! + .fs word u2 ]..o !* and gobble it.! + fq2"l :i2' + q2u8 + 40.uR !* Inhibit moving back before starting to search.! + o try + + !Rubout! + + q4"l fg !' !* Rubout when string is empty does nothing.! + ms !* Call & Isearch Rubout.! + qL"e q6' "# q7'u9 !* Fix displayed direction and status for echo area.! + mt ! !* Redisplay and loop back.! + + !Control! + + q5 fs reread + 0; + + > + f]noquit + >u0 @feqit-q0"e @fg !* If we quit, record in journal file.! + !* Record Rubout if quit while searching,! + !* record :^G if failing or waiting for input.! + qL"'gqI"N :i*:' "# :i*_›' fsjrn wr + QL"g mt !* If failing, rub out the unfound chars and restart.! + o Restart' + qI"e ms mt o Restart' !* If quit while actually searching, restart.! + QPJ 0fsnoquit + -1fsquit' !* If succeeding, restore starting point and quit.! + q0f"n fs err' !* Error not a quit => pass it on.! + + fq2"g + qSearch_Default_Ring [..o !* New search char, save prev default.! + fq(.fsword)-1"G 5c .-z"e j'' !* If previous default is worth saving, push it! + q2,.fsword !* Store current (new) default! + ]..o' + + fs tyi source"e @ft  ' !* Echo an altmode to show we have exited.! + qP mMM_&_Maybe_Push_Point !* Maybe leave mark at place search started.! + 0 diff --git a/src/emacs1/vt52.4 b/src/emacs1/vt52.4 new file mode 100755 index 00000000..c62e5e89 --- /dev/null +++ b/src/emacs1/vt52.4 @@ -0,0 +1,55 @@ +!~Filename~:! !VT52 numeric keypad argument accumulation! +VT52 + +!& SETUP VT52 LIBRARY:! !S Define Meta-? for VT52 keypad hacking.! + + M.M&_VT52_KEYPAD_PROCESSORU..? + +!VT52 Alternate Keypad:! !C Turns on alternate keypad mode for VT52. +When this command is executed, the numeric keypad can be used to enter +arguments for the following function. Numbers enter as themselves and +the "." key serves as minus.! + + 27FSIMAGEOUT + 61FSIMAGEOUT + +!VT52 Normal Keypad:! !C Turns off alternate keypad mode for VT52. +The keys on the keypad become functionally identical to the standard +digit keys. See VT52 Alternate Keypad for a description of the +alternative.! + + 27FSIMAGEOUT + 62FSIMAGEOUT + +!& VT52 KEYPAD PROCESSOR:! !S Processes VT52 keypad argument digits. +This macro is intended to be put on meta-? so that when a VT52 +is in VT52 Alternate Keypad mode, to enable the special functions +such as argument accumulation of digits.! + + FI[A + FS^RARGP"E @FT +ARG: ' + QA-112"L OUNDIGIT' + QA-121"G OUNDIGIT' + FS^RARG"L + Q.Y-1"E-1*(QA-112)FS^RARG' + "# FS^RARG*10-QA+112FS^RARG'' + "# FS^RARG*10+QA-112FS^RARG' + Q.Y+1U.Y + QA-64UA + @FTA + OEXIT + + !UNDIGIT! + QA-77"E M(M.M^R_DESCRIBE) OEXIT1' + QA-110"E + FS^RARGP"G FG OEXIT' + -1FS^RARG + @FT- + 1U.Y' + !EXIT! + 0FS^RLAST + 3FS^RARGP + !EXIT1! + 0FSECHOACTIVE +