From ea0c49c758b48a7ee36f0917e5b6ac3e3a2cc01b Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 20 Oct 2016 13:30:46 +0200 Subject: [PATCH] Multics Emacs from web.mit.edu. --- README.md | 4 + .../info_segments/emacs-history-comment.info | 47 + .../doc/info_segments/emacs.changes.info | 50 + .../doc/info_segments/emacs.errors.info | 551 +++ .../Multics/doc/info_segments/emacs.info | 128 + .../doc/info_segments/list_emacs_ctls.info | 45 + .../doc/subsystem/emacs/ctl-writing.info | 373 ++ .../doc/subsystem/emacs/emacs-tutorial.info | 2001 +++++++++++ .../Multics/doc/subsystem/emacs/emacs.gi.info | 358 ++ .../doc/subsystem/emacs/emacs.install.info | 401 +++ .../doc/subsystem/emacs/emacs.status.info | 252 ++ .../doc/subsystem/emacs/emacs.wall-chart.info | 87 + .../subsystem/emacs/extensions.changes.info | 49 + .../doc/subsystem/emacs/extensions.info | 3077 +++++++++++++++++ .../doc/subsystem/emacs/fortran-mode.info | 193 ++ .../doc/subsystem/emacs/fundamental-mode.info | 1416 ++++++++ .../doc/subsystem/emacs/ldebug-mode.info | 348 ++ .../doc/subsystem/emacs/lisp-mode.info | 242 ++ .../doc/subsystem/emacs/macro-edit.info | 147 + .../doc/subsystem/emacs/nl.changes.info | 135 + .../doc/subsystem/emacs/pl1-mode.changes.info | 250 ++ .../Multics/doc/subsystem/emacs/pl1-mode.info | 142 + .../Multics/doc/subsystem/emacs/rmail.info | 266 ++ .../emacs/sample_start_up.emacs.lisp | 52 + .../Multics/doc/subsystem/emacs/windows.info | 356 ++ .../source/bound_emacs_ctls_.s.archive | Bin 0 -> 244888 bytes .../source/bound_emacs_full_.s.archive | 1860 ++++++++++ .../source/bound_emacs_macros_.s.archive | 1304 +++++++ .../source/bound_emacs_packages_.s.archive | Bin 0 -> 245728 bytes .../source/bound_emacs_rmail_.s.archive | 2213 ++++++++++++ .../source/bound_multics_emacs_.s.archive | Bin 0 -> 625928 bytes 31 files changed, 16347 insertions(+) create mode 100644 web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs-history-comment.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.changes.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.errors.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/info_segments/list_emacs_ctls.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ctl-writing.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs-tutorial.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.gi.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.install.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.status.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.wall-chart.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.changes.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fortran-mode.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fundamental-mode.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ldebug-mode.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/lisp-mode.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/macro-edit.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/nl.changes.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.changes.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/rmail.info create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/sample_start_up.emacs.lisp create mode 100644 web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/windows.info create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_ctls_.s.archive create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_full_.s.archive create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_macros_.s.archive create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_packages_.s.archive create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_rmail_.s.archive create mode 100644 web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_multics_emacs_.s.archive diff --git a/README.md b/README.md index f292962..9faf73a 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,10 @@ not included. "This is for/from Lambda, I do not know the version sadly :( The copy comes from Joe Marshall who used to work at Gigamos." +- Multics Emacs 12.9 from web.mit.edu. + + Last changed in 1989-11-14. + - Emacs 13.8 from http://decuslib.com/decus/vax85b/gnuemax/emacs/ Possibly with VMS modifications. diff --git a/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs-history-comment.info b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs-history-comment.info new file mode 100644 index 0000000..020111d --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs-history-comment.info @@ -0,0 +1,47 @@ +02/13/86 add-history-comment, add-hcom + +Syntax: esc-X add-history-comment + or: esc-X add-hcom + + +Function: allows entry of a history comment while within EMACS. If +this is the first history comment entered, the EMACS extension sets up +the "HISTORY COMMENTS" header and "END HISTORY COMMENTS" footer. The +approve value and summary are prompted for. + + +Notes: You will be prompted for the approve value and the summary. A +null response (carriage return) is valid for the approve value but not +for the summary as it is a required field. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.changes.info b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.changes.info new file mode 100644 index 0000000..ca341c8 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.changes.info @@ -0,0 +1,50 @@ +02/17/89 Significant changes in Emacs 12.9 for MR12.3 + +1. f (rmail-forward) to forward the current message to an address + (list) that will be prompted for. A numeric argument will allow + the user to enter redistribution comments via a comments buffer. + +2. x (rmail-toggle-seen) to toggle the seen switch on the current + message. This switch is displayed to the user as the minor mode + "Seen" and will be turned on immediately a message is brought into + the RMAIL buffer to be displayed. + +3. ? (rmail-help) to display brief information about each of the + RMAIL mode (additionally the reply and comment buffers) requests + that are available. + +4. q (rmail-quit) is being modified to only question a user quitting + when no rmail commands have been entered between the arrival of + new mail and requesting of rmail-quit. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.errors.info b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.errors.info new file mode 100644 index 0000000..e45d952 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.errors.info @@ -0,0 +1,551 @@ + +09/21/87 emacs +Known errors in the current release of emacs. +# Associated TR's +Description + +386 phx20768 +Emacs gets an error if the height of the user_i/o window is reduced +during a video system Emacs session (e.g. doing ^Z^Z and shrinking the +window for a status line). + +385 phx20663 +If the user lacks w access to an output file, and answers "no" to the +"Do you want to write to the protected file ?" query, a confusing +error message, containing only [wd]>nil, is displayed. + +384 phx20641 +If the current line fills the entire window, ^V (next-screen) appears +to do nothing. This is because it tries to maintain a line of overlap +between the old and new screen, and that overlapping line happens to be +the entire old screen. + +383 forum.2730 +Redisplay does not do the right thing if multiple buffers are on +display in multiple windows, and the values of tab-equivalent differ +among the buffers. + +382 phx20344 +If accept-messages-path was used to accept messages on a mailbox other +than the user's default, the Emacs message handler is not removed from +that mailbox when quitting from Emacs. If a message is then received +in the mailbox a null pointer fault will result. + +381 phx20346 +reverse-regexp-search for "^string" goes to the beginning of the +previous line containing "string" anywhere, rather than a line +beginning with "string". + +380 phx20282 +"esc-X help" refers to >documentation>subsystem>emacs_dir instead of +>documentation>subsystem>emacs. + +377 phx19966 +editor-main-init setq's default-fill-column and default-comment-column, +thus overriding the defaults that are specified in e_option_defaults_. + +375 phx19737 +The sequence: + emacs -ns + ^X-3 esc-? ^E esc-R + results in an Emacs internal error followed by a fault referencing a +lisp temp segment, which recurs if you try to pi back in. + +374 phx19730 +The previous-command variable is not maintained properly. This can +cause problems for commands that change their action when invoked +consecutively (e.g. rubout-word and complete-command). Commands which +throw to top-level rather than returning normally (such as the +minibuffer termination key), and commands which are on +*transparent-commands* leave previous-command unchanged, so the +affected commands think that they have been invoked consecutively when +they have not. + +373 +complete-command (esc-SPACE) will get into a loop returning a sequence +of the same completions if the completion-list contains a duplicated +element. + +372 +Fundamental/.ext-commands contains "alm-mode" twice, which causes error +373 to occur. + +369 +"destroy-buffer-contents" should release the buffer's temp segments. +This is an easily-solved, special case of the general problem described +in entry 368. + +368 +Emacs never reclaims the space in its buffer temp segments that becomes +unreferenced after a line gets copied into a lisp string, until the +buffer is destroyed. Perhaps a GC daemon could be created that would +zero the unreferenced lines in the temp segs (in the hopes that an +entire page might be zeroed). Or perhaps the routines that replace a +filecons with a string or delete lines could keep track of the amount +of wasted space, and trigger a compaction of the temp seg when this +passes a specified threshhold (the GC daemon cannot compact because it +might be invoked after a pseudo-pointer has been extracted from a +filecons). + +367 phx19619 +The internal documentation for the "replace" command says that it will +not prompt for the second string if the first isn't found. This is not +true. + +366 phx19617 +multi-word-search (^XW) should start its search at the end of the +current word if it is in the middle of a word. Otherwise it might +treat the remainder of the word as a whole word. For instance, if +point is between the e and w in "foreword", "^XW word" will stop at the +end of "foreword". + +361 phx19374 +accept-messages-path references an undefined function +console-messages-interrupt-handler (it should be +console-message-interrupt-handler). + +360 phx19218 +Switching windows (i.e. ^XO) before the first redisplay can cause a +buffer named "nil" to be created. It is difficult to kill this buffer. + +359 phx19170 +e_cline_'s any_other handler doesn't ignore stringsize like +default_error_handler_ does. + +358 phx19119 +Recursive command-quit's cause problems. At top-level it will cause a +"throw can't find catch. pgazonga" infinite loop. In a minibuffer it +will cause the minibuffer to be aborted and quits to be ignored. To +reproduce: + esc-esc unwind-protect (command-quit) (command-quit) + +355 forum.2414 +e_mail_pl1_$emacs_read_message returns an error code if it can't send +the cknowledgement. It should ignore this, as read_mail does. + +354 forum.2414 +If RMAIL gets an error reading or formatting a message "nil" is +displayed instead of the line count and message. + +353 phx18981 +The electric-pl1-mode function overrides bindins of : and ; that are +set in the pl1-mode-hook. + +348 phx18717 +^X^E should make sure that the file_output buffer is modifiable. + +345 forum.2233 +The list *transparent-commands* should include control-prefix when +vt1xx_keys_ is loaded. + +339 phx18154 +LDEBUG esc-R (ldebug-reset-break) does not check that the break +s-expression is still in the source buffer before deleting it. If the +user manually deletes that s-expression then it will delete the +following sexp. + +333 +If you specify a pathname as the terminal type (with -query or -ttp) +you must explicitly give the .ctl suffix. + +330 phx17744 +^X_ (underline-region) underlines newlines. + +329 phx17727 +Lisp mode incorrectly indents the third line of this construct: + (a + '(,b + c)) + +This seems to be due to the asymmetry of forward-sexp and backward-sexp +when there are prefix read-macros around. Some fixes are in [aref +1087] in Emacs meeting. + +328 +The short name for -shared_static (undocumented) should probably be +-ss, which is what the run_command_task command uses. + +325 phx17524 +Buffer editor doesn't recognize buffer names (when implementing G +request, for instance) that have a ">" past the 20th character. + +324 phx17333 +If Emacs gets an RQO while writing out a file it doesn't always reset +the terminal properly, because it doesn't run the DCTL-epilogue. In +the case of a VT100, for instance, the scroll region is not reset. +tty_ modes, however, do get reset properly. + +322 phx17317 +When RMAIL re-uses a reply buffer it doesn't make sure that the "Ack" +minor mode is reinitialized to match the acknowledgement flag. + +320 +There are paths through e_tasking_ which will cause a +return_conversion_error. See the "signal program_interrupt" statement; +if it returns then it falls through to an incompatible entrypoint. + +319 phx17174 +Type ^X` test.test CR CR + ^X` noproj CR CR + pretty soon you will get "lisp: car or cdr of a number" loop. + +313 phx16932 +Emacs doesn't recognize sentences if the full stop is followed by ) or +". + +311 phx16888 +The "A new message has arrived" message has a 50% chance of being +overwritten by the "Do you wish to quit?" query. Perhaps making the +message a local display would work better. + +310 phx16888 +If a minibufffer-print is followed by a minibuffer-response then the +question will overwrite the previous output. + +309 phx16877 +Emacs self-doc for delete_char says that it moves the rest of the line +"one to the right", which should be "one to the left." + +308 phx16872 +If the response to the terminal type query is all numbers then Emacs +just says "Do not understand. Try again" instead of going to the "list +of types" query. + +305 phx16606 +Macro edit parser does not understand negative numeric arguments. The +function macedit-digitp should recognize initial hyphens. + +302 +It doesn't work to capitalize (esc-C) an underlined word. + +294 mail.2.11 +edit-dir doesn't understand directories that have no files. + +287 phx16787 +If you ^G out of the "Do you wish to quit rmail?" question after +deleting the last message the message is marked for deletion but stays +on display. + +286 phx16785 +Repeat-last-message (^X~) uses the last recipient if I have sent a +message since receiving one. + +284 mail.4.83 +The Emacs lisp error handler doesn't interact with errset properly. +"esc-esc errset (error 'foo 'bar 'fail-act) nil" should just return +nil, but it prints the error message. + +273 mail.4.46 +esc-^B (backward-sexp) goes into an infinite loop if there is a +semicolon ahead of point on the line. + +270 mail.4.30 +runoff-fill-region only works if the point is at the end of the region, +not at the beginning. + +263 +If you mark a buffer for deletion in buffer-edit, and kill it with ^XK +before exiting buffer-edit then you get serious errors. + +258 phx16454 +It is difficult to kill buffers whose names end in whitespace, as ^XK +and ^XB rtrim the buffer name. + +240 phx15723 +The dg132b CTL doesn't provide enough padding for insert/delete lines. +At higher speeds it may be better to just redraw the screen. + +239 +When Emacs signals quit the resetwrite can cause the initial string or +epilogue string. It should do its own resetwrite when the user hits +BREAK, and then it should signal quit with an info structure that +indicates that no automatic resetwrite should occur. + +233 phx15433 +global-print (^XS) leaves out some lines if the search string contains +a newline. This is because its main loop goes to the beginning of the +next line before each search; it should only do this in the one-line +case. + +228 phx15349 phx09740 phx13412 +The initial redisplay takes a fault if the buffer is looking at a large +segment. + +227 phx15350 +If Emacs takes a fault, it leaves the user in rawi mode. + +226 phx15228 phx20036 +You can't send mail from xmail if you have a tasking Emacs, and thenyou +cannot get back into the Emacs. + +224 phx15059 phx16507 +Scroll-current-window (^Z^V) allows the cursor to be on the bottom line +of the window when the line should wrap. This gets redisplay confused. +Scenario: + Go into two-window mode, with the top window having seven lines. + Read in a file with several (>8) wrapping lines in a row. + esc 6 esc G esc - ^Z^V <= gets into the above state + esc - ^Z^V <= shows how confused it is + ^X O <= further confusion f redisplay + +217 phx14593 +In overwrite-mode, backslash still inserts. So does ^Q, but this is by +design. + +216 phx14519 phx16784 +Commands implemented using word-operator (esc-C, esc-L, and esc-U) do +not work properly if point on the whitespace preceding the first word +of the buffer. + +215 phx14519 phx17565 +Commands implemented using the word-operator macro (esc-C, esc-L, and +esc-U) do not work properly if there is no word in the buffer (or +perhaps if the buffer is empty). A fix is given in the TR. + +213 phx16399 +Tasking Emacs should die more gracefully if you turn the video system +on or off under it. This also applies if you turn on/off the video +system under a suspended normal Emacs. + +211 phx14400 +Real underlining display loses a letter if a capital letter is +underlined twice. + +206 phx13052 phx15086 phx15464 +Sometimes gets error_table_$io_no_permission on reconnection. This is +probably due to getting the same devx. + +205 phx12602 +The window editor sometimes overwrites another buffer with the +window-editor information. This happens if you delete the window in +which the window editor is running. + +202 +In Multics-mode gets rid of the error_output switch. This is due to +the loss of syn_$syn_attach_. + +198 phx13758 +^V and esc-V are confusing when redisplay turned off. They can also +get confused if they are typed ahead. + +194 phx13572 +Emacs guesses that some terminal types are printing-terminals without +checking for a CTL first. + +191 phx13136 phx13722 +Minibuffer output isn't always folded when it runs over the +screenlinelen. + +188 phx13062 phx14762 +Some searching routines do not set gratuitous marks properly, causing +^W to wipe the wrong text. + +185 phx12887 +Dired buffers that are modified should stop ^X^C from exiting w/o query. + +182 phx12653 +^XO doesn't do anything with redisplay off. + +180 phx12556 +check-entry-name in e_multics_file_ should call check_entryname_, not +check_star_name_$path. + +167 phx12166 +A minibuffer message occurring during a local display sometimes aborts +the local display. + +162 phx11972 +indent-rigidly should redo tabification in line. + +158 phx02711 +Speedtype does not accept >4 character abbreviations, and setab command +does not diagnose either. + +157 phx03081 +pop-up windows/message mode problems. + +156 phx11749 +Local displays generated while in minibuffer don't get flushed. + +154 phx11779 +ESC-U/ESC-C/ESC-L should know how to correct _ canonicalization within +word when case-changing. + +153 phx11755 phx11964 +Multiple windows/set-screen-size blows away windows on ambassador +because of deficiency in DCTL code. + +144 phx11398 +LDEBUG breakpoints leave you in buffer where they occur, without LDEBUG +bindings, and prints message into current buffer. + +132 phx10148 +Multics Mode with Process buffer showing in two windows (with differnt +current points) confuses window manager about current window. + +130 phx09878 +Word definition seems a little screwed up in ^Z_ and ESC_ and ESC-T. + +128 phx09256 phx19080 +Single-character procedure names at begin of new pl1 file in electric +PL/I mode cause ":" electric to beep and not do its job. + +117 phx10073 +Emacs should diagnose illegal keystring ^Z-- (two minuses). + +109 phx09931 +esc-/ ^$ CR on blank line doesn't find next blank line. + +104 phx09863 +Misspellings and bad grammar in extensions.info. + +92 phx09539 +In fortran mode, with free-format fortran, positioning to source +lines should use fortran's line numbers, not Emacs'. + +89 phx09343 +Defcom for untabify is binding tab-equivalent to a string. + +87 phx09365 +Lines longer than fill column make CR in message buffer fail. + +86 phx03655 phx10392 +Emacs ^X^M qedx , BREAK, pi, q, pi sometimes fails in lisp_oprs_. +(Gets segfault or mme2 error). Might be lisp bug. + +84 phx09201 +ESC-Q leaves a blank line with fill prefix after a paragraph just filled. + +83 phx09092 phx09256 phx12741 phx15394 +Emacs doesn't handle colons well for label arrays in electric +PL/1 mode (specifically try "action (4):"). Semicolons also not +handled well after declarations. + +There is a fix for the label array bug in Emacs forum [1604]. + +81 phx08766 +Emacs does not observe MAP mode. + +78 phx08592 +Emacs needs to know which conditions should be ignored, and which passed +through, and needs to pass conditions like "endpage" through. + +77 phx08295 phx08925 phx12693 +^C doesn't do right thing after ^XE. + +75 phx06948 +Multiple ESC-^Q cause strange interaction with redisplay; sometimes +paragraph creeps up and off screen, sometimes causes unnecessary +redisplay. + +74 phx08227 +e_pl1_$get_mcs_tty_info appears to not know that diablo1620's does +have tabs (and doesn't direct Emacs to use tabs in printing-tty output). + +69 phx08002 +When in electric-pl1-mode, ";" inside string should cause "Unbalanced +PL/1 quotes" but not newline/special action, just insert ";". + +68 phx07939 +Local keybindings need to be "pushed"; when do electric-pl1-mode, +fill mode, fill off, SEMI/TAB get rebound to self-insert instead +of pl1-mode-special-whatever. + +63 phx07303 +LRU minibuffer-print line-selection algorithm needs to be better. + +61 phx07287 +Emacs should do resetread on quit. + +59 phx06969 +On printing terminal (TI745) "Writing" got overwritten by +pathname -- possible padding bug in TI745 ctl. + +52 phx06832 +Marks not always moved correctly on ^W; see TR. + +47 phx06696 +Setting minibuffer size resets screensize. + +45 phx06634 +When a major-mode change happens, the OLD major mode should be +cleaned up before the new one is instated. In particular, trying to +use an old fortran-mode buffer in most other major modes +will still find CR bound to fortran's return-and-indent. + +44 phx06599 +ESC-W (copy-region) doesn't respect ESC-^W (doesn't append to +last deletion.) + +43 phx06588 +pl1-comment-current-line should obey comment-column, NOT maintain its own +comment column (pl1-comment-column). + +36 phx06301 +Rmail bugs: (1) Should do a go-to-or-create-buffer "Incoming Mail", not +go-to-buffer. (2) rmail.info needs to be installed. (3) The feature +whereby ^XR in an emacs with a non-quitted rmail returns to reading +the mail you were reading MUST BE Documented. + +29 phx05495 phx05675 phx06167 +Speedtype mode and speedtype/fill interaction have several bugs. +Bill York's new speedtype should be installed. + +18 phx03094 phx13763 +On tek4025, Emacs should first ask user to set command character. +Would be nice to have a real cursor, also. + +16 phx05086 phx06698 phx08108 phx11313 phx11397 phx13319 +Emacs gives useless error message on RQO - should try to clean + up pdir automatically if that's where the error is. + +15 phx05073 +accept-messages doesn't work in recursive Emacs'. This is caused by +the console-message package not re-instating old accept_messages state; +this will be fixed when the new message routines roll around. + +13 phx04933 +Bugs in ^XR after reading another mailbox, then trying to read own. +See TR. + +8 phx06674 +^X:'ing to a person when that recipient's message buffer has been +deleted blows out badly. (Two error messages, including one from +go-to-line-point). + +6 phx04679 phx09752 phx14625 +Windows displaying the same buffer sometimes don't keep their own +curpoint; moving in one, then ^XO or ^X4 to the other sometimes +causes the second to redisplay to the point of the first. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.info b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.info new file mode 100644 index 0000000..b3a3b65 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/info_segments/emacs.info @@ -0,0 +1,128 @@ +02/12/85 emacs + +Syntax as a command: emacs {-control_args} {paths} + + +Function: enters the Emacs text editor, which has a large repertoire +of requests for editing and formatting text and programs. + + +Arguments: +paths + are pathnames of segments to be read in. Each is put into its own + appropriately named buffer. Star and archive component pathnames + are accepted. + + +Control arguments: +-apply function_name arg1 arg2...argi, +-ap function_name arg1 arg2...argi + evaluates (function_name 'arg1 'arg2...'argi), where the args are + arguments to the named Lisp function (e.g., an Emacs request). This + is valuable for constructing abbreviations. This control argument + must be the last argument. +-line_length N, -ll N + sets the line length to be different from the terminal's default + line length. +-force, -fc + permits the use of terminal type control arguments (-ttp, -query, + -reset) when in the video system. + + +-line_length N, -ll N + sets the line length to be different from the terminal's default + line length. +-line_speed N, -ls N + indicates line speed to obtain proper padding (for ARPANet users), + where N is the output line baud rate in bits/second. It is ignored + in the video system. +-macros path, -macro path, -mc path + loads the segment, specified by path, as Lisp, so that features + therein are available. +-no_force, -nfc + prevents the use of terminal type control arguments when in the + video system. (Default) +-no_start_up, -no_startup, -ns + prevents use of your startup (start_up.emacs). + + +-page_length N, -pl N + sets the page length to be different from the terminal's default + page length. +-query + queries you for a terminal type without checking the Multics + terminal type first. The query response can be any recognized + editor terminal type. (See "Notes.") + + +-reset + specifies that Emacs disregard the terminal type set by + -terminal_type and set it in accord with the Multics terminal type + instead (see "Notes"). +-terminal_type STR, -ttp STR + specifies your terminal type to Emacs, where STR is any recognized + editor terminal type or the pathname of a control segment to be + loaded. If STR is not a recognized type, Emacs queries you after + entry, providing a list of recognized types. (See "Notes.") + + +Notes: None of the terminal type control arguments (-ttp, -reset, +-query, -line_speed) are generally necessary; they are only used for +solving various communications problems. + +The control arguments -query, -reset, and -terminal_type are +incompatible. You can't use them in the video system unless you +provide -force. + +Emacs is a display-oriented editor designed for use on CRT terminals. +Several modes of operation for special applications (e.g., RMAIL, PL/I, +FORTRAN) are provided; the default mode entered is Fundamental major +mode. + + +For a basic introduction to the Emacs Text Editor and descriptions of +the most generally used editing requests of emacs fundamental mode, see +the Introduction to Emacs Text Editor (CP31). You can find a tutorial +introduction to the Emacs Text Editor, fully describing the editing +requests available and containing instructions for using special +features of emacs, in the Emacs Text Editor User's Guide (CH27). A +guide for programmers writing extensions and terminal control modules +(CTLs) in Lisp is provided in the Emacs Extension Writer's Guide +(CJ52). + +You can get a complete list of available requests in emacs via the +make-wall-chart request while in emacs. Type the following: + emacs + ESC-X make-wall-chart + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/info_segments/list_emacs_ctls.info b/web.mit.edu/multics-history/source/Multics/doc/info_segments/list_emacs_ctls.info new file mode 100644 index 0000000..1de5590 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/info_segments/list_emacs_ctls.info @@ -0,0 +1,45 @@ +09/28/82 list_emacs_ctls + +Syntax: list_emacs_ctls {terminal_type} + + +Function: produces a list of all known Emacs terminal types, or +verifies the existence in your search rules of specified Emacs terminal +controllers. + + +Arguments: +terminal_type + is a terminal type name. It can be a single starname. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ctl-writing.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ctl-writing.info new file mode 100644 index 0000000..93c7c1b --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ctl-writing.info @@ -0,0 +1,373 @@ +06/25/79 - Writing Emacs Terminal Control Modules ("CTL"s) + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command** + + + + + + Support of video (and printing) terminals in Emacs is accomplished +via terminal-dependent modules known as "CTL"s (from the typical name, +e.g., "super58.ctl" for a "super58" terminal). There are about two +dozen supplied CTLs. They are kept in the directory >unb +Emacs will attempt to locate an appropriate CTL in this directory at the +time Emacs is entered; the decision as to which CTL will be made based +upon the terminal type maintained by Multics, and optional Emacs control +arguments. + + To support a type of terminal not supported by a supplied CTL, it is +necessary to write a new CTL. A CTL is written as a Lisp source program, +name TTYTYPE.ctl.lisp, TTYTYPE being the name of the terminal type which +will be supported. If this terminal type is in your site's TTF (Terminal +Type File), the name chosen should appear the same as appears in the TTF, +except that the name of the CTL should be all lower case (Emacs will lower-case +terminal types when looking for CTLs). + + CTLs are usually written by example from supplied CTLs. Personnel +with no knowledge of Lisp at all have achieved this successfully. A +relevant introduction to Lisp may be found in extensions.info in the Emacs +documentation directory. Once the CTL is written, it must be compiled +before it can be used. Compilation is performed via the Lisp compiler, lcp, +which is kept in >unb. A typical command line to compile +a CTL might be + + lcp super58.ctl + +This will produce an object segment, super58ctl, which, when debugged, can be +installed in the system library. To use a CTL being debugged, invoke +emacs with the "-ttp" control argument and the full pathname of the +_c_o_m_p_i_l_e_d CTL: + + emacs -ttp >udd>Support>Jones>emacs_development>super58.ctl + +See emacs.info in the Emacs Documentation directory for the valid +control arguments for managing terminal types. + + ************************************************** + + + The most effective method of writing a new CTL is to take one that +was written for a similar terminal and modify it. Almost all of the extant +CTLs were written in this way. The source for all supplied CTLs is kept +in >>ldd>unb>s>bound_emacs_ctls_.s.archive. The sources are Lisp source +segments, generally one or two printed pages long. Good starting points are + + o vip7200.ctl.lisp, typical of terminals that do not have the ability + to insert or delete lines or characters. + + o vip7800.ctl.lisp, typical of terminals that do have these abilities. + The two facilities are independent, either one, both, or neither + may be present, although use of terminals without insert/delete + lines at less than 300 baud may be found to be unacceptable. + + The interfaces (function definitions) in a CTL are standardized. They +have the same names in all CTLs. The Emacs screen manager will call these +interfaces anonymously after the appropriate CTL has been loaded. The +interface DCTL-init is called at Emacs start up time; it has the responsibility +of setting various flags, and initializing the terminal. It should +contain the statements + + (setq idel-lines-availablep t) if the terminal can insert/delete lines + (setq idel-lines-availablep nil) if it cannot + (setq idel-chars-availablep t) if the terminal can insert/delete characters + (setq idel-chars-availablep nil) if it cannot + (setq screenheight N.) Where N is the number of LINES on the screen + (note the dot after the N). + (setq screenlinelen M.) Where M is _o_n_e _l_e_s_s than_ the number + of characters in a line on this terminal. + Again, note the dot. + (setq tty-type 'TYPENAME) Where TYPENAME is a word like "super58" + that identifies the terminal type. + + At the time DCTL-init is invoked, the variable "ospeed" is set to the +speed of the communications line in _c_h_a_r_a_c_t_e_r_s _p_e_r _s_e_c_o_n_d. +This may be used to perform padding calculations. + + Also before DCTL-init is invoked, the variable "given-tty-type" is set to +the name by which the CTL was loaded with the ".ctl" suffix stripped. This +variable can be used in DCTL-init (and elsewhere) to enable and use different +features of a terminal dependent on the name used to reference that terminal. + + The following functions are available to the CTL writer: + + o Rtyo takes one argument, a number (fixnum), and outputs + that number as ASCII data. For instance, (Rtyo 141) will + output an "a", and (Rtyo 33) will output an ESC. + + o Rprinc takes one argument, a character string, and outputs + it. For instance, (Rprinc "]I") outputs a right bracket and + an I. + +Both of these functions buffer their output until the Emacs screen manager +deems it appropriate to dump this buffer. This will always be done at +the end of any redisplay at all, and after DCTL-init is called. + + The CTL writer must maintain the values of the special (global) variables +X and Y as the zero-originned screen position where the cursor was left. +In return, he or she gets to inspect these variables to do positioning +optimization. + + The CTL writer must provide the following interfaces to be called by +the Emacs screen manager: + + o DCTL-init - (of no arguments) - Must set the flags listed above, + initialize the terminal (if necessary), clear the terminal screen, + and leave the cursor at position (0, 0) (home). + + o DCTL-position-cursor - (of two arguments, a new X position and + a new Y position) - Move the terminal's cursor to the given + position, if not there already. Position 0, 0 is defined as the + upper left hand corner of the screen. This function must check + the variables X and Y, and output no characters if the cursor is + known to already be at the desired position. Otherwise, it must + use the values of X and Y to determine what type of motion is necessary, + output characters to move the cursor, and update X and Y to the input + parameters (the delay of the buffered output is not an issue). + + Typically, DCTL-position-cursor will determine which is the optimal + movement based upon the relative positions of the cursor and the desired + position. For terminals that have many forms of cursor movement, + some combination of backspaces, linefeeds, and carriage returns + may be adequate to effect some forms of cursor movement. Sometimes + the sequences generated by the "arrow buttons" on the terminal + may be used for relative positioning. Just about all terminals + include some form of absolute positioning. The choice of optimal + cursor positioning should be based upon which will output the fewest + characters to effect the desired move. See hp2645.ctl.lisp for an + example of a very well optimized cursor positioner. + + One useful trick in the writing of DCTL-position-cursor is the use of + recursion. See adds980.ctl.lisp for an example. If you choose to use + terminal tabs, then your DCTL-init must set them, and you must take + care not to clear them. No supplied CTLs (other than the extremely + special-case printing terminal controller) use tabs. + + o DCTL-display-char-string (of one argument, a character string to + be displayed). Must output this character string to the terminal + at the current assumed cursor position. The string is guaranteed + to contain no control or other non-printing characters, and each + character in it is guaranteed to take up one and only one print + position. Be careful to update cursor position after printing + the string; the lisp function "stringlength" may be used to ascertain + the length/printing length of the string. + + o DCTL-kill-line - (of no arguments) - Clear the line from the current + assumed cursor position to the end of the line, and, importantly, + _l_e_a_v_e the cursor at that original assumed position. Most + video terminals have a clear-to-end-of-line feature; it should be + used here if available. Some terminals do not, yet this function + must be provided anyway. The machinations for "simulating" clear + to end of line are moderately arcane; see adm3a.ctl.lisp for an + example of clearing to end of line by overwriting with blanks. + Performance of this technique at 300 baud is generally completely + unacceptable, rendering such terminals unfit for use with Emacs + (or any other display editor) at that speed. + + o DCTL-clear-rest-of-screen - (of no arguments) - Clear the screen + from the current assumed cursor position to the end. Leave the cursor + where it was supplied. Some terminals have a "clear whole screen" + function, but not clear to end of screen. For the time being, this + will do, although we may use the added functionality in the future. + If your terminal does not even have a clear-whole-screen function, + it is probably not worth using with Emacs. If you choose to use tabs + in cursor positioning, be wary of clearing them via this function. + + We have just listed all the required functions. Some terminals require +control sequences to change "modes" between normal Multics operation and +operation within Emacs. (For example, a terminal might be switched between +line-at-a-time transmission and character-at-a-time transmission.) Yet other +terminals might use features during the operation of Emacs which should be +disbaled/reset when using Multics. (For example, the VT100 uses "scroll" +regions to simulate insert/delete lines. However, if a scroll region exists, +it will make parts of the screen unusable when using Multics.) It is possible +and quite common to switch between Multics and Emacs by using the ATTN key and +the "pi" command. In this case, the terminal will be in the wrong mode at +various times. If the terminal for which you are writing a CTL exhibits this +behavior, you should add the following statements to DCTL-init: + + (setq DCTL-prologue-availablep t) to specify that certain functions must be + performed each time Emacs "mode" is entered + from Multics "mode". + (setq DCTL-epilogue-availablep t) to specify that certain functions must be + performed each time Multics "mode" is + entered from Emacs "mode". + +In addition, you must then supply the following two functions: + + o DCTL-prologue - (of no arguments) - Perform any operations which are + required when Emacs "mode" is entered from Multics "mode". This + function will be invoked immediately after DCTL-init is called and + after Emacs is reentered after a QUIT via either the "pi" or "start" + commands. + + o DCTL-epilogue - (of no arguments) - Perform any operations which are + required when Multics "mode" is to be entered from Emacs "mode". This + function will be invoked immediately before Emacs is exited when the + ^X^C (quit-the-editor) command is invoked and immediately before Emacs + is suspended when the ^Z^Z (quit) command is invoked or the ATTN key is + hit on the terminal. + + If you have stated that insert/delete lines is available, via setting the +flag idel-lines-availablep to t, you must supply the following two functions. +If you set this flag to nil, you need not write these functions: + + o DCTL-insert-lines - (of one argument, a number of lines to be + inserted) - Open up the given number of lines on the screen. + There will be guaranteed to be that many blank lines (created by + DCTL-delete-lines) at the bottom of the screen at the time this + function is invoked. The cursor will be at position 0 of some + line at the time DCTL-insert-lines is invoked. It must push + the contents of that line "down" the supplied number of lines, + leaving the cursor in the same place, the line the cursor is on + and the n-1 succeeding lines blank. + + o DCTL-delete-lines - (of one argument, a number of lines to be + deleted) - Delete from the screen the supplied number of lines, + starting with the line the cursor is on on down. The cursor is to + be left in the same place it was given. That many blank lines + will be assumed to be pulled up on the bottom of the screen. + + If the flag idel-chars-availablep is set t, indicating that insertion +and deletion of characters is available, the following two functions must +be supplied: + + o DCTL-insert-char-string - (of one argument, a character string + to be inserted at the current assumed cursor position). The + character string supplied is to be inserted at the current + cursor position. All characters at, and to the right of the + current cursor position are to be pushed over to the right. There + will be guaranteed to be only blanks on the screen in the region + which will be "pushed off". The cursor is to be left (and updated + as being at) the end (after the last character) of the string inserted. + + o DCTL-delete-chars - (of one argument, the number of characters + to be deleted). The supplied number of characters, starting with the + character at the cursor and on to the right, are to be physically + deleted from the screen. All characters to the right of these + characters are to be moved that many positions to the left. That many + blanks will be assumed to be moved in from the right edge. The cursor + is to be left where it was supplied. + + Writing a CTL usually involves editing an existant one, trying it, +modifying it, and iterating until it is solid. One will use the "-ttp" +control argument many times to switch back and forth between "printing +terminal mode" and the new CTL when logged in from the terminal on which the +CTL is being developed. For terminals with insert/delete features, +it may be convenient to debug the CTL first without these features (claim +they are not there in the DCTL-init), and add them later. Similarly, +one is encouraged to write "more optimal" DCTL-position-cursor's once +one has one that works at all, for the convenience of editing the CTL with +Emacs substantially reduces the effort of improving it. + + For some terminals, padding may be necessary for some operations at some +or all line speeds. If terminal behavior appears random, or garbage is left +on the screen after a ^L or ^K, this may be the problem. Check the manual +for your terminal about padding requirements. It may be convenient to define +a function called DCTL-pad, which takes a number of microseconds or +milliseconds as an argument, and issues enough pad characters ((Rtyo 0) +or (Rtyo 177) are common, check your terminal manual for what your terminal +expects) to perform this padding. The variable "ospeed" gives the line +speed in characters per second, for use in such calculations. Getting +the padding right may involve quite a bit of tinkering on some terminals; +one proven method in cases where padding is felt to be a problem is to specify +a very large amount of padding (e.g., a second) and cut it down until it works. +See dd4000.ctl.lisp for an example of terminal padding. + + ************************************************** + + The Lisp special forms _c_o_n_d and _d_o are used heavily in CTLs and +not documented in extensions.info. Emacs environment macros (do-forever, +if, etc) should not be used in CTLs, thus the native Lisp forms are necessary. +Here are the descriptions of cond and do: + + (cond ((= this that) (thing1)(thing2)) + ((> a b)(second)(third) 27) + ((< c 15)(other)) + (t (last 5)(chance))) + +means: + + "If this equals that, call thing1 of no arguments, then call thing2 of + no arguments, and return as the value of the cond the value returned + by thing2. OTHERWISE, if a is greater than b, call "second" with + no arguments, then call "third", and return 27 as a value. YET + OTHERWISE, if c is less than 15 (all numbers octal), return the value + obtained by applying "other" to no arguments. If none of the above + are true, call "last" with an argument of 5, and then return the value + obtained by calling "chance" with no arguments." + +"cond" is very much like PL/I's + + if ( .... ) then do; + ..... + end; + else if ( .... ) then do; + ..... + end; + else if ( .... ) then do; + ..... + end; + else do; + ..... + end; + +The format of Lisp "do" used in CTL's to iterate is of this form: + + (do VARIABLE INITIAL-VALUE REPEAT-VALUE TEST form1 form2 form3.. ) + +It is identically equivalent to PL/I's + + do VARIABLE = INITIAL-VALUE + repeat REPEAT-VALUE + while (^ TEST); + + form1;form2; ... + end; + +which, itself, is equivalent to + + VARIABLE = INITIAL-VALUE; +l: if TEST then go to e; + form1;form2;... + VARIABLE = REPEAT-VALUE; + go to l; +e: ; + +The variable VARIABLE is locally defined inside the "do". It may be used +in the forms inside the "do", in the "end test" TEST, and in the repeat +value REPEAT-VALUE. + +(END) + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs-tutorial.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs-tutorial.info new file mode 100644 index 0000000..97dad2c --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs-tutorial.info @@ -0,0 +1,2001 @@ + An Introduction to Using Multics Emacs 10/27/79 + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + +Multics Emacs is an integrated editing, text-preparation, and screen +management system designed to take advantage of the features of modern display +terminals to aid in interactive text entry and editing. In some sense, it is +an editor: yet a more appropriate description would be a "text processing +subsystem": continuous interaction with text is its mode of operation, not +"editing" via carefully structured "editing requests". + + Although it is possible, and valuable, to use Multics Emacs from a +"printing terminal", i.e., one that uses paper and ink, it is oriented +towards video terminals, and its usage is best learned on a video terminal, +preferably at 1200 baud or better. + + Sit down at a video terminal logged into Multics. Invoke Emacs +by typing its name at the command processor: + + emacs + +Depending upon the facilities available at your site, Emacs may or may not +ask you: + + What type terminal do you have? + + +If Emacs poses this question, which it will only ask you once per login +session, as opposed to clearing the screen, type in the name of the type of +terminal that you have. If you do not know this, ask your Site Support +personnel. If you type a bad name, Emacs will type out the names of all +terminals it knows how to support, so that you can type the right name. Or +type "quit" to give up. Terminate the name of the terminal with a +carriage-return, as you would any Multics input. + + Now Emacs will take several seconds to get started up; it has a lot to +do at start-up time. When it has started up, it will clear the screen, and +display the line + + Emacs (Fundamental) - main + +at the lower left of the screen. This line is called the _m_o_d_e _l_i_n_e. +It tells you several things, most important of which is that you are talking to +Emacs, as opposed to the command processor, or some other editor. +"Fundamental" is called the _m_o_d_e. There are various _m_o_d_e_s +best suited to preparing text, programs in different languages, and other +tasks. Fundamental mode is the first and simplest mode. It has no +specialized features at all. "main" is the _b_u_f_f_e_r _n_a_m_e. You can be editing +many things at once with Emacs, like qedx. Each separate thing being edited +is edited in a separate "sub-editor" called a _b_u_f_f_e_r. The buffers have names; +"main" is the name of the buffer you start out in. + + The region between the top of the screen and the mode line is where text +appears, and where we deal with text. This area of the screen is called the +_w_i_n_d_o_w. It will always display 20 or so consecutive lines of the document or +program you are editing. The region below the mode line has two areas, +the _p_a_t_h _l_i_n_e and the _m_i_n_i_b_u_f_f_e_r, which we will deal with +later. + + You will note the blinking _c_u_r_s_o_r in the upper-left-hand corner +of the screen. The cursor may be a blinking underline on some terminals, or +a blinking or solid box on others. The cursor is always on some position on +the screen. The cursor is the single most important object in Emacs: +we must familiarize ourselves with it, and must always concern ourselves with +its whereabouts on the screen. All "action" happens at the cursor: all text +we enter is entered "at" the cursor (and the cursor moves), and text we delete +is deleted at the cursor, as well. + + Now we are going to enter some text. We do not have to tell Emacs that +we are going to type. There is no "input mode" or "edit mode": we just type. +Type these words on the terminal, do _n_o_t end it with a carriage return, line +feed or other special character, the period should be the last character you +type: + + This is sample text. + +You will note that you do not see what you have typed immediately, but +soon after you start typing, the text on the screen will "catch up" with you. +This is because you have waited a few minutes since the last time you typed, +and Multics has "forgotten" about you temporarily. In general, you may see +what you type as soon as you type it, or sometimes a little later, depending +on the load on Multics. This is very different than other Multics programs; +other programs rely on the terminal to type out what you type in, but Emacs +must type it out for you. + + You will also note a little star come on under the word "Emacs": this +is called the "modified" star. When it is there, it means that the +text in your buffer is different than the text you read in, if any, or +is new text (as is the case here), and hasn't been written out to a file. +When the "modified" star is on, you know that you wil have to write your text +out before exiting Emacs. + + You will see the text you typed at the top of the screen. It just +appeared there as you typed it. You did not have to issue a "print request": +The line you are looking at at the top of the screen is the beginning of your +document: you are looking at your document, not an "input line", or an +"output line" or a "printout". At all times, you are looking at your +document. + + Look at the screen. You will see the cursor to the right of the period +in the sentence "This is sample text". You should begin to think "We are +to the right of the period on that line." At all times, the person using +Emacs must think of himself or herself "at" some point in his or her document, +that "point" being indicated on the screen by the cursor. + + Now let us add another line. Type the "carriage return" key on your +terminal to end this line and start another one. "Carriage return" is a +character, just like "T", "h", "i", or "s", or a space. Typing it will +put a "carriage return" character into your text, and move the cursor to +_b_e_y_o_n_d the carriage-return character, which is to say, the beginning of the +next line. Having entered the carriage return, type: + + Here is more text yet. + +Again, the text appears on the screen as we type it. The line we had typed +earlier stays where it is, we now have a two-line document. Using what we +know already, we can type in a whole document! It is just like using a +typewriter. + + This is fine, until we make an error. We have to fix errors as we note +them. Let us type a line with an error in it on purpose. Go to the next +line, by typing a carriage return, and type: + +Multix + + +We have made an error. The "x" in "Multics" should have been a "cs". What +do we normally do in Multics if we type a wrong letter? We use #, the _e_r_a_s_e +_c_h_a_r_a_c_t_e_r. The same is true in Emacs, but watch what happens. Type the "#" +(pound sign, or number sign) character. Observe that the "x" in "Multix" +physically disappears off the screen, leaving no trace of itself or the pound +sign! The character has been erased; our document is on the screen. The "x" +is no longer in our document. What is more, there is no trace or record of +the mistake we made, or what we did to correct it. The document is correct +on the screen, as always. Now, to put in the c and the s, just type the c +and type the s, and the word "Multics" will appear correct. + + We can continue in this fashion, entering text just by typing it, ending +lines with carriage returns when we want to go on to the next line, until our +whole document is entered, correcting mistakes with #, but soon we may find +a need to change, or modify, some text we had already entered. For example, +let us change the line we entered that said: + + This is sample text. + +to say: + + This is some sample text. + +adding the word "some" after the word "is". The way we do this in Emacs is to +"go" to the place in the text after the word "is", to _m_o_v_e or _p_o_s_i_t_i_o_n +ourselves there, by moving the cursor there. We want to go up two lines and +over a few characters. First, let us "get to" the right line. We will go there +one line at a time. We will tell Emacs "Go to the previous line". + + Look on your keyboard for a key labelled "CTL", "CTRL", "CONTROL", +"CNTRL", or the like. This is a very important key for Emacs; it is called the +_c_o_n_t_r_o_l key. It is like a shift key: you hold it down, and while holding it +down, you type one or more normal characters. Like a shift key, pressing it +and releasing it has no effect. When you press the "p" key (DON'T do it now), +you get a lower-case "P". If you press the "p" key while holding the "SHIFT" +key, you get an upper-case "P". If you press the "p" key while holding the +"CONTROL" key, you get something called a "Control P". It is a different +_v_a_r_i_e_t_y of P, just like p and P, except instead of being an upper case +letter or a lower case letter, it is a called a "control character". All +control characters are commands to Emacs. You have seen what happens +when you type normal upper and lower case characters; they go into the +document. Control characters are used to control Emacs, to manipulate the +cursor and manipulate text. + + To make Emacs move the cursor to the P_revious line, we use the control +character "Control P", the P_ being for P__r_e_v_i_o_u_s. Do so: hold down the +"CONTROL" key, like a shift key, and press the "P" key, while still holding +the "CONTROL" key, then release both. Now watch the screen: you will observe +that the cursor will indeed move up to the previous line, to a place right +above where it had been. This happens as soon as we type the Control P, +we do not have to type (and must not type!) a carriage-return or other +character to make it happen. Note also that when we type Control P, +we do not "see" our command anyplace on the screen, all we see is what it did. +This is a very important principle in Emacs: what you see on the screen is +what you have in your document, and it does not matter what you used to +achieve that state. + + Now let us go up one more line, to the first line. Hold down the control +key again, and press "P" while holding it. Again, the cursor will jump up +a line. + + Now that we are on the correct line for the change we wish to make, we can +move around on that line to get to the correct place. We can move +_b_a_c_k_w_a_r_d_s on that line by telling Emacs to "go backwards": as you guessed, +this is done with a "Control B", B_ for B_ackwards. Hold down the control key. +Now, slowly, press the "B" key, while still holding the control key, eight or +nine times. You will see the cursor move backwards, that is, to the left, +one position for each time you press the "B" key. Soon you will reach the +beginning of the line, at which time, you cannot go any further back, because +that is the beginning of your text. Emacs will cause your terminal to beep +at you, to indicate that you have made an error. Wait for all the beeping to +finish, and release the control key. + + We now want to move forward to the place after the word "is", in order +to insert the word "some". Hold down the control key, and type the letter +"F" several times. "Control F" is the Emacs command for "forward", i.e., +move the cursor forward one character. While still holding down the control +key, type F's until the cursor is under (or covering, on some terminals), the +letter "s" of the word "sample". If you type the Control F too many times, +simply type Control B's until you get to the right place. What you are +doing now is the most important form of interaction with Emacs- issue commands +until you are "at the right place", or "the right thing has happened", doing +one command at a time and observing its effect, and repeating that process +until you have achieved what you want. This is _i_n_t_e_r_a_c_t_i_v_e editing, as +opposed to counting the number of lines or characters, etc., and issuing +commands to move 15 lines and 4 characters, etc. (although you can do this +too in Emacs if you really need to). Visual feedback is the most important +single feature of Emacs. + + Now we are at the "s" of sample, and we wish to put the word "some" +right there (i.e., at the cursor). That is trivial: simply type the four +letters s, o, m, and e. You will watch Emacs move the rest of the line over +and you now have on that line: + + This is somesample text. + +with the cursor still under the "s" of "sample". Immediately, we perceive a +problem: there is no space between "some" and "sample". We did not enter a +space, this is exactly what we told Emacs to do. Let us enter a space: +simply hit the space bar. Now we have: + + This is some sample text. + +with the cursor still under the "s" of "sample". We have now fixed the +text we wished to. Note that in order to type in the new word, "some", we did +not have to say anything special, we just moved the cursor to the right +place, and started typing. Whenever we type a non-control character (other +than #, @, and \), it goes into the text at the cursor, and moves the cursor +over one to the right. If you think for a little while, you will notice that +that is what it did when we were simply typing in the lines on the screen! + + Now we must get back to the end of the document, where we had left off +when we decided to add the word "some" to the first line. We can do this by +going to the N_ext line, and the N_ext line, until we are where we want to be. +As you doubtless surmise, we do this with the "Control N" command, N_ for +N_ext. Hold down the control key (as you have seen, if you do _n_o_t, the +characters you type will go into your text!), and press "N" twice. Each time, +the cursor will move one line down. We are now on the right line. You will +find that you are at the end of that line; Emacs tries to keep you in the same +"column" when going between lines, but the line with "Multics" on it is much +shorter than the line you started from (the first line, which now says, +"This is some sample text."), so you are as far as you can be on this line. + + Now let us finish the sentence "Multics is a computer system." We see +that the cursor is right after the "s" in Multics": if we just type "is", we +will get + + Multicsis + +which is surely not what we want. So type a space, and the cursor moves to +the right as a space goes into your text. Now continue entering the words + + is a computer system. + +and sure enough, your entire text appears correct before you: + + This is some sample text. + Here is more text yet. + Multics is a computer system. + + You may want to continue experimenting with the things you have just +learned: when you are done, you will have to leave the editor: this is done +as follows: type a "Control X" followed by a "Control C" (C_ for C_ommand +level). This is not an easy command to type or remember, but that is +reasonable, because you may be editing for hours, and you will only type it +once. One way to type it is to hold down the control key, and type an "X" and +a "C" while holding it. Emacs will respond, + + Modified buffers exist. Quit? + +because you have done work that you have not written out (we will learn +about writing out work later). Answer "yes" (type the letters y, e, and s, +and a carriage return). Emacs will clear the screen, and leave you at +Multics Command level. + + We have now learned the six most important Emacs commands: + + # Erase the last character + Control F Go F_orward one character. + Control B Go B_ackward one character. + Control N Go to the N_ext line. + Control P Go to the P_revious line. + Control X Control C + Quit the editor. + + + Practice using them until you are thoroughly familiar with them. They +are the most important and useful commands. With these commands, and one or +two others, you can do just about anything you will ever be called upon to +do. All the other commands just make it easier to do more complex things, +but you can always move around and type in text with these commands. + + + Deleting and Killing. + + Next we will learn how to delete text. We already know something about +this subject; we know how to use "#" to delete characters that we type in +as we type them in. Here we will learn to remove other portions of the text. +Enter Emacs as before. Type in the following text, as we did before. So that +you can follow the lesson properly, be careful to break the lines +(type carriage return) exactly as you see here: + + Once upon a time there were four bears. They lived in a house on the + edge of the forest. There was a father bear, a mother bear, and a + baby bear. One day the bears went out in the woods. + +The last thing you should have typed should have been "woods.", and the +cursor is to the right of the period in "woods.". Let us now fix the +obvious designated excess of bears: we want to change the word "four" to +"three" in the first line. As all else in Emacs, the way we do this is to +"go" to the place in question, with the cursor, and then perform local +surgery on the text at the cursor. Let us use what we have learned before, +and use the "previous line" command (invoked by striking "Control P") +twice, to get up to the first line. We now find we are in the middle of +the word "They", and we wish to go backward on this line until we are at the +word "four". So we use the "backward characters" command, invoked by +striking "Control B", for "backwards". We probably have to strike it about a +dozen times, so we should hold down the "control key" (like a shift key) with +one finger and hit "B" about a dozen or so times until the cursor is right +at the letter "f" of the word "four". If we go too far, go "forward by +characters" with "Control F" until we are at the "f" of "four". + + This may have seemed long and difficult to get to that word; there are +easier ways, and we will learn them in time, but for now, we will continue to +present the fundamental concepts and commands in the order which will allow +you to do the most as soon as possible. + + We now wish to change the word at the cursor to the word "three". In +Emacs, we do not "change" or substitute. We get rid of what we don't want, +and type in what we do want. So what we will do is _d_e_l_e_t_e the word +"four", and type in the word "three" (which we already know how to do!). +The way we will delete the word "four", for now, is by destroying it one +character at a time. We will use the "delete character" command, which +is invoked by hitting "control D", "D" for D_elete. Do this once, by +holding down "control" and pressing "D" _o_n_c_e while "control" is down. +Watch the screen. You will see that the first line is now changed: + + Once upon a time there were our bears. They lived in a house on the + +The "f" has disappeared! It has been _r_e_m_o_v_e_d from the line; the cursor +is now under the "o". Note that if we type a (D_O_N_'T_ do it) "t" now, +it will say + + Once upon a time there were tour bears. They lived in a house on the + +So let us get rid of the rest of the word "four" by hitting "Control D" +three more times, slowly, watching the screen. We now have, when this is +done: + + Once upon a time there were bears. They lived in a house on the + +The cursor is under the _s_e_c_o_n_d of the two spaces now between the words +"were" and "bears". The rest is easy; we type the letters t, h, r, e, and e, +and the word "three" appears letter by letter, between "were" and "bears", +pushing over the rest of the line as we type it. So we have now learned the +"delete character" command, which is used by typing "Control D", which +physically removes the character at the cursor from the screen and our text. + + Often we need to delete a lot more than a few characters; we want to +remove large pieces of lines, or many lines. We will now learn the +"kill lines" command, which is invoked by striking "Control K", K_ for K_ill +Lines. We wish to change the last sentence, + + One day the bears went out in the woods. + +to + + The bears often ate porridge. + +Again, the way we do this is to position the cursor to the point we want to +change, and then operate upon the text. We want to get to the letter "O" in +the word "One" on the last line. Use the Backward Character, Forward +Character, Next Line, and Previous Line commands (Control B, Control F, +Control N, Control P) any way you know how until the cursor is under the +"O" of the word "One". Now type a Control K, and watch the screen. All the +text between the cursor and the end of the line wil vanish from the screen +and from the text. Although we could just type in the new sentence right here +and now, there is a very important feature to be learned at this point. +Type a Control Y. This invokes the "Yank" command: watch the screen. The text +we had just killed is brought back. The "Yank" command brings back anything +we just killed, if we decide that killing it was a mistake. In this way, +we can fix damage that we do by accident by mistaken or inadvertent killing of +text. Almost every command in Emacs that deletes text puts the text it deletes +into a special safe place called the _k_i_l_l _r_i_n_g, where the Yank command +can find it. What is more, killed text _s_t_a_y_s in the kill ring +so that you can yank it back many commands later, or even somewhere else in +your text after you accidentally or purposefully killed it; this way, you need +not notice your mistake as soon as you make it. + + The "Delete Character" command does not put the characters it kills +in the kill ring; if you accidentally delete a character, it is easy enough +to retype it; if you delete many characters by hand, it is probably not a +mistake. + + The Yank command has left the cursor after the sentence it has +retrieved; let us re-position the cursor, with the cursor-moving commands we +know, back to the "O" in "One", and use "Control K" again to remove the +sentence. Now type in the new sentence, + + The bears often ate porridge. + +and the correction is made. + + "Kill Lines" (Control K) is a very versatile command, that does different +things depending upon whether it is used in the end of a line or not. +Let us enter some new text. Type "Control N" (Next Line) about four times +to get to a fresh place on the screen. Note that the cursor is at the +left margin; these lines are empty. Type the following well-known verse: + + I wandered lonely as a cloud + That floats on high over vales and hills. + And all at once, I saw a crowd + A host of lovely daffodils. + Beside the lake, beneath the trees, + Fluttering and dancing in the breeze. + +Position the cursor to under the "I" which starts the verse, using +all the cursor positioning commands that you know about. Now delete +all the text on that line, that is "Kill to the end of the line", by typing +a Control K. Observe the screen: the line becomes blank. Now type +Control K again, and watch the screen. All the rest of the poem moves up. +We now state what Control K does, and this explains why: + + When not at the end of a line (i.e., at the beginning, or in the + middle, Control K deletes all text between the cursor and the + end of the line, leaving the cursor at what is now the end of the + line. + + When at the end of a line, Control K "removes the carriage-return", + or "sticks the next line on to the end of this one", making one + line. If the line that the cursor is on has nothing in it + (except the carriage return), this means make this line go away. + +Now type Control K again. The line + + That floats on high over vales and hills + +will empty out. Type it once more, and that (now empty) line will disappear, +and the cursor will be at the beginning of the next line of the poem. You can +now see that typing Control K many times will delete lines one by one, off the +screen, as you type it. + + Now we will show some magic. Invoke the "Yank" command again, by +striking a Control Y, and watch the screen. Both lines we deleted came back, +intact! There has been something going on behind the scenes on the kill ring +as we have been typing Control K's: If we type an unbroken succession of +Control K's, the "killed text" is _m_e_r_g_e_d on the kill ring, so that one yank +gets it all back. Because of this feature, we do not have to painstakingly +reconstruct text that we killed line-by-line as we have done. If we did not +want to bring all of it back, it is no problem to go back and kill some of the +text that we yanked back and didn't want, but this is a lot easier than having +to retype text that we killed and couldn't yank back. Almost all Emacs +commands that delete text participate in this _k_i_l_l _m_e_r_g_i_n_g with themselves and +each other to help you recover accidentally deleted text easily, no matter how +you deleted it. + + + We have now learned three new commands, for deleting text: + + Control D Delete Character at cursor. + Control K Kill to end of line, if not already at end of line. + If at end of line, merge line with next line. + Control Y Yank back text that we accidentally killed. + + All these commands, of course, delete what is at the cursor, or bring +back text at the position of the cursor. + + Type some text, and experiment with these commands until you feel +comfortable using them, and then exit the editor as we did earlier. + + Reading and writing files. + + One of the most important things to know how to do is to read in Multics +Files, and write them out. There are three commands for doing this, and we +will now learn about them. When we read in a file, it is read into a +_b_u_f_f_e_r. Each file will be read into its own buffer. When we read a file in, +the first twenty or so lines will appear on the screen, just as though +you had typed them in. You only see as many lines at one time as fit on +the screen, however, the whole file is there, and if you try to position +the cursor to some line that is not on the screen, either by doing +Control N's so that the cursor tries to go off the bottom, or Control P's +so that the cursor tries to go off the top, or any other way, Emacs will +choose such lines to display on the screen such that the line you want the +cursor to be on is indeed shown. + + Let us read in a file. For this we use the "Find File" command. Enter +Emacs in the usual fashion. Because we do not read in files that often while +editing, the Find File command requires two keystrokes. It is invoked by the +two-key sequence "Control X Control F" (the F is for F_ind F_ile). Type this +by holding down the control key, and typing an X and an F while it is down. + + You will see the cursor go to the bottom of the screen, below the +mode line, and Emacs will say + + Find File: + +with the cursor at the end of the word "File: ". This is called a _p_r_o_m_p_t: +Emacs is waiting for you to type an "answer" to its question, in this case, +the pathname of the file to be read in. You are now in the _m_i_n_i_b_u_f_f_e_r, a +little one-line window below the mode line, used for answering prompts. +We were prompted in the minibuffer previously when we tried to exit Emacs with +modified buffers. Type the pathname of a file: a good pathname is + + >doc>subsystem>emacs>emacs.info + +which is the command writeup for Emacs. Type this pathname: you need not put +any spaces before or after it. If you make a mistake while typing, you can use +#, Control B, Control D, Control F, or any other command to edit the +pathname itself while you are typing it! End the pathname with a +carriage-return. Assuming you have typed the pathname correctly, +Emacs will now print the word "Reading.." in the minibuffer, letting you know +that it is reading in this file, and strike it out when it has finished +reading it. A little later, you will see the screen start to fill up with the +first windowful of the file. The cursor will be at the first character of the +first line. Now look at the mode line. You will see that the buffer +name is no longer "main", but "editor". The buffer name is taken from +the first component of the entry name of the file read in (in this case, +the file was "editor.info", so it is "editor"). Below the mode line is +something new, the full pathname of the file in this buffer. This is called +the _p_a_t_h _l_i_n_e, and tells us exactly what file we are editing. Of course, we +are not really editing that file, but a copy of it, and the changes we may +make will not be reflected to that file unless we try to write out the +buffer to the file. + + Now type a Control X, and an Equal Sign (=). Be sure to release the +control key before striking the equals sign. Be careful to remember to hold +the shift key if equal-sign requires a shift on your terminal. Emacs will +print in the minibuffer, + + 513 lines, current = 1 + +or something similar. Control X = is the Line Counter command. It tells you +how many lines there are in your document, and what line number the cursor +is currently on. Control X = is a handy command to know. + + Now type Next Line commands (Control N) slowly until the cursor is +on the line right above the minibuffer. Be very careful, just this time, +to do this slowly enough, so that the cursor stays in the main window. +Now note carefully the contents of the line it is on. I cannot tell you +what line that is, because I don't know how many lines your terminal has +on its screen, and that governs what line your cursor will be on now. +Now strike control N once more. You will see Emacs rewrite many lines +on your screen, and, if your terminal has the capability to do so, move +many lines around. When it is finished, the cursor will be at the +beginning of a line in the middle of the screen. Look at the line +above that. You will note that it is the same line that was at the bottom +of the screen a second ago. Control N indeed went to the next line of the +text after the line the cursor was on, as it is supposed to. Now do another +Control X =. Emacs will say something like + + 513 lines, current = 22 + +If you look at the screen, you will see that the cursor is on the twelfth +or so line of the screen, not the 22nd! However, you are editing the +file (or the buffer) and not the screen! The line you are on is indeed the +twenty-second line of the file. If you were near the end, you might be on +the 500th line or so, even though there are only 21 lines or so in the main +window. Since you can only display about 21 lines at once, Emacs chooses +_w_h_i_c_h 21 lines automatically to make sure the line that you want the +cursor to be on is on the screen. + + You can now edit this file as though you had typed it in, using all the +commands that you know. You can move the cursor about, delete characters, +kill lines, or enter new text at will. Try putting in a new word or +killing a line. At once, the word + + Modified + +will appear in the minibuffer, letting you know that you have changed the +file since you read or wrote it, and will have to write it +out if you want your work to be saved. It is not easy to do five hundred +Control N's to get through the file; we will learn more ways later of +moving around buffers faster. + + Having made some editing changes to the file, we want to write it out. +The command that writes back a file that you read it is called "Save same +file": it is invoked by the two-character sequence Control X Control S +(S for S_ave). Try it. You will get the error message + + Incorrect access on entry. + +You cannot write out this file, because it is my file, and I did not give you +the access required to write on my file. So let us write it out to a copy in +our own directory: For this, we use the Write File command, which is invoked +by the two-character sequence Control X Control W (W for W_rite File). Enter +this sequence. Emacs will prompt in the minibuffer: + + Write File: + +Now type the pathname of a place you want to write it to: + + myinfo.info + +End with a carriage return. You will see the path line change to indicate +the new pathname. As Emacs is writing it, you will see the word "Writing.." +appear in the minibuffer. When the word "Written." replaces the word +"Writing..", you know that the file has been successfully written out to +the Multics Storage System. + + Now you can edit some more, and move around within the buffer, and +when you wish to write the file out again, to the same place it was last +written to, Save Same File (Control X Control S) will do the trick. Again, +the Writing../Written in the minibuffer lets you know when Emacs is done +writing. + + We have now learned four new commands: + + Control X Control F Find file, read in a file. Asks for pathname + in the minibuffer. + + Control X Control S Save Same File, writing out the buffer to the + last place it was read from or written to. + + Control X Control W Write File: Write a file to a new place. + Asks for pathname in the minibuffer. + + Control X = Line Counter: tell how many lines in the buffer, + and what line we are on. + + + Searching + + + A fundamental ability that is needed in editing is that of looking +for a particular sequence of characters, or _s_e_a_r_c_h_i_n_g. In the context of +E__m_a_c_s, this means finding a given sequence of characters in the buffer, +and moving the cursor to that point. There are two simple commands +for searching in Emacs: we will learn them next. + + Enter Emacs as usual. Enter the following text: + + Now is the time and the only time for those who have + their time to give their time. + + Using Control P (Previous Line) and Control B (Backward Character) +move the cursor to the upper left hand corner (under the "N" of "Now") +of the screen. We will now search for the word "time". We use the +String Search command, which is gotten by typing a Control S. Do it. +Emacs responds in the minibuffer: + + String Search: + +We now enter the four letters t, i, m, and e. End the string with a carriage +return. You will see the cursor return +to the main window, but now it will be immediately after the first occurence +of the word "time". Let us replace the word "time" here by "day". We will +learn a little trick. By all rights, we should go backwards (Control B) +four times, and then delete characters (Control D) four times to delete +the word "time". That would work; however, there is an easier way. Type +a pound sign (#). Note that the "e" of "time" goes away. If we type +the "#" another three times, the t, i, and m will go away too! This is what +pound sign always does: it deletes the character to the left of the cursor, +whether you just typed it in or not. Think about it. When you type in a +character, the cursor moves to the right of it, and it is now to the left of +the cursor. Typing pound sign makes it go away because pound sign deletes +the character to the left of the cursor. This is distinct from Control D, +which deletes the character _a_t the cursor. + + Finish deleting the first occurence of the word "time", and type in +"day". Now let us look for "grime". Type a Control S, and in response to the +prompt "String Search: ", type the letters g, r, i, m, and e, and a +carriage return. Emacs will respond + + Search fails. + +in the minibuffer, because it could not find the string "grime", and +the cursor remains in the place where it was when the Control S was +typed. Now let us again look for "time". Type a Control S, the letters +t, i, m, and e, and carriage-return. The cursor advances to the next "time" +in the buffer. Do it again, and the same thing happens. Note carefully +that Control S only searches forward in the buffer, from where the cursor +is at the time it is used to the end of the buffer. It will not look +backwards. That is why it puts you _a_f_t_e_r the string it finds, so that +it will not find the same one all the time. Note how easily we can find +the same string many times in a line. + + Now go back to the beginning of the buffer, with Control P's and +Control B's. We are going to look for the string "time" again, but this +time, a little bit differently. Type a Control S. Emacs again prompts, + + String Search: + +Type a carriage return.. You will see Emacs put the word "time" right in the +minibuffer, as though you had typed it, and find the first "time". When you +answer a search command's prompt with an "empty search string", that is to +say, typing carriage return, Emacs will re-use the last "search string" +(sequence of characters) you were searching for. This applies to all the +various search commands. Using this, we can search many times for the same +thing, without having to retype it into the minibuffer. Search two or three +times for "time" again (please do this, so that this lesson will continue to +work). + + Now we will learn a very important Emacs command, "Get out of what you +are doing", which is gotten by issuing a Control G. Try it. Your terminal +will beep at you. Control G always causes your terminal to beep at you. +Now type a Control S again. Emacs will prompt in the minibuffer, as always, + + String Search: + +Suppose we decide that we didn't want to search for anything, and that typing +the Control S was a mistake. Now type a Control G: the cursor will exit +the minibuffer, and the terminal will beep. The search command has been +aborted. Control G can always be used to exit the minibuffer to abort +any command that you change your mind about in midstream, such as +Find File, or Write File, etc. It can also be used after typing a +large number of cursor movement commands to cause your terminal to "beep" +when they are all done. Sometimes, this is useful when the system is slow, +as a way of letting you know that Emacs has "caught up" to what you told it +to do. Control G is very important, it is an "out" whenever you start +doing something that you change your mind about, or aren't sure what you +typed. If you ever find yourself in the minibuffer with a prompt that +you think you didn't ask for, or don't understand, like + + Eval: + +you can be sure that typing a Control G will get you out of it without +doing any harm. + + The next command we will learn about is Reverse String Search: it is +invoked by striking a Control R. Try it. Strike a Control R. Emacs will +prompt in the minibuffer: + + Reverse String Search: + +Type carriage return, like for Control S (String Search). The string "time" +will appear in the minibuffer, as we had promised. The cursor will be left +_b_e_f_o_r_e (i.e., under the first character of) the first occurence +of "time" going backwards from where the cursor was when you typed the +Control R. If the cursor was right after a "time", it will now be at the +front of the same one. Do it again. The cursor will go one "time" back +each time, until there are no more between the cursor and the beginning of the +buffer, at which time Emacs will respond + + Search Fails. + +in the minibuffer. If we want to change one of these "time"s to an +"hour", we need only type four Control D's (Delete Character) and the +word "hour" after finding one. + + Reverse String Search is just like String Search, except + + 1. It goes backward to the beginning of the buffer, while forward + search goes forwrd to the end. + 2. It leaves the cursor _b_e_f_o_r_e (at the front of) the found + string, while String Search leaves it _a_f_t_e_r. + +Otherwise, String Search and Reverse String Search both prompt in the +minibuffer, take a string terminated by a carriage return to use for a search +target, and use an empty string (a carriage return as answer) to indicate that +the last search string used should be used again. + + When you are searching for something in Emacs, you have to know if you +want to search forward or backward for it, from where you are now; usually, +you know this. If you don't, you should search forward. If the search fails, +just hit a Control R and a carriage return, and Emacs will search backward for +the same string. If _t_h_a_t search fails, the string is really not in the +buffer. + + We now have learned three new commands: + + Control S String Search. Prompts for a string in the minibuffer, + which must end with a carriage return. An empty string + uses the last string over again. Searches forward for + that string to the end of the buffer, and leaves you + after it. + + Control R Reverse String Search. Same as above, but goes backward. + Leaves you at start of found string. + + Control G (Command Quit) Get out of anything, and beep the + terminal. Often used to get out of minibuffer + prompts that you change your mind about. + + + Two Very Useful Commands + + We will now learn two useful commands that you will use all the time. +We will not give any examples here, because what they do is so simple. Try +them yourself any way you want, but learn them. + + Control A Go to beginning of line. Moves the cursor to the beginning + of whatever line it is on. The way to rememeber it + is that "A is the first letter at the beginning of the + alphabet". We could not use "B" for "Beginning", + because, as we know, Control B is for "Backward + Character". + + Control E Go to end of line (E for E_nd). Moves the cursor + to the end (after the last character, before the + carriage return) of whatever line it is now on. + On a line with nothing on it (nothing _i_n it but a + carriage return), this does nothing. + + + + Wiping, the Mark, and the Region + + We will now learn three new concepts, and three new commands. +We will learn them in order to be able to delete arbitrary extents of text +(i.e., "from here to there", or "all that stuff") as opposed to killing +lines and characters carefully to get rid of exactly what we want. Enter +Emacs. Type in a paragraph or so of text, of your choice. Choose a +few words next to each other somewhere. It is all right if they are not +on the same lines. Let us delete this "extent", that "much" of the text. +The command we will be using is Wipe Region, which is invoked from +Control W (for W_ipe Region). We tell it what to "wipe", that is, wipe off +the screen and out of the text, or delete, by giving it the "here" and +"there", that is, the "limits" or "boundaries" of the region to delete. +It will delete all the text between the two points we tell it to. + + How do we specify the "region" of our buffer that control W is to delete? +By its limits. How do we specify the limits? One limit will be the cursor +at the time we strike the Control W. The other is specified by an "invisible +cursor" called "the mark". There is at most one "mark" in each buffer. Until +we "set the mark", there is no mark in the buffer. Type a Control W. +You will find that Emacs will complain that there is no mark, and nothing +will happen. We "set the mark" by moving the cursor to the place we +want "the mark" to be, and issuing the command "Set the Mark", which is +invoked by Control @. This is a very tricky command to type. It is typed, +like any control character, by holding the control key, and typing, in +this case, the character @. On some terminals, you may even have to +hold Control and Shift at once to make this happen, if you normally have +to hold the Shift key to get an @. If you have trouble with this, ask someone +familiar with the terminals in use at your site; tell him you are trying to +"Generate an ASCII NULL, or a Control At Sign", and hopefully he or she can +show you how to type one. + + Move the cursor to be under the _f_i_r_s_t character of the first word that +you have singled out for deletion. We will set "the mark" here. Type the +Control @. Absolutely nothing will happen: this command doesn't "do" +anything visible. Now move the cursor to right _a_f_t_e_r the _l_a_s_t letter of the +_l_a_s_t word in the group we singled out for deletion. We are now ready, in +principle, to issue the Control W (Wipe Region) command, but let's not. +There is usually something we want to do right before issuing a Control W: We +want to check that "the mark" is where we think it is, because it might have +been some time ago that we set it. For this we use the command "Exchange +Point and Mark" ("point" is the name for the place in the buffer that the +cursor is located at. If you don't understand the difference between that +and the cursor itself, ignore it for now.) This command switches the cursor +and "the mark" around, putting the cursor where the mark was and the mark +where the cursor was. The visible effect of this is to move the cursor to +where the mark was, so we can see where it was. The "Exchange Point and Mark" +command is issued by typing Control X Control X (i.e., two Control X's in a +row). Remember "X" for E_xchange. Do it. The cursor will move to under the +first character of the region we are trying to delete, the place where we +had set the mark. Now before doing any other commands, do another +Exchange Point and Mark (Control X Control X) to get back. +It is very important that you do not move the cursor at all before typing +the second pair of Control X's, or you will exchange the mark with the +wrong point! It is very common to type Control X Control X, Control X +Control X in this way, to "verify" the "region" between the "point" and +"the mark". + + Now issue the Control W (Wipe Region) command. You will see that all +the text you singled out for deletion disappears from the screen (and thus +from your text). If there was a carriage return in the middle of them, you +will see that that too has gone, and one big line now replaces the two lines +between which the carriage return had been. + + Like The Kill Lines command (Control K), the Wipe Region command +(Control W) puts what it removes in the kill ring. Type a Control Y now +(the Y_ank command). All the text you had deleted reappears. If you +ever hit Control W by accident (for instance, instead of Control E), and +see loads of text mysteriously vanish, just type Control Y and it will +all come back. As a matter of fact, if you ever see text vanish off your +screen or out of your buffer for a reason that you don't think you understand, +the chances are better than even that simply typing a Control Y will +fix it all up. + + A useful feature of the Yank command is that it puts "the mark" at the +_b_e_g_i_n_n_i_n_g of the text it retrieves, and (as can be seen), leaves +the cursor after it. This has two implications that should be noted: + + 1. After you have yanked some text, no matter for what reason, you + can make it go away again simply by typing Control W (Wipe Region), + since the cursor and the mark exactly specify the boundaries of + what was yanked. + + 2. After you have yanked something, no matter for what reason, you + can get to (move the cursor) to the beginning of the yanked text + by exchanging the cursor and the mark, simply by typing + two Control X's, the "Exchange Pont and Mark" command. + + If we had known the second of these facts when we were learning about +Control K (Kill Lines), we could have gotten to the beginning of the +sentence + + One day they went out in the woods. + +after we had yanked it back simply by typing Control X Control X. + + The text in the buffer between the cursor and the mark is called +"the region". There are many Emacs commands besides Wipe Region (Control W) +which use the region, and the commands we learned for setting the limits +of the region and testing what they are are useful for all of them. + + We have learned three new commands: + + Control @ Set the mark to be where the cursor is now. + + Control X Control X + Switch the cursor and the mark around, to show us + where the mark was. The mark is now where the cursor + was, and the cursor is now where the mark was. + + Control W Wipe Region. Remove the text between the mark and the + cursor from the text and the screen. Save it on the + kill ring for possible subsequent yanking. + + Numeric Arguments + + + Next we learn about how to say "go FIVE characters forward", or +"go FOUR next lines down" and so forth. Commands for which it is meaningful +and useful to specify "how many times" to do them usually will accept what +is called a "numeric argument", which is essentially a repetition count. +For instance, if we give the "Next Line" command (Control N) a numeric +argument of 25, it will go 25 lines down instead of one line down as it usually +does. If we give the "Delete Character" command (Control D) a numeric +argument of 6, it will delete 6 characters, instead of the one it usually +does. + + Search around on your keyboard for a key labelled "ESC", "ESCAPE", +"ALT", or "ALTMODE", or something like that. This is called the "ESCAPE" +key, which generates a character called the "ESCAPE character". We +will refer to it by the letters ESC; this means strike and release the +ESCAPE key, do _n_o_t type the letters E, S, and C! + + We specify a numeric argument to a command by typing an ESC character +(hitting and releasing the ESCAPE key once), the number we want, and +the command we want to receive the argument. For instance, to delete +six characters, we would type the _t_h_r_e_e keys + + ESC 6 Control-D + +That is, strike the escape key, the 6 key, and a Control D in that order. +All the characters will disappear at once: you will not see them go one by +one. Similarly, if you said + + ESC 249 Control-N + +while on the first line of a large file, the screen would fill immediately +with lines 240 to 261 (roughly) of the file, with line 250 and the cursor +in the middle. You will be spared watching the cursor and the screen +step through 250 lines one by one; it is done all at once. + + The following commands that we have already learned about accept +a numeric argument to mean "Do it that many times". The complete list +is given in the Emacs reference document: + + Control B Backward Character + Control D Delete Character + Control F Forward Character + Control N Next Line + Control P Previous Line + +If you give a numeric argument to Control K (Kill lines), it does _n_o_t +do that many Control K's, it does something more useful. Starting +with the current point on the current line, it kills entirely (removes) +that many _e_n_t_i_r_e lines. Thus, if you are at the beginning of a line +(doing a Control A, Go to Beginning of Line can ensure this), + + ESC 4 Control-K + +will delete this and the next three lines entirely. Of course, these +lines will be put as one on the kill ring, and will "_k_i_l_l _m_e_r_g_e" +with preceding or following "kill type" commands as described above. + + The "Yank" command also does something useful and different with +a numeric argument. The kill ring is so called because it is like a ring +of text excerpts that were deleted. Whenever you kill some text, +the "ring" is rotated one of its ten positions, and the newly killed text +goes in the front position, replacing what had been in the tenth position. +It is like a merry-go-round with ten horses, and one on/off point. +The ten positions on the kill ring thus contain the last ten text excerpts +that you killed. (When kill merging occurs, this does not happen, as the +new text gets "stuck on to" the text in the ring at the on/off point). +When you use a "Yank" command (Control Y), it is always the latest thing +that you killed (i.e., the excerpt at the on/off point) that is retrieved. +If you want the _s_e_c_o_n_d latest thing instead, simply give the +Yank command a numeric argument of 2 by typing + + ESC 2 Control-Y + +instead of just + + Control-Y + +and that will happen. + + There is a wonderful command that expresses the following situation. +"I deleted some text. Then I went somewhere else, and I deleted some +more text. Then I decided that the first text I deleted was really O.K.; +deleting it was a mistake. So I went back to the point where I deleted it +from, and used the Yank command (Control Y). However, that was a mistake, +because it brought back the text from the second thing I had deleted, +which was, indeed, the last thing I had deleted. I wish I could say +"Get rid of that stuff, and bring back the previous saved text in the +kill ring." " + + There is such a command. It does precisely that. It gets rid of +the text between the cursor and the mark (which was, presumably just yanked +by mistake), without saving it on the kill ring, "rotates" the kill ring +one position _b_a_c_k_w_a_r_d_s, and retrieves the text at the on/off station. + +It is typed by the two-character sequence + + ESC y + +That is to say, press the two keys, ESCAPE and Y (lower case or capital, it +does not matter) one after the other. (Be careful to type the two-key +sequence deliberately and firmly; do NOT hold down the ESC key while typing +Y: it is NOT like the CONTROL key.) It is called the "Wipe this and Yank +Previous" command: + + ESC Y Wipe this and Yank Previous. I don't like what + I just yanked. Get rid of it, and bring out the + previous thing I killed. + +By doing many ESC Y's in a row, until you "find the kill that you want", +you can "go shopping" in the kill ring for saved text. + + Whether you realize it or not, normal letters and numbers are actually +Emacs commands, too! For instance, we know that Control D means "Delete the +character at the cursor". But what does an ordinary "D" mean? What happens +when you type an ordinary "D"? What happens when you type any number or letter +or punctuation mark? It goes into the buffer, and appears on the screen. +The first thing we ever did was to type ordinary text into Emacs. +Printing characters (other than #, @, and \), are said to be +_s_e_l_f-_i_n_s_e_r_t_i_n_g, because if you type one, it inserts itself into +the text. + + We mention this now because giving a numeric argument to a self-inserting +character causes it to insert itself that many times. For instance, +if we type + + ESC 2 4 Q + +we will see twenty four Q's appear on the screen all at once. This is a +good way to get lines of dashes, underscores, stars, etc. + + If ever you type a numeric argument, or are in the middle of typing +a numeric argument, or have just typed ESC, and you decide that you +didn't mean it, or you are not sure as to whether you typed the numeric +argument or not, type a Control G, which G_ets you out of anything. The +reassuring beep of Control G will verify that any possible numeric argument +has been discarded. + + The First Help Command, and Local Displays + + There is a command that will tell you what command a given key performs. +This is a good command to use if you are not sure what a given key does, and +you do not have the documentation on hand. It displays the documentation for +a given command on the screen. It is called Describe Key, and is invoked by +striking the two-key sequence + + ESC ? + +Try it. Let's find out about what Control E is and does. +Type an ESC, and then a question mark. Emacs will prompt in the +minibuffer with + + Explain Key: + +Now actually type a Control E, in the usual manner. Emacs will probably wait +a little while before responding, especially if this is the first time you +have used ESC ? since entering Emacs and system load is heavy. Be patient. +The documentation for Control E, Go to End of Line, will appear at the top of +the screen, replacing whatever text you were editing on the screen. Bu do not +worry, it did not destroy your text; it is just being "displayed" to you on +the screen "in front of" your text. The line of dashes and stars: + + -- * * * * * * * * * * * * -- + +is there to let you know that your buffer has not been destroyed, but simply +that there is information being displayed for you to see "in front of" it. +Such a display is called a L__o_c_a_l D__i_s_p_l_a_y. We will shortly learn how to get +rid of the local display, when we are finished viewing it, and restore the +window on our buffer to the screen. + + The documentation for Control E begins with the line + + ^E go-to-end-of-line + +"^E" is the shorthand for "Control E" which is used in the reference document, +and in displays and error messages produced by Emacs. It is a good shorthand, +because "Control X Control Q ESC B Control D" etc., can get long-winded. +We will use this convention from hereon in. When we say "^A", we will mean +"Control A", i.e., hold down the control key and strike an A", _n_o_t the +character "^" followed by an "A". + + "go-to-end-of-line" is the _c_o_m_m_a_n_d _n_a_m_e associated with +^E. At this stage, it serves only to remind us of what ^E does. When a great +deal of proficiency in using Emacs has been acquired, these command names +can be used in computer programs to build commands of your own. +As a matter of fact, once you know the command name, you can "connect" any key +of your choice to any command of your choice if you don't like the default +layout of what key does what (see the writeup of the "set-key" and +"set-permanent-key" extended commands if you want to learn about this). + + The documentation describing go-to-end-of-line follows the line giving +the key name and command name. The documentation is the same that you would +find in the Emacs reference document; it describes everything there is to know +about the command in question. + + When we have finished viewing the local display of the command +documentation, we wish to remove it from the screen. If you just start +editing again, typing editor commands, the display will vanish as soon as you +start typing, putting back on the screen what had been there. However, you +might not know where the cursor was "supposed to be", because the local +display is standing there in front of it. For this reason, a command is +provided that does _n_o_t_h_i_n_g _a_t _a_l_l. Since typing _a_n_y editor command makes the +local display go away, this command may be used for making local displays go +away without doing anything else. It is invoked by striking the Linefeed key +on your terminal. The "noop" (No Operation) command is invoked by Linefeed +(which is the same as Control J on all terminals). For reasons too complex to +describe here, it is recommended, and cannot hurt, to hit Linefeed two or +three times to get rid of a local display. + + Sometimes, local displays will take more than one screen. In this case, +the last line of the screen will say + + --More?-- (Space = yes, CR = no) + +If you see this on the last line of the window, hit the space bar once to see +each successive screen of the local display. When you are at the last screen +of the local display, the line of dashes and stars + + -- * * * * * * * * * * * -- + +will appear, and Linefeeds may be used to restore the buffer to the screen. +If, during a multi-screen local display, you decide that you do not want to +see the rest of the display, typing a carriage return instead of the space bar +will terminate the display and restore the buffer to the screen. + + Occasionally, you may forget what command a given key invokes, or need to +find out "what you just did by accident". You can ask for the name of the +command invoked by a given key without the documentation. This can be +preferable at low terminal speeds, or on a slow system, where the local +display can take some time, or if you just need a reminder of what is +"connected" to some given key. This can be done with the Describe Key command +by giving it a numeric argument, i.e., + + ESC 1 ESC ? + +(a four-key sequence). Type that. Emacs will prompt: + + Show Key Function: + +Type, for instance, a Control W. Emacs will respond in the minibuffer, + + ^W = wipe-region + +which is precisely what we wanted to know. + + We now know two new commands: + + ESC ? Describe Key. Prompts for you to type a key, + and supplies the documentation for that key as + a local display. If given a numeric argument, + tells what command is invoked by that key. + + Linefeed No Operation. Type it two or three times to remove + a local display from the screen. + + + T__h_e B__u_f_f_e_r _a_n_d _t_h_e S__c_r_e_e_n + + + Very often we wish to "page" through a document, reading through it like +a book, either to actually read it, or to "flip through" until we arrive at +the place we want to see or edit. Using Emacs, this is accomplished by +"paging" through the text in the buffer screen by screen. That is to say, +after we finish reading or looking at the text on the screen, we want to see +the next screenful (actually, the next windowful). The next windowful of text +is that text in the buffer which immediately follows the text now in the +window. That is the text we wish to progress to, and fill the window with. +The command for doing this is "Next Screen", which is gotten by striking +Control V (for V_iew Next Screen). This is a very easy key to type with your +left hand alone; use your thumb, while holding down the control key, to page +through successive windowfuls of a document. + + Read in some file and "^V through it". You will note that each time you +strike a Control V, the cursor will be left at the upper left-hand corner of +the screen: not only has the window been filled with new text, but the cursor +is now in a different place in the buffer, at the beginning of the text which +fills the window. The text now in the window, of course, is not the only part +of the buffer you may edit. If, for instance, after using ^V, you use a ^P to +go to the previous line, you will observe Emacs choosing a different portion +of the buffer to display in the window. Emacs usually chooses its window, +(i.e., what part of the buffer to show in the window) automatically, governed +by where in the _b_u_f_f_e_r you moved the cursor. ^V is one of several ways, and +the first we have learned thus far, to explictly select what will be displayed +in the window. + + Note that when you use ^V, the first line of the new screen will be the +same as the last line of the old screen. This is to give you some context, +and a sense of continuity, so you will know you haven't missed anything, or +forgotten what you were reading while the screen was being refilled. + + As we can page "forward" through a buffer, so we can page "backward" as +well. As this is less common, it takes two keystrokes. The two-key sequence +ESC V invokes the "Previous Screen" command. Remember, C__o_n_t_r_o_l V for the next +screen, E__s_c_a_p_e V for the previous one. ESC V will make the last line of the +new screen be the same as the first line of the old one. + + Now we can go forward and backward through the buffer line by line (^N +and ^P), character by character (^F and ^B), windowful by windowful (^V and +ESC V), or by searching (^S and ^R), and we will learn many more ways yet. +However, among the most common of needs are to go to the _b_e_g_i_n_n_i_n_g of the +buffer, the _e_n_d of the buffer, and to a given line number. +The command "Go to Beginning of Buffer" is invoked by the two-key sequence +ESC <. Think of the "less than sign" as an arrow pointing backward to the +beginning of the buffer. Using ESC < will place the first windowful of the +buffer on the screen, and place the cursor at the very first character of the +buffer. This is often useful when going through the entire buffer looking +for something or changing things one by one as you see them. + + As you might have guessed, ESC > is "Go to End of Buffer". The "greater +than sign" may be thought of as a little arrow pointing to the end of the +buffer. It places the last windowful of the buffer on the screen, and +places the cursor on the newline character (the "carriage return") which ends +the last line of the text in the buffer. That is the furthest place in the +buffer that the cursor can go; it is the end of the last line in the buffer. +There is no way to move the cursor to beyond that character. If, after using +ESC >, you see the cursor on a line by itself, that simply means that there is +an "empty line", i.e., one with nothing but a newline in it, at the end of the +buffer. + + When editing Multics programs, it is often very useful to go to a given +line number (e.g., the 240'th line of the buffer), because many Multics tools +give diagnostics in terms of line numbers in their input files. If you happen +to be positioned on the first line of the buffer, going to the 241's line is +easy; just do 240 ^N's by typing + + ESC 2 4 0 ^N + +If you are not on the first line, you could use ^X= (Line Counter) to figure +out where you are, subtract, and use ^P or ^N with the right numeric +argument, but this is hardly reasonable. Therefore, Emacs provides the +"Go to Line Number" command, which is invoked by the two-key sequence +ESC G (G for G_o). The numeric argument to ESC G tells it what line number to +go to. For instance, + + ESC 2 5 9 ESC G + +will move the cursor to (the beginning of) line 259 of your text, no matter +what line you are on now. As is the case with searching, ^N and ^P, and any +Emacs cursor movement commands, if the target of the motion (the place in the +_t_e_x_t being gone to) is not on the screen, a new window will be selected and +displayed automatically such that the target of the motion _i_s on the screen. + + When editing multiple files, each use of ^X^F (Find File) will result in +a new buffer. You may switch between buffers with the "Go Buffer" command, +which is invoked by ^XB (B for B_uffer). Be careful when typing this command: +be sure to release the control key before typing the "B" (the B need not be +capitalized; Emacs does not distinguish between upper and lower case letters +in editor commands (other than self-inserting characters)). When you type a +Control X and a B, Emacs will prompt for a buffer name to go to. Type the +name of the target buffer, ended by a carriage return. If you give the name +of a buffer that does not exist, Emacs will create such a buffer, and display +it on the screen (you will see an empty window). If you give the name of a +buffer that does exist, Emacs will refresh the screen with the last windowful +of that buffer that you were editing, that is to say, such a window of that +buffer that the last point you were at with the cursor when editing in it is +now on the screen, and the cursor will be placed at that point. + + Note that when you switch buffers with "Go Buffer", the mode line +changes, to indicate the new buffer name (and the new buffer modes, if they +have changed as well, because modes may be different in different buffers, and +are "remembered" in that buffer. We will learn later about some useful +modes.) The path line (the line under the mode line) will change as well, to +let you know the pathname of the file which was read into this buffer (or last +written out from it). + + You may list all of the buffers in a given invocation of Emacs with the +"List Buffers" command, ^X^B (Control X, Control B). The listing of buffers +will be displayed as a local display; hit linefeed two or three times to get +rid of it, as all local displays. The name of each buffer, and the pathname +of the file in it, if any, will be displayed. To the left of the buffer names +will be two symbols, for some buffers, ">" and "*". The "greater than" sign +will be placed to the left of the name of the buffer in which you are now +editing. The star will be next to the name of any buffer which is "modified", +i.e., has never been written out (but isn't empty), or has been modified since +last read in or written out. Only when there are "no stars" will ^X^C allow +you to exit Emacs without querying you. + + Go Buffer (^XB) provides a convenient service for going back to the last +buffer you came from. If you answer its prompt + + Buffer: + +with _j_u_s_t a carriage return, i.e., no buffer name, Go Buffer will go back to +the last buffer you had been in before entering the current buffer. This may +be used to "visit" another buffer and come back easily. + + Occasionally, you may not believe what you see on the screen. Sometimes +bad telephone lines, or unexpected messages from Multics, or things you just +don't understand ("I _k_n_o_w that's not there!) may cause the screen contents to +become invalid. This may be due to hardware problems, bugs in new versions of +Emacs, or bugs in your terminal. At any rate, there is a need to clear the +entire screen and put it back the way it should be, without any regard for +what was there. This is like clearing one's throat, or clearing the top +of the table. This is accomplished with the Redisplay Command, which is +gotten by striking ^L. ^L is used for this purpose because many terminals, +and some parts of the Multics Communications System, associate the Control L +character with the clearing of screens. Try striking ^L; you will see the +screen clear, and be refilled, with the cursor in the middle of the screen +(unless you are at the top of your text buffer, in which case it will be at +the top). On fast terminals, ^L can be used just to "reposition the window" +such that the line with the cursor on it is at the middle of the window. +(this will work on all terminals, but may be too slow to be useful on slow +lines). ^L will also make local displays go away, and on fast terminals, is +often used for this purpose as well. ^L with a numeric argument is used to +reposition the window, i.e., keep the cursor at the same point in the buffer, +but "move the window around" so that the line with the cursor on it +is at a place of your choosing in the window; a numeric arguemtn of zero is +the top of the window, and so forth. See fundamental-mode.info for more +information on this. + + We have now learned seven new commands for manipulating screens and +buffers: + + Control V Next Screen. View the next screen of the buffer + in the window, and leave the cursor at its top. + + ESC V Previous screen. View the previous screen of the + buffer in the window, leave the cursor at its top. + + ESC < Go to the beginning of the buffer. + + ESC > Go to the end of the buffer. + + Control X B Go Buffer. Prompt for the name of another buffer, + and switch to it, displaying it on the screen at the + last point you left off editing it. If you give + ^XB no buffer name, it will go to the previous buffer + you had been in. + + Control X Control B + List Buffers. Show as local display the names, + file pathnames, and modified/not modified status of + all existent buffers. + + Control L Redisplay Command. Clear the screen and refresh it, + eliminating possible non-understood garbage. With a + numeric argument, reposition the window. + + ESC G Go to Line Number. Go to the beginning of the line + whose line number is supplied as a numeric argument. + + + A__p_r_o_p_o_s _a_n_d E__x_t_e_n_d_e_d C__o_m_m_a_n_d_s + + Some commands are issued by a single keystroke, such as ^D, which invokes +the Delete Character comand, delete-char. Other, less common ones, are +invoked by two-key sequences beginning with ESC, such as ESC G, which invokes +the command go-to-line-number. Others, less common yet, are invoked by +two-character sequences beginning with ^X (X for E_xtended key). Commands that +are the least common have to be invoked by actually typing in the name of the +command. + + By "less common", we do not mean that a command is obscure, little-used, +less important, or not widely known or understood. What we do mean is that +during the course of normal editing, you will use it fewer times than more +common commands. For instance, you only use ^X^C (quit-the-editor) once per +editing session, but it is one of the first and most important commands you +must learn! The commands that you must type most often are made the easiest +to type. The simplest commands to type (the single key "control"'s) are those +that you would want to type _r_a_p_i_d_l_y. A fine example of this is ^T, +twiddle-chars, which exchanges the last two characters typed. It is not a +necessary command, as two pound signs and two more characters can do whatever +it does. But given that ^T can be typed in one character, it is useful. + + The commands known as "Extended Commands" are those invoked by typing +their command names at Emacs. An example of an extended command is "fillon", +which enters "fill mode" in a buffer. Fill mode is a setup of a buffer such +that you do not have to worry about the ends of lines when typing text, and +never type carraige return (except, of course, when ending prompts, or where +you want explicit control over the format and line-breaks of your document). +Fill mode is ideal for typing in text from a written page, or composing a +document spontaneously. One types and types and lines get broken +automatically. + + To invoke the "fillon" command, we clearly cannot just type the characters +"fillon" at Emacs, or they will go into the buffer like any other characters. +We must somehow tell Emacs that we wish to type the name of an extended +command. The "Extended Command" command, which is invoked by ESC X, does this. +The "X" is for E_xtended. Type the two-key sequence Escape X. +Emacs will prompt in the minibuffer, + + Command: + +Now type the word "fillon" (no quotes, just the six characters), followed by a +carriage return. You will see the name of the "fill" _m_i_n_o_r _m_o_d_e appear in the +mode line after the name of the current _m_a_j_o_r _m_o_d_e (Fundamental). + + In general, we invoke an extended command by typing ESC X, the name of +the command (and then any arguments, if the extended command takes command +arguments), and a carriage return. + + Now try fill mode. Type in a long, very long sentence, consisting of +very many real, separate words. Watch what happens when you get to the end of +the screen, as you type successive words. Do not worry about typing carriage +return; your lines will be automatically "filled" as they become too long. + + The most important extended command is the "apropos" extended command. +"Apropos is a word (from the French) meaning "about, or having to do with". +It is used to find the names, and keys, of all commands that have to do with a +given topic. It is used if you remember something about a particular command, +but you cannot remember the key that invokes this particular command, or what +its name is. The "apropos" extended command will find all commands that have +a given character string in their name, and tell you what keys invoke them. + + For instance, suppose you forgot the name of the key that went to the end +of a line. Type + + ESC X apropos end CR + +(The "CR" means "carriage return"). Apropos will display, as a local display, +the names of all commands available in this buffer whose names contain the +character string "end". It will tell you of ^E (go-to-end-of-line), +ESC > (go-to-end-of-buffer), and a few surprises (such as ^XM, s_e_n_d-mail), and +others. Once we learn from apropos what commands are available, we may be +jolted into recognition ("Oh, yes, ^E was go-to-end-of-line!"), or need more +information ("Hmm, ^E looks right. I'd like to know more about it."), and use +ESC ? (Describe Key), by typing, say ESC ? ^E, to get the full documentation +on a particular command. + + Apropos will also list all relevant extended commands, when listing +commands whose names speak of a particular topic. We cannot use ESC ? +(Describe Key) to find out about extended commands, for it prompts for a +single key, and tells about it. If we typed "fillon" to ESC ?, it would read +the "f", and tell us about "f" ("f" puts an f into the buffer, etc.), and put +"illon" into our buffer. So, there exists an extended command to retrieve +documentation for extended commands: it is called "describe". To find out +about the "fillon" extended command, we type + + ESC X describe fillon CR + +The command documentation will be shown as a local display. We can find out +about describe itself, + + ESC x describe describe CR + +or about apropos + + ESC X describe apropos CR + +if that is what we want to do. + + + We now know the three commands that constitute the core of the Emacs +self-documentation and help system: + + ESC ? Describe Key. Prompts for a one or two key sequence, + and gives as local display the documentation for the + command invoked by that key. + + ESC X describe CR + Gives as local display the documentation for the extended + command whose name is given. + + ESC X apropos CR + Gives as local display a list of commands whose names + contain the character string given as , and + tells what keys invoke them, in the current buffer. + Relevant extended commands are also listed. + + The "<" and ">"'s in the above descriptions do not mean that you should +type <'s and >'s. They are being used as "pointy brackets". That is to say, +"" means any character string, being some topic you want help on. +We use the "pointy brackets" so that you will not be misled into typing the +character string "topic". + + We have also learned of the "fillon" extended command: + + ESC X fillon CR + Enters "fill" minor mode in the current buffer. This + causes overlength lines to be wrapped around and broken + as they cross the "fill column". Ask the "describe" + extended command to tell you more about fill mode. + + + W__o_r_d C__o_m_m_a_n_d_s + + Some of the most useful commands in Emacs are those which relate to +words. Even if we are typing computer programs or other non-English text +material, the facility to move around word by word, delete words, etc., is a +very useful one. + + The word movement and deletion commands have a deliberate parallelism +with the character movement and deletion commands: ^F, ^B are Forward +Character, Backward Character, and ESC F, ESC B are Forward Word, Backward +Word. Similarly, ^D and # are Delete Character and Rubout Character, while +ESC D and ESC # are Delete Word and Rubout Word. + + A "word" in Emacs consists of an unbroken string of upper and lower case +alphabetics (a-z and A-Z), underscores and backspaces. For instance, +"new_payroll" is a word, "_b_e_g_i_n" is a word, "delete-char" is two words, and +"segname$entry" is two words. "March, I said." is three words. + + The "Forward Word" command (ESC F) moves the cursor forward over one +word. If the cursor is currently on a character that is part of some word, +the cursor will be moved to the first character after that word. For +instance, if the cursor is on the "e" of the word "Yes" in the fragment + + "Yes, it is true," he said. + +and the Forward Word (ESC F) command is issued, the cursor will be left +positioned on the comma after the word "Yes". If the cursor is now on a +character between two words (even if they are separated by many blank lines, +or many lines full of punctuation, breaker bars, etc.), Forward Word will +position the cursor to the first character after the _n_e_x_t word in the buffer. +Thus, if the cursor is on the comma after the word "Yes" in the above example, +and the Forward Word command is issued, the cursor will be moved to the space +after the word "it". + + Moving around by words is often the fastest way, or the most convenient +way to move the cursor to where you want to go from where you are. It is +quite common to type ESC F ESC F ESC F etc. to move a word at a time, watching +the cursor. You might also judge "I want to go six words forward, roughly", +and issue the key sequence + + ESC 6 ESC F + +which is allowed, because Forward Word accepts a numeric argument as +a repetition count. However, doing ESC F's one at a time to move forward +word-by-word is still an often-needed technique. There are some problems in +that technique, however, because any slip-up in typing + + ESC F ESC F ESC F ESC F + +and you may have + + ESC F ESC F ESC ESC F F ESC F + +or similar, which is not what you want. (If, by the way, you fall into this +trap, and ESC ESC gives you "Eval:", do a ^G to get out of it.) Therefore, +the command Re-execute Command (^C) is provided to make this and similar +operations easier and less error-prone. Typing a Control C re-executes the +last editor keystroke command entered. Thus, after typing ESC F to go forward +a word, each typing of the single keystroke ^C will go forward another word. +With good system response, this can be very effective. + + To go backward by words, Backward Word (ESC B) is provided. It is +similar to Forward Word, and most other Emacs forward/backward motion +commands. If the cursor is on some character of a word, other than the first +character, it will be moved to the first character of the word. If on the +first character of a word, or between words, Backward Word will move to the +first character of the previous word (i.e., further back in the buffer). +If we have the fragment + + He said, "Come, let us reason together." + +and the cursor is on the "e" of "let", Backward Word would move it to the "l" +of "let". Successive Backward Word's would move it to the "C" of "Come", +the "s" of "said", and the "H" of "He". ^C (Re-execute Command) may be used to +repeat Backward Word (or any other Emacs command) in the same way as we +described for Forward Word. + + Here is a good example of the interaction between Forward Word and +Backward Word. To put parentheses around the sobriquet "Tony" in + + Anthony Tony Burns. + +assuming that the cursor is at the "." after "Burns", we type + + ESC B ESC B + +to put the cursor at the "T" of "Tony. Then we type an open-parenthesis, which +inserts itself at the cursor, leaving us with + + Anthony (Tony Burns. + +and the cursor still on the "T" of "Tony", which has now moved over. +Now ESC F puts the cursor on the space after "Tony", and typing the close +parenthesis finally gives us + + Anthony (Tony) Burns. + +with the cursor on the space after "(Tony)". The total keystroke sequence +was + + ESC B ESC B ( ESC F ) + +How easy. + + Deleting words is perhaps the second most common editing operation (after +deleting characters) when entering text. Most often, we type a word, and +decide that we did not want that word, or mistyped it sufficiently thoroughly +that we wish to retype it entirely. We wish to delete the last word we typed, +which is to say (note the similarity to the use of #), the word to the left of +the cursor. Parallel to #, ESC #, Rubout Word, is used for this purpose. It +deletes the word, or what is left of a word, if the cursor is in the middle of +a word, to the left of the cursor. Its action can best be described as though +it were doing + + ^@ Set the Mark + ESC B Backward Word + ^W Wipe Region + +That is to say, Rubout Word does a Backward Word, and removes all text between +where the cursor winds up and where it started. Successive Rubout Word's +remove words farther and farther back. Like all deleting commands (other +than character deleting), Rubout Word participates in kill-merging, which is +to say, that after one or any number of successive words have been removed by +Rubout Word, a yank (^Y) will get them all back. If successive words, and the +punctuation and whitespace between them, are deleted by Rubout Word, a single +Yank command will get back the whole deleted area, intact, punctuation, +whitespace, and all, as it initially stood. Rubout Word accepts a +numeric argument as a repetition count, and, like all commands, can be +repeated with ^C. + + Note that when issued in the middle of a word, Rubout Word will delete +that part of the word to the left of the cursor. If immediately after a word, +it will delete only the characters of the word. At any other point, it will +delete all characters between the cursor and the previous word, and that word. +All these facts follow from the definition given above. + + Forward word deletion may be performed by Delete Word, invoked by ESC D. +It deletes the word, or part of a word, to the right of (including the +character at) the cursor. It deletes forward, from the point where the cursor +is, to the point where Forward Word, ESC F, would go. Successive ESC D's +will participate in kill-merging, and delete text word-by-word, all capable of +being retrieved in one Yank (^Y). If issued with the cursor on the first +character of a word, Delete Word will remove the entire word. If issued in +the middle of a word, Delete Word will remove all the characters from the one +at the cursor up to and including the end of the word. If issued between +words, it deletes all whitespace and punctuation up until the next word, and +the next word along with it. Consider the sentence + + We have not any melons today, Mrs. Johnson. + +with the cursor under the "r" of "Mrs.". To replace "melons" by "pears", +we type + + ESC B ESC B ESC B + + +to put us on the "m" of "melons", and the ESC D, to delete the m, e, l, o, n, +and s, leaving us with + + We have not any today, Mrs. Johnson. + +with the cursor on the second of two spaces between "any" and "today". We +then type the word "pears". + + A unique set of capabilities is provided by three commands which control +the "case" of words, i.e., lower case ("jack"), upper case ("JACK"), or +"Capitalized Initial", ("Jack"). These three commands are: + + ESC L Lower Case Word + ESC U Upper Case Word + ESC C Capitalize Initial Word + + Each of these commands may be issued with the cursor _o_n a word, that is, +on any character of it, or _i_m_m_e_d_i_a_t_e_l_y _a_f_t_e_r a word to alter the case of that +word. For instance, suppose we had just typed + + thomas + +with the cursor immediately after the "s" of "thomas". To capitalize +"thomas", we need only issue the two-key sequence ESC C, and we have + + Thomas + +The cursor is always left immediately after the word whose case was +transformed. If we wish to capitalize several words, say + + thomas alva edison + +we can move the cursor to any letter of the word "thomas", type ESC C, leaving +us on the space after "Thomas", ^F to put us on "alva", ESC C, leaving us +between "Alva" and "edison", and ^F and ESC C one last time, leaving us after +"Edison". + + The three word-case-altering commands all leave the cursor immediately +after the word whose case is altered. Since the character immediately after a +word is a good place from which to issue a word-case-altering command, +we can position the cursor immediately after the word "thomas", and +type ESC C ESC L ESC U ESC C ESC L etc., and watch Thomas, thomas, THOMAS, +Thomas, thomas, etc., replace each other on the screen until we find the one +we like. A word-case-altering command may be issued from anywhere within a +word or immediately after it, but it will leave the cursor immediately after +the word. + + The word-case-altering commands deal with all the characters in a word, +not just the first. Thus, a word like "MaGicAl" can be converted to +"Magical", "magical", or "MAGICAL" by use of these commands. Thus, the +word-case-altering commands can be used to fix typos caused by holding down a +shift key too long. For instance, in trying to type "Joralemon", we might +type "JOralemon". An easy job for ESC C, Capitalize Initial Word. Issuing +this command after we type the "n" gives us at once "Joralemon". + + If a word-case-altering command is issued between two words, but _n_o_t +_i_m_m_e_d_i_a_t_e_l_y after the first word, it will alter the case of, and move to the +end of, the next word. Thus, sequences of ESC C ^F ESC C ^F, etc., will +capitalize successive words, regardless of how much punctuation or whitespace +separates them. + + Related to the word-case-altering commands are the underlining and +underline-removing commands, ESC _ and ESC -. These commands are used to +cause a word to be underlined, or to remove the underlining from an underlined +word. It is important to note that most current video terminals either do not +have the ability to underline text at all, or can only do it in ways that are +either very limited or not useful. Therefore, underlined text in Emacs +appears as + + H\010__\010e_\010l_\010l_\010o + +where + + H__e_l_l_o + +is wanted. The "\010"'s are backspaces; they are shown in this way because +almost no video terminals can overprint characters, even among those that have +limited underlining capability. The text in the buffer, which will be written +out to your file, actually contains the proper number and placement of +backspaces: the "\010" representation is only the way they _a_p_p_e_a_r on the +screen. + + Typing in backspaces in order to underline words when talking to Multics +is confusing, difficult, and error-prone enough when using a printing +terminal: the familiar sequence of "H e l l o backspace backspace backspace +backspace backspace _ _ _ _ _" or worse is even less convenient on a video +terminal that cannot overstrike. + + A word can be automatically underlined correctly by use of the Emacs +Underline Word command, ESC _ (the two-key sequence, Escape Underscore. Be +careful to remember to use the shift key to get the underscore if, on your +terminal, you would use the shift key any other time to get an underscore!) To +use this command, position the cursor to any place within a word to be +underlined, or immediately after, just as for the word-case-altering commands. +ESC _ will then cause this word to be underlined correctly, and leave the +cursor positioned immediately after it. Just as with the word-case-altering +commands, to type in a word and underline it, say "_b_e_g_i_n", we type the seven +keys + + b e g i n ESC _ + +The fact that we issued the Underline Word command immediately to the right of +a word (which we had just entered) causes that word to be underlined. + + The command ESC - (Escape Minus-sign), Remove Underlining From Word, +is used to take out underscores and backspaces (i.e., de-underline) a word +that is underlined. Like the word-case-altering commands and Underline Word, +it may be issued with the cursor at any point within the word of interest, or +immediately after it. Just as with the word-case-altering commands, +successive ESC _'s and ESC -'s will add and remove underlining from the same +word, in alternation. + + As with the word-case commands, to underline successive words, + + ESC _ ^F ESC _ ^F ESC _ ^F + +will do the job. + + A thoroughly unique ability of Multics Emacs is the ability to search for +_w_o_r_d_s as opposed to _s_t_r_i_n_g_s, when required. Suppose we had the sentence + + Yes, I know, Miss Smith's theater + is the One for _m_e! + +Let us assume that the cursor was on a previous line, or in the word "Yes", +and we wanted to find the word "is". We could use String Search, ^S, and +reply + + i s ESC + +to the prompt + + String Search: + +but this would get us to the "is" in "Miss", which is not what we want. +We could search again, but there is a better way. Use of the Word Search +command, ^XW, will find a _w_o_r_d, not a part of a word. If we had typed ^XW +when trying to find the word "is", Emacs would have prompted: + + Word Search: + +We then type the word, "is", as we would have for String Search, and a +carraige return. + + Word Search can find words regardless of capitalization or underlining. +For instance, using Word Search to find the words "one" or "me" in the above +sentence would find "One" and "_m_e". + + Word Search can also find _s_e_q_u_e_n_c_e_s of words, which is to say, several +sequential words, separated by any amount of punctuation or whitespace. If +the cursor were far above the above fragment, in the document in which it +appeared, we could find our fragment by answering ^XW's prompt, + + Word Search: i know miss smith CR + +and the cursor will be left immediately after the "h" of "Smith", for the +words: + + I know, Miss Smith + +appear in sequence. The comma between "know" and "Miss", as well as all +spaces, and the capitalization of I, Miss, and Smith, are ignored by Word +Search. In fact, we could have searched: + + Word Search: theater is the CR + +and the cursor would be left after the word "the", in the second line of the +fragment. The newline (carriage return) separating "theater" from "is" is +simply whitespace, which is ignored by Word Search. When we say that +whitespace and punctuation is ignored by Word Search, we do not mean that +having whitespace or punctuation is the same as not having _a_n_y: what _i_s meant +is that any amount of whitespace or punctuation will be treated the same, as +separating one word from the next. Thus, + + ^XW jack knife CR + +will find + + jack knife + Jack, knife + J__a_c_k... "KNIFE!!" + +but not + + jackknife + +which is one word, not two. + + Word Search can also help searching by searching for words that start +with a given string. This is useful for searching for long word. To indicate +that a word-prefix is being searched for, we type the first letters of the +word followed by an asterisk, for example, + + anted* + +to search for "antediluvian" We can use an abbreviated word in this way as +part of a word-sequence being searched for, for example, + + ^XW the anted* era CR + +to search for + + T__h_e "A__n_t_e_d_i_l_u_v_i_a_n" E__r_a + + Word Search is clearly an extremely powerful and useful command. Like +most other Emacs search commands, typing simply carriage return to its prompt, +i.e., a null, or empty search string, re-uses the last search string. Word +Search searches from the current point in the buffer (where the cursor is) to +the end of the buffer, indicating the usual + + Search Fails. + +with its characteristic beep if the word or words being searched for could not +be found. There is no reverse word search; however, Word Search with an +argument, for example + + ESC 1 ^XW + +will search from the beginning of the buffer to the end. A word of caution, +however. Because Word Search is such a powerful command that checks for so +many different occurences, it can be slow, especially on a large file, and on +a slow system. Searching from the beginning of a file will almost always +make it slower, taking a long time. In general, the ordinary String Search +(^S) should be used for best response if you can tell (as with other editors) +what exact characters you are looking for; use word search when you do not +know what characters you are looking for, but you do know what words. + + Perhaps the best example of a use for Word Search is the editing of an +input segment to a text justifier, like compose or runoff, when you have a +hard-copy of the output (.compout or .runoff) segment before you. You can +use Word Search to search for a group of words that you see in the output +segment: they will be found in the input segment, even if compose or runoff +inserted or deleted many spaces or moved them around on different lines when +filling or justifying text. + + We now summarize the various commands for manipulating words: + + Word Motion of cursor: + + ESC F Move forward a word, to the end of the current word, or + (if now at the end of a word or between words) to the end + of the next word. + + ESC B Move backward a word, to the beginning of the current + word, or (if now at the beginning of a word or between + words) to the beginning of the previous word. + +Deleting words and parts of words: + + ESC D Delete forward from the cursor to the end of a word. If + between words, this will delete the word to the right of + the cursor. + + ESC # Delete backward from the cursor to the beginning of a + word. If between words, this will delete the word to the + left of the cursor. + +Changing qualities of words: + These commands apply to the word in which the cursor appears, + or the word which IMMEDIATELY preceds the cursor: + + ESC U Convert the word to all UPPERCASE. + + ESC L CONVERT THE WORD TO ALL lowercase. + + ESC C lowercase the word, and then give it + An Initial Capital Letter. + + ESC _ U__n_d_e_r_l_i_n_e the word. + + ESC - De-underline _t_h_e _w_o_r_d. + +Searching for words or groups of words: + + ^XW Word Search. Search forward for the word or sequence of + words in the search string. The search string is ended by + the ESC character. + +------------------------------------------------------------ +============================================================ +Further Sections that should be written: + + Indentation and whitespace commands: + ESC M, ESC I, ^O, ESC ^O, ^X^O, ^M action, ESC \, ESC ^. + Fill prefix, fill mode. ESC Q, ESC ^I + + Text movers: ESC W, ESC ^W, ^XX, ^XG. + Buffersmen: ^XH, ^XI, ^XK. + + 2-window mode, ^X1 ^X2 ^X3 ^XO, ESC ^V. + + Sentences and Paragraphs: + ESC A, ESC E, ESC K, ^X#. ESC [, ESC ], ESC H. + + Keyboard Macros, ^X(, ^X), ^X*, ^XE, ^XQ, save-macro. + + Miscellany: ^U, ^U^U, @, Comout (^X^E), \, ESC ^Y, Regexp + and global searches. Dired, Rmail. accept-msgs. + + Utter random miscellany: ^X^M, ^X^R, ^X^L, ^X^U, ^X ESC. + ESC ^F, ESC ^B. + make-wall-chart. set-screen-size. opt. "Hairy" searches. + + Printing terminal usage. ^XV. +------------------------------------------------------------ +============================================================ + + This document is not finished. It may never be finished, because as fast +as I can describe Emacs, it keeps growing. Please look through emacs.info for +whatever looks like it might interest you. Look through fundamental-mode.info +for any commands that look interesting. Try them and see what they do. +Make use of the builtin help facility, apropos, describe, and ESC ?. +Dprint and look at any of the info segments you think may interest you; there +is a complete list of available info segments +in emacs.info in >doc>subsystem>emacs. + + -Bernard S. Greenberg + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.gi.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.gi.info new file mode 100644 index 0000000..88103aa --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.gi.info @@ -0,0 +1,358 @@ +Multics Emacs -- 04/23/81 + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + Multics Emacs is a display-oriented text-preparation and editing +facility modelled after the EMACS editor of R. Stallman and others on the +MIT AI Lab's PDP-10. + + The pathname of Multics Emacs is >unb>emacs. The normal +arguments to the emacs command are the pathnames of files to be read in and +edited. The command has the added names multics_emacs and e. + + This info segment contains basic information about accessing Multics +Emacs, and the most fundamental information about its use. For a list of +editor commands available in the default environment (Fundamental Mode), see +fundamental-mode.info in this directory. The reader should be aware of the +following documents in >doc>ss>emacs; you should obtain a copy +of fundamental-mode.info if you have not already. Most of these documents are +intended to be printed and read; they are not intended for perusal with the +"help" command: + + emacs.info This info segment. + + fundamental-mode.info The editor commands available in the + default environment. + emacs-tutorial.info A tutorial introduction to using Multics + Emacs (incomplete, but valuable) + pl1-mode.info Documentation of the features for editing + and creating PL/I programs. + lisp-mode.info Documentation of the features for editing + and creating Lisp programs. + fortran-mode.info Documentation of the features for editing + and creating FORTRAN programs. + rmail.info Information on the Emacs mail reading and + sending subsystem. + windows.info A description of the window management + system, and the window and buffer + editor subsystems. + emacs.changes.info A reverse chronological transcript of + missives announcing changes to + Multics Emacs. + emacs.status.info A list of known bugs, deficiencies, and + planned features, and their status. + extensions.info Information for those wishing to write + their own code in the Emacs + environment, including an introduction + to Lisp. + extensions.changes.info Changes to extensions.info. + + ldebug-mode.info Information on the interactive debugging + facility for Lisp code in Emacs. + ctl-writing.info Information on how to write new terminal + support packages to support additional + types of video terminals. + + Mail complaining about bugs, or missing features, should be sent to +emacs.bugs at MIT-Multics or via the standard trouble report mechanism at any +other site. There exist mailing lists for changes, both for all ARPANET sites +and Phoenix System M. If you wish to be put on these mailing lists, or taken +off, please send mail to either of the above addresses. + + Invoking the emacs command places you in an editor buffer named +"main". Text may be typed immediately: it goes directly into the buffer. +The carriage-return key is used to terminate lines. The cursor of a video +terminal, or the print head of a printing terminal, shows the place where +text will next go. The cursor (or print head) corresponds to a point in the +buffer known as "point". "Point" moves around as characters are typed. +Point may be moved explicitly by "editor commands", which are issued by +typing either single "control" characters, or two-character sequences. +Commands exist to move point over words, paragraphs, characters, sentences, +etc., forward and backward one or many times. Commands exist to delete +characters, words, sentences, etc., and to retrieve or rearrange text so +deleted. Various sets of commands are available to deal with various types +of editing tasks: the file fundamental-mode.info tells what commands are +invoked by what keys, and what they do. + + "Control" characters are entered by holding down the key marked +"CTL", "CTRL", "CNTRL", "CONTROL", or the like, and pressing some other key +(say, "N", to get a "Control N") while the "CONTROL" key is being held down; +it is like a "shift" key. In some cases, although not for letters, it may be +necessary to hold the CONTROL and SHIFT keys to get some characters. Control +characters are represented by the circumflex character in all Emacs +documentation: "^N" means a "Control N", i.e., the character generated by +depressing the "N" key while the "CONTROL" key is being held down. Many +Emacs commands are invoked by 2-key sequences whose first key is the "ESCAPE" +key; this key is often marked "ESC", "ALT", or "ALTMODE". It is denoted by +"ESC" or "esc" in the documentation. The "ESC" key generates a character; +it should be depressed and released like any other key. + + In this document, and all the Emacs documentation, "CR" means the +"carriage return" key. "\177" means the "DEL" or "RUBOUT" key. "TAB" means +the "TAB" key; if your terminal does not have a "TAB" key, "Control I" will +do as well. + + There is an automatic documentation feature in Emacs; to find out +what any key does, depress and release the ESC key, and type a question mark +(i.e., type the TWO KEYS in order, ESC and ?). Emacs will then prompt: + + Explain Key: + +Then type the key or key sequence (for instance, a Control N) about which you +wish to find out. Emacs will display (or print) the appropriate +documentation automatically (it may take a little time to find it, however). +When you resume editing, the documentation will be removed from the screen. + + "Point" is considered to be between two characters; it is to the +left of the blinking cursor. Newline characters at the ends of lines count +as one character each, as do tabs, backspaces, and other control characters +in the text (all control characters other than tab and linefeed are displayed +in the usual Multics octal escape format, e.g., \032). + + Emacs will often prompt for information such as search strings, file +names, buffer names, etc., in an area at the bottom of the screen (or on an +indented line on a printing terminal) called the "minibuffer". This is a +little buffer: one can edit it, for example, use the familiar "#" to delete +unwanted characters as a regular buffer. Responses in the minibuffer are +almost always terminated with the Carriage Return key. To get out of a +minibuffer at any time without executing the command, type two Control G's. +The terminal will beep, and the minibuffer command will be aborted. + + Only the most common commands are invocable from one-or-two key +sequences; other commands, known as "Extended commands" must be invoked by +their full name. In order to invoke an extended command, type the two +characters ESC and X: Emacs will propmpt in the minibuffer for the name and +arguments of the extended command. Type them, and a carriage return. To +obtain the documentation for any extended command, use the "describe" +extended command. Type, ESC, X, describe, a space, the name of the extended +command you wish to find out about, and a carriage return. For instance, +type + + ESC X describe speedtype CR + +to learn about the "speedtype" command. + + The "apropos" extended command can be used to find all commands +(and what keys invoke them) that "mention" a particular subject in their +command-names. This can be used to find what command you want when you don't +know what key invokes it. Type ESC X describe apropos CR to find out about +it. + + Many commands can be repeated many times automatically by giving +them a "numeric argument". This is done by typing ESC, the number desired, +and then the basic command. For instance, ^D (Control D) deletes a +character. ESC 3 ^D deletes three characters. Other commands use the +presence or value of a numeric argument to perform alternative actions, or +modify their actions: this is documented in the documentation of the +individual commands. A brief list of commands that accept numeric arguments +appears below. Negative arguments can be supplied by typing a minus sign (-) +after ESC; negative arguments generally cause "backwards action", for instance +going backward by screens instead of forward. + + Single-character commands usually deal with spacing over, or +otherwise manipulating characters or lines. Two-keystroke commands starting +with the ESC key usually deal with words or sentences, often parallelling the +single-character commands (example, Control D is delete a character, ESC D is +delete a word). More uncommon commands start with "prefix" control +characters: for instance, Control X Control F reads in a file. Characters +need not be shifted (upper case) when entered after ESC or a prefix +character. + + Here is a list of very few simple commands. To find out more about +any of them, use ESC ? as described above: + + ^X^F Find, i.e., read in a file. + + ^N Go to the next line. + ^P Go up to the previous line. + + ^A Go to the beginning of the line. + ^E Go to the end of the line. + ^F Go forward a character. + ^B Go backward a character. + + ESC-< (Escape Less-than) Go to the beginning of the buffer. + ESC-> (Escape Greater than) Go to the end of the buffer. + + ^S Search forward. CR ends the search string. + ^D Delete a character. + # Delete last character. + ESC ? Help- find info on a command. + + ^X^C Quit Emacs. + ^X^W Write out buffer to a file. + + There are many, many commands. See fundamental-mode.info. To find +out about all the "search" commands, type ^_ A search CR and so forth. +Typing Control Underscore (^_) gets you into a help facility: ^_? gets it to +describe what it can do. + + ---------------------------------------- + + The following commands repeat with numeric arguments: + + ^B ^C ^D ^F ^N ^O ^P ^Q # ESC-A ESC-B ESC-D ESC-E + ESC-F ESC-# ESC-[ ESC-] + + Also tells ^Y how many back to yank. + Also tells ^K how many lines to kill. + Also tells ESC-Q whether to adjust or not. + Also tells ^XS whether to use string or QEDX-like matching. + Tells ^X2 how big to make top window. + Tells ^XV how many lines to print. + Tells ESC-R how to position the cursor, and ^L the screen. + Tells ^X* whether to display long form, and macros how to + iterate. + Tells ^XD whether to edit the working directory or some other. + Tells ESC-I whether to indent to words on last line, or look up. + + ------------------------------------------------------- + +Here is a brief table of some common cursor motion and deleting commands: +(\177 means the "RUBOUT" or "DEL" key) + + Forward Backward End-of Beginning-of Delete Delete + Forward Backward + +Character ^F ^B ^D \177 or # + +Line ^N ^P ^E ^A ^K + +Word ESC F ESC B ESC F ESC B ESC D ESC \177, ESC # + +Sentence ESC E ESC A ESC E ESC A ESC K ^X \177, ^X# + +Paragraph ESC ] ESC [ ESC ] ESC [ + +Screen ^V ESC V ESC99ESC R + ESC0ESC R + +Buffer ESC > ESC < + ---------------------------------------- + + If you have set your Multics erase, kill, and character-escape +characters to other printing characters than the usual #, @, and \, Emacs +will use them for these purposes. If you use the standard Multics editing +characters, or have non-printing characters as editing characters, Emacs will +use #, @, and \ in their usual sense. + + Emacs attempts to determine the characteristics of your terminal +from the Multics terminal type. If you are logged in via the ARPA network, +Emacs will attempt to negotiate the "Supdup Output" TELNET option to +determine your terminal type. If the Multics type is ASCII, or your User +Host does not support the Supdup Output option, or your Multics terminal is +not of a recognized type, Emacs will ask you the type of terminal you have +with a question of the form: + + What type terminal do you have? + +You may answer "quit" to this response to exit Emacs immediately. + + In addition, three control arguments for setting the terminal type +are recognized by Emacs when given as the FIRST command line argument. These +are: + + emacs -ttp STRING or emacs -terminal_type STRING + tells Emacs that your terminal type is STRING. The value of STRING + may be any recognized editor terminal type or the pathname of a + control file to load. The terminal type given by STRING will be + set permanently. IE: changing your Multics terminal type will not + affect Emacs' memory of this STRING. + + emacs -reset + causes Emacs to forget any characteristics of the terminal set by + the -ttp option. Emacs will once again check the Multics terminal + type as is the normal case. The line speed (if set by -line_speed) + is forgotten as well. + + emacs -query + causes Emacs to immediately ask the user for the terminal type + without checking the Multics terminal type first. The answer you + give may be any STRING accepted by the -ttp option. + + The following control argument may be supplied to indicate to Emacs +your line speed. Although Multics normally supplies this information to Emacs +automatically, network users may find it necessary to use this control +argument to obtain proper padding: + + emacs -line_speed BAUD-RATE + where BAUD-RATE is the output line baud rate in bits per second. + +The -line_speed control argument need only be supplied once per process. If +used, it must be the first control argument given, or may follow -ttp, -query +or -reset immediately. + + Emacs looks for a file called start_up.emacs in the home directory. +It may be full of Lisp forms, or be a compiled Lisp object segment. It will be +loaded (executed) if it exists. Execution of the start_up segment will be +suppressed if emacs is given the -no_startup (-ns) control argument, which must +follow all the terminal type control arguments but precede any pathnames on the +command line (or, of course, be the only control argument). + + After the start_up segment (if any) is executed, the following +control arguments are processed by the "default start up": + + emacs -mc path or emacs -macros path + path is a pathname. Loads path as Lisp, like teco$macro. + + emacs -ap fun arg1 arg2 or emacs -apply fun arg1 arg2 + evaluates (fun 'arg1 'arg2 ... ) + Valuable for constructing abbrevs. + + emacs paths + where paths are not any of the above. Does a find-file (^X^F) on + each path. + + The actions of the default start up may be suppressed by the start_up +segment if the latter sets the list variable +"suppress-default-start-up-execution" to t. + + Emacs accepts META characters from AI TV's, and does TELNET +break/interrupt processing. + + ******************** + + Multics Emacs was designed, implemented, and documented by Bernard +Greenberg. William York has been co-implementor. Gary Palter designed and +implemented the current Multics file interface and "hairy search commands", the +current internal command definition facility (defcom), and has otherwise +contributed very heavily. Richard Lamson designed and implemented the current +message and interrupt facility. Many other people have contributed ideas and +suggestions. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.install.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.install.info new file mode 100644 index 0000000..3475245 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.install.info @@ -0,0 +1,401 @@ +5/12/80 - Site instructions for installing Emacs at your site. + 10.0 Release. + +** This document is not intended for use with the help command. ** +** It is intended for perusal by print, dprint, or an editor. ** + + + +______________________________________________________________________ + + + Multics Emacs is a state-of-the-art text processing and editing system. +A new version is being distributed as part of Release 10.0, as an unbundled +offering. It offers facilities comparable to stand-alone word-processing +systems, combined with the power of the entire Multics environment. + + Multics Emacs is a very large and complex subsystem which requires +special actions and customizations to be effected by site personnel: +this document specifies these actions. + + Multics Emacs is basically a "real-time video editor." This means that +as opposed to interacting with a user on a line-by-line basis, modifying text +in response to "command lines", and printing text on demand, a selected +portion of the text being edited is continuously displayed upon a screen. +The terminal identifies a given location in the text via its cursor. +By typing selected characters, the text at the cursor is modified, deleted, +moved, etc., and the image of the text on the screen is dynamically updated +to reflect these changes as they are made. New text is entered simply +by typing it. There is no need for a "print" request; text is always visible. +There is no need for a "substitute" request; once undesired text is deleted, +new text is simply entered. + + Responding to characters typed at a keyboard in a real-time video +environment requires careful screen maintenance in response to each character +typed _a_s _i_t _i_s _t_y_p_e_d: to simply print a character upon the screen +as it is typed requires intelligent screen maintenance. It is impermissible +to allow the terminal or the front-end processor to echo characters. Thus, +Multics Emacs must respond to _e_v_e_r_y character as it is typed. +The ability to respond to every single character as it is typed is a new one +for Multics; until now, there was no need for it. This feature is provided +by _b_r_e_a_k_a_l_l _m_o_d_e, a feature of the Multics Communications +System (MCS). + + Although every effort has been made to streamline the per-character +loop of Emacs and Multics, including extensive modification to the +mainframe and communications processor software, response to every +character "in real time" is innately much more expensive in CPU and paging +than response to "whole lines". Implementors of real-time video editors +on many systems have all found that these editors are much more expensive +than non-video editors because of this. Yet, various scenarios of +mainframe time availability, video terminal availability, working hours, +and system resource pricing have made the technology of real-time editing +extremely popular in spite of the innate expense. + + It is the responsibility of the site personnel to make the +commitment to allow this software to be used at all at his or her site, +and if that commitment is made, to ascertain at precisely what point, at +what times of day, and on what configurations does, if at all, Emacs usage +become problematic. In two and a half years of experience at the Honeywell +exposure sites, UNRESTRICTED Emacs usage has not ONCE created +a performance problem; nevertheless, a very large number of Emacs +users may have a deleterious effect on system performnace. + + ************************************************** + + Multics Emacs is a developing, experimental offering. It is still +undergoing development. There are known bugs and deficiencies. All known +problems and deficiencies are listed in the file emacs.status.info in the +documentation directory >doc>ss>emacs. In spite of these bugs and problems, +Multics Emacs is eminently usable, quite robust. Multics Emacs has been in +heavy use at the two Multics development sites for three years, and has +acquired a user community of hundreds. + + +Emacs' trouble-reporting mechanism is the same as for all other Multics +Software; the TR system should be used. Please check the known bug list +before generating a trouble report. We intend to maintain reasonable +compatibility in user interface in future releases; the internal interfaces +available to the extension writer, however, are more subject to change. +However, the intent is to fully document all changes. + + + ************************************************** + + + The use of Multics Emacs, and its entire repertoire of command and +function, for the installed version, is documented in Honeywell Manual +CH27, "Emacs Text Editor User's Guide". The writing of user extensions +and terminal support modules (not of interest to anyone except very +advanced users and site maintenance personnel) is documented in Honeywell +Manual CJ52, "Emacs Editor Extension Writer's Guide". + + The unofficial documentation which was the only documentation before +the release of the above-mentioned manuals is distributed in +>doc>ss>emacs, where this info segment lives. Starting there, the segment +emacs.gi.info contains all other online documentation pointers. This +documentation is inteded to be dprinted, and is not suitable for perusal +with the "help" command. This documentation, however, is completely +up to date, and often contains information in more detail, and +differently organized than the published manuals. + + ****************************** + + Multics Emacs was modelled after the EMACS editor at the MIT Artificial +Intelligence Lab. EMACS (on the AI Lab PDP-10's) was written, in TECO, by +staff members of the MIT AI Lab and the (MIT) Laboratory for Computer Science +(LCS), without whose encouragement and support this project would not have +been possible. + + Multics Emacs makes no claims to current or future compatibility with +other implementations of EMACS or any other editor. Although largely +compatible in general philosophy and repertoire with the AI Lab editor, there +are significant differences, both in some specific commands with which we +chose to differ, facilities implemented in one and not the other, and things +that are of necessity different due to the difference in operating systems. +Nevertheless, users familiar with any video editor generally find no problem +whatsoever adapting to another. + + Compatibility with AI Lab EMACS is not a large consideration for the +future. + + Multics Emacs was implemented from scratch at Honeywell with +contributions from some programmers at the MIT Information Processing Center. +No part of any other program on any other system was used, studied, copied, +translated, or otherwise incorporated during the development of Multics Emacs. + + ************************************************** + + Emacs resides in the unbundled library, >system_library_unbundled. +There are four object segments there: + + o bound_multics_emacs_. The basic editor, online + documentation system, command dispatcher, and display + manager. + + o bound_emacs_packages_. Various optional features, including + the modes for editing PL/I and Lisp programs, the directory + and buffer editors, and so on. + + o bound_emacs_rmail_. The Emacs mail system. + + o bound_emacs_preinit_. Code needed at the time Emacs modules + or extensions are compiled or loaded, including the + command definition facility and the default binding tables. + + The source for these segments is kept in the conventionally-named +source archives in the unbundled source library. + + *****IMPORTANT***** + + The terminal-specific knowledge of Emacs is embedded in small Lisp +programs known as "ctls", whose exectuable objects reside in +>unbundled>emacs_ctls. The site is expected to add terminal control +modules to this directory as needed at each site. The names on the +"ctl"s, as well as the names on links in the ctl directory, must reflect +the names (in the TTF) for terminals used at your site. Any terminal +type to be supported by Emacs at your site must have the name +ctl on the appropriate ctl in the ctl directory: As shipped from +Phoenix, the ctl directory and TTF are consistent; you must adjust +the ctl names for local terminal names in use at your site, as well +as supply new ctls for terminals not supportedd in the distributed release. +The primary names of the segments and links will be the only names +reported (stripped of the "ctl" suffix) in response to user query +about what types of terminals are supported at your site. +Instructions on these matters, as well as writing new ctls, +are given in CJ52, as well as online in ctl-writing.info. Source for +the ctls is in emacs_ctls.s.archive in the unbundled source library. +There is a link in >unb>emacs_ctls to >unb>e_pl1_. + + People writing emacs "extensions" (see below) are encouraged to use +the source of Emacs as a model; thus, it ought be retained on line, but +need not be. This is even more true for the terminal control modules. + + + Also in the unbundled directory is: + + o emacs.sv.lisp, the "Saved Lisp Environment" from which Emacs + initializes its Lisp Environment each it is invoked. This + environment is produced by executing the exec_com + make_emacs.ec, which is supplied in + bound_multics_emacs_.s.archive. This exec_com _m_u_s_t be + executed every time the creates and installs + a new version of bound_multics_emacs_ (this is NOT needed + for the released version). The resulting object, + emacs.sv.lisp must then be installed in >unbundled. + The old saved enviroment need not + be renamed, as Emacs only reads it once at startup time, + and does not retain pointers to it. + + The environment must also be "resaved" (i.e., make_emacs.ec + executed) if a new version of the program e_binding_table_ is + installed in >unbundled (other than the released). + This program defines the default key bindings. + It is in bound_emacs_preinit_. + + Failure to re-save the environment when either bound_multics_emacs_ + or e_binding_table_ is changed will result in users getting + the message "Error lisp_linkage_error by .... The version of + is not the same one as was loaded into this + environment." Users will receive this error whenever Emacs + is re-invoked in a process after a new version has been installed. + Users should be advised to new_proc if they receive this message + if dynamic installation of Emacs at your site is a possibility. + The environment _m_u_s_t be resaved if any of these programs are + changed; new_proc will not alleviate the problem. A copy of + the exec_com also exists in bound_multics_emacs_.s.archive. + + o e-macros.incl, an object program. This program is the + compiled version of the include file, e-macros.incl.lisp. + Having this object program, which can be generated by + directly compiling the include file, makes use of the + include file (which uses this compiled version if + locatable) much more efficient. + + ***************************** + **********IMPORTANT********** + ***************************** + + There are several site-specific objects that Emacs expects to find. +These segments used to reside in a directory >sc1>emacs_dir; this +is no longer necessary. The following are the segments. + + o emacs_info_vfile_, an indexed sequential vfile used by the online + documentation system to store command descriptions in encoded form. + This MSF vfile resides in >unbundled. Make sure that + users have s on the MSF dir and r on the components. Experts + familiar with the online documentation system can change + or augment online command documentation without installations + if they have rw to this MSF, thus, it is site modifiable. + + o A segment, metering.acs, access to which controls logging of + Emacs usage (see the section below). (Site optional). + + +There should exist a link in >unb>include, or wherever your site chooses to +put the include file e-define-command.lisp, to e_define_command_ in the +executable directory. This is needed in order for the two include files, +e-macros.incl.lisp and e-define-command.incl.lisp, to find the program +e_define_command_ at the time these include files are used at extension +compile time. There must also be a link from wherever the include file +e-macros.incl.lisp is kept to the segment e-macros.incl in the executable +directory. + + ************************************************** + + The table rmail-full-name-table, which used to reside in >sc1>emacs_dir, +is no longer necessary, as its functionallity has been subsumed by the +my-personal-name Emacs variable. + + ************************************************** + + A well-debugged version of the Multics MacLisp subsystem is being +shipped in >unbundled in Release 10.0, specifically for the support of +Multics Emacs. Honeywell is neither supporting nor documenting Multics +MacLisp in Release 10.0 as other than part of the support of Multics Emacs. + + + Multics MacLisp was developed at the Massachusetts Institute of +Technology, under government funding. Documentation is available from +the MIT Information Processing Center. Honeywell currently supports Multics +MacLisp only to the degree required to keep Honeywell-supplied subsystems +implemented in it operative. + + There is an introduction to the language Lisp, in which Multics Emacs +is coded (and "extended") in the file "extensions.info" in the Emacs +documentation directory, as well as in CJ52. This introduction is felt to +be adequate for those wishing to write their own Emacs "extensions" (see +below), and was written with that in mind. It is not, however, a general +introduction to the subject, or adequate to fully understand the source +code of the deep levels of the Emacs editor. + + The Multics MacLisp subsystem in the unbundled library is complete and +fully operative. It is the most advanced version of Multics MacLisp. The +principal user interfaces are: + + o lisp, the interpreter + + o lcp, lisp_compiler, which can compile source segments named + .lisp into object segments loadable by the interpreter + + o lap, the Lisp-oriented Multics assembler. + + o display_lisp_object_segment, a tool. + + Honeywell will fix bugs in Lisp that affect Emacs, as shipped in Release +10.0. We make no statement about any level of future support or documentation, +or continued support even at this level of Multics MacLisp. + + ************************************************** + + Although Multics Emacs is easily used by personnel with no technical +training or programming experience, those with some programming experience +can utilize it even more effectively via "extensions". Extensions are +fragments of Lisp code, not part of the deep level of the editor, which +imbed knowledge of given problem domains, without knowledge of the internal +data structure of the editor, or even more to the point, of display management, +at all. Examples of supplied extensions are the various language modes +and the Emacs mail subsystem. + + Via extension writing, a given shop can create Emacs environments for +selected (or all) users with locally defined functionality, such as document +formats, special languages, and other text processing considerations, +available on keystrokes to the Emacs user. Similarly, a user who is not +completely satisfied with the way some Emacs command behaves is encouraged to +look at the source and add his or her own version to his environment. + + It is a major design feature of Multics Emacs that extension, the +development of prepared functionality, is performed in a very powerful, +concise, and clean language, namely Lisp extended by appropriate "Lisp +Macros". This design differs from that of conventional editors, which use the +same language that they present as a user interface for writing "macros". By +necessity, those languages are always compromised in both directions, +conciseness for interactive editing, and the diversity of a programming +language for "macro writers". Emacs does not suffer this deficiency. + + CJ52, "Emacs Extension Writer's Guide," includes a complete explanation +from the ground up of all knowledge about Lisp necessary to write extensions, +including how to debug them interactively within Emacs, and take full +advantage of Lisp mode. extensions.info, in >doc>ss>emacs, is much of the +same material, but is less complete, less up to date, and less accurate. + + We strongly recommend that some programmer at your site look into +these documents, just to see the type of thing that can be done. Tailored +Emacs environments provide a way to use all the text processing and display +management power of Emacs to best suit your data processing needs. It is +our experience that programmers with no background in Lisp at all have +been able to write extensions proficiently in one day; even non-technical +personnel have successfully written extensions. You will find that +writing "Emacs extensions in Lisp" means very little more than saying +what you want done in English with a pair of parentheses around each line. + + + ************************************************** + + An audit trail mechanism exists with Emacs to monitor the usage and +resources consumed by Emacs users. By default, it is not enabled. To enable +it, the site should create the segment >unbundled>metering.acs, zero max +length, giving rw access to *.* or all persons/prjects to be audited. The +site must then modify the segment emacs_data_.cds, which can be found in +bound_multics_emacs_.s.archive, changing the value of "text_data.log_dir" to +the pathname of a directory. The site must create this directory, put a +terminal quota on it, and give all users (or *.*) being audited sma to this +directory. An IACL of rw *.* should be put on this directory. Watching rate +of growth of logs in this directory, and cleaning it out, is the site's +responsibility. If not cleaned, record quota overflows will prevent people +from using Emacs. This facility is not "secure", and is intended for +performance monitoring purposes. + + Users will create log segments automatically in this directory, +which can be displayed with the print_log tools. Entries are of the +three forms: + + 98 1426.0 0 Jones.SYSTEMS.a: Entering emacs on VIP7801 none a.l111 + 101 1427.1 0 Jones.SYSTEMS.a: (VIP7801) in 11, r0/r4 echo 0/3, out 927. + 101 1427.1 0 Jones.SYSTEMS.a: 1.0 min, v/cpu 1/5 mem 67 paging 1029/1218 + +The first message, at entry time, gives the user ID, the user's terminal type +as specified to MCS, the user's answer-back, and the line over which the user +is logged in. The second two messages occur at the time that the user leaves +Emacs. The first message gives the user name, the terminal type as finally +negotiated with Emacs, the number of input characters, the number of +characters echoed by the supervisor via echo negotiation, the number of +characters echoed by Emacs that would have been echoed by the supervisor were +the system faster than the user's typing, and the number of output characters. +The second message gives, in addition to the user ID, the elapsed real time in +Emacs, virtual and real CPU consumption, memory units (in thousands), and +paging device and all page faults. + +(END) + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.status.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.status.info new file mode 100644 index 0000000..299935b --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.status.info @@ -0,0 +1,252 @@ +04/23/81 - List of known bugs and deficiencies in Multics Emacs. +See the end of the file for explanations of categories and markings. + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + +Bugs: + # Date Sev Difficulty Description + | | +05/79: +049*79.05.29 7 3 F: ESC-E, ESC-] can hang at end of buffer. + +04/79: +048*79.04.03 6 2 F: ESC-Y not after ^Y irretrievably wipes text. + + +03/79: +047*79.03.23 9 8 T: Bad echo negotiation bugs exist. +046 79.03.18 3 6 M: No forwarding facility. +045 79.03.17 3 3 D: Fortran mode doc still not in vfile. +044*79.03.03 3 5 F: Lisp errors not caught/minibuffered. + + +02/79: +043*79.02.08 6 3 R: ^V and ESC-V ought beep at buffer limits. +042*79.02.08 7 4 M: Too many d's make RMAIL fault. (can't duplicate) +041*79.02.07 8 7 R: set-screen-size can leave bad lines on screen. +040 79.02.06 6 9 R: ESC-< ^V redisp opt. causes obscure results. +039*79.02.06 7 7 M: Messages swallowed by emacs if QUIT hit (accept-msgs). +038*79.02.06 7 4 M: Mail not deallocated if rmail not quit cleanly. +037 79.02.06 6 3 F: runoff-fill-region is mark-position-sensitive. +036*79.02.06 4 2 F: "Modified" is issued for empty buffers. + + +01/79: +035 79.01.29 4 4 PL1: Subscripted labels sometimes indent badly. +034 79.01.22 4 7 D: I/O attachment of info vfile left attached. +033*79.01.22 5 5 M: Reply-to is not supported. +032*79.01.22 2 7 F: Knight-TV meta numbers don't work. +031*79.01.21 9 1 M: text of messages gets pushed on kill-ring. +030*79.01.21 9 1 D: documentation pushed on kill-ring before display. +029*79.01.17 9 9 F: fundamental-mode ex. comm. doesn't revert bindings well. +028 79.01.12 5 3 T: Inverse video fields not cleared on VIP7800. + + +12/78: +027*78.12.27 6 1 M: ^X^S moves cursor. +026*78.12.27 9 1 D: ^X2, ^X3, ^XF documentation is obsolete. +025*78.12.15 8 7 R: If last line in top window is overlength, it is + mis-displayed when two-window mode exited. + + +11/78: +024*78.11.21 2 1 F: ESC-^Y doesn't set the mark. +023*78.11.09 4 2 F: "Search fails." message overwrites search string. +022 78.11.08 4 6 L: Unbalanced constructs leave cursor in random places. + + +10/78: +021 78.10.27 5 6 CI: "emacs -mc a b" reads file b, etc. +020*78.10.20 3 5 F: Negative arguments are not supported. +019 78.10.06 4 8 R: Initial redisplay done even if input pending. +018*78.10.04 7 9 R: idel-chars not used in overlength lines. + + +09/78: +017*78.09.25 9 9 F: ^Q does not work in macros. +016 78.09.22 5 8 F: ^X^O deletes formfeeds. +015*78.09.22 3 10 R: ESC-99 ESC-R moves screen if last line too long. +014*78.09.15 8 8 R: minibuffer prompts are editable, should not be. +013 78.09.13 6 5 F: speedtype abbrevs > 4 chars fail. +012*78.09.12 6 5 PL1: private auto-dcl files exist, should be merged. +011 78.09.12 6 10 PL1: auto-dcl does not use the search facility. +010*78.09.05 9 5 F: comout does not trap Multics errors properly. +009 78.09.05 7 4 F: ^G beeps before all redisplays are done. +008*78.09.05 8 4 L: Local displays sometimes damage two-window mode. +007 78.09.01 5 4 R: Deleting end of buffer leaves screen blank. + + +08/78: +006*78.08.29 3 1 CI: Unread input is saved across emacs invocations.NOT SO. +005 78.08.28 9 5 PL1: Tab and semicolon in quoted strings leaves the + cursor in a random place. +004 78.08.28 1 3 R: Trailing whitespace (ac tb) gets printed. +003 78.08.28 4 3 F: De-underlining consecutive underlined words loses. +002*78.08.25 2 4 R: Random whitespace is sometimes printed in mid-line. +001*78.08.23 5 1 CI: emacs does not recognize some TTT tty names. + + +Suggestions: + +030 79.05.29 3 4 F: Deconfuse loadlib/loadfile, use search rules, etc. +029*79.03.31 3 2 F: "new-line" should not eat last blank line. +028*79.03.03 3 5 F: End all prompts with CR, no more ESC. + + +02/79: +027*79.02.06 8 8 R: ^V/ESC-V with arguments to repeat redisplay-free. +026 79.02.06 8 10 F: Fill paragraph by paragraph (etc.) text. +025 79.02.06 4 8 F: Recursive editors in ^XQ/hairy searches, etc. + + +01/79: +024*79.01.26 4 5 F: Query-replace command, builtin (not macro). +023 79.01.18 5 3 F: Explicit kill-ring-pop, or yank-and-pop command. +022 79.01.18 8 4 F: An insert-other-buffer-here command. +021*79.01.18 9 1 D: ESC-X help ought do something useful. +020 79.01.17 3 1 PL1: electric colon should not electrify in mid-program. + (should check for next line end/empty) +019*79.01.05 9 1 D: apropos should diagnose or accept multiple args. +018 79.01.03 9 1 R: set-screen-size ought default full for no arg. + + +12/78: +017*78.12.27 6 9 F: ^C of a ^S or ^R (etc.) should re-search same string. +016 78.12.27 7 9 F: Comout should deal with commands that ro/co internally. +015*78.12.26 8 10 M: Rmail save/log requests. +014*78.12.26 8 9 M: Rmail to read other-than-your-own mailboxes. +013*78.12.26 7 9 M: Rmail should reply to recipients. + + +11/78: +012 78.11.28 3 10 M: Handle memos and progress as emacs interrupts. +011 78.11.28 2 10 F: Expand active functions in file-name prompts. +010 78.11.28 3 9 F: Expand abbrevs in file-name prompts. +009*78.11.09 4 2 F: Leave search string visible when search fails. + + +10/78: +008*78.10.06 3 3 F: ^@ should respond visibly. + + +08/78: +007 78.08.30 3 4 F: Substitute globally times, n given. +006 78.08.25 2 1 F: Comout that uses different strategies for different + amounts of output (LEJ has such). +005 78.08.23 2 2 R: ^XV should "integrate" output with following redisp. +004 78.08.22 1 5 R: Visible "End of Buffer" marker on screen. +003 78.08.22 4 5 R: ^XV that prints .-n,.+n (before and after cursor). +002 78.08.22 1 2 F: Global substitute command showing changed lines. +001 78.08.22 2 2 R: ^XV should delimit its printed output with "---". + + +Major Projects: + +012 79.02.06 5 20 F: COBOL mode. Problem is nobody knows what it + should do. +011 79.02.05 5 30 F: Have a "tags" (multi-language label-cataloguing) + package. No particular problem, just work. +010 79.01.02 6 30 F: Have a completing reader. Problem is large amount + of engineering and implementation work, and prerequisite + of MP 009. +009 79.01.02 8 20 F: Organized cataloguing and argument checking on + extended commands. Problem is design. +008 78.12.19 7 35 R: Support underlining on "field-type" video TTY's. + Same problems as Major Project 007. + +007 78.12.19 8 28 R: Support overstriking on printing, TV, and other + ^H-recognizing terminals. Problem is overhaul of + redisplay data and control structure, specif. detabbify. +006 78.11.28 9 50 F: Keep buffers in non-PDIR place, optionally, for + safety". Problem is Lisp representation of buffers. +005 78.09.21 9 25 F: Start_up files in some non-Lisp ASCII format. Problem + is designing and implementing a robust reader/evaluator + that gives credible diagnostics. +004 78.09.21 8 20 F: Redesign/reimplement option mechanism. Problems are + lack of info on options in autoload files not yet loaded, + and concomitant lack of error checking. + +003 78.09.13 6 15 F: Speedtype improvements. Problem is lack of save/edit + ability, bugs in hashing algorithm, integration with native + Multics Speedtype. +002 78.08.30 8 25 R: Synchronize with or abort output. Problem is too much + typeout, waiting for unwanted redisplays. Difficulties + are needed MCS features, and inconsistent partial screens. +001 78.08.23 8 30 R: Substantially improve printing terminal redisplay. + Largest problems are middle-of-line edits, asynchrony + in deciding what to print, too much typeout. + + +Other tasks: +001*79.02.06 8 9 CI: Install new Lisp; update macros to use unwind-protect. + Problems are paperwork, exposure. +002 79.02.06 10 30 D: Finish user documentation (emacs_tutorial.info). +003*79.02.06 4 2 Update Emacs on CISL, incl. vfile. +004*79.02.06 2 5 Support ADDS980 terminal in Arizona. +005*79.02.06 9 2 Upgrade to MCS echo negotiation. (Yet to debug new + interrupt synchronization under mcs_echo_neg as well). + + +Explanations of categories and markings: + +* indicates that the bug has been fixed. +Bug categories are: F - fundamental emacs; CI - command interface; +R - redisplay; PL1 - PL/1 mode; L - Lisp mode; M - Mail/message subsystems; +D - Documentation/auto-doc; T - terminal/network support. + + +Definitions: + +A "bug" is a user-visible deficiency causing unexpected results, loss of +display or data, or useless output or display, or action at variance with the +documentation. Severity and estimated difficulty are rated on a scale of 1 to +10. 10 is the most urgent and hardest. + +A suggestion is a suggested design augmentation or modification that is open +to debate about relative merit; it is not a bug fix. Suggestions do not +include missing isolatable sub-subsystems. Suggestions requiring major +redesign or new implementation are listed under "Major projects", and do not +qualify as suggestions. + +A major project is a design/implementation enhancement involving substantial +redesign and reimplementation, or the implementation of an entirely new +subsystem within Emacs. + +(END) + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.wall-chart.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.wall-chart.info new file mode 100644 index 0000000..994792a --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/emacs.wall-chart.info @@ -0,0 +1,87 @@ + Multics Emacs Wall Chart (Fundamental mode) 12/8/81 + + + +# rubout-char ^XO select-other-window esc-ESC eval-lisp-line +@ kill-to-beginning-of-line ^XQ macro-query esc-F forward-word +CR new-line ^XR rmail esc-G go-to-line-number +ESC escape ^XS global-print esc-H mark-paragraph +\ escape-char ^XV view-lines esc-I tab-to-previous-columns +\177 rubout-char ^XW multi-word-search esc-K kill-to-end-of-sentence +^@ set-or-pop-the-mark ^XX put-variable esc-L lower-case-word +^A go-to-beginning-of-line ^X\177 kill-backward-sentence esc-M skip-over-indentation +^B backward-char ^X^B list-buffers esc-N down-comment-line +^C re-execute-command ^X^C quit-the-editor esc-P prev-comment-line +^D delete-char ^X^E comout-command esc-Q runoff-fill-paragraph +^E go-to-end-of-line ^X^F find-file esc-R move-to-screen-edge +^F forward-char ^X^G ignore-prefix esc-S center-line +^G command-prompt-abort ^X^I indent-rigidly esc-SPACE complete-command +^J noop ^X^L lower-case-region esc-T twiddle-words +^K kill-lines ^X^O delete-blank-lines esc-U upper-case-word +^L redisplay-command ^X^R read-file esc-V prev-screen +^N next-line-command ^X^S save-same-file esc-W copy-region +^O open-space ^X^T toggle-redisplay esc-X extended-command +^P prev-line-command ^X^U upper-case-region esc-Y wipe-this-and-yank-previous +^Q quote-char ^X^W write-file esc-[ beginning-of-paragraph +^R reverse-string-search ^X^X exchange-point-and-mark esc-\ delete-white-sides +^S string-search ^X_ underline-region esc-\177 rubout-word +^T twiddle-chars ^Y yank esc-] end-of-paragraph +^U multiplier ^Z; kill-comment esc-^ delete-line-indentation +^V next-screen ^ZF object-mode-find-file esc-^B balance-parens-backward +^W wipe-region ^ZG go-to-named-mark esc-^F balance-parens-forward +^X# kill-backward-sentence ^Z^@ set-named-mark esc-^G ignore-prefix +^X( begin-macro-collection ^Z^B edit-buffers esc-^I indent-to-fill-prefix +^X) end-macro-collection ^Z^F get-filename esc-^O split-line +^X* show-last-or-current-macro ^Z^G ignore-prefix esc-^V page-other-window +^X. set-fill-prefix ^Z^L redisplay-this-line esc-^W merge-last-kills-with-next +^X0 remove-window ^Z^V scroll-current-window esc-^Y yank-minibuf +^X1 expand-window-to-whole-screen ^Z^W edit-windows esc-_ underline-word +^X2 create-new-window-and-go-there ^Z^Z signalquit esc-~ unmodify-buffer +^X3 create-new-window-and-stay-here ^Z_ remove-underlining-from-word +^X4 select-another-window ^_ help-on-tap +^X; set-comment-column esc-# rubout-word +^X= linecounter esc-% query-replace +^XB select-buffer esc-/ regexp-search-command +^XCR eval-multics-command-line esc-; indent-for-comment +^XD edit-dir esc-< go-to-beginning-of-buffer +^XE execute-last-editor-macro esc-> go-to-end-of-buffer +^XESC escape-dont-exit-minibuf esc-? describe-key +^XF set-fill-column esc-A backward-sentence +^XG get-variable esc-B backward-word +^XH mark-whole-buffer esc-C capitalize-initial-word +^XI insert-file esc-CR cret-and-indent-relative +^XK kill-buffer esc-D delete-word +^XM send-mail esc-E forward-sentence + + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.changes.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.changes.info new file mode 100644 index 0000000..214410e --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.changes.info @@ -0,0 +1,49 @@ +Information for Emacs extension writers- changes to extensions.info. + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + +10/08/78 +New function for extension writers: + + map-over-emacs-buffers FUNCTION ENV + Executes FUNCTION once for each buffer defined in this editor + invocation. FUNCTION is supplied two arguments. The first + is the symbol which is the name of the buffer, and the second + is ENV. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.info new file mode 100644 index 0000000..d4df362 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/extensions.info @@ -0,0 +1,3077 @@ +11/10/79 - Emacs extensions + +(Updates to this document are kept in + >exl>emacs_dir>info>extensions.changes.info) + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + An editor _e_x_t_e_n_s_i_o_n is a user-provided capability, added to the +editor which augments its power and repertoire. It is different from a +macro, which is simply a collection of editor commands gathered up and +(perhaps) given a name. Extensions are _p_r_o_g_r_a_m_s; in Multics Emacs, +they are written in the language of the Multics Emacs environment. One good +definition of an extension is a body of code which augments the editor's +capability, but does not need to know how data in the editor is stored or +manipulated. In this sense, all of the word, sentence, paragraph, +Lisp-list commands, and the various "modes" (e.g., PL/I mode) are extensions. + + The person who wishes to add to his Multics Emacs environment any +powerful or sophisticated capability must learn to write extensions. The +keyboard macro facility (^X(, ^X)), is not intended for such usage. In this +document we explain how to write extensions. + + One of the guiding design principles in the Multics Emacs editor was +that the creations of editor extensions, either by the editor implementors or +end users, should be in a programming language of established elegance and +power. This primer will give you a starting point for writing Lisp code to +run as editor extensions in the Multics Emacs environment. If you have some +knowledge of Lisp already, it will be of value. However, I shall assume that +the reader has no familiarity with Lisp, but perhaps with PL/I or BASIC. + + I will assume that the reader _i_s quite familiar with Multics Emacs as +far as having used it, and acquired some proficiency and familiarity with its +general usage and visible organization. + + + + An Introduction to Lisp for People Who Don't Want + To Have to Know Lisp to Write Emacs extensions. + ----------------------------------------------- + + Lisp programs are built of _f_u_n_c_t_i_o_n_s, which are vaguely like procedures +or subroutines in other languages, although more akin to PL/I and ALGOL +functions. We write a Lisp program by creating a file full of function +_d_e_f_i_n_i_t_i_o_n_s. A function definition specifies the name of a function, and +what it does. Here is a sample function definition: + +(defun addandmult (a b c) ;Here is a comment + (* (- a b) + (+ a b c))) + +This says, "Here is a function named addandmult. It takes three arguments, +which, as parameters, we will call a, b, and c. Compute the result of +multiplying the difference of a and b by the sum of a, b, and c. Return that +number as a _r_e_s_u_l_t, or _v_a_l_u_e. + + Here is another function definition: + +(defun squareprint (arg) + (print "The square of") + (print arg) + (print "is") + (print (* arg arg)) + 5) + + This function, when invoked, will print the message "The square of", +print the value of its argument, print the word "is", and print the value of +the square of its argument. It _r_e_t_u_r_n_s the value 5. The function +"squareprint" has side effects: it causes output on the console. It also +returns a value, the number 5. Note that all Lisp functions produce a value; +only some produce side effects. The first function we defined returns the +product of those numbers as a value; the second returns 5. + + If we look at squareprint, we see that it almost consists of +"statements", the "print statements" that print things. These statements +are called _f_o_r_m_s, and what they are in fact are calls to _o_t_h_e_r functions, in +this case the built-in _p_r_i_n_t function. In the form + + (print "The square of") + +the print function is being passed as an argument the string "The square of". +Like all functions, _p_r_i_n_t will return a value, in +this case, something which we will not use. The side-effect of +printing something will occur. In the form + + (+ a b c) + +we are asking to invoke the "+" function, which is also built-in, passing it +as arguments the values of the parameter-variables a, b, and c. It will +return a value, which is the requested sum, and produce no side effects. + + There are five forms in the function-definition for _s_q_u_a_r_e_p_r_i_n_t: + + (print "The square of") + (print arg) + (print "is") + (print (* arg arg)) + 5 + + Forms immediately inside a function definition are executed +sequentially, like statements in other programming languages. The value +produced by the last form is the one the function itself returns. What does +it mean to "execute" a 5? "Execute" is not exactly the right term, that is +where the problem lies. What really happens is that these forms are +_e_v_a_l_u_a_t_e_d. This means that a value is produced from them. Evaluating a 5 +produces the number 5; evaluating the form + + (+ a b c) + +calls the "+" function with the appropriate arguments, and produces whatever +value the "+" function returns. The value produced by the "print" function +is something which is not interesting, but a value is produced. + + Numbers, like 5, and strings, like "The square of" are said to evaluate +to themselves. Things between parentheses, like + + (+ a b c) + (print "The square of") + +are calls to functions, which are evaluated by calling the function +indicated, and producing the value it returns. Function calls have the syntax + + (FUNCTIONNAME ARGFORM1 ARGFORM2 ARGFORM3 ... ARGFORMn) + +FUNCTIONNAME is the name of the function to call; the ARGFORMs are themselves +forms, which will be evaluated to produce the arguments to give to the +function. Thus, we see that to evaluate (i.e., "execute" and find the value +returned by so executing) a form like + + (+ (* a b) + 15 + c) + + We evaluate the _i_n_n_e_r _f_o_r_m (* a b) to produce a value, + We evaluate the 15 to produce 15 (remember, numbers and strings evaluate + to themselves) + We evaluate the _v_a_r_i_a_b_l_e c to produce its value, + + And pass these three values on to the "+" function, and return what + it returns. + + Thus, forms are seen to be either numbers like 5, strings like "is", +variables like b, or function calls like (* a b). + + Variables are much like variables in other languages. A variable has a +value, which is called its _b_i_n_d_i_n_g. At this stage of the exposition, this +value must be a string or a number. When a function is invoked, the +parameter variables (like a, b, and c above) of the function acquire the +arguments of the function call as bindings. Evaluating a variable produces +its binding as a value. For instance, if someplace in a function we cause +the form + + (addandmult 2 (+ 3 2) 6) + +to be evaluated, a, b, and c will have the bindings 2, 5, and 6 while +the forms in the definition of _a_d_d_a_n_d_m_u_l_t are being evaluated. This is not +unlike the subroutine parameter mechanism in other languages. It is very +different insofar that it specifies what _v_a_l_u_e a variable has during +"subroutine" execution. In PL/I or FORTRAN, a parameter is associated with +a variable in the calling program, not a value, during subroutine execution. + + There are parameter variables, as we have used above, temporary +variables, which we will meet below, and global variables. Regardless of +what "kind" of variable we are dealing with, they all have bindings (values), +and evaluation of the variable produces that value. + + Summarizing our naive introduction to dataless Lisp: + + 1. Lisp programs are built of functions. + + 2. Function definitions consist of the word "defun", the + function's name, a "parameter list", and a number of forms, which + are to be sequentially evaluated at function call time, with + a pair or parentheses around the whole thing. + + 3. The value of the last form in a function will be the value returned + by that function. + + 4. Forms can be either strings, numbers, variables or calls on functions. + Forms are _e_v_a_l_u_a_t_e_d to produce values, + which are passed around between functions as arguments and results. + + 5. Strings and numbers evaluate to themselves. + + 6. Variables evaluate to the datum to which they are bound, which, + for a parameter, is the corresponding argument to the containing + function. + + 7. Function calls contain the name of a function to call and + forms which are evaluated to produce the arguments to the + function. Function calls may produce side-effects. Like any form, + when a function call is evaluated, it produces a value. + + + + + P__r_e_d_i_c_a_t_e_s + + Programming languages need conditional execution. In order to control +conditional execution, we need things upon which to base a decision. There +are two data objects in the Lisp world corresponding to truth and falsity, +for the purposes of parts of the Lisp system that deal with conditions. +There are a set of functions called _p_r_e_d_i_c_a_t_e_s which return these objects as +values. For instance, there is a function called ">" which, invoked as + + (> 4 6) + +will return the indicator of falsity, and when invoked as + + (> 4 1) + +will return the indicator of truth. Predicates work just like other +built-in and non built-in functions, like print, addandmult, squareprint, +and +. They take arguments, and produce a result. In the case of +predicates, however, the result is not a string or a number, but +an indication of truth or falsity. The result of a predicate can be used +by the "_i_f special form" to control the execution of a function, and we +will consider _i_f shortly. + + Here are some of the most useful Lisp predicates. In all of these +examples, A1, A2, S1, O1, etc., stand for _f_o_r_m_s, which means they +can be 12, (+ 6 q), (myfun 33 (- a b)), etc. When we say below that +"A1 is a number" below, what re really are trying to say is that A1 +is some form which _e_v_a_l_u_a_t_e_s to a number, such as 3, (+ 6 2), +or x49, if x49's value is indeed a number. + + Predicates for numbers: A1 and A2 are numbers: + + Predicate Example Returns TRUTH if ..., otherwise falsity. + _________ _______ ________________________________________ + + = (= A1 A2) A1 and A2 are the same number. + > (> A1 A2) A1 is a bigger number than A2. + < (< A1 A2) A1 is a smaller number than A2. + + Predicates for strings: S1 and S2 are strings: + + samepnamep + (samepnamep S1 S2) S1 and S2 are strings of identical + content, i.e., the "same string". This is + the standard way to see if two strings are + the same, as in (samepnamep test "-hold") + alphalessp + (alphalessp S1 S2) S1 collates before S2 alphabetically, e.g., + (alphalessp "Able" "Baker") returns truth, but + (alphalessp "Zeke" "Joe") does not. + + Predicate for symbols (including character objects), which we will + learn more about later: SY1 and SY2 are symbols. + + eq (eq SY1 SY2) SY1 and SY2 are the same symbol. + + Predicates for any objects: O1 is some object, of perhaps unknown type: + + fixp (fixp O1) O1 is a number, as opposed to some other kind + of object. + stringp (stringp O1) O1 is a string, as opposed to anything else. + symbolp (symbolp O1) O1 is a symbol, as opposed to anything else. + null (null O1) O1 is not only a symbol, but the very important + and critical symbol named "nil". + + Lisp Special Forms + ------------------------- + + Now there are a number of _s_p_e_c_i_a_l _f_o_r_m_s in Lisp, which do not go by the +simple rules given above. We have already seen one. The function-defining +form, which begins with the word "defun", is not simply a function call with +forms to produce the function's arguments. By all rights, a form like + + (defun square (x) + (* x x)) + +should, when evaluated, evaluate, in order, to produce arguments for "defun", + + 1. A variable named "square". + 2. The form "(x)", calling a function named "x" with no arguments. + 3. The form "(* x x)", multiplying the value of a variable named "x" + by itself, + +and then pass these three values onto the "defun" function. This, however +is not actually what happens. Evaluating the "defun" form causes a function +named "square" to be defined, whose parameter list and "body" are as given. +Defun is a _s_p_e_c_i_a_l _f_o_r_m, and when Lisp sees "defun" as the function-name in a +form it has been asked to evaluate, it says "Stop everything, I'm going to +do something special with this, in this case, define a _f_u_n_c_t_i_o_n built out of +this _f_o_r_m _i_t_s_e_l_f." It is _n_o_t a call to "defun" with arguments. Although +this may seem kludgey at first, it can be shown that one must have at least +one such special form in order to have an operative Lisp system of any kind. + + There is a special form in the Multics Emacs Lisp environment called _i_f, +which is used to control conditional execution (conditional evaluation). +Here is an example of its use: + +(defun which-is-greater (first second) + (if (> first second) + (print "The first one is the greater.") + else + (if (> second first) + (print "The second one is greater") + else + (print "They are equal"))) + +The syntax of _i_f is as follows: + + (if + + + ... + + else + + + ... + ) + + Any number, including none, "THEN-FORM"s may be supplied. Similarly, +any number, including none, of the "ELSE-FORM"s may be given. If there are +no "ELSE-FORM"s, then the keyword "else" may be omitted, too. + + Note that all the forms in the _i_f are _n_o_t sequentially evaluated; the +word _e_l_s_e is not even intended to be a form. If all of the forms inside the +_i_f were evaluated, it would be useless, for execution (evaluation) would not +be conditional. That is why _i_f is a special form; there are special rules +about how forms inside it are to be evaluated. The rule for all non-special +forms is the same: you evaluate all the sub-forms sequentially to produce the +arguments to the function. + + The _i_f special form evaluates the : if it results in truth, +the s are sequentially evaluated, and the value of the last one is +returned as the value of the _i_f. Otherwise, the s are evaluated +sequentially, and the value of the last returned. If there are none, +something useless is returned (nil, to those knowledgeable in Lisp). + + There are two global variables in Lisp, called "t" and "nil", whose +bindings are always the truth and falsity indicators respectively. Thus, + + (if t + (print "Truth") + else + (print "Not so truth")) + +when evaluated, will always print "Truth". + + There is a way to change the value of a variable. The only way we have +seen so far that variables acquire values is by being parameters, and +acquiring values at function call time. Values can be changed by the special +form _s_e_t_q: + +(defun adder-of-one () + (print "The value of x is") + (print x) + ("And the value of x plus one is") + (setq x (+ x 1)) + (print x)) + +A _s_e_t_q form has the word _s_e_t_q, the name of a variable, and an inside form. +The inside form is evaluated, and that value assigned to the variable. It is +like an assignment statement in other languages. + + There is a construct for looping in the Multics Emacs Lisp environment. +It, too, is a special form. It is called "do-forever": + +(do-forever + (print "Yay Multics") + (print "scitluM yaY")) + +will, when evaluated, print these two sayings forever. The way you stop +doing in a do-forever is to evaluate the form "(stop-doing)": + +(defun print-n-times (n) + (do-forever + (if (= n 0)(stop-doing)) + (print "foo") + (setq n (- n 1)))) + +This function, given a number as an argument, will print "foo" that many +times. The "=" builtin function/predicate compares its two arguments, which +must be numbers, and returns truth or falsity depending on whether or not they +are numerically equal. Note that the arguments to "=" are _n_o_t n and 0, but +rather, the number which is the binding of n and 0. The number which is the +binding of n is different each time around the loop; that is the point of the +program. It is _s_e_t_q which changes the value of n each time around, as +do-forever executes the loop. A "do-forever" form generally returns something +useless (nil), unless you exit by saying (return 5) or (return nil), or +(return a), in which latter case the value of the variable a is returned. + + One can acquire temporary variables via the special form "let": + +(defun sumtimesdif (x y) + (let ((sum (+ x y)) + (dif (- x y))) + (print "Sum times difference is ") + (print (* sum dif)) + (print "Sum squared is") + (print (* sum sum)))) + +This function has two temporary variables, sum and dif, which are +initialized to the values of (+ x y) and (- x y). The general syntax of +"let" is: + + (let ((VAR1 VAL1) + (VAR2 VAL2) + ........... + (VARn VALn)) + + + ....... + ) + + The temporary variables VAR1...VARn exist only within the _l_e_t. They get +the initial values of VAL1-VALn, which are forms that will be evaluated. +Then, with all these temporary variables set up and initialized, the FORMi's +are evaluated sequentially, and the value of the last FORMi is returned by _l_e_t. + + Another, less useful way of acquiring temporary variables is via the +special form _p_r_o_g. Forms inside a _p_r_o_g are evaluated sequentially, like +forms in a function definition. However, the first "form" in a _p_r_o_g is not +really a form at all, but rather a list of temporary variables used in the +_p_r_o_g, such as "(a b c)". That is why _p_r_o_g is a special form. The value +returned by _p_r_o_g is usually useless, unless (return...) is used to return +something meaningful. + + Inside a _p_r_o_g, one can also put "labels", to use for +go-to's: + +(defun bar2 (x y) + (prog () ;note the empty variable list + (if (< x y)(go lab1)) + (print "X is not less than Y") + (return nil) ;return "false" indication + lab1 + (print "so be it!") + (return t))) ;return "true" indication. + +Note the special form _g_o, whose _o_p_e_r_a_n_d (_n_o_t argument) +is a _l_a_b_e_l to which to "go", i.e., continue sequential evaluation of forms in +the prog. You wil find that labels are rarely needed, due to the powerful +_i_f and _d_o-___f_o_r_e_v_e_r constructs. + + There are special forms for or-ing and and-ing predicate results: they +are special because they stop evaluating their operands (from which arguments +are produced) when they "know" their answer for certain: + + (if (and (not (= x 0)) + (> (// 10 x) 5)) + (print "Quotient too large.")) + +The _n_o_t function inverts truth and falsity. +The double-slash indicates division, because slash is the escape character in +Lisp. + + Note that the _a_n_d will not attempt to evaluate the second form within it +if the first produces falsity. This prevents an error which would result if +an attempt were made to divide by zero. Sequential execution and stopping +at an intermediate result are a defined and useful feature here, as opposed +to the logical operators of, say, PL/I. + + There are two more special forms worth mentioning while we are on the +topic, progn and prog2. _p_r_o_g_n is used to force sequential execution of forms +and returning the value of the last. For instance, + +(if (and (> x 3) + (progn (print "Oh dear this is getting serious") + (> y 5)) + (print "Fatal difficulty"))) + +_p_r_o_g_n returns the value of its last form. Thus, the _a_n_d tests x being +greater than 3, and y being greater than 5, before the "print" of "Fatal +difficulty" is evaluated. The printing of "Oh dear..." occurs as part of the +evaluation of the _p_r_o_g_n, it is only the second value in the progn which _a_n_d +gets to see. The _p_r_o_g_n is used to force evaluation of the _p_r_i_n_t form. + + _p_r_o_g2_ is even a bit stranger, but often just the thing one needs. _p_r_o_g2_ +is just like _p_r_o_g_n, except that it returns its _s_e_c_o_n_d argument, evaluated, +rather than its last. It must have at least two arguments. It is used for +clever tricks that involve saving some value which is subsequently going to +be destroyed. The following form, when evaluated, interchanges the values of +x and y: + +(setq x (prog2 0 ; this zero is evaluated to 0, and + ; its value thrown away. + y ; the value of y is obtained here, and + ; remembered as it is here. + (setq y x))) ; x is evaluated, and that value + ; assigned to y. The value of setq + ; is that value. + ; But the value of the _p_r_o_g2_ is that value of y as it was before we + ; assigned into y, and now the outer setq assigns that to x. + + + S__y_m_b_o_l_s + + There is one more type of data object in Lisp that will concern us at +present. It is called the _s_y_m_b_o_l. Symbols are named data objects kept in a +registry of symbols, by Lisp. For current purposes, there is only one symbol +of any name. Symbols are used in Multics Emacs to represent buffer names, +and various quantities associated with buffers. Lisp uses symbols to keep +track of functions, and internally to keep track of global variables. + + To use a symbol in a program, we give the name of the symbol preceded by +the ASCII quote character, '. For instance, the form + +(setq x 'Brunhilde) + +assigns the symbol named Brunhilde to x. Note that this is different +from + +(setq x "Brunhilde") + +which assigns the _s_t_r_i_n_g Brunhilde to x, and from + +(setq x Brunhilde) + +which assigns the value of the variable Brunhilde to x. + + L__i_s_p L__i_s_t_s + + The final data-type of Lisp with which we will have reason to deal is the +_c_o_n_s (for construct), and the larger data-type built out of it, the _l_i_s_t. +Conses are blocks which relate to two (usually other) objects in the +environment, which are known as its _c_a_r and its _c_d_r, for historical reasons. +The function "cons", given two objects, produces a new cons, whose car and +cdr, respectively, are the two objects given. For instance, let's say +that the variable "x" has a value of the string "Brunhilde", as above, +then + + (cons 7 x) + +produces a cons whose car is the number 7 and whose cdr is the string +"Brunhilde", returning it as a value. The functions "car" and "cdr" +may be used to obtain the car and cdr of a cons. Let us say that we had +set the variable "c" to the result of the form (cons 7 x) above, then + + (car c) + +produces the number 7 as a value. + + The usual thing to do with conses is to make larger and larger structures +out of conses, by setting up conses whose car and cdr are more conses, +and so forth, until we have a large enough structure to represent all the +values we need. The resulting construction serves the same purpose +as a PL/I structure: its various parts have meaning assigned by the +programmer. + + The most common construction of conses is the "list". A list +is defined as a chain of conses, each of which has the next one +in the chain as its cdr, except the last one, which has the symbol "nil" +as its cdr. A list built in this way of n conses is called a list of n +_e_l_e_m_e_n_t_s, the elements being the n objects which are the cars of the conses. +The cons at the head of the list is identified as being "the list": its +car is the first element in the list, its cdr is the cons whose +car is the second element of the list, and so forth. Let us +construct a list of the numbers 2, 4, 5, and 7, in that order, and +set the variable "b" to it: + + (setq b (cons 2 (cons 4 (cons 5 (cons 7 nil))))) + +(Note that the variable "nil" is peculiar insofar as its value is always +the symbol "nil", thus we need not say 'nil.) + +There is a function that simplifies the writing of such forms, for +constructing lists: it builds lists directly, and accepts any number +of arguments. It produces the same result as the type of construction +shown above. It is called "list": + + (setq b (list 2 4 5 7)) + +To get the third element of the list, once this form were evaluated, we +could evaluate the form + + (car (cdr (cdr b))) + +(ie.e, the car of the cons which is the cdr of the cons which is the +cdr of the cons which is the value of b). Again, there are +Lisp functions to simplify such constructions. The above form +is equivalent to + + (caddr b) + +In general, for up to 4 car's and cdr's deep, total, functions +like cadr, cdar, caddr, cadar and so forth, are provided (up through caaaar +and cddddr). The first four elements of a list are gotten by +car, cadr, caddr, and cadddr (it is good exercise to work that +through and verify why this is the case). + + When lists are printed out by Lisp, they are represented +as a pair of parentheses around the printed representations of all +of the elements, in sequence, separated by spaces. Thus, if +Lisp printed out the list which was b's value above, it would +appear + + (2 4 5 7) + +Conses whose cdr is the symbol nil may always be viewed as lists +of one item, and are so printed out by Lisp, unless it is in the +process of printing a larger list of which the cons at issue is +a chain-link. Conses whose cdr is neither nil nor another cons +are printed with a dot preceding the cdr. Thus: + + (cons 'a 'b) => (a . b) + (cons 'a nil) => (a) ;a list of one element + (cons 'a (cons 'b 'c)) => (a b . c) + (cons 'a (cons 'b nil)) => (a b) ;list of two elements + (cons 'a (cons (cons 'b 'c)(cons 'd nil))) ;list of three + => (a (b . c) d) + +Lists can be put into programs, by quoting them, as we quote symbols: + + (setq b1 '(this is (a list)(of lists))) + +Two functions are provided to redefine the car or cdr of an existing cons. +They can be very dangerous if misused, especially if they alter a list as in +the form above, which is written into a program as a constant. rplaca +(replace car) and rplacd (replace cdr) each take two arguments, the first is +the cons which is to be altered, and the second is the new car or new cdr +respectively. the returned value is the cons itself. + + A_C_T_U_A_L_L_Y_ W_R_I_T_I_N_G_ E_M_A_C_S_ E_X_T_E_N_S_I_O_N_S_ + + The starting point for writing extensions is building functions out of +provided functions in the Emacs Lisp environment, and hooking them +up to keys. The documented set-key and set-permanent-key commands can be +used to connect keys to Lisp functions that you provide, as well as to +provided commands and keyboard macros. + + Many simple and useful extensions are just groups of provided commands +strung together. For instance, suppose that we want to write a function that +goes to the beginning of a line, deletes all whitespace there, goes to the end +of the line, does the same, and then goes back to the beginning of the line. + + Interactively, we would type; + + ^A ESC-\ ^E ESC-\ ^A + +to do this. To write such a function, called "shave-line", let us say, we +would write this: + +(defun shave-line () ;keystroke functions take no args. + (go-to-beginning-of-line) + (delete-white-sides) + (go-to-end-of-line) + (delete-white-sides) + (go-to-beginning-of-line)) + +Write this function in a file, with the editor of your choice. When in +Emacs, say ESC-X loadfile PATHNAME CR, to load it in as code. Then hook it +up, perhaps by saying + + ESC-X set-key ^XA shave-line CR + +Then, hitting ^XA will cause the chosen sequence of actions to happen. In +order to find out the names of the functions that we had to use to code shave- +line, all we had to do is ask ESC-? what the names of the functions on ^A, +^E, and ESC-\ were. + + Now we want to be able to do more complex things, like use conditionals +and variables. Let us say that we wanted a function that went to the +beginning of a line and deleted all words that started with "foo" from the +beginning of the line. + +(%include e-macros) + +(defun foodeleter () + (go-to-beginning-of-line) + (do-forever + (if (looking-at "foo") + (delete-word) + (delete-white-sides) + else (stop-doing)))) + +The (%include e-macros) must be at the beginning of any file that uses the +Emacs environment Lisp macros. The file e-macros.incl.lisp is found in the +same directory as the editor. It should be in your "translator" search path +in order to do any Emacs extension development work. + + What this function does in essence is type ^A, and as long as the first +three characters on the line are "foo", does ESC-D's followed by ESC-\ to +remove the whitespace after the word. When the first three characters are no +longer "foo", it will return. "looking-at" is an Emacs predicate (to be +described in detail below) which tests whether a given string is to the right +of the current "cursor". We will no longer discuss the issue of how to hook +this or any other function up to a given key; we have already covered that +adequately. From this point on, we will only discuss coding functions. + + If you write the function foodeleter, hook it up to a key and use it, +you will watch all foo-starting words magically disappear at once from the +begninning of a line with foo-starting words at its front, when you strike +this key. Note that the code for foodeleter has no mention of printing, +output, or displays. It cares and or knows exactly as much about them as you +do when typing Emacs keystroke commands. It just manipulates the text in the +buffer, and the screen or printing terminal is managed automatically by the +magic of the Multics Emacs redisplay. The display need never be thought +about in coding Emacs extensions. + + It is a major intentional feature that many of the commands that are +connected to keys can be, and should be used in coding extensions. +go-to-end-of-line, go-to-beginning-of-buffer, skip-over-indentation, +forward-char, and delete-word are typical of them. There are some commands, +however, that should not be used from extension code. For example, if you +wanted to search for some string, you do not want to invoke +string-search, which is what ^S is connected to, for that will prompt +the user in the minibuffer for what to search for. Here is a table of +some keystroke commands that you should not use in extensions, what you +should use instead, and why: + +KEY DONT USE USE INSTEAD WHY + +^N next-line-command next-line next-line command worries + about screen position, + which is expensive and + usually not needed. + Also worries about + numeric arguments. + +^P prev-line-command prev-line Same reasons as above. + +^K kill-lines kill-to-end-of-line + delete-char (at eol) + ^K is very complex, has + many cases, worries about + numeric arguments. + +^S string-search forward-search forward-search takes string + as Lisp argument, does not + prompt. Moves "cursor" if + search succeeds; returns + truth or falsity to indicate + result. + +^R reverse-string-search + reverse-search Same as ^S. + +^X^R read-file read-in-file read-in-file takes Lisp + argument for pathname, + does not prompt. + +^X^W write-file write-out-file Same as ^X^R. + +^W wipe-region wipe-point-mark Use local marks, see below. + +ESC-/ regexp-search-command + regexp-search Same arguments as ^S. Takes + Lisp argument, no slashes. + Returns falsity if not found + or moves cursor to after + and returns mark to before + matched string if found. + +^XB select-buffer go-to-or-create-buffer Takes arg, doesn't prompt + +^X^F find-file find-file-subr Ditto. + + This list is probably not complete, but these are the important +ones to know. + + Commands whose behavior is indistinguishable between ESC-5- +and , i.e., ^B, ^D, ^F, ESC-B, ESC-D, ESC-F, +#, ESC-#, etc., are OK to use in extensions; they do not inspect their +arguments. They are invoked multiple times by the Emacs listener if +appropriate. Commands whose names include the word "command" (other than +^G, command-quit) are usually not intended to be used in code. + + The value of the numeric command argument, i.e., "5" in ESC-5-, +is available as the binding of the global variable "numarg"; if there was no +numeric argument given, this variable is set to the symbol "nil" (not to be +confused with the global variable nil, whose binding is the symbol nil) which, +we now disclose, is _t_h_e representation of falsity. + + The normal printing characters are hooked up to the function +self-insert, which inserts the last physical character typed at the current +point in the buffer. This is clearly unusable from code, if your desire is +to insert text into the buffer. For this purpose, the Emacs environment +provides the function "insert-string", whose argument is a string to be +inserted into the buffer at the current cursor. As in typing in text +manually, the cursor is left after the inserted text: + +(defun make-a-point () + (go-to-beginning-of-line) + (insert-string "CASE IN POINT: ")) + + make-a-point, when invoked, goes to the beginning of the line, and +inserts the string "CASE IN POINT: " in the buffer. The cursor is left +after the inserted string. + + When we say "the cursor is moved around" or "a string is inserted" in a +function, we do not imply that the user watching the screen can see all these +things happen. No action on the screen occurs until the entire function has +finished running, at which time, the screen is updated all at once, as +appropriate, showing the total, cumulative effect of what has happened, +regardless of how it happened. + + M__a_r_k_s _a_n_d _t_h_e_i_r M__a_n_a_g_e_m_e_n_t + + A concept of great value is that of the "mark", or, as it is called in +other Emacs-like editors, the editor buffer pointer. Like the cursor, a mark +is a conceptual pointer to the position between two characters in the current +buffer. Marks, like the cursor, have the property that they remain between +the two characters between which they were put regardless of other insertions +or deletions in the same buffer, even on the same line as the mark. Marks +are valuable because regions of text in the buffer are specified as the +extent between the current conceptual cursor, hereafter known as "point", and +a given mark. Marks are a type of data object in the Multics Emacs Lisp +environment, like strings, numbers,and symbols. The value of any variable +may be made to be a mark. The value of many variables might even be the same +mark! The "the-mark" spoken of in the documentation is just one mark, that +is the value of a global variable that many supplied functions know about. +Emacs functions use many temporary marks. + + The function set-mark creates a new mark, which points to the current +"point" in the current buffer. It stays around, and is updated by the editor, +any time text is inserted or deleted in this buffer. Since this is +expensive, we must take care to discard, or _r_e_l_e_a_s_e marks when we are done +using them. This is done by giving them to the function release-mark. Here +is an example of a function which deletes three words and all between them: + +(defun delete-three-words () + (let ((temp-mark (set-mark))) ;make a mark in a temp var. + (do-times 3 (forward-word)) ;3 words forward + (wipe-point-mark temp-mark) ;wipe out the stuff between point + ;and where point was. + (release-mark temp-mark))) + +The variable temp-mark is set to a mark representing the "point" at the time +delete-three-words is entered. "do-times" is a very useful construct in the +Multics Emacs Lisp environment, that repeats the evaluation of one or more +forms a given number of times. Its syntax is: + + (do-times .. ) + +wipe-point-mark is a function which, given a mark, takes all the text between +"point" at the time it is invoked and that mark (i.e., "point" at the time +that mark was created) and deletes it from the buffer. It is, however, +pushed on to the kill ring, so that ^Y can be used to retrieve it. If we +did not want it pushed onto the kill ring, we could have said + + (without-saving (wipe-point-mark temp-mark)) + +instead of + + (wipe-point-mark temp-mark) + +and no saving would have occured. After we perform the computation, we free +up the mark, to keep the performance of the editor up. + + The sequence of setting a mark, using it, and releasing it, is so common +that a special construct in the Multics Emacs Lisp environment is provided +which takes care of all of this, including the creation of a temporary +variable, so no _p_r_o_g or _l_e_t is needed. It is called +"with-mark". The function delete-three-words, rewrtitten to use it, looks +like this: + +(defun delete-three-words () + (with-mark m ;m is usually used for the name of a mark. + (do-times 3 (forward-word)) + (wipe-point-mark m))) + +The with-mark construct is very powerful and useful. Its syntax is +(the word "syntax" is a tip-off to a special form): + + (with-mark + + + ... + ) + +It means: "Where I am now, call that . Evaluate (execute) +the forms to , sequentially, returning the value of the last +one as a value. Before returning anything, however, free up the mark I made". + + A very common use of marks is to remember where you were at the time you +started something, and after some traveling around, get back there when you +are finished doing it. Here is an example of a function which truncates a +line which is longer than 50 print positions, with backspaces and tabs all +considered properly: + +(defun trunc-50 () + (with-mark m ;remember where we started + (go-to-end-of-line) + (if (> (cur-hpos) 50.) ; dot is for decimal, default is octal + (go-to-hpos 50.) + (kill-to-end-of-line)) ;what ^K does not at e.o.l. + (go-to-mark m))) ;return to where we were + + Several things are worth noting here. "cur-hpos" is a very valuable +function which tells you the horizontal position (on a dprint, not on the +screen) of the current "point" (the left margin is considered to be 0). +As can be seen from the from "(cur-hpos)", it takes no arguments. The +function go-to-hpos moves point to a position on the current line whose +horizontal position is its argument, or the end of the line, if the line is +shorter than that. + + Now "(go-to-mark m)" is not some kind of a branch, but tells the editor +to move the current point in this buffer to the point where it was at the time +the mark, to which the variable m is bound, was created. + + Although moving the editor's point to previously saved marks is +extremely common, just using the mark mechanism to remember where you were +before some excursion and get back there is so common that a special +mechanism is provided just for this: it is called save-excursion, and it deals +with all the issues of temporary variables and releasing the mark when done. +Our function trunc-50 recoded to use it looks like this: + +(defun trunc-50 () + (save-excursion + (go-to-end-of-line) + (if (> (cur-hpos) 50.) + (go-to-hpos 50.) + (kill-to-end-of-line)))) + +The semantics of the save-excursion special form are as follows: Remember +where I am, via a mark saved in a secret internal variable. Evaluate all of +the forms within the save-excursion, and return as a value the value of the +last one. Before returning anything however, move the editor point back to +where it was when the save-excursion was first "entered", and release the +mark used to remember this place. + + + Note that if point were at print position 75. at the time trunc-50 +was called, it will wind up at position 50, even though the mark to which it +wants to return points to what was at position 75. No error is indicated, or +has occured. Marks live, even if characters to the right or left of them are +deleted. + + + C__l_e_a_n_u_p H__a_n_d_l_e_r_s + + You may have wondered, in the previous section, what happens if an +extension encounters an error while executing, and never gets to release +a mark it has set. When errors occur (for example, forward-char (^F)'ing +off the end of the buffer), Emacs aborts execution of command functions, +returns to its listener, and beeps (as when a ^G is performed), as you +know, if you have ever tried to ^V off the end of a buffer, or so forth. + + Since the releasing of marks has been pointed out as mildly critical, +there is a need for a "cleanup-handler"-like facility to make sure that +marks get release when code is aborted. Indeed, there is such a facility +in Lisp, and we will explain its use summarily. This cleanup-handler +facility is useful for many other things, too: "save-excursion" returns +the cursor to the point at which it found it, if aborted through, +save-excursion-buffer returns to the buffer where it found the editor +if aborted through, all the mark-handling forms release their mark, +and so forth. These Emacs-environment primitives use the cleanup-handler +facility internally, so we need not worry about cleanup-handlers if we +use them. However, occasionally, there are times (see the code +for columnating the Emacs wall chart, for example) when we must use +cleanup-handlers explicitly. The Lisp form "unwind-protect" +is the primitive cleanup-handler. Here is its syntax: + + (unwind-protect + + + + ... + ) + +The meaning of this is as follows: The is evaluated, i.e., +executed, and then to (any number of cleanup +forms are permissible), and the value of the returned. +So far, unwind-protect is very much like _p_r_o_g2_ or _p_r_o_g_n. The difference, +however, is that to will be executed even if the +execution of fails, and aborts! Similarly, the cleanup forms +will be executed even if diabolically tricky things like a _r_e_t_u_r_n from a _p_r_o_g +inside the causes its execution to terminate prematurely. + + Thus, the cleanup forms are executed after _e_v_e_r_y termination of the +, whether normal or abnormal. The following use of +unwind-protect (which could clearly be done in simpler ways, but is here for +illustrative purposes only) performs "complex-function", and returns the +cursor to the beginning of the buffer, even if "complex-function" +"explodes": + + (unwind-protect + (complex-function) + (go-to-beginning-of-buffer)) + +Note that if you want more than one , you had better use +_p_r_o_g_n to encompass them, and make your this _p_r_o_g_n. + + Unlike Multics/PL/I cleanup handlers, unwind-protect cleanup forms +will be executed upon normal termination of the subject form, too. +A close inspection of most PL/I programs using cleanup handlers shows +that this may be the better idea after all. + + + U__s_e_f_u_l P__r_e_d_i_c_a_t_e_s + + The following predicates in the Multics Emacs environment are basic to +all extension-writing; they are used to test various hypotheses about point, +marks, and the buffer: + + (eolp) ;End of line predicate. True if point is at end of a text + ;line, which is right before the newline character. + + (bolp) ;Beginning of line predicate. True if point is at the + ;start of a text ine, being either before the first + ;character of the buffer, or after a newline. + + (firstlinep) ;First line predicate. True if point is on the first + ;text line of the buffer. + + (lastlinep) ;Last line predicate. True if on last buffer line. + + (at-beginning-of-buffer) + ;True if point is right before the first character in the + ;buffer + + (at-end-of-buffer) + ;True if point is right before the newline on the last + ;line of the buffer. You can't go past it. + + (looking-at ) + ;True if appears in the buffer + ;immediately to the right of point. Restriction: + ; may not contain a newline character, + ;except as its last character. + + (at-white-char) ;True if the character to the right of point is + ;a space, newline, or tab. + + (point>markp ) ;True if the current point is _f_u_r_t_h_e_r in the + ;buffer than the position defined by . + ;This is expensive, and should not be used in loops. + + (mark-reached ) + ;True if the current point is up to or beyond + ;in the buffer. Intended for use in controlling + ;character-by character loops, expects that point + ;starts to the left of and moves toward it. + ;The function (order-mark-last ) may be used + ;to switch point and mark if needed at the start of such + ;loops. Will not terminate unless executed with mark + ;and point on same line. + + (mark-at-current-point-p ) + ;True if the mark represents the exact same + ;position as the current point. + + (mark-on-current-line-p ) + ;True if the mark represents a position on the + ;same line as the current point. + + (mark-same-line-p ) + ;True if two marks which are arguments represent + ;positions on same line. + + (line-is-blank) ;True if current line is all blanks or empty. + + (empty-buffer-p ) + ;True if the buffer identified by is + ;empty, i.e., contains exactly one line with only a + ;newline character in it. The form + ;(empty-buffer-p current-buffer) may be used to test + ;the emptiness of the current buffer. See below + ;for a discussion of buffer symbols. + ------------------------------ + + Now we use some of this. Here is a function that ltrims all the lines in +the buffer. There are easier ways, but we are using the primitives and +constructs we do here for illustrative purposes: + +(defun ltrim-all-lines () + (save-excursion ;be polite, restore point. + (go-to-beginning-of-buffer) + (do-forever ;loop on lines thru buf + (do-forever ;loop thru chars on line + (if (eolp)(stop-doing)) ;stop at eol. + (if (at-white-char)(delete-char) ;do the work + else (stop-doing))) ;non-white char, next line. + (if (lastlinep)(stop-doing)) ;quit when did last line + (next-line)))) ;leaves you at b.o.l. + + + W_H_I_T_E_S_P_A_C_E_ M_A_N_A_G_E_M_E_N_T_ + + Management of whitespace is very important. Neatly formatted editor +output and displays, as well as program and document formatting require this. + + The following functions exist to deal with whitespace: + + skip-over-whitespace + Takes no arguments. Moves point forward over all tabs, blanks, and + newlines until a non-white character or the end of the buffer is + reached to the right of point. + + skip-back-whitespace + Takes no arguments. Moves point backward over all tabs, newlines, + and blanks until the character to the left of point is not one of + these, or the beginning of the buffer is reached. + + skip-to-whitespace + Moves forward until character to right of point is one of tab, + blank, or newline. Since last character in buffer must be + a newline, there is no special end condition. + + skip-back-to-whitespace + Moves backward until the character to the right of point is + one of tab, blank, or newline, or the beginning of the buffer is + reached. + + delete-white-sides + The old standby on ESC-\, this extremely valuable function may be + used to advantage to delete leading or trailing blanks from + anything, or delete space between words. + + skip-over-whitespace-in-line + Same as skip-over-whitespace, but will stop before the newline + character at the end of the line (i.e., stop at the end of the line) + if it gets that far. + + skip-back-whitespace-in-line + Same as skip-back-whitespace, but will not proceed backward + beyond the beginning of the line. + + A very common need is to generate whitespace to reach a given horizontal +position (column). This is good for all kinds of tabbing and page layouts. +The function whitespace-to-hpos performs this service; it generates tabs and +spaces as appropriate, moving point along until the horizontal position which +is its argument is reached. The following toy function moves all lines in +the buffer seven spaces over, regardless of their original indentation, with +just the right amount of tabs and spaces when all is said and done: + +(defun move-over-7 () + (save-excursion + (go-to-beginning-of-buffer) ;all do-for-all-lines + (do-forever ;start like this. + (skip-over-indentation) ;This is ESC-M, which is + ;often useful. Look it up. + (let ((hpos (cur-hpos))) ;let hpos be the curr. pos. + (delete-white-sides) ;close up all original space + (whitespace-to-hpos (+ hpos 7))) ;make just enough + (if (lastlinep)(stop-doing)) + (next-line)))) + + A related need is that to space out to a given position with whitespace, +but leaving a single space if you are already there or beyond. This is +useful for producing columnar output where overlength fields must be +separated (like what ^X^B does). whitespace-to-hpos will not do this; it +stops if it is far enough. This need is fulfilled by format-to-col, which +takes a single argument, a horizontal position to be spaced out to. If the +current point is already that far, it inserts a space. + + E__x_t_r_a_c_t_i_n_g T__e_x_t F__r_o_m _t_h_e B__u_f_f_e_r + + The function point-mark-to-string is used to get a Lisp string whose +value is the string of characters between point and the mark which is its +argument. Let us demonstrate with a function that finds a vertical bar (|) +on a line, deletes it, and swaps the two line-halves around it. For instance, +the line + + An Indian with a zebra | never trips in the snow + +will come out + + never trips in the snowAn Indian with a zebra + +Here is this extremely utilitarian construction: + +(defun swap-around-bar () + (go-to-beginning-of-line) + (if (not (forward-search-in-line "|")) ;check for one at all. + (display-error "Hey, there is no ""|""!")) + (rubout-char) ;what # does + (with-mark m ;m in middle of line + (go-to-end-of-line) + (let ((temp (point-mark-to-string m))) ;get middle to end + (without-saving (wipe-point-mark m)) + (go-to-beginning-of-line) + (insert-string temp)))) ;put in text + + forward-search-in-line is just like forward-search, except that it +indicates failure if it cannot find its search string in the current line. +If we cannot find the vertical bar, we complain and do command-quit, a "^G", +which stops the execution of this function at once and returns to +command level. It is often needed, however, to search for some string +only in a given line, and thus, it is useful in its own right. There is also +a reverse-search-in-line, and a regexp-search-in-line, which are similar in +their relation to ^R and ESC-/. + + T__a_l_k_i_n_g _t_o _t_h_e U__s_e_r + + + We may not use the Lisp I/O system to print out messages and/or query +the user. The Multics Emacs redisplay must manage the screen itself, +entirely. Thus, you may not use "print", or "read", or other Lisp functions +that you may be familiar with. + + A function called minibuffer-print is provided, which prints all the +little messages that Emacs outputs in the minibuffer screen area. It takes +any number of arguments, which must be strings. The useful function +decimal-rep is provided to convert numbers into strings for purposes of +inserting them in the buffer or handing them to display-error. The following +function counts the number of a's in the current line: + +(defun a-counter () + (let ((n 0)) ;initial count + (save-excursion ;why not. + (go-to-beginning-of-line) + (do-forever + (if (not (forward-search-in-line "a")) + (minibuffer-print "I found " (decimal-rep n) " a's.") + (stop-doing)) + (setq n (+ 1 n))))) ;count 'em. + + Note how we take advantage of the fact that forward-search-in-line +moves to the right of what it finds (like ^S, its patron), so that it will not +find it the next time. + + To prompt the user for input, which is always done via the minibuffer +(other than for ESC-?, which is highly special), the function +minibuf-response is used. It takes two arguments. The first is the prompting +string. The second should be specified by the value of one of the global +variables ESC or NL, which are bound to magic symbols that minibuf-response +knows about. If the value of ESC is used, minibuffer input will terminate +on an ESC. If the value of NL is used, (NL, _n_o_t CR), minibuffer input will +terminate on a carriage return. There are no other choices. Thus, + + (minibuf-response "Type new division name: " NL) + +will return the user's response to this question. S/he is expected to +terminate it with a carriage return. The value of minibuf-response is a Lisp +string. The carriage return will not appear in it, nor will the prompt. + + Often one wants to display an error message in the minibuffer, and then +abort execution of an extension, i.e., execute a command-quit (^G). For +example, in checking the arguments to an extended command, checking that a +necessary sequence of previous commands were issued before a certain command, +etc. For this, display-error is provided. display-error is like +minibuffer-print, except that it does NOT return, but aborts to emacs top +level immediately after printing its error message in the minibuffer. Like +minibuffer-print, it takes any number of string arguments. + + Messages printed by minibuffer-print are suppressed during keyboard macro +( ^X(, ^X)) execution, just as search strings are not displayed, and other +gratuitous messages are suppressed. The following set of functions describes +the repertoire of message-printing: + + + display-error + Prints a message in the minibuffer and aborts to editor top + level. It is intended for use in error message pritning. + + display-error-noabort + Prints a message in the minibufer and continues execution. This + function is intended for reporting non-fatal errors such + as "User not accepting messages...". + + + minibuffer-print + Prints a message in the minibuffer. The message is NOT printed + during macro execution. This function is intended for + use by extensions which print messages in the normal process + of their execution such as the line-count from ^X=. For + this function, as well as the others below, in multi-line + minibuffer situations, an appropriate line is chosen based + upon availability of empty lines and several other criteria. + + minibuffer-print-noclear + Prints a message in the minibuffer but does not erase the + previous contents. The message is NOT printed during macro + execution. Output is appended to the last minibuffer line used. + + display-com-error + Prints a message in the minibuffer and aborts to editor top + level. Its first argument is a Multics standard error code. + It remaining arguments are character strings or symbols. + See the section "Multics Error Table" below for the technique + used to get error_table_ values into your program. + + display-com-error-noabort + Prints a message in the minibuffer and continues execution. + Its first argument is a Multics standard error code. + + minibuffer-clear + Clears out the last minibuffer line that was written in, except + during macro execution. This function should be used to clear + out minibuffers written in by minibuffer-print and + minibuffer-print-noclear at the end of subsystem invocation. + + display-error-remark + Identical to display-error-noabort, except that the particular + minibuffer line on which this remark will be printed will be + "targeted" to be the next ine overwritten for any minibuffer + remark or output at all. This function should be used for + "transient" remarks (such as "Writing", "Modified", etc., which + are desired to get off the screen as soon as possible. + + V__a_r_i_a_b_l_e_s + + Many groups of Emacs commands need global variables to communicate +amongst themselves and the functions they call. A global variable is a Lisp +variable which is not the parameter of any particular function; its value may +be accessed or set by any function. Some of the global variables in Multics +Emacs are highly user-visible, for example, "fill-column", which contains the +column number of the fill column as set by ^XF, and used by the filling +commands and fill mode. Similarly, the character string which is the +comment prefix is the binding of the global variable "comment-prefix". +Extensions will often need global variables to communicate among their parts. + + Normally, global variables in Lisp are accessed just line other +variables, i.e., those which are parameters of functions or _p_r_o_g or _l_e_t +variables (_l_e_t will be discussed later.). For instance, a function which +wanted to set the fill column to 30. if it was over 40. now might contain +the code: + + (if (> fill-column 40.)(setq fill-column 30.)) + + When a global variable is used in your program, say one named +"my-global", the "declaration" + + (declare (special my-global)) + +must appear in the program before its first use, to tell the compiler about +this "special" variable (which is the Lisp term for a global variable, +incidentally). The e-macros include file declares many of the provided +global variables, you need not declare them. + + The global variable situation in Multics Emacs is complicated by the +fact that editing activity is usually local to each buffer. +That is to say, if a set of global variables contains a set of values about +what is being edited, it usually pertains to what is going on in only one +editor buffer. If the user switches to a different buffer, and uses the same +editor facility, we do not want to use or change the values of those global +variables which pertained to activity in the other buffer. At first, this +would seem to make global variables unusable, because all functions would +have to keep track of what buffer they are talking about before using any +global variables, and maintaining several sets of them thereby. +Fortunately, it is a lot easier than that. The buffer-switcher in Multics +Emacs is willing to save and restore values of global variables as buffers +are switched if you tell it what variables you want so saved and restored, when +the buffer you are operating in is exited and re-entered, respectively. Such +a variable is called a _p_e_r-_b_u_f_f_e_r _v_a_r_i_a_b_l_e, and the act of telling the +buffer-switcher about it, thereby associating its current value with this +buffer, is called _r_e_g_i_s_t_e_r_i_n_g it. Once a variable has been registered in a +given buffer, the functions which use it can assume that its value will be +what it last was in that buffer whenever the editor enters that buffer. +Another term for a per-buffer variable is a _l_o_c_a_l _v_a_r_i_a_b_l_e. +The following two primitives exist for registering local variables; there are +no primitives for setting or retrieving their values, because the whole point +of this mechanism is to allow them to be accessed as normal Lisp variables. + + register-local-variable + Called with one argument, the symbol whose name is the name of the + local variable we wish to register. Registers it in the current + buffer, if not already registered here. If not already registered + here, the variable initially inherits its "global value"; if + registered, its value is left alone. If it has no global value, + it acquires the symbol "nil" as its value if this is its first + registration in this buffer. + + establish-local-var + Just like register-local-variable, but takes a second argument, + a default value to be initially assigned to the variable the first + time it is registered in this buffer, if it has no global value. + + The global value of a per-buffer-variable is the value it has in buffers +in which it is not registered. It is this value which is set if you set this +variable while in a buffer in which it is not registered. A local variable +"inherits" its global value when it is first registered in a given buffer. +For variables that have no global value (i.e., were never assigned one), +establish-local-var can be used to good effect to provide default +initialization. + + Here are three function which maintain a "problem count" in this buffer. +The user says ESC-Xmonitor-problemsCR to start it up in a given buffer, +and then can say ^X-P to count a problem, and ^X-R to report how many +"problems" he has so noted: + +(defun monitor-problems () ;command-level function + (set-key '^XP 'note-a-problem) ;set the keys needed, only + (set-key '^XR 'report-problems) ;in this buffer + (establish-local-var 'problem-count 0)) ;register the local var, + ;initial value 0 here. + +(defun note-a-problem () ;executed on ^XP + (setq problem-count (+ 1 problem-count))) ;Increment the variable. + +(defun report-problems () ;on ^XR + (minibuffer-print "There have been " (decimal-rep problem-count) + " problems in this buffer.")) + + By calling establish-local-var on the symbol "problem-count", the +programmer here has ensured that the problem-count's in each buffer +in which he counts problems will be maintained separately. + + P__r_o_v_i_d_e_d V__a_r_i_a_b_l_e_s + + The following per-buffer variables are automatically registered by the +editor. Their values may be inspected or set in extension code. The following +table gives their names and meanings: + +buffer-modified-flag + Contains t or nil, indicating that this buffer has or has not been + modified since last read in or written. Set automatically by the + editor. Modification of a buffer executed within the special form + + (without-modifying ...) + + will not set this flag. + +read-only-flag + Contains t or nil indicating whether or not this is read-only buffer. + The editor does not set this flag, it is set only by extensions. + An attempt to modify the text in this buffer will produce an error + and a quit to editor command level if this flag is on, and the + buffer-modified-flag flag is off (nil). The buffer may be modified, + however, successfully, by functions executed from within extension code + within a "(without-modifying ...)". + +fpathname + The full Multics pathname associated with this buffer by the last file + read or written into/out of it, or by find-file. It is nil if there is + none. Changing it from extension code will modify or "forget" the + pathname as you set it. + +der-wahrer-mark (name subject to change, use macros instead) + The mark associated with the user-visible mark that ^X^X etc. see. + Will be nil if no mark ever set by the user in this buffer. Do not set + this variable, call set-the-mark (the ^@ function) to do so. + +current-buffer-mode + The major mode in effect in this buffer. The value is a symbol. To + claim that a major mode of your construction is in effect in a buffer, + simply set this variable. + +comment-column + The comment column, as always, measured from 0. + +comment-prefix + The string, which may be a null string, which is the comment prefix. + +tab-equivalent + The amount of spaces that a tab is worth. Initialized to 10., the Multics + standard, this can be set either in code or by ESC-ESC to edit code + from other operating systems. The redisplay will obey this variable too, + but not in two-window mode. + +buffer-minor-modes + A Lisp list (to be explained) of symbols representing the minor modes + in effect in this buffer. + + L__a_r_g_e S__c_a_l_e O__u_t_p_u_t + + Output of multi-line information, or information longer than about 60 +characters, should not be done via display-error, which prints in the +minibuffer area, but via the _l_o_c_a_l-_d_i_s_p_l_a_y, or _p_r_i_n_t_o_u_t facility. This is the +facility with which buffer listings, global searches, apropos, and other +familiar commands display their output. On display terminals, it displays +lines at the top of the screen, asking for "MORE?" as each screen fills up, +and pausing for the next Emacs command at the end of the display, and +restoring the screen. On printing terminals, the data is simply printed +line by line, with no "MORE?" processing or pausing at the end. +The local display facility is an integral part of the Multics Emacs +redisplay. + + There are three common functions used in generating local displays: + +init-local-displays + is called with no arguments to start a local display. It basically + sets up the necessary redisplay mechanism, initializing it to the top + of the screen. + +local-display-generator + This function is called with a string, whose last character must be a + newline, and displays it as the next line (or lines, if continuation lines + are required) of local output. If you do not have a newline at the end + of your string, calling local-display-generator-nnl instead will provide + one automatically. There must be no embedded newlines in strings for + local output. A null string causes an empty line. + +end-local-displays + Finishes a local display, restoring the screen. Causes + the next redisplay to be suppressed, so the local display remains visible + on the screen. + + The sequence of calls + + (init-local-displays) + (local-display-generator(-nnl) ...) ;perhaps many times + (end-local-displays) + + correctly produces a local display. + + Often, the best way to generate a well-formatted local display is to set +up a temporary buffer (see "Manipulating Buffers" below), build some text in +it, and display its content, in part or in whole, as a local display. Three +functions are provided to facilitate this: + +local-display-current-line + Does a local-display-generator on the current editor line in this buffer. + +display-buffer-as-printout + Does an init-local-displays, and displays all lines of the current + buffer as local output. It does NOT do an end-local-displays; you have to + do that yourself, hopefully _a_f_t_e_r you have gotten out of your + temporary buffer and cleaned up whatever else you had to. + +view-region-as-lines + Displays the entire point-to-user-visible-mark as local display, + making all the necessary calls including end-local-displays. + + While in a function which has a local display in progress, you must never +call the redisplay (see "Calling the Redisplay" below), or call +minibuf-response or any other function which will cause redisplay, for that +will instantaneously restore the screen contents to the windows on display, +obliterating the local display in progress. + + The following function locally displays all lines in the buffer +that contain the string "defun": + +(defun look-for-defuns () ;use ESC-x look-for-defunsCR + (save-excursion ;remember where we are. + (go-to-beginning-of-buffer) + (init-local-displays) ;set up for printout. + (do-forever ;loop the buffer + (if (forward-search-in-line "defun") ;look for "defun" + (local-display-current-line)) ;cause printout of it + (if (lastlinep)(stop-doing)) ;check for EOB. + (next-line))) ;Go to start of next line. + (end-local-displays)) ;wait for user, and next + ;command. + + M__a_n_i_p_u_l_a_t_i_n_g B__u_f_f_e_r_s + + The easiest way to do string processing in the editor environment, i.e., +monkeying around with strings, catenating, searching, etc., is often to use +the primitives of the editor itself, which is, after all, a string-processing +language. To do this, temporary buffers are necessary. To create a buffer, +you should use the primitive "go-to-or-create-buffer", which is what +^XB uses, which goes to a buffer associated with the symbol you give it +as an argument. We will discuss how to make it temporary shortly. + + Lisp symbols are funny things; it was stated before that symbols are +kept in a registry. This is true for most symbols: this registry is called +the _o_b_a_r_r_a_y, and there is only one symbol of any given name in it. +A symbol registered in the obarray is said to be _i_n_t_e_r_n_e_d. There can +only be one interned symbol named "joe", but it is possible to create +many uninterned symbols named "joe". If you refer to a symbol named "joe" +in a program, however, by saying "'joe", you will always be getting the +interned one. + + A major feature of symbols in Lisp is that they can be given _p_r_o_p_e_r_t_i_e_s, +arbitrary user-defined attributes. These attributes are catalogued "in" the +symbol via _i_n_d_i_c_a_t_o_r_s, symbols which indicate what property we want. +The Lisp functions "putprop" and "get" store and retrieve properties. + + (putprop 'Fred 'blue 'eyes) ;Gives the interned symbol named "Fred" + ;an "eyes" property of "blue". + + (get 'Fred 'eyes) ;retrieves the property under the + ;indicator "eyes", and thus returns + ;the interned symbol "blue". + + In Multics Emacs, symbols are used (among other things) to represent +buffers. All of the information associated with a buffer is catalogued as +properties of some symbol whose name is the name of the buffer. +Thus, it is possible to have two buffers of the same name, which would imply +that the of the symbols representing them, only one is interned. ^XB +always uses the interned symbol of the name given; that is why you can ^XB back +to an existent buffer instead of creating a new one each time. + + To create a temporary buffer, we must first create an uninterned symbol, +to make sure that we are not going to switch to a buffer that is already real. +To do this, we give a string to be used in naming the symbol to the +Lisp cliche + + (maknam (explodec "A string")) + +The explodec blows the string apart into a Lisp list of characters, the +maknam builds a symbol out of it. The value of this form is the new symbol. +We can then go to a (guaranteed) new buffer of that name, i.e., + + (go-to-or-create-buffer (maknam (explodec "A string"))) + +and the global variable "current-buffer" will have that symbol as its value. +A _t_e_m_p_o_r_a_r_y _b_u_f_f_e_r is one that is destroyed automatically by the editor upon +switching out of it. To make a buffer temporary, all we have to do is give +the symbol which represents it (the "buffer symbol") a "temporary-buffer" +property of the symbol "t". This can be done by the Lisp form + + (putprop current-buffer t 'temporary-buffer) + +(The variable "t" is always bound to the symbol "t"). Once this has been +done, we must be careful not to switch out of this buffer until we are done +with it. If our code involves manipulating many buffers, some of them +temporary, we must give the temporary buffers their temporary-buffer +properties at the end of our manipulations. + + When a new buffer is created, it contains one line, which consists of +only a linefeed. There are no "truly empty" buffers in Multics Emacs. +The predicate empty-buffer-p may be applied to a buffer symbol to +determine if that buffer is in this state. +When buffers are switched, all information related to the old buffer is stored +as properties of the buffer symbol: this includes not only the local +variables registered in that buffer, but the location of "point", the +user-visible (and all other) marks, etc. Thus, when buffers are switched +back and forth (as can be seen while editing), the cursor retains its +position in each buffer, although the redisplay might choose to display a +screen differently after visiting another buffer and coming back. + + There are some applications which require making a non-temporary +buffer, putting some text in it, and going back there on occasion. For this +reason, we might want to go into a non-temporary buffer of an interned buffer +symbol, as such: + + (go-to-or-create-buffer 'name-and-address-buffer) + +or perhaps keep a global (_n_o_t per-buffer) variable which we set once to an +uninterned symbol as such: + + (setq name-and-address-keep-track + (maknam (explodec "Name and Address Buffer"))) + +and switch into it by saying + + (go-to-or-create-buffer name-and-address-keep-track) + + + The function "buffer-kill" may be called with a buffer symbol to destroy +a buffer. The function "destroy-contents-of-buffer" (no arguments) may be +called to reduce the current buffer to a single "empty" line. + + The following two variables are relevant to buffer manipulation: + +current-buffer + The value of this variable is the buffer symbol of the current buffer. + Do not change it, or incorrect operation will result. Use + go-to-or-create-buffer. + +previous-buffer + The value of this variable is the buffer symbol of the last buffer, + which will be returned to when ^XB-CR is typed. It is acceptable to setq + this variable. + + + go-to-or-create-buffer will accept a buffer-name of "" as meaning +go to that previous buffer. + + The special form save-excursion-buffer is invaluable when writing +functions that switch buffers. It provides for remembering which buffer you +were in, and switching back to it when you are done. It also saves and +restores the state of "previous-buffer". save-excursion-buffer is like +save-excursion, it executes its contained forms while pushing the +buffer-state of the editor on an internal stack, and returns the value of +the last form within it. + + The following program when invoked after typing somebody's name (say we +hook it up to a key) and follows it with his title in parentheses. We assume +the file >udd>Washington>States>personnel_data looks like this: + +Rasputin, G. E. =Chief Lecher +Nietzsche, F. =Antichrist +Mouse, M. =Optimist +Eisenhower, D. D. =Golfer + +(defun insert-person-title () + (let ((name (save-excursion ;save guy's point + (skip-back-whitespace) ;get to end of word + (with-mark m ;m = end of word + (backward-word) ;go to beg. of wd. + (catenate (point-mark-to-string m) ","))))) + ;return the word with a "," after it. + (insert-string ;insert + (catenate " (" ;open paren and sp + (save-excursion-buffer ;save the old buff + (go-to-or-create-buffer 'name-position-records) + ;go to stuff + (if (empty-buffer-p current-buffer) ;read it once + (read-in-file ">udd>Washington>States>personnel_data")) + (go-to-beginning-of-buffer) ;set up for search + (do-forever ;scan lines + (if (looking-at name) ;Are we at "name,"? + (forward-search "=") ;look for the =. + (return (with-mark n ;get to the end. + (go-to-end-of-line) + (point-mark-to-string n)))) + (if (lastlinep)(return "???")) ;couldn't find him + (next-line)) ;move on + ") "))))) + + This function operates by picking out the name you just typed by skipping +back over whitespace, and picking up all between there and the start of the +previous (current) word. It then inserts, between parentheses, the portion of +that line of the data file which contains the sought name at its front after +the equals sign. The buffer name-position-records is read into once, and +contains the data file thereafter. + + The initial save-excursion remembers the user's point location while the +word is collected: The save-excursion-buffer remembers what buffer and where +in it, all its modes, local variables, etc., while we operate in the data +file buffer. + + The function _c_a_t_e_n_a_t_e is an extremely valuable one in the context of +Multics Emacs; it takes any number of strings (or symbols, whose print-name +will be used), builds a string out of catenating them first-to-last, and +returns it. + + + C__a_l_l_i_n_g _t_h_e R_e__d_i_s_p_l_a_y + + The Multics Emacs redisplay is a large and powerful screen-management +system which functions completely automatically. Its function, in simple +terms, is to decide what lines of the current buffer should be shown on the +screen, determine how to modify the current screen to show the contents of +those lines, and update the screen in an optimal manner. It is called +by the editor whenever there is no more input available. It is very simple +to call. It takes no arguments, i.e., one just says + + (redisplay) + + The redisplay does not know or care by what means the buffer was +modified; if you delete several words with ESC-D, ^D, or ^W, it is all the +same to the redisplay, and it will act similarly in updating the screen. + + Normally, the extension writer need not be concerned at all about the +redisplay. It is a major feature of Multics Emacs that only the total effect +of a complex manipulation is displayed, not every small operation that the +manipulation used to achieve its effect. + + There are some situations, however, where it is advantageous to call the +redisplay explicitly from extension code. One example might be a function +which takes a tremendous amount of compute time and might wish to update the +screen every-so-often as it finishes some major section. Note that you do not +tell the redisplay what do display or how to display it; it will display some +excerpt of the current buffer which is guaranteed to contain the current line, +and show the cursor where the current point is. If you call it during a +buffer excursion, i.e., while in some special buffer in a function, it will +thus display that buffer about its "point", and as soon as that function +returns to editor command level, the screen will be overwritten with the +original buffer's lines. Thus, calling redisplay is _n_o_t to be considered a +substitute for local displays (see above). + + The most common need for calling redisplay is in functions that add +text (or change text) on a line, and move to another line. For example, the +"electric semicolon" of electric PL/I mode, which adds a semicolon to the +current line and moves to the next. On a printing terminal, the user would +never see the semicolon unless special action were taken. The text in the +buffer would indeed be right, but by time the next redisplay occurred (the +electric semicolon command returned) the editor would be off that line, and +thus would display the next line, where the electric semicolon command left +it. While this is correct, the user looking at his type-in would, with some +validity, complain that "all the semicolons seem to be missing". Thus, the +electric PL/I semicolon command calls the redisplay immediately after it +executes "(insert-string ";")". + + The following divertissement is a function for a "card-numbering FORTRAN +mode", which when invoked (perhaps hook it up to CR) puts a sequence number +in column 72 (71 from 0) and goes to column 7 of the next line. + + It must call the redisplay, such that on a printing terminal, the card +numbers get shown. + +(defun fortran-next-line () + (whitespace-to-hpos 71.) ;go to col 72. + (insert-string (decimal-rep cardno)) ;cardno is a local buffer var + (setq cardno (+ 1 cardno)) ;up the next card number + (redisplay) ;let printing user see. + (new-line) ;get to next line + (whitespace-to-hpos 6.)) ;6 rel = card col 7. + + + E_I_S_ T__a_b_l_e_s + + + The Multics Emacs environment provides a powerful facility for utilizing +the sophisticated 68/80 processor instructions for scanning for characters in +or not in a particular set of characters. These operations correspond to the +PL/I "search" and "verify" builtins. It is using these facilities that the +word commands operate. + + A set of characters is represented by a "charscan table", a compound +Lisp object occupying about 200 words of storage (i.e., they are not for +free). One can get a charscan table by giving a set of characters, as a +string, to the function charscan-table. It returns a charscan table +representing that set of characters: + + (setq number-verify-table (charscan-table "0123456789+-")) + + Given such a table, there are a set of functions which can be called to +utilize it to search for characters in or out of that set, backward, forward, +whole buffer or only one line. All the following functions take one argument, +a charscan table representing a set of characters we will call S. They +return nil (falsity) if they hit the end of the buffer or line (as +appropriate) without finding what they are looking for. If they succeed, they +move point. If they fail, they don't move point: + +search-for-first-charset-line + Scans current line forward from point. Success is stopping to the + left of a character in S. + +search-for-first-not-charset-line + Same as above, but success is stopping to the left of a character _n_o_t + in S. + +search-back-first-charset-line + Scans current line backward from point. Success is stopping to the right + of a character in S. + +search-back-first-not-charset-line + Same as search-back-first-charset-line, but success is stopping to the + right of a character _n_o_t in S. + +search-charset-forward + Scans the buffer from point to the end of the buffer. Success is + stopping to the left of a character in S. + +search-charset-backward + Scans the buffer backward from point to the beginning of the buffer. + Success is stopping to the right of a character in S. + +search-not-charset-forward + Scans the buffer forward from point to the end. Success is stopping + to the left of a character not in S. + +search-not-charset-backward + Scans the buffer backward from point to the beginning of the buffer. + Success is stopping to the right of a character not in S. + + + + The following function finds the first non-numeric character on the line +it is invoked on: + +(defun find-first-non-numeric () + (establish-local-var numscan-table nil) ;make sure var exists + (if (not numscan-table) ;if nil, i.e., not init yet, + (setq numscan-table (charscan-table "0123456789"))) + (go-to-beginning-of-line) + (if (not (search-for-first-not-charset-line numscan-table)) + (minibuffer-print "Line is O.K.!"))) ;failure is all is in charset + + + O__p_t_i_o_n_s + + The Multics Emacs option mechanism provides for user-settable variables +in the Lisp environment. The only difference between an "option" and any +other global Lisp variable in the editor (basic or extended) is that the +options are listed at the user-visible level by ESC-Xopt listCR, and can be +set or interrogated via the "opt" command. The option mechanism also +provides for checking that numeric variables stay numeric, and those variables +that are restricted to "t" or "nil" as values stay restricted to those values. + + Thus, options may control per-buffer or truly global variables; the +option mechanism does not care about or impose restraints upon the dynamic +scope of the variables managed by it. The option mechanism also provides for +a default global value of variables it manages. + + A global variable is "registered" with the option mechanism by invoking +the function "register-option" upon the Lisp symbol which represents (has the +name of) that variable, and its default global value. If that value is a +number, the option mechanism will restrict the variable's value to numbers; +if it is one of t or nil, the option mechanism will restrict its values to t +or nil (which the user indicates as "on" or "off"). + + The choice of whether a variable should be made an official "option" or +not depends upon whether or not you want the user to see it when an "opt +list" is done, and whether finer control than that provided by the option +mechanism over the values assigned to it is necessary. It is acceptable to +register an option the first time some code is executed; only then will it +appear in the option list. It is usual to have forms invoking +"register-option" at "top-level" in a file full of code, i.e., outside of any +function. Such code is executed when the code is brought into the editor +environment. + + The following code registers an option describing default paragraph +indentation, and shows a function that creates a new paragraph (which should +probably be hooked up to a key). Note that like all Lisp global variables, +options must be declared "special" for the Lisp compiler (see "compilation" +below): + +(declare (special paragraph-indentation)) ;for compiler. + +(register-option 'paragraph-indentation 10.) ;default is ten. + +(defun new-paragraph () + (new-line) ;two new-lines + (new-line) + (whitespace-to-hpos paragraph-indentation)) ;tab out. + + By issuing the command + + ESC-X opt paragraph-indentation 5 CR + +the user can set the amount of indentation inserted by "new-paragraph" to 5. + + + + N__a_m_e S__c_o_p_e I__s_s_u_e_s + + One of the large benefits of Lisp is that all of the functions and +variables in the environment are accessible to all functions running in it. +At times, this can be a problem, as well. When adding your own extensions +to the editor environment, there is nothing to prevent you from choosing a +name for one of your functions which happens to be the name of some internal +(or user-visible) function in Multics Emacs. Occasionally, there may be reason +to do this deliberately , e.g., write your own version of "next-line" that +did something highly special. This is dangerous, and not recommended. + + In the general case, you want to make sure that none of your functions +or variables will conflict with those of the editor. The best way to do this +is to choose some set of names that cannot possibly conflict. Two sure-fire +ways to achieve this are to use capital letters anywhere (such as initial +capitals) or using underscores in your names. No Emacs or Lisp system +functions have leading capitals or trailing underscores. There are a few +Lisp system functions with embedded underscores, but other than make_atom, it +will not hurt you if you accidentally redefine them. The Lisp compiler will +also warn you if you attempt to redefine a system function. No functions in +Multics Emacs contain underscores in their names. + + Another more reasonable way to avoid name scope conflicts is to prefix all +of your names in a given package with some prefix indicative of the facility +that you are trying to implement. For instance, if you are implementing a +SNOBOL edit mode, you might name your functions +"snobol-mode-find-match-string", "snobol-mode-get-branch-target", etc. The +same holds true for global variable names. + + You can also be reasonably certain that names constructed on the fly +(see "Program Development" below) with some degree of ludicrosity in their +names (e.g., "find-third-foo", "Johns-special-tsplp-hack", etc.) will not +conflict. + + One can test for a name being known in the Emacs environment via the +predicate "internedp" (not installed as of 8/16), which tests whether or not +a symbol with the given name is interned on the obarray. You must give it a +string. It will return t or nil for interned or not. From Emacs command +level, + + ESC-ESC internedp "test-string"CR + +will print out + + Value: t + +or + + Value: nil + +as appropriate. This test is not a foolproof method, though, because some +name which is not used now may be used later, as new versions of Multics +Emacs are developed. The rules given above will remain valid for all time. + + + M__o_d_e_s + + The major and minor mode mechanism of Multics Emacs, as it exists today, +is little more than a way for the user to switch in and out large sets of +key-bindings and column settings, and know about it via the mode line. + + The differentiation between major modes and minor modes is vague. The +current convention holds that a major mode involves a large body of optional +code (e.g., PL/I mode), sets up for a editing code written in a particular +language, or sets up a buffer for some highly specialized task where very +common keys (e.g., CR) do non-obvious things (e.g., the Message mode buffers +of the Emacs message facility). Minor modes generally involve the say that +whitespace or delimiters are interpreted, e.g., fill mode and speedtype mode. + + The current convention on major modes is that the major mode is set up by +a user-visible function called "XXX-mode", where XXX is the name of the mode. +This "mode function" establishes key-bindings (using set-key) as necessary, +and sets columns (e.g., fill-column, comment-column) and prefixes as +necessary. The mode function establishes the mode by setting the +per-buffer-variable "current-buffer-mode" to a _s_y_m_b_o_l whose name is +indicative of the mode. The name of the symbol will appear in the mode line +when the redisplay is invoked while in this buffer. The following function +sets up a major mode for editing FORTRAN programs: + +(defun fortran-mode () ;the mode function + (setq current-buffer-mode 'FORTRAN) ;symbol for mode + (setq fill-column 70.) ;set columns + (setq fill-prefix " ") ;six spaces on CR + (set-key 'CR 'fortran-new-line) ;set up CR key + (setq comment-column 1) + (setq comment-prefix "C ")) ;that begins cmts. + +The function fortran-new-line is assumed to be one which does something +appropriate, such as numbering cards. Note that the use of the function +set-key implies that this key binding (of the carriage-return key) is +local to this buffer, and will be reverted when this buffer is exited. + + Minor modes are less straightforward. Minor modes such as speedtype +and fill mode have different actions associated with the keys they affect +(for instance, all the "punctuation" keys), and the minor modes have to have +detailed and specialized interaction between themselves. There is no way to +generalize the interactions between the minor modes; no completely adequate +solution to this problem has been developed. + + Minor modes are asserted and turned off in a given buffer by calling the +functions "assert-minor-mode" and "negate-minor-mode" while in that buffer, +with an interned symbol which identifies that mode (and appears in the mode +line). There is a per-buffer variable called buffer-minor-modes which has a +value a Lisp list of all the symbols identifying the minor modes in effect +in this buffer. The Lisp predicate "memq" can be used to test whether a given +interned symbol is a member of a list, and thus, whether a given minor mode +is in effect n the current buffer: + + (memq 'fill buffer-minor-modes) + +will return the symbol "t" (truth to _i_f) if fill mode is in effect in this +buffer, otherwise it will return "nil" (false). Functions implementing the +actions of keys in minor modes should check in this way to see what other +minor modes are in effect, and what they ought do in that case. This is +admittedly not an easy design problem. + + The global variable fill-mode-delimiters is bound to a Lisp list of keys +that act as punctuation in many minor modes. By use of the Lisp function +"mapc", all punctuation can be set to trigger a given action. "mapc" takes +two arguments, a function, and a Lisp list: the function will be called upon +each element of the list: + +(defun no-punc-mode-word-on-a-line-mode-on () ;mode function + (mapc 'word-on-a-line-setter fill-mode-delimiters) ;set up keys + (assert-minor-mode 'word-on-a-line)) ;get in mode line + +(defun word-on-a-line-setter (key) ;key is the key + (set-key key 'word-on-a-line-responder)) ;set these keys + +(defun word-on-a-line-responder () ;key function + (delete-white-sides) ;get rid of whitesp + (self-insert) ;insert the typed character + (new-line)) ;start a new line. + +This set of functions (very crudely) establishes a minor mode in which +each word goes on a separate line as it is typed. + + C__h_a_r_a_c_t_e_r D__i_s_p_a_t_c_h_i_n_g + + + It is often very useful to make decisions based upon the +identity of the character to the right (or left) of the current point. The +Multics Emacs environment provides several special forms and functions for +facilitating this efficiently. All of these functions and forms accept +either of two ways of describing characters: either a single-character string +(e.g., "."), or a symbol whose name is that character (e.g., 'a, as it would +appear in a program). We will call the first kind the "string form", and the +second kind "character objects". + + The function "curchar", of no arguments, returns the character to the +right of the current point as a character object (this is done for reasons of +storage efficiency: character objects are unique, while strings require +allocation). You can test for two character objects being the same unique +object (or any two objects, in general) via the Lisp predicate "eq": + +(if (eq (curchar) 'a) + (display-error "We are looking at an ""a"".")) + +Note that we could have also done this with the "looking-at" predicate +described above, but for single characters, looking-at is a lot less efficent, +in both time and storage. + + Please note very carefully that you cannot use _e_q to test if two strings +have the same characters in them; Lisp strings are _n_o_t uniquized in the same +way that symbols are uniquized via the obarray. + + In order to facilitate the use of "messy" characters (tabs, linefeeds, +spaces, quotes, etc.) in this way, the Emacs environment provides several +global variables with values of the character objects for these "messy" +characters: + +ESC ASCII ESC, Ascii 033. +CRET ASCII Carriage return (Ascii 015) +NL ASCII Newline (linefeed), Ascii 012. +SPACE ASCII blank, Ascii 040. +TAB ASCII tab, Ascii 011. +BACKSPACE ASCII backspace, Ascii 010. +DOUBLEQUOTE ", Ascii 042. +SLASH /, Ascii 057, hard to type in Lisp code. + +Note that (eq (curchar) NL) is equivalent to (eolp). + + There is a special form to test if the current (to the right of point) +character is a given character: it is called if-at: + +(if-at "&" (display-error "You can't have an ampersand here!")) + +Its syntax is the same as _i_f, i.e., it has one or none or many "then" clauses +and "else" clauses, separated by the keyword "else" if there are any "else" +clauses. However, instead of a predicate, _i_f-__a_t takes either a +single-character string or a character object to be compared against the +current character. If the current (to right of point) character is that +character, the _t_h_e_n forms are evaluated, etc. _i_f-__a_t will convert the +character string to a character object at Lisp compile time, if necessary. +The specification of the character must be a form which evaluates to +the character of interest (e.g., "a", 'a, variable-bound-to-an-a): + +(if-at TAB (delete-char) + (whitespace-to-hpos next-field)) ;tab to next field. + + The exact effect (and actual implementation) of _i_f-__a_t is as though +it were a shorthand for + + (if (eq (curchar) ....) ..... ..... ..... ) + + There is similarly a function called "lefthand-char", which is like +_c_u_r_c_h_a_r except that it returns the character to the _l_e_f_t of the current +point; if the current point is at the beginning of the buffer, it returns +a character object for a newline (which is almost always what you want). +Similarly, there is an "if-back-at" special form, whose syntax and semantics +are identical to "if-at", except that it deals with the character to the +_l_e_f_t of the current point. + + Ther are two special forms for dispatching on the current (lefthand or +righthand) character. They are called dispatch-on-current-char +and dispatch-on-lefthand-char, and dispatch upon the character to the +_r_i_g_h_t and the _l_e_f_t of the current point respectively: + +(declare (special parentable)) ;global var. +(setq parentable nil) ;done when code is loaded into editor + +(defun count-parens-in-buffer () + (if (not parentable) ;if not initialized + (setq parentable (charscan-table "()"))) ;init it. + (let ((leftcount 0)(rightcount 0)) ;init the counts. + (save-excursion ;be nice + (go-to-beginning-of-buffer) + (do-forever + (if (not (search-charset-forward parentable)) ; look for ( or ). + (stop-doing)) ;exit the do. + (dispatch-on-current-char ;see which. + ( "(" (setq leftcount (+ 1 leftcount))) + ( ")" (setq rightcount (+ 1 rightcount)))))) + (minibuffer-print (decimal-rep leftcount) " opens, " + (decimal-rep rightcount) "closes."))) + +The general syntax of dispatch-on-current-char and dispatch-on-lefthand-char +is as follows: + +(dispatch-on-current-char + (CH1 + + ........... + ) + (CH2 + + ........... + ) +............................... + (CHk + + ........... + ) + (else + + ............ + )) + + The CHi's can be any form which evaluates to a single-character string +or to a character object. When the current character (left or right as +appropriate) matches a CHi, all of the 's in that clause are +evaluated sequentially, and the value of the last returned as the value +of the dispatch-on-current-char (nil is returned if there are no +'s). If no CHi's match, the else clause is evaluated as though it +were a matching clause. The else clause is optional; if omitted, and no +CHi matches, nil is returned. + + + P__r_o_g_r_a_m D__e_v_e_l_o_p_m_e_n_t + + The editor itself provides many powerful tools for developing extension +code and testing it while editing it. The following is a typical scenario +in the development of an extension: + + The user decides to write an extension. He sits down and thinks about +it, and decides to code it. He enters Multics Emacs. He does a +^X^Fshaver.lispCR, to go into a new buffer with a proper file name +and select Lisp major mode (assuming that he has, as all sophisticated users +should, opt for find-file-set-modes "on"). He should then type the form + + (%include e-macros) + +at the top of his file; this will be necessary to compile it (see +"Compilation" below), or to use the "loadit" command, as we will describe. +The file e-macros.incl.lisp should be in the translator search rules for +your process. A good way to to do this is put a link to it in the directory +in which you do Emacs extension development; the file is found in the same +directory as the editor. Now we begin to type in a function: + +(%include e-macros) + +(defun shave-line () + (go-to-beginning-of-line) + +At this point, to type the next line, lining it up with the last +Lisp form, we use the indent-to-lisp command, which is on ESC-CR +on Lisp mode, and the next form will automatically indent properly: + + (delete-white-space) + +(We deliberately gave the wrong name here). When typing in Lisp in general, +ESC-CR (in Lisp mode) will indent you on the next line the right amount. + + (go-to-end-of-line) + (delete-white-space) + +Now we are looking at the buffer with the code for "shave-line" in front of +us. We wish to try it. The best way to do this is to load the code in the +buffer into the editor. ESC-^Z in Lisp mode does this. No sooner do we do +this then we get the message: + + Unbalanced parentheses. + +What this means is that there were not enough close parentheses somewhere: +Emacs could not find the boundaries of the Lisp form. Now we fix the program +problem. We are on the last line, so we just type the close paren: + + (delete-white-space)) + +Now we do the ESC-^Z again. It works, the cursor returns to the function we +are trying to edit. Now to see if it works, we invoke it from Lisp: + + ESC-ESC shave-line CR + +ESC-ESC puts parens around what you type, evaluates it, and types out the +Lisp value so returned. However, we find the message + + lisp: undefined function: delete-white-space + +printed in the minibuffer, with the terminal bell rung. In fact, this is the +case. So we realize, that we must have the wrong function name. We know it's +on a key, so we + + ESC-X apropos white CR + +and learn about delete-white-sides. Now we go to the first line that +has the bad function name, with ^P's, do an @ to clear the line out, +ESC-^I to line up to re-type the form, and + + (delete-white-sides) + +We fix the other bad line, too. Now again we type + + ESC-ESC shave-line CR + +and to our surprise it says + + lisp: undefined function: delete-white-space + +as though we hadn't changed anything. Indeed, fixing it in the buffer is not +good enough. We must reload it into the editor environment, so we use +ESC-^Z again, after fixing the screen. Now we try it again: + + ESC-ESC shave-line CR + +and immediately our function on the screen changes appearance, all the +whitespace on the ends of the last line of the function we edited disappears. +Indeed it works, but it has messed up its own face! This is a problem with +editing what you are testing: It must either be innocuous, i.e., do +something harmless, or you must be prepared to reconstruct damage your +nascient function perpetrates, or switch to a test buffer before running it. + + So we fix our function, and we are done. Wrong! It exists in an editor +buffer, and in the editor Lisp environment, but we must remember to write it +out: + + ^X^S + +will indeed write it out to shaver.lisp as we had set up for initially. Now +we have an operative Lisp program that we can use again. If in a future +invocation of the editor, we need to use it, we can type + + ESC-X loadfile shaver.lisp CR + +and get it into the environment. There are two problems with this, however: + + 1) Whoever loadfile's it will have to have e-macros.incl.lisp in his + translator search rules + + 2) The code will be executed interpretively by the Lisp interpreter in + the Lisp subsystem; Multics Emacs is compiled Lisp, and compiled + Lisp runs up to 100 times fster than interpreted Lisp and has fewer + problems. + +The file shaver.lisp should be compiled. Then, the compiled object segment +can be loaded into the editor with + + ESC-Xloadfile shaver + + Some other problems are of immediate interest to the extension writer. +It is possible to write loops that do not terminate, or that generate infinite +garbage. This is par for the course. If you invoke your command, and the +cursor never leaves the minibuffer, and ^G seems to have no effect, you are +in a loop. Hit QUIT, and use the "pi" Multics command to reenter Emacs. +If you are really unfortunate, you will get + + lisp: (nointerrupt t) mode, cannot accept interrupt + +in which case you were stuck in the process of generating infinite garbage. +In this case, you must release, and your editing session is lost. If you are +more fortunate, you will get your screen back, with the cursor at the place +your buggy function left it. Often, by looking at exactly where it left it, +you can get a good idea of what kind of thing was giving your program a hard +time. + + If you get messages from Multics which tend to indicate that there is no +more room in your process directory, you are probably generating an infinite +number of lines, i.e., an infinite buffer. Again, if you are up to this, you +must be aware of this. + + Another thing that can happen is you might expose some bug, or what you +believe to be bug, in Multics Emacs, or worse yet, Multics Lisp. If this +happens, please let us know via the trouble-report forwarding mechanism +described in emacs.info, describing what you encountered and why you think +it's a bug. + + It is also possible to destroy the editor environment by bad coding. +This is particularly true in running compiled code which was not checked out +interpretively (i.e., via ESC-^Z). Storing into "nil" is one common way to do +this. If the entire editor seems broken, and the redisplay won't even show the +screen, this is what you have done. Quit and release and start all over again. + + There is a function called debug-e, callable as + + ESC-X debug-e CR + +which will set "(*rset t)" mode and other Lisp debugging aids, and unsnap all +"lisp links". IT will also revert to native Maclisp QUIT/pi handling. To use +this, however, you must be familiar with the debugging features of Multics +Maclisp. + + To get the value of a global variable to be printed out, say, +fill-column, fool ESC-ESC into doing it by saying + + ESC-ESC progn fill-column CR + +Be careful, for values typed out are in octal. + + Now there exists an entire Lisp code debugging facility within +Emacs over and above this; it is called LDEBUG, or Lisp Debug +mode. It allows for the setting of breakpoints, dialogue with Lisp +within Emacs, tracing, and so forth. See ldebug-mode.info, +or the appropriate part of CJ52, Emacs Extension Writer's Guide. + + C__o_m_p_i_l_a_t_i_o_n + + All production Multics Lisp programs are compiled. This results in a +tremendous performance improvement, both for the user and the system. Compiled +Lisp programs are executed directly by the Multics processor; interpreted +programs are interpreted by the Lisp interpreter. Multics Emacs is compiled +Lisp. + + The Lisp compiler is a Multics program that can be invoked from command +level. It has the names lcp and lisp_compiler on it. To compile a program +named myfuns.lisp, you say + + lcp myfuns + +to Multics, and you will get, if all goes well, an object program named +"myfuns", which can be loadfile'd, in the working directory. + + The compiler diagnoses Lisp syntax errors. It warns you of implied +special variables (if you did not declare a variable special, and it is not +a local variable in the function in which it was referenced, there is a good +chance you either made mistake or a typo. All global variables should be +declared for this reason: e-macros declares the provided ones.) + + At the end of compilation, the compiler prints out the names of functions +referenced in the code but not defined in the file. This is normal; however, +you should scan the list it prints out to see if any are ones that you +thought you defined; if so, you have a problem. Check also for ones that +are obvious typos for what you meant. + + It is possible to do extravagantly complex things with the compiler; +especially, via the constructs known as L__i_s_p M__a_c_r_o_s (via which, incidentally, +the E__m_a_c_s environment special forms are implemented) to construct your +own special forms. We will not go into any of that here. Consult other +documents on Multics Maclisp. + + It is sometimes desireable, while editing a large extension program, +to load only one function, the one you are looking dead at on the screen, +into the editor environment. The powerful function compile-function, +on ESC-^C in Lisp mode, will compile the function you are looking at +(whose start is found by ESC-^A from where you are now) out of a temporary +segment in the process directory, load the object segment, and display the +compiler diagnostics via local printout. It should be used with care by +any except experienced Emacs extension coders. Be careful, when using it, +to remember to write out your changes, and recompile your whole program, +because a program incrementally debugged in this mode gives the impression +that it is working properly when it is only doing so in the current editor +environment. + + + D__o_c_u_m_e_n_t_i_n_g C__o_m_m_a_n_d_s + + One of the most attractive features of the Emacs environment is the +automatic documentation system (apropos, ESC-?), which provides customized +Emacs command documentation on request. Documentation for supplied +commands is kept in a special file in the Emacs environment directory. +Extension writers may provide documentation for their own commands by +placing a string, which is that documentation, as the "documentation" +property of the symbol which is the command being documented. For instance, +if the symbol "remove-every-other-word" has the "documentation" property +of + + "Removes every other word from the sentence in which the cursor appears." + +this information will be displayed by ESC-? when used on some key which had +been set-key'ed to remove-every-other-word, or by + + ESC-X describe remove-every-other-word + + Documentation properties are assigned most conveniently via the +Lisp special form "defprop", whose general syntax is: + + (defprop SYMBOL WHAT PROPERTY) + +which gives the symbol SYMBOL a PROPERTY property of WHAT. "defprop" +is a special form because the actual symbols appearing in the form +are used, they are not variables, as in "(+ a b c)". Thus, + + (defprop Joe Fred father) + +indeed gives the symbol "Joe" a "father" property of "Fred". +("defprop" is a special-form way of doing the same thing as the +"putprop" function, but it is a special form because is "arguments" +are NOT forms to be evaluated to produce symbols whose properties +are to be dealt with, but the symbols themselves). To use +"defprop" to establish Emacs command documentation, place forms like + +(defprop remove-every-other-word + "Removes every other word from the current sentence. +Will not work on sentences ending in ""?"". For indented +sentences, use $$remove-other-word-from-indented-sentences$. +$$$ is a very powerful, dangerous, command." + documentation) + +Note several things about the documentation string: + + 1. It does not need to end in a newline, and may contain newlines. + + 2. Quotes (") inside of it must be doubled. + + 3. The string "$$$" will be replaced by the key being asked about + (e.g., "ESC-^Z" or "ESC-X remove-every-other-word") at the time + the documentation is displayed. + + 4. The keys used to invoke other commands may be referenced by stating two + dollar signs, the name of the command, and one dollar sign. Thus, + $$go-to-end-of-line$ will appear as "^E" in most environments; the point + of this and the previous paragraph is to make documentation expansion + independent of a user's key-bindings. + +The entire documentation string will be "filled" (ESC-Q'ed) _a_f_t_e_r all +command-name substitutions are made; thus, the placement of newlines in the +documentation string is basically ignored. Two consecutive newlines, however, +will be preserved, and thus, lines may be set off for "examples", etc., by +surrounding them with blank lines. + + It is slightly more efficient, but clearly less readable, to place the +defprop's documenting a command _b_e_f_o_r_e the "defun" defining the command +itself. The "defcom" facility may also be used to document commands; +See "Defining commands with defcom" below. + + W__i_n_d_o_w M__a_n_a_g_e_m_e_n_t + + Although buffers appear in windows on user request, and are switched +between automatically by the redisplay when the user switches windows with the +^X^O, ^X4, and so forth, there are times when extension writers may +want to take advantage of multiple windows explicitly. Good +examples in supplied code are RMAIL reply mode and comout (^X^E). + + Most of the extensions of interest are ones in which the extension +writer wants to place some information in a buffer, or else prepare +some buffer to have information placed in it (e.g., RMAIL reply) +and then display that information in a window. Normally, all that +is required is to "go to" that buffer (e.g., with go-to-buffer or +go-to-or-create-buffer), and the redisplay will "find" the editor +in that buffer at the time of the next redisplay, and it will +replace the contents of the selected window on the screen. +We will call such commands "autophanic" (self-showing). Examples +are ^XB (select-buffer), ^X^F (find-file), etc. + + However, there are commands that wish to set up buffers in some +_o_t_h_e_r window than the current window, usually for multi-window +operations such as mail reply, so as not to disturb the contents +of the current window. We will call them "heterophanic" (other-showing). +The standard examples are dired-examine, mail reply, and comout (^X^E). +Note that all the examples given are sub-commands of larger, +autophanic commands. + + Heterophanic buffer behavior is provided by the function +find-buffer-in-window, whose purpose is mentioned in windows.info (CH27 Sec. +XVI). It takes as an argument a buffer-symbol (Lisp symbol representing a +buffer). That buffer will be created if it does not now exist, and will be +"gone to", as if go-to-buffer had been used. If Emacs is in single-window +mode, the effect will be the same as that of go-to-or-create-buffer. In +two-window mode, that buffer will be put on display in one window or some +other as follows: + + If it is already on display in some window, it will be left there. + If it is _n_o_t, it will be put on display in some _o_t_h_e_r window, + meaning the one in which the cursor is _n_o_t, and the cursor + will move to that window, as if a ^X^O had been done. The + least-recently used window will be chosen. + + Thus, on printing terminals and in single-window mode, the effect +of find-buffer-in-window is indistinguishable from that of +go-to-or-create-buffer. In multi-window mode, it is equivalent to +"go-to-or-create-buffer and show it someplace else on the screen." + + You must not use find-buffer-in-window to place a buffer on the +screen once you have already gone to it; if you think of +find-buffer-in-window as a fancy kind of go-to-or-create-buffer you +will find no need for doing so. IF, however, you encounter this very +rare need (Emacs uses it only once!), how to do it will be +described below. + + It is an extension's responsibility to establish multiple windows if it +_n_e_e_d_s them; no current Emacs code _r_e_q_u_i_r_e_s multiple windows, although the +facilities mentioned above are more utile when already in it. + + Variables, predicates, and other functions to determine or +effect the window organization (number of windows present, etc.) +are presented below. + + Most extensions that place an auxiliary buffer on display via +find-buffer-in-window provide some command to return to the "main" +buffer (e.g., the RMAIL Incoming Message buffer, the buffer from which +^X^E was issued, etc.). It is the case that if you entered a buffer +via find-buffer-in-window, you should probably return to the buffer +from whence you came via find-buffer-in-window as well; the effect of this +is to restore not only the original buffer, but the original window +as well. Thus, save-excursion-buffer _c_a_n_n_o_t be used effectively +to effect returns from trips into buffers entered via find-buffer-in-window; +an attempt to use save-excursion-buffer will result in both windows showing +the same buffer, as the "selected window" (i.e., the cursor-bearing window) +is now changed and a new buffer selection means a new buffer in that window. + + It is the intended standard that ^X^Q be used to exit auxiliary buffers +used by extensions to return to their "main buffer", and usually switch +windows as well, if the multiple-window strategy outlined above is used. + + Pop-up window mode is in essence making all commands heterophanic. +Commands or subcommands that are naturally heterophanic need not worry about +pop-up window mode, because find-buffer-in-window, takes the appropriate +action in either pop-up or non-pop-up mode. However, if proper heterophanic +behavior under pop-up windows is desired, naturally autophanic commands and +subcommands must call a window-management primitive to obtain +heterophanic behavior in pop-up window mode. The primitive +of interest is called select-buffer-window, which takes two arguments +a buffer-symbol, and a "key" which gives pop-up window management +some clue to what size window would be wanted if awindow had to be created. + + In non-pop-up window mode, select-buffer-window is equivalent to +go-to-or-create-buffer, and the key is ignored. In pop-up mode, it is +equivalent to find-buffer-in-window, with the key suggesting the +new window size. + + The following values for the key argument to select-buffer-window +are accepted. They specify the window size in pop-up mode if the +window does not exist already: + + any number That many lines. + 'cursize Make a choice based on + the current number of lines in + the buffer. + nil Choose some reasonable fraction + of the screen. + 'cursize-not-empty Same as nil if the buffer is empty + but same as 'cursize if it's not> + For example, ^X^F uses this, because + you will type into a new buffer. + 'default-cursize If this buffer has never been displayed + before, make some decision based on the + number of lines. Otherwise, use + what size was chosen last time.. + + As we mentioned, find-buffer-in-window may not be used to place +the "current buffer" heterophanically. If you attempt to do this, i.e., + + (find-buffer-in-window current-buffer) + +you will find it appearing in both the old and new windows, for the +window manager will find that you were in this buffer in the +current window (a truth) before you went to another one (you had +to go to another one, as per heterophanic behavior), and +will indicate that the current buffer is to be displayed in the old window +as well, for that was the last buffer you were in in that window. +To avoid this, use select-buffer-find-window (of two arguments, +the buffer and a key as for select-buffer-window) if heterophanic +display of the current buffer is needed, i.e., + + (select-buffer-find-window current-buffer nil) + +It is very rare that this is needed; it is very rare to go to a buffer +and then want to find-buffer-in-window it; in supplied Emacs, only +^X^E does this. + + As all things that would want to use these features are of necessity +moderately sophisticated, only an outline of an extension using them +is given here. It is a typical sub-subsystem (e.g., dired) which +sets itself up in an autophanic buffer display, with specific +key bindings, etc., and has a heterophanic sub-display by which +it displays a "menu" in addition to the main display: + +(defun unusual-mode () ;Setup function for this + ........... ;mode. + (go-to-or-create-buffer (maknam (explodec "Unusual buffer"))) + (set-key 'ESC-^S 'unusual-mode-show-menu) + (select-buffer-window current-buffer nil) + (register-local-var 'unusual-mode-buffer-to-return-to) + ...........) + + ............ +(declare (special unusual-mode-buffer-to-return-to)) ;for compiler. +(defun unusual-mode-show menu () + (setq unusual-mode-buffer-to-return-to current-buffer) ;save buff + (find-buffer-in-window 'Unusual-Menu) ;Display menu + (set-key 'r 'unusual-mode-select-item) ;Set key bindings + (set-key '^X^Q 'unusual-mode-menu-return) + (insert-string "Unusual menu delicacies") ;Fill it up + ;; Will not actually be displayed until command finishes. + ....... + (go-to-beginning-of-buffer) + (setq current-buffer-mode 'Unusual/ Menu buffer-modified-flag nil + read-only-flag t) + .........) + +(defun unusual-mode-menu-return () + (find-buffer-in-window unusual-mode-buffer-to-return-to)) + ;;Return to calling buffer. + + There are several more primitives the window-sensitive +extension writer should be aware of. They deal with windows by "window +number". The topmost window on the screen is window number 1; The +next one down, if any, is number 2, and so forth down (the minibuffer and +mode line do not count as windows in this consideration). The concept +of selected-window (and selection of windows) is as in windows.info +(or CH27, Section XVI.) + + selected-window + This _v_a_r_i_a_b_l_e contains the number of the currently + selected window. Do _n_o_t attempt to setq it to select a window; + Use select-window instead. + + nuwindows + This _v_a_r_i_a_b_l_e contains the number of windows on the + screen; do _n_o_t attempt to setq it to create or delete + windows; use delete-window and the ^X2 and ^X3 functions + to do these things. + + select-window + This _f_u_n_c_t_i_o_n (of one argument, a window number) + does what ^X4 does (with an argument), i.e., selects that + window. + + delete-window + This _f_u_n_c_t_i_o_n of one argument, a window number, + removes that window from the screen, dividing up its space + to adjacent windows. + + buffer-on-display-in-window + This _p_r_e_d_i_c_a_t_e function of one argument, a buffer-symbol, + and returns truth/falsity, truth if and only if the specified + buffer is on display in some window currently on the screen. + If used as a _f_u_n_c_t_i_o_n, i.e., the value returned + is inspected, it will be found to be the window number in which + the specified buffer is on display (if it is _n_o_t on display, the + symbol "nil", via which Lisp represents falsity, is returned). + + window-info + This is a function of one argument, a window number, which + returns information about that window. The information + is in the form of a piece of Lisp list structure, which may be + decomposed by the Lisp list destructuring functions; assuming + that "info" has the result of window-info, the following forms + return the information as follows: + + (caar info) => The top line-number on the screen of the + window. The topmost is #0. + (cdar info) => The number of lines in the window. + (caddr info) => The buffer-symbol of the buffer on + display in the window. + (cadddr info) => A string duplicating the contents of the + "cursor line" of the window, including + its new-line character. The cursor + line of a buffer is that line where the + cursor is (if it is in the selected + window) or would be if that window + became selected (e.g., ^XO). + + window-adjust-upper + A function of two arguments, the first a window number, and + the second a _s_i_g_n_e_d number of lines to move its + upper divider-line _d_o_w_n (negative is up). + + window-adjust-lower + Same as window-adjust-upper, but deals with lower divider line. + + W__r_i_t_i_n_g S__e_a_r_c_h_e_s + + There are several useful functions provided for the extension writer +to aid in providing search-type commands. These functions prompt +for the search string, defaultify the search string, and announce +search failure in a standardized way which causes all Emacs search +commands to behave in a uniform fashion. All supplied Emacs searches +use them. + + get-search-string + Takes one argument, the prompt. The prompt ought contain + the word "search" somehwere, so that the user might know + that a search is being prompted for. get-search-string will + prompt the user for a search string, which the user must + terminate with a CR, and return it as a string. + If the user gives a null string, the last search string + will be used and echoed. The last search string will be set + to the returned string for the next defaulting. + + search-failure-annunciator + Causes the "Search Fails." message to appear in the minibuffer, + and a command-quit (^G) to be performed. Note that this will + abort any keyboard macro collection or execution in progress. + + The writer of a search-type command should provide two interfaces, +a "command", which deals in calling the above two primitives, and a +"search primitive", also called by the "command". The search primitive +should return t (truth) if the search succeeds, leaving "point" +at the proper place as the search defines. If the search fails, +the primitive must return nil (falsity), and leave point where it +was when the primitive was invoked. + + Here is a simple implementation of a "wraparound search", like +the default search in the QEDX editor. It first looks from point to +the end of the buffer for the search string, and if that fails, it goes +to the top and searches again. It is not optimal because the it need not +scan farther than the original point when starting from the top. Using +"point>markp" and searching a line at a time would be very expensive, +due to point>markp's expense. Searching a line at a time using +forward-search-in-line an mark-on-current-linep would be acceptable, but +more complex than this example need be. For a search which is probably +going to be used only as a user interface (i.e., not internally), this +implementation is probably adequately efficient. + + Here is the internal primitive for wraparound search: + + (defun wraparound-search-primitive (string) + (with-mark m ;Remember starting point + (if (forward-search string) ;Look to end of buffer + t ;Return truth. + else + (go-to-beginning-of-buffer) + (if (forward-search string) ;Look from top. + t + else + (go-to-mark m) ;Return to orig. place. + nil))))) ;Return falsity + ;; with-mark and this function, will + ;; return the value of the outer "if". + + Now here is the command for calling the primitive: + + (defun wraparound-search () + (if (not (wraparound-search-primitive + (get-search-string "Wraparound Search: "))) + (search-failure-annunciator))) + + wraparound-search is the command to which some key should be bound +if this type of search is to be made available from the keyboard. + + + C__a_l_l_i_n_g M__u_l_t_i_c_s C__o_m_m_a_n_d_s + + There is a common need in extensions, especially those like DIRED, +which manipulate the Multics Environment, to call Multics commands, +or, more generally, execute Multics command lines. + + The issue of calling PL/I-coded subroutines is a separable one. The +Lisp defpl1 facility is used for that, and we have not documented this yet. +See extant extensions (and e_defpl1_.lisp) for examples and usage until then. + + There are two primitives provided for executing Multics command lines. +Multics command lines are strings submitted to cu_$cp for execution. +This is the Multics agency to which the "e" requests of EDM and QEDX, +the ".." requests of read_mail, send_mail, and debug, and other subsystems +submit command lines. These are they: + + e_cline_ + Takes one argument, a string, which is passed to cu_$cp for + execution. No reattachment of output takes place. If the + command line produces output, it will mess up the screen. + This should only be used when no output is anticipated, and + indeed should be used then in preference to comout-get-output, + as it is much faster. + + comout-get-output + Takes any number of arguments, which may be strings or symbols, + and catenates them with one space between them to form a + Multics command line (facilitating things like + + (comout-get-output 'dl this-seg '-bf) + + ). Reattaches user_output and error_output during the + execution, rerouting them to a process directory file. When + the command execution completes, the contents of the current + buffer is obliterated (!) and the temporary file read in to it. + This is the primitive that Comout (^X^E) uses. e_cline_ + is used by comout-get-output internally. + + These primitives set up a condition handler that catches all "abnormal" +Multics signals and returns. A very major deficiency at this point, which is +not likely to be remedied in the near future, is that requests for input by +these command lines cannot be dealt with reasonably at all. In the case of +e_cline_, the user will get the query in raw teletype modes, and will have to +answer it in raw, nonedited teletype modes. In the case of comout-get-output, +the query will never appear in any form at all, having been routed to the +temporary segment, and the user's process will hang infinitely, the user +not knowing to respond having never seen the query. + + M__u_l_t_i_c_s E__r_r_o_r T__a_b_l_e + + Sometimes it is necessary to get the value of standaard Multics error +codes, from error_table_, into a program, to be able to see if a given +Multics interface has in fact returned it. The function "error_table_" +(spelled the usual way with underscores, not hyphens) is used for this +purpose. Its single argument is a symbol, whose name is the name +of the error_table_ entry whose value is sought, and the returned +result is that value, or 1 if it is not a valid entry. + + The error_table_ function optimizes finding the same name over +and over again, so the extension writer need not go through machinations +to "save" an error_table_ value computed by these means. +Here is an example of the use of error_table_: + + (let ((status-result (hcs_$get_user_effmode dir entry ""))) + (if (not (= (cadr status-result) 0) ;the return code + (if (= (cadr status-result)(error_table_ 'incorrect_access)) + (display-error-noabort "Warning: not checking access") + else + (display-com-error (cadr status-result) dir ">" entry)))) + + + Defining commands with defcom + _____________________________ + + The "Defcom" (short for _d_e_f_i_n_e-_c_o_m_m_a_n_d) facility is a fairly new addition +to Emacs (and thus many internal functions are not converted to use it) for +simplifying the definition of Lisp functions to be used as Emacs commands, +either keystroke requests, or extended commands. Defcom cooperates +with the Emacs command-reader to provide prompting and defaulting +of unspecified arguments, range-checking of numeric arguments, +automatic repetition for numeric arguments, if desired, cross-connecting +symmetrical functions via negative arguments, and other features. + + Defcom should only be used for defining functions actually to +be used as Emacs commands; internal and auxiliary +functions to be used by these functions should still be defined with +defun. Emacs commands defined with defun will continue to work, but +those defined with defcom produce much better diagnostics and +offer more features. Defcom is actually a technique whereby +the necessary "defun"'s are generated automatically, so functions +defined with defcom may be called from other functions, as well. + + To define a function with defcom, one uses defcom instead of defun, +and supplies no Lisp argument list, i.e., + + (defcom one-word-from-beginning + (go-to-beginning-of-buffer) + (forward-word)) + +This is the simplest form of defcom; optional features are supplied by +placing, between the function name and the function code, various keywords, +all of which begin with the "&" character, and some of which take optional +arguments, expressed as lists. + + The most common optional specification is &numeric-argument, +(or &na for short), which specifies what to do with a supplied numeric +argument, if any. The keyword &numeric-argument must be followed by +a list of specifications, which must include one of the following +maJor processing types: + + &reject Any numeric argument is rejected as invalid. + Clearly, no other specifications are valid + in this case. This is the default if + &numeric-argument is not given. + &ignore A numeric argument is ignored. + &repeat If the argument is positive, the + command is repeated that many times. + &pass The value of the Lisp variable "numarg" + is set, as in non-defcom commands. + + In addition to the major processing type, optional bounds may +be specified by the keywords &upper-bound (&ub) or &lower-bound (&lb). +These, in turn, must be followed by either an integer being the bound, or the +keyword &eval followed by an expression to evaluate at the time command +execution is attempted, which will then produce a value (such an expression +will be called an "&eval expression".) Here are some examples of +&numeric-argument specifications: + + &numeric-argument (&pass) + &numeric-argument + (&repeat &lower-bound 1 &upper-bound &eval (+ max-foos 2)) + &numeric-argument + (&pass &upper-bound 15.) + + A command defined with defcom may elect to receive Lisp arguments, +that is to say, values which are to be prompted for or supplied as +extended command arguments can be provided automatically, and prompted +for, by the Emacs command reader, and supplied as Lisp arguments to the +command function. Instead of a normal Lisp argument list, the +keyword &arguments (or &args or &a), followed by list of argument +specifications, one for each Lisp argument to be supplied. + + Each argument specification consists of the Lisp name of the argument, +i.e., the name of the variable which will be referred to inside the function, +and any number of "argument qualifiers", separated by spaces. Each +argument qualifier may consist of several tokens, as necessary. Argument +qualifiers specify the prompts, defaults, etc. for an argument. +An argument specification may also be given as the name of the variable +alone, as opposed ot a list of it and qualifiers. In this case, +it is equivalent to having its own name as a prompt for its value. + + When a defcom-defined commands is invoked as an extended command, +(i.e., via ESC-X), the Emacs command reader will check the type and +number of command arguments supplied and necessary, and prompt for those not +supplied or default them as specified. When a defcom-defined +command which has arguments is invoked from a key, it is as if +it were invoked as an extended command with no command arguments given, +and all are either prompted for or defaulted. + + Here are the valid argument qualifiers: + + &string + &symbol + &integer Specify how the argument, when read + by ESC-X or prompted for is to be converted + before being passed. Only one at a time + of these are valid in a given argument + specification, and &string (i.e., no + conversion) is the default. + + &default Must be followed by either a string, + symbol, or integer, as consistent with + the expected data type for this argument, + or an &eval expression. Specifies the + default value to be used if this argument + is not supplied, or a null response + is given to a prompt for this argument, + if any. + + &prompt Specifies the prompt for this argument, if + not supplied via ESC-X. Prompts will be + put to the user before defaults are evaluated + or used; A null string causes the &default + value to be used. &prompt is followed by + a prompt string (in quotes)(or an &eval + expression), and one of the two optional keywords + NL or ESC, specifying the prompt terminator + (ESC is obsolete, use NL in all cases). + If neither NL or ESC is given, + NL is assumed as the default. + + &rest-as-list Valid only for the last argument. Causes + this variable to be given as a value a + list of all of the remaining supplied + arguments, however many they may be. If + &rest-as-list is used, the caller of this + function from Lisp (including start-up's written + by possibly not-Lisp-conscious users) + must know that the number and organization + of Lisp arguments is therefore different + from the apparent argument array given to + ESC-X. + + &rest-as-string Valid only for the last argument, causes + all remaining arguments to be supplied as + a single string to the function, a single + argument, as they appeaed to ESC-X, with + spaces and so forth included. Same cautions + as &rest-as-list apply. + + Here is a function definition which accepts three arguments: + +(defcom replace-n-times + &arguments + ((oldstring &string &default &eval (get-search-string "Old: ")) + (newstring &string &prompt "New String: " NL) + (count &integer &prompt "How many times? " NL &default 1)) + + (do-times count + (if (not (forward-search oldstring))(search-failure-annunciator)) + (do-times (stringlength oldstring)(rubout-char)) + (insert-string newstring))) + +Note that it can be invoked as + + ESC-X replace-n-times Washington Lincoln 2 CR + +or + + ESC-X replace-n-times CR + +in which case all arguments will be prompted for, or + + set-perm-key ^Z9 replace-n-times + +followed by striking that key at some time, will prompt for +all arguments, too. This function is so defined that it may +be called from Lisp as + + (replace-n-times "this" "that" 17) + +or whatever, i.e., it is a Lisp function of three arguments. + + When defcom-defined commands are re-invoked by ^C, they are +repeated with identical arguments. This is what makes search-repetition +by ^C work. + + Other than numeric arguments and command arguments, defcom +may be used to spceify prologues, documentation, and negative-functions +of command functions. Documentation is specified by the +keyword &documentation (or &doc) followed by a documentation +string subject to the same rules as given above under "Documenting +Commands". Prologues are functions or code to be executed +before any arguments are prompted for, perhaps to check for legal +circumstances for calling this command. Negative functions are +functions or code to be executed if the command is supplied a negative +numeric argument: the negative function is given the negative numeric +argument made positive. Prologues and negative functions are +speicifed by the keywords &prologue, or &negative-function +(short, &nf), followed by the name of the appropriate function, +or forms, terminated by &end-code. Here is an example of the +use of some of these features: + +(defcom forward-topic + &doc "Goes forward one or more topics. See also $$backward-topic$." + &numeric-argument (&repeat) + &negative-function backward-topic + (with-mark m + (forward-search "Topic::"............ + + + +Yet to be documented: + +Lisp macro catalogue. +Emacs interrupt system. + + + As this document is extended and augmented, it may not approach true +"completion" in any given length of time. Thus, there are still "tricks" +and functions that are not documented above. The extension writer should +study the supplied extensions, such as Fortran Mode (fortran-mode.lisp) +and RMAIL (rmail.lisp), as well as the "fundamental mode extensions" +in e_macops_.lisp. These programs are found in the Emacs source archive. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fortran-mode.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fortran-mode.info new file mode 100644 index 0000000..898312f --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fortran-mode.info @@ -0,0 +1,193 @@ +01/31/79 Multics EMACS Fortran mode. Paul Schauble + DVCP M.S. C34 + 602-866-4531 + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + This is the second edition of EMACS Fortran mode. This +mode is intended to aid in the construction and debugging of +Fortran programs using EMACS. Commands are provided for +producing comment and continuation cards and for other commonly +used formatting operations. + + Fortran major mode is entered via the following command: + + ESC-X fortran-mode CR + + This mode may also be entered by Find File'ing any file +with a last component name of ".fortran" when the +find-file-set-modes option is selected. + + The current list of special commands in Fortran mode is: + +CR Carriage Return has been changed so that the cursor will + return to column 7, rather than to column 1. This will + also insert comment prefixes ("c ") in the appropriate + places. If desired, the cursor may be moved back by hand + to delete spaces or comment prefixes. + +^I Tab has been changed so that a tab done in column 1 will + tab to column 7. Subsequent tabs will tab to the normal + places. The sequence for successive tabs is 7,10,20,30... + +ESC-^M Or ESC-CR ends the current line when the next line is a + continuation. A new line will be done, unless the current + line is blank or empty, and the prefix " & " will be + inserted, leaving the cursor in column 9. This is the + continuation for standard Fortran rather than for + Multics. + +ESC-; Begins a single comment line. A new line is done, unless + the current line is blank or empty, and the prefix + "c " inserted, leaving the cursor in column 7. This + may be used to end a line when the next line is a comment. + +^XC Begins a block of comments. The current line, if any, will + be ended and a comment block header line inserted. Any + future lines added will be prefixed by the standard + comment prefix "c ". This minor mode is exited by a + second ^XC. Notice that ^X^C exits the editor. Don't miss! + +ESC-: Positions a fortran label. Since a line usually starts in + column 7, this command is provided to correctly position + statement numbers. Type the statement number, then ESC-: + to place the label in column 1. + +ESC-^C Compile program. The current buffer, if changed, is written + out to its default pathname (as for ^X^S), and then + compiled. Compiler diagnostics are displayed, in the other + window if in two-window mode. The extended commands + set-compiler and set-compile-options may be used to select + the compiler and options to be used. + +^X^D Find next error. This command is used following a + compilation in two-window mode. It scans the compiler output + and the source buffer in parallel, pointing a simulated + cursor to consecutive errors and placing the real cursor on + the line referred to in the error message. This mode will + terminate itself when you advance past the last error, when + you do another compilation, or when you exit it by keying + ^XT. Since this mode locks the buffer used for + compilations, you are strongly advised to exit it when you + are finished. + +' Abbreviation expander. The two characters immediately + preceeding the cursor when this character is struck + are taken as an abbreviation and expanded. The + character ' may itself be inserted by quoting it with + \ or ^Q. These abbreviations are initially supplied: + in integer su subroutine + di dimension co continue + fu function re return + eq equivalence ex external + au automatic cn common + fo format im implicit + Note that, with the exception of cn for common, all of + these abbreviations are the first two characters of + the word. Other abbreviations may be defined using the + extended command set-fortran-abbrev. + The abbreviations co (continue) and re (return) are very + special. Since these words almost always have a label + and sit on a line by themselves, these abbreviations have + been hacked to do an ESC-: and a new-line, so that + typing (in column 7) + 123co' + will expand to + 123 continue + leaving you on the next line. The abbrev fo for format + hacks labels, but not new lines. Try them. + + In addition, several extended commands have been provided to set +various parameters. These are: + +For comment blocks: +ESC-X fortran-set-begin-comment CR to set the begin line, and +ESC-X fortran-set-end-comment CR to set the end line. + + Both of these commands prompt for the line in the minibuffer. +The line supplied is inserted exactly as given, and must therefore +include the "c" at the beginning. Default values for these lines are + "c ========================================". +These are set by buffer. + +For compilations: + ESC-X set-compiler compiler-name CR + to set the compiler to be used. Default is "ft". + ESC-X set-compile-options options CR + to set compile options. These are given as on the + compiler command. The default is "-tb". These are + set by buffer. + +And, for abbreviations, + ESC-X set-fortran-abbrev abbrev expansion label eol + may be used to define new abbreviations. abbrev must + be a two character abbreviation that will be replaced + with expansion. Arguments must be enclosed in quotes + if they contain special characters, including spaces. + The optional arguments label and eol will cause this + abbrev to hack labels and new lines, respectively, just + like co and re. The label option does not require a + label, but processes it if it is present. + Abbreviations are defined globaly and apply to all + buffers in fortran mode. For example, + ESC-X set-fortran-abbrev as "common /xyz/ y(100)" eol + defines an abbrev as that expands to + common /xyz/ y(100) + and does a new-line, but does not believe in labels. + + + As mentioned above, this is an early edition and there may +still be problems. Any difficulties, comments, suggestions, etc. +may be mailed to Schauble.fso (on System M, Phoenix) for action. +(MIT-Multics and other ARPANET users continue to send bug/comment +mail to emacs.bugs at MIT-Multics as usual, they will be forwarded). +In fact, I would like to know if anyone is using this thing. + + Intended for future implementation are: + +Debugging mode - Fortran debugging using probe integrated with + the editor. For now, the recommended debugging method + is to do a ^Z and run your program one level up. + Return to emacs with a pi command. + + + Any suggestions on these or other features should be mailed to +the above address. + + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fundamental-mode.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fundamental-mode.info new file mode 100644 index 0000000..e15faa0 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/fundamental-mode.info @@ -0,0 +1,1416 @@ +Multics Emacs Commands (Fundamental mode) 7/22/90 + + K__e_y_s _a_n_d _t_h_e_i_r _b_i_n_d_i_n_g_s + (Extended (esc-X) commands are listed at the end.) + +# rubout-char + + Deletes the previous character (before the cursor, which is usually the + last character typed, like in normal Multics.) Note that # deletes the + character to the left of the cursor, while ^D deletes the character at the + cursor. + +@ kill-to-beginning-of-line + + Kills all the text on the current line to the left of the cursor. The text + killed is saved on the kill ring, and may be retrieved with ^Y. + +CR new-line + + Inserts a newline character into the buffer at the current point, ending + the current line, and starting a new one. If entered in the middle of a + line, breaks the line at the current point. If the next line is empty, + i.e., was made by a single CR or ^O, CR will just go to it, and will not + insert a newline. However, the last empty line before a non-empty line + will be left empty. If there is a fill prefix (see ^X.), CR will insert it + after any newline character it inserts. + +ESC escape + + Used to enter two-keystroke key sequences, and to supply numeric arguments + to commands. For example, to enter the esc-K command, type ESC then a K. + To supply a numeric argument to a command, type ESC, the number, and the + command. For example, ESC 3 ^D deletes 3 characters. + +\ escape-char + + \NNN where NNN are 1 to 3 octal digits, inserts the character whose value + is NNN into the buffer. For example, \14 inserts a form-feed (^L). \\ + inserts a \; \# inserts a #; \@ inserts a @. \ followed by any other + character inserts \ and that character (except \ CR, which inserts a + newline). + +\177 rubout-char + + Deletes the previous character (before the cursor, which is usually the + last character typed, like in normal Multics.) Note that \177 deletes the + character to the left of the cursor, while ^D deletes the character at the + cursor. + +^@ set-or-pop-the-mark + + With no argument, i.e., ^@, sets the-mark in this buffer where the cursor + is now, and leaves it there. The current value of the-mark, if any, and + different than the current point, will be pushed on the mark ring. It will + move around properly if the text around the-mark is deleted. See ^X^X to + verify where the-mark is. With an argument, i.e., ^U ^@, pops a mark off + the mark ring, and positions to it. Successive ^U ^@'s will "try" all + marks on the mark ring. + +^A go-to-beginning-of-line + + Position to the beginning of the current line of the buffer. That is to + say, right before the first character. + +^B backward-char + + Move backward one character in the buffer. Tabs, and the newline + characters at the ends of lines count as one character. Will command-quit + at the beginning of the buffer. + +^C re-execute-command + + Re-execute the last keystroke (command), other than ^J or ^C. If used to + repeat a search, the search will be repeated with the same search string. + Useful for skipping successive words, etc. + +^D delete-char + + Delete the character to the right of the current point. This is the + character on which the cursor sits. Move the rest of the line one to the + right, closing up the space. Deleting a newline at the end of a line + merges lines. + +^E go-to-end-of-line + + Position to the end of the current line: that is, after the last character + and before the linefeed. On an empty line, this is the same as the + beginning of the line. + +^F forward-char + + Move forward one character. Tabs and newlines count as one character each. + Will command-quit at the end of the buffer. + +^G command-prompt-abort + + Quit out of the current minibuffer prompt if any, and ring the bell (or + beep). May be used to exit a minibuffer you did not intend to get into, or + just to tell when Emacs has "caught up." + +^J noop + + Linefeed; ignored. See also ^L. Good for exiting displays (such as ^X^B, + apropos, etc.) + + +^K kill-lines + + Kill to end of line, except when already at end of line, delete the + linefeed (merge lines). If on an empty line, delete it. If given a + numeric argument, deletes that many lines, starting from the current point + on the current line. + +^L redisplay-command + + Clear the screen, and display the current window of the current buffer, + centered about the current line. Useful if your screen is messed up by + messages (although see accept-msgs), non-Emacs output, etc. With a numeric + argument, moves current line to that line from the top of screen; ESC-1 ^L + moves current line to top, for example. With a negative argument, a line + counting from the bottom of the screen will be used. + +^N next-line-command + + Position to the next line of the buffer. If on the last line now, append a + new empty line to the bottom of the buffer, and position to the beginning + (and end) of it. Successive ^N's and ^P's try to maintain the same + horizontal position. + +^O open-space + + Open up space by putting a newline AHEAD of the current point. Pushes all + lines of the buffer below the current line down one. For instance, ^U^U^O + will open up 16 lines. See ^X^O to remove (extra) blank lines. + +^P prev-line-command + + Move to previous line of the buffer. Will command-quit if on first line of + the buffer. Attempt to maintain the same horizontal position. Successive + ^P's and ^N's will try to maintain the original horizontal position. + +^Q quote-char + + "Quote" the next character, i.e., insert it into the buffer literally. + This is used to enter control characters and other "funny" characters into + the buffer, i.e., ^Q# to insert a pound sign. ^Q CR, however, inserts a + single Newline chaacter (Newline characters separate lines in Multics + files.) + +^R reverse-string-search + + Reverse search. Leave cursor positioned before matching string, don't move + cursor if not found. Prompts for search string in minibuffer, which must + be ended with CR. + +^S string-search + + Search for a character string, from current point in buffer to end. + Prompts for string in minibuffer, and leaves point, if search succeeds, + after the matched string. End search string with CR. ^SCR re-uses last + search string. If search fails, point will not move. + +^T twiddle-chars + + Twiddle (transpose, interchange) the last two characters typed, like, I + like Mutl^Tics becua^Tse... etc. + + +^U multiplier + + Multiplier. When not followed by a number, multiplies the next command by + 4 for each use. i.e., ^U^D deletes 4 chars. ^U^U^D deletes 16. With a + number, uses that, i.e., ^U13x inserts 13 x's. + +^V next-screen + + Display next screenful of this buffer. Leave cursor at upper left hand + corner of screen. With an argument, displays that many screens ahead. + +^W wipe-region + + Wipe (kill) all text between cursor and the-mark. Succeeding kill commands + (like ^K, NOT ^W) will merge killed text. The killed text is saved on the + kill ring, and can be retrieved with ^Y. + +^X# kill-backward-sentence + + Kill backwards to the beginning of this sentence: kill as much of the + sentence as thus far typed. Successive kills via ^X# and other + reverse-killing commands (e.g., esc-#) merge, and may be retrieved with one + ^Y. + +^X( begin-macro-collection + + Start learning all which follows as a macro, until ^X) or an error occurs. + All commands and input between ^X( and ^X) will be remembered as a "macro", + which can be executed by ^XE, or saved and assigned to a key by save-macro, + and displayed by ^X*. + + +^X) end-macro-collection + + End a macro definition. The commands and input typed since ^X( become the + "last macro defined" for ^XE, which see. If given a numeric argument, + re-executes the defined macro as ^XE does (see that command). See ^X( for + what a macro is. + +^X* show-last-or-current-macro + + Display the commands (as keystrokes, i.e., ^A, ESC-B, etc.) in the last + macro defined (see ^X(). If given a numeric argument, i.e., ^U^X*, display + the keystrokes and command names. + +^X. set-fill-prefix + + Set "fill prefix" in this buffer to be whatever is between the beginning of + the line and the cursor. The "fill prefix" is inserted automatically by + CR, autofill, and runoff-paragraph. If the cursor is at the beginning of + the line when ^X. is issued, the fill prefix is reset (i.e., there will be + no fill prefix). It may be used to establish a "left margin". + +^X0 remove-window + + Removes a window from the screen; only valid if there is more than one + window on the screen. With no argument, ^X0 removes the current window. + With a numeric argument, it removes the window specified by the argument. + The uppermost window is window 1. + +^X1 expand-window-to-whole-screen + + The window in which the cursor appears will be expanded to fill the whole + screen; all other windows will be removed. This in essence returns to "one + window mode" from having any number of windows. The cursor will retain its + position in the text. See ^Z^W. + +^X2 create-new-window-and-go-there + + Creates a new window at the bottom of the screen, redividing the screen + equally among the windows there. The cursor will be moved to the new + window, which will have a buffer name created from its window number. See + ^Z^W. + +^X3 create-new-window-and-stay-here + + Create a new window at the bottom of the screen, redividing the screen + equally among all the windows. The cursor remains where it is. The new + window, which has a default buffer name created from its window number, + becomes the "least recently used window". See ^X4 and ^Z^W. + +^X4 select-another-window + + The cursor is moved to the least-recently visited window on the screen. + That window then becomes the most-recently visited. Thus, successive + applications of ^X4 will visit all windows on the screen. ^X4 is a good + command to use when you want to visit some new buffer or file, but not + overwrite windows containing information you have been looking at recently. + With an argument, i.e., ESC 3 ^X4, goes to that window, e.g., window 3. + + +^X; set-comment-column + + Make the "comment-column" in this buffer be the horizontal position where + the cursor is now.. With an argument, sets the comment column to that + number, counting from the left as column 1. See esc-;. + + +^X= linecounter + + Display in the minibuffer area the number of lines in this buffer, the line + number (the first line is line 1) of the line the cursor is on, and the + horizontal column position (on a dprinted line, not the screen). + +^XB select-buffer + + Switch to another buffer. Prompts for the name of that buffer, terminate + with CR. If that buffer does not already exist, it will be created. All + key bindings, fill column, comment column, comment prefix, etc., associated + with that buffer will be put in effect. The last point that you were at in + that buffer becomes the current point. ^XBCR goes to the last buffer you + were in. + +^XCR eval-multics-command-line + + Prompt for a Multics command line. Terminate it with CR. Multics commands + that produce output may well ruin your screen; if this occurs, use ^L. Use + ^X^E if you expect output. + +^XD edit-dir + + Enter the directory editor, editing the working directory. With an + argument, i.e., ^U^XD, prompts for other directory name. Position to a + line with some segment's name on it, and the following commands (keys) may + be used (lower case O.K.): + + D Delete this segment when the directory editor is exited. + U Undelete, i.e., cancel previous D on this line. + E Examine (i.e., take a look at) this segment, in a separate + buffer. Use ^X^Q to get back, and the examine + buffer will disappear of its own accord. + Q Quit the directory editor. A list of files will be shown, + and you will be queried if you want to delete them + or not. To exit without any action use ^XB. + R Rename this segment. The new name is prompted for. + N Same as ^N. + P Same as ^P. + +^XE execute-last-editor-macro + + Execute the last macro defined (via ^X( ), one or many times depending on + the numeric argument to this command: + + No argument: Execute it once. + 0( i.e., ESC-0^XE) Execute it over and over, pausing after each + execution. Type a space to go on to the next, + CR or ^G to stop repeating. + 1-9999 Do it that many times. + 9999-infinity Do it forever until an error happens. + +^XESC escape-dont-exit-minibuf + + ^XESC is the same as ESC, and may be used for all ESC-... commands and + numeric arguments, but may be used in the minibuffer when typing ESC would + terminate the minibuffer, as in search strings. + +^XF set-fill-column + + Sets the fill column in the current buffer to be the horizontal position + where the cursor is now. The fill column is the "right margin" used by + esc-Q to fill and adjust text, by fill mode to fill and adjust text, and by + esc-S to determine where to center. The fill column is the first column in + which text is NOT to be placed. The new value of the fill column is + printed out in the minibuffer. If a numeric argument is given, e.g., ^U 72 + ^XF, the fill column is set to that value. + +^XG get-variable + + Get back a "variable" stored by ^XX. The name of the variable will be + prompted for; the cursor will be put after it, and the-mark before it. + +^XH mark-whole-buffer + + Put the-mark at the end of the buffer and the cursor at the beginning. + This "marks" the whole buffer, so that ^W will delete it, etc. The + linefeed at the end of the buffer is NOT in the marked region, but ^XH ^W + ^XB ... ^Y will effectively move a whole buffer. + +^XI insert-file + + Insert file. Prompts for a filename, terminated by CR. Reads that file + into the current buffer without destroying the previous contents of the + buffer. The file is read in to the left of the cursor and the cursor is + left after the contents of the file just read. The default file for the + buffer is not changed. (See ^X^S.) + + Archive component pathnames are accepted. Starnames are accepted, but no + more than one segment or archive component can match the starname. + +^XK kill-buffer + + Kill (destroy) a buffer. Prompts for the buffer's name. End with CR. + Buffers may be killed to conserve storage, or not to appear in buffer + listings or to prevent quitting (see ^X^C). If you kill the current + buffer, prompts for another buffer to go to, as in ^XB. + +^XM send-mail + + Enter the Emacs mailer (RMAIL) to compose a letter of outgoing mail. ^XM + will prompt for the mail subject, end the subject with a carriage return. + For full information on reading and sending mail, see rmail.info. + +^XO select-other-window + + When in two-window mode, (see ^X2) move the cursor to the other window, + implicitly (usually) switching buffers. The mode line will be updated to + reflect the new buffer. The cursor will appear at the last point it was in + the new window. In general, the cursor will enter the window used last, + immediately before the current window was entered. + +^XQ macro-query + + Query. Only usable while macros are being collected: when the macro is + run, ^XQ will query the user for a character: space will continue execution + of the macro. ^G will stop the macro altogether. CR or other random + characters will restart the macro from the beginning. In this way, + + ^X( ^S f o o ESC ^XQ esc-U ^X) + +will "query replace", i.e., interrogatively upper-case all foo's. + +^XR rmail + + Enters the Emacs RMAIL subsystem to read mail. Without an argument, that + is, ^XR, your default mailbox is used. With an argument, that is, ^U ^XR, + the mailbox name, which may take any reasonable form (such as + Washington.States, Palter, >udd>m>abc>abc, etc) is prompted for. The first + message in the mailbox is placed in a buffer in RMAIL mode. Type "q" to + exit RMAIL and delete all mail queued for deletion during RMAIL. Refer to + rmail.info for full info on RMAIL and reading and sending mail. + +^XS global-print + + Global print all lines a la QEDX. Prompts for a string. With a numeric + argument, i.e., ^U^XS, takes a QEDX-like regular string. End in either + case with CR. Prints all lines containing that string. Type ^J or + continue editing to restore buffer display. + +^XV view-lines + + View lines or region, for printing terminals. The optional numeric + argument is how many lines to print- leaves you after them, unless argument + is 1 or not supplied, in which case it leaves you on current line, after + printing it. ESC-0^XV views the region (between cursor and the-mark), thus + ^XH ESC-0^XV prints the whole buffer. With a negative argument, prints + lines starting that many back. + +^XW multi-word-search + + Multi-word search. Prompts for one or more words, terminated by CR. (this + is a search string; just CR re-uses last). Searches from current point to + end for those words appearing in order, regardless of case of letters, + underlining, intervening punctuation, whitespace, or line breaks. Finds + whole words, not parts of words. A word that ends in * will match the rest + of a word to *. With a numeric argument, (^U^XW), goes to beginning of + buffer before searching. + +^XX put-variable + + Store away point/mark region to a "variable", whose name will be prompted + for. Use ^XG to retreive this value, and list-variables to get it back. + +^X\177 kill-backward-sentence + + Kill backwards to the beginning of this sentence: kill as much of the + sentence as thus far typed. Successive kills via ^X\177 and other + reverse-killing commands (e.g., esc-#) merge, and may be retrieved with one + ^Y. + +^X^B list-buffers + + Produces listing of buffers and their pathnames. ">" marks buffer you came + from, "*" says buffer is modified since it was last read or written. + Proceed with editing, or type ^J to refresh screen. + +^X^C quit-the-editor + + Exit the editor. If modified buffers exist, they are listed as if by ^X^B; + ^X^C then asks you if you really want to exit the editor. + +^X^E comout-command + + Executes a Multics command line (prompted for, end with CR), and places the + output in a buffer; if the command line is empty this request is aborted. + The output is placed in the buffer "file_output"; however, if the command is + given a numeric argument (e.g. ^U^X^E) the "comout-command-to-buffer" + command (see below) is executed. The file_output buffer is made the current + buffer. + +^U^X^E comout-command-to-buffer + + This is like "comout-command", except the user is prompted for the name of a + buffer (which is used instead of "file_output"). This can be made the + normal operation of ^X^E by placing the following line in the start_up.emacs + (see Appendix G for more information on the start_up.emacs): + (set-permanent-key "^X^E" comout-command-to-buffer) + +^X^F find-file + + Find file. Prompts for a filename, terminated by CR. If the file is + already in a buffer, ^X^F goes to that buffer (see ^XB). If the file is in + more than one buffer, you will be queried about which one (or a new one) to + use. If the file is not in any buffers, it will be read into a new, + appropriately-named buffer. This is the standard way to read in a file or + create a buffer for a new file. + + If no such buffer exists, ^X^F reads the file into the buffer whose name is + the first component of the entry portion of the filename, and sets the + default file of this buffer to the file just read. If the + find-file-set-modes option is on, ^X^F will set the major mode of the + buffer according to the last component of the entry portion of the + filename. (For example, for the filename ">ldd>include>sst.incl.pl1", the + buffer chosen is "sst" and the major mode is "PL/1".) + + ^X^F will accept archive component pathnames (archive::component). ^X^F + also accepts star names (including stars in the archive and component + names). When more than one star match is found, a ^X^F is done for each + segment/archive component selected. + +^X^G ignore-prefix + + Flush a prefix character. Used when a prefix character such as ESC is + entered by accident; causes an audible signal to indicate that the ^X^G has + been executed. Unlike ^G, does not exit the minibuffer. + +^X^I indent-rigidly + + Re-indents all lines in the region defined by the cursor and the mark by + the amount specified by the numeric argument. The numeric argument may be + negative to unindent. All lines that have any characters between the + cursor and the mark will be re-indented; thus, a line with the region + ending at its beginning will not be re-indented. + +^X^L lower-case-region + + Lower-case all letters between the cursor and the mark. + +^X^O delete-blank-lines + + Delete blank lines around cursor: get rid of vertical whitespace. If + issued on a blank line, leave one blank line. Otherwise, delete all blank + lines after this line's end. See ^O. + +^X^R read-file + + Read file. Prompts for a filename, terminated by CR. Reads that file into + the current buffer destroying anything which was in the buffer, and sets + this buffer's default file to the file read. The cursor is left at the + first position of the first line of the file read. If a blank response is + given for the filename, the buffer's default file is read. The default + file is set by ^X^R, ^X^F, and ^X^W. + + Archive component pathnames are accepted. Starnames are accepted too, but + no more than one segment or archive component must match. + +^X^S save-same-file + + Save file. Writes the contents of the current buffer to its default file. + This command is equivalent to ^X^WCR. + +^X^T toggle-redisplay + + Turns off all screen updating until the next ^X^T, command-quit, or error + happens. ^X^T may be used on slow terminals with no insert/delete + facilities to avoid excessive printing time for operations such as typing + in the middle of a line. + +^X^U upper-case-region + + Upper-case all characters between the cursor and the mark. + +^X^W write-file + + Writes the current buffer out to a file, whose relative pathname will be + prompted for in the minibuffer. Terminate response with a CR. If a blank + or null response is given, write it out to this buffer's default file. The + file specified becomes the buffer's default file. See ^X^S. + +^X^X exchange-point-and-mark + + Exchange the cursor and the-mark, to verify what you are getting into + before typing ^W or similar. Puts the cursor where the-mark is and vice + versa. ^X^X ^X^X quickly verifies the extent of the "point-mark region" + visually and puts things back. Use ^U ^@ to visit older settings of + the-mark in this buffer. + +^X_ underline-region + + Underlines the region between the point and the mark. If the option + underline-whitespace is On, underline the spaces also (Default is Off). + With a numeric argument, removes the underlining from the region. + +^Y yank + + Yank (retrieve) killed text to cursor. Unkills last killed word, line, or + region (^W). With a numeric argument, goes that many killings down the + 10-position kill ring. Leaves the-mark at the front of the retrieved text, + and the point at the end. + +^Z; kill-comment + + Removes the comment and the whitespace preceding it from the current line. + The deleted text is saved on the kill ring, accessible to ^Y. The text is + saved in such a way that folowing ^K's and other forward-killing commands + will merge properly with the deleted text. + +^ZG go-to-named-mark + + Prompt for the name of a "named mark", and move the cursor to the point + where that mark was saved. Use ^Z^@ to set a named mark. + +^Z^@ set-named-mark + + Prompt for the name of a "named mark", and set that named mark to be where + the cursor is now. Named marks are valid only in the buffer in which they + were created. Use ^ZG to go to a named mark. + +^Z^B edit-buffers + + Enters the buffer editor. If given no argument, i.e., ^Z^B, the buffer + editor will set up its display in the current window. If given an + argument, i.e., ^U ^Z^B, the buffer editor will find some other appropriate + window (if in two-or-more-window mode) to set itself up in. See + windows.info for full information on the buffer editor. + +^Z^F get-filename + + Inserts the pathname (as seen in the mode-line below) of the current buffer + at the cursor. With an argument, inserts the entryname portion of the + pathname only. If the pathname is an archive component pathname, the + componentname is inserted. + +^Z^G ignore-prefix + + Flush a prefix character. Used when a prefix character such as ESC is + entered by accident; causes an audible signal to indicate that the ^Z^G has + been executed. Unlike ^G, does not exit the minibuffer. + +^Z^V scroll-current-window + + Scrolls the current window (or whole screen, in one-window mode) up or down + a specified number of lines. The cursor remains on the same line of the + buffer. The numeric argument tells how many lines to scroll it up; the + default is one line up. A negative numeric argument indicates scrolling it + down. Thus, ESC - 3 ^Z^V scrolls the current window three lines down. + +^Z^W edit-windows + + Enter the window editor to create, realign, destroy, or visit windows. If + given no argument, i.e., ^Z^W, the window editor will set up its display in + the window where the cursor currently sits. If given an argument, i.e., ^U + ^Z^W, the window editor will find some appropriate window in which to set + up shop. See windows.info for full information on the window editor. + +^Z^Z signalquit + + Signals QUIT to Multics. Restores normal tty modes before so doing, and + sets them back as Emacs needs them after having typed start. + +^Z_ remove-underlining-from-word + + Remove underlining from the current or previous word: the rules for + selecting which word are the same as those used by uppercase-word. + +^_ help-on-tap + + Gets help/documentation at any time. This feature is now only partially + complete. The current repertoire is: + + ^_ H Find out where to get more help. + ^_ ? Display the current repertoire of ^_ + ^_ A Prompt for a string to search for appropriate + commands (same as esc-X apropos). + ^_ C Prompt for a key sequence to document (same as + esc-?). + ^_ D Prompt for the name of an extended command to + document (same as esc-X describe). + ^_ L Display the last 50 characters typed in. + ^_ ^G Do a command-quit as usual. + +esc-# rubout-word + + Delete the word to the left of the current point. More specifically, + delete going backwards, deleting characters until the beginning of a word. + Successive words deleted with esc-# are merged and may be retrieved with + one ^Y. + +esc-% query-replace + + Interactively replaces all occurences of one string with another. The + command prompts for both strings in the minibuffer, and then searches + forward for each occurrence of the first string. Terminate the strings + with CR. It positions the cursor immediately after this string and waits + for one of the following responses: + + space -- replaces this particular occurrence of the first string + with the second. Then searches for the next occurrence of + the first string and waits for a response again. + , -- same as space, but redisplays before searching on. + Normally, esc-% redisplays only before prompting. + return -- leaves this occurrence of the first string alone and searches + for the next occurrence of the first string. + period -- replaces this occurrence of the first string with the second + and terminates the query replace. + ! -- Replaces this and all succeeding occurences of the + first string by the second, without asking. + ^G -- terminates the query replace without modifying this + occurrence of the first string. + ESC -- same as ^G. + +esc-/ regexp-search-command + + Search forward regular expression, `a la "QEDX". Terminate the regular + expression by CR, we supply the slashes. All rules for QEDX regular + expressions apply. Searches forward from cursor, and can find many + occurences of the regular expresion on one line. Leaves the cursor and + the-mark around the string it finds, so that + + s/(fo.*)/(a b & )/ (QEDX) + = esc-/(fo.*) CR ^W( a b ^Y ) (EMACS) + + +esc-; indent-for-comment + + Searches for this line's comment. If one exists, indents it to the comment + column in this buffer (see ^X;). If one does not exist, start one at the + comment column on this line. Uses the "comment-prefix" to search for an + old one or start a new one. See also set-comment-prefix. + + +esc-< go-to-beginning-of-buffer + + Move to the beginning of the current buffer, i.e., before the first + character in the buffer, that is, the top of the document being edited. + +esc-> go-to-end-of-buffer + + Move to the end of the current buffer, i.e., before the newline on the last + line of the current buffer. In other words, go to the bottom of the + document being edited. There is no way to position beyond that newline. + +esc-? describe-key + + Display the documentation for a given key sequence. To find out what a + Control D does, type esc-? and a Control D. With a numeric argument, + i.e., ^U esc-?, just the command name to which the key is currently + connected will be displayed in the minibuffer. + +esc-A backward-sentence + + Go to the beginning of the current sentence, i.e., just before the first + letter. If already at the beginning of a sentence, go to the beginning of + the previous sentence. The beginning of the first word after a blank line + always counts as the beginning of a sentence. + +esc-B backward-word + + Go backward one word. If in the middle of a word, go to before the + beginning of that word. Skips backwards over all whitespace to get to the + next word. Underscores and backspaces count as parts of words. + +esc-C capitalize-initial-word + + Capitalize a word, leading capital, rest of word lower-case, like "Word". + If the cursor is in a word or immediately after a word,capitalize that word. + Otherwise, do the next word. With a numeric argument, do that many words; + with a negative numeric argument, to that many backward. Leaves cursor + immediately after the last word (or before the first word) capitalized. + +esc-CR cret-and-indent-relative + + Does a CR and a indent-relative. Basically, this means finish this line, + and start a new line, indented the same as the previous line. If the + original line was not indented, note that this will line up with the second + word on the first line. This is the command you want to terminate a line + of an indented body of text. + +esc-D delete-word + + Delete the word to the right of the current point. More specifically, + delete going forward, deleting all whitespace and punctuation and + characters until the end of the next word. + +esc-E forward-sentence + + Move forward to the end of this sentence. If at the end of a sentence, + move forward to the end of the next sentence. Ends of paragraphs are + implicitly ends of sentences, whether or not an end-of-sentence punctuation + (period, question mark, exclamation point) appears. + +esc-ESC eval-lisp-line + + Prompt for a string for Lisp to evaluate; put a pair of parens around it, + evaluate it in Lisp (with ibase = 8) and print out the Lisp value in the + minibuffer (base = 8, *nopoint nil). To get a variable value, use esc-ESC + progn CR. + +esc-F forward-word + + Go forward one word. If in the middle of a word, move to the end of the + current word. Leaves point immediately after that word. All punctuation + and whitespace before the word are moved over. Underscores and backspaces + count as parts of words. + +esc-G go-to-line-number + + Goes to a given line, given by line number, from the top of the buffer. + The numeric argument specifies the line number. For instance, ESC 25 esc-G + goes to line 25. If the line number is not specified, prompts for a line + to go to. + +esc-H mark-paragraph + + Put the-mark at the beginning of the current paragraph. Put the cursor at + the end of the current paragraph. See esc-[ for a definition of + paragraphs. + +esc-I tab-to-previous-columns + + Indent the current point on this line (where the cursor is) to line up with + the next non-whitespace item on the previous non-blank line. Successive + invocations of esc-I cause attempts to line up with succeeding + non-whitespace items. This is ideal for building columnated tables, etc. + Type in the first line by hand, and use esc-I to get to each new field, + column, etc. on succeeding lines. Typed on an empty line, or at the end + of a line, it positions for the next text to be entered. With a numeric + argument, esc-I uses previously undented lines (other than the last line) + for a model, thus facilitating typing in outlines, etc. + +esc-K kill-to-end-of-sentence + + Delete text going forward from the cursor to the end of the current + sentence. If at the end of a sentence, delete forward to the end of the + next sentence. Sentences and other text killed consecutively in this + fashion are merged, and may be retrieved with a single ^Y. + +esc-L lower-case-word + + Convert a word to all lower-case, like "word". If the cursor is in a word + or immediately after a word, lower-case that word. Otherwise, do the next + word. Convert a word to all upper-case, like "WORD". If the cursor is in + a word or immediately after a word, upper-case that word. Otherwise, do + the next word. With a numeric argument, do that many words; with a negative + numeric argument, to that many backward. Leaves cursor immediately after + the last word (or before the first word) lower-cased. + +esc-M skip-over-indentation + + Move the cursor to the first non-whitespace (i.e., not tab, blank, + formfeed, or vertical tab) position on this line. In other words, skip + over the indentation on this line. + +esc-N down-comment-line + + Properly indents the comment on the next line, or puts a comment on the + next line, if there is not one there already. Effectively the same as + ^Nesc-;. See esc-;. + +esc-P prev-comment-line + + Indent the comment on the previous line properly. If there is no comment + on the previous line, put one there, indented properly. Effectively the + same as ^Pesc-;. See esc-;. + +esc-Q runoff-fill-paragraph + + "Fill" the current paragraph, like runoff/compose with ".na". With + argument (i.e., ESC-1 esc-Q), fill and adjust like runoff/compose with .fi + and .ad. Right margin is determined by fill column, left margin by fill + prefix. Runoff/compose control lines count as their own paragraphs. See + ^XF to set fill-column, and ^X. to set fill prefix. + +esc-R move-to-screen-edge + + Move to top, bottom, or other point on screen. ESC-1 esc-R is the top line + of the screen, ESC 6 esc-R is the 6th line from the top, ESC - 4 esc-R is + the fourth line from the bottom. A very large number is also the bottom. + Leaves the cursor on the start of the selected line. + +esc-S center-line + + Center the current line, according to fill-column (see ^XF). + + +esc-T twiddle-words + + Twiddle (transpose, interchange) the last two words typed, like: like I + esc-T Multics because... If you are currently in the middle of a word, + goes to the end of the word first. + + +esc-U upper-case-word + + Convert a word to all upper-case, like "WORD". If the cursor is in a word + or immediately after a word, upper-case that word. Otherwise, do the next + word. With a numeric argument, do that many words; with a negative numeric + argument, to that many backward. Leaves cursor immediately after the last + word (or before the first word) uppercased. + +esc-V prev-screen + + Display the previous screen (one back) of this buffer, leaving cursor at + the top of it. With an argument, displays that many screens backward. + +esc-W copy-region + + Copies the text between the cursor and the-mark on to the top of the kill + ring. This means that the next ^Y will copy the text now between the + cursor and the-mark to wherever the cursor is when the ^Y is issued. + +esc-X extended-command + + Prompt for the name and arguments of an extended commands in the + minibuffer. Terminate with CR. To find out about an extended command, + type + + esc-X describe CR + +esc-Y wipe-this-and-yank-previous + + I don't like what I just ^Y'ed. Get rid of it and yank the previous thing + in its place. Used to retrieve the previous "kill" when you find that the + thing that you just ^Y'ed was the wrong thing. In more detail, delete the + text between the cursor and the-mark without saving it, rotate the kill + ring one position, and ^Y. + +esc-[ beginning-of-paragraph + + Move to the beginning of the current paragraph. If already at the + beginning of a paragraph, move to the beginning of the previous paragraph. + The beginning of a paragraph is the beginning of the first line of the + paragraph. The definition of paragraphs is controlled by the + paragraph-definition-type option; if 1, blank lines separate paragraphs. + If 2, an indented line starts a paragraph. Runoff and compose control + lines count as paragraphs. + +esc-\ delete-white-sides + + Delete all whitespace characters on the current line surrounding the + cursor. In this context, a whitespace character is a space, a tab, a + formfeed, or a vertical tab. + +esc-\177 rubout-word + + Delete the word to the left of the current point. More specifically, + delete going backwards, deleting characters until the beginning of a word. + Successive words deleted with esc-\177 are merged and may be retrieved with + one ^Y. + +esc-] end-of-paragraph + + Move to the end of the current paragraph. If at the end of a paragraph, + move to the end of the next paragraph. The end of a paragraph is the end + of the last line of the paragraph. The definition of paragraphs is + controlled by the paragraph-definition-type option; if 1, blank lines + separate paragraphs. If 2, an indented line starts a paragraph. Runoff + and compose control lines count as paragraphs. + +esc-^ delete-line-indentation + + Without a numeric argument, i.e., esc-^, delete all whitespace at the + beginning of this line and then merge it with the previous line. With an + argument, i.e., ^Uesc-^, does a ^N first, so that ^Uesc-^ in effect + "connects" the next line into this one, without the next line's + indentation. + +esc-^B balance-parens-backward + + Skip backward over one set of balanced parentheses. Will search backwards + until a set of parentheses is found. Does not handle quoting or any + programming language conventions. + +esc-^C compile-buffer + + Compiles the buffer. Writes the current buffer out to its default pathname + (as for ^X^S), and then compiles it. Compiler diagnostics are placed in the + buffer "Compilation Errors" if the option "one-error-scan-buffer" is On (the + default); if it is Off then the diagnostics are placed in the buffer " + Errors", where is replaced with the name of the buffer being + compiled. (This allows several buffers to be compiled without overwriting + each other's error messages.) If in two-window mode, the error buffer is + displayed in another window; if the option "compile-two-windows" is On (the + default is Off) then this command will automatically enter two-window mode + if necessary. If the "compile-local-display" option is On (default is Off) + and "compile-two-windows" is Off, the error messages will be displayed as a + local display (in addition to being put in a buffer). If neither is set + (the default), a one-line local display will indicate whether the + compilation was successful. The extended requests "ESC X set-compiler" and + "ESC X set-compile-options" can be used to select the compiler and options + to be used. + +esc-^F balance-parens-forward + + Skip forward over one set of balanced parentheses. Will search forward + until a set of parentheses is found. Does not handle quoting, or any other + programming language conventions. + +esc-^G ignore-prefix + + Flush a prefix character. Used when a prefix character such as ESC is + entered by accident; causes an audible signal to indicate that the esc-^G + has been executed. Unlike ^G, does not exit the minibuffer. + +esc-^I indent-to-fill-prefix + + Delete the indentation (leading whitespace) of the current line, and + replace it with the fill prefix in this buffer. See ^X.. + +esc-^O split-line + + Break the line at this point, shear it vertically. Puts the text to the + right of the cursor on the next line, with enough indentation so that it is + still in the same place horizontally. This can be undone by ^Uesc-^. See + esc-^. + +esc-^V page-other-window + + Valid only when more than one window exists. With no argument, causes a ^V + to be done on the other window (i.e., the one the cursor is not now in); + with an argument, pages the other window that many screens backward or + forward; thus, ESC - esc-^V pages the other window one backward. Very + useful for "paging" compiler diagnostics while editing a program. When + more than two windows are in use, the "next most recently visited" window + will be considered to be the "other window". + +esc-^W merge-last-kills-with-next + + Causes the next kill-type commands (example, ^K, esc-D) which must follow + immediately, to merge what they kill with the last saved kill on the kill + ring, in the same direction as the next command kills. For instance, ^A ^K + ^K ^N ^N esc-^W ^K ^K catenates two disjoint lines on the kill ring. + +esc-^Y yank-minibuf + + Yank back the last content of the minibuffer, without prompt string. The + mark will be set in the minibuffer, so ^X^X may be used to position around + it, and ^W to delete it. The real mark in the main buffer will not be + destroyed. + +esc-_ underline-word + + Canonically underscore the current or previous word. Although it will look + peculiar on the screen, it will be correct, and runoff-paragraph and fill + and dprint correctly. The rules for selecting which word to do are the + same as those used by uppercase-word. + +esc-~ unmodify-buffer + + Marks the current buffer as not modified. Emacs will not mention this + buffer when querying because of a ^X^C. esc-~ is useful after accidently + modifying a buffer which you only intended to examine. + + + + + + E__x_t_e_n_d_e_d C__o_m_m_a_n_d_s + +Type esc-X followed by the command name, and a carriage return to invoke these +commands. + +esc-X accept-messages + + Accept Multics interactive console messages into Emacs buffers, one buffer + per correspondent. Causes messages to be displayed as local output as they + arrive. All correspondence to and from each correspondent is maintained in + a buffer named "Messages from ", in which carriage return is + bound to respond-from-buffer, which causes messages to be transmitted when + a line is typed by you into that buffer. In these buffers, conversations + "transcript" as with send_message in "input mode". The following key + bindings are set up globally by accept-msgs: (see their documentation): + + ^X: message-response-command (responds to last sender from + minibuffer). + ^X' go-to-new-message-buffer (goes to a message buffer). + With an argument, lists message buffers (conversations) + ^X` send-a-message (prompts for user name and then message) + ^X~ repeat-last-message (reprints last interactive message) + +esc-X accept-messages-path + + Accepts messages on some other mailbox than the user's default mailbox. Up + to 50 mailboxes may be accepting messages at once in a process. The + argument to esc-X accept-messages-path is either a mailbox pathname + (containing >'s or <'s) or a user-name (for sites using the ARPANet Mail + Daemon) or a pair of the form User.Project. The effect is the same as + esc-X accept-messages. + +esc-X alm-mode + + Enter ALM major mode in this buffer. ALM mode consists of many commands + and variable settings suitable for the creation and editing of ALM + programs. + +esc-X apropos + + Lists all commands and extended commands that "mention" a given string in + their names, and tell what, if any, keys invoke them in the current buffer. + For instance, + + apropos forw + + will list forward-word, forward-char, etc. This is the most common way to + "find" a command that does something you are looking for. + +esc-X compose-mode + + Mode for editing compose text files. Turns on fill mode automatically. + Equivalent to the text-mode and runoff-mode commands; entered automatically + for files with a last component of ".runoff" or ".compin" if the option + find-file-set-modes is On (Default is Off). + +esc-X describe + + Display the documentation for an extended command. The command name is the + argument describe. For example, + + esc-X describe apropos CR + +to find out about the "apropos" extended command. + +esc-X edit-macros + + Produces a symbolic file of all keyboard macros defined in the current + buffer and places it in a new buffer. The keyboard macros may then be + written out for later loading, edited, redefined, or compiled into Lisp + code. See macro-edit.info for full information. + +esc-X electric-alm-mode + + Enters ALM mode, with several commands for automatically formatting ALM. + +esc-X electric-pl1-mode + + Enters Electric PL/I mode in the current buffer. Electric PL/I mode is a + variant of PL/I mode in which semicolons and colons have violent automatic + "electric" action which may be disturbing to some, but useful to others. + See pl1-mode.info. + +esc-X filloff + + Turns off fill mode in this buffer, if it is on. + +esc-X fillon + + Turn on Fill Mode (a minor mode) in this buffer. In Fill Mode, text will + be wrapped around lines so as not to extend past the fill column (see ^XF + to set that). When a space, tab, or punctuation mark is placed after a + word which passes the fill column, the line will be broken at the first + whitespace from the end of the line. filloff turns it off. To insert a + character to cause a line deliberately to extend pass the fill column, + either type CR or precede the character with ^Q. + +esc-X fortran-mode + + Enter Fortran major mode in this buffer. Fortran mode consists of many + commands and variable settings suitable for the creation and editing of + Fortran programs. See fortran-mode.info for a list of the commands and a + description of this mode. You can issue the command esc-X apropos fortran + CR in a Fortran mode buffer for a list of relevant commands in this mode. + +esc-X fundamental-mode + + Enters the mode (set of key bindings and variable settings) that all + buffers start out in. This can be used to "undo" any other major mode that + you may have set. + +esc-X ldebug + + Enters a "Lisp Top Level" buffer in Lisp Debug mode. Forms typed into this + buffer are evaluated and the value is displayed by placing it in this + buffer. When esc-X ldebug has been used, all Lisp errors in Emacs trap + into this buffer. ESC-P restarts a break. See ldebug.info for more + information. + +esc-X lisp-mode + + Enter Lisp major mode in this buffer. Lisp mode consists of many commands + and variable settings suitable for the creation and editing of Lisp + programs. See lisp-mode.info for a list of the commands and a description + of this mode. + +esc-X list-named-marks + + Display a list of all of the named marks in the current buffer. Use ^Z^@ + to create a named mark, and ^ZG to go to one. + +esc-X loadfile + + Loads a private Emacs extension package into the editor. The argument is + its pathname. + +esc-X loadlib + + Load an "uninstalled" extension package into Emacs. Normally, such + packages are "autoloaded" when commands in them are invoked, but from time + to time, new, experimental, or highly specialized packages may require + being loaded in this way. The single argument is the name of the package + to be loaded. Loading a package makes the commands in it available. + +esc-X lvars + + Display the names and lengths of all "variables" saved by ^XX. Type ^J to + resume, or just continue editing. See ^XX and ^XG. + +esc-X make-wall-chart + + Puts into a buffer a "Wall Chart", describing all the currently defined + commands and what keys invoke them in the current buffer. The resultant + buffer is intended for dprinting. + +esc-X opt + + Also "option". Sets non-obvious internal flags and defaults, each of which + have names. Takes three forms, + + opt list List all options and settings. + opt NAME VALUE Set option value. + opt status NAME Report setting of one option. + + Values may be on, off, or numbers, depending on the option. Code, such as + startups, can simply set these Lisp variables. (on/off => t/nil). Current + options are: + + display-ctlchar-with-^ Causes control characters to print as + ^P instead of \020. + suppress-ctlchar-display Don't show control characters. Any character + which would print as \NNN (except \177) is not + displayed. + suppress-rubout-display Don't show rubout characters. Causes \177 to + never be displayed. Usefull when reading ALM + listing segments. + suppress-backspace-display Don't show backspaces. Causes underlined + "foo" to print as "_f_o_o". + rdis-whitespace-optimize Avoid printing whitespace when clever + terminal control would go faster. Currently + on by default, but adds a little expense. + rdis-wosclr-opt Wipe Out Screen lines before filling screen. + Try it both ways to see what this means. + paragraph-definition-type 1 (default) = blank lines precede + paragraphs. 2 = indented line starts one. + find-file-set-modes When on, find-filing foo.pl1 sets pl1 mode, etc. + track-eol-opt When on, ^N, ^P at eol stick to ends of lines. + default-fill-column Fill column for new buffers. + default-comment-column Comment column for new buffers (0 origin). + pop-up-windows When on, ^XB, ^X^F, ^X^E, etc., find an + appropriate place on the screen to put up + a window as opposed to replacing contents + of current window (highly experimental). + +esc-X pl1-mode + + Enter PL/I major mode in this buffer. PL/I mode consists of many commands + and variable settings suitable for the creation and editing of PL/I + programs. See pl1-mode.info for a list of the commands and a description + of this mode. You can issue the command esc-X apropos pl1 CR in a PL/I + mode buffer for a list of relevant commands in this mode. + +esc-X replace + + Global replace of one string with another, from the current point to the + end of the buffer. Prompts for two strings, which must be terminated by + CR. If the first string is not found, esc-X replace will not prompt for + the second string, and will not move the cursor. + +esc-X reset-minibuffer-size + + Resets the size of the minibuffer/prompting area to its default of two + lines. See set-minibuffer-size. + +esc-X reset-screen-size + + reset-screen-size + + Resets the size of the main editing area of the screen to its default, + namely, all of the space above the mode line. See set-screen-size. + +esc-X runoff-fill-region + + Fills/adjusts an entire region in the same way as esc-Q does to a + paragraph. It does not respect paragraph breaks: this makes it only + marginally useful. + +esc-X runoff-mode + + Mode for editing runoff text files. Turns on fill mode automatically. + Equivalent to the text-mode and compose-mode commands; entered automatically + for files with a last component of ".runoff" or ".compin" if the option + find-file-set-modes is On (Default is Off). + +esc-X save-macro + + Saves a macro, assigning it to a key. Invoke it after a macro has been + defined. Will prompt for a command name to assign to the macro, and a key. + When a key has been assigned, this key will invoke that macro- it will take + arguments identical to ^XE. + +esc-X set-comment-prefix + + Set the "comment prefix" in this buffer. This is usually set automatically + by entering a major mode. The comment prefix is given as an argument to + this command, in quotes. The comment prefix is used by esc-;, esc-N, and + esc-P to find comments, and start them. + +esc-X set-compile-options + + In language modes that support ESC-^C for "compile buffer", and similar + (e.g., PL/I, FORTRAN), sets non-default compilation options to be given to + the appropriate compiler. + +esc-X set-compiler + + Sets the name of the compiler to be used by the compile-buffer command + (usually ESC-^C) in those language modes that compile buffers this way + (e.g., PL/I, FORTRAN). The single argument to esc-X set-compiler is the + compiler name. + +esc-X set-key + + Assigns key bindings in the current buffer. Takes two arguments, the "Key + name" and the command name. Makes that key execute that command in this + buffer. The command name is what describe-command or apropos or + make-wall-chart give; the key name can be anything like the names in this + documentation, e.g., ^X, ^x, ESC-ESC, ^Xq, control-p, c-p, meta-f, esc-^f, + CR, ^X-^F, ^X-CR, \177, #, A, ^P, etc. For instance, you might want to say + + set-key ^Z quit-the-editor + +if you want the privilege of quitting in one keystroke. + +esc-X set-minibuffer-size + + Sets the size of the minibuffer/prompting area on the screen to any value. + The single argument to esc-X set-minibuffer-size is the decimal number of + how many lines should be devoted to this function. The default is two. + With many-line minibuffers, many messages and errors may appear at once. + Use reset-minibuffer-size to reset the minibuffer size to its default of + two lines. Valid sizes are 1 to 6. + +esc-X set-permanent-key + + Used to set permanent (default in all buffers) key bindings. Otherwise, + works exactly like set-key. See set-key. + +esc-X set-screen-size + + Set the size of the main editing area (the area above the Mode Line) to + other than its default. The default is all of the area above the mode + line. The decimal argument to esc-X set-screen-size is the number of lines + in the main editing area. reset-screen-size may be used to reset the main + editing area size to its default value. esc-X set-screen-size is usually + used to reduce the amount of redisplay at low terminal speeds. + +esc-X set-search-mode + + Sets the bindings of ^S and ^R to invoke several different forms of + searching. The argument is the search mode. + + The known search modes are: + + string Searches for the exact character + string typed (the default). + regular-expression The string typed is interpreted as a + or regexp QEDX regular expression. + character Searches for the single character + typed. Control characters control + sophisticated options. + ITS-string A type of search popularized by + Dave Moon and Dan Weinreb on MIT-AI, + having many sophisticated features. + incremental Searches for a string showing the + state of the search as each character + is entered. + + All searches prompt telling the type of search that has been invoked. To + find out more about these different kinds of searches, set the search mode + of interest, and do an esc-? ^S. + +esc-X setab + + Define one word as an abbreviation for another for Speedtype mode, for + instance, + + setab edr editor + + Will accept multiple pairs of arguments. If the second string (the thing + being abbreviated) is many words, or has special characters in it, put it + in quotes. + +esc-X show-macro + + Displays an editor macro (defined with ^X() the same as + show-last-editor-macro does, but takes the name assigned to the macro (by + save-macro) as an argument. + +esc-X speedtype + + Enter speedtype minor mode in this buffer. Speedtype allows words to be + used as abbreviations for other words. setab is used to define + abbreviations; When a space, newline, tab, or punctuation mark is typed + after an abbreviation, the abbreviation is removed from the text and its + expansion is used instead. Precede punctuation or spaces with ^Q to + deliberately avoid speedtype expansion when in this mode. + +esc-X speedtypeoff + + Turn off speedtype mode in this buffer, if it is on. + +esc-X text-mode + + Mode for editing text files. Turns on fill mode automatically. Equivalent + to the runoff-mode and compose-mode commands; entered automatically for + files with a last component of ".runoff" or ".compin" if the option + find-file-set-modes is On (Default is Off). + + + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ldebug-mode.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ldebug-mode.info new file mode 100644 index 0000000..e1ce6e3 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/ldebug-mode.info @@ -0,0 +1,348 @@ +10/10/79 - Emacs Lisp Debug Mode + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + Multics Emacs LDEBUG mode (Lisp Debug) provides an +interactive Lisp environment designed for the debugging of Emacs +extension code. Facilities are provided for tracing the Lisp +stack, breakpointing code, and interacting with the native +MacLisp "trace" facility. LDEBUG mode is specifically optimized +for multiple-window interaction. + + LDEBUG Buffers + +The heart of the LDEBUG mode facilities is the "LDEBUG" buffer. +The buffer named "LDEBUG", when created by ldebug-mode +(either in response to a breakpoint being executed, a trapped +Lisp error, or the explicit "ldebug" extended command) +evaluates any Lisp form typed into it when Carriage Return is +struck after it. The form must be all on one line- an error will +occur if the form has syntactic errors (e.g., miscounted +parentheses). The result of the evaluation is placed in the +LDEBUG buffer on the next line, following the sign "=>", which +indicates the result of such an evaluation. The Lisp variable +"*" will be set to the result of each successive evaluation, +as at raw Lisp top level: this may be used to reference the last +printed result. + + Random Lisp forms such as "(+ 2 3)" or "current-buffer" can +be typed at LDEBUG buffers, and the resulting buffer contents +will in effect be a dialogue of an interaction with Lisp. Such +buffers are often dprintable for later perusal. The values of +variables may be set by evaluating the normal Lisp setq form, +e.g., (setq var (+ foo 27)). As lines are +placed into the LDEBUG buffer by the LDEBUG facility, the +window (if any) containing it will scroll if necessary. + + Lisp values "printed" into the LDEBUG buffer are by default +limited in length to ten and depth to six. The values of the +option variables "ldebug-prinlength" and "ldebug-prinlevel" +may be set to alter these defaults. The default input and output +radices are both 8: these may be altered as the option +variables "ldebug-ibase" and "ldebug-base". + + Most Emacs requests can be used in LDEBUG buffers; they are +in "Lisp Debug" mode, which is an extension of ordinary Lisp +mode, with commands differing as detailed below. + + + Emacs and Lisp Debug Mode + + The "ldebug" (ESC-X ldebug CR) extended command can be +invoked at any time, in the normal way Emacs extended commands +are invoked. It places Emacs in the LDEBUG buffer as described +above, but also, more significantly, it sets up a system of Lisp +error handlers "under" a new invocation of the Emacs request +loop. Should any Lisp error happen while these handlers exist, +the LDEBUG buffer will be entered, placed on display if not +already on display, the terminal's bell will be feeped, and the +Lisp error message will be entered in the LDEBUG buffer. You +will then be at a "second (or greater) level" of LDEBUG, similar +to what happens at Multics Command level when an error occurs. +The level number will be part of the message entered in the +LDEBUG buffer. + + Recursive (level greater than 1) LDEBUG buffers may be +released (aborting all executing code between the LDEBUG level +being released and the previous level) via the ESC G +(ldebug-return-to-emacs-top-level) request, the analogue +of the Multics "release" command. It will beep and type "$g" +in the LDEBUG buffer. The value of the variable "ldebug-level" +tells the current level of LDEBUG buffers. + + ESC P (for proceed) is the analogue of the Multics "start" +command; there is more to know about its meaning for each +different type of entry to an LDEBUG buffer, and this +will be described below. In general, it restores the +buffer and window from which the LDEBUG buffer were entered. + + + Error trap entries to LDEBUG + + When an "error trap entry" to the LDEBUG buffer has +occured, the Lisp stack may be traced via the ESC-T +(ldebug-trace-stack) request, and the value of variables may be +inspected simply by typing their names (as they are Lisp forms) +at the LDEBUG buffer. + + A value may be "returned" to the Lisp error handler by +typing it on a line, and instead of ending the line with +carriage return (which would evaluate and "print" the result), +end it with ESC P. Note that Lisp error handlers often want a +list of the value to replace some erroneous value. For +instance, in the following dialogue, an LDEBUG trap was entered +because of the unbound variable "stuff": the programmer returned +the symbol "value-i-wanted" as the intended value of the unbound +variable: + + (myfun huff stuff) + + Lisp breakpoint unbnd-vrbl at level 1 in buffer LDEBUG: + lisp: undefined atomic symbol stuff + + ('value-i-wanted)$p + +All "correctable" Lisp error breakpoints will accept a "retry" +value to be used to retry the failing operation; the undefined +function breakpoint ("undf-fnctn") also accepts a list of a new +value, in this case a function to be used instead. The MacLisp +manual must be consulted for the exact format of other retry +values. + + The "$p" is always printed by ESC P, to remind the user of the $p +which is used in raw Multics MacLisp to restart breaks (the "$p" +is in fact derived from ESC P on the ITS operating system, which +is used to restart jobs in general). + + ESC P may also be used alone on a line (i.e., no value to be +returned preceding it) to restart a break and let Lisp's default +action occur. + + ESC G may be used as usual to release a level of errors to +the next lower LDEBUG level; note that ^G (command-quit) only +does not release past LDEBUG levels. + + + Code Breakpoints + + Breakpoints may be set in interpreted extension code being +debugged by typing ESC & in a Lisp Mode buffer with the cursor +pointing at the point in some function being debugged where you +would like this break set. The LDEBUG mechanism will create +this breakpoint by putting a call to a tracing function ("%%") +in the code in the buffer, and evaluating the function +definition it is looking at. This "break code" will be left +in the function to let you know that it is there: it includes +a "break number" (they are assigned sequentially) by which +this breakpoint can be referred to by requests yet to +be described. + + You should be in at least one level of LDEBUG buffers +before setting a break: this means that you should have said +"ESC X ldebug CR" some time before setting breaks. + + Having set a break, you can run the code being debugged. +When the breakpoint is entered, the LDEBUG buffer will be +entered, at a new, higher level. A message of the form + + Break 4 in function testfun + +will be put in the buffer, and the LDEBUG buffer will be put on +display if not already on display. As in all LDEBUG buffers, +arbitrary forms can be evaluated (including inspecting +variables), and ESC T can be used to trace the Lisp stack. +Again, ESC G releases a level of LDEBUG buffers. + + ESC P is used to restart code breakpoints, as well. A given +breakpoint can be set for some number of proceeds (i.e., "3" means +proceed, and proceed this breakpoint the next two times it is +encountered automatically) by giving that number as a numeric +argument to ESC P (i.e., ESC 3 ESC P). A message indicating the +number of proceeds will be inserted in the LDEBUG buffer. +ESC P should be used alone on a line (i.e., no "retry value") +when restarting code (or trace) breaks. + + When in a code break, ESC R (ldebug-reset-break) may be +used to reset the current breakpoint, before restarting or +releasing. The break code will be removed from the function +definition (visibly, if it is on display), and the function +definition will be reevaluated. ESC R with a numeric argument +can be used to reset a break by number. + + When in an LDEBUG buffer, ESC L (ldebug-list-breaks) may be +used to list all the known code breakpoints: their numbers, the +function in which the break appears, the buffer the function +appears in, and the status of the break. + + The source for the current breakpoint may be shown by +issuing the request ESC S (ldebug-show-bkpt-source). It is +placed in an available window (if in multiple windows or +pop-up-window mode), and the cursor moved to the break code. +(use ^XO to get back, or in one-window mode ^XB CR). + + A common need during function breakpointing is to determine +where the editor was (i.e., what was the current buffer, and +where was the current point) at the time the breakpoint was +encountered. The ESC ^S (ldebug-display-where-editor-was) +request serves this need; it selects the appropriate buffer, +moving the cursor to the point in it where the current point was +when the breakpoint was taken. If the buffer is already on +display in some window (or pop-up windows are being used), +that window will be selected (i.e., receive the cursor), and ^XO +can be used to return to the LDEBUG buffer for further probing +or restarting. In one-window mode, the correct buffer will +be switched to, and ^XB can be used to get back. +Note that if the cursor (current point) is moved +by you explicitly (i.e., via normal Emacs requests) while +visiting the buffer where the breakpoint was taken, it will have +its new position when the breakpoint is restarted. This is +analogous to setting a variable before restarting with usual +Multics debugging. + + Using two or three windows to contain the LDEBUG buffer, the +breakpoint source (function being debugged), and the buffer the +functions being debugged are working on is highly effective and +recommended. + + + Function tracing with LDEBUG + + The standard MacLisp trace package can be used while in +Emacs; extensibility features of the former allow LDEBUG to +take control of the trace output and breakpointing provided by +it. + + All the facilities of the standard trace package can be +used, by invoking trace from ESC ESC minibuffers. The trace +package allows tracing of entries and exits to functions, +arguments, and return values, and breakpoints when functions are +entered. Some sample forms to trace the function "testfun" are +given here: these are the in Lisp syntax, and may be typed as +such to LDEBUG mode. When typed to an ESC-ESC minibuffer, the +outer set of parentheses should not be supplied. + + (trace testfun) Trace the input arguments and + return value of testfun each time + it is invoked. + + (trace (testfun break (< x 3))) + Trace input and return value of + testfun, enter a breakpoint when + entered and x (x can be an argument + to testfun) is less than 3. + (trace (testfun break t)) + Same, but breakpont at every + entry to testfun. + (trace (testfun entry (a b) exit (c))) + Trace input args and return value, + also print out the values of a and b + when testfun is entered and the value + of c when it is exited. + + The general syntax of trace invocations is (brackets are +indicating optional clauses, angle brackets are syntactic +variables): + + (trace ... ) + +where is either a function name to be traced +for only input args and return value, or + + ( [break ] [entry ()] + [exit ()]) + +There are other options documented in the MacLisp reference +manual. + + When a function is traced within Emacs (it is not +recommended to trace internal Lisp or Emacs primitives, and any +part of the redisplay should definitely not be traced in this +way), trace output for entry and exit tracings will be placed +(and scrolled) directly into the LDEBUG buffer if it is on +display; if it is not on display, this output will be put in the +LDEBUG buffer, AND local-display'ed as it is produced. +Note that the -- * * * * * * * * * -- of local displays will NOT +be produced, as it cannot be known when the "end" of trace +output has been reached. Thus, traced functions invoked from +the minibuffer may often leave the cursor in the minibuffer +awaiting clearing the local display via linefeed or ^L. + + Trace output generally looks like + + (3 enter testfun (3 5 (a . b)) /|/| (4 5)) + +The indentation level gives the depth in currently active +traced functions. The "3" is the recursion depth of the +given function (e.g., testfun) being traced. "enter" +is the type of trace (enter vs. exit), (3 5 (a . b)) +is the list of arguments (in this case, three arguments). +/|/| sets off the "entry values" and "exit values" +optionally selectable by the "entry" and "exit" keywords +in the trace-invoking form. Exit traces look like + + (3 exit testfun 17) + + If trace is used to set an entry breakpoint, the LDEBUG +buffer will be trapped to at the time the traced function is +entered, in a way very much like a Lisp error break to LDEBUG. +A message such as + + Entry breakpoint to function testfun + +will be "printed" into the LDEBUG buffer, and the terminal +feeped. As with LDEBUG code breaks, ESC G releases, ESC P +restarts, ESC R resets, and ESC ^S shows where the editor was +at the time the break was taken. When in entry breakpoints to +interpreted functions, the arguments may be inspected by name. +ESC-T may be used to trace the Lisp stack, but unless +*rset t mode was in effect (setting up an LDEBUG level does this +automatically), trace information may not be present. + + It is not necessary to have invoked ldebug before invoking +trace in Emacs; LDEBUG will be invoked automatically if an +attempt is made to use trace in Emacs. If some critical +mechanism is being debugged and normal trace handling (i.e., +breakpointing/tracing to user_i/o from Lisp, not the Emacs +handling just described is necessary, the variables +trace-printer and trace-break-fun should be made unbound (e.g., +ESC ESC makunbound 'trace-printer) before the first reference to +trace in a given invocation of Emacs. + +(END) + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/lisp-mode.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/lisp-mode.info new file mode 100644 index 0000000..67946f4 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/lisp-mode.info @@ -0,0 +1,242 @@ +09/14/78 -- Multics Emacs Lisp Mode. + Last updated 11/7/80 + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + Lisp mode facilitates the construction and editing of Lisp +programs in Multics Emacs. Commands for positioning over Lisp +expressions, and indenting and commenting Lisp code are available, +as well as commands to facilitate the testing of Lisp programs in the +Emacs environment. + + Lisp major mode is entered via the command + + ESC-X lisp-mode CR + +or by Find File'ing any file with a last component name of ".lisp" when +the find-file-set-modes option is selected. When in Lisp major mode, the +comment column is set to 50 (column 51), and the comment prefix to ";". +The normal comment commands, ESC-P, ESC-N, ESC-;, will act according to +these settings. If lisp-mode-hook is bound, it will be called. + + The following is the current command repertoire of Lisp mode: + +^I (TAB) indent-to-lisp + + On a blank or empty line, creates enough leading whitespace + so that the first S-expression typed on this line will line + up properly according to conventional Lisp indenting rules. + Normally, this means line it up with the start of the + previous S-expression, but in other circumstances other + actions may be taken. On a non-blank line, re-adjusts the + line's indentation to effect conventional Lisp indenting. + +ESC-Q lisp-indent-function + + Put point and mark around the current Lisp function (see + ESC-^A). For all lines other than the first, re-indent them + according to conventional Lisp indentation. + +ESC-^A begin-defun + + Move point to the beginning of the current "function". The + beginning of a function is defined as right before the last + open parenthesis at the left margin. + +ESC-^B backward-sexp + + Move backwards over exactly one balanced S-expression. All + comments, quoted strings, and slashified characters are + considered properly. Will abort (and beep) if unbalanced. + AVOID invoking this from inside comments or quoted strings. + Skips trailing open parens. Accepts numeric arg for + repetition count. + +ESC-^C compile-function + + Effects compilation and loading of the current Lisp function + via the Multics Lisp Compiler (lcp). Does this by loading lcp + into the Emacs environment (the first time it is used in an + Emacs invocation), utilizing it, and loadfiling the result. + Will automatically incorporate/compile the correct version of + e-macros.incl.lisp into your environment (the first time) as + well. Puts the name of the function compiled on the kill + stack, so it can be yanked into an ESC-ESC minibuffer for + trial. Displays compiler diagnostics as local display. Be + careful to WRITE OUT changes you make and debug via this + facility; this is a common trap: you see what you have in front + of you "working", and you think you are done. + + Forms ESC-^C'ed will be treated as though they had been + encountered at top level by the compiler; macro definitions, + declarations, and side-effects from compilation to compilation + are all handled correctly. Declarations, macro definitions, + and reader macro definitions other than those in + e-macros.incl.lisp must be ESC-^C'ed explicitly. Information + produced during any ESC-^C stays around for all future ESC-^C's + in an Emacs invocation: the regnant Emacs environment will be + used as the compile AND LOAD time environments. Thus, macro + and other definitions ESC-^Z'ed or ESC-ESC'ed are seen by the + compiler. + +ESC-^D down-list-level + + Go down one level of list structure. Basically the same as + looking forward for an open parenthesis, but it is + intelligent about Lisp comments, quotes, etc. + +ESC-^E end-defun + + Go to right after the last close-paren of the current + function. See "begin-defun" for a definition of the current + function. Useful to see if function balances parens + correctly. + +ESC-^F forward-sexp + + Skip forward over exactly one S-expression, positioning to + after the appropriate close parenthesis, or before the + appropriate whitespace. Accepts numeric arg for repetition + count. Skips leading close parens. Avoid invoking inside + quoted strings or comments. + +ESC-^H mark-defun + + Put point and mark around the current function. See + begin-defun for a definition of the current function. + +ESC-^K kill-sexp + + Kill one (or many) S-expressions forward, i.e., from point + to the point after that many complete S-expressions. + Argument is how many. Merges kills forward. + +ESC-^M (ESC-CR) lisp-cret-and-indent + + Identical to a CR (new-line) followed by indent-to-lisp; + this is the normal way to terminate an input line in Lisp + mode. It puts you on a new line and indents in correctly for + the next S-expression. Done in the middle of a line, breaks + the line at that point, correctly indenting the S-expression + which was to the right of point on the new line. + +ESC-^N forward-list + + Move to right after the end of current Lisp list. Basically + the same as searching for a close paren, but intelligent + about Lisp comments, quoting, etc. + +ESC-^P backward-list + + Move to right before the beginning of the current Lisp list. + Basically the same as searching backwards for an open paren, + but intelligent about Lisp comments, quoting, etc. + +ESC-^Q lisp-indent-region + + Re-indent all lines (other than the first) in the + point-to-mark region for conventional Lisp indentation. + +ESC-^R move-defun-to-screen-top + + Move the current function (see begin-defun for definition) to + the top of the current screen, leaving point at function + beginning. + +ESC-^T mark-sexp + + Set point and mark around the current S-expression. If point + is currently before the close paren of a list, set point and + mark around that list. If point is before whitespace, mark + the next S-expression. + +ESC-^V view-defun + + Print out current function: put point and mark around the + current Lisp function (see begin-defun for a definition), and + display it (print it out on printing terminals) as local + output. + +ESC-^Z eval-top-level-form + + Evaluates the current top level form and displays its value + in the minibuffer. A top level form has the same definition + as a function. (See begin-defun for the definition). Loads + the file "e-macros.incl.lisp" to ensure the presence of the + Emacs macros. (See extensions.info). This facility is + intended for use in debugging extensions, as is + compile-function, but will run your code interpreted rather + than compiled which aids in debugging. Be careful to WRITE + OUT changes you make and debug via this facility. + +ESC-( lisp-one-less-paren + + Removes one close parenthesis from the end of the last + S-expression prior to this line, and reindents this line. + Implements "This automatically-indented Lisp line is indented + one level too few. There must be an extra close paren on the + last line. Fix it and let's see." + +ESC-) lisp-one-more-paren + + Adds one close parenthesis to the end of the last S-expression + prior to this line, and reindents this line. Implements "This + automatically-indented Lisp line is indented one level too + many. There must be a missing close paren on the last line. + Fix it and let's see." + + + + The following extended commands invoked via ESC-X are available in +Lisp mode: + +eval-buffer + + Evaluates the contents of the buffer and displays the value + of the last form in the buffer via the minibuffer. Loads the + file "e-macros.incl.lisp" to insure the presence of the Emacs + macros. This command is used to "load" a buffer of Lisp code + into the Emacs environment for debugging. The + eval-top-level-form function (ESC-^Z) may then be used to + "re-load" any functions whose definition you change while + debugging. Be careful to WRITE OUT changes you make and + debug via these facilities. + + + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/macro-edit.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/macro-edit.info new file mode 100644 index 0000000..7314117 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/macro-edit.info @@ -0,0 +1,147 @@ +2/22/79 -- Macro edit mode. + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + +This package allows you to + 1) Get printed representations of all keyboard macros defined + in an environment into a buffer for + a) Editing them. + b) Re-defining them from the edited version + c) Writing them out to a file, for later + I) Dprintng + II) Getting those macros automatically defined in a later + invocation of Emacs. + +1. Getting printed representations of all your macros into a buffer. + + Make sure all your macros are hooked up to keys, or at least were at + some time given names, then, + + ESC-x edit-macros CR + + will put you in a buffer in "Macro Edit" mode with all the macros + defined in that buffer in editable form. + + a. Editing them. + +In Macro Edit mode, the following functions exist, on these keys: + +esc-^A macedit-find-beginning-of-macdef + + Move to the beginning of the current macro defintion. + +esc-^B macedit-backward-term + + Move backward one term in the keyboard macro. + +esc-^C macedit-compile-to-lisp + + Still under development, works a little bit, but impressive + even for the little bit it works. Compiles the macro being + pointed at into lisp. + +esc-^E macedit-find-end-of-macdef + + Move to the end of the current macro definition. + +esc-^F macedit-forward-term + + Move forward one term in the current macro definition. + +esc-^H macedit-mark-whole-macro + + Put point and mark around the macro definition. + +esc-^K macedit-kill-term + + Kill forward to the end of the current (or next) term in + the current macro definition. + +esc-^N macedit-forward-macdef + + Move forward to the beginning of the next macro definition. + +esc-^P macedit-backward-macdef + + Move backward to the beginning of the previous macro definition. + +esc-^S macedit-state-keyboard-macro + + Prompt for a key; place the definition of the keyboard macro on + that key into the buffer at the current point. + +b) Redefining them from the edited version: + +esc-^Z macedit-take-up-definition + + Take up into the editor, as a live definition, the current macro + definition being pointed at. Use this after editing a macro + definition to redefine it thusly. + + +ESC-X load-these-macros + + Accept all the macro definitions in the buffer, redefine them + all. + +c) Writing them out. + + Use ^x^w as normal, any file you want, but if it has the suffix + ".emacro", it will be automatically find-filed'd into Macro Edit + mode when it is next find-file'd. + +Macro language has PL/I like comments (/* comment... */). ESC-;, +ESC-P, and ESC-N do the right thing. The comment column is 51. +Quoted strings are double-quoted. Macro definitions look like + + macro foo-the-bar on ^q + ^S "bar" ESC ESC-# "foo" + end-macro foo-the-bar + +The "on ^q" is optional. If present, it will cause a set-perm-key +to that macro. + +The command + + ESC-X load-macrofile PATHNAME CR + +may be issued at any time to take up one of these macro files and define +all the keyboard macros in it. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/nl.changes.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/nl.changes.info new file mode 100644 index 0000000..e60c7a4 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/nl.changes.info @@ -0,0 +1,135 @@ +12/8/81 11.10 Further changes to Emacs newline handling. + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + +An incompatible change, generally deemed to be an improvement, was made to the +definitions of the "last line" and "end of the buffer" in Multics Emacs in +Release 9. The goal of these changes was to allow processing of files which +do not end in newline, which were not supported, and to allow searches to +search for embedded newlines. + +There is a potentially dangerous effect on extension code. This is discussed +later in this document. + +This change is felt to be a correction of an earlier design bug, a major +improvement in consistency of Emacs' character handling, and compatible with +the way TECO and other character-oriented tools process text. + +The essence of the change is to allow you to position your cursor BEYOND the +last newline of a file. Previously, you could not do this (Emacs would ^G at +you tried.) This means that if you had read in a file containing only three +lines (in 8.0 Emacs) + + First line + Second line + Third line + +each line ending in a newline, as is usual, doing an ESC-> would put you on the +FOURTH line of the window, under the T of "Third Line". If you then wrote this +file out, it would have been written out exactly as it was read in. + +(Previously, ESC-> would have gooten you after the word "line" of the line +that says "Third line", and it will would get written out as it had been read +in). + +If now (in the new scheme), you type #, the NL at the end of "Third line" will +be deleted, and the cursor will be left after the "line" of "Third line". +ESC-> will subsequently get you to this place. If you write the file out, in +the new scheme, it will be written out WITHOUT a trailing NL, and the cursor +will remain where it is. + +(This operation is impossible to describe or execute under the old scheme, +which is one of the reasons for implementing the new scheme). + +The substance of the change is as follows: Emacs previously REMOVED the last +newline of a file being read in, and ADDED an extra newline to a file being +written out. This behavior has been eliminated, nothing more and nothing +less. The original motivation for this behavior was to put you in a "Buffer +with one line in it" when you started, and prevent people from writing out +files that didn't end in newline. + +Deletion of newlines on input has been entirely eliminated. However, it was +felt that too many users would be confused if non-newline-ending files were +allowed (in addition, many system programs do not support files that do not +end in a newline). Therefore, there are two new options: + +(1) add-newline, when On, automatically adds a newline to the buffer when +writing it out ONLY when the buffer DOES NOT end in a newline. Default is +On. + +(2) check-newline, when On, asks the user whether or not he really wishes to +write out the buffer if it does not end in a newline. Default is Off. + +------------------------------------------------------------------------- + +Extension writers: This change does have a potentially significant effect on +all loops which process files line by line. "lastlinep" will continue to +respond to the last line of the BUFFER, which is to say, that line whose +newline cannot be gone past, that line whose newline will never be written +out, that line that, in an empty buffer is the only line. + +Suppose you have an extension that reads in some file, and does some +processing, line by line. It might have a loop: + + (go-to-beginning-of-buffer) + (do-forever + (process-stuff-on-this-line) + (if (lastlinep)(stop-doing)) + (next-line)) + +Previously, this worked. Now, it will attempt to (process-stuff-on-this-line) +on the line beyond the last newline of the file, if any file was +involved at all. This may well cause problems. Cases and coding +techniques that will NOT have problems: + + 1. Programs processing data they themselves generated, that + did NOT put a newline: this means most cases of programs + scanning program output today, if you think about it, because + the only REAL change we have perpetrated is in file reading + and writing. + + 2. Programs processing files they read in that look for things + and ignore blank lines. All programs that look at files + they read in should do this anyway, and be "suspicious" + of data read in in this fashion. + +Thus, we believe that most things will continue to work. Look +over all your code, and if it is in category (2), make it suspicious +and blank-line checking. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.changes.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.changes.info new file mode 100644 index 0000000..476054a --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.changes.info @@ -0,0 +1,250 @@ +05/15/80 Emacs PL/I Mode Changes + +The following changes have been made to Emacs pl1-mode and +electric-pl1-mode. + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + +1) New pl1-line-length option. +2) Setting pl1-mode options. +3) Enhancements for pl1dcl (ESC-^D) request. +4) New pl1-skip-to-dcl-column (ESC-SPACE) request. +5) New pl1-backward-statement (ESC-^A) and pl1-forward-statement + (ESC-^E) requests. +6) New pl1-comment-xxx requests. +7) Enhancements to pl1-comment-box (^XC) request. +8) New pl1-refill-comment-box-region (^ZC) request. +9) New pl1-line-between-procs (^ZD) request. +10) New pl1-include-file-comment-start-end (^ZI) request. +11) New pl1-compile-options option. + + +pl1-line-length option: +A new option called pl1-line-length controls the length of lines +generated by pl1dcl (ESC-^D) and several other requests. The line +length is specified in terms of column positions, with a default +length of 112 columns. + + +Setting pl1-mode options: +Several new options have been added. pl1-line-length is desribed +above, and others are described in the sections below. Use ESC-X opt +to list or set pl1-mode options. When in a pl1-mode buffer, setting +the value changes only the value for the current buffer. When not in +a pl1-mode buffer, setting the value changes the default value +associated with all new pl1-mode buffers. Setting these values in a +start_up.emacs segment sets the defaults for all pl1-mode buffers. + + +pl1dcl (ESC-^D): +The pl1dcl request has several new features. It uses the +get_entry_point_dcl_$emacs subroutine to get the declaration. This +subroutine first looks in one or more declaration files for the name +being declared. These files are listed in the "declare" or "dcl" +search paths, which can be set using add_search_paths, etc. Thus, the +user can define his own declaration files which override or add +declarations in the standard file without duplicating other entries in +the standard file. + + +If the name is not found in one of these declaration files, then an +attempt is made using object search rules to find the name. If the +name is a procedure entry point, its entry parameter descriptors +(compiled into the object segment itself) are used to create a +declaration. + + +The declaration is then formatted according to a new pl1-mode option +called pl1-dcl-style. This option can have the following values. + + +0 no formatting is performed. The declaration appears on a single + line with one space between tokens. + +1 formatting similar to that of the indent command. It assumes that + the word "dcl" is in column 1, followed by 2 spaces and the + name. Lines longer than pl1-line-length are folded, being + continued from column 11. + + +2 formatting similar to the experimental format_pl1 command with + indattr mode. It assumes that dcl is located somewhere between + columns 1 and 10, and that the name is in column 11. The + declaration begins in pl1-dcl-column (a new options). Lines longer + than pl1-line-length are folded, being continued from + pl1-dcl-column+5. + +The default value for pl1-dcl-style is 1. + + +Entries in the declaration files have one of two forms. Standard +declarations begin with a name followed by the attributes to be +associated with that name. Folding can occur after any comma (or +after whitespace if no commas are found). No trailing punctuation +should be given. For example: + +ioa_ entry options(variable) +cu_$arg_ptr entry (fixed bin, ptr, fixed bin(21), fixed bin(35)) +iox_$user_output ptr ext static +code fixed bin(35) + + +A second form declares abbreviations to be used in typing PL/I +programs. They have the form + +name ==> abbrev_value + +When ESC-^D is used with such a name, the name is REPLACED by the +abbrev_value. No reformatting occurs. Typical abbreviations might be: + +es ==> ext static +esi ==> ext static init( +fb ==> fixed bin +is ==> int static +isi ==> int static init( +isoc ==> int static options(constant) +isoci ==> int static options(constant) init( + + +pl1-skip-to-dcl-column (ESC-SPACE): +This new request moves the cursor to the column specified by the +pl1-dcl-column option. If the statement already extends beyond this +column, the cursor is moved to the pl1-dcl-column on a new line +following the current line. This request is useful for indenting +attributes in declare statements when ESC-^D cannot be used and +pl1-dcl-style = 2. + + +pl1-backward-statement (ESC-^A), pl1-forward-statement (ESC-^E): +Two new requests move forward and backward in increments of PL/I +statements. Both take a numeric argument to indicate how many +statements to move over. + + +pl1-comment-xxx requests: +A new option pl1-comment-style controls how comments are handled when +text extends into the pl1-comment-column (another new option). The +pl1-comment-column defaults to column 61. If text extends beyond the +comment column when one of the line comment requests is given, then +the placement of the comment depends upon the pl1-comment-style. + + +pl1-comment-style can have the following values. + +1 Comment is place on the current line following the text. + +2 If text extends beyond pl1-commnt-column + pl1-comment-column-delta + (a new option), then the comment is placed on a new line below the + current line. Otherwise, it is placed on the current line. The + default value of pl1-comment-column-delta is 10. + +3 Comment is placed on a new line following the current line. + +The default value for pl1-comment-style is 1. + + +The following comment requests observe pl1-comment-style. + +ESC-; pl1-comment-current-line +ESC-N pl1-comment-next-line +ESC-P pl1-comment-prev-line + +ESC-N and ESC-P take a numeric argument to indicate how many lines +forward or backward the cursor should move before commenting the line. + + +A new pl1-comment-end (ESC-*) request moves the cursor to the end of +the line (according to the pl1-line-length option) and places a +comment suffix (*/) at the end of a comment line. + + +pl1-comment-box (^XC): +This request has been significantly enhanced. When a new comment box +is created, fill-mode is entered to facilitate typing of prose text. +The pl1-line-length is used to control the filling of comment lines. +When a subsequent (^XC) is entered to exit comment minor-mode, the +comment box is completed by placing comment-suffix (*/) at the ends of +all box lines. + + +Fill-mode can be exited and re-entered during the creation of a +comment box using + ESC-X filloff + ESC-X fillon + + +If (^XC) is typed to enter comment minor-mode while the cursor is +positioned inside an existing comment box, then new comment lines are +inserted above the line on which the cursor is positioned. Filling +occurs for only the new lines. The old lines remain unchanged. + + +pl1-refill-comment-box-region (^ZC): +This new request complements the enhancements made to the +pl1-comment-box request. It refills the comment box lines between +(and including) the lines containing the cursor and the-mark. + + +pl1-line-between-procs (^ZD): +This new request generates a dividing line between major blocks of +code in a PL/I program to provide visual separation of the code. A +line of the form: + +/* * * * * * .... * */ + +which extends through the pl1-line-length column. If the cursor is +positioned at the beginning of a dividing line, ^ZD causes a new +divider plus a newpage to be inserted. Similarly, ^U^ZD causes a +divider, a new page and another divider to be inserted. + + +pl1-include-file-comment-start-end (^ZI): +This new request generates a starting and ending comment line for PL/I +include files. The lines have the form: + +/* START OF: xxx.incl.pl1 * * * */ + +/* END OF: xxx.incl.pl1 * * * */ + + +New pl1-compile-options option: +The pl1-compile-options option can be set to specify the default +compilation options used by ESC-^C to compile the program. The +default compiler option is "-table". + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.info new file mode 100644 index 0000000..89fe232 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/pl1-mode.info @@ -0,0 +1,142 @@ +4/11/79 - Multics Emacs PL/I mode + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + +PL/I mode provides an automatic assistance in PL/I progam formatting in the +real-time editing context of Multics EMACS. The basic facility provided at +this time is that of lining up untyped PL/I statements, although on a +one-for-one basis it will line up typed ones, too. + + Enter PL/I mode by issueing ESC-Xpl1-mode. It will take a couple of +seconds to "load itself". When in PL/I mode, which shows up on the Mode line +as "PL/I" as a major mode, the following non-default key bindings apply: + + TAB (^I) Indent this PL/I statement properly (if not yet + typed in, tab out to it; otherwise, readjust its + indentation properly). + ESC-CR (ESC-^M) Like CR and TAB. + ESC-^C Compile buffer. Write this buffer to its default pathname + and compile it, using the compiler "pl1" and assuming + "-tb" for options. These may be changed with the + extended commands set-compiler and set-compile-options. + Highly effective in two-window mode. + (See fortran-mode.info for more on this). + ESC-^D Try to find a declaration for the entry-point whose + name is to the left of the cursor, and insert it. + There exists a library of such. + If the declaration is not in the library, + ESC-^D will attempt to figure it out from inbound + parameter descriptors in an object segment + responding to that name. + error_table_$xxx can be declared by ESC-^D, too. + ESC-^H (ESC-Backspace) Delete 5 columns of indentation. + Intended for undenting END's. + ESC-^I (ESC-TAB) Add 5 columns of indentation. + Intended for asserting your own style. + ^X^D (Control X-Control D) Find next error. When used after + an ESC-^C, will search for errors and place the cursor + on them in the source. Highly effective in two window + mode. See fortran-mode.info for more information on + the compilation error facility. + ^XC (Control X-C) Start or end a comment. Text following + this will be set off as a comment. A second ^XC ends + the comment. + + All the standard commentation commands (ESC-;, etc.) do the PL/I + thing. Word commands (ESC-F, etc.) in PL/I mode buffers consider + the dollar sign to be part of a word. + + The indentation rules which are followed are such: + + Any fragment of an incomplete statement gets lined up 5 after the +start of that statement. The statement after a DO or BEGIN gets indented 5 +times one less than the number of IF's in the DO or BEGIN. In "inding style +2", the statement after an END gets lined up 5 LESS than the END statement; +the first statement in a program gets lined up at col. 11 (Multics +reckoning). OTHERWISE, each statement lines up with the previous one. + + There are two styles available; the default is 1, you can get 2 by saying + ESC-Xopt pl1-inding-style 2 CR + +(i.e., it is managed by the EMACS option mechanism). + + In style 1, you get; + + if x = 6 then do; + bar = 5; + foo = 6; + end; + +In style 1, you are expected to line the END up yourself (use ESC-^H) because +it is impossible in realtime to predict that an untyped statement is going to +be an END. You must undent the end yourself, because the next statement will +line up with it. + + In style 2 you get + + if x = 6 then do; + bar = 5; + foo = 4; + end; + next = 17; + +Obviously, emacs is happier with this, because it can figure out the next +statement after the END once you have typed it. + + There are no known bugs in the mode's PL/I parsing: it pretentiously +claims to be able to parse any legal PL/I statement, with the following +exception: Multi-dimensional label constants not supported (not a big +problem, multics PL/I doesnt support them either). + + There is also a minor mode called "electric PL/I mode", which can be +obtained by ESC-Xelectric-modeCR once in PL/I mode, or ESC-X electric-pl1-mode +CR. To get it by default as your mode for PL/I programs, put the statement + + (defprop pl1 electric-pl1-mode suffix-mode) + +in your start_up.emacs. Some users have found electric PL/I mode overly +violent, so it remains an option. It connects semicolon to a function which +automatically indents for the next statement after inserting a semicolon; use +\; to get a semi in without the electric action. Also, this action is +suppressed if there is a next line, and it is not empty. The "electric +semicolon" also moves "end"'s back for you (in inding-style 1), when you type +the ";" of the "end" statement. (Be careful to "\" ;'s in strings, there are +problems there). Electric PL/I mode also gives ":" electric action, i.e., +indenting after labels. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/rmail.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/rmail.info new file mode 100644 index 0000000..c8efec6 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/rmail.info @@ -0,0 +1,266 @@ +10/19/80 RMAIL- Emacs mail reading/sending subsytem + + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command ** + + + + + + The Emacs mail system provides a facility for reading, sending, and +responding to Multics mail within Emacs, utilizing the standard Emacs features +and the interfaces of the Multics mail system. Known deficiencies/misfeatures +will be detailed below. RMAIL is modeled after ITS RMAIL. + + ------------------------------ ------------------------------ + + There are two basic functions, sending mail and reading mail. The Emacs +command for sending mail is + + ^XM send-mail + +Issuing this command will prompt for a "Subject", which should be supplied, +terminated by a carriage return. This subject will be incorporated into the +buffer name, so it should be short. A buffer will be formatted up with the +mail in it, header prefabricated. The buffer will be placed in an available +window (like ^X^E (comout) does). Fill mode will be turned on with a fill +column of 72. The buffer is now in MAIL mode, which defines the following +commands: + + ^XA mail-append. Go to the end of the body of the mail. Use this to + start inputting the text after you have set the destination, or + to go back to the text after editing some header field. + + ^XT mail-to. Go to the end of the "To:" line, to add a recipient. + You will be left here when the MAIL buffer is entered, to enter + the first recipient. Then use ^XA to continue. Separate + recipients (like all header fields) with commas, i.e., + + To: Washington.States, Consultant.c + + ^XF mail-from. Go to the end of the "From:" line, to edit it, or + add more sender's names. + + ^XJ mail-subject. Go to the end of the "Subject:" line, to edit it. + + ^XC mail-cc. Go to the end of the "Cc:" (carbon copy recipients) + line, making one if there is none, so that you can type in the + destination of a carbon copy recipient. + + ^XY mail-reply-to. Generate a "Reply-To" field, if none exists, + and go to it. The destination put here will be used for replies + if a recipient of your mail uses RMAIL (or another mail system) to + automatically reply to your message. + + ^X^S send-the-mail. Send the buffer to the recipients specified in the + header. The relative success of the sendings will be displayed as + local output (2 linefeeds to restore display). + + ESC-^F forward-mail-field. Move forward one recipient, cc recipient, etc. + on this (header) line. Circles around at end. + + ESC-^B backward-mail-field. Move backward one recipient, cc recipient, + etc. on this (header) line. Circles around at end. + + ESC-^D delete-mail-field. Delete, including necessary commas, the + single header item (recipient, etc.) that the cursor is on. + + ^XL rmail-logger-append. Log the message into a file, placing it at + the end, separated by a formfeed. With an argument, or the first + time, the pathname of the log file is prompted for. Otherwise, + the same file last used by ^XL or ^XP is used. + + ^XP rmail-logger-append. Same as ^XL, but puts message at the front + of the file. + + Three forms of recipient (or cc recipient) destinations are accepted: + + Jones.States (standard Multics person.project) + Jones (link mailbox in Daemon mailbox dir) + Mxyptlk at KRYPTON-KL10 (ARPANET address, PERSON at SITE) + + Parenthetical comments in destinations are ignored, thus: + + Muhammad (I am the Greatest) Ali at (the) WBA + +gets set to "Muhammad Ali" at Site WBA, as per RFC 733. Quote processing +is done, too, and a field between <> brackets makes all outside it +(in a given address) a comment (as per RFC 733, which is visible +on Multics as mail_format.gi.info). + + Net mail sending is done via the Network Mailer Daemon; net connect +access is NOT required; you should be prepared for an acknowledgement message +from the Mailer Daemon. + + Your name will be given as + + From: Destructo.CHAOS + +or, if this site is on the ARPANET + + From: Destructo.CHAOS at RANDUM-MULTIX + +If RMAIL knows your real name, you will get + + From: Myron P. Destructo + +RMAIL knows your name if either your site Emacs expert has placed it in the +"rmail-full-name-table" in the "emacs environment directory" (see him or her +about this) or if you have a form setting "my-personal-name" in your startup, +e.g., + + (setq my-personal-name "Myron P. Destructo") + + If the Lisp variable "mail-mode-hook" is bound by the user, the atomic +symbol to which it is bound will be called as a function with no arguments +whenever a mail-mode buffer is created. This be used to set mail-mode key +bindings. + + ------------------------------ ------------------------------ + + Mail reading is performed via the command + + ^XR rmail + +By default, mail is read in your personal default mailbox, +>udd>your-project>you>you.mbx. If ^XR is given an argument, e.g., ^U^XR, the +"mailbox name" is prompted for. This may take any of the forms + + Person.Project + (with or without ".mbx" suffix) + Person (if a link to Person.mbx exists in the ARPANET + mailbox link directory) + +If you have no mail in the selected mailbox, a message will be issued to this +effect. Otherwise, the first message in the mailbox will be displayed in a +buffer, in RMAIL mode. This buffer is read-only; the following extra +commands (all normal commands are here too) apply in RMAIL mode: NB: these +are mostly NOT control characters, but regular characters!: (note also +that numeric araguments may be typed directly, e.g., 3 g to go +to message 3, without ESC or ^U): + + + n Move on to the next message. + p Move back to the previous message. + l Move to the last message in your mailbox. + g Move to message number (argument), i.e., + 3 g to go to message # 3. + j Same as g. + d Delete (i.e., queue for deletion when rmail is exited) + this message, move on to next undeleted message. + D Same as d, but moves backward. + u Undelete the last (stacked) deleted message. + c Copy the message to some other mailbox. A mailbox name will + be prompted for; anything acceptable to ^XR (as above) is ok. + q Quit out of rmail, returning to buffer from which + rmail was invoked, deleting all messages marked for + deletion. + s Summarize (as local output) all undeleted messages. + May take a little time for full mailboxes. + ^XL Log the message to an ASCII file, at the end of the file. + See the description above under the mail-sending commands. + ^XP Same as ^XL, but "prepends" to the front. See the description + above under mail-sending commands. + + m Send mail, not necessarily a reply (see r). Indentical to + ^XM, send-mail, but ESC-^Y, ^X^Q and ^X^S are defined as below + for the r command, for convenience while RMAIL'ing. + + r Reply to sender, via MAIL mode. Formats up a MAIL mode buffer to + reply to the current message, copying the subject (if any), or + making one up, and setting up as a destination the sender's address + that he/she would like to be responded to at. With a numeric + argument, i.e, 1r, responds to other recipients as well: + we do not do so by default. This command is EXTREMELY effective + in 2-window mode, in which case the response will be put in the + other window, and ESC-^V (page-other-window) may be used to "page" + the letter you are responding to as you respond. When in RMAIL + reply mode, (variant of MAIL mode set up for this purpose), the + following three ADDITIONAL commands apply, other than the normal MAIL + mode commands and the standard Emacs commands: + + ESC-^Y rmail-yank-mail + + Yanks the text and header of the original piece of + mail being responded to, indented, by default, by + 4 (opt rmail-original-yank-indent controls this number). + + ^X^Q return-to-rmail + + returns to RMAIL, and its window without sending the + message. + + ^X^S send-from-rmail + + Actually sends the reply, and returns to RMAIL and its + window. + + + + + It is important to quit (q) out of RMAIL before leaving Emacs; Messages +do not actually get deleted unless you quit out of RMAIL (or, equivalently, +answer "yes" to "All messages deleted. Quit RMAIL?"). + + If the Lisp variable "rmail-mode-hook" is bound by the user, +the atomic symbol to which it is bound will be called as a function with +no arguments before the first message is displayed. This can +be used to set RMAIL-mode key bindings. + + ------------------------------ ------------------------------ +People who receive a lot of mail from a lot of people and or +ARPAnet sites may want to set the variable "rmail-names-for-me" +in their startup. This variable is set to a list of valid +addresses which should NOT be included among recipients of any +piece of mail generated by rmail-reply with an argument. +This is to prevent sending yourself mail. Project names of +"*" as well as host names of "*" are permitted. + + Example: + (setq rmail-names-for-me + '("bsg.*" "Greenberg.*" "BSG1.*" "Greenb1 @ Foo-Unix" + "BSG @ *")) + +By default, rmail-reply will suppress responding the the same +name as would be put in the From field by send-mail (^XM). +---------------------------------------------------------------------- + Current lossages, deficiencies, and unimplementeds (3/17/79) + +1. We don't send mail acknowledgements. + +2. We currently have no facility for forwarding mail. + + (END) + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/sample_start_up.emacs.lisp b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/sample_start_up.emacs.lisp new file mode 100644 index 0000000..166c4bd --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/sample_start_up.emacs.lisp @@ -0,0 +1,52 @@ +;;; +;;; Sample start_up.emacs, Lisp source +;;; Must be compiled to get start_up.emacs +;;; Last modified 10/16/80 + +(declare (special rmail-mode-hook my-personal-name)) ;Global variables + +(defun Jones/'s-start-up () ;Compilation => efficiency + (opt 'find-file-set-modes 'on) ;foo.pl1 => pl1 mode, etc. + (setq rmail-mode-hook 'Jones-rmail-mode-hook) + ;Like to read msgs backwards + (accept-messages) ;Accept console messages + (opt 'suppress-backspace-display 'on) ; _\010A => _A + (setq my-personal-name "Harvey B. Jones")) ;For RMAIL + +(defun Jones-rmail-mode-hook ()(setq rmail-msgx rmail-msgcount)) + +(Jones/'s-start-up) +;; +;; +;; +;; ----------------------------------------------------------- +;; +;; +;; Historical Background +;; +;; This edition of the Multics software materials and documentation is provided and donated +;; to Massachusetts Institute of Technology by Group Bull including Bull HN Information Systems Inc. +;; as a contribution to computer science knowledge. +;; This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +;; Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell Bull Inc., Groupe Bull +;; and Bull HN Information Systems Inc. to the development of this operating system. +;; Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +;; renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +;; of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +;; for managing computer hardware properly and for executing programs. Many subsequent operating systems +;; incorporated Multics principles. +;; Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +;; as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . +;; +;; ----------------------------------------------------------- +;; +;; Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +;; fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +;; and that both the copyright notice and historical background and this permission notice appear in supporting +;; documentation, and that the names of MIT, HIS, Bull or Bull HN not be used in advertising or publicity pertaining +;; to distribution of the programs without specific prior written permission. +;; Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. +;; Copyright 2006 by Bull HN Information Systems Inc. +;; Copyright 2006 by Bull SAS +;; All Rights Reserved +;; \ No newline at end of file diff --git a/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/windows.info b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/windows.info new file mode 100644 index 0000000..5262e04 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/doc/subsystem/emacs/windows.info @@ -0,0 +1,356 @@ +4/16/79 -- Information on new window and buffer management system + in Multics Emacs. (Last update 11/4/79) + +**This file is intended to be perused via dprint, print, or via an** +**editor. It is not intended to be perused with the help command** + + + + + + The latest version of Multics Emacs contains a new "menu"-type scheme to +manipulate buffers and windows, and supports as many windows as can be fit on +the screen without any window going to less than 3 lines. + + First, some definitions: + + o buffer - a body of text in Emacs identified by a buffer + name. This concept has not changed. + + o window - an area of the screen delimited by "boundary lines" + (lines of "-----"), the top of the screen, or the modeline. + A window is said to be displaying a buffer if the text of that + buffer can be seen in that window. + + o "on display in" - a buffer is on display in a given window + if the text of that buffer can be seen in that window. + + o topline - the boundary line on the top of a window. + The uppermost window has no topline. + + o bottomline - the boundary line on the bottom of a window. + The bottom-most window has no bottomline. + + o Selected window - the window in which the cursor now appears + (when not in the minibuffer). + + o Current buffer - the buffer on display in the selected window. + The modeline gives the name of the current buffer. + + o LRU window - the least-recently used window, i.e., the + window which has been the selected window least recently. + + o Previous window - the next-most recently used window other than the + selected window itself. The selected window is always the + most recently used. + + + There are several basic techniques for manipulating windows. The simple +keyboard commands ^XO, ^X0, ^X1, ^X2, ^X3, and ^X4 may be used to create, +destroy, and select windows in a manner roughly analogous to the old use +of ^XO, ^X1, ^X2, and ^X3. At low speed, this may be the only convenient way. +Alternatively, the "window editor" may be used. The window editor, invoked by +^Z^W, puts up a display of the numbers, positions, sizes, and contents of all +extant windows, and allows destruction, selection, and size-adjustment of +windows by positioning to the line describing the window to be dealt with and +issuing commands. + + First we describe the simple keyboard commands, beginning with the ones +which had been used previously: + + ^X2 creates a new window on the screen, and selects that window. If there + was only one window on the screen, this is the same as it had been + before. If there are any number of windows on the screen, ^X2 will make + one more, and select it. The buffer placed on display in that window + will be one whose name is constructed as "Window ## Default" (where ## + is the window number, the top one being window 1), no longer + "alternate". Arguments may no longer be used to ^X2 to specify the top + window size; the window editor must be used for this purpose. + + ^X3 Creates a new window at the bottom of the screen, but keeps the + currently selected window selected. The name of the buffer placed in + that window is constructed as described above. The new window becomes + the LRU window, so ^X4 ^X^E (command) CR will put file output in a new + window (see below). Note that if there is only one window on the screen + this is compatible with what it had done before. Again, arguments are + ignored. + + ^X1 Gets rid of all windows except the currently selected window, which then + grows to occupy the whole screen. This is compatible with what it did + before. Getting rid of a window does NOT mean getting rid of the text + or buffer which is on display in that window, it just means taking the + window off the screen. + + ^XO Selects the previous window, which is the window you had last been in + before you were in this window. Note that this makes the window you + issue the ^XO in the previous window, so successive ^XO's will switch + windows back and forth like it has always done. Selecting a window, of + course, may potentially (and usually does) switch buffers, too. The + modeline always tells you what buffer is current, the cursor tells you + what window is selected. + + The following two new commands augment the repertoire of the above: + + ^X0 (control x zero, as opposed to control x "oh".) Removes the selected + window from the screen, giving the space it occupied to the windows + that were on either side of it. The previous window will become + the new selected window. With an argument, deletes the specified + window (the top window is number 1). + + ^X4 Selects the LRU window. The idea of this is to implement "Get me a + window I haven't looked at recently for the thing I'm about to do + (such as a ^XB or ^X^F)". You would want to do this if you had + several (at least 2) windows on the screen, cared about some of them, + didn't care about some other of them, and wanted to find one you didn't + care about to do some new thing in. + + Note that selecting the LRU window makes it the MOST recently used + (i.e., selected). So some other window is now LRU, and another ^X4 will + select _t_h_a_t window. Thus, successive ^X4's (or ^X4 ^C ^C ...) + will cycle through all windows on the screen. + + Several Emacs commands always switch into a new buffer to present +their goods, and leave you in it. For example, the directory editor, ^X^E +(comout), which leaves you in file_output, and RMAIL (both inbound and +outbound). Some of these commands (and this is surely an area for debate) +think they know that what you ask of them is not what you are "really doing". +For instance, send-mail (^XM) believes that when you wish to send mail, it is +on a spur-of-the-moment impulse, and you wish to keep what you were doing on +the screen. Similarly, comout (^X^E) believes that you are looking at +file_output just to see how the "results" of your editing suceeded, and you do +not wish to obliterate what you are editing from the screen. + + These commands perform what is called a "find buffer in window" (which, +incidentally, is available to the extension programmer by that name with +hyphens in it). What this means is that if the buffer they wish to go +to/display (e.g., "file_output" for ^X^E (comout)) is already on display in +some window, they will select that window. If the buffer is not on display, +they will select the LRU window in which to _p_u_t it on display, and so do. The +directory editor will put its "examine" buffer on display with a "find buffer +in window", replacing the content of the LRU window if its examine buffer is +not already on display. Ditto the RMAIL reply buffer. + + -------------------------------------------------- + + The window editor provides an interactive way to manipulate windows in an +integrated fashion, allowing the screen to be conveniently reorganized. The +window editor puts a formatted display in a dedicated buffer, which will +appear on the screen, in the selected window. ^Z^W causes this to happen. If +you want it to do a find-buffer-in-window on itself (e.g., you want to see the +effect of reorganizing the screen on the material in the selected window), +give it an argument, i.e., ^U^Z^W. A typical window editor display looks like +this: + + 1 0 0 12 term-paper appear on + 2* 2 13 3 WINDOWSTAT 2* + 3 4 17 2 Messages from COMSAT + +Each line speaks of the contents of one window on the screen at the time +the window editor was entered. There are as many lines as there are windows. +You may not use normal Emacs commands to change the content of the display; it +is read-only. You may, however, use normal Emacs commands (e.g., searches, +etc.) to position around in it. The cursor, when in the window-editor's +buffer, is always on some line of the buffer (beware, the buffer may be larger +than the window it is in, like most Emacs buffers!). That line speaks of some +window; the window's window-number from the top of the screen is the first +number on that line. The window designated by the line on which the cursor is +will be called the "designated window (do not confuse this with the selected +window, which will always be the window containing the window editor's +display). + + The window number will be followed by a star for the window that was the +selected window at the time the window editor was entered. The next number +on each line is called the "internal window number", and is usually not of +interest. The remaining two numbers on each line are the position and size of +each window, the position being the starting line-number on the screen (the +top line is 0) and the number of lines in it. + + Following the position and size is the buffer name of the buffer +currently on display in that window. Following the buffer name are the first +ten characters of the "point line" in that window. The "point line" is the +line in the window that the cursor will go to if that window is selected. + + One operates the window editor by invoking it, positioning to some line, +thus designating some window, and issuing commands to affect that window. +The following requests are recognized: note that they are "printing" (i.e., not +control) characters, for ease of typing, since you may not enter text into a +read-only buffer (like that of the window-editor or DIRED). They are: + + g Go to, or select that window, leaving the window editor, and + moving the cursor to that window. given window in a many-window + situation, as opposed to a large number of ^X4's. + + f same as g, for compatibility with the buffer editor. + + k Kill, i.e., remove this window from the screen. This will be done + immediately, and the buffer editor display will be updated to + reflect the new screen layout. The space occupied by that window + will be distributed among its neighbors. + + d same as k, for DIRED compatibility. + + ^ (think of the shape of this character, "pushing up"). Move the + topline of the designated window up by one, increasing the size + of this window, and deducting one from its upstairs neighbor. + With a numeric argument, do that many lines instead of one. + The buffer editor display will be updated to reflect the new + screen layout. + + v (think of the shape of this character, "pushing down".) Moves the + bottomline of the designated window down. Same rules and features + as ^. + + a (think of the shape of a capital A). Bring the topline of this + window down, same rules and features as ^. + + u (think of the shape of a U). Pull the bottomline of this window + up, same rules and features as ^. + + The following requests do not deal with the designated window, and may be +issued at any time in the window editor: + + n Go to the next line of the window editor display. Although you + could use ^N as always, n is easier here, since this is a read-only + buffer. If on the last line, goes to the first. + + p Same rationale and idea as n, except goes to the previous line (or + the last if issued on the first). + + b Exits the window editor by entering the buffer editor in the + window now occupied by the window editor's display. + + c Creates a new window (like ^X3), except leaves you in the + window editor's display, with the display updated to reflect the + new state of the screen, with the new window as designated window. + + 3 Same as c, for mnemonic ease with ^X3. + + The window editor is normally exited by selecting some other window with +the "g" request; indeed, one may often enter the window editor for no other +reason than to do this! Once can also exit via the "b" request to the buffer +editor, or just ^XB or ^X^F of whatever one normally does to go wherever one +wants to go. Beware of window editor windows left lying around on the screen: +while attractive and interesting, they are NOT updated dynamically by Emacs +if windows and buffers are changed around. + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + The buffer editor provides a facility for cleaning out, examining, and +selecting buffers, similar to DIRED and the window editor. Like both of these +other menu-type editors, the buffer editor creates a read-only display in a +special buffer, and selects it in a window of your choice. Again as with these +others, printing-character requests are use to select options to deal with the +buffer whose name appears on the line with the cursor on it. + + The buffer editor is entered via ^Z^B. It will put its display in the +window in which it was invoked. If you want it to find-buffer-in-window itself +(e.g., it is on the screen already, or you don't want to overwrite the current +window), do a ^U^Z^B. + + Each line of the buffer-editor's display contains a buffer's name, a +pathname, if the buffer has a pathname associated with it, and possible flags. +The flags appear at the left margin, and they are: + + * The buffer is "modified" (needs writing out) + > The buffer that was current when the buffer editor was entered. + X The buffer editor has marked this buffer for deletion. + + There may be more buffers (i.e., lines in the buffer editor's display) +than are on display in the window in which this display appears; like any +other Emacs buffer on display, ^V, ESC-V, or any other standard Emacs +technique may be used to position around in it. + + Buffers may be killed (as ^XK normally does) with the buffer editor +"k" (or "d") request. Buffers so killed are not actually destroyed until the +buffer editor is exited via a g, w, f, q (or ^X^Q) request, at which time you +will be asked (if you have marked buffers for deletion) if you really want to +delete them (they will be listed as local display). + + The following requests are known to the buffer editor: + + n Go to next line (see window editor's similar request for the + rationale for this ^N substitute) or first if now on last. + + p Go to previous line (or last if now on first). + + k Mark the designated buffer for deletion when the buffer editor + is exited, move to the next line. + + d same as k, for DIRED compatibility. + + u Undelete, i.e., unmark for deletion, the designated buffer. + The X will be removed from the display, and the cursor will + be positioned to the next line. + + e Examine the designated buffer. In one-window mode, this is + kind of worthless, you should just go there. But with two or more + windows, a find-buffer-in-window is done on the designated buffer, + putting it on display if not already on display. A message will + be printed in the minibuffer about where (in what window) it + appears. + + These next requests cause the buffer editor to be exited: you will be + interrogated about pending deletions if you have any: + + g Go to the designated buffer, exiting the buffer editor, replacing + its display in the current (selected) window, with this buffer. + This is just like doing a ^XB: as matter of fact, the buffer editor + may be used for just seeing what buffers there are and going to + one, to save typing! This may also be useful for buffers with + long and complex names, like "Messages from Brzezinski". + + f Find-buffer-in-window the designated buffer. Since the buffer + editor makes its own window LRU when it exits, if you "f" + a buffer not currently on display in any window, it is the same + as "g"ing it, replacing the buffer editor's window. + + However, if the designated buffer is on the screen somewhere, the + cursor will simply be moved into that window (and thus, into + that buffer). If you use multiple windows, you will find that you + will use "f" all the time, and will rarely use "g". + + s Writes out, i.e., saves the designated buffer to its default + pathname, unmarking it as modified. + + w Exit the buffer editor to the window editor in the current window. + + q Exit the buffer editor to the buffer from which it was invoked, in + the current window, if it was invoked via ^Z^W, or find-buffer-in-window + the buffer from which you came if the buffer editor was invoked + by beargumented ^Z^B, i.e., was find-buffered-in-windowed + itself. + + ^X^Q Same as q. + + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL +and BULL HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture +for managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by BULL HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_ctls_.s.archive b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_ctls_.s.archive new file mode 100644 index 0000000000000000000000000000000000000000..dba45cac851293701f6eb580ed2ac6fe5f0e05ed GIT binary patch literal 244888 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%0Delhi{tMjZkymZK1QzRpD_I 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≠x!+K%%7<5 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 UA7J8NQq7sdIRyFlf!q222Q&(Un*aa+ literal 0 HcmV?d00001 diff --git a/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_full_.s.archive b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_full_.s.archive new file mode 100644 index 0000000..d7720d7 --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_full_.s.archive @@ -0,0 +1,1860 @@ + + + + + e_macops_.lisp 03/25/87 1031.0rew 03/25/87 1028.9 509922 + + + +;;; *********************************************************** +;;; * * +;;; * Copyright, (C) Honeywell Information Systems Inc., 1982 * +;;; * * +;;; * Copyright (c) 1978 by Massachusetts Institute of * +;;; * Technology and Honeywell Information Systems, Inc. * +;;; * * +;;; *********************************************************** + +;;; +;;; +;;; EMACS extended functions +;;; BSG, archy, GMP, RSL, RMSoley, etc +;;; +;;; How about some journalization: + +;;; HISTORY COMMENTS: +;;; 1) change(84-01-30,Margolin), approve(), audit(), +;;; install(86-08-20,MR12.0-1136): +;;; pre-hcom history: +;;; Modified: June 1982 by Barmar - to install JSL's new string-search +;;; and global-print commands, using all his new hairy +;;; defcom features. +;;; Modified: 31 August 1982 by Barmar - to move query-replace here from +;;; emacs-extended-searches. +;;; Modified: 1 November 1983 by Barmar - to fix replace to not fill up the +;;; kill-ring with the old string, and fix replace and query-replace +;;; to use backward-char instead of reverse-search. +;;; Modified: 25 November 1983 by Barmar - to fix the read-only bug in +;;; word-operator, also converting macros to defmacro. +;;; Modified: ?? January 1984 by Barmar - to rewrite underlining code. +;;; 2) change(84-12-25,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; to move iox_$control out to e_defpl1_.lisp, changed lambda into let. +;;; 3) change(84-12-30,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; to move fillon, fill-mode-off, and +;;; filloff to e_basic_, with fill-mode; changed speedtype to +;;; interact with previous key bindings better. +;;; 4) change(84-12-31,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; change comout-get-output to check +;;; read-only-flag, add unwind-protect to comout, comout-get-output, +;;; and eval-multics-command-line; move reset_more +;;; from comout-command to eval-multics-command-line; changed +;;; comout-get-output to use "file_output -truncate" rather than +;;; calling hcs_$set_bc. +;;; 5) change(85-01-27,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; add some *expr declarations. +;;; 6) change(85-02-03,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; changed speedtype to special-case +;;; CR, rather than expecting it to be in fill-mode-delimiters. +;;; 7) change(85-02-24,Margolin), approve(87-01-27,MCR7607), +;;; audit(87-02-13,RBarstad), install(87-03-25,MR12.1-1014): +;;; added comout-to-buffer, changed comout to use it. Added +;;; (%include defun), and changed comout to use &rest. Changed +;;; comout-command to turn off read-only-flag (with a warning in the +;;; prompt), added comout-command-to-buffer. +;;; 8) change(86-11-22,Margolin), approve(87-01-27,MCR7607), +;;; audit(87-02-13,RBarstad), install(87-03-25,MR12.1-1014): +;;; Changed comout-command and comout-command-to-buffer to check whether +;;; the output buffer contains an unwritten nonempty buffer, and to use +;;; local displays for the warnings. Changed comout-to-buffer to support +;;; the comout-local-display option. +;;; END HISTORY COMMENTS + +(%include e-macros) +(%include defmacro) +(declare (macros nil)) +(%include defun) +(%include other_other) + +(defmacro defkill (name type) `(defprop ,name ,type kills)) + +(declare (genprefix /!e_macops_)) +(declare (*lexpr ncline comout minibuffer-remark gratuitous-mark-setter + report-error report-error-noabort)) +(declare (*expr autofill-self-insert buffer-kill close-line iox_$control + e_pl1_$set_emacs_tty_modes e_pl1_$set_multics_tty_modes + ed-cv-fixnum-check extended-command forward-regexp-search + get-buffer-state + go-to-hpos hcs_$set_bc hcs_$truncate_file e_pl1_$get_iocb + intern-minibuf-response mark-at-current-point-p mark-tag-fun + local-display-buffer-info delete-word search-charset-forward + minibuffer-response push-mark-ring search-charset-backwards + self-insert skip-to-whitespace-in-line exists-buffer + search:numeric-prompt set-the-mark-here backward-n-chars + check-read-only get-key-binding parse-key-description)) +(declare (special curpointpos good-word-charactertbl whitespace-charactertbl + iocb_ptr null-pointer non-speedtype-bindings + CRET last-input-char current-buffer-mode buffer-minor-modes + pdir-temp-ename suppress-redisplay-flag two-window-mode + number-of-lines-in-buffer known-buflist fpathname + buffer-modified-flag read-only-flag fill-prefix NLCHARSTRING + tab-equivalent comment-column comment-prefix firstline + lastline curline pdir-temp-pathname hard-enforce-fill-column + varlist fill-column fill-mode-delimiters minibufferp + OPEN-PAREN CLOSE-PAREN SEMI SINGLEQUOTE DOUBLEQUOTE SLASH + sexp-searcher-mark-list MCS-editing-characters mark-ring + MCS-escape-character process-dir named-mark-list + macro-execution-in-progress tty-no-upmotionp damaged-flag + last-minibuf-response previous-command e-lisp-error-mode + completion-list)) + +(defvar ((comout-local-display nil) + (*comout-command-default-buffer* 'file_output) + *comout-buffer-force* + *comout-command-buffer*)) + +;;; +;;; Named mark management +;;; + + +(defun get-named-mark (name) + (let ((m (let ((tag (mark-tag-fun current-buffer))) + (get name tag)))) + (and (null m) + (report-error 'no-named-mark " " name)) + m)) + + +(defun set-named-mark- (markname) + (let ((tag (mark-tag-fun current-buffer))) + (let ((current (get markname tag))) + (cond (current (set-mark-here current)) + (t (setq current (set-mark)) + (putprop markname current tag) + (setq named-mark-list + (cons markname named-mark-list)))) + current))) + + +(defcom delete-named-mark + &arguments ((markname &symbol &prompt "Delete named mark: " + &default &eval (report-error 'need-mark-name))) + (let ((m (get-named-mark markname))) + (setq named-mark-list (delq markname named-mark-list)) + (release-mark m) + (remprop markname (mark-tag-fun current-buffer)))) + +(defun produce-named-mark-list () + (let ((tag (mark-tag-fun current-buffer))) + (mapcar '(lambda (x)(list x (get x tag))) named-mark-list))) + +;;; Character-oriented commands. + +(defcom twiddle-chars + &undo-function twiddle-chars + (backward-char) + (backward-char) + (insert-char (prog2 0 (curchar) (delete-char) (forward-char)))) + +;;; Word-oriented commands. + +(defcom replace + &arguments ((original &default + &eval (get-search-string "Replace old string")) + (new &prompt "Replace new string: " NL)) + (if (not (forward-search original)) + (search-failure-annunciator)) + (let ((old-length (stringlength original))) + (do-forever + (with-mark m ;have already searched, flush it + (backward-n-chars old-length) + (without-saving (wipe-point-mark m))) + (insert-string new) + (if (not (forward-search original)) ;look again + (stop-doing))))) ;not found, done + +(defcom twiddle-words + &undo-function twiddle-words + (save-excursion + (and (charset-member (curchar) good-word-charactertbl) + (forward-word)) + (search-charset-backwards good-word-charactertbl) + (with-mark bow + (backward-word) + (let ((second (point-mark-to-string bow))) + (without-saving (wipe-point-mark bow)) + (search-charset-backwards good-word-charactertbl) + (cond ((at-beginning-of-buffer) + (insert-string second) + (command-quit))) + (let ((in-between (point-mark-to-string bow))) + (without-saving (wipe-point-mark bow)) + (backward-word) + (insert-string second) + (insert-string in-between) + (forward-word)))))) + +(defcom underline-word + &undo-function remove-underlining-from-word + (or (bolp)(backward-char)) + (forward-word) + (with-mark m + (backward-word) + (underline-point-mark m))) + +(declare (special underline-whitespace)) +(defcom underline-region + &numeric-function de-underline-region + &undo-function de-underline-region + (let ((point-at-end)) + (with-the-mark-last done + (setq point-at-end + (mark-at-current-point-p der-wahrer-mark)) + (underline-point-mark done)) + (or point-at-end (exchange-point-and-mark)) + (cond ((and (looking-at BACKSPACE) + (alphalessp (lefthand-char) "_")) + (forward-char) (forward-char))) + (or point-at-end (exchange-point-and-mark)))) + +(defun underline-point-mark (mark) + (do ((this (curchar) (curchar))) + ((mark-reached mark)) + (cond ((and (samepnamep this TAB) underline-whitespace) + (insert-string + (gen-repetitive + (- tab-equivalent (\ (cur-hpos) tab-equivalent)) + "_")) + (delete-char)) + ((and (samepnamep this SPACE) underline-whitespace) + (delete-char) (insert-string "_")) + ((or (samepnamep this "_") ;don't underline underscore + (samepnamep this "ÿ") ;skip control chars + (alphalessp this SPACE)) ; "" "" "" + (forward-char)) + ((and (charset-member this whitespace-charactertbl) + (not underline-whitespace)) + (forward-char)) + ((alphalessp this "_") + (forward-char) + (cond ((samepnamep (curchar) BACKSPACE) ;already overstruck + (forward-char) (forward-char)) + (t (insert-string BACKSPACE) + (insert-string "_")))) + ((samepnamep (lefthand-char) BACKSPACE) ;already overstruck + (forward-char)) + (t (insert-string "_") + (insert-string BACKSPACE) + (forward-char))))) + +(defcom de-underline-region + &undo-function underline-region + (with-the-mark-last done + (de-underline-point-mark done))) + +;;; Removes underlining from the point to a given mark. +;;; Caller must ensure that mark is beyond point. +(defun de-underline-point-mark (mark) + (do-forever + (if (mark-reached mark) (stop-doing)) + (cond ((or (looking-at "_") + (looking-at "_")) + (delete-char) (delete-char)) + ((and underline-whitespace + (looking-at "_")) + (delete-char) (insert-string SPACE)) + ('else (forward-char))))) + +(defcom remove-underlining-from-word + (or (bolp) + (backward-char)) + (forward-word) + (with-mark m + (backward-word) + (de-underline-point-mark m))) + +;;; Line-oriented commands. + +(defcom open-space + &numeric-argument (&repeat &lower-bound 0) + (insert-char NL) + (backward-char)) + + +(defcom set-fill-prefix + &arguments ((new-prefix &default + &eval + (with-mark m + (go-to-beginning-of-line) + (prog2 nil + (point-mark-to-string m) + (go-to-mark m))))) + (setq fill-prefix new-prefix)) + + +(defcom center-line + (save-excursion + (go-to-beginning-of-line) + (delete-white-sides) + (go-to-end-of-line) + (delete-white-sides) + (let ((hp (cur-hpos))) + (go-to-beginning-of-line) + (and (< hp fill-column) + (whitespace-to-hpos (// (- fill-column hp) 2)))))) + +(defcom split-line + (let ((hpos (cur-hpos))) + (save-excursion + (insert-char NL) + (whitespace-to-hpos hpos)))) + +(defcom delete-line-indentation + &numeric-argument (&pass) + (if numarg (next-line)) + (go-to-beginning-of-line) + (delete-white-sides) + (rubout-char)) + +(defcom mark-whole-buffer + (go-to-end-of-buffer) + (set-the-mark) + (go-to-beginning-of-buffer)) + +;;; Speedtype + +(defcom speedtype-expander + &numeric-argument (&repeat &lower-bound 0) + (prog (the-word) + (backward-char) + (cond ((not (charset-member (curchar) good-word-charactertbl)) + (forward-char)) + (t (forward-char) + (with-mark m + (backward-word) + (setq the-word + (internedp (point-mark-to-string m))) + (if (symbolp the-word) + (setq the-word (get the-word 'speedtype)) + else (setq the-word nil)) + (if the-word (wipe-point-mark m) + (insert-string the-word) + else (go-to-mark m))))) + (let ((old-binding + (or (cdr (assq last-input-char non-speedtype-bindings)) + 'self-insert))) + (funcall old-binding)))) + + +;;; Hack to check obarray for a "word" without interning it +(defun internedp (string) + (cond ((= (stringlength string) 1) + (ascii (getcharn string 1))) + (t (do ((l (obarray (\ (sxhash string) 509.)) (cdr l))) + ((null l) string) + (and (samepnamep (car l) string) + (return (car l))))))) + +(defun setab n ;reverted to old-command + (do ((arg-list (listify n)(cddr arg-list))) + ((null arg-list)) + (let ((name (intern (make_atom (e_lap_$trim (car arg-list))))) + (value (cadr arg-list))) + (if (nullstringp value) + (display-error "No expansion supplied for " name ".")) + (putprop name value 'speedtype)))) + +(defcom speedtype + (assert-minor-mode 'speedtype) + (register-local-var 'non-speedtype-bindings) + (setq non-speedtype-bindings nil) + (mapc '(lambda (x) + (push (cons x + (get-key-binding (parse-key-description x))) + non-speedtype-bindings) + (set-key x 'speedtype-expander)) + (cons CRET fill-mode-delimiters))) + +(defcom speedtypeoff + (negate-minor-mode 'speedtype) + (mapc '(lambda (x) + (set-key (car x) (cdr x))) + non-speedtype-bindings)) + +;;; Uncle-and-aunt indenter, BSG 12/10/78 + +(defcom indent-relative + &numeric-argument (&pass) + (go-to-beginning-of-line) + (tab-to-previous-columns)) + +(defcom tab-to-previous-columns + &numeric-argument (&pass) + (skip-over-whitespace-in-line) + (and (bolp) (eolp) (setq numarg nil)) + (let ((orighpos (cur-hpos))) + (with-mark m + (delete-white-sides) + (do-forever + (if (firstlinep) (stop-doing) + else (prev-line)) + (if (line-is-blank) + else (if numarg + (skip-over-indentation) + (if (< (cur-hpos) orighpos) + (stop-doing)) + else + (stop-doing)))) + (if (not numarg) + (go-to-hpos orighpos) + (if (at-white-char) + (skip-over-whitespace-in-line) + (if (eolp) (go-to-beginning-of-line)) + else + (if (not (> (cur-hpos) orighpos)) + (skip-to-whitespace-in-line) + (skip-over-whitespace-in-line)))) + (setq orighpos (cur-hpos)) + (go-to-mark m) + (whitespace-to-hpos orighpos)))) + + +(defcom cret-and-indent-relative + &numeric-argument (&pass) + (cond (minibufferp (insert-string NLCHARSTRING)) + (t (new-line) (indent-relative)))) + +;;; +;;; Adapted from Killian, BSG 10/15/80 +;;; + +(defcom indent-rigidly + &numeric-argument (&pass) + (setq numarg (or numarg 0)) + (save-excursion + (with-the-mark-last m + (do-forever + (if (mark-at-current-point-p m)(stop-doing)) + (if (not (line-is-blank)) + (skip-over-indentation) + (let ((hpos (cur-hpos))) + (delete-white-sides) + (whitespace-to-hpos + (max 0 (+ hpos numarg))))) + (if (mark-on-current-line-p m)(stop-doing)) + (next-line))))) + +;;; +;;; Variable managers +;;; + +(setq varlist nil) + +(defcom put-variable + &prologue &eval (if der-wahrer-mark + else (report-error 'mark-not-set)) + &arguments ((x &symbol &prompt "Set variable: " + &default &eval (display-error-noabort + "You must supply a variable name."))) + (or (memq x varlist) (setq varlist (cons x varlist))) + (wipe-region) + (putprop x (kill-pop) 'editvalue)) + +(defcom get-variable + &arguments ((x &symbol &prompt "Get variable: " + &default &eval (display-error-noabort + "You must supply a variable name."))) + (let ((stuff (get x 'editvalue))) + (if stuff (set-the-mark) (insert-string stuff) + else (display-error x " has no value.")))) + +(defcom list-variables + (prog () + (if (not varlist) (display-error "No variables to list.")) + (save-excursion-buffer + (go-to-or-create-buffer (maknam (explodec "Variable list"))) + (putprop current-buffer t 'temporary-buffer) + (insert-string "Current string variables") + (new-line)(new-line) + (insert-string "Name") + (format-to-col 10.) + (insert-string "#Chars") + (new-line)(new-line) + (do l varlist (cdr l)(null l) + (let ((v (car l)) + (s (get (car l) 'editvalue))) + (insert-string v) + (format-to-col 10.) + (insert-string (decimal-rep (stringlength s)))) + (new-line)) + (display-buffer-as-printout)) + (end-local-displays))) + +(defcom-synonym lvars list-variables) + +;;; +;;; Buffer lister +;;; + +(declare (special previous-buffer)) + +;;; Got rid of old horrible crock, replaced using local-display-buffer-info +;;; Richard Mark Soley, 5 August 1981 +(defcom list-buffers + (init-local-displays) + (local-display-generator-nnl "Listing of Current Buffers") + (local-display-generator-nnl "") + (do ((buffer known-buflist (cdr buffer))) + ((null buffer)) + (local-display-buffer-info (car buffer))) + (end-local-displays)) + +(defun format-to-col (x) + (cond ((not (< curpointpos x))(insert-char SPACE)) + (t (whitespace-to-hpos x)))) + +;;; Case changing commands and primitives. + +(defmacro word-operator (count &body forms) + `(progn + (cond ((or (null ,count) + (and (charset-member (curchar) good-word-charactertbl) + (plusp ,count))) + (or (and (not (charset-member (lefthand-char) + good-word-charactertbl)) + (charset-member (curchar) good-word-charactertbl)) + (backward-word))) + ((minusp ,count) + (do-times (abs ,count) (backward-word))) + (t (search-charset-forward good-word-charactertbl))) + (do ((n (abs (or ,count 1)) (1- n)) (word) (quit)) + ((or quit (zerop n)) (and quit (ring-tty-bell))) + (setq word + (with-mark here + (forward-word) + (prog1 (point-mark-to-string here) + (go-to-mark here)))) + (protect ,@forms + &success (without-saving (delete-word))) + (or (= n 1) + (search-charset-forward good-word-charactertbl) + (setq quit t))) + (cond ((and (fixp ,count) (minusp ,count)) + (do-times (abs ,count) (backward-word)) + (or (at-beginning-of-buffer) (backward-char)))))) + +(defcom capitalize-initial-word + &numeric-argument (&pass) + (word-operator numarg + (insert-char (uppercase (substr word 1 1))) + (insert-string (lowercase (substr word 2))))) + +(defcom upper-case-word + &numeric-argument (&pass) + (word-operator numarg + (insert-string (uppercase word)))) + +(defcom lower-case-word + &numeric-argument (&pass) + (word-operator numarg + (insert-string (lowercase word)))) + +(defun uppercase (string) + (maknam + (mapcar '(lambda (x) (cond ((and (> x (1- (CtoI "a"))) + (< x (1+ (CtoI "z")))) + (- x 40)) + (t x))) + (exploden string)))) + +(defun lowercase (string) + (maknam + (mapcar '(lambda (x) (cond ((and (> x (1- (CtoI "A"))) + (< x (1+ (CtoI "Z")))) + (+ x 40)) + (t x))) + (exploden string)))) + +(defun upper-case-char (c) + (let ((cn (getcharn c 1))) + (cond ((and (< cn (1+ (CtoI "z"))) + (> cn (1- (CtoI "a")))) + (ascii (- cn 40))) + (t c)))) + +(defun lower-case-char (c) + (let ((cn (getcharn c 1))) + (cond ((and (< cn (1+ (CtoI "Z"))) + (> cn (1- (CtoI "A")))) + (ascii (+ cn 40))) + (t c)))) + +(defcom lower-case-region + (with-the-mark-last m + (do-forever + (if (mark-reached m)(stop-doing)) + (insert-char (lower-case-char (curchar))) + (delete-char)))) + + +(defcom upper-case-region + (with-the-mark-last m + (do-forever + (if (mark-reached m)(stop-doing)) + (insert-char (upper-case-char (curchar))) + (delete-char)))) + +;;; +;;; Auto-documenting features +;;; BSG and archy 5/24/78 +;;; BSG moved 'em all to e_self_documentor_ 10/7/78, leaving +;;; only the following pieces that sort of gotta stay around. +;;; + +(defcom find-key + &arguments ((fun &symbol &prompt "Function name: " + &default &eval (display-error-noabort "You must supply a function name."))) + (prog (env) + (setq env (ncons fun)) + (map-over-emacs-commands + '(lambda (symbol suspect arg) + (cond ((eq suspect (car arg)) + (rplacd arg symbol)))) + env) + (cond ((cdr env) + (minibuffer-print fun " is on " (printable (cdr env)))) + (t (minibuffer-print fun " is not on any key."))))) + + +(defun display-buffer-as-printout () + (save-excursion + (init-local-displays) + (go-to-beginning-of-buffer) + (do-forever + (local-display-generator (curline-as-string)) + (if (lastlinep) (stop-doing)) + (next-line)))) + + +(defcom skip-over-indentation + (go-to-beginning-of-line) + (do-forever + (if (eolp)(stop-doing)) + (if (not (at-white-char))(stop-doing)) + (forward-char))) + +;;; +;;; Hirsute blank line deleter, 6/12/78 +;;; + +(defcom delete-blank-lines + (prog (orig-was-blank eobp) + (setq orig-was-blank (line-is-blank)) + (if (not orig-was-blank)(go-to-end-of-line) + (delete-white-sides) + (insert-char NL) + else (skip-back-whitespace) + (go-to-end-of-line) + (if (not (bolp))(forward-char))) ;bolp => bobp + (with-mark m + (skip-over-whitespace) + (setq eobp (at-end-of-buffer)) + (or eobp (go-to-beginning-of-line)) + (without-saving (wipe-point-mark m))) + (if (and eobp (not orig-was-blank))(rubout-char)) + (if (and (not eobp) orig-was-blank)(insert-char NL)))) + +;;; +;;; Sentence hackery, 5/78, converted by bsg & archy +;;; from a noble attempt by Margulies. +;;; + +(defun at-end-of-sentence () + (prog () + (if (at-white-char) + (dispatch-on-lefthand-char + ("." (return t)) + ("?" (return t)) + ("!" (return t)))) + (if (or (at-end-of-buffer)(at-beginning-of-buffer)) + (return t)) + (if (and (eolp)(save-excursion (next-line)(line-is-blank))) + (return t)))) + +(defcom forward-sentence + &numeric-argument (&repeat) + &negative-function backward-sentence + (skip-over-whitespace) + (if (at-end-of-buffer)(command-quit)) + (do-forever + (skip-over-whitespace) + (skip-to-whitespace) + (if (at-end-of-sentence) (stop-doing)))) + + +(defcom backward-sentence + &numeric-argument (&repeat) + &negative-function forward-sentence + (skip-back-whitespace) + (if (at-beginning-of-buffer)(command-quit)) + (skip-back-to-whitespace) ;in case we ARE are end-of-sentence + (do-forever + (if (at-end-of-sentence) + (skip-over-whitespace) + (stop-doing)) + (skip-back-to-whitespace) + (skip-back-whitespace))) + + +(defprop kill-to-end-of-sentence forward kills) +(defcom kill-to-end-of-sentence + &numeric-argument (&repeat) + &negative-function kill-backward-sentence + (with-mark m + (forward-sentence) + (kill-backwards-to-mark m) + (merge-kills-forward))) + + +(defprop kill-backward-sentence reverse kills) +(defcom kill-backward-sentence + &numeric-argument (&repeat) + &negative-function kill-to-end-of-sentence + (with-mark m + (backward-sentence) + (kill-forward-to-mark m) + (merge-kills-reverse))) + +;;; +;;; Comments, anyone? +;;; BSG 6/25/78 +;;; + +(defcom set-comment-column + &arguments ((column &integer + &default &eval (if numarg numarg + else (1+ (cur-hpos))))) + &numeric-argument (&pass) + (setq comment-column (1- column)) + (minibuffer-print "Comment column = " (decimal-rep (1+ comment-column)))) + + +(defcom set-comment-prefix + &arguments ((prefix &prompt "Comment prefix: ")) + (setq comment-prefix prefix)) + + +(defcom prev-comment-line + (cond ((firstlinep)) + (t (prev-line) + (indent-for-comment)))) + + +(defcom down-comment-line + (cond ((lastlinep)) + (t (next-line) + (indent-for-comment)))) + + +(defun indent-to-fill-prefix () + (go-to-beginning-of-line) + (delete-white-sides) + (insert-string fill-prefix)) + + +(defcom indent-for-comment + (go-to-beginning-of-line) + (if (nullstringp comment-prefix)(indent-for-nondelimited-comment) + else (if (forward-search-in-line comment-prefix) ;already got one) + (do-times (stringlength comment-prefix)(backward-char)) + (if (= (cur-hpos) comment-column) nil + else (delete-white-sides) + (do ((column comment-column (+ column 5))) + ((> column (cur-hpos)) + (whitespace-to-hpos column)))) + (do-times (stringlength comment-prefix)(forward-char)) + else (go-to-end-of-line) + (delete-white-sides) + (insert-string comment-prefix) + (indent-for-comment)))) + + +(defun indent-for-nondelimited-comment () + ;;at bol from above. + (if (go-to-hpos comment-column) ;line at least that long. + (if (get (lefthand-char) 'whiteness) ;last was whitespace + (if (> (cur-hpos) comment-column) ;tab or such + (rubout-char) + (insert-string " ") + (indent-for-nondelimited-comment) + else ;we are right at it. + (do-forever + (if (eolp)(stop-doing)) + (if (at-white-char)(delete-char) + else (stop-doing)))) + else ; foo|__com + (skip-to-whitespace-in-line) + (if (not (eolp))(delete-white-sides)) + (insert-char " ")) + else ;line not that long + (whitespace-to-hpos comment-column))) + + +(defprop kill-comment forward kills) +(defcom kill-comment + (go-to-beginning-of-line) + (if (nullstringp comment-prefix) + (if (go-to-hpos comment-column) + (if (not (get (lefthand-char) 'whiteness)) + (skip-to-whitespace))) + (skip-back-whitespace-in-line) + (with-mark m (go-to-end-of-line)(wipe-point-mark m)) + else + (if (forward-search-in-line comment-prefix) + (reverse-search-in-line comment-prefix) + (skip-back-whitespace-in-line) + (with-mark m (go-to-end-of-line)(wipe-point-mark m)) + else + (killsave-string "")))) + +;;; +;;; Stuff grabbed from old start_up +;;; + +(defun ncline n ;lexprish cline + (e_cline_ (apply 'catenate + (mapcan '(lambda (x)(append '(" ") (explodec x))) + (listify n))))) + + +(defcom dp + (ncline 'dp fpathname)) + + +(defcom loadit + (let ((fpathname nil)) + (write-out-file pdir-temp-pathname) + (loadfile pdir-temp-pathname) + (hcs_$truncate_file process-dir pdir-temp-ename 0))) + +(defun comout-get-output n + (check-read-only) + (unwind-protect + (progn (ncline "file_output" pdir-temp-pathname + "-ssw user_output -ssw error_output -truncate") + (apply 'ncline (listify n))) + (e_cline_ "revert_output -ssw user_output -ssw error_output")) + (let ((fpathname nil)) + (read-in-file pdir-temp-pathname)) + (hcs_$truncate_file process-dir pdir-temp-ename 0)) + +(defun comout (&rest command) + (apply 'comout-to-buffer (cons 'file_output command))) + +(defun comout-to-buffer (buffer &rest command) + (unwind-protect + (progn (go-to-or-create-buffer buffer) + (apply 'comout-get-output command)) + (cond (comout-local-display + (display-buffer-as-printout) + (go-to-buffer previous-buffer)) + (t (select-buffer-find-window current-buffer 'cursize))))) + +(defcom comout-command + &numeric-function comout-command-to-buffer + &arguments ((command-line + &prompt &eval + (progn (setq *comout-buffer-force* + (comout-buffer-warning + *comout-command-default-buffer*)) + "Multics command: "))) + (comout-command-internal *comout-command-default-buffer* *comout-buffer-force* + command-line)) + +(defun comout-command-internal (buffer force-flag command) + (setq command (e_lap_$trim command)) + (unless (nullstringp command) + (when force-flag + (save-excursion-buffer + (go-to-buffer buffer) + (setq fpathname nil) + (setq read-only-flag nil))) + (comout-to-buffer buffer command))) + +(defcom comout-command-to-buffer + &numarg &ignore + &arguments ((buffer &symbol + &default &eval + (let ((completion-list known-buflist)) + (setq *comout-command-buffer* + (make_atom (minibuffer-response "Buffer: "))))) + (command-line + &prompt &eval + (progn (setq *comout-buffer-force* + (comout-buffer-warning + *comout-command-buffer*)) + "Multics command: "))) + (comout-command-internal buffer *comout-buffer-force* + command-line)) + +(defun comout-buffer-warning (buffer) + (and (exists-buffer buffer) + (let ((ro (get-buffer-state buffer 'read-only-flag)) + (not-empty (not (empty-buffer-p buffer))) + (path (get-buffer-state buffer 'fpathname)) + (force)) + (setq force (or ro path)) + (setq path (and not-empty path)) + (when (or ro path) + (ring-tty-bell) + (init-local-displays) + (when ro + (local-display-generator-nnl + (catenate "Output buffer '" buffer "' is READ ONLY."))) + (when path + (local-display-generator-nnl + (catenate "Output buffer '" buffer + "' contains unwritten changes to ")) + (local-display-generator-nnl + (catenate " " path "."))) + (local-display-generator-nnl "It will be overwritten if you continue (type ^G to abort).") + (end-local-displays)) + force))) + +(defcom linecounter + (let ((lineno 1) + (curlineno 0) + (nnlp (save-excursion + (go-to-end-of-buffer) + (not (and (eolp)(bolp)))))) + (save-excursion + (with-mark m + (go-to-beginning-of-buffer) + (do-forever + (if (mark-on-current-line-p m) + (setq curlineno lineno) + (stop-doing)) + (if (lastlinep) (stop-doing)) ;just in case + (setq lineno (1+ lineno)) + (next-line)))) + (setq lineno (if nnlp number-of-lines-in-buffer + else (1- number-of-lines-in-buffer))) + (minibuffer-remark + (decimal-rep lineno) + (if (= lineno 1) " line" else " lines") + (if nnlp " (NO NEWLINE)" else "") + ", current = " + (decimal-rep curlineno) ", column = " + (decimal-rep (1+ (cur-hpos)))))) + +;;; +;;; Global Print command. +;;; New version by JSL - June 1982 + +(defcom global-print + &numeric-function global-regexp-print + &arguments ((string &string &default + &eval (get-search-string "Global print"))) + (let ((foundflag) + (line-count 0)) + (save-excursion + (go-to-beginning-of-buffer) + (do-forever + (if (not (forward-search string)) (stop-doing)) + (if (not foundflag) + (setq foundflag t) + (with-mark m + (reverse-search string) + (do-forever + (if (mark-on-current-line-p m) + (stop-doing)) + (setq line-count (1+ line-count)) + (next-line))) + (init-local-displays)) + (do-times line-count (prev-line)) + (do-times line-count + (local-display-current-line) + (next-line)) + (local-display-current-line) + (if (lastlinep) (stop-doing)) + (next-line))) + (if foundflag (end-local-displays) + else (search-failure-annunciator)))) + +;;; +;;; Option manager +;;; BSG 7/29/78 +;;; + +(defprop option opt expr) + +(declare (special list-of-known-options)) + +(defun opt n ;lexpr + (cond ((= n 0) ;noargs + (display-error "Usage: opt list/opt status XXX/opt XXX ")) + ((= n 1) + (if (eq (arg 1) 'list) + (save-excursion-buffer + (go-to-or-create-buffer (intern (make_atom "Opt List"))) + (putprop current-buffer t 'temporary-buffer) + (insert-string "Options in effect")(new-line) + (new-line) + (mapc '(lambda (x) + (insert-string x)(format-to-col 33.) + (insert-string (option-value-string x))(new-line)) + list-of-known-options) + (display-buffer-as-printout)) + (end-local-displays) + else (opt))) ;barfo + ((= n 2) + (if (eq (arg 1) 'status) + (if (memq (arg 2) list-of-known-options) + (minibuffer-print "Option " (arg 2) ": " (option-value-string (arg 2))) + else (display-error "Unknown option: " (arg 2))) + else (if (memq (arg 1) list-of-known-options) + (option-set-value (arg 1)(arg 2)) + else (opt 'status (arg 1))))) + ((= n 3) ; opt register foo bar + (cond ((eq (arg 1) 'register) + (register-option (arg 2)(arg 3))) + (t (opt)))) + (t (opt)))) + + +(defun option-value-string (x) + (cond ((not (boundp x)) 'Off) + ((numberp (setq x (symeval x)))(decimal-rep x)) + ((eq x 'nil) 'Off) + ((eq x 't) 'On) + ((stringp x) x) + ((symbolp x) x) + (t "-- ???? ---"))) + + +(defun option-set-value (sym val) + (if (stringp val) (setq val (intern (make_atom val)))) + (cond ((or (and (boundp sym) (numberp(symeval sym))) + (get sym 'value-must-be-numeric)) + (if (numberp val) (set sym val) + else (display-error "Value for " sym " must be numeric."))) + ((or (and (boundp sym)(memq (symeval sym) '(t nil))) + (get sym 'value-ok-true-false)) + (cond ((memq val '(t T True true ok Ok On ON on y yes Yes)) + (set sym t)) + ((memq val '(nil no No Off OFF off false)) + ;; I thank Bawden for this randomness + (set sym nil)) + ((get sym 'value-ok-anything) + (set sym val)) + (t (display-error "The value for " sym + " must be either ""on"" or ""off"".")))) + (t (set sym val)))) + +;;; +;;; The printing-tty-man's friend, +;;; BSG 08/06/76 +;;; + +(defcom view-lines + &numeric-argument (&pass) + (if numarg (if (= numarg 0) (view-region-as-lines) + else (init-local-displays) + (if (< numarg 0) + (setq numarg (- numarg)) + (do y numarg (1- y)(= y 0) + (if (firstlinep) + (setq numarg (1- numarg)) + else + (prev-line)))) + (do x numarg (1- x) (< x 1) ;lisp do + (local-display-current-line) + (if (or (lastlinep) (= numarg 1)) (stop-doing) + else (next-line))) + (end-local-displays)) + else (setq numarg 1) (view-lines))) + + +(defcom view-region-as-lines + (with-the-mark-last m + (init-local-displays) + (do-forever + (local-display-current-line) + (if (mark-on-current-line-p m) (stop-doing)) + (next-line)) + (end-local-displays))) + +;;; +;;; Word Searches. +;;; BSG 8/26/78 +;;; + +(defun compare-word-to-list-rep-word (list) + (prog (text-char) +a (cond ((null list) ;no more source + (do-forever + (if-at (ascii 10)(forward-char) ;run out trailing _ BS + else (if-at "_" (forward-char) + else (stop-doing)))) + (cond ((charset-member (curchar) good-word-charactertbl) + (search-for-first-not-charset-line good-word-charactertbl) + (return nil)) ;lost + (t (return t)))) + ((= (car list) 52) ;star + (search-for-first-not-charset-line good-word-charactertbl) + (return t))) + (if (eolp) ;lost + (return nil)) + (setq text-char (getcharn (curchar) 1)) + ;; Quick check for good case. + + (if (and (< text-char (1+ (CtoI "Z")))(> text-char (1- (CtoI "A")))) + (setq text-char (+ 40 text-char))) ;lower case it. + (if (= text-char (car list)) ;local winnage + (setq list (cdr list)) + (forward-char) + (go a)) + (if (or (= text-char 10)(= text-char 137)) ;BS or US + (forward-char) + (go a)) + ;; Wholesale mismatch. + (search-for-first-not-charset-line good-word-charactertbl) + (return nil))) + + +(defun word-search (word) + (setq word (listify-word word)) + (with-mark m + (if (do-forever + (if (not (search-charset-forward-nosavepos good-word-charactertbl)) + (return nil)) + (if (compare-word-to-list-rep-word word) + (return t)) + (if (at-end-of-buffer) + (return nil))) + else (go-to-mark m) + nil))) + + +(defun listify-word (w) + (mapcar '(lambda (x) + (cond ((and (< x (1+ (CtoI "Z"))) (> x (1- (CtoI "A")))) (+ x 40)) + (t x))) + (exploden w))) + + +(defcom multi-word-search + &arguments ((wordlist &default + &eval (string-to-list-of-strings (get-search-string "Word Search")))) + &numeric-argument (&pass) + (let ((bjflag numarg)) + (setq wordlist (mapcar 'listify-word wordlist)) + (with-mark m + (if bjflag (go-to-beginning-of-buffer)) + (if + (prog (trials temp-list) + (return + (do-forever + (if (not (search-charset-forward-nosavepos good-word-charactertbl)) + (go-to-mark m) + (search-failure-annunciator)) + (setq trials 0 temp-list wordlist) +a (cond ((null temp-list) + (return t))) + (cond ((compare-word-to-list-rep-word (car temp-list)) + (setq temp-list (cdr temp-list)) + (cond ((null temp-list)(return t))) + (setq trials (1+ trials)) + (if (search-charset-forward-nosavepos good-word-charactertbl) + else (go-to-mark m) (search-failure-annunciator)) + (go a))) + ;; Has failed. Found 2 good words, 1 bad one. trials = 2. + ;; Back up 2 words. + (do-times trials (backward-word))))) + else (go-to-mark m) + (search-failure-annunciator))))) + + +(defun string-to-list-of-strings (instr) + (prog (answer locanswer ch1) + (setq instr (exploden instr)) +a (do-forever + (if (null instr)(stop-doing)) + (setq ch1 (car instr)) + (if (or (= ch1 40)(= ch1 11)(= ch1 12)) ;blank, tab newline + (setq instr (cdr instr)) + else (stop-doing))) + (if (null instr) ;all done + (return (nreverse answer))) + ;; collect one string + (setq locanswer nil) + (do-forever + (if (null instr)(stop-doing)) + (setq ch1 (car instr) instr (cdr instr)) + (if (or (= ch1 40)(= ch1 11)(= ch1 12)) + (stop-doing) + else + (setq locanswer (cons ch1 locanswer)))) + (setq answer (cons (maknam (nreverse locanswer)) answer)) + (go a))) + + +(defun search-charset-forward-nosavepos (charset) + (do-forever + (cond ((search-for-first-charset-line charset) + (return (curchar))) + ((lastlinep) + (return nil)) + (t (next-line))))) + +;;; Not L I S P mode. +;;; Things dealing with parenthese balancing to placate those +;;; who miss native Lisp mode. +;;; BSG 9/11/78 + +(defun unwind-sexp-searchers-marks-and-nlgoto () + (mapc 'release-mark sexp-searcher-mark-list) + (setq numarg nil) + (setq sexp-searcher-mark-list nil) + (command-quit)) + + +(defcom balance-parens-forward + &numeric-argument (&repeat) + &negative-function balance-parens-backward + (let ((count nil)) + (save-excursion-on-error + (do-forever + (dispatch-on-current-char + ("(" (if (not count)(setq count 1) + else (setq count (+ 1 count)))) + (")" (if count (setq count (- count 1))) + (if (and count (= count 0)) + (forward-char) (stop-doing)))) + (if (at-end-of-buffer) + (display-error "Unbalanced Parentheses")) + (forward-char))))) + +(defcom balance-parens-backward + &numeric-argument (&repeat) + &negative-function balance-parens-forward + (let ((count nil)) + (save-excursion-on-error + (do-forever + (dispatch-on-lefthand-char + (")" (if (not count)(setq count 1) + else (setq count (+ 1 count)))) + ("(" (if count (setq count (- count 1))) + (if (and count (= 0 count)) + (backward-char) (stop-doing)))) + (if (at-beginning-of-buffer) + (display-error "Unbalanced Parentheses")) + (backward-char))))) + +;;; +;;; Page-other-window copped from Larry Johnson +;;; BSG 12/11/78 .. ditto go-to-line-number +;;; + + +(declare (special selected-window)) + +(defcom page-other-window + &numeric-argument (&pass) + (if (not two-window-mode) + (display-error "Not in 2 window mode") + else + (let ((origwindow selected-window)) + (unwind-protect + (progn + (select-other-window) + (if (null numarg)(next-screen) + else (if (> numarg 0)(next-screen) + else (setq numarg (- numarg)) + (prev-screen)))) + (select-window origwindow))))) + + +;;; New non-losing go-to-line-number 22 April 1981 RMSoley +;;; Prompt for line number if wasn't given. +(defcom go-to-line-number + &numeric-argument (&pass) + (let ((count numarg)) + (cond ((null count) + (setq count + (1- + (integer-minibuf-response + "Go to line number: " NL)))) + ('else + (setq count (1- count)))) + (and (< count 0) (setq count 0)) + (go-to-beginning-of-buffer) + (do-times count + (and (lastlinep) (command-quit)) + (next-line)))) + +(defun integer-minibuf-response (Question Char) + (let ((ans (minibuf-response Question Char))) + (or (ed-cv-fixnum-check ans) + (display-error "Non-numeric answer: " ans ".")))) + +;;; +;;; Untabifiers, moved from Rmail 1/18/79 +;;; + +(defcom untabify + &arguments ((x &default + &eval (if numarg numarg + else tab-equivalent))) + &numeric-argument (&pass) + (let ((tab-equivalent x)) + tab-equivalent + (save-excursion + (go-to-beginning-of-buffer) + (do-forever + (if (forward-search TAB) + (let ((hp (cur-hpos))) + (rubout-char) + (let ((nhp (cur-hpos))) + (do ((x nhp (1+ x)))((= x hp)) + (insert-char " ")))) + else + (stop-doing)))))) + +(defcom-synonym mmuntabify untabify) + +;;; +;;; Mark commands. +;;; + +(defkill wipe-region ambiguous) +(defcom wipe-region + (cond ((not der-wahrer-mark) + (report-error 'mark-not-set) + (setq previous-command nil)) ;be sure not accidently repeated + (t (wipe-point-mark der-wahrer-mark)))) + +(defcom copy-region + (cond (der-wahrer-mark (killsave-string + (point-mark-to-string der-wahrer-mark))) + (t (report-error 'mark-not-set)))) + +;;; +;;; Named mark routines -- BSG 8/19/79 +;;; + +(defcom set-named-mark + &arguments ((markname &symbol &prompt "Set named mark: " + &default &eval (display-error "You must supply a mark name."))) + (set-named-mark- markname) + (minibuffer-print "Set " markname)) + + +(defcom go-to-named-mark + &arguments ((mn &symbol &prompt "Go to named mark: " + &default &eval (display-error "You must supply a mark name."))) + (let ((m (get-named-mark mn))) + (set-the-mark) + (go-to-mark m))) + + + +(defcom list-named-marks () + (let ((ml (produce-named-mark-list))) + (if (null ml)(display-error "No named marks in this buffer.")) + (init-local-displays) + (local-display-generator-nnl "Line # Mark name") + (local-display-generator-nnl "") + (save-excursion + (let ((lnno 1)) + (go-to-beginning-of-buffer) + (do-forever + (mapc '(lambda (x) + (if (mark-on-current-line-p (cadr x)) + (local-display-generator-nnl + (catenate (decimal-rep lnno) TAB (car x))))) + ml) + (if (lastlinep)(stop-doing)) + (setq lnno (1+ lnno)) + (next-line)))) + (end-local-displays))) + +(defun date () ;general utility BSG 10/31/79 + (let ((statdate (mapcar 'decimal-rep (status date)))) + (catenate (cadr statdate) + "/" + (caddr statdate) + "/" + (car statdate)))) + +;;; Buffer commands. + +;;; Command to switch buffers +;;; Fixed 17 April 1981 RMSoley to prompt with default. +;;; Added &completions 6 August 1981 RMSoley +(defcom select-buffer + &prologue insure-intelligent-previous-buffer + &arguments ((buffer &symbol + &prompt &eval (catenate "Select buffer (" + previous-buffer + "): ") + &completions known-buflist)) + (select-buffer-window buffer 'default-cursize)) + +;;; Make sure that previous-buffer isn't nil or same as current +;;; buffer for select-buffer and kill-buffer. +;;; 6 Aprill 1982 Richard Soley +(defun insure-intelligent-previous-buffer () + (or (exists-buffer previous-buffer) + (setq previous-buffer + (cond ((eq (car known-buflist) current-buffer) + (cadr known-buflist)) + ('else (car known-buflist))))) + (and (eq previous-buffer current-buffer) + (setq previous-buffer 'main)) + (or previous-buffer (setq previous-buffer 'main))) + +;;; Command to delete a buffer +;;; Fixed 17 April 1981 RMSoley to prompt with default. +;;; Fixed 6 August 1981 RMSoley for &completions +(defcom kill-buffer + &arguments ((buffer &symbol &prompt "Kill buffer: " + &completions known-buflist + &default &eval current-buffer)) + (cond ((not (memq buffer known-buflist)) + (display-error "Buffer does not exist: " buffer)) + ((eq buffer current-buffer) + (insure-intelligent-previous-buffer) + (do nil (nil) + (ring-tty-bell) + (let ((newbuf + (let ((completion-list known-buflist)) + (intern-minibuf-response + (catenate + "Killing current buffer. " + "Select new buffer (" + previous-buffer + "): ") + NL)))) + (and (nullstringp newbuf) + (progn (setq newbuf previous-buffer) + (minibuffer-print-noclear newbuf))) + (cond ((eq buffer newbuf) + (display-error-noabort "Killing buffer " + buffer + ". Can't go there.")) + (t (select-buffer-window newbuf 'default-cursize) + (buffer-kill buffer) + (return nil))))) + (setq previous-buffer + (cond ((eq (car known-buflist) current-buffer) + (cadr known-buflist)) + (t (car known-buflist)))) + (or previous-buffer (setq previous-buffer current-buffer))) + (t (buffer-kill buffer)))) + +;;; Command to mark the current buffer unmodified +(defcom unmodify-buffer + (setq buffer-modified-flag nil + damaged-flag t) ;makes redisplay happy + (close-line) ;lest this, nobody'd check + (minibuffer-remark "Not modified.")) + +;;; Yank and search commands and esc-esc. + +(defkill merge-last-kills-with-next ambiguous) +(defcom merge-last-kills-with-next nil) + +(defcom yank-minibuf + (set-the-mark) + (insert-string last-minibuf-response)) + +;;; JSL's new searching commands - June 1982 +;;; These are changed to lowercase the noninitial words in the prompt, +;;; and to only set gratuitous marks when the search succeeds. +;;; If the search succeeds partially, the mark is always set. + +(defcom string-search + &cleanup search:command-cleanup + &prologue search:command-prologue + &epilogue search:command-epilogue + &inverse reverse-string-search + &negative-function reverse-string-search + &numeric-argument &repeat + &arguments ((search-string &string &default + &eval (get-search-string + (search:numeric-prompt + "String search")))) + (forward-search search-string)) + + +(defcom reverse-string-search + &cleanup search:command-cleanup + &prologue search:command-prologue + &epilogue search:command-epilogue + &inverse string-search + &negative-function string-search + &numeric-argument &repeat + &arguments ((search-string &string &default + &eval (get-search-string + (search:numeric-prompt + "Reverse string search")))) + (reverse-search search-string)) + +(defun search:command-prologue () + (cons 0 (set-mark))) + + +(defun search:command-cleanup (prologue-info) + (if prologue-info + (if (cdr prologue-info) + (go-to-mark (cdr prologue-info)) + (release-mark (cdr prologue-info))))) + + +(defun search:command-epilogue (prologue-info result last-time) + (cond (result + (rplaca prologue-info (1+ (car prologue-info))) + (and last-time + (or (gratuitous-mark-setter (cdr prologue-info)) + (release-mark (cdr prologue-info))) + (rplacd prologue-info nil))) ; For cleanup. + ((zerop (car prologue-info)) + (search-failure-annunciator)) + (t (set-the-mark-here (cdr prologue-info)) + (rplacd prologue-info nil))) ; For cleanup. + (or result (search:announce-partial-failure (car prologue-info)))) + + + +(defun search:announce-partial-failure (count) + (display-error "Search failed after " (decimal-rep count) + " successful search" + (cond ((= count 1) "") (t "es")) + ". Mark set at start.") + (and macro-execution-in-progress (command-quit))) + +(defun search-failure-annunciator () + (display-error "Search fails.") + (and macro-execution-in-progress (command-quit))) + + + +(defcom regexp-search-command + &arguments ((search-string &default + &eval (get-search-string "Regexp Search"))) + (setq search-string (forward-regexp-search search-string)) + (cond ((null search-string) (search-failure-annunciator)) + (t ;found it set mark around it + (let ((y (set-mark))) ;save-excursion + (go-to-mark search-string) + (set-the-mark) + (go-to-mark y) + (release-mark search-string) + (release-mark y))))) + +;;; +;;; Query replace by Carl Hoffman +;;; + + +;;; read macro 12/3/78 by BSG +(eval-when (compile eval) +(setsyntax '/# 'macro + '(lambda () + (cond ((= (tyipeek) 57) + (tyi) + (tyi)) + ((= (tyipeek) 136) + (tyi) + (- (boole 1 137 (tyi)) 100))))) +);;;end of eval-when + +(defcom query-replace + &arguments ((old &default + &eval (get-search-string "Query replace old string")) + (new &prompt "Query replace new string: " NL)) + (assert-minor-mode '|query replace|) + (if (not (forward-search old)) + (minibuffer-print "No occurrences of old string found.") + else + (query-replace-execute old new) + (minibuffer-print "Done.")) + (negate-minor-mode '|query replace|)) + +; This function does all of the work. When it is invoked, the point +; is to the right of the first occurrence of the old string. + +(defun query-replace-execute (old new) + (catch (do-forever + (redisplay) + (query-replace-dispatch old new (get-char)) + (if (not (forward-search old)) (stop-doing))) + done)) + +(defun query-replace-dispatch (old new response) + (do-forever + (cond ((= response #/,) + (query-replace-swap-strings old new) + (redisplay) + (stop-doing)) + ((= response #/ ) + (query-replace-swap-strings old new) + (stop-doing)) ;don't redisplay 10/15/80 + ((or (= response #^M) ;return = 15 + (= response 177)) ;rubout = 177 + (stop-doing)) + ((= response #/!) ;! is replace to end + (query-replace-swap-strings old new) + (do-forever + (if (forward-search old) (query-replace-swap-strings old new) + else (throw t done)))) + ((= response #/.) + (query-replace-swap-strings old new) + (throw t done)) + ((or (= response #^G) (= response 33)) ;altmode + (throw t done)) + ((= response #^J)) ;newline = 12 + ((= response #^L) + (redisplay)) + ((or (= response #/?) (= response #^_)) + (query-replace-documentation)) + (t (display-error-noabort "Unknown query replace response.") + (redisplay))) + (setq response (get-char)))) + +(defun query-replace-swap-strings (old new) + (with-mark m + (backward-n-chars (stringlength old)) + (without-saving (wipe-point-mark m)) + (insert-string new))) + +(defun query-replace-documentation () + (init-local-displays) + (mapc 'local-display-generator-nnl + '("Query replace options:" "" + "SPACE Replace this occurrence and go on" + "CR, DEL Skip this occurrence and go on" + ". (period) Replace this occurrence and stop" + "^G, ESC Stop now" + ", (comma) Replace this occurrence, redisplay, and go on" + "! Replace all following occurrences without querying" + "LF Nothing" + "^L Redisplay" + "?, ^_ Print this description" + "" "Type any character to remove this display.")) + (end-local-displays) + (redisplay) + (get-char)) + +(defcom eval-multics-command-line + &arguments ((command-line &prompt "Multics: ")) + (let ((e-quit-transparency 'transparent)) + e-quit-transparency + (unwind-protect + (progn (e_pl1_$set_multics_tty_modes) + (e_cline_ command-line)) + (iox_$control (e_pl1_$get_iocb) "reset_more" null-pointer) + (e_pl1_$set_emacs_tty_modes)))) + +(declare (special eval:eval eval:assume-atom eval:correct-errors + eval:prinlevel eval:prinlength + - *)) + +(defcom eval-lisp-line + &numeric-argument (&pass) + (cond ((not eval:eval) + (extended-command (minibuffer-response "Command: "))) + (t (eval:internal (minibuffer-response "Eval: "))))) + +(defun eval:internal (lisp-form) + (let ((prinlevel eval:prinlevel) (prinlength eval:prinlength)) + (eval:evaluate + (let ((e-lisp-error-mode 'read-lisp-fun-lossage-handler)) + e-lisp-error-mode + (read-from-string (evl-parenify lisp-form)))))) + +(defun eval:evaluate (form) + (setq - form) + (setq * (let ((e-lisp-error-mode 'eval-lisp-line-lossage-handler)) + (eval form))) + (setq + form) + (minibuffer-print "Value: " (maknam (explode *)))) + +(defun paren-counter (string) + (let ((left 0) + (right 0) + (balanced nil) + (quote-open nil) + (bar-open nil) + (spacep nil) + (skip-this-char nil) + (in (explodec string)) + (len (stringlength string))) + (do ((sofar in (cdr sofar)) + (a 1 (1+ a))) + ((> a len)) + (let ((this (car sofar)) + (open (or bar-open quote-open))) + (cond (skip-this-char (setq skip-this-char nil)) + ((eq this '/" ) + (or bar-open + (setq quote-open (null quote-open))) + (or open (setq spacep t))) + ((eq this '/| ) + (or quote-open + (setq bar-open (null bar-open))) + (or open (setq spacep t))) + ((eq this '/ ) + (or open (setq spacep t))) + ((eq this '// ) + (or open (setq skip-this-char t))) + ((eq this '/; ) + (or open (setq a len))) + ((eq this '/' ) + (or open (setq spacep t))) + ((eq this '/( ) + (or open (setq left (1+ left)))) + ((eq this '/) ) + (or open (setq right (1+ right)))))) + (cond ((not (or (= a 1) (= a len))) + (setq balanced (or balanced (= left right)))))) + (cons left + (cons right + (cons balanced + (cond (quote-open + (list 'error + "unbalanced quotes.")) + (bar-open + (list 'error + "unbalanced vertical bars.")) + (skip-this-char + (list 'error + "too much slashification.")) + (t spacep))))))) + +(defun evl-parenify (string) + (let ((parens (paren-counter string))) + (let ((l>r (> (car parens) (cadr parens))) + (dif (abs (- (car parens) (cadr parens)))) + (symbol (and (not (cadddr parens)) + (= (car parens) 0) + (= (cadr parens) 0) + eval:assume-atom)) + (balanced (caddr parens))) + (cond ((not (or eval:correct-errors (zerop dif))) + (display-error "Error in syntax of Lisp form - " + "unbalanced parentheses.")) + ((eq (cadddr parens) 'error) + (or eval:correct-errors + (display-error + "Error in syntax of Lisp form - " + (car (cddddr parens)))) + (evl-parenify ;fix user's error + (catenate + string + (let ((kludge (substr (car (cddddr parens)) + 12. + 1))) + (cond ((samepnamep kludge "q") """") + ((samepnamep kludge "v") "|") + (t " ")))))) + (t (let ((intermediate + (cond ((= dif 0) string) + (l>r + (catenate string + (gen-repetitive dif ")"))) + (t (catenate (gen-repetitive dif "(") + string))))) + (cond (symbol string) + (balanced + (catenate "(" intermediate ")")) + (t intermediate)))))))) + +(defun gen-repetitive (number string) + (and (nullstringp string) (setq string SPACE)) + (and (minusp number) (setq number 0)) + (do ((string string (catenate string string))) + ((not (< (stringlength string) number)) + (substr string 1 number)))) + +(defun eval-lisp-line-lossage-handler x x (command-quit)) + +(defun read-lisp-fun-lossage-handler (arg) + arg + (display-error "Syntax error in Lisp form.")) + + + + + emacs_tv_.pl1 11/30/82 1503.8rew 11/30/82 1332.3 9117 + + + +/* *********************************************************** + * * + * Copyright, (C) Honeywell Information Systems Inc., 1982 * + * * + * Copyright (c) 1981 by Massachusetts Institute of * + * Technology and Honeywell Information Systems, Inc. * + * * + * Copyright (c) 1972 by Massachusetts Institute of * + * Technology and Honeywell Information Systems, Inc. * + * * + *********************************************************** */ + + +emacs_tv_: procedure (); +emacs: entry (); + +dcl emacs_$emacs entry options (variable); +dcl cu_$arg_list_ptr entry (ptr); +dcl cu_$generate_call entry (entry, ptr); +dcl arg_list_ptr pointer; + + call cu_$arg_list_ptr (arg_list_ptr); + call cu_$generate_call (emacs_$emacs, arg_list_ptr); + return; + end emacs_tv_; + + + + + + + bull_copyright_notice.txt 08/30/05 1008.4r 08/30/05 1007.3 00020025 + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group Bull including Bull HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell Bull Inc., Groupe Bull +and Bull HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato.Users consider that Multics provided the best software architecture for +managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, Bull or Bull HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by Bull HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_macros_.s.archive b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_macros_.s.archive new file mode 100644 index 0000000..b33193f --- /dev/null +++ b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_macros_.s.archive @@ -0,0 +1,1304 @@ + + + + + e_macros_.lisp 08/20/86 2309.2rew 08/20/86 2244.6 84483 + + + +;;; *********************************************************** +;;; * * +;;; * Copyright, (C) Honeywell Information Systems Inc., 1982 * +;;; * * +;;; * Copyright (c) 1978 by Massachusetts Institute of * +;;; * Technology and Honeywell Information Systems, Inc. * +;;; * * +;;; *********************************************************** + +;;; Macros for Programming in EMACS Environment + +;;; HISTORY COMMENTS: +;;; 1) change(85-01-01,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; Extracted from e-macros.incl.lisp, removed all the qwerty and macro-helper +;;; stuff, and changed it to use defmacro; I actually ended up rewriting +;;; many macros, either for efficiency or readability. +;;; Previous journalization from e-macros.incl.lisp: +;;; Written by BSG. +;;; Added without-line-control, cleaned up a bit. 25 June 1981 RMSoley +;;; Added protect, save-excursion-on-error 10 November 1981 RMSoley +;;; 2) change(85-01-27,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; removed (%include other_other), +;;; added local push defmacro, and removed extraneous "macro" in +;;; at-white defmacro. +;;; 3) change(86-02-24,Margolin), approve(86-02-24,MCR7325), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; Fixed "protect" macro expansion to return the value of the body. +;;; END HISTORY COMMENTS + +;;; Added by BSG 4/28/80: Include backquote in compilation. +(%include backquote) + +(%include defmacro) + +(declare (macros nil)) +(defmacro push (val var) ;Can't %include other_other, + `(setq ,var (cons ,val ,var))) ;as it defines the wrong IF. +(declare (macros t)) + +(defmacro bolp () + '(= curpointpos 0)) + +(defmacro eolp () + '(= curpointpos (1- curlinel))) + +(defmacro at-white-char () + '(get (curchar) 'whiteness)) + +(defmacro with-mark (mark &body forms) + `(let ((,mark nil)) + (unwind-protect + (progn (setq ,mark (set-mark)) + . ,forms) + (and ,mark (release-mark ,mark))))) + +(defmacro save-excursion (&body forms) + (let ((mark (gensym))) + `(with-mark ,mark + (unwind-protect + (progn .,forms) + (go-to-mark ,mark))))) + +(defmacro save-excursion-on-error (&body forms) + (let ((mark (gensym))) + `(with-mark ,mark + (protect (progn ,.forms) + &failure (go-to-mark ,mark))))) + +(defmacro save-excursion-buffer (&body forms) + (let ((buffer (gensym))) + `(let ((,buffer current-buffer) + (previous-buffer previous-buffer)) + (unwind-protect + (progn . ,forms) + (go-to-or-create-buffer ,buffer))))) + +(defmacro protect-excursion (&body forms) + (let ((buffer (gensym)) + (prevbuf (gensym)) + (mark (gensym))) + `(with-mark ,mark + (let ((,buffer current-buffer) + (,prevbuf previous-buffer) + (value)) + (protect + (setq value (progn . ,forms)) + &failure + (go-to-or-create-buffer ,buffer) + (setq previous-buffer ,prevbuf) + (go-to-mark ,mark)) + value)))) + +(defmacro do-forever (&body forms) + `(do nil (nil) . ,forms)) + +(defmacro with-the-mark-last (mark &body forms) + `(and (or der-wahrer-mark + (display-error "There is no true mark.")) + (save-excursion + (with-mark ,mark + (cond ((point>markp der-wahrer-mark) + (go-to-mark der-wahrer-mark)) + (t (move-mark ,mark der-wahrer-mark))) + (progn . ,forms))))) + +(defmacro if-at (char &body forms) + `(Multics-Emacs-if (at ,char) . ,forms))) + +(defmacro at-white () + '(get (curchar) 'whiteness)) + +(defmacro stop-doing () + '(return nil)) + +(defmacro dispatch-on-current-char (&body forms) + (do ((gs (gensym)) + (clauses forms (cdr clauses)) + (outs nil (cons s outs)) + (s)) + ((null clauses) + `(let ((,gs (curchar))) + (cond . ,(nreverse outs)))) + (let ((thing (caar clauses)) + (result (cdar clauses)) + (condition)) + (cond ((eq thing 'else) + (setq condition 't)) + (t (cond ((stringp thing) + (setq thing `',(getchar thing 1)))) + (setq condition `(eq ,gs ,thing)))) + (setq s `(,condition .,result))))) + +(defmacro Multics-Emacs-if (condition &rest forms) + (do ((ifs) + (elses) + (l forms (cdr l))) + ((null l) + (cond (elses + `(cond (,condition .,(nreverse ifs)) + (t .,(cdr (nreverse elses))))) + (t `(cond (,condition .,(nreverse ifs)))))) + (let ((form (car l))) + (cond ((eq form 'else) + (setq elses (list nil))) + (elses (push form elses)) + (t (push form ifs)))))) + +;;; See Bawden "if" treaty of 5/9/80 -BSG +(or (getl 'if '(macro expr subr)) + (putprop 'if (get 'Multics-Emacs-if 'macro) 'macro)) + +(defmacro at-end-of-buffer () + '(and (eolp) (lastlinep))) + +(defmacro at-beginning-of-buffer () + '(and (bolp) (firstlinep))) + +(defmacro walk-through-region (&body forms) + (let ((mark (gensym))) + `(with-the-mark-last + ,mark + (do () + ((mark-reached ,mark)) + . ,forms)))) + +(defmacro without-saving (&body forms) + `(let ((dont-stash t)) + dont-stash ;keep lcp from complaining + .,forms)) + +(defmacro do-times (howmany &body forms) + (let ((dovar (gensym))) + `(do ,dovar ,howmany (1- ,dovar) (< ,dovar 1) + . ,forms))) + +(defmacro if-back-at (thing &body forms) + `(Multics-Emacs-if (back-at ,thing) . ,forms)) + +(defmacro at (thing) + (cond ((stringp thing) + (setq thing `',(getchar thing 1)))) + `(eq (curchar) ,thing)) + +(defmacro back-at (thing) + (cond ((stringp thing) + (setq thing `',(getchar thing 1)))) + `(eq (lefthand-char) ,thing))) + +(defmacro dispatch-on-lefthand-char (&body forms) + (do ((gs (gensym)) + (clauses forms (cdr clauses)) + (outs nil (cons s outs)) + (s)) + ((null clauses) + `(let ((,gs (lefthand-char))) + (cond . ,(nreverse outs)))) + (let ((thing (caar clauses)) + (result (cdar clauses)) + (condition)) + (cond ((eq thing 'else) + (setq condition 't)) + (t (cond ((stringp thing) + (setq thing `',(getchar thing 1)))) + (setq condition `(eq ,gs ,thing)))) + (setq s `(,condition .,result))))) + +(defmacro without-modifying (&body forms) + `(let ((read-only-flag nil) + (buffer-modified-flag t)) + read-only-flag buffer-modified-flag ;so lcp doesn't complain + .,forms)) + +(defmacro display-as-printout (&body forms) + `(progn + (save-excursion-buffer + (go-to-or-create-buffer (gensym)) + (putprop current-buffer t 'temporary-buffer) + (init-local-displays) + (progn . ,forms) + (display-buffer-as-printout)) + (end-local-displays))) + +(defmacro defvar (var-specs &optional (single-value nil value-given)) + (let ((specials nil) + (inits nil) + (nothing (ncons nil))) + (cond ((atom var-specs) ;(defvar {}) + (setq var-specs + `((,var-specs ,(cond (value-given single-value) + (t nothing))))))) + (mapc '(lambda (spec) + (let ((v) (init)) + (cond ((atom spec) + (setq v spec + init nothing)) + ((null (cdr spec)) + (setq v (car spec) init nil)) + (t (setq v (car spec) + init (cadr spec)))) + (push v specials) + (or (eq init nothing) + (push `(or (boundp ',v) (setq ,v ,init)) + inits)))) + var-specs) + (setq specials (nreverse specials)) + (cond ((null inits) `(declare (special . ,specials))) + (t + `(progn 'compile + (declare (special .,specials)) + . ,(reverse inits)))))) + +;;; Macro to invisibly (and temporarily) turn off line control +;;; 25 June 1981 Richard Mark Soley +(defmacro without-line-control (&body forms) + `(let ((read-only-flag nil) (line-control:buffer 0)) + read-only-flag line-control:buffer ;so lcp won't complain + . ,forms)) + + +;;; Macro to be more useful than unwind-protect. +;;; (protect stuff to do &success stuff &failure stuff &always stuff) +;;; 10 November 1981 Richard Mark Soley +(defmacro protect (&body forms) + (do ((form forms (cdr form)) + (body ()) + (success ()) + (failure ()) + (always ()) + (current 'body)) + ((null form) + (protect/ MACRO/ build + (nreverse body) (nreverse success) (nreverse failure) + (nreverse always))) + (let ((this (car form))) + (cond + ((eq this '&success) (setq current 'success)) + ((eq this '&failure) (setq current 'failure)) + ((eq this '&always ) (setq current 'always)) + ((eq current 'body) (push this body)) + ((eq current 'success) (push this success)) + ((eq current 'failure) (push this failure)) + ('else (push this always)))))) + +(defun protect/ MACRO/ build (body success failure always) + (cond ((and (null success) (null failure)) + `(unwind-protect + (progn ,.body) + ,.always)) + (t (let ((protect-done-variable (gensym))) + `(let ((,protect-done-variable nil)) + (unwind-protect + (prog1 (progn .,body) + (setq ,protect-done-variable t)) + (cond (,protect-done-variable . ,success) + (t . ,failure)) + . ,always)))))) + +(sstatus feature e-macros) + + + + + e_internal_macros_.lisp 08/20/86 2309.2rew 08/20/86 2244.6 38223 + + + +;;; *********************************************************** +;;; * * +;;; * Copyright, (C) Honeywell Information Systems Inc., 1985 * +;;; * * +;;; *********************************************************** + +;;; Macros used internally in Emacs. + +;;; HISTORY COMMENTS: +;;; 1) change(85-01-05,Margolin), approve(86-02-24,MCR7186), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; Created. Mark and eline definitions taken from e_basic_.lisp, and +;;; turned into defstructs. +;;; 2) change(86-02-24,Margolin), approve(86-02-24,MCR7325), +;;; audit(86-08-12,Harvey), install(86-08-20,MR12.0-1136): +;;; Added file-object, pathname, and packed-pointer structures, and +;;; associated macros. +;;; END HISTORY COMMENTS + +(%include sharpsign) +(%include defstruct) +(%include defmacro) +(declare (macros t)) + +;;; The "eline" (editor-line) datatype is constructed as such: +;;; +;;; (line-contents . (previous-line . next-line)) +;;; +;;; previous-line and next-line are other editor lines; line-contents +;;; is either a Lisp string or a "filecons", which is constructed +;;; as follows: +;;; +;;; (char-ptr . linel) +;;; +;;; char-ptr is a fixnum-encoded pointer to the starting character +;;; of a line in a temp-seg into which e_pl1_ copied a file at read-in +;;; time. linel is the length of that line, including the mandatory +;;; newline at the end. +(defstruct (eline + (:type tree) + (:conc-name)) + (contents nil) + (previous nil) + (next nil)) + +;;; Some special cases +(defmacro prevline () + '(eline-previous curline)) +(defmacro nextline () + '(eline-next curline)) +;;; No need for the old curelevator, it was only directly referenced in +;;; one place, and that was fixed. + +;;; If this format ever changes, e_lap_.lap will have to be changed. +;;; It expects a cons. +(defstruct (filecons + (:type tree) + (:conc-name)) + pointer + length) + +;;; The format of a mark is (eline . position) +(defstruct (mark + (:type tree) + (:conc-name)) + eline + position) + +;;; +;;; The Multics file interface in EMACS operates on a "file-object". A +;;; file-object is the following list: +;;; +;;; (CONTENTS ABSPATH UID FCB_PTR) +;;; +;;; where: +;;; +;;; CONTENTS +;;; a list of fileconses (ptr .length) to the segments that +;;; make up the file (one if it is an archive component or SSF, +;;; multiple if it is an MSF), +;;; ABSPATH +;;; is the absolute pathname of the Multics file (segment), +;;; UID +;;; is the Multics unique-id of the file and is used by find-file, +;;; FCB_PTR +;;; is a pointer to the msf_manager_ file control block for the file. +;;; DTCM +;;; is a fixnum representing the time the file was last modified. +;;; ORIGINAL-ACCESS +;;; if non-nil is a pointer to a data structure used to restore +;;; access after it was forced. + +(defstruct (file-object + (:type list) + (:conc-name fobj-)) + contents + path + uid + (fcb-ptr nil) + dtcm + (original-access nil)) + +;;; A couple of special cases for segment 0 +(defmacro fobj-seg0 (file-object) + `(first (fobj-contents ,file-object))) +(defmacro fobj-pointer (file-object) + `(filecons-pointer (fobj-seg0 ,file-object))) +(defmacro fobj-length (file-object) + `(filecons-length (fobj-seg0 ,file-object))) +;;; And a common combination +(defmacro fobj-abs-path (file-object) + `(absolute-pathname (fobj-path ,file-object))) + +;;; A PATHNAME consists of a directory, an entryname, and an archive component +;;; name. If it isn't an archive component, pn-component is the null string. +;;; The expand-pathname and absolute-pathname functions in e_multics_files_ +;;; translate from and to a single character string. Absolute-pathname +;;; encaches the absolute pathname in the abs-path component, to speed up +;;; repetitive calls. + +(defstruct (pathname + (:type list) + (:conc-name pn-)) + (directory "") + (entry "") + (component "") + (abs-path nil)) + +;;; + +;;; The packed-pointer defstruct is usable for manipulating +;;; pointers expressed as a Lisp fixnum. + +(defstruct (packed-pointer + (:type fixnum) + (:conc-name pptr-)) + ((bit-offset #o3606) + (seg-number #o2214) + (word-offset #o0022))) + + + + + e_define_command_.lisp 08/20/86 2309.2rew 08/20/86 2249.1 248544 + + + +;;; *********************************************************** +;;; * * +;;; * Copyright, (C) Honeywell Information Systems Inc., 1982 * +;;; * * +;;; * Copyright (c) 1979 by Massachusetts Institute of * +;;; * Technology and Honeywell Information Systems, Inc. * +;;; * * +;;; *********************************************************** + +;;; +;;; +;;; Emacs Command Definition Macro +;;; +;;; +;;; Initial coding: August-September 1979 by GMP. +;;; Modified: 7 May 1981 Soley to fix minor bugs. +;;; Modified: Fall 1981 Soley for &nobreak and &completions. +;;; Modified: 31 March 1982 Soley for &undo-function, clean up. +;;; Modified: 15 May 1982 by J. Spencer Love for &epilogue, &cleanup. +;;; +;;; +;;; Syntax: +;;; (define-command function-name +;;; forms) +;;; +;;; (defcom function-name forms) +;;; +;;; Keywords in forms: +;;; +;;; &arguments ARGS, &args ARGS, &a ARGS +;;; +;;; &cleanup FUNCTION +;;; +;;; &documentation STRING, &doc STRING +;;; +;;; &epilogue SYMBOL +;;; +;;; &negative-function FUNCTION, &nf FUNCTION +;;; +;;; &numeric-argument SPEC, &numarg SPEC, &na SPEC +;;; +;;; &numeric-function SYMBOL +;;; +;;; &no-break +;;; +;;; &prologue SYMBOL +;;; +;;; &undo-function SPEC, &undo SPEC, &inverse SPEC +;;; +;;; Terms: +;;; ARGS is a list of argument specifications. +;;; STRING is a character string in doublequotes. +;;; SYMBOL is the name of a function. +;;; FUNCTION is either a SYMBOL, or &code FORMS &end_code. +;;; VALUE is either a CONSTANT or &eval FORM. +;;; CONSTANT is either a STRING, a number, or a quoted FORM. +;;; FORM is something for lisp to evaluate. +;;; +;;; Format of an argument specification: +;;; +;;; Format of &numeric-argument FORM: +;;; &numeric-argument is followed by a keyword or by a list which +;;; contains one or more keywords. The keywords which may appear +;;; after &numeric-argument are &pass, &ignore, &reject and &repeat. +;;; The additional keywords which may appear in the list are +;;; &lower-bound (&lb) and &upper-bound (&ub). These two keywords +;;; are followed by a VALUE. &reject is the default unless bounds +;;; are specified, in which case &pass is the default. +;;; + +(declare (macros t) + (*lexpr dc-error dc-error-argument dcev-error) + (special encoded-values)) + +(%include backquote) + +;;; Macro to define an Emacs command + +(defprop define-command define-command/ MACRO macro) +(defprop defcom define-command/ MACRO macro) + +;;; Macro to define a synonym of an Emacs command +;;; Syntax: (defcom-synonym synonym command) + +(defun define-command-synonym macro (form) + (let ((synonym (cadr form)) + (command (caddr form))) + `(progn 'compile + (defprop ,synonym ,command editor-command) + (defprop ,synonym ,command expr)))) + +(defprop defcom-synonym define-command-synonym macro) + +;;; +;;; Function that parses a command definition +;;; + +(defun define-command/ MACRO (the-form) + (let ((function-name (cadr the-form)) ;first arg must be name + (the-function) + (prologue-function) + (epilogue-function) + (numeric-function) + (negative-function) + (cleanup-function) + (undo-function) + (undo-info) + (argument-info) + (numeric-arg-info) + (documentation)) + + (or (symbolp function-name) + (dc-error "" "Function name must be a symbol.")) + (setq encoded-values nil) + + (do ((form (cddr the-form) rest-of-form) + (current) + (no-break nil) + (rest-of-form)) + ((null form) ;until nothing left + (dc-build-result-list function-name (nreverse the-function) + prologue-function epilogue-function + numeric-function negative-function + argument-info numeric-arg-info + documentation no-break undo-function + undo-info cleanup-function)) + + (setq current (car form) rest-of-form (cdr form)) + + (cond + + ;; Prologue function. + ((eq current '&prologue) + (and prologue-function + (dc-error-duplicate-key function-name current)) + (let ((x (dc-parse-encoded-value function-name 0 + rest-of-form current + 'symbolp + "a function name"))) + (setq prologue-function (cadar x) ;want the symbol + rest-of-form (cdr x)))) + + ;; Epilogue function. + ((eq current '&epilogue) + (and epilogue-function + (dc-error-duplicate-key function-name current)) + (let ((x (dc-parse-encoded-value function-name 0 + rest-of-form current + 'symbolp + "a function name"))) + (setq epilogue-function (cadar x) ;want the symbol + rest-of-form (cdr x)))) + + ;; Cleanup function. + ((eq current '&cleanup) + (and cleanup-function + (dc-error-duplicate-key function-name current)) + (let ((x (dc-parse-encoded-value function-name 0 + rest-of-form current + 'symbolp + "a function name"))) + (setq cleanup-function (cadar x) ;want the symbol + rest-of-form (cdr x)))) + + ;; Numeric function. + ((eq current '&numeric-function) + (and numeric-function + (dc-error-duplicate-key function-name current)) + (let ((x (dc-parse-encoded-value function-name 0 + rest-of-form current + 'symbolp + "a function name"))) + (setq numeric-function (cadar x) ;want the symbol + rest-of-form (cdr x)))) + + ;; Negative function. + ((memq current '(&negative-function &nf)) + (and negative-function + (dc-error-duplicate-key function-name + '&negative-function)) + (cond ((symbolp (car rest-of-form)) + (cond ((eq (car rest-of-form) '&code) + (setq rest-of-form (cdr rest-of-form)) + (do ;get the function body + ((nf (car rest-of-form) + (car rest-of-form))) + ((or (null nf) + (and (symbolp nf) + (samepnamep (substr nf 1 1) + "&"))) + (and (eq nf '&end-code) + (setq rest-of-form + (cdr rest-of-form)))) + (setq negative-function + (nconc negative-function + (list nf)) + rest-of-form (cdr rest-of-form)))) + ((samepnamep (substr (car rest-of-form) + 1 1) + "&") + (dc-error function-name + "Unknown keyword after " + "&negative-function: " + (car rest-of-form))) + (t ;function name + (setq negative-function + (car rest-of-form) + rest-of-form (cdr rest-of-form))))) + (t ;bad syntax + (dc-error function-name + "&negative-function must be followed " + "by a function name or &code.")))) + + ;; Undo function. + ((memq current '(&undo-function &undo &inverse)) + (and (or undo-function undo-info) + (dc-error-duplicate-key function-name current)) + (cond ((member (car rest-of-form) '(&pass (&pass))) + (setq undo-info '&pass + rest-of-form (cdr rest-of-form))) + ((member (car rest-of-form) '(&ignore (&ignore))) + (setq undo-info '&ignore + rest-of-form (cdr rest-of-form))) + ((or (eq (car rest-of-form) '&reject) + (equal (car rest-of-form) '(&reject))) + (setq undo-info '&reject + rest-of-form (cdr rest-of-form))) + ((not (symbolp (car rest-of-form))) + (dc-error + function-name + "&undo-function must be followed " + "by a function name, &pass, &reject, " + "&ignore, or &code.")) + ((eq (car rest-of-form) '&code) + (setq rest-of-form (cdr rest-of-form)) + (do ;get the function body + ((nf (car rest-of-form) + (car rest-of-form))) + ((or (null nf) + (and (symbolp nf) + (samepnamep (substr nf 1 1) "&"))) + (and (eq nf '&end-code) + (setq rest-of-form + (cdr rest-of-form)))) + (setq undo-function + (nconc undo-function (list nf)) + rest-of-form (cdr rest-of-form)))) + ((samepnamep (substr (car rest-of-form) 1 1) "&") + (dc-error function-name + "Unknown keyword after " + "&undo-function: " + (car rest-of-form))) + (t ;function name + (setq undo-function (car rest-of-form) + rest-of-form (cdr rest-of-form))))) + + ;; Numeric argument. + ((memq current '(&numeric-argument &numarg &na)) + (and numeric-arg-info + (dc-error-duplicate-key function-name + '&numeric-argument)) + (setq numeric-arg-info + (dc-parse-numeric-arg-info function-name + (car rest-of-form)) + rest-of-form (cdr rest-of-form))) + + ;; Signal echnego that this doesn't cause a break. + ((eq current '&no-break) (setq no-break t)) + + ;; Arguments. + ((memq current '(&arguments &args &a)) + (and argument-info + (dc-error-duplicate-key function-name '&arguments)) + (setq argument-info + (dc-parse-arguments function-name (car rest-of-form)) + rest-of-form (cdr rest-of-form))) + + ;; Documentation. + ((memq current '(&documentation &doc)) + (and documentation + (dc-error-duplicate-key function-name '&documentation)) + (setq documentation (car rest-of-form) + rest-of-form (cdr rest-of-form)) + (or (stringp documentation) + (dc-error function-name + "&documentation must be followed " + "by a string."))) + + ;; Unknown. Might be the actual function..... + ((and (symbolp current) + (samepnamep (substr current 1 1) "&")) + (dc-error function-name "Unrecoginzed keyword: " current)) + + ;; Yup, it's the function. + (t (setq the-function (cons current the-function))))))) + +;;; +;;; Parse an encoded value: an encoded value is either a constant or +;;; &eval followed by a form to evaluate at runtime +;;; + +(defun dc-parse-encoded-value (function-name arg-no rest-of-form + qualifier-name value-typep value-name) + (let ((type 'quote) ;just a value + (value (car rest-of-form))) + (cond ((eq value '&eval) + (let ((eval-name + (make_atom (catenate function-name "-$-" + (dc-decimal arg-no) + "-$-" qualifier-name))) + (function)) + (or (cdr rest-of-form) ;if nothing follows it + (dcev-error function-name arg-no qualifier-name + " &eval must be followed by a form " + "or &code.")) + (cond ((eq (cadr rest-of-form) '&code) + (setq rest-of-form (cddr rest-of-form)) + (do ;construct the function + ((nf (car rest-of-form) (car rest-of-form))) + ((or (null nf) ;either nothing left + (and (symbolp nf) + (samepnamep (substr nf 1 1) "&"))) + (and (eq nf '&end-code) + (setq rest-of-form (cdr rest-of-form)))) + (setq function (nconc function (list nf)) + rest-of-form (cdr rest-of-form)))) + ((and (symbolp (cadr rest-of-form)) + (samepnamep (substr (cadr rest-of-form) + 1 1) + "&")) + (dcev-error function-name arg-no qualifier-name + " Unknown keyword following &eval: " + (cadr rest-of-form))) + (t (setq function (list (cadr rest-of-form)) + rest-of-form (cddr rest-of-form)))) + (setq encoded-values + `(,.encoded-values + (defun ,eval-name () + . ,function)) + type 'eval + value eval-name))) ;get name in right place + (t ;simple value, check type + (or (funcall value-typep value) + (dcev-error function-name arg-no qualifier-name + " must be followed by " value-name + " or &eval.")) + (setq rest-of-form (cdr rest-of-form)))) + (cons (list type value) rest-of-form))) + +;;; +;;; Parse specifications for handling of numeric argument by this command. +;;; + +(defun dc-parse-numeric-arg-info (function-name the-form) + (do ((form the-form rest-of-form) + (processing-type) + (lower) (upper) + (phrase) (rest-of-form)) + ((null form) ;until all parsed + (and (eq processing-type '&ignore) ;ignore the argument + (or lower upper) + (dc-error function-name + "&ignore may not be used with other " + "&numeric-argument qualifiers.")) + (and (eq processing-type '&reject) ;reject numeric arguments + (or lower upper) + (dc-error function-name + "&reject may not be used with other " + "&numeric-argument qualifiers.")) + (and lower (eq (car lower) 'quote) + upper (eq (car upper) 'quote) + (< (cadr upper) (cadr lower)) ;invalid range + (dc-error function-name + "Invalid numeric argument range " + (dc-decimal (cadr lower)) + ":" (dc-decimal (cadr upper)))) + (and (null processing-type) + (or lower upper) + (setq processing-type '&pass)) + (cons (or processing-type '&reject) ;supply default if needed + (and (or lower upper) (cons lower upper)))) + ;; + ;; Find next token to be digested. + ;; + (cond ((not (atom form)) + (setq phrase (car form) + rest-of-form (cdr form))) + ((not (eq form the-form)) + (dc-error function-name + "Malformed list following &numeric-argument.")) + (t (setq phrase form + rest-of-form nil))) + ;; + ;; Analyze token. + ;; + (cond ((memq phrase '(&pass &repeat &ignore &reject)) + (and processing-type + (dc-error function-name + "Only one of &pass, &repeat, &ignore, or " + "&reject may appear after " + "&numeric-argument.")) + (setq processing-type phrase)) + ((memq phrase '(&lower-bound &lb)) + (and lower + (dc-error function-name + "The key &lower-bound may only appear once " + "after &numeric-argument.")) + (let ((x (dc-parse-encoded-value function-name 0 rest-of-form + '&lower-bound 'fixp + "an integer"))) + (setq lower (car x) rest-of-form (cdr x)))) + ((memq phrase '(&upper-bound &ub)) + (and upper + (dc-error function-name + "The key &upper-bound may only appear once " + "after &numeric-argument.")) + (let ((x (dc-parse-encoded-value function-name 0 rest-of-form + '&upper-bound 'fixp + "an integer"))) + (setq upper (car x) rest-of-form (cdr x)))) + (t (dc-error function-name + "Unrecognized keyword following " + "&numeric-argument: " phrase))))) + +;;; +;;; Parse the list of argument specifications. +;;; + +(defun dc-parse-arguments (function-name the-form) + (do ((form the-form (cdr form)) + (argument-list) + (arg-no 1 (1+ arg-no))) ;for error messages + ((null form) ;done when out of forms + (nreverse argument-list)) + (let ((phrase (car form))) + (let ((x (dcpa-single-argument function-name + (null (cdr form)) + arg-no phrase))) + (setq argument-list (cons x argument-list)))))) + +;;; +;;; Parse a single argument specification. +;;; + +(defun dcpa-single-argument (function-name last-argp arg-no specification) + (let ((name) ;argument symbol + (data-type) ;datatype of argument + (default-value) ;default value + (prompt-info) ;prompt string and terminator + (range-info) ;range for integers + (completion-info) ;for completer command + (validation-info)) ;acceptable values of symbols + (cond ((symbolp specification) ;simple case + (setq name specification)) + (t ;more complex + (setq name (car specification)) + (or (symbolp name) + (dc-error-argument function-name arg-no + "No name specified.")) + (do ((qualifiers (cdr specification) rest-of-qualifiers) + (current) (rest-of-qualifiers)) + ((null qualifiers)) ;until nothing left + (setq current (car qualifiers) + rest-of-qualifiers (cdr qualifiers)) + (cond + ((or (not (symbolp current)) + (not (samepnamep (substr current 1 1) "&"))) + (dc-error-argument function-name arg-no + "An & construct was expected, " + "but not found."))) + (cond + ((memq current '(&rest-as-string &rest-as-list)) + (and (or data-type prompt-info default-value + range-info completion-info validation-info + rest-of-qualifiers) + (dc-error-argument + function-name arg-no current + " may not appear with any other argument " + "qualifiers.")) + (or last-argp + (dc-error-argument function-name arg-no + "The argument with " + current " must be last.")) + (setq data-type current)) + ((memq current '(&completions &completion &comp)) + (and completion-info + (dc-error-argument-duplicate-key + function-name arg-no '&completions)) + (setq completion-info (car rest-of-qualifiers) + rest-of-qualifiers (cdr rest-of-qualifiers))) + ((memq current '(&string &symbol &integer)) + (and data-type + (dc-error-argument + function-name arg-no + "Only one of &string, &symbol, and " + "&integer may be used.")) + (setq data-type current)) + ((eq current '&prompt) ;prompt string + (and prompt-info + (dc-error-argument-duplicate-key + function-name arg-no '&prompt)) + (let ((x (dcpa-parse-prompt function-name arg-no + rest-of-qualifiers))) + (setq prompt-info (car x) + rest-of-qualifiers (cdr x)))) + ((eq current '&default) ;default value + (and default-value + (dc-error-argument-duplicate-key + function-name arg-no '&default)) + (let ((x (dc-parse-encoded-value + function-name arg-no rest-of-qualifiers + '&default 'atom "a value"))) + (setq default-value (car x) + rest-of-qualifiers (cdr x)))) + (t + (dc-error-argument function-name arg-no + "Unrecognized keyword: " + current)))))) + + ;; Perform consistency checks and construct value + (or data-type (setq data-type '&string)) + (and validation-info (not (eq data-type '&symbol)) + (dc-error-argument function-name arg-no + "&valid may only be specified for " + "&symbol arguments.")) + (and range-info (not (eq data-type '&integer)) + (dc-error-argument function-name arg-no + "Numeric ranges may only be specified " + "for &integer arguments.")) + (or prompt-info default-value + (setq prompt-info (cons (list 'quote (catenate name ": ")) + (ascii 012)))) ;end with newline + (cons name + (list + (boole 7 ;fixnum describing argument + (cond + ((eq data-type '&string) 0) + ((eq data-type '&symbol) (lsh 100000 18.)) + ((eq data-type '&integer) (lsh 200000 18.)) + ((eq data-type '&rest-as-string) (lsh 300000 18.)) + ((eq data-type '&rest-as-list) (lsh 400000 18.)) + (t (lsh 700000 18.))) + (cond (prompt-info (lsh 040000 18.)) ;have prompt + (t 0)) + (cond (default-value (lsh 020000 18.)) (t 0)) + (cond ((or range-info validation-info) + (lsh 010000 18.)) + (t 0))) + prompt-info + default-value + (cond ((eq data-type '&integer) range-info) + (t validation-info)) + completion-info)))) + +;;; +;;; Parse prompt specification +;;; + +(defun dcpa-parse-prompt (function-name arg-no rest-of-qualifiers) + (let ((x (dc-parse-encoded-value function-name arg-no rest-of-qualifiers + '&prompt 'stringp "a string"))) + (let ((string (car x)) + (rest (cdr x)) + (term)) + (setq term (car rest)) ;get possible terminator + (cond ((and term ;there's something + (symbolp term) + (not (samepnamep (substr term 1 1) "&"))) + (cond ((memq term '(NL ESC)) + (setq term (cond ((eq term 'NL) (ascii 012)) + (t (ascii 033))) + rest (cdr rest))) + (t + (dc-error-argument function-name arg-no + "Prompt terminator must " + "be NL or ESC.")))) + (t (setq term (ascii 012)))) + (cons (cons string term) + rest)))) + +;;; Create result of define-command macro +(defun dc-build-result-list (function-name the-function prologue-function + epilogue-function numeric-function + negative-function argument-info numeric-arg-info + documentation no-break undo-function undo-info + cleanup-function) + ;; + ;; Check numeric function conflicts. + ;; + (and numeric-function negative-function + (dc-error-conflict function-name "&numeric-function" + "&negative-function")) + (and numeric-function numeric-arg-info + (dc-error-conflict function-name "&numeric-function" + "&numeric-argument")) + (and numeric-function + (setq numeric-arg-info '(&pass))) + ;; + ;; Check for negative function conflicts. + ;; + (and negative-function + (null numeric-arg-info) + (dc-error-required function-name "&negative-function" + "&numeric-argument")) + (and negative-function + (eq (car numeric-arg-info) '&ignore) ;But ignore argument! + (dc-error-conflict function-name "&negative-function" + "&numeric-argument (&ignore)")) + (and negative-function + (eq (car numeric-arg-info) '&reject) ;But reject argument! + (dc-error-conflict function-name "&negative-function" + "&numeric-argument (&reject)")) + ;; + ;; Default numeric argument handling. + ;; + (or numeric-arg-info (setq numeric-arg-info '(&reject))) + ;; + ;; Construct flag word for execute-new-command. + ;; + (let ((result ()) + (editor-command-value + (boole 7 ;Logical OR. + (cond (argument-info + (boole 7 ;Logical OR. + (lsh 400000 18.) + (boole 1 (length argument-info) 777777))) + (t 0)) ;No arguments. + (cond (negative-function (lsh 200000 18.)) (t 0)) + (cond ((cdr numeric-arg-info) (lsh 100000 18.)) (t 0)) + (let ((type (car numeric-arg-info))) + (cond ((eq type '&pass) 0) + ((eq type '&repeat) (lsh 010000 18.)) + ((eq type '&ignore) (lsh 020000 18.)) + ((eq type '&reject) (lsh 030000 18.)) + (t ;Unknown type. + (lsh 070000 18.)))) + (cond (prologue-function (lsh 004000 18.)) (t 0)) + (cond (epilogue-function (lsh 002000 18.)) (t 0)) + (cond (numeric-function (lsh 001000 18.)) (t 0)) + (cond (undo-function (lsh 000400 18.)) (t 0)) + (cond ((eq undo-info '&pass) (lsh 000200 18.)) (t 0)) + (cond ((eq undo-info '&ignore) (lsh 000100 18.)) + (t 0)) + (cond (cleanup-function (lsh 000040 18.)) (t 0))))) + ;; + ;; Build output structure. + ;; + (setq result + `((putprop ',function-name ,editor-command-value + 'editor-command) + . ,result)) + + (and no-break + (setq result + `((setq nobreak-functions + (cons ',function-name nobreak-functions)) + . ,result))) + + (setq result + `((defun ,function-name + ,(mapcar '(lambda (x) (car x)) argument-info) + . ,the-function) + . ,result)) + + (and prologue-function + (setq result + `((putprop ',function-name ',prologue-function + 'ed-prologue-function) + . ,result))) + + (and epilogue-function + (setq result + `((putprop ',function-name ',epilogue-function + 'ed-epilogue-function) + . ,result))) + + (and cleanup-function + (setq result + `((putprop ',function-name ',cleanup-function + 'ed-cleanup-function) + . ,result))) + + (and numeric-function + (setq result + `((putprop ',function-name ',numeric-function + 'ed-numeric-function) + . ,result))) + + (and negative-function + (cond ((symbolp negative-function) + (setq result + `((putprop ',function-name ',negative-function + 'ed-negative-function) + . ,result))) + (t (let ((nf-name + (make_atom + (catenate function-name + "-$-negative-function")))) + (setq result + `((defun ,nf-name + ,(mapcar '(lambda (x) (car x)) + argument-info) + . ,negative-function) + (putprop ',function-name + ',nf-name + 'ed-negative-function) + . ,result)))))) + + (and undo-function + (cond ((symbolp undo-function) + (setq result + `((putprop ',function-name ',undo-function + 'ed-undo-function) + . ,result))) + (t (let ((un-name + (make_atom + (catenate function-name + "-$-undo-function")))) + (setq result + `((defun ,un-name + ,(mapcar '(lambda (x) (car x)) + argument-info) + . ,undo-function) + (putprop ',function-name + ',un-name + 'ed-undo-function) + . ,result)))))) + + (let ((range (cdr numeric-arg-info))) + (and range + (setq result + `((putprop ',function-name ',range + 'ed-numeric-range) + . ,result)))) + + (and argument-info + (setq result + `((putprop ',function-name + ',(mapcar '(lambda (x) (cdr x)) + argument-info) + 'ed-argument-list) + . ,result))) + + (and encoded-values + (setq result (nconc result encoded-values))) + + (and documentation + (setq result + `((putprop ',function-name ,documentation + 'documentation) + . ,result))) + + `(progn 'compile . ,result))) + +;;; Error reporting functions + +(defun dc-error n + (cond ((= (stringlength (arg 1)) 0) + (error + (apply + 'catenate + (cons "define-command: " (listify (- 1 n)))))) + (t (error + (apply + 'catenate + (cons (catenate + "define-command: In definition of " (arg 1) ". ") + (mapcar 'dc-decimal (listify (- 1 n))))))))) + +(defun dc-error-duplicate-key (function-name key-name) + (dc-error function-name + "The key " key-name " may only appear once.")) + + +(defun dc-error-conflict (function-name key-1 key-2) + (dc-error function-name + "The keys " key-1 " and " key-2 " are mutually exclusive.")) + + +(defun dc-error-required (function-name given-key missing-key) + (dc-error function-name + "Use of the key " given-key " requires that the key " + missing-key " also be specified.")) + + +(defun dc-error-argument n + (error (apply 'catenate + (cons (catenate + "define-command: In definition of argument #" + (dc-decimal (arg 2)) " of " (arg 1) ". ") + (listify (- 2 n)))))) + + +(defun dc-error-argument-duplicate-key (function-name arg-no key-name) + (dc-error-argument function-name arg-no + "The key " key-name " may only appear once.")) + + +(defun dcev-error n + (cond ((= (arg 2) 0) (apply 'dc-error (listify n))) + (t (apply 'dc-error-argument (listify n))))) + + +(defun dc-decimal (x) + (let ((base 10.) (ibase 10.) (*nopoint t)) + (maknam (exploden x)))) + + + + bull_copyright_notice.txt 08/30/05 1008.4r 08/30/05 1007.3 00020025 + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group Bull including Bull HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell Bull Inc., Groupe Bull +and Bull HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato.Users consider that Multics provided the best software architecture for +managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, Bull or Bull HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by Bull HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_packages_.s.archive b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_emacs_packages_.s.archive new file mode 100644 index 0000000000000000000000000000000000000000..af0a09c1a46358d2858d25b97c0a979954d1273e GIT binary patch literal 245728 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

(xZQqe|U)i($`|;e@-TQZT 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

o!q-|nc72ziuix7AebAW$QK`&tQ(X1^46cFz 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

M+{d{-;e!+Rlkl!=s z5mJF!j}gu5hW%L-%ZbIV)rcS-f^B1$6PEDNH`sdB#*%Q+@`!`h0khCFo}OM{%dlyj z+Z{b>uFOvK!OdimgKEBd0vR6#HF3gWu*t_GyaLK6&6*$ zIJ$@dOKj4mz5!i!E5H2fKa;ZVJ(ci>xS--ex)7oRM+g*H$N;mz*y-e-IXgCRLyX5) zPGHeSq5%^;wLrv2Xcyg>&0I~mfHQ^sUH{?ez}1gdQYdPR5fy6JdyH5#7N;?=U{e!F z^C7BM;UbZv0)~c}W(K?Y{|I6SCO7xjS$`Cn3=QHev8%#`b5>N14ZKzPOBTTzb4?z%Fs9pvZ#T^OU2DGkwD1>L z4?S6KRG78$8i?lI5a)MzACb=vX{#OK#vpiZK^s|1STGHDU;!cEQ^+l~NVL?0rV=g6 z_W93im`(6+1<4{iNn@5w;ZPI$H3%EJaimWCFE1DCD@lmI#RRcZD4@~#49Rm)A}c7{ z=|j2TP5+8Uz)3fJdpQ}Og!Jv}ju-)}?Qa0%8I5GDzf0y0VDGDOEp(3d zFi;nqS9VwHq%n(WyW~U{lc{x>5ow+J^~fC_st9~pgu1q^<3ovMn=YWs+zcOPSY(b> zje0g$g1P$3QlP4qn6~!$Lpb*Qd>oPY%qAyicb0~g?2Y9&gzrL)OS`0$c5N@*BvDEB zft|HEn(r2nnu&j`{1!@!b|AF#>6=lMEy%$GV>J+N(MIp{+S|~r!#~#a1O~6NK{$C zAtQP^LMTMhww#DX&hECpjr)Ti7+rsXS0i+H6Gq=gXYZMucF#RuXX8$B_#CSjax6G6 zpv27NbGu;&co#1Q^ zGyFKdJjbBZ?q8-b`}d}oZ*kFf^H&6Fc!5zxS~&tjEP;jIR7KUrMWaugd>)IxFc8p=>g-$;SL;bqXpB#Mz-G1y1jA{k`v(V{8oj?$ zv-`YVFulAWl>w0%O8m^A(QGqsCASYk(D(+8fiYm}YjOa@)7BhMcF(T~V`sN39lyVB zzTRZZ+vsh>ICXY?gle)xHTuJWfW;1!p+Am*5s2rnc3a{cm;fLRVi$t)?~4wsI;`~X zC|>_ds#FdE^(LOG!*qb+>G9&<3DmREc5EXEw*=E-lpj=9x`*jYvp-+=@K_n3qzWav| zn)|OejQ&7YL5K8)kye9^5Mhsw;cH*v(PXd_T3uYfJ%!A;0%Gy=2ttfgg5J^&Q7^dU zPn+b3N01g3Gaz%YeG?28apt@-kRCPqUYH8xtDU mailbox.flags.salvaged; + a_msgcount = a_mailbox_ptr -> mailbox.n_messages; + + return; + +/* end emacs_open_mailbox; */ + +/* Read one message. We are given a pointer to a mail system message, and + we use the mail system to format it. RMAIL will expect to find the + formatted message in a black magic string pointed to by a_buffer_ptr */ + +emacs_read_message: + entry (a_message_ptr, a_buffer_ptr, a_line_length, a_acknowledge_flag, + a_envelope_format, a_header_format, a_redistributions_list_format, + a_body_length, a_seen_sw, a_code); + +dcl buffer_position fixed bin(21); + +dcl 1 auto_format_options aligned like format_message_options; +dcl chrsused fixed bin(35) based; /* ugh, ugh ... shades of Scribe */ + + + a_code = 0; + + unspec (auto_format_options) = ""b; + + auto_format_options.version = FORMAT_MESSAGE_OPTIONS_VERSION_1; + auto_format_options.line_length = a_line_length; + auto_format_options.include_body = "1"b; + + call parse_formatting_mode (a_envelope_format, auto_format_options.envelope_formatting_mode, a_code); + if a_code ^= 0 then do; a_code = -1; return; end; + + call parse_formatting_mode (a_header_format, auto_format_options.header_formatting_mode, a_code); + if a_code ^= 0 then do; a_code = -2; return; end; + + call parse_formatting_mode (a_redistributions_list_format, auto_format_options.redistributions_list_formatting_mode, a_code); + if a_code ^= 0 then do; a_code = -3; return; end; + + buffer_position = 4; /* 4 chars = 1 word, leaves room for the bmstr length */ + + call mlsys_utils_$format_message (a_message_ptr, addr (auto_format_options), a_buffer_ptr, (sys_info$max_seg_size-1)*4, buffer_position, a_code); + if a_code ^= 0 then return; + + a_buffer_ptr -> chrsused = buffer_position - 4; + + a_body_length = a_message_ptr -> message.body.total_lines; + + if a_message_ptr -> message.flags.must_be_acknowledged & a_acknowledge_flag + then call mail_system_$acknowledge_message (a_message_ptr, a_code); + + a_seen_sw = a_message_ptr -> message.flags.seen; + + return; + +parse_formatting_mode: + proc (a_formatting_mode, a_mlsys_formatting_mode, a_code); + +dcl a_formatting_mode char(*) parameter; +dcl a_mlsys_formatting_mode fixed bin parameter; +dcl a_code fixed bin (35) parameter; + + a_code = 0; + + a_formatting_mode = translate (a_formatting_mode, "_", "-"); /* allow either underscrose or dashes */ + + if a_formatting_mode = "none_formatting_mode" + then a_mlsys_formatting_mode = NONE_FORMATTING_MODE; + else if a_formatting_mode = "brief_formatting_mode" + then a_mlsys_formatting_mode = BRIEF_FORMATTING_MODE; + else if a_formatting_mode = "default_formatting_mode" + then a_mlsys_formatting_mode = DEFAULT_FORMATTING_MODE; + else if a_formatting_mode = "long_formatting_mode" + then a_mlsys_formatting_mode = LONG_FORMATTING_MODE; + else a_code = -1; /* this will be special cased by RMAIL */ + +end parse_formatting_mode; + +/* end emacs_read_message; */ + +/* Given a pointer to a mailbox, and a message number, return a pointer + to that message (reading it if need be). */ + +emacs_get_message_ptr: + entry (a_mailbox_ptr, a_message_number, a_message_ptr, a_code); + + a_code = 0; + + a_message_ptr = a_mailbox_ptr -> mailbox.messages(a_message_number).message_ptr; + + if a_message_ptr = null then do; + call mail_system_$read_message (a_mailbox_ptr, a_message_number, a_code); + if a_code ^= 0 then return; + a_message_ptr = a_mailbox_ptr -> mailbox.messages(a_message_number).message_ptr; + end; + + return; + +/* Close a mailbox */ + +emacs_mailbox_close: + entry (a_mailbox_ptr, a_code); + +dcl 1 auto_close_options aligned like close_options; + + a_code = 0; + + unspec (auto_close_options) = ""b; + + auto_close_options.version = CLOSE_OPTIONS_VERSION_2; + auto_close_options.flags.perform_deletions = "1"b; + auto_close_options.flags.report_deletion_errors = "0"b; /* I'm not about to set up a sub_err_ handler */ + + call mail_system_$close_mailbox (a_mailbox_ptr, addr (auto_close_options), a_code); + + return; + +/* end emacs_mailbox_close; */ + +get_user_default_address: + entry returns(ptr); + +dcl anonymous fixed bin; + + call user_info_$login_data ("", "", "", anonymous, (0), (0), (0), ""); + + if anonymous = 1 + then return (mlsys_data_$user_default_mailbox_address); + else return (mlsys_data_$user_mail_table_address); + +/* end get_user_default_address; */ + +get_user_default_mbx_address: + entry returns (ptr); + + return (mlsys_data_$user_default_mailbox_address); + +/* end get_user_default_mbx_address; */ + +/* Create an address list from a character string representation of a list of + addresses. */ + +emacs_get_address_list: + entry (a_addr, a_addr_ptr, a_error_ptr, a_code); + +dcl 01 pt_ops like parse_text_options aligned; + +/* Prepare for cleanup condition */ + + a_code = 0; + a_addr_ptr = null; + a_error_ptr = null; + on clean_up begin; + if a_addr_ptr ^= null then + call mail_system_$free_address_list (a_addr_ptr, (0)); + if a_error_ptr ^= null then + call free_parse_text_error_list (a_error_ptr); + end; + +/* Parse the forwarding destination addresses */ + + pt_ops.version = PARSE_TEXT_OPTIONS_VERSION_1; + pt_ops.area_ptr = get_system_free_area_ (); + pt_ops.list_errors = "1"b; + pt_ops.validate_addresses = "1"b; + pt_ops.include_invalid_addresses = "0"b; + pt_ops.mbz = ""b; + + call mlsys_utils_$parse_address_list_text ((a_addr), addr (pt_ops), + ADDRESS_LIST_VERSION_2, a_addr_ptr, a_error_ptr, a_code); + if a_code ^= 0 then do; + if a_addr_ptr ^= null then do; + call mail_system_$free_address_list (a_addr_ptr, (0)); + a_addr_ptr = null; + end; + return; + end; + + return; + +/* end emacs_get_address_list */ + +emacs_create_message: + entry (a_subject, a_message_ptr, a_code); + +dcl from_list ptr; + + + a_code = 0; + + call mail_system_$create_message (MESSAGE_VERSION_2, a_message_ptr, a_code); + if a_code ^= 0 then return; + + call mail_system_$replace_subject (a_message_ptr, a_subject, a_code); + if a_code ^= 0 then return; + +/* Do the from field hacking to insure that we see the from field in the + buffer. mail_system_ would wait until delivery time to fill it in. */ + + call mail_system_$create_address_list (ADDRESS_LIST_VERSION_2, from_list, a_code); + if a_code ^= 0 then return; + + call mail_system_$add_address (from_list, e_mail_pl1_$get_user_default_address(), ADDRESS_LIST_VERSION_2, a_code); + if a_code ^= 0 then return; + + call mail_system_$replace_from (a_message_ptr, from_list, a_code); + return; + +/* end emacs_create_message; */ + +emacs_create_reply_message: + entry (a_original_message_ptr, a_include_authors, a_include_recipients, a_include_self, a_new_message_ptr, a_code); + + +dcl 1 auto_reply_options aligned like reply_options; + + a_code = 0; + + unspec (auto_reply_options) = ""b; + + auto_reply_options.version = REPLY_OPTIONS_VERSION_2; + auto_reply_options.to = null; /* no extra recipients */ + auto_reply_options.cc = null; + auto_reply_options.bcc = null; + auto_reply_options.flags.include_authors = a_include_authors; + auto_reply_options.flags.include_recipients = a_include_recipients; + auto_reply_options.flags.include_self = a_include_self; + + call mlsys_utils_$create_reply_message (a_original_message_ptr, addr (auto_reply_options), a_new_message_ptr, a_code); + +/* See create_message for the explanation of why we do this */ + + call mail_system_$create_address_list (ADDRESS_LIST_VERSION_2, from_list, a_code); + if a_code ^= 0 then return; + + call mail_system_$add_address (from_list, e_mail_pl1_$get_user_default_address(), ADDRESS_LIST_VERSION_2, a_code); + if a_code ^= 0 then return; + + call mail_system_$replace_from (a_new_message_ptr, from_list, a_code); + + return; + +/* end emacs_create_reply_message; */ + +emacs_format_header: + entry (a_message_ptr, a_line_length, a_buffer_ptr, a_code); + + + a_code = 0; + + buffer_position = 4; /* see emacs_read_message for black magic string hacking */ + + call mlsys_utils_$format_message_header (a_message_ptr, DEFAULT_FORMATTING_MODE, a_line_length, a_buffer_ptr, (sys_info$max_seg_size-1)*4, buffer_position, a_code); + if a_code ^= 0 then return; + + a_buffer_ptr -> chrsused = buffer_position - 4; + + return; + +/* end emacs_format_header; */ + +emacs_parse_message_text: + entry (a_message_text, a_message_ptr, a_parse_error_list_ptr, a_code); + +dcl 1 auto_parse_options aligned like parse_text_options; + + a_code = 0; + + unspec(auto_parse_options) = ""b; + + auto_parse_options.version = PARSE_TEXT_OPTIONS_VERSION_1; + auto_parse_options.area_ptr = null; /* system_free_area_ is fine */ + auto_parse_options.flags.list_errors = "1"b; + auto_parse_options.flags.validate_addresses = "1"b; /* ???? */ + auto_parse_options.flags.include_invalid_addresses = "1"b; /* ???? */ + + call mlsys_utils_$parse_message_text (a_message_text, addr (auto_parse_options), MESSAGE_VERSION_2, a_message_ptr, a_parse_error_list_ptr, a_code); + +/* If the only error was not being able to parse the In-Reply-To: field, + we pretend everything was okay, since RMAIL will add the reply reference + itself and considers parse errors to be fatal. */ + + if a_parse_error_list_ptr = null then return; + + if a_parse_error_list_ptr -> parse_text_error_list.n_errors = 1 + then do; + if a_parse_error_list_ptr -> parse_text_error_list.errors(1).code = mlsys_et_$cant_parse_irt_field + then a_code = 0; + end; + + return; + +/* end emacs_parse_message_text; */ + +/* display the parse error list (from above) via com_err_ */ + +display_parse_errors: + entry (a_parse_error_list_ptr, a_message_text); + +dcl 1 ptel aligned like parse_text_error_list based (a_parse_error_list_ptr); + +dcl i fixed bin; + + begin; + dcl code fixed bin(35), + (start, length) fixed bin(21); + + do i = 1 to ptel.n_errors; + code = ptel.errors(i).code; + start = ptel.errors(i).text_start; + length = ptel.errors(i).text_lth; + if code ^= mlsys_et_$cant_parse_irt_field then + call com_err_$suppress_name (code, "emacs (rmail)", substr (a_message_text, start, length)); + end; /* do */ + end; /* begin */ + + return; + +/* end display_parse_errors; */ + +free_parse_text_error_list: + entry (a_parse_error_list_ptr); + + dcl free_area area based; + + free ptel in (get_system_free_area_() -> free_area); + + return; + +/* end display_parse_errors; */ + + +/* Deliver a message and print the delivery results on user_i/o (RMAIL has + set up a file output) */ + +emacs_deliver_message: + entry (a_message_ptr, a_request_ack, a_code); + +dcl sci_ptr ptr; +dcl delivery_code fixed bin (35); + +dcl 1 auto_deliver_options aligned like deliver_options; + + delivery_code = 0; + + sci_ptr, recipients_info_ptr = null; /* for cleanup handler */ + + unspec (auto_deliver_options) = ""b; + + recipients_info_n_lists = 3; + + on clean_up call free_structures("1"b); + + allocate recipients_info set (recipients_info_ptr); + + recipients_info.header.version = RECIPIENTS_INFO_VERSION_2; + recipients_info.header.area_ptr = get_system_free_area_ (); + recipients_info.header.expanded_recipients_result_list_ptr = null; + recipients_info.lists.recipients_result_list_ptr = null; + recipients_info.lists.address_list_ptr(1) = a_message_ptr -> message.header.to; + recipients_info.lists.address_list_ptr(2) = a_message_ptr -> message.header.cc; + recipients_info.lists.address_list_ptr(3) = a_message_ptr -> message.header.bcc; + + auto_deliver_options.version = DELIVER_OPTIONS_VERSION_2; + auto_deliver_options.delivery_mode = ORDINARY_DELIVERY; + auto_deliver_options.queueing_mode = ALWAYS_QUEUE_FOREIGN; + auto_deliver_options.queued_notification_mode = NOTIFY_ON_ERROR; + auto_deliver_options.flags.abort = "1"b; + auto_deliver_options.flags.send_if_empty = "1"b; /* ???? */ + auto_deliver_options.flags.recipient_notification = "1"b; + auto_deliver_options.flags.acknowledge = a_request_ack; + auto_deliver_options.flags.queue_mailing_lists = "0"b; /* ???? */ + + call mail_system_$deliver_message (a_message_ptr, recipients_info_ptr, addr (auto_deliver_options), delivery_code); + + if delivery_code ^= 0 then + call com_err_$suppress_name (delivery_code, "", ""); /* print_delivery_results will yield more info */ + +/* Now it's time to print the results */ + + call ssu_$standalone_invocation (sci_ptr, "", "", null, ssu_abort_deliver, a_code); + if a_code ^= 0 then do; + call com_err_$suppress_name (a_code, "", "While creating an ssu_ stand alone invocation."); + call free_structures("1"b); + return; + end; + + call mlsys_utils_$print_delivery_results (sci_ptr, "0"b /* print all results */, recipients_info_ptr, a_code); + if a_code ^= 0 then do; + call com_err_$suppress_name (a_code, "", "While printing delivery results."); + end; + + a_code = delivery_code; /* at this point a_code must be 0, but we want to make sure RMAIL knows something happened if deliver message got an error */ + +ERROR_DELIVER_RETURN: + call free_structures ("1"b); + + return; + +ssu_abort_deliver: /* ssu wants a proc which really aborts */ + proc; + + goto ERROR_DELIVER_RETURN; + + end ssu_abort_deliver; + +ssu_abort_redistribute: + proc; + + goto ERROR_REDIST_RETURN; + + end ssu_abort_redistribute; + +free_structures: + proc (a_message_flag); + +dcl a_message_flag bit (1) parameter; /* If a message is to be cleaned */ + + if a_message_flag then + call mail_system_$free_message (a_message_ptr, (0)); + + if recipients_info_ptr ^= null then do; + call mlsys_utils_$free_delivery_results (recipients_info_ptr, (0)); /* only frees expanded lists in the structure */ + free recipients_info; + end; + + if sci_ptr ^= null then + call ssu_$destroy_invocation (sci_ptr); + + return; + + end free_structures; + +/* end emacs_deliver_message; */ + +/* Redistribute the message, with the comments provided and the appropriate + acknowledgement to the provided list of address(es). */ + +emacs_redistribute_message: + entry (a_message_ptr, a_comments, a_recipients_ptr, a_acknowledge_flag, + a_code); + +dcl 01 dv_ops like deliver_options aligned; +dcl system_free_area_ptr ptr; +dcl system_free_area area based (system_free_area_ptr); +dcl redist_code fixed bin (35); + + +/* Prepare for cleanup condition */ + + system_free_area_ptr = get_system_free_area_ (); + recipients_info_ptr = null; + sci_ptr = null; + on clean_up call free_structures ("0"b); + +/* Set up the recipients info structure (those to forward to) */ + + recipients_info_n_lists = 1; + allocate recipients_info set (recipients_info_ptr) in (system_free_area); + + recipients_info.header.version = RECIPIENTS_INFO_VERSION_2; + recipients_info.header.area_ptr = system_free_area_ptr; + recipients_info.header.expanded_recipients_result_list_ptr = null; + recipients_info.n_recipients = 0; + recipients_info.n_unique_recipients = 0; + recipients_info.n_failed_recipients = 0; + recipients_info.n_lists = 1; + recipients_info.lists(1).address_list_ptr = a_recipients_ptr; + recipients_info.lists(1).recipients_result_list_ptr = null; + + dv_ops.version = DELIVER_OPTIONS_VERSION_2; + dv_ops.delivery_mode = ORDINARY_DELIVERY; + dv_ops.queueing_mode = ALWAYS_QUEUE_FOREIGN; + dv_ops.queued_notification_mode = NOTIFY_ON_ERROR; + dv_ops.abort = "1"b; + dv_ops.flags.send_if_empty = "1"b; + dv_ops.flags.recipient_notification = "1"b; + dv_ops.flags.acknowledge = a_acknowledge_flag; + dv_ops.flags.queue_mailing_lists = "0"b; + dv_ops.flags.mbz = ""b; + + call mail_system_$redistribute_message (a_message_ptr, a_comments, + recipients_info_ptr, addr (dv_ops), redist_code); + + if redist_code ^= 0 then + call com_err_$suppress_name (redist_code, "", ""); /* print_delivery_results will yield more info */ + +/* Now it's time to print the results */ + + call ssu_$standalone_invocation (sci_ptr, "", "", null, ssu_abort_redistribute, a_code); + if a_code ^= 0 then do; + call com_err_$suppress_name (a_code, "", "While creating an ssu_ stand alone invocation."); + call free_structures("0"b); + return; + end; + + call mlsys_utils_$print_delivery_results (sci_ptr, "0"b /* print all results */, recipients_info_ptr, a_code); + if a_code ^= 0 then do; + call com_err_$suppress_name (a_code, "", "While printing delivery results."); + end; + + a_code = redist_code; /* at this point a_code must be 0, but we want to make sure RMAIL knows something happened if deliver message got an error */ + +ERROR_REDIST_RETURN: + call free_structures ("0"b); + + return; + +/* end emacs_redistribute_message */ + +/* Expand the name of the savebox the user types in. If there are no "<>" + characters in the pathname, then look in the "mlsys" searchlist for the + entryname. */ + +emacs_expand_svbx_pathname: + entry (a_pathname, a_dirname, a_entryname, a_code); + +dcl pathname char (168); +dcl dirname char (168); +dcl entryname char (32); +dcl code fixed bin (35); + + a_code, code = 0; + pathname = a_pathname; + entryname, dirname = ""; + +/* strip off the .sv if necessary */ + if index (reverse (rtrim(pathname)), reverse (".sv")) = 1 then + pathname = substr (pathname, 1, length(rtrim(pathname)) - length(".sv")); + + if search (pathname, "<>") = 0 then do; + call suffixed_name_$make (rtrim(pathname), "sv.mbx", entryname, code); + if code ^= 0 then do; + call com_err_$suppress_name (code, "", "Expanding savebox pathname."); + goto EXIT_SVBX_PATHNAME; + end; + call search_paths_$find_dir ("mlsys", null, rtrim(entryname), "", dirname, code); + if code ^= 0 then + if code = error_table_$noentry then do; + call expand_pathname_$add_suffix (pathname, "sv.mbx", dirname, entryname, code); + if code ^= 0 then do; + call com_err_$suppress_name (code, "", "Expanding savebox pathname."); + goto EXIT_SVBX_PATHNAME; + end; + end; + else call com_err_$suppress_name (code, "", "Searching ""mlsys"" searchlist."); + else; + end; + else do; + call expand_pathname_$add_suffix (pathname, "sv.mbx", dirname, entryname, code); + if code ^= 0 then call com_err_$suppress_name (code, "", "Expanding savebox pathname."); + end; + +EXIT_SVBX_PATHNAME: + a_dirname = dirname; + a_entryname = entryname; + a_code = code; + return; +/* end emacs_expand_svbx_pathname; */ + +%include mlsys_open_options; +%include mlsys_mailbox; +%include mlsys_format_options; +%include mlsys_close_options; +%include mlsys_message; +%include mlsys_parse_txt_options; +%include mlsys_deliver_info; +%include mlsys_reply_options; +%include mlsys_address_list; +%include rdm_switch_types; + +end e_mail_pl1_; + + + + + emacs_rmail_.lisp 04/24/89 1350.4rew 04/24/89 1341.0 470979 + + + +;;; ****************************************************** +;;; * * +;;; * Copyright, (C) Honeywell Bull Inc., 1988 * +;;; * * +;;; * Copyright (c) 1978 by Massachusetts Institute of * +;;; * Technology and Honeywell Information Systems, Inc. * +;;; * * +;;; ****************************************************** + + +;;; HISTORY COMMENTS: +;;; 1) change(88-03-22,Blair), approve(88-03-22,MCR7842), +;;; audit(88-06-29,Lippard), install(88-07-26,MR12.2-1069): +;;; Change the expand_pathname_ to a call to +;;; e_mail_pl1_$emacs_expand_svbx_pathname on a copy request so that we +;;; can search the mlsys searchlist to locate the savebox. +;;; 2) change(89-02-02,Flegel), approve(89-02-28,MCR8066), +;;; audit(89-03-30,Lee), install(89-04-24,MR12.3-1035): +;;; phx20937, phx21049 - Changed "create-file" calls to "open-file" calls. +;;; phx17317 - rmail-reply to change the Ack minor mode to the appropriate +;;; value when reusing a reply buffer. +;;; 3) change(89-02-13,Flegel), approve(89-03-16,MCR8076), +;;; audit(89-03-30,Lee), install(89-04-24,MR12.3-1035): +;;; phx18781 - addition of rmail-help bound to the "?" key in order to +;;; provide internal help to rmail. +;;; phx16782 - addition of rmail-forward bound to the "L" key in order +;;; to provide an interface for mail forwarding +;;; phx19704 - addition of support for rmail-quit so that if a rmail +;;; command has has been entered after new mail has arrived, then do not +;;; query. +;;; phx21262 - addition of rmail-toggle-seen bound to "X" key in order +;;; to provide an interface into changing the "seen" switch. +;;; END HISTORY COMMENTS + + +;;; +;;; Emacs nuntio, BSG 10/10/78, 12/15/78, 3/17/79 +;;; Major rewrite of whole emacs_rmail_ 10/19/80 BSG for real header parse +;;; To CAH's mlsys, BSG 10/31/82, reformat headers BSG 11/6/82 +;;; For MR10.2 mlsys by Jon Rochlis, July 1983 (for psr) +;;; To comment out register-option forms, and move them to e_option_defaults_, 1/19/84 Barmar. +;;; To make send-mail-beargumented trim the buffer name, 1/19/84 Barmar. +;;; To remove "rmail-check-if-in-rmail" from rmail-logger-*pend, as they +;;; are callable from send-mail, too. 2/15/85 Barmar + +;;; Here begins Emacs send mail (SMAIL?) + +(defprop rtrim e_lap_$rtrim expr) + +(declare + (*expr e$get_temporary_seg e$release_temporary_seg uppercase + e_lap_$make-dat-ol-black-magic-string open-file + execute-command exists-file fill-mode indent-rigidly + save-same-file untabify exists-buffer delete-white-sides + get-key-binding get-key-name describe)) + +(declare (*lexpr send-mail-beargumented)) + +(declare (special rmail-original-buffer mail-header-buffer fill-column + mail-original-message-ptr mail-mark mail-request-ack + screenlinelen rmail-request-acknowledgement null-pointer + mail-address-ptr rmail-commands-since-new-mail)) + +(%include e-macros) +(%include defun) ; for send-mail-beargumented + +(defvar mail-mode-hook nil) +(defvar rmail-initialized nil) + + +;;; defpl1's for the send mail side + +(declare (defpl1 mail_system_$set_message_switch "" + (ptr) (char (4) aligned) (bit (1) aligned) + ;; message-ptr switch-name ("SEEN") switch-value + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$emacs_redistribute_message "" + (ptr) (char (*)) (ptr) (bit (1)) + ;; message-pointer comments recipients ack + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$emacs_get_address_list "" + (char (*)) (return ptr) (return ptr) + ;; address list address-pointer list of address errors + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$emacs_parse_message_text "" + (char (*)) (return ptr) (return ptr) + ;; message message-pointer parse error pointer + (return fixed bin(35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$display_parse_errors "" + (ptr) (char (*)))) + ;; parse error list ptr message text + +(declare (defpl1 e_mail_pl1_$emacs_deliver_message "" + (ptr) (bit (1)) (return fixed bin(35.)))) + ;; message-ptr request-ack code + +(declare (defpl1 e_mail_pl1_$emacs_create_message "" + (char (*)) (return ptr) (return fixed bin(35.)))) + ;; subject message-ptr code + +(declare (defpl1 e_mail_pl1_$emacs_expand_svbx_pathname "" + (char (*)) (return char (168.)) (return char (32.)) (return fixed bin (35.)))) + ;; pathname dirname entryname code + +(declare (defpl1 e_mail_pl1_$emacs_format_header "" + (ptr) (fixed bin) (ptr) + ;; message ptr line length temp seg/bmstring + (return fixed bin(35.))))) + ;; code + +(declare (defpl1 e_mail_pl1_$free_parse_text_error_list "" + (ptr))) + ;; parse_error_list ptr + +(declare (defpl1 mail_system_$free_message "" (ptr) (return fixed bin(35.)))) + +(declare (defpl1 mail_system_$free_address_list "" (ptr) (return fixed bin (35.)))) + +(declare (defpl1 mail_system_$add_reply_reference "" + (update ptr) (ptr) (fixed bin) + ;; new-message-ptr original-message-ptr position + (return fixed bin(35.)))) + ;; code + + +(defcom send-mail + (send-mail-beargumented (trim-minibuffer-response "Mail subject: "))) + +;;; Here we make life easy for any applications which may wish to call us +;;; We can be called with a subject string, addresses string, and even some +;;; initial text (any or which may be omited and default to ""). +;;; The application can ignore mail_system_ totally ... we do all of the work + +(defun send-mail-beargumented (&optional (subject "") + (additional-to-recipients "") + (initial-text "")) + (let ((result (e_mail_pl1_$emacs_create_message subject))) + (let ((msg (car result)) + (code (cadr result))) + (if (not (= code 0)) + (display-com-error code "While creating new message.") + else + (setq rmail-original-buffer nil) ;go back to most recent buffer when done + (find-buffer-in-window + (make_atom (rtrim (catenate "Mail about " subject)))) + (send-mail-beargumented-1 msg + additional-to-recipients + initial-text))))) + +(defun send-mail-beargumented-1 (message-ptr + additional-to-recipients + initial-text) + (if (not rmail-initialized) + (mail-init)) + (if (empty-buffer-p current-buffer) + (let ((code (e_mail_pl1_$emacs_format_header + message-ptr screenlinelen mail-header-buffer)) + (free-code (mail_system_$free_message message-ptr))) + (if (not (= code 0)) + (display-com-error code "While formating header.") + else + (if (not (= free-code 0)) + (display-com-error-noabort "While freeing message.")) + (insert-string (e_lap_$make-dat-ol-black-magic-string + mail-header-buffer)))) + (mapc '(lambda (x)(set-key (car x)(cadr x))) + '((^X^S send-the-mail) + (ESC-^B backward-mail-field) + (ESC-^F forward-mail-field) + (ESC-^D delete-mail-field) + (ESC-CR continue-mail-field) + (^XF mail-from) + (^XT mail-to) + (^XA mail-append) + (^X^A mail-toggle-ack) + (^ZB mail-bcc) ; everything else is taken + (^XC mail-cc) + (^XJ mail-subject) + (^XL rmail-logger-append) + (^XP rmail-logger-prepend) + (^XY mail-reply-to))) + (setq current-buffer-mode 'Mail) + (fill-mode) + (setq fill-column 72.) ;protocol + (register-local-var 'mail-mark) + (register-local-var 'mail-request-ack) + (setq mail-request-ack rmail-request-acknowledgement) + (if mail-request-ack (assert-minor-mode 'Ack) + else (negate-minor-mode 'Ack)) ;phx17317 + (mail-clean-up-from) + (go-to-beginning-of-buffer) + (if (not (forward-search (catenate NL "To:"))) + (go-to-end-of-buffer) + (mail-init-header-field "To:" additional-to-recipients) + (setq mail-mark (set-mark)) + (mail-to) + else (go-to-end-of-buffer) + (setq mail-mark (set-mark))) + (if mail-mode-hook (funcall mail-mode-hook)) + (insert-string initial-text) + else + (mail-append))) + +(defun mail-clean-up-from () ; let's be pretty + (save-excursion + (go-to-beginning-of-buffer) + (if (forward-search "From:") + (delete-white-sides) + (insert-string TAB)))) + +(defun mail-init () ;Once per loading + (setq mail-header-buffer (e$get_temporary_seg)) + (set-emacs-epilogue-handler '(rmail-cleanup) nil) + (setq rmail-initialized t)) + +(defun mail-find-first-blank-line () + (go-to-beginning-of-buffer) + (do-forever + (if (or (lastlinep)(line-is-blank))(stop-doing)) + (next-line))) + +(defcom continue-mail-field + (go-to-end-of-line) + (delete-white-sides) + (if (not (back-at ",")) + (insert-char ",")) + (insert-char NL) + (insert-string " ") + (save-excursion + (mail-find-header-end) + (backward-char) + (set-mark-here mail-mark))) + +(defcom mail-to + (mail-header-field-finder "To:")) + +(defcom mail-reply-to + (mail-header-field-finder "Reply-To:")) + +(defcom mail-from + (mail-header-field-finder "From:")) + +(defcom mail-cc + (mail-header-field-finder "cc:")) + +(defcom mail-bcc + (mail-header-field-finder "bcc:")) + +(defcom mail-subject + (mail-header-field-finder "Subject:")) + +(defun mail-header-field-finder (arg &aux uc-arg arg-len) + (setq uc-arg (uppercase arg) + arg-len (stringlength arg)) + (go-to-beginning-of-buffer) + (do-forever + (cond ((or (looking-at arg) + (samepnamep uc-arg ;case insensitive header match + (uppercase + (substr (curline-as-string) 1 arg-len)))) + (go-to-end-of-line) + (stop-doing)) + ((or (lastlinep) (point>markp mail-mark)) + (mail-header-add-new-line arg) + (stop-doing)) + (t (next-line))))) + +(defun look-for-mail-header-field (arg) + (go-to-beginning-of-buffer) + (do-forever + (if (looking-at arg) + (if (point>markp mail-mark)(return nil) + else (forward-search arg)(return t))) + (if (lastlinep)(return nil)) + (next-line))) + +(defun mail-header-add-new-line (arg) + (mail-find-header-end) + (insert-string arg) + (insert-string TAB) + (insert-string NL) + (set-mark-here mail-mark) + (backward-char)) + +(defun mail-init-header-field (key value) + (insert-string key) + (insert-string TAB) + (insert-string value) + (new-line)) + +(defcom mail-append + (mail-find-header-end) + (if (lastlinep) (new-line) + else (go-to-end-of-buffer))) + +(defun mail-find-header-end () + (go-to-beginning-of-buffer) + (if (lastlinep) nil ;close enuf + else + (do-forever + (if (lastlinep) (return nil)) ;global punt + (if (line-is-blank)(next-line) + else (stop-doing))) + (do-forever ;At header start? + (if (forward-search-in-line ":") + (do-forever + (if (lastlinep) ;only headers? + (stop-doing) + else + (next-line) + (if (or (not (at-white-char)) ;Another header field + (line-is-blank)) ;end of header + (stop-doing)))) + (if (or (lastlinep) (line-is-blank)) + (stop-doing)) + else + (stop-doing))) ;not a header field, maybe generate error in the future? + (if (not (line-is-blank)) + (go-to-end-of-line) + (insert-char NL)))) + +(defcom delete-mail-field + (do-forever + (if (or (back-at ":") (back-at ",") (bolp)) + (stop-doing)) + (backward-char)) + (with-mark bof + (delete-white-sides) + (if (forward-search-in-line ",") + (rubout-char) + else + (go-to-end-of-line)) + (delete-white-sides) + (wipe-point-mark bof) + (if (eolp)(delete-white-sides) + (if (back-at ",") + (rubout-char) + (delete-white-sides)) + else + (insert-string " "))) + (if (< (cur-hpos) 10.) + (delete-white-sides) + (whitespace-to-hpos 10.))) + +(defcom forward-mail-field + (if (eolp) (go-to-beginning-of-line)) + (if (bolp) (forward-search-in-line ":") + else (if (forward-search-in-line ",") + else + (go-to-beginning-of-line) + (forward-mail-field))) + (skip-over-whitespace-in-line)) + +(defcom backward-mail-field + (if (back-at ",") (backward-char)) + (if (reverse-search-in-line ",") + (forward-char) + else + (if (back-at ":") + (go-to-end-of-line) + (if (save-excursion (reverse-search-in-line ",")) + (backward-mail-field) + else + (reverse-search-in-line ":") + (forward-char)) + else + (reverse-search-in-line ":") + (forward-char))) + (skip-over-whitespace-in-line)) + +(defcom mail-toggle-ack + (setq mail-request-ack (not mail-request-ack)) + (minibuffer-print (catenate + "An acknowledgement will" + (if mail-request-ack "" else " not") + " be requested for this message.")) + (if mail-request-ack + (assert-minor-mode 'Ack) + else + (negate-minor-mode 'Ack))) + + +;;; Now its time to send the message + +(defcom send-the-mail + (let ((message-text (rmail-buffer-to-string))) + (let ((msg-ptr nil)) + (protect + (setq msg-ptr (rmail-parse-message-text message-text)) + (if msg-ptr ;nil if there were parse errors + (rmail-deliver-message msg-ptr)) + &always + (if msg-ptr (mail_system_$free_message msg-ptr)))))) + +(defun rmail-buffer-to-string () + (save-excursion + (go-to-beginning-of-buffer) + (with-mark start-of-buffer + (go-to-end-of-buffer) + (point-mark-to-string + start-of-buffer)))) + +;;; Turn the current buffer into a message (puf, like magic) + +;;; Note: we hack adding the reply reference here if we are a reply message, +;;; because mail_system_ can't parse In-Reply-To: fields. (grumble, grumble) + +(defun rmail-parse-message-text (message-text + &aux error-ptr message-ptr code) ;initialized to nil + (protect + (let ((result (e_mail_pl1_$emacs_parse_message_text message-text))) + (setq message-ptr (first result) + error-ptr (second result) + code (third result)) + (if (not (= code 0)) + (if (not (= code (error-table 'mlsys_et_ 'text_parse_failed))) + (display-com-error code "While parsing message.") + else + (display-as-printout + (rmail-display-parse-errors + error-ptr message-text))) + (setq message-ptr nil) ;it will be returned as the function value + else + (if mail-original-message-ptr + (let ((result (mail_system_$add_reply_reference + message-ptr mail-original-message-ptr -1))) + (let ((new-message-ptr (car result)) + (code (cadr result))) + (if (= code 0) + (setq message-ptr new-message-ptr))))))) + &always + (and error-ptr + (not (= error-ptr null-pointer)) + (e_mail_pl1_$free_parse_text_error_list error-ptr))) + message-ptr) + +(defun rmail-display-parse-errors (error-ptr message-text) + (protect + (rmail-set-up-file-output) + (e_mail_pl1_$display_parse_errors error-ptr message-text) + &always (rmail-clean-up-file-output)) + (insert-string "Message will not be delivered.") ; this will appear at the top of the buffer + (new-line) + (new-line)) + +;;; And now we deliver the message ... + +(defun rmail-deliver-message (message-ptr) + (let ((request-ack-flag mail-request-ack) ; make sure we are in the right buffer + (code 0)) + (display-as-printout (setq code + (rmail-display-delivery-results + message-ptr + request-ack-flag))) + (if (= code 0) ;happy? + (rmail-restore-original-buffer)))) + +(defun rmail-display-delivery-results (message-ptr request-ack-flag &aux code) + (protect + (rmail-set-up-file-output) + (setq code (e_mail_pl1_$emacs_deliver_message + message-ptr (if request-ack-flag -1 else 0))) + &always (rmail-clean-up-file-output)) + code) + +(defun rmail-restore-original-buffer () + (setq buffer-modified-flag nil) ;unmodify the buffer + (cond ((null rmail-original-buffer) + (find-buffer-in-window previous-buffer)) + ((exists-buffer rmail-original-buffer) + (find-buffer-in-window rmail-original-buffer)))) + +(defcom forward-the-mail + (let ((message-ptr mail-original-message-ptr) + (comment-text (rmail-buffer-to-string)) + (address-ptr mail-address-ptr) + (request-ack-flag mail-request-ack) + (code 0)) + (protect + (display-as-printout + (setq code (rmail-display-redistrib-results + message-ptr comment-text + address-ptr request-ack-flag))) + (if (= code 0) (rmail-restore-original-buffer)) + &always (and address-ptr + (mail_system_$free_address_list address-ptr))))) + +(defun rmail-display-redistrib-results (message-ptr comments-text address-ptr request-ack-flag &aux code) + (protect + (rmail-set-up-file-output) + (setq code (e_mail_pl1_$emacs_redistribute_message + message-ptr (if comments-text comments-text else "") + address-ptr (if request-ack-flag -1 else 0 ))) + (if (not (= code 0)) + (display-com-error code "Forwarding mail.")) + &always (rmail-clean-up-file-output)) + code) + + +;;; Emacs merry mailman +;;; BSG 12/16-17/78, 3/17-18/79 +;;; Dedicated to Ray Heatherton of old. + +;;; Here starts Emacs read mail (RMAIL) + +(declare (special error-table fpathname rmail-message-buffer FF + rmail-msgx rmail-mailbox-path read-only-flag rmail-seen + rmail-deleteq rmail-msgcount last-input-char + rmail-original-yank-indent mail-original-message + rmail-open-state rmail-buffer-to-go-back-to + rmail-mailbox-ptr rmail-send-acknowledgement + rmail-reply-include-authors rmail-reply-include-recipients + rmail-reply-include-self rmail-header-format start-up/.rmail)) + +(defvar rmail-mode-hook nil) + +;;; (register-option 'rmail-original-yank-indent 4) ;moved to e_option_defaults_ + +;;; (register-option 'rmail-send-acknowledgement t) ;moved to e_option_defaults_ +;;; (register-option 'rmail-request-acknowledgement nil) ;moved to e_option_defaults_ + +;;; (register-option 'rmail-reply-include-authors t) ;moved to e_option_defaults_ +;;; (register-option 'rmail-reply-include-recipients nil) ;moved to e_option_defaults_ +;;; (register-option 'rmail-reply-include-self nil) ;moved to e_option_defaults_ + +;;; (register-option 'rmail-header-format 'default-formatting-mode) ;moved to e_option_defaults_ + +;;; the MCR boards felt this was too complicated, so we won't make them +;;; offical options --- JR 09/02/83 + +(defvar envelope-format-var nil) +(defvar header-format-var nil) +(defvar redistributions-list-format-var nil) + +;;; defpl1's for the read mail side + +(declare (defpl1 e_mail_pl1_$emacs_mailbox_open "" + (char (*)) (char (*)) (return ptr) (return bit (1)) (return fixed bin) + ;; directory entry mailbox ptr salvaged count + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$emacs_read_message "" + (ptr) (ptr) + ;; message ptr temp seg ptr + (fixed bin) (bit (1)) + ;; line length acknowledge + (char (*)) (char (*)) (char (*)) + ;; envelope-format header-format redistributions-format + (return fixed bin (21.)) (return bit (1)) + ;; number of lines in body seen switch + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 e_mail_pl1_$emacs_get_message_ptr "" + (ptr) (fixed bin) (return ptr) + ;; mailbox-ptr message-number message-ptr + (return fixed bin(35.))))) + ;; code + +(declare (defpl1 e_mail_pl1_$get_user_default_mbx_address "" + (return ptr))) + +(declare (defpl1 e_mail_pl1_$emacs_mailbox_close "" (ptr) (return fixed bin))) + +(declare (defpl1 e_mail_pl1_$emacs_create_reply_message "" + (ptr) (bit (1)) (bit (1)) (bit (1)) + ;; orig msg include-authors include-recip include self + (return ptr) (return fixed bin(35.)))) + ;; new msg code + +(declare (defpl1 mail_system_$read_new_messages "" + (update ptr) (return fixed bin) (return fixed bin) + ;; mailbox-ptr new-messages new-regular messages + (return fixed bin) (return fixed bin(35.)))) + ;; new-interactive-messages code + +(declare (defpl1 mail_system_$get_address_pathname "" + (ptr) (return char (168.)) (return char (32.)) + ;; address directory entryname + (return char (32.)) (return fixed bin (35.)))) + ;; componentname code + +(declare (defpl1 mail_system_$mark_message_for_deletion "" + (ptr) (return fixed bin(35.)))) + ;; message ptr code + +(declare (defpl1 mail_system_$unmark_message_for_deletion "" + (ptr) (return fixed bin(35.)))) + ;; message ptr code + +(declare (defpl1 mail_system_$save_message "" + (ptr) (char (*)) (char (*)) (bit (1)) + ;; message ptr dir name entry name create flag + (return fixed bin(35.)))) + ;; code (surprise, surprise) + +(declare (defpl1 mlsys_utils_$parse_address_text "" + (char (*)) (return ptr) (return fixed bin (35.)))) + ;; text-address mlsys-address code + +(declare (defpl1 mlsys_utils_$parse_mailbox_text "" + (char (*)) (return char (168)) (return char (32)) + ;; mbx-name mbx-path-dir mbx-path-entry + (return fixed bin (35.)))) + ;; code + +(declare (defpl1 mlsys_utils_$print_message_summary_header "" + (fixed bin) (ptr) (return fixed bin (35.)))) + ;; line length output iocb code + +(declare (defpl1 mlsys_utils_$print_message_summary "" + (ptr) (fixed bin) (bit (1) aligned) + ;; message ptr message number current message flag + (fixed bin) (ptr) (return fixed bin (35.)))) + ;; line length output iocb code + +(declare (defpl1 mail_system_$free_address "" + (ptr) (return fixed bin (35.)))) + ;; address code + +(declare (defpl1 expand_pathname_ "" (char (*)) (return char(168.)) (return char(32.)) (return fixed bin(35.)))) + +(declare (defpl1 pathname_ "" (char (*)) (char (*)) (return char (168)))) + + +(defun rmail-init () + (setq rmail-open-state nil) ;Signifies initted + (if (not rmail-initialized) + (mail-init)) + (setq rmail-message-buffer nil)) + +(defun rmail-cleanup () ;In case he leaves without closing + (if rmail-open-state + (e_mail_pl1_$emacs_mailbox_close rmail-mailbox-ptr))) + + +(defcom rmail &numarg &pass + (if (not (boundp 'rmail-open-state))(rmail-init)) + (if rmail-open-state (go-to-buffer 'Incoming/ mail) + else + (rmail-open-mbx + (if numarg + (rmail-get-address-pathname-from-user) + else + (rmail-get-address-pathname (rmail-get-default-address)))) + (setq rmail-message-buffer (e$get_temporary_seg)) + (setq rmail-buffer-to-go-back-to current-buffer) + (go-to-or-create-buffer 'Incoming/ mail) + (setq current-buffer-mode 'RMAIL) + (setq fpathname rmail-mailbox-path) + (setq buffer-modified-flag t rmail-open-state t) + (minibuffer-clear) + (mapc '(lambda (x)(set-key (car x)(cadr x))) + '((/0 rmail-argument) + (/1 rmail-argument) + (/2 rmail-argument) + (/3 rmail-argument) + (/4 rmail-argument) + (/5 rmail-argument) + (/6 rmail-argument) + (/7 rmail-argument) + (/8 rmail-argument) + (/9 rmail-argument) + (/- rmail-minus) + (? rmail-help) + (m send-mail-from-rmail) + (c rmail-copy) + (D rmail-queue-delete-backward) + (d rmail-queue-delete-forward) + (j rmail-go-command) + (g rmail-go-command) + (l rmail-go-last-msg) + (n rmail-go-forward) + (p rmail-go-backward) + (x rmail-toggle-seen) + (q rmail-quit) + (^X^Q rmail-quit) + (r rmail-reply) + (f rmail-forward) + (s rmail-summarize) + (u rmail-undelete) + (^XL rmail-logger-append) + (^XP rmail-logger-prepend))) + (rmail-unbind-word-commands-kludge) + (without-modifying (destroy-buffer-contents)) + (setq read-only-flag t buffer-modified-flag nil) + (if (= rmail-msgcount 0) + (rmail-quit) + (display-error "No messages in " rmail-mailbox-path)) + (setq rmail-msgx 1 rmail-deleteq nil) + (if (boundp 'start-up/.rmail) + (mapc 'eval start-up/.rmail)) + (if (and (boundp 'rmail-mode-hook) + rmail-mode-hook) + (funcall rmail-mode-hook)) + (rmail-display-current-msg) + (select-buffer-window current-buffer 'cursize)) + (minibuffer-print "Type ""?"" for a list of rmail commands.") + &doc "$$$ is an emacs interface into the mail system. By default, +mail is read from your personal default mailbox. With a positive numeric +argument (e.g. ^U), $$$ prompts for the ""mailbox name"". Commands available +to $$$ are: + + $$rmail-help$ Displays this information. + $$rmail-go-forward$ Moves on to the next message. + $$rmail-go-backward$ Moves back to the previous message. + $$rmail-go-last-msg$ Moves to the last message in your mailbox. + $$rmail-go-command$ Moves to the message number specified by the numeric argument. + $$rmail-queue-delete-forward$ Queue the current message for deletion - move to next message. + $$rmail-queue-delete-backward$ Same as d, but moves backward. + $$rmail-undelete$ Brings back the last (stacked) deleted message. + $$rmail-copy$ Copies the message to some other mailbox. + $$rmail-quit$ Quits out of rmail returning to the original buffer. + $$rmail-summarize$ Summarizes (in a local display) all undeleted messages. + $$rmail-toggle-seen$ Toggles the ""Seen"" switch of the current message. + $$rmail-logger-append$ Log the message to an ASCII file, placing it at the end of the file. + $$rmail-logger-prepend$ Same as ^XL, but ""prepends"" to the front. + $$rmail-forward$ Forward the current message to a list of addresses. + $$rmail-reply$ Formats a MAIL mode buffer to reply to the current message. + $$send-mail-from-rmail$ Sends mail that is not necessarily a reply (see $$rmail-reply$). +") + +(defcom rmail-help + &prologue rmail-check-if-in-rmail + &na (&reject) + (if (samepnamep current-buffer-mode 'RMAIL) + (minibuffer-remark "Please wait...") + (describe 'rmail) + (minibuffer-clear) + else + (display-error "Not in RMAIL mode"))) + +(defun rmail-unbind-word-commands-kludge () ;they forced me + (rmail-unbind-if-bound '(1 125 nil) 'upper-case-word) ;esc-U + (rmail-unbind-if-bound '(1 114 nil) 'lower-case-word) ;esc-L + (rmail-unbind-if-bound '(1 103 nil) 'capitalize-initial-word)) ;esc-C + +(defun rmail-unbind-if-bound (key-list function) ;unbind key-list if bound to function + (if (eq (get-key-binding key-list) function) + (set-key (get-key-name key-list) 'undefined-command))) + + +(defun rmail-open-mbx (mbxpath) ;mbxpath is (dir . entry) + (let ((result (e_mail_pl1_$emacs_mailbox_open (car mbxpath) (cdr mbxpath)))) + (let ((mailbox-pointer (car result)) + (salvaged (cadr result)) + (msgcount (caddr result)) + (code (cadddr result))) + (if (not (= 0 code)) + (display-com-error code (rtrim (pathname_ (car mbxpath) (cdr mbxpath))))) + (if (not (= 0 salvaged)) + (minibuffer-print "Mailbox has been salvaged.")) + (setq rmail-mailbox-path (rtrim (pathname_ (car mbxpath) (cdr mbxpath)))) + (setq rmail-msgcount msgcount) + (setq rmail-mailbox-ptr mailbox-pointer) + 1))) + + +;;; This gets a string from the user turns it into a pathname +;;; using the mail system address to parse it if needed + +(defun rmail-get-address-pathname-from-user () + (let ((answer (trim-minibuf-response "Mailbox: " NL))) + (cond ((nullstringp answer) (display-error "No mailbox name given.")) + ((and (= 1 (index answer "{")) ; {thing} + (samepnamep (substr answer (stringlength answer)) + "}")) + (let ((result (mlsys_utils_$parse_address_text answer)) + (address nil) + (code 0) + (path "")) + (protect + (setq address (car result) + code (cadr result)) + (if (not (= code 0)) + (display-com-error + code "Getting mail address for " answer) + else + (setq path (rmail-get-address-pathname address)) + (let ((entry (rtrim (cdr path)))) + (if (not (samepnamep + ".mbx" ;catch .forum/.mls + (substr entry + (- (stringlength entry) + 3)))) + (display-error "The specified address does not identify a mailbox. " answer)))) + &always (and address + (mail_system_$free_address address))) + path)) + (t (let ((result (mlsys_utils_$parse_mailbox_text answer))) + (let ((code (third result))) + (if (not (zerop code)) + (display-com-error code answer)) + (rplacd result (second result)))))))) ;return (dir . entry) + +(defun rmail-get-default-address () + (e_mail_pl1_$get_user_default_mbx_address)) + +(defun rmail-get-address-pathname (address) + (let ((result (mail_system_$get_address_pathname address))) + (let ((dir (first result)) + (entry (second result)) + (code (fourth result))) + (cond ((not (= code 0)) + (display-com-error + code "Getting pathname of mailbox address")) + (t (cons dir entry)))))) + +;;; Get an address list from the user, parse and verify the addressees into +;;; an address-list structure to be used by the mail_system. Note that +;;; addressees must be separated by ","s as that is what it appears the +;;; mail_system wants. + +(defun rmail-get-address-list-from-user (&aux error-ptr address-ptr code) + (let ((answer (trim-minibuf-response "Forward to: "))) + (cond ((nullstringp answer) + (display-error "No addresses given.") + nil) + (t + (protect + (let ((result (e_mail_pl1_$emacs_get_address_list answer))) + (setq address-ptr (first result) + error-ptr (second result) + code (third result)) + (if (not (= code 0)) + (if (not (= code (error-table 'mlsys_et_ 'text_parse_failed))) + (display-com-error code "While parsing address list.") + else + (display-as-printout + (rmail-display-parse-errors + error-ptr answer))) + (setq address-ptr nil))) + &always (and error-ptr + (not (= error-ptr null-pointer)) + (e_mail_pl1_$free_parse_text_error_list error-ptr)) + &failure (and address-ptr + (mail_system_$free_address_list address-ptr)))))) + address-ptr) + +;;; Display the current (i.e. rmail-msgx) message. + +(defun rmail-display-current-msg () + (if (not (eq current-buffer 'Incoming/ mail)) + (display-error "Error: not in RMAIL")) + (if (> rmail-msgx rmail-msgcount) + (display-error-noabort "No next msg.")) + (setq fpathname rmail-mailbox-path) + (without-modifying + (destroy-buffer-contents) + (let ((msg (rmail-read-message rmail-msgx))) + +;;; Set the seen switch as we are now looking at it, so it really is seen + + (rmail-set-seen t) + +;;; Display the message size and the message + + (insert-string (catenate + "(" (decimal-rep rmail-msgx) + ") -- " (decimal-rep (car msg)) + " line" (if (= (car msg) 1) "" else "s"))) + (new-line) + (new-line) + (insert-string (cdr msg)) + (go-to-beginning-of-buffer)))) + +;;; This calls the mail system to actually format the message and +;;; returns (number of lines in text; a black magic string containing the +;;; entire message) + +(defun rmail-read-message (message-number) + (let ((message-ptr (rmail-get-message-ptr + rmail-mailbox-ptr message-number))) + (let ((result (e_mail_pl1_$emacs_read_message + message-ptr rmail-message-buffer screenlinelen + (if rmail-send-acknowledgement -1 else 0) + +;;; if the user has given values to various formatting option variable, +;;; then we use them, otherwise we use the documented rmail-header-format +;;; option + + (or envelope-format-var + (cond ((eq rmail-header-format 'brief-formatting-mode) 'none-formatting-mode) + (t rmail-header-format))) + (or header-format-var + rmail-header-format) + (or redistributions-list-format-var + rmail-header-format)))) + (let ((lines-in-body (first result)) ;MF + (code (third result))) ;MF + (setq rmail-seen (if (= (second result) 0) nil else t)) + (cond ((= code -1) ; e_mail_pl1_ special case + (display-com-error 0 "envelope-format (rmail-header-format) is invalid.")) + ((= code -2) + (display-com-error 0 "rmail-header-format is invalid.")) + ((= code -3) + (display-com-error 0 "redistributions-list-format (rmail-header-format) is invalid.")) + ((not (= code 0)) + (display-com-error-noabort code "Reading message " + (decimal-rep message-number))) + (t + (cons lines-in-body + (e_lap_$make-dat-ol-black-magic-string + rmail-message-buffer)))))))) + + +;;; Given a mailbox and a message number get a pointer to a mail system +;;; message structure. e_mail_pl1_ will read the message if it hasn't +;;; already done so. + +(defun rmail-get-message-ptr (mailbox-ptr message-number) + (let ((result (e_mail_pl1_$emacs_get_message_ptr + mailbox-ptr message-number))) + (let ((message-ptr (car result)) + (code (cadr result))) + (if (not (= code 0)) + (display-com-error code "While getting message " + (decimal-rep (message-number)) ".")) + message-ptr))) + +(defcom rmail-quit + &prologue rmail-check-if-in-rmail-buffer + (let ((message-to-goto (1+ rmail-msgcount))) + (if (and (rmail-check-for-new-messages) ;new messages and + (= rmail-commands-since-new-mail 0)) ;no new commands + (if (yesp "Do you still want to quit?") + (rmail-quit-1) + else + (rmail-go message-to-goto 'forward)) + else + (rmail-quit-1)))) + +(defun rmail-quit-1 () + (if rmail-message-buffer (e$release_temporary_seg rmail-message-buffer)) + (let ((code (e_mail_pl1_$emacs_mailbox_close rmail-mailbox-ptr))) + (if (not (= code 0)) + (display-com-error code "closing" rmail-mailbox-path))) + (set-buffer-self-destruct current-buffer) + (rmail-echo "") + (setq rmail-open-state nil) + (go-to-or-create-buffer rmail-buffer-to-go-back-to)) + +(defun rmail-check-if-in-rmail-buffer () ;check rmail buffer + (cond ((eq current-buffer-mode 'RMAIL) + t) + (t + (display-error "Error: not in RMAIL") + nil))) + +(defun rmail-check-if-in-rmail () + (cond ((rmail-check-if-in-rmail-buffer) ;check rmail buffer + (setq rmail-commands-since-new-mail ;increment command count + (+ rmail-commands-since-new-mail 1)) + (rmail-check-for-new-messages)))) ;check for new mail + + +(defun rmail-check-for-new-messages () + (let ((result (mail_system_$read_new_messages rmail-mailbox-ptr))) + (setq rmail-mailbox-ptr (car result)) + (let ((number-of-new-messages (cadr result)) + (code 0)) +; (code (cadddr (cdr result)))) ; this won't run compiled + (setq code (cadddr (cdr result))) ; but this appears to work + (if (and (not (= code 0)) + (not (= code + (error-table 'mlsys_et_ 'no_more_messages)))) + (display-com-error-noabort + code "Trying to determine if new messages had arrived.") + nil + else + (if (= number-of-new-messages 0) + nil + else + (setq rmail-msgcount + (+ rmail-msgcount number-of-new-messages)) + (setq rmail-commands-since-new-mail 0) ;reset count + (if (= 1 number-of-new-messages) + (minibuffer-print "One new message has arrived.") + else + (minibuffer-print (decimal-rep + number-of-new-messages) + " new messages have arrived.")) + t))))) + + +(defcom rmail-argument + &prologue rmail-check-if-in-rmail + &numeric-argument (&pass) + (rmail-echo last-input-char) + (let ((digit (- (CtoI last-input-char) (CtoI "0")))) + (if (null numarg) + (setq numarg digit) + else + (setq numarg (if (< numarg 0) (- (* numarg 10.) digit) + else (+ (* numarg 10.) digit))))) + (process-char (get-char))) + +(defcom rmail-minus + &prologue rmail-check-if-in-rmail + (rmail-echo last-input-char) + (let ((c (get-char))) + (if (or (< c (CtoI "0")) (> c (CtoI "9"))) + (setq numarg -1) + (process-char c) + else + (setq numarg (- (CtoI "0") c)) + (rmail-echo (ItoC c)) + (process-char (get-char))))) + + +(defcom rmail-go-forward () + &prologue rmail-check-if-in-rmail + &numeric-argument (&pass) + &negative-function rmail-go-backward + (rmail-echo last-input-char) + (rmail-go (+ rmail-msgx (or numarg 1)) 'forward)) + +(defcom rmail-go-backward + &prologue rmail-check-if-in-rmail + &numeric-argument (&pass) + &negative-function rmail-go-forward + (rmail-echo last-input-char) + (rmail-go (- rmail-msgx (or numarg 1)) 'backward)) + +(defcom rmail-go-last-msg + &prologue rmail-check-if-in-rmail + (rmail-check-for-new-messages) + (rmail-echo 'l) + (rmail-go rmail-msgcount 'backward)) + +(defun rmail-not-deleted-message (message-number) + (not (memq message-number rmail-deleteq))) + +(defun rmail-queue-deletion (message-index) + (if (rmail-not-deleted-message message-index) + (let ((message-ptr (rmail-get-message-ptr + rmail-mailbox-ptr message-index))) + (let ((code (mail_system_$mark_message_for_deletion + message-ptr))) + (if (not (= 0 code)) + (display-com-error code "deleting message " + (decimal-rep message-index)) + else + (setq rmail-deleteq + (cons message-index rmail-deleteq))))) + else + (display-error "Message " (decimal-rep message-index) + "has already been deleted."))) + +(defcom rmail-queue-delete-forward + &prologue rmail-check-if-in-rmail + (rmail-echo 'd) + (rmail-queue-deletion rmail-msgx) + (cond ((let ((mno (rmail-find-message-forward (1+ rmail-msgx)))) + (if mno (rmail-go mno 'forward) t else nil))) + ((let ((mno (rmail-find-message-backward (1- rmail-msgx)))) + (if mno (rmail-go mno 'backward) t else nil))) + (t (rmail-delete-desperator)))) + +(defcom rmail-queue-delete-backward + &prologue rmail-check-if-in-rmail + (rmail-echo 'D) + (rmail-queue-deletion rmail-msgx) + (cond ((let ((mno (rmail-find-message-backward (1- rmail-msgx)))) + (if mno (rmail-go mno 'backward) t else nil))) + ((let ((mno (rmail-find-message-forward (1+ rmail-msgx)))) + (if mno (rmail-go mno 'forward) t else nil))) + (t (rmail-delete-desperator)))) + +(defun rmail-delete-desperator () + (cond ((yesp "All messages deleted. Quit rmail?") + (rmail-quit)) + (t (minibuffer-print "Undeleting this message.") + (rmail-undelete)))) + +(defcom rmail-undelete + &prologue rmail-check-if-in-rmail + (rmail-echo 'u) + (if rmail-deleteq + (let ((last-deleted-message (car rmail-deleteq))) + (let ((message-ptr (rmail-get-message-ptr + rmail-mailbox-ptr last-deleted-message))) + (let ((code (mail_system_$unmark_message_for_deletion + message-ptr))) + (if (not (= code 0)) + (display-com-error code "Un-deleting message " + (decimal-rep last-deleted-message)) + else + (setq rmail-deleteq (cdr rmail-deleteq)) + (rmail-go last-deleted-message 'forward))))) + else + (display-error-noabort "No pending deletions.") + (ring-tty-bell))) + +;;; Toggle the seen switch on the current message, update the minor mode to +;;; reflect the new status. + +(defcom rmail-toggle-seen () + &prologue rmail-check-if-in-rmail + (rmail-echo 'x) + (rmail-set-seen (not rmail-seen))) + +(defun rmail-set-seen (mode) + (let ((code (mail_system_$set_message_switch + (rmail-get-message-ptr rmail-mailbox-ptr rmail-msgx) + "SEEN" (if mode -1 else 0)))) + (cond ((= code 0) + (setq rmail-seen mode) + (if rmail-seen (assert-minor-mode 'Seen) + else (negate-minor-mode 'Seen))) + (t + (display-com-error code "While setting seen switch."))))) + +(declare (special tty-no-upmotionp)) + +(defun rmail-echo (x) + (if (not tty-no-upmotionp) + (minibuffer-print-noclear x))) + +(defun rmail-go (msgno direction) + (if (> msgno rmail-msgcount)(rmail-check-for-new-messages)) + (cond ((and (> msgno rmail-msgcount)(eq direction 'forward)) + (display-error "No more messages forward.")) + ((or (< msgno 1)(> msgno rmail-msgcount)) + (display-error "Invalid message number: " (decimal-rep msgno))) + ((rmail-not-deleted-message msgno) + (setq rmail-msgx msgno) + (rmail-display-current-msg)) + ((eq direction 'forward) + (let ((fno (rmail-find-message-forward msgno))) + (if fno (rmail-go fno 'forward) + else (display-error "No more messages forward.")))) + (t (let ((fno (rmail-find-message-backward msgno))) + (if fno (rmail-go fno 'backward) + else (display-error "No more messages backward.")))))) + +(defun rmail-find-message-forward (msgno) + (do ((tentative msgno (1+ tentative)) + (checkedflag)) + ((> tentative rmail-msgcount) nil) + (if (rmail-not-deleted-message tentative) + (return tentative)) + (if (and (= tentative rmail-msgcount)(not checkedflag)) + (setq checkedflag t) + (rmail-check-for-new-messages)))) + +(defun rmail-find-message-backward (msgno) + (do ((tentative msgno (1- tentative))) + ((< tentative 1) nil) + (if (rmail-not-deleted-message tentative) + (return tentative)))) + +(defcom rmail-go-command + &prologue rmail-check-if-in-rmail + &numarg &pass + (let ((here rmail-msgx)) + (if numarg (rmail-go numarg 'forward)) + (if (not (= here rmail-msgx)) + (rmail-echo (catenate "(" (decimal-rep rmail-msgx) ")"))))) + +(defcom rmail-summarize + &prologue rmail-check-if-in-rmail + (rmail-check-for-new-messages) + (display-as-printout (rmail-create-summary-buffer))) + +(defun rmail-create-summary-buffer () + (protect + (rmail-set-up-file-output) + (rmail-get-summary-header) + (do message-number 1 (1+ message-number) + (> message-number rmail-msgcount) + (if (rmail-not-deleted-message message-number) + (rmail-summarize-one message-number))) + &always (rmail-clean-up-file-output))) + +(defun rmail-get-summary-header () + (let ((code (mlsys_utils_$print_message_summary_header + screenlinelen null-pointer))) + (if (not (= code 0)) + (go-to-buffer 'Incoming/ mail) + (rmail-clean-up-file-output) + (display-com-error code + "While getting message summary header.")))) + + +(defun rmail-summarize-one (message-number) + (let ((message-ptr (rmail-get-message-ptr + rmail-mailbox-ptr message-number)) + (current-msg-flag 0)) ;"0"b + (if (= rmail-msgx message-number) (setq current-msg-flag -1));"1"b + (let ((code (mlsys_utils_$print_message_summary + message-ptr message-number current-msg-flag + screenlinelen null-pointer))) + (if (not (= code 0)) + (rmail-clean-up-file-output) + (go-to-buffer 'Incoming/ mail) + (display-com-error code + "While getting summary for message" + (decimal-rep message-number)))))) + +; Maybe there is too much internal knowledge here, and this should +; be done some other way + +; delcare's for file-output hacking + +(declare (special pdir-temp-ename pdir-temp-pathname)) +(declare (*lexpr ncline e_pl1_$get_iocb hcs_$truncate_file hcs_$set_bc)) +(declare + (defpl1 iox_$control "" (ptr) (char (*)) (ptr) (return fixed bin (35.)))) + +(defun rmail-set-up-file-output () + (hcs_$set_bc process-dir pdir-temp-ename 0) + (ncline 'file_output pdir-temp-pathname '-ssw 'user_output + '-ssw 'error_output)) + +(defun rmail-clean-up-file-output () + (e_cline_ "revert_output -ssw user_output -ssw error_output") + (let ((fpathname nil)) + (read-in-file pdir-temp-pathname)) + (hcs_$truncate_file process-dir pdir-temp-ename 0) + (iox_$control (e_pl1_$get_iocb) "reset_more" null-pointer)) + + +;;; Reply + +(defcom rmail-reply + &prologue rmail-check-if-in-rmail + &numarg &pass + (rmail-echo 'r) + (setq rmail-original-buffer current-buffer) + (let ((original-message-text (rmail-collect-orig)) + (include-authors (if (or + rmail-reply-include-authors + numarg) + -1 else 0)) + (include-recipients (if (or + rmail-reply-include-recipients + numarg) + -1 else 0)) + (include-self (if rmail-reply-include-self -1 else 0)) + (original-message-ptr (rmail-get-message-ptr + rmail-mailbox-ptr rmail-msgx))) + (let ((result (e_mail_pl1_$emacs_create_reply_message + original-message-ptr include-authors + include-recipients include-self))) + (let ((new-message-ptr (car result)) + (code (cadr result))) + (if (not (= code 0)) + (display-com-error code "While creating reply message.")) + (find-buffer-in-window + (make_atom (catenate "Reply to message " + (decimal-rep rmail-msgx))));;; ugh, ugh, ugh + (without-saving (destroy-buffer-contents)) + (send-mail-beargumented-1 new-message-ptr "" "") + (mail-append) + (setq current-buffer-mode 'RMAIL/ reply) + (rmail-prepare-response-environment + original-message-text original-message-ptr))))) + +(defun rmail-collect-orig () + (save-excursion + (go-to-beginning-of-buffer) + (next-line) + (with-mark start-of-buffer + (go-to-end-of-buffer) + (point-mark-to-string + start-of-buffer)))) + +;;; 10/15/80 + +(defcom send-mail-from-rmail + &prologue rmail-check-if-in-rmail + (let ((msg (rmail-collect-orig))) + (execute-command 'send-mail nil nil) + (rmail-prepare-response-environment msg nil))) + +;;; We must keep track of the original message and add the reply reference +;;; ourselves because mail_system_ can't hack parsing In-Reply-To: fields +;;; (grumble, grumble) + +(defun rmail-prepare-response-environment (original-msg-text original-msg-ptr) + (register-local-var 'mail-original-message) + (register-local-var 'rmail-original-buffer) ; buffer to return to if successful + (setq mail-original-message original-msg-text) + (setq rmail-original-buffer 'Incoming/ mail) + (if original-msg-ptr ; non-nil implies we are a reply message + (register-local-var 'mail-original-message-ptr) + (setq mail-original-message-ptr original-msg-ptr)) + (set-key 'ESC-^Y 'rmail-yank-mail) + (set-key '^X^Q 'return-to-rmail)) + +(defcom return-to-rmail + (minibuffer-clear) + (find-buffer-in-window 'Incoming/ mail)) + +(defcom rmail-yank-mail + &numeric-argument (&reject) + (set-the-mark) + (insert-string mail-original-message) + (let ((numarg rmail-original-yank-indent)) + (indent-rigidly)) + (if (not (back-at NL))(new-line))) + +;;; 02/07/89 +;;; Forward the current piece of mail to a list of addresses. A numeric +;;; argument allows the user to add redistribution comments to the mail +;;; by creating a comments buffer. + +(defcom rmail-forward + &prologue rmail-check-if-in-rmail + &numarg &pass + (rmail-echo 'f) + (setq rmail-original-buffer current-buffer) + (let ((original-message-ptr + (rmail-get-message-ptr rmail-mailbox-ptr rmail-msgx)) + (address-ptr nil)) + (protect + (cond ((setq address-ptr (rmail-get-address-list-from-user)) + (if numarg + (find-buffer-in-window + (make_atom + (catenate "Forwarding comments for message " + (decimal-rep rmail-msgx)))) + (rmail-prepare-comment-environment + original-message-ptr address-ptr) + else + (display-as-printout + (rmail-display-redistrib-results + original-message-ptr nil address-ptr + mail-request-ack)) + (and address-ptr + (mail_system_$free_address_list address-ptr))))) + &failure (and address-ptr + (mail_system_$free_address_list address-ptr))))) + +;;; Prepare the current buffer as a comment buffer for sending redistribution +;;; comments + +(defun rmail-prepare-comment-environment (original-msg-ptr address-ptr) + +;;; Local variables used + + (register-local-var 'rmail-original-buffer) ; return buffer + (register-local-var 'mail-original-message-ptr); mail to forward + (register-local-var 'mail-address-ptr) ; destination addresses + (register-local-var 'mail-request-ack) ; if an ack is required + (setq rmail-original-buffer 'Incoming/ mail) + (setq mail-original-message-ptr original-msg-ptr) + (setq mail-address-ptr address-ptr) + (setq mail-request-ack rmail-request-acknowledgement) + +;;; Set up the buffer display + + (without-saving (destroy-buffer-contents)) + (setq current-buffer-mode 'RMAIL/ comments) + (if mail-request-ack (assert-minor-mode 'Ack) + else (negate-minor-mode 'Ack)) + +;;; Set up buffer characteristics + + (fill-mode) + (setq fill-column 61.) ;72.-11. for indentation + (set-key '^X^A 'mail-toggle-ack) + (set-key '^X^Q 'return-to-rmail) + (set-key '^X^S 'forward-the-mail)) + +;;; +;;; RMAIL correspondence recorder +;;; + +(declare (special known-buflist)) +(defcom rmail-logger-append + &prologue rmail-check-if-in-rmail + &numarg (&pass) + (rmail-guts-of-logger 'append)) + +(defcom rmail-logger-prepend () + &prologue rmail-check-if-in-rmail + &numarg (&pass) + (rmail-guts-of-logger 'prepend)) + +(defun rmail-guts-of-logger (whichway) + (if (not (and (memq 'Mail/ log known-buflist) (null numarg))) + (let ((new-pathname (trim-minibuf-response "RMAIL Log file: " NL))) + (if (nullstringp new-pathname) + (display-error "You must supply a pathname.")) + (open-file new-pathname 'write) ;;; phx20937/21049 + (save-excursion-buffer + (go-to-or-create-buffer 'Mail/ log) + (read-in-file new-pathname)))) + (save-excursion + (save-excursion-buffer + (let ((z (curbuf-as-string))) + (go-to-buffer 'Mail/ log) + (if (eq whichway 'append) + (go-to-end-of-buffer) + else + (go-to-beginning-of-buffer)) + (insert-char FF) + (insert-string z)) + (save-same-file)))) + + +;;; Rmail copy request --- this is the same as read_mail's save request + +(defcom rmail-copy + &prologue rmail-check-if-in-rmail + (let ((result (e_mail_pl1_$emacs_expand_svbx_pathname + (minibuf-response "Save Mailbox: " NL)))) + (let ((rmail-sv-dname (car result)) + (rmail-sv-ename (cadr result)) + (code (caddr result))) + (if (not (= code 0)) + (display-com-error + code "Expanding save mailbox pathname.") + else + (rmail-copy-1 rmail-sv-dname rmail-sv-ename 0))))) + +(defun rmail-copy-1 (rmail-sv-dname rmail-sv-ename create-flag) + (let ((code (mail_system_$save_message + (rmail-get-message-ptr rmail-mailbox-ptr rmail-msgx) + rmail-sv-dname rmail-sv-ename create-flag))) + (if (and (= code (error-table 'mlsys_et_ 'no_savebox)) + (yesp "Save mailbox doesn't exist. Create it?")) + (rmail-copy-1 rmail-sv-dname rmail-sv-ename -1) + else + (if (and (not (= code 0)) + (not (= code + (error-table 'mlsys_et_ 'savebox_created)))) + (display-com-error code "Trying to save message."))))) + + + + + + bull_copyright_notice.txt 08/30/05 1008.4r 08/30/05 1007.3 00020025 + + ----------------------------------------------------------- + + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated +to Massachusetts Institute of Technology by Group Bull including Bull HN Information Systems Inc. +as a contribution to computer science knowledge. +This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, +Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell Bull Inc., Groupe Bull +and Bull HN Information Systems Inc. to the development of this operating system. +Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), +renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership +of Professor Fernando Jose Corbato.Users consider that Multics provided the best software architecture for +managing computer hardware properly and for executing programs. Many subsequent operating systems +incorporated Multics principles. +Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., +as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + + ----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without +fee is hereby granted,provided that the below copyright notice and historical background appear in all copies +and that both the copyright notice and historical background and this permission notice appear in supporting +documentation, and that the names of MIT, HIS, Bull or Bull HN not be used in advertising or publicity pertaining +to distribution of the programs without specific prior written permission. + Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. + Copyright 2006 by Bull HN Information Systems Inc. + Copyright 2006 by Bull SAS + All Rights Reserved diff --git a/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_multics_emacs_.s.archive b/web.mit.edu/multics-history/source/Multics/ldd/system_library_unbundled/source/bound_multics_emacs_.s.archive new file mode 100644 index 0000000000000000000000000000000000000000..12389578370b540c23262ed72acd7dbea1ba31f5 GIT binary patch literal 625928 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/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

%2FRqmGCC@o| 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


xOcnn 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 JeD}us{{q03ryKwP literal 0 HcmV?d00001