From aba51512d7c2d3f00e65ed8b7ebe04935a61bc57 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 26 Aug 2021 08:28:49 +0200 Subject: [PATCH] CLU mode for EMACS. Also CLU-MORE library. --- build/emacs.tcl | 2 + build/timestamps.txt | 2 + src/emacs1/clu.513 | Bin 0 -> 28236 bytes src/emacs1/clu2.2 | 286 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 290 insertions(+) create mode 100644 src/emacs1/clu.513 create mode 100644 src/emacs1/clu2.2 diff --git a/build/emacs.tcl b/build/emacs.tcl index 26b71b4a..3a72cc27 100644 --- a/build/emacs.tcl +++ b/build/emacs.tcl @@ -51,6 +51,8 @@ respond "\n" "\033xgenerate\033emacs;abstr\033emacs1;abstr\r" respond ":EJ" "\033xgenerate\033emacs;auto-s\033emacs1;auto-s\r" respond ":EJ" "\033xbare\033emacs1;bare\r" respond "\n" "\033xgenerate\033emacs;c\033emacs1;c\r" +respond "\n" "\033xgenerate\033emacs;clu\033emacs1;clu\r" +respond "\n" "\033xgenerate\033emacs;clu2\033emacs1;clu2\r" respond ":EJ" "\033xgenerate\033emacs;complt\033emacs1;complt\r" respond ":EJ" "\033xgenerate\033emacs;delim\033emacs1;delim\r" respond ":EJ" "\033xgenerate\033emacs;dired\033emacs1;dired\r" diff --git a/build/timestamps.txt b/build/timestamps.txt index fcaab2d4..bacabfa1 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -349,6 +349,8 @@ emacs1/bare.18 198904020122.07 emacs1/buffer.207 198904020122.25 emacs1/c.1 198904020122.28 emacs1/ccl.196 198904020122.32 +emacs1/clu2.2 198904012322.37 +emacs1/clu.512 198904012322.35 emacs1/complt.5 198402211732.30 emacs1/crl.208 198904020122.46 emacs1/delim.21 198904020122.50 diff --git a/src/emacs1/clu.513 b/src/emacs1/clu.513 new file mode 100644 index 0000000000000000000000000000000000000000..b733132c51a3a82a48760a56a87f43d6aaa790ce GIT binary patch literal 28236 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 !* emacs:efork doesn't let us call! + !* ^R Invoke Inferior from a macro right! +:@I*/M(M.M &_Internal_CLU_Mode_Hook )/ [6 +0 M.V TLINK_Fork  !* define a variable to hold the index! +:FO..Q CLU_Mode_Hook "L + Q6 M.C CLU_Mode_Hook  ' + "# + F[ B BIND + GCLU_Mode_Hook G6 0,.XCLU_Mode_Hook ' + + +!& Internal CLU Mode Hook:! !S Set up additional keys for CLU Mode! + +!* set up C-A to go to a line! +M.M ^R_New_Beginning_of_Line  M(M.M Make_Local_Q-reg) .A +0 + +!^R New Beginning of Line:! ! Go to beginning of line. +If given an argument, goes to that line in the buffer. (Absolute reckoning)! + +FF"G !* go to the line specified by the arg! + BJ F-1L' +"# 0L' + +!Document New CLU Functions:! !C Prints documentation for the new EMACS CLU functions. + +The following keys have been defined: + + C-\ C Compiles a clu program, then runs C-\ E + C-\ J Runs an inferior TLINK. + C-\ T Fancy run TLINK - tries to reload changed binaries. + C-\ E After a CLU compile (M-&), displays the error file in the top + four lines of the screen. Moves the cursor to the first error. + C-\ N Advances the cursor to the next error, displaying the error at + the top of the screen. +! +m(m.mDescribe)Document_New_CLU_Functions  + +!^R Compile CLU and Edit Errors:! !^R Run (hacked) M-&, then C-\ E +Runs a hacked version of M-& which doesn't do View File on the errors, +Then runs Edit Clu Errors.! + m(m.m ^R_Better_CLU_Compile ) + m(m.m ^R_Edit_CLU_Errors ) + +!& Fancy Run Tlink:! !^R Fancy Run Tlink:! !Runs an inferior TLINK. +Give the command an argument of zero to kill the inferior.! + [0 :@I0/_Type_`valret_("\n")'_to_return_to_EMACS + / + FF"E Orun it ' + "E !* we have an argument! + @FT Killing_old_Tlink + 0FS ECHO ACTIVE + -QTLINK_Fork F"N FZ' !* kill it.! + 0UTLINK_Fork' !* forget about it...! + "# !run it! + !* get the file name to load ! + QBuffer_Name M(M.M &_Find_Buffer) [B + Q:.B(QB+2!*bufvis!)[F + QF"N + F[ D FILE ETF + FS D FN1UF + FS D FN2[1 F=1CLU"N 0UF'' + @FT0 0FS ECHO ACTIVE + QTLINK_Fork"E !* do we need to start one?! + QF"E FZSYS:TLINK.EXE U TLINK_Fork ' + "# FZSYS:TLINK.EXE_F U TLINK_Fork ' ' + "# + QF"E -1,QTLINK_Fork FZ  ' + "# -1,QTLINK_Fork FZ load("F") +  !''! '' + + FI @V '  !* gobble the valretted character! + +!& Run Tlink:! !^R Run Tlink:! !Runs an inferior TLINK. +Give the command an argument of zero to kill the inferior.! + [0 :@I0/_Type_`valret_("\n")'_to_return_to_EMACS + / + FF"E Orunit ' + "E !* we have an argument! + @FT Killing_old_Tlink + 0FS ECHO ACTIVE + -QTLINK_Fork F"N FZ'' !* kill it.! + "# !runit! + @FT0 0FS ECHO ACTIVE + QTLINK_Fork "E FZ SYS:TLINK.EXE UTLINK_Fork' + "# QTLINK_Fork FZ' + FI' !* gobble the valretted character! + +!^R Edit CLU Errors:! ! Edit the lines with errors in two window mode. +^R Edit Next CLU Error will go the next line in error.! + + M(M.M &_Initialize_CLU_Error_Buffer) M.V Current_Clu_Error + + QCurrent_Clu_Error "E :I*NER No_Errors FS ERR ' + QCurrent_Clu_Error F"L FS ERR' W + 0J QCurrent_Clu_Error-1L + + :I**Clu_Errors* M(M.M &_Find_Buffer) [B !* ERRORS BUFFER => QB! + Q:.B(QB+4!*bufbuf!) M.V Errors_Buffer_Buffer + + 0FO..QWindow_2_Size"N + :I*A2W Already_Two_Windows FS ERR' + fs rgetty"e + :I*TTY You_are_on_a_printing_terminalFS ERR' + MMM_&_Check_Top_Levelwindows + [Previous_Buffer !* Don't set Previous Buffer to buffer of window we leave.! + QBuffer_Name M.V Window_2_Buffer + QBuffer_Name M.V Program_Buffer_Name + Q:.B(QB+4!*bufbuf!) M.V Other_Window_Buffer + FS WINDOW M.V Window_2_Window + . M.V Window_2_Pointer + FSLINES M.VDefault_Size + FS LINESF"E + FS HEIGHT-(FS ECHO LINES)-1 ' M.V Total_Size + 4 M.V Window_1_Size !* ERRORS WINDOW = 4 LINES! + :@I*/*Clu_Errors*/ M.V Window_1_Buffer + QOther_Window_Buffer[..O . M.V Window_1_Pointer + . M.V Window_1_Window ]..O + QWindow_1_Size[0 + QTotal_Size-1-Q0:"G !* If old window 1 size is unreasonable, fix it up.! + QTotal_Size/2U0 Q0UWindow_1_Size' + 1F[NOQUIT + QTotal_Size-1-Q0 M.V Window_2_Size + + !* This refresh mechanism may not work right. I will probably have! + !* to re-write it! + FS REFRESHM.V Window_1_Refresh + M.M &_Multi-window_Refresh FS REFRESH + "N Q0 FS LINESW + Q:.B(QWindow_2_Buffer M(M.M &_Find_Buffer)+4!*bufbuf!) M.V Other_Window_Buffer + F]NOQUIT + M(FS REFRESH)W ' !* If cursor should stay in top window, display bottom one.! + Q0 FS TOP LINE !* Else, draw the line of dots, and switch into bottom! + :FT FS WIDTH/10 0U..H !* window, causing it to be displayed.! + -1FS TYPEOUT + 0FS TOP LINE + F]NOQUIT + M.M ^R_Done_With_CLU_Errors U:.X(1) + QWindow_1_Size+1 FS Top Line + QWindow_2_Size FS LINES + M(FS REFRESH) +  + +!& Initialize CLU Error Buffer:! !S Initializes the *Clu Errors* buffer. +Loads CLU.JUNK into the *Clu Errors* buffer, setting things up for the + Edit Errors command.! + + !* DO SOME INITIAL ERROR CHECKING! + Q:.B(QBuffer_Index+2!*bufvis!) "E + :I*NOF Not_visiting_a_file FS ERR ' + FS MODIFIED "N :I*MOD Buffer_has_been_modified FS ERR ' + FSMSNAME :IJJCLU.JUNK.0 !* make sure we look in connected dir! + E? J  "N :I*NCJ No_CLU.JUNK_file FS ERR ' + !* get the CLU.JUNK file! + QBuffer_Name [Previous_Buffer + M.M &_Return_to_Buffer [R !* save typing here! + :I**Clu_Errors* M(M.M Select_Buffer) + -1 M(M.M Visit_File) J  + @:S/Compiling_/"E :I*BFJ Bad_Format_CLU.JUNK_File MR ' + .[0 [1 L 2R Q0,.X1 L !* check file name! + !* FILENAME OF COMPILED FILE => Q1! + QPrevious_Buffer M(M.M &_Find_Buffer) [B + F[ B BIND + G:.B(QB+2!*bufvis!) -S. C K !* fix version number from 0! + Q:.B(QB+9!*bufver!) \ + HX0 !* FILENAME OF BUFFER => Q0! + F] B BIND !* All done with that buffer! + F~01 "N :I*WRF Wrong_file MR ' + + !* OK, let's find the first error! + M(M.M &_Find_Next_Clu_Error) [4 + MR + Q4 + +!& Return to Buffer:! !S "Returns" to the "Previous Buffer". +Given an argument (which should be a string), signals that error.! + QPrevious_Buffer M(M.M Select_Buffer) + FF"N FS ERR ' +  + +!& Find Next Clu Error:! !S Looks for a number beginning a line in the current buffer.! + <:S + "E 0' .-Z"E 0' !* go to the next line. return 0 if none! + 1A"D 0;' !* line start with a digit?! + 1:FBoutput_failure:"N !* or an output error?! + 0L 1:X*' + > + \[0 0l Q0 + +!& Done With CLU Errors:! !^R Done With CLU Errors:! !S Revert to one window mode.! + 0 UErrors_Buffer_Buffer + 1 M(M.M ^R_One_Window) + M.M ^R_One_Window U:.X(1) w + +!^R Edit Next CLU Error:! ! Goes to the next CLU error. +Will position the errors window to display the next error at the top of +the screen, and position the text buffer near the line on which the error +occurs.! + + [E + QErrors_Buffer_Buffer F"E + :I*NEE Not_Editing_Errors FS ERR ' [..O + M(M.M &_Find_Next_Clu_Error) UE + .UWindow_1_Pointer .UWindow_1_Window + ]..O + QE"E !* no more errors! + :I*C FS ECHO DISPLAY + @FT (No_more_errors)  0FS ECHO ACTIVE + M(M.M &_Done_With_CLU_Errors) + ' + QE F"L (M(M.M&_Done_With_CLU_Errors) ) FS ERR' + !* or an error message...! + FS TOP LINE"E M(M.M ^R_Other_Window) ' + QProgram_Buffer_Name [A + F=Buffer_NameA "N QProgram_Buffer_Name M(M.M Select_Buffer) ' + QE F(-1 (0J) L) UCurrent_Clu_Error !* position cursor! + !* and setup CCE! + M(FS REFRESH) +  + +!^R Better CLU Compile:! !^R Call the CLU compiler. +Like ^R CLU Compile in the "clu" library, but doesn't ask stupid questions. +Create a compiler if needed. We first offer to write out each file, +unless there is a numeric arg other than 0. Reads a command line to +pass to CLU: "&" in it is translated into the name of the visited file. +If just CR is typed, "compile &" is used, that is, it compiles the +visited file. The command line may have several commands separated by +"#". We always add the "stay" command. The CLU compiler is kept from +one call to another. Arg = 0 => just kill the compiler.! + +!* Instead, ask for the command to the compiler if there is an arg ~= 0 ! +!* ff"e m(m.m Save_All_Files)' ! + +m(m.m Save_All_Files) + + !* Arg 0 is special, destroy the compiler.! +"# "e -qCLU_*Handle* f"l fz' w -1uCLU_*Handle* 0'' + +!* Set up helpful action if user types the help character.! + +:i* :ftCLU_command_(or_several_commands_separated_by_#) +If_null,_will_compile_this_file. +  f[help mac + +ff"n !* if arg and not equal to 0 ! + 3,m(m.m &_Read_Line)CLU_command:_[3 !* Find out what user wants.! + fq3"l 0u..h '' !* Give up if get a rubout instead.! + +ff"e !* if no arg, or arg = 0 ! + :i3compile_& ' + +ff"n fq3"e :i3compile_& '' + +qBuffer_Filenames[5 +[4 [6 :i4 !* q4 get stuff already processed.! +<&f3 f(:;) f(,0: :g3u6 :i4465)+1,fq3 :g3u3 > +:i343_#_stay !* Q3 has the JCL line to use.! +:ft >>>___3___Running..... !* Echo the command.! + + +qCLU_Compiler[4 +qCLU_*Handle*f"l !* See if we have a compiler somewhere.! +fz 4_#_3uCLU_*Handle*' !* We do now.! +"#,0: fz clu_#_3' !* when restarting, must provide ! + !* phony job name for it to flush.! + +0u..h !* erase the "running" message! +!* fs msname :f6u3 * Get the connected directory! +!* m(m.m View_File) 3clu.junk.0  * so we always display the right file.! +0