abair@turbinia.oakhill.uucp (Alan Bair) (09/21/89)
Here is the README file from patches by Leonard Zubkoff to adopt Emacs for SR9.7 and SR10.1. These also provide support to allow Emacs to work with the DM, read the file for more details. I obtained the code from the osu-cis UUCP site. Its probably available on sites that store the GNU code. The patches are for Emacs 18.54, but I succesfully(?) have used them on a 18.52 release(too lazy to upgrade :) Alan Bair SPS CAD Austin, Texas Motorola, Inc. UUCP cs.utexas.edu!oakhill!turbinia!abair -------------------------------------------------------------------------- GNU Emacs Apollo GPR Support Leonard N. Zubkoff lnz@lucid.com Lucid, Incorporated 1 May 1989 This modified version of GNU Emacs 18.54 includes support for using the Apollo Domain Graphics Primitives (GPR) for display operations. This version of GNU Emacs only functions under Domain/OS SR10.1 or SR9.7 on 680x0 machines and SR10.1 on PRISM machines; it also includes various bug fixes for the Apollo that are not in the GNU Emacs standard distribution. The included executable files are compound executables built for Domain/OS SR10.1 on 68020/68030 and PRISM machines. If you received source only, or if the included executables are not suitable for your needs, here are instructions for rebuilding GNU Emacs: To produce 68020/68030 and On a 68020/68030 node running SR10.1, type PRISM compound executables "build-apollo-emacs". After it completes, move to a PRISM node running SR10.1 and type "build-apollo-cmpexe". To produce just 68020/68030 On a 68020/68030 node running SR10.1, type executables "build-apollo-emacs". To produce just PRISM On a PRISM node running SR10.1, type executables "build-apollo-emacs". To produce SR9.7 executables Make sure the file "/sys/ins/gpr.ins.c" has return types of gpr_$pixel_value_t for the functions gpr_$inq_foreground and gpr_$inq_background. The version shipped with SR9.7 incorrectly has the return types as void; the version in SR9.7.1 is correct. Then type "source build-apollo-emacs" in a 4.2BSD csh on a node running SR9.7. To produce executables to run Remove "-A cpu,3000" and "-M3000" from on obsolete 68010 machines "build-apollo-emacs" and "src/m-apollo.h" and then build according to one of the above recommendations. Note: There is a bug in alloca on SR10.0 on the PRISM. If you need to build Emacs for use under SR10.0 on PRISM, change HAVE_ALLOCA to C_ALLOCA in "src/m-apollo.h" and rebuild. With the GPR support installed, GNU Emacs integrates well into the Apollo Domain environment. GNU Emacs windows can be moved or resized using the appropriate Display Manager commands, and a Domain cursor is used for mouse operations in addition to GNU Emacs's own block cursor which is used for character operations. GNU Emacs also correctly handles being obscured by other Domain windows. On color nodes, Emacs uses red character and mouse cursors that, unlike the Domain cursor, do not obscure the underlying character. Commands have also been added to GNU Emacs to support the Apollo environment. See the "GNU Emacs Extensions" section below for a description of these extensions. On SR10.1, GNU Emacs state is dumped during the building process to produce a new COFF file, just as on most other UNIX systems. On SR9.7, GNU Emacs is dumped during the building process by creating a freeze file containing all of Emacs's impure state; the freeze file is called "emacs.dump" and is stored in the "etc" directory named by PATH_EXEC in "paths.h". To save space installing Emacs, while still allowing nodes to execute Emacs if the file server is down, I recommend installing Emacs as follows. The file server, or other centralized repository, should have a copy of the entire "/gnuemacs" tree. On user nodes, it is sufficient to create symbolic links from "/gnuemacs/info" to "//file_server/gnuemacs/info" and from "/gnuemacs/lisp" to "//file_server/gnuemacs/lisp" and to have local copies of the following files: /gnuemacs/APOLLO.README /gnuemacs/etc/movemail /gnuemacs/emacs /gnuemacs/etc/COPYING /gnuemacs/etc/apollo.elc /gnuemacs/etc/DISTRIB /gnuemacs/etc/apollo.icons /gnuemacs/etc/DOC-18.54.0 /gnuemacs/etc/env /gnuemacs/etc/GNU /gnuemacs/etc/etags /gnuemacs/etc/NEWS /gnuemacs/etc/loadst /gnuemacs/etc/TUTORIAL Note: "/gnuemacs/etc/emacs.dump" is also needed on SR9.7 systems. By preloading a large number of libraries in "site-load.el", user nodes can run Emacs even if the file server goes down with little probability they will need to load a library that is not already present; loading many libraries increases the size of the freeze file by only a small amount. With installation by this method, GNU Emacs only requires about 1.5mb of disk space on user nodes. Note that in order for dumped Emacs's to function properly on SR9.7, you must have the Domain csh variable "inprocess" unset, so that executing Emacs causes a fresh process to be created, and hence causes Emacs to be loaded at the same point in memory as when it was dumped. For this reason, you must also have "inprocess" unset when you make Emacs. GNU Emacs cannot be suspended with C-Z or C-X C-Z. Therefore, the low level suspension primitive has been redefined to make the window Emacs is in an icon. For this reason, I recommend using key definitions similar to the following to make using Emacs easier: For SR10.1: kd F2 CP /gnuemacs/emacs -N Emacs; WC -A ke kd F3 WI Emacs -W; ICON Emacs -W; WP Emacs -T ke For SR9.7: kd F2 CP /bin/start_csh -N Emacs; WC -A; ES '/gnuemacs/emacs'; EN ke kd F3 WI Emacs -W; ICON Emacs -W; WP Emacs -T ke This defines the F2 key to create a new Emacs in a window named Emacs and defines the F3 key to either un-ICONize the Emacs window, make the Emacs window visible, or POP the Emacs window, whichever is necessary. On SR9.7, running Emacs in a 4.2BSD csh is necessary for proper operation; if your SYSTYPE is not set to "bsd4.2", you must change the above "start_csh" command from "/bin/start_csh" to "/bsd4.2/bin/start_csh". When Emacs is made into an icon, it will attempt to use the icon font in "etc/apollo.icons". If the icon font does not exist, it will be created on demand from "etc/apollo.icons.u" is that file exists; this is done because SR9.7 Apollo font files are difficult to distribute via tar. For an annotated list of files changed or created at Lucid, see the file LUCID-FILES. The original distributed versions of the changed files are also included under the name "foo-" (in case you have a different version of GNU Emacs). As provided, GNU Emacs must be installed (or at least accessible via a link) as "/gnuemacs". To install Emacs in a different directory, you must edit the "paths.h" file and re-make Emacs. Key Bindings There are three classes of key bindings made available by the Apollo support. The first class are direct translations made in the C code that handles input from the keyboard. These translations cannot be overridden without recompiling Emacs, except for the choice of Meta Key: Apollo Keystroke Emacs Keystroke BS DEL DELETE DEL CR RET TAB TAB RIGHT BOX ARROW This key functions as a META KEY. Pressing CTRL followed by RIGHT BOX ARROW does not give a C-M- command on the Low-Profile Keyboard Model I; it works correctly on a Low-Profile Keyboard Model II. Pressing META first and then CTRL always works. See below for instructions on changing the choice of META KEY. The second class of key bindings are bindings of function keys and mouse buttons that do not conflict with the uses of these keys by the Display Manager (i.e., the Display Manager definition would be meaningless within Emacs). Note that unlike the Display Manager, Emacs supports both a character cursor and a mouse cursor. This means that commands below that refer to the "point" use the position of the character cursor, while those which refer to the "mouse cursor" use the position of the mouse cursor. Unlike in the Display Manager, merely moving the mouse cursor in Emacs does not move the character cursor as well; you must click the left mouse button to move the character cursor. For example, moving the mouse cursor and pressing Shift READ will not have the intended effect; you must first press the left mouse button to move the character cursor. MOUSE LEFT DOWN Move point to the location of the mouse cursor Used in conjunction with MOUSE LEFT UP. MOUSE LEFT UP Set the mark and move point to the location of the mouse cursor. Used in conjunction with MOUSE LEFT DOWN so that pressing the left mouse button, moving the cursor, and releasing the left mouse button leaves the mark set to the initial position and the point set to the final position. Useful for easily marking regions of text. If the left mouse button is pressed and released at the same place, the mark is left at the original position of the character cursor. MOUSE MIDDLE DOWN Move point to the location of the mouse cursor and cut the region to the default DM paste buffer. Used in conjunction with MOUSE MIDDLE UP. MOUSE MIDDLE UP Move point to the location of the mouse cursor and paste in the default DM paste buffer. Used in conjunction with MOUSE MIDDLE DOWN so that pressing the middle mouse button kills text and releasing the middle mouse button yanks the text into its new home. MOUSE RIGHT DOWN Perform a find-file on the file name that the mouse cursor points at. Trailing "*" and "@" characters are ignored so that "ls -F" output may be used easily. Shift TAB TAB Control TAB TAB MARK Set the mark. INS Toggle overwrite mode. LINE DEL Kill the whole line containing point. Shift LINE DEL Yank the last killed text. CHAR DEL Delete the following character. Shift CHAR DEL Delete the following character. COPY Copy the region to the default Apollo paste buffer. CUT Cut the region into the default Apollo paste buffer. PASTE Paste in the default Apollo paste buffer. UNDO Undo the last command. GROW Grow Emacs's Apollo window with rubberbanding. MOVE Move Emacs's Apollo window with rubberbanding. LEFT BAR ARROW Move point to the beginning of the current line. RIGHT BAR ARROW Move point to the end of the current line. LEFT BOX ARROW (ignored) UP ARROW Move point vertically up to the previous line. (This key always performs the same command as C-N). Shift UP ARROW Scroll the window down one line. RIGHT BOX ARROW (default META KEY; otherwise ignored) LEFT ARROW Move point left one character. (This key always performs the same command as C-B). Shift LEFT ARROW Move backward to the beginning of a word. RIGHT ARROW Move point right one character. (This key always performs the same command as C-F). Shift RIGHT ARROW Move forward to the end of a word. UP BOX ARROW Scroll down. Shift UP BOX ARROW Go to the beginning of the buffer. DOWN ARROW Move point vertically down to the next line. (This key always performs the same command as C-N). Shift DOWN ARROW Scroll the window up one line. DOWN BOX ARROW Scroll up. Shift DOWN BOX ARROW Go to the end of the buffer. AGAIN Copy the remainder of the current line to the end of the buffer. This is particularly useful in Shell buffers. Shift READ Perform a find-file on the file name where point is. Trailing "*" and "@" characters are ignored so that "ls -F" output may be used easily. SAVE Save the current buffer. EXIT Kill current buffer after saving changes. ABORT Kill current buffer without saving changes. HOLD (ignored) The third class of key bindings are bindings of function keys and mouse buttons that do conflict with the uses of these keys by the Display Manager (i.e., the Display Manager definition is such that some users will want to have the Display Manager command available from within Emacs, and other users will want to have the function key preempt the Display Manager and invoke an Emacs command). For this reason, this class of key bindings are only made if the variable *preempt-display-manager-bindings* is non-NIL. Set this variable non-NIL in your ".emacs" file if you want these key bindings available in Emacs: Shift LEFT BAR ARROW Go to the beginning of the buffer. CMD Execute Display Manager Command. Shift RIGHT BAR ARROW Go to the end of the buffer. NEXT WINDOW Select other window. Shift NEXT WINDOW Delete window. SHELL Run an inferior Shell. READ Edit File but mark file read-only. EDIT Edit File. HELP Prompt for topic and find the Apollo help file. Since users of GNU Emacs may desire similar key bindings when using the Display Manager, a simple set of Emacs-like key bindings for the DM is provided in the file "startup_dm.all" included with GNU Emacs. It may be installed by causing one's normal startup_dm.<machine> file to execute it via the CMDF DM command. In addition to these Apollo-specific key bindings, there is TAB filename completion and a new command history for use in Shell Mode and Inferior Lisp Mode. In Shell Mode and Inferior-Lisp Mode, a history of commands typed by the user is automatically maintained, and can be cycled through by M-P (backward) or M-N (forward). Type a prefix of a previously typed command and M-P and the remainder of the command will be inserted. Giving an argument to M-P will cause it to prompt for a regular expression, which will be used for searching the command history. Only commands longer than two characters and less than *saved-commands-length-limit* will be kept. The Info system has also been extended with a command to create a new node. GNU Emacs Extensions The following functions and variables are extensions to the normal GNU Emacs primitives to support the Apollo environment (the functions below may be called either programatically as Lisp functions or interactively as commands): apollo-keyboard-type () This function returns as an integer the number of the keyboard type attached to the node on which Emacs is running. The keyboard type numbers are: 1, for the High-Profile Keyboard; 2, for the Low-Profile Keyboard Model I; and 3, for the Low-Profile Keyboard model II. bind-apollo-function-key (function-key binding &optional meta-binding) This function enables the Apollo Function Key defined by the string function-key and binds the normal keystroke to binding and the meta keystroke to meta-binding. If meta-binding is unspecified, binding is used for both the normal and meta keystrokes. See the variable *apollo-function-keys* in "etc/apollo.el" for the legal function keys. unbind-apollo-function-key (function-key) This function disables the Apollo Function Key defined by the string function-key and returns control of the Function Key to the Display Manager. See the variable *apollo-function-keys* in "etc/apollo.el" for the legal function keys. bind-apollo-mouse-button (mouse-button binding &optional meta-binding) This function enables the Apollo Mouse Button defined by the string mouse-button and binds the normal use of mouse-button to binding and the meta use of mouse-button to meta-binding. If meta-binding is unspecified, binding is used for both the normal and meta mouse-buttons. See the variable *apollo-mouse-buttons* in "etc/apollo.el" for a list of all the legal mouse buttons. unbind-apollo-mouse-button (mouse-button) This function disables the Apollo Mouse Button defined by the string mouse-button and returns control of the Mouse Button to the Display Manager. See the variable *apollo-mouse-buttons* in "etc/apollo.el" for a list of all the legal mouse buttons. select-apollo-meta-key (meta-key) This function allows you to select which key is used as a Meta Key for Emacs. The selection is made by specifying the name of the function key for the down key transition. See the variable *apollo-mouse-buttons* in "etc/apollo.el" for a list of all the legal functions keys; any function key that provides separate up and down transitions may be used as the Meta Key. select-apollo-protection-style (protection-style) This function causes Emacs to use Domain ACL protection if the protection-style argument is non-NIL and UNIX Mode protection if the protection-style argument is NIL. GNU Emacs can either use UNIX file modes or Domain ACLs to control the access rights to files it writes. By default, UNIX modes are used just as when Emacs runs on other UNIX systems. If Domain ACL style protection is enabled, Emacs will not use the chmod system call, and so files will be written using the default ACL for the directory in which they are created. execute-dm-command (dm-command) This function passes the string dm-command to the Display Manager for execution. backup-by-copying-when-mismatch This variable normally controls whether backup files should be created by renaming or copying. When non-NIL, if renaming to create a backup file would cause the owner or group of the file to change, then the backup file is created by copying so that the owner and group are preserved. On the Apollo, this variable has another function as well. Because Domain/OS has a typed file system, setting this variable non-NIL causes copying to also be done if the Domain/OS type of the file is not one of the default types (unstruct or uasc). Thus setting this variable non-NIL guarantees that the Domain/OS type of a created backup file will match the Domain/OS type of the parent file. *apollo-key-bindings-hook* This variable, if set non-NIL in your ".emacs", should be a function to call after the default Apollo key bindings are set up. Because the file "etc/apollo.el" is loaded after your ".emacs", this variable is needed so that you can customize the Apollo key bindings. *preempt-display-manager-bindings* This variable, which defaults to NIL, controls whether or not key bindings are made which conflict with those of the Display Manager. Set this variable non-NIL in your ".emacs" to enable the key bindings described above that conflich with Display Manager key bindings. The following low-level functions are used to implement the above functions. enable-apollo-function-key (function-key-code) This function enables the Apollo Function Key Transition defined by the integer argument function-key-code. See "/usr/include/apollo/kbd.h" (SR10.1) or "/sys/ins/kbd.ins.c" (SR9.7) for definitions of the key transition codes; the function-key-code argument must be greater than or equal to 0x80. This is a low-level function whose primary purpose is to implement bind-apollo-function-key. When an Apollo Function Key Transition is enabled, Emacs takes control of the function key away from the Display Manager, and subsequent uses of that function key cause no Display Manager action to be taken, but do cause Emacs to see the character sequence M-* <transition-code> as input (if the Meta Key is also depressed, then the character sequence is M-+ <transition-code>). Note that in order to use a function key within Emacs, two operations must be performed: the key must be enabled for use by Emacs, and the M-* and M-+ keystroke sequences must be bound to Emacs functions. The function bind-apollo-meta-key encapsulates all three operations. disable-apollo-function-key (function-key-code) This function disables the Apollo Function Key Transition defined by the integer argument function-key-code. When an Apollo Function Key Transition is disabled, Emacs returns control of the key to the Display Manager, and subsequent uses of that function key cause no Emacs input characters to be seen, but do cause any assigned Display Manager action to be taken. enable-apollo-mouse-button (mouse-button-code) This function enables the Apollo Mouse Button Transition defined by the integer argument mouse-button-code. The down key codes for the Left, Middle, and Right mouse buttons are the ASCII codes for 'a', 'b', and 'c'. The up transition key codes are the ASCII codes for 'A', 'B', and 'C'. The codes for 'd' and 'D' may be used if you have a four button mouse. This is a low-level function whose primary purpose is to implement bind-apollo-mouse-button. When a Mouse Button Transition is enabled, Emacs takes control of the mouse button away from the Display Manager, and subsequent uses of that mouse button cause no Display Manager action to be taken, but do cause Emacs to see the character sequence M-* <transition-code> <x-position+8> <y-position+8> as input (if the Meta Key is also depressed, then the character sequence is M-+ <transition-code> <x-position+8> <y-position+8>). The offset of 8 is necessary to avoid C-G characters as input. Note that in order to use a mouse button within Emacs, two operations must be performed: the mouse button must be enabled for use by Emacs, and the M-* and M-+ keystroke sequences must be bound to Emacs functions. The function bind-apollo-mouse-button encapsulates all three operations. disable-apollo-mouse-button (mouse-button-code) This function disables the Apollo Mouse Button Transition defined by the integer argument mouse-button-code. When an Apollo Mouse Button Transition is disabled, Emacs returns control of the mouse button to the Display Manager, and subsequent uses of that mouse button cause no Emacs input characters to be seen, but do cause any assigned Display Manager action to be taken. set-apollo-meta-key (meta-key-code) This function allows you to select which key is used as a Meta Key for Emacs. The selection is made by specifying the transition key code for the down key transition; the necessary key codes for the shifted, control, and up transitions are derived from the down key transition. This is a low-level function whose purpose is to implement define-apollo-meta-key. In addition to the functions described here, you should also consult the file "etc/apollo.el" for additional functions that may be useful. This file is normally loaded automatically when Emacs is run on an Apollo; it defines the commands and key bindings that are not implemented directly by C code. Acknowledgements The following people have contributed ideas that have helped make this interface possible: Nathaniel Mishkin, Rob Stanzel, and Mark Weissman of Apollo Computer, Dave Holcomb of CAECO, Vincent Broman of NOSC, and J. W. Peterson of the University of Utah.