Annotation of 43BSDReno/contrib/emacs-18.55/dist-1.3/fi/spec.out, revision 1.1

1.1     ! root        1:              Franz Inc. GNU Emacs/Common Lisp Interface
        !             2:                             Release 1.3
        !             3: 
        !             4: This document is a specification of the Franz Inc. GNU Emacs interface
        !             5: to Common Lisp, which is written entirely in GNU Emacs Lisp (for GNU
        !             6: Emacs version 18.50).
        !             7: 
        !             8: 0. Concepts and Terminology
        !             9: 
        !            10:    In Emacs, each buffer has a `mode.'  A mode is a collection of key
        !            11: and variable `bindings' which are specialized to a certain task.  When
        !            12: the cursor is in a `buffer' and you depress a key, its action is
        !            13: determined by the binding found in the `keymap' associated with that
        !            14: buffer (the buffer-local keymap).  If there is no binding in the
        !            15: buffer-local keymap, then the binding is sought on the `global' keymap.
        !            16: Thus, a mode is usually implemented by creating a buffer-local keymap
        !            17: and adding bindings to do specific tasks.  The result is that certain
        !            18: keys act differently in the buffer but most keys act just as they do
        !            19: in all the other buffers.  Usually the mode of a buffer is displayed
        !            20: in parentheses at the bottom of the screen (in what is called the
        !            21: `mode line').
        !            22: 
        !            23:    Two terms used interchangeably in this document are `subprocess' and
        !            24: `inferior process'.  They both refer to the interaction between Emacs
        !            25: and running program, and their names come from the fact that UNIX
        !            26: processes are part of a hierarchical structure--each process has a
        !            27: parent and some processes have children.  Here, Lisp is run as a child
        !            28: of Emacs, or a subordinate process under Emacs.
        !            29: 
        !            30:    Most machines available today have a `network' interface.  There
        !            31: are several `protocols' in use today, of which `TCP/IP' (Transmission
        !            32: Control Protocol) is one.  TCP/IP is most commonly used for
        !            33: communication between machines using `ethernet'--ethernet is the
        !            34: hardware and TCP/IP is the software.  TCP/IP is available on Berkeley
        !            35: UNIX and some other UNIX systems, and is a powerful tool for making
        !            36: resources from a large number of machines easily available to all
        !            37: users on the network.  The X window system, for example, uses TCP/IP
        !            38: to communicate between clients and server.
        !            39: 
        !            40:    In order for Emacs and Lisp to communicate, Lisp must accept
        !            41: messages sent to a certain address and Emacs must know that address.
        !            42: There are two types of addressing available: internet and UNIX domain.
        !            43: An internet address is a machine address and a port number.  A UNIX
        !            44: domain address is a file name.  The advantage of an internet address
        !            45: is that it can be accessed from any machine on the network because the
        !            46: address contains the machine number.  The disadvantage is that only
        !            47: one process (a Lisp process in our case) on a given machine can listen
        !            48: for messages on a given internet address.  Thus, if you wanted to use
        !            49: the Emacs to Lisp interface on a machine with many users, only one
        !            50: user at a time could use it.  A UNIX domain address can only be used
        !            51: from programs running on the same machine.  However the flexibility of
        !            52: using file names in UNIX domain addresses allows the Emacs to Lisp
        !            53: interface to choose unique addresses for each user running on a
        !            54: machine.  The file name convention we use is this: when user `smith'
        !            55: starts up Lisp, the UNIX domain address `~smith/.excl_to_emacs' is used
        !            56: by Lisp.  When `smith' directs Emacs to connect to Lisp, it knows it
        !            57: was started by smith and thus talks to address `~smith/.excl_to_emacs'.
        !            58: Thus multiple users on a given machine can run the Emacs to Lisp
        !            59: interface.
        !            60: 
        !            61:    The Emacs/Lisp interface in this document can use both of these
        !            62: methods of communication, but the preferred method uses UNIX domain
        !            63: sockets, because more than one person on a machine may use the
        !            64: Lisp/Emacs interface.
        !            65: 
        !            66: 1. Introduction
        !            67: 
        !            68:    The purpose of this package is to enhance the Lisp environment.  To
        !            69: this end, GNU Emacs and Lisp have been tightly coupled, and in the
        !            70: case of Allegro CL 3.0 the interface uses TCP/IP UNIX or internet
        !            71: domain sockets.  This interface can be broken down into three modes:
        !            72: 
        !            73:        * Common Lisp,
        !            74:        * Inferior Common Lisp, and
        !            75:        * TCP Common Lisp.
        !            76: 
        !            77: The first is for editing Lisp programs, the second for starting up a
        !            78: Lisp subprocess under Emacs, and the third for TCP/IP communication
        !            79: between Emacs and Lisp.
        !            80: 
        !            81:    While editing Lisp source code, there are commands that make it
        !            82: easy to send expressions to, and receive information from, a Lisp
        !            83: process.  For example: a function can be sent to Lisp from a source
        !            84: buffer, a form in a source buffer can be macroexpanded, and
        !            85: source for functions defined by loading files into Lisp may be located
        !            86: automatically.
        !            87: 
        !            88:    For many of the bindings set up in the editing modes to be useful,
        !            89: there must be a Lisp to which Emacs can communicate.  In this area the
        !            90: interface can be broken down into three parts: an enhanced mode for
        !            91: running an inferior Lisp process in an Emacs buffer, a new mode that
        !            92: creates an Emacs buffer onto an existing Lisp process via a TCP/IP
        !            93: socket, and mechanisms to query the Lisp environment for information
        !            94: which can be used in the Emacs environment (also using TCP/IP
        !            95: sockets).
        !            96: 
        !            97:    Running an inferior Lisp in an Emacs buffer is not new--Emacs
        !            98: supports this `off the shelf.'  This feature allows users to interact
        !            99: directly with Lisp while editing Lisp source code.  Although the
        !           100: existing inferior Lisp mode has been enhanced and a new mode added to
        !           101: support socket connections to Lisp, the most significant contribution of
        !           102: this package is in offering tighter coupling of the Lisp and Emacs
        !           103: environments and in providing better subprocess management tools.
        !           104: 
        !           105:    By taking advantage of Lisp multiprocessing, an Emacs buffer can be
        !           106: opened onto a Lisp not started as a subprocess of Emacs.  This
        !           107: connection uses TCP/IP sockets (UNIX or internet domain), which in turn
        !           108: means that Emacs can talk to a Lisp running on any machine on the
        !           109: network.  Sockets and multiprocessing also mean that one can establish
        !           110: more than one connection between Lisp and Emacs.
        !           111: 
        !           112:    These socket connections to Lisp are the key to the integration of
        !           113: the two environments.  Emacs uses a `back door' connection to exchange
        !           114: information with a Lisp process.  Users can obtain information about
        !           115: Lisp function argument lists and symbol documentation, macroexpand Lisp
        !           116: forms, and locate source definitions of Lisp symbols (which are recorded
        !           117: by Lisp when a symbol is defined, usually by loading a file).  All these
        !           118: features are accessible with a few key-strokes.
        !           119: 
        !           120:    Aside from the Lisp interface proper, this package provides useful
        !           121: features for subprocess manipulation, including an input ring for
        !           122: handy retrieval of previously-typed input, filename completion,
        !           123: special handling of certain subprocess-specific keys (e.g., ^C or ^D),
        !           124: and continuously showing output from a subprocess in a visible buffer.
        !           125: 
        !           126: 2. Editing Lisp
        !           127: 
        !           128:    This package modifies `auto-mode-alist' so that the major modes
        !           129: defined in this package are invoked when certain types of source files
        !           130: are edited.  The list of filename extensions given by the value of
        !           131: `fi:common-lisp-file-types' cause `fi:common-lisp-mode' to be invoked
        !           132: whenever a file with one of these types is visited.  The important
        !           133: actions done by Common Lisp mode are (in order):
        !           134: 
        !           135:        1. set up local variables specific to the mode;
        !           136:        2. check for package information;
        !           137:        3. set up keymaps; and
        !           138:        4. call hooks.
        !           139: 
        !           140: The above functions are enhancements to the standard available GNU
        !           141: Emacs Lisp mode.
        !           142: 
        !           143:    The major mode function for Common Lisp is called
        !           144: `fi:common-lisp-mode', and this function can be interactively called
        !           145: to put a buffer in Common Lisp mode.
        !           146: 
        !           147: fi:common-lisp-file-types...........................................[variable]
        !           148:    Value: (".cl" ".lisp" ".lsp")
        !           149:    A list of the files which are automatically put in fi:common-lisp-mode.
        !           150: This variable should be set before this package is loaded.
        !           151: 
        !           152: 
        !           153: 
        !           154: 2.1 Bindings
        !           155: 
        !           156:    The key bindings for Common Lisp mode are set up only once, the
        !           157: first time the mode is entered, and are taken from the variable
        !           158: `fi:common-lisp-mode-map'.  Users wanting to change the bindings could
        !           159: explicitly set this variable or augment the map from within the hooks
        !           160: for the mode.
        !           161: 
        !           162:    The initial local bindings for Common Lisp mode are:
        !           163: 
        !           164: fi:common-lisp-mode-map...............................................[keymap]
        !           165:    Major mode map used when editing Common Lisp source.
        !           166: 
        !           167: C-c             Prefix Command
        !           168: RET             fi:lisp-reindent-newline-indent
        !           169: DEL             backward-delete-char-untabify
        !           170: TAB             lisp-indent-line
        !           171: C-x             Prefix Command
        !           172: ESC             Prefix Command
        !           173: 
        !           174: C-c C-r         fi:lisp-eval-region
        !           175: C-c C-s         fi:lisp-eval-last-sexp
        !           176: C-c C-b         fi:lisp-eval-current-buffer
        !           177: 
        !           178: ESC C-x         fi:lisp-eval-defun
        !           179: ESC W           fi:lisp-walk
        !           180: ESC M           fi:lisp-macroexpand
        !           181: ESC F           fi:lisp-function-documentation
        !           182: ESC D           fi:lisp-describe
        !           183: ESC C           fi:lisp-who-calls
        !           184: ESC A           fi:lisp-arglist
        !           185: ESC TAB         fi:lisp-complete-symbol
        !           186: ESC ,           fi:lisp-tags-loop-continue
        !           187: ESC .           fi:lisp-find-tag
        !           188: ESC C-q         indent-sexp
        !           189: 
        !           190: 
        !           191: 
        !           192: 
        !           193: 2.2 Variables
        !           194: 
        !           195:    All local variables are killed when Common Lisp mode is
        !           196: entered--this is a convention to insure that there are no name
        !           197: conflicts with user variables.
        !           198: 
        !           199:    To correctly deal with the Common Lisp package system, Emacs must
        !           200: know the package for each file, so that it may use this when sending
        !           201: expressions from a buffer to Lisp.  There is a buffer-local variable
        !           202: which contains the name of the package:
        !           203: 
        !           204: fi:package..........................................................[variable]
        !           205:    Value: "user"
        !           206:    A buffer-local variable whose value should either be nil or a string
        !           207: which names a package in the Lisp world (ie, in a Lisp subprocess running
        !           208: as an inferior of Emacs in some buffer).  It is used when expressions are
        !           209: sent from an Emacs buffer to a Lisp process so that the symbols are read
        !           210: into the correct Lisp package.
        !           211: 
        !           212: 
        !           213: 
        !           214: There are three ways to automatically set this variable (the first and
        !           215: third items here are standard GNU Emacs features):
        !           216: 
        !           217:   1. If the first line in the file contains text surrounded by -*-,
        !           218:      the `package' field of this line is parsed for the package name.
        !           219:      For example,
        !           220: 
        !           221:                ;; -*- mode: common-lisp; package: excl -*-
        !           222: 
        !           223:      would put the file in package `excl'.
        !           224: 
        !           225:   2. If the above attempt fails, then the buffer is searched for an
        !           226:      `in-package' form, which is parsed for the package name.
        !           227: 
        !           228:   3. Lastly, the values obtained in one of the first two locations can
        !           229:      be over-written by manually setting fi:package in the local
        !           230:      variables list.  For example, the following at the end of the
        !           231:      file will override any value given previously given to
        !           232:      fi:package:
        !           233: 
        !           234:        ^L
        !           235:        ;; Local Variables:
        !           236:        ;; eval: (setq fi:package "excl")
        !           237:        ;; End:
        !           238: 
        !           239:      Note that the normal method for setting a variable will not work,
        !           240:      because `fi:package' contains a `:' and this confuses GNU
        !           241:      Emacs, hence the use of `eval'.
        !           242: 
        !           243: If Emacs cannot determine the package, then it is assumed to be
        !           244: "user" (the initial Common Lisp package).
        !           245: 
        !           246: 2.3 Functions
        !           247: 
        !           248:    The following functions are either bound to keys in Common Lisp
        !           249: mode or are available as extended commands:
        !           250: 
        !           251: fi:lisp-reindent-newline-indent.....................................[function]
        !           252:    Invoke with: RET in Common Lisp mode.
        !           253:    Indent the current line, insert a newline and indent to the proper
        !           254: column.
        !           255: 
        !           256: 
        !           257: fi:lisp-eval-region.................................................[function]
        !           258:    Invoke with: C-c C-r in Common Lisp mode.
        !           259:    Send the text in the region to the Lisp subprocess associated with this
        !           260: buffer, one expression at a time if there is more than one complete
        !           261: expression.  If a Lisp subprocess has not been started, then one is
        !           262: started.  With a prefix argument, the source sent to the subprocess is
        !           263: compiled.
        !           264: 
        !           265: 
        !           266: fi:lisp-eval-last-sexp..............................................[function]
        !           267:    Invoke with: C-c C-s in Common Lisp mode.
        !           268:    Send the sexp before the point to the Lisp subprocess associated with
        !           269: this buffer.  If a Lisp subprocess has not been started, then one is
        !           270: started.  With a prefix argument, the source sent to the subprocess is
        !           271: compiled.
        !           272: 
        !           273: 
        !           274: fi:lisp-eval-current-buffer.........................................[function]
        !           275:    Invoke with: C-c C-b in Common Lisp mode.
        !           276:    Send the entire buffer to the Lisp subprocess associated with this
        !           277: buffer.  If a Lisp subprocess has not been started, then one is started.
        !           278: With a prefix argument, the source sent to the subprocess is compiled.
        !           279: 
        !           280: 
        !           281: fi:lisp-eval-defun..................................................[function]
        !           282:    Invoke with: ESC C-x in Common Lisp mode.
        !           283:    Send the current top-level (or nearest previous) form to the Lisp
        !           284: subprocess associated with this buffer.  A `top-level' form is one that
        !           285: starts in column 1.  If a Lisp subprocess has not been started, then one is
        !           286: started.  With a prefix argument, the source sent to the subprocess is
        !           287: compiled.
        !           288: 
        !           289: 
        !           290: fi:remove-all-temporary-lisp-transaction-files......................[function]
        !           291:    This function will clean up all the files created for Lisp/Emacs
        !           292: communication.  See the variable fi:emacs-to-lisp-transaction-directory for
        !           293: the location of the files.
        !           294: 
        !           295: 
        !           296: 
        !           297:    The following functions are bound to keys in Common Lisp mode, and
        !           298: require the TCP/IP communication channel to Lisp:
        !           299: 
        !           300: fi:lisp-find-tag....................................................[function]
        !           301:    Invoke with: ESC . in Common Lisp mode.
        !           302:    Find the Common Lisp source for a symbol, using the characters around
        !           303: the point as the default tag.
        !           304: 
        !           305: 
        !           306: fi:lisp-tags-loop-continue..........................................[function]
        !           307:    Invoke with: ESC , in Common Lisp mode.
        !           308:    Find the next occurrence of the tag last used by fi:lisp-find-tag.
        !           309: 
        !           310: 
        !           311: fi:lisp-arglist.....................................................[function]
        !           312:    Invoke with: ESC A in Common Lisp mode.
        !           313:    Print the arglist (using excl:arglist) for a symbol, which is read from
        !           314: the minibuffer.  The word around the point is used as the default.
        !           315: 
        !           316: 
        !           317: fi:lisp-describe....................................................[function]
        !           318:    Invoke with: ESC D in Common Lisp mode.
        !           319:    Describe a symbol, which is read from the minibuffer.  The word around
        !           320: the point is used as the default.
        !           321: 
        !           322: 
        !           323: fi:lisp-function-documentation......................................[function]
        !           324:    Invoke with: ESC F in Common Lisp mode.
        !           325:    Print the function documentation for a symbol, which is read from the
        !           326: minibuffer.  The word around the point is used as the default.
        !           327: 
        !           328: 
        !           329: fi:lisp-macroexpand.................................................[function]
        !           330:    Invoke with: ESC M in Common Lisp mode.
        !           331:    Print the macroexpansion of the form at the point.
        !           332: 
        !           333: 
        !           334: fi:lisp-walk........................................................[function]
        !           335:    Invoke with: ESC W in Common Lisp mode.
        !           336:    Print the full macroexpansion the form at the point.
        !           337: With a prefix argument, macroexpand the code as the compiler would.
        !           338: 
        !           339: 
        !           340: fi:lisp-who-calls...................................................[function]
        !           341:    Invoke with: ESC C in Common Lisp mode.
        !           342:    Print all the callers of a function.  The default symbol name is taken
        !           343: from the sexp around the point.
        !           344: 
        !           345: 
        !           346: fi:lisp-complete-symbol.............................................[function]
        !           347:    Invoke with: ESC TAB in Common Lisp mode.
        !           348:    Perform completion on the Common Lisp symbol preceding the point.  That
        !           349: symbol is compared to symbols that exist in the Common Lisp, to which there
        !           350: is a TCP/IP connection (see fi:eval-in-lisp).  If the symbol starts just
        !           351: after an open-parenthesis, then only symbols (in the Common Lisp) with
        !           352: function defintions are considered.  Otherwise all symbols are considered.
        !           353: 
        !           354: 
        !           355: 
        !           356: fi:set-associated-sublisp...........................................[function]
        !           357:    When evaluated in a Lisp source buffer causes further `eval'
        !           358: commands (those which send expressions from Emacs to Lisp) to use
        !           359: BUFFER-NAME as the buffer which contains a Lisp subprocess.  If evaluated
        !           360: when not in a Lisp source buffer, then the process type is read from the
        !           361: minibuffer ("common-lisp" or "franz-lisp").  The buffer name is
        !           362: interactively read and must be the name of an existing buffer.  New buffers
        !           363: with the same mode as the current buffer will also use BUFFER-NAME for
        !           364: future `eval' commands.
        !           365: 
        !           366: 
        !           367: 
        !           368: 2.3 Hooks
        !           369: 
        !           370:    The hooks run for Common Lisp mode are fi:lisp-mode-hook and
        !           371: fi:common-lisp-mode-hook.  The form of the hook function is determined
        !           372: by `run-hooks', which is used to process the hooks.  Hooks are run
        !           373: last during mode initialization.  For example, the following hook
        !           374: enables auto-fill in Common Lisp mode:
        !           375: 
        !           376:     (setq fi:lisp-mode-hook
        !           377:       '(lambda ()
        !           378:        (define-key (current-local-map) "\t" 'lisp-indent-line)
        !           379:        (setq fill-column 75)
        !           380:        (auto-fill-mode 1)))
        !           381: 
        !           382: 3. Running Lisp
        !           383: 
        !           384:    What follows is a discussion of the bindings, variables and
        !           385: functions allowing the user to interact with and manipulate a Lisp run
        !           386: as an inferior to Emacs.  A discussion on how to start up and use the
        !           387: interface is discussed in the next section.
        !           388: 
        !           389: 
        !           390: 3.1 Bindings
        !           391: 
        !           392:    The initial local bindings for Inferior Common Lisp mode are:
        !           393: 
        !           394: fi:inferior-common-lisp-mode-map......................................[keymap]
        !           395:    The inferior-common-lisp major-mode keymap.
        !           396: 
        !           397: DEL             backward-delete-char-untabify
        !           398: TAB             lisp-indent-line
        !           399: C-x             Prefix Command
        !           400: ESC             Prefix Command
        !           401: C-c             Prefix Command
        !           402: RET             fi:inferior-lisp-newline
        !           403: 
        !           404: C-c C-\         fi:subprocess-quit
        !           405: C-c C-d         fi:subprocess-send-eof
        !           406: C-c C-c         fi:subprocess-interrupt
        !           407: C-c C-w         fi:subprocess-backward-kill-word
        !           408: C-c C-v         fi:subprocess-show-output
        !           409: C-c C-u         fi:subprocess-kill-input
        !           410: C-c C-s         fi:re-search-forward-input
        !           411: C-c C-r         fi:re-search-backward-input
        !           412: C-c C-p         fi:pop-input
        !           413: C-c C-o         fi:subprocess-send-flush
        !           414: C-c C-n         fi:push-input
        !           415: C-c RET         fi:subprocess-input-region
        !           416: C-c C-l         fi:list-input-ring
        !           417: C-c C-k         fi:subprocess-kill-output
        !           418: C-c C-a         fi:subprocess-beginning-of-line
        !           419: 
        !           420: C-x RET         fi:inferior-lisp-input-list
        !           421: 
        !           422: ESC W           fi:lisp-walk
        !           423: ESC M           fi:lisp-macroexpand
        !           424: ESC F           fi:lisp-function-documentation
        !           425: ESC D           fi:lisp-describe
        !           426: ESC C           fi:lisp-who-calls
        !           427: ESC A           fi:lisp-arglist
        !           428: ESC TAB         fi:lisp-complete-symbol
        !           429: ESC ,           fi:lisp-tags-loop-continue
        !           430: ESC .           fi:lisp-find-tag
        !           431: ESC RET         fi:inferior-lisp-input-sexp
        !           432: ESC C-q         indent-sexp
        !           433: 
        !           434: 
        !           435: 
        !           436: 
        !           437: and for the TCP Common Lisp mode:
        !           438: 
        !           439: fi:tcp-common-lisp-mode-map...........................................[keymap]
        !           440:    The tcp-lisp major-mode keymap.
        !           441: 
        !           442: DEL             backward-delete-char-untabify
        !           443: TAB             lisp-indent-line
        !           444: C-x             Prefix Command
        !           445: ESC             Prefix Command
        !           446: C-c             Prefix Command
        !           447: RET             fi:inferior-lisp-newline
        !           448: 
        !           449: C-c C-\         fi:tcp-lisp-kill-process
        !           450: C-c C-d         fi:tcp-lisp-send-eof
        !           451: C-c C-c         fi:tcp-lisp-interrupt-process
        !           452: C-c C-w         fi:subprocess-backward-kill-word
        !           453: C-c C-v         fi:subprocess-show-output
        !           454: C-c C-u         fi:subprocess-kill-input
        !           455: C-c C-s         fi:re-search-forward-input
        !           456: C-c C-r         fi:re-search-backward-input
        !           457: C-c C-p         fi:pop-input
        !           458: C-c C-o         fi:subprocess-send-flush
        !           459: C-c C-n         fi:push-input
        !           460: C-c RET         fi:subprocess-input-region
        !           461: C-c C-l         fi:list-input-ring
        !           462: C-c C-k         fi:subprocess-kill-output
        !           463: C-c C-a         fi:subprocess-beginning-of-line
        !           464: 
        !           465: C-x RET         fi:inferior-lisp-input-list
        !           466: 
        !           467: ESC W           fi:lisp-walk
        !           468: ESC M           fi:lisp-macroexpand
        !           469: ESC F           fi:lisp-function-documentation
        !           470: ESC D           fi:lisp-describe
        !           471: ESC C           fi:lisp-who-calls
        !           472: ESC A           fi:lisp-arglist
        !           473: ESC TAB         fi:lisp-complete-symbol
        !           474: ESC ,           fi:lisp-tags-loop-continue
        !           475: ESC .           fi:lisp-find-tag
        !           476: ESC RET         fi:inferior-lisp-input-sexp
        !           477: ESC C-q         indent-sexp
        !           478: 
        !           479: 
        !           480: 
        !           481: 
        !           482:    Superkeys are keys that are handled specially at the end of a
        !           483: buffer.  At the end of a buffer it has a buffer-specific meaning, but
        !           484: anywhere else in the buffer it has the normal global meaning (obtained
        !           485: by looking the key up in the global keymap).  This way, ^D can send an
        !           486: EOF to the Lisp process at the end of a buffer but invoke delete-char
        !           487: ("delete character") anywhere else.
        !           488:  
        !           489:    The values of `fi:inferior-common-lisp-mode-super-key-map' and
        !           490: `fi:tcp-common-lisp-mode-super-key-map' are used as superkey maps for
        !           491: Inferior Common Lisp and TCP Common Lisp modes.
        !           492:    
        !           493:    Superkeys are turned off by default.
        !           494: 
        !           495: 3.2 Variables
        !           496: 
        !           497:    The name of the Common Lisp image to activate for an inferior Lisp
        !           498: is taken from the following variables:
        !           499: 
        !           500: fi:common-lisp-image-name...........................................[variable]
        !           501:    Value: "cl"
        !           502:    *Default Common Lisp image to invoke from `fi:common-lisp'.  If the
        !           503: value is a string then it names the image file or image path that
        !           504: `fi:common-lisp' invokes.  Otherwise, the value of this variable is given
        !           505: to funcall, the result of which should yield a string which is the image
        !           506: name or path.
        !           507: 
        !           508: 
        !           509: 
        !           510:    After the image name as been determined and the process has been
        !           511: started, a file in the user's home directory called .emacs_<IMAGE>,
        !           512: where <IMAGE> is the image name, is fed to the newly created process.
        !           513: This could be used to customize a initialization file on the name of
        !           514: the Lisp binary.
        !           515: 
        !           516:    The command-line arguments passed to the activated image are taken
        !           517: from the following variables:
        !           518: 
        !           519: fi:common-lisp-image-arguments......................................[variable]
        !           520:    Value: nil
        !           521:    *Default Common Lisp image arguments when invoked from `fi:common-lisp',
        !           522: which must be a list of strings.
        !           523: 
        !           524: 
        !           525: 
        !           526:    The prompt pattern for the inferior Lisp is taken from a variable
        !           527: with the name `fi:<IMAGE>-prompt-pattern' or from the following:
        !           528: 
        !           529: fi:common-lisp-prompt-pattern.......................................[variable]
        !           530:    Value: "^\\(\\[[0-9]+c?\\] \\|\\[step\\] \\)?<[-A-Za-z]* ?[0-9]*?> "
        !           531:    *The regular expression which matches the Common Lisp prompt, used in
        !           532: Inferior Common Lisp mode.  Anything from beginning of line up to the end
        !           533: of what this pattern matches is deemed to be a prompt.
        !           534: 
        !           535: 
        !           536: fi:common-lisp-package-regexp.......................................[variable]
        !           537:    Value: "(in-package\\>\\|:\\<pa\\>\\|:\\<pac\\>\\|:\\<pack\\>\\|:\\<packa\\>\\|:\\<packag\\>\\|:\\<package\\>"
        !           538:    *The regular expression matching the Common Lisp expression(s) to change
        !           539: packages.  If nil, no automatic package tracking will be done.
        !           540: 
        !           541: 
        !           542: 
        !           543:    The following variables are used in TCP Common Lisp mode:
        !           544: 
        !           545: fi:unix-domain......................................................[variable]
        !           546:    Value: t
        !           547:    *If non-nil, then `fi:unix-domain-socket' specifies the name of the
        !           548: socket file.  It is recommended that this interface be used, and not
        !           549: internet ports, because when internet ports are used only one process on a
        !           550: machine may use this interface (it is a global resource).  When using UNIX
        !           551: domain sockets, communication is done through a socket file in the user's
        !           552: home directory.  But, if you really want to use internet ports, here are
        !           553: the steps to take:
        !           554: 
        !           555: 1. Set this variable to nil.
        !           556: 2. Add the following line to /etc/services:
        !           557:        excl            6789/tcp
        !           558: 3. Make sure `fi:local-host-name' is in /etc/hosts and points to the local
        !           559: or loopback host.
        !           560: 4. On the Common Lisp side, put the following in you .clinit.cl file:
        !           561:        (setq ipc:*inet-port* 6789)     ; the number from /etc/services
        !           562:        (setq ipc:*unix-domain* nil)
        !           563: 
        !           564: The problem with this, is that people can then use `telnet' to get a
        !           565: listener on your lisp!
        !           566: 
        !           567: 
        !           568: fi:unix-domain-socket...............................................[variable]
        !           569:    Value: "~/.excl_to_emacs"
        !           570:    *The name of the socket file that lisp and emacs use to communicate.
        !           571: This is used when fi:unix-domain is non-nil.
        !           572: 
        !           573: 
        !           574: fi:excl-service-name................................................[variable]
        !           575:    Value: "excl"
        !           576:    *The service name from /etc/services (`tcp' type).  This is only used
        !           577: when fi:unix-domain is nil.
        !           578: 
        !           579: 
        !           580: fi:local-host-name..................................................[variable]
        !           581:    Value: "localhost"
        !           582:    *On 4.2 BSD the name of 127.1--usually localhost or loopback.
        !           583: This is only used when fi:unix-domain is nil.
        !           584: 
        !           585: 
        !           586: fi:source-info-not-found-hook.......................................[variable]
        !           587:    Value: find-tag
        !           588:    *The value of this variable is funcalled when source information is not
        !           589: present in Lisp for a symbol.  The function is given one argument, the name
        !           590: for which source is desired (a string).  The null string means use the word
        !           591: at the point as the search word.  This allows the GNU Emacs tags facility
        !           592: to be used when the information is not present in Lisp.
        !           593: 
        !           594: 
        !           595: 
        !           596: plus the following miscellaneous variables:
        !           597: 
        !           598: fi:echo-evals-from-buffer-in-listener-p.............................[variable]
        !           599:    Value: nil
        !           600:    *If non-NIL, forms evalutated directly from a lisp buffer by the
        !           601: fi:lisp-eval-* functions will be echoed by the lisp listener.
        !           602: 
        !           603: 
        !           604: fi:emacs-to-lisp-transaction-directory..............................[variable]
        !           605:    Value: "/tmp"
        !           606:    *The directory in which files for Emacs/Lisp communication are stored.
        !           607: When using Lisp and Emacs on different machines, this directory should be
        !           608: accessible on both machine with the same pathname (via the wonders of NFS).
        !           609: 
        !           610: 
        !           611: fi:subprocess-enable-superkeys......................................[variable]
        !           612:    Value: nil
        !           613:    *If t, certain keys become `superkeys' in subprocess buffers--this
        !           614: should be set before starting any subprocesses.  The superkeys are C-a,
        !           615: C-d, C-o,C-u, C-w, C-z, and C-\, which will behave as they would in the
        !           616: current local keymap when typed at the end of a subprocess buffer.  If
        !           617: typed elsewhere, these keys have their normal global binding.  This is a
        !           618: buffer-local symbol.  Use setq-default to set the default value for this
        !           619: symbol.
        !           620: 
        !           621: 
        !           622: fi:pop-to-sublisp-buffer-after-lisp-eval............................[variable]
        !           623:    Value: t
        !           624:    *If non-nil, then after sending expressions to a Lisp process do pop to
        !           625: the buffer which contains the Lisp.
        !           626: 
        !           627: 
        !           628: fi:display-buffer-function..........................................[variable]
        !           629:    Value: switch-to-buffer
        !           630:    *If non-nil, then it is used as the function which is funcall'd with one
        !           631: argument, a buffer, to display a subprocess buffer when it is created (ie,
        !           632: from `fi:common-lisp').
        !           633: 
        !           634: 
        !           635: fi:lisp-evalserver-timeout..........................................[variable]
        !           636:    Value: 5
        !           637:    The time which fi:eval-in-lisp will wait before timing out and
        !           638: signalling an error.  Without a timeout Emacs would potentially be locked
        !           639: out if Lisp did not `return' a result.
        !           640: 
        !           641: 
        !           642: fi:lisp-evalserver-number-reads.....................................[variable]
        !           643:    Value: 20
        !           644:    The number of times the Lisp eval server tries to read from the
        !           645: lisp-evalserver process before giving up.  Without this feature Emacs would
        !           646: hang if Lisp got into an infinite loop while printing.  If the size of the
        !           647: values returned to Emacs is large, then the value of this variable should
        !           648: be increased.
        !           649: 
        !           650: 
        !           651: 
        !           652:    The following are miscellaneous subprocess variables:
        !           653: 
        !           654: fi:default-input-ring-max...........................................[variable]
        !           655:    Value: 50
        !           656:    *The default maximum length to which an input ring is allowed to grow.
        !           657: 
        !           658: 
        !           659: fi:shell-token-pattern..............................................[variable]
        !           660:    Value: "[   
        !           661: ()<>&|;=]"
        !           662:    *The regular expression used by file name completion to mark path name
        !           663: boundaries.
        !           664: 
        !           665: 
        !           666: fi:subprocess-continuously-show-output-in-visible-buffer............[variable]
        !           667:    Value: t
        !           668:    *If t, output from a subprocess to a visible buffer is continuously
        !           669: shown.  If a subprocess buffer is visible and the window point is beyond
        !           670: the process output marker, output to that buffer from its associated
        !           671: process will be continuously visible.  If the window point is before the
        !           672: process output marker, the window is not updated.  This is a buffer-local
        !           673: symbol.
        !           674: 
        !           675: 
        !           676: 
        !           677:    The following three variables are used to track the shell commands
        !           678: which change the current working directory.  For Common Lisp, the
        !           679: aliases in Appendix A together with these variables will allow Common
        !           680: Lisp to emulate the shell commands and for Emacs to track them:
        !           681: 
        !           682: fi:shell-cd-regexp..................................................[variable]
        !           683:    Value: ":?cd"
        !           684:    *The regular expression matching the C shell `cd' command.  If nil,
        !           685: no automatic directory changes will be made.
        !           686: 
        !           687: 
        !           688: fi:shell-popd-regexp................................................[variable]
        !           689:    Value: ":?popd"
        !           690:    *The regular expression matching the C shell `popd' command.  If nil, no
        !           691: automatic directory changes will be made.
        !           692: 
        !           693: 
        !           694: fi:shell-pushd-regexp...............................................[variable]
        !           695:    Value: ":?pushd"
        !           696:    *The regular expression matching the C shell `pushd' command.  If nil,
        !           697: no automatic directory changes will be made.
        !           698: 
        !           699: 
        !           700: 
        !           701: 3.3 Functions
        !           702: 
        !           703: fi:common-lisp......................................................[function]
        !           704:    Start a Common Lisp subprocess in a buffer whose name is determined
        !           705: from the optional prefix argument BUFFER-NUMBER.  Common Lisp buffer names
        !           706: start with `*common-lisp' and end with `*', with an optional `-N' in
        !           707: between.  If BUFFER-NUMBER is not given it defaults to 1.  If BUFFER-NUMBER
        !           708: is >= 0, then the buffer is named `*common-lisp-<BUFFER-NUMBER>*'.  If
        !           709: BUFFER-NUMBER is < 0, then the first available buffer name is chosen.
        !           710: 
        !           711: The image file and image arguments are taken from the variables
        !           712: `fi:common-lisp-image-name' and `fi:common-lisp-image-arguments'.
        !           713: 
        !           714: See fi:explicit-common-lisp.
        !           715: 
        !           716: 
        !           717: fi:explicit-common-lisp.............................................[function]
        !           718:    The same as fi:common-lisp, except that the image and image arguments
        !           719: are read from the minibuffer.
        !           720: 
        !           721: 
        !           722: fi:remote-common-lisp...............................................[function]
        !           723:    Start a Common Lisp subprocess in a buffer whose name is determined
        !           724: from the optional prefix argument BUFFER-NUMBER, where the Common Lisp
        !           725: image is run on another machine.  Common Lisp buffer names start with
        !           726: `*common-lisp' and end with `*', with an optional `-N' in between.  If
        !           727: BUFFER-NUMBER is not given it defaults to 1.  If BUFFER-NUMBER is >= 0,
        !           728: then the buffer is named `*common-lisp-<BUFFER-NUMBER>*'.  If BUFFER-NUMBER
        !           729: is < 0, then the first available buffer name is chosen.
        !           730: 
        !           731: The host on which the image is run is read from the minibuffer.
        !           732: 
        !           733: The image file and image arguments are taken from the variables
        !           734: `fi:common-lisp-image-name' and `fi:common-lisp-image-arguments'.
        !           735: 
        !           736: See fi:explicit-remote-common-lisp.
        !           737: 
        !           738: 
        !           739: fi:explicit-remote-common-lisp......................................[function]
        !           740:    The same as fi:remote-common-lisp, except that the image and image
        !           741: arguments are read from the minibuffer.
        !           742: 
        !           743: 
        !           744: fi:tcp-common-lisp..................................................[function]
        !           745:    In a buffer whose name is determined from the optional prefix argument
        !           746: BUFFER-NAME, connect to a Common Lisp using either a UNIX domain socket
        !           747: file or internet port number.  Common Lisp buffer names start with
        !           748: `*common-lisp' and end with `*', with an optional `-N' in between.  If
        !           749: BUFFER-NUMBER is not given it defaults to 1.  If BUFFER-NUMBER is >= 0,then
        !           750: the buffer is named `*common-lisp-<BUFFER-NUMBER>*'.  If BUFFER-NUMBER is <
        !           751: 0, then the first available buffer name is chosen.
        !           752: 
        !           753: See `fi:unix-domain' and `fi:explicit-tcp-common-lisp'.
        !           754: 
        !           755: 
        !           756: fi:explicit-tcp-common-lisp.........................................[function]
        !           757:    The same as fi:tcp-common-lisp, except that the host name a port number
        !           758: are read from the minibuffer.  Use a port number of 0 for UNIX domain
        !           759: sockets.
        !           760: 
        !           761: 
        !           762: 
        !           763: fi:inferior-lisp-newline............................................[function]
        !           764:    Invoke with: RET in Inferior Common Lisp mode.
        !           765:    Bound to RET in an inferior Lisp buffer.  At the end of the buffer it
        !           766: inserts a newline and performs automatic indentation.  Whole expressions
        !           767: are sent to Lisp (not each piece after each newline is typed).  This allows
        !           768: previously typed lines to be edited before Lisp is sent the input.  Typed
        !           769: anywhere else in the buffer, this functions causes the input previously
        !           770: typed (around the point) to be copied to the end of the subprocess buffer
        !           771: and send to Lisp.
        !           772: 
        !           773: 
        !           774: fi:inferior-lisp-input-sexp.........................................[function]
        !           775:    Invoke with: ESC RET in Inferior Common Lisp mode.
        !           776:    Send the sexp on which the point resides to the Lisp subprocess.  With a
        !           777: numeric prefix argument, send that many sexps.
        !           778: 
        !           779: 
        !           780: fi:inferior-lisp-input-list.........................................[function]
        !           781:    Invoke with: C-x RET in Inferior Common Lisp mode.
        !           782:    Send the list before the point to the Lisp subprocess.  With a numeric
        !           783: prefix argument, send that many lists.
        !           784: 
        !           785: 
        !           786: fi:subprocess-input-region..........................................[function]
        !           787:    Invoke with: C-c RET in Inferior Common Lisp mode.
        !           788:    Send the region defined by the point and mark to the Lisp subprocess.
        !           789: 
        !           790: 
        !           791: fi:subprocess-kill-input............................................[function]
        !           792:    Invoke with: C-c C-u in Inferior Common Lisp mode.
        !           793:    Kill all input since the last output by the subprocess.
        !           794: 
        !           795: 
        !           796: fi:subprocess-beginning-of-line.....................................[function]
        !           797:    Invoke with: C-c C-a in Inferior Common Lisp mode.
        !           798:    Moves point to beginning of line, just like (beginning-of-line),
        !           799: except that if the pattern at the beginning of the line matches the
        !           800: current subprocess prompt pattern, this function skips over it.
        !           801: 
        !           802: 
        !           803: fi:subprocess-backward-kill-word....................................[function]
        !           804:    Invoke with: C-c C-w in Inferior Common Lisp mode.
        !           805:    Kill previous word in current subprocess input line.  This function
        !           806: takes care not to delete past most recent subprocess output.
        !           807: 
        !           808: 
        !           809: fi:subprocess-kill-output...........................................[function]
        !           810:    Invoke with: C-c C-k in Inferior Common Lisp mode.
        !           811:    Kill all output from the subprocess since the last input.
        !           812: 
        !           813: 
        !           814: fi:subprocess-quit..................................................[function]
        !           815:    Invoke with: C-c C-\ in Inferior Common Lisp mode.
        !           816:    Send a quit signal to the subprocess.
        !           817: 
        !           818: 
        !           819: fi:subprocess-send-flush............................................[function]
        !           820:    Invoke with: C-c C-o in Inferior Common Lisp mode.
        !           821:    Send the `flush output' character (^O) to subprocess.
        !           822: 
        !           823: 
        !           824: fi:subprocess-show-output...........................................[function]
        !           825:    Invoke with: C-c C-v in Inferior Common Lisp mode.
        !           826:    Display the start of this batch of shell output at top of window.
        !           827: Also move the point there.
        !           828: 
        !           829: 
        !           830: fi:subprocess-suspend...............................................[function]
        !           831:    Suspend, with a SIGSTOP, the current subprocess.
        !           832: 
        !           833: 
        !           834: 
        !           835:    The following three functions are used in fi:inferior-lisp-mode to
        !           836: interrupt, kill or input an end-of-file to the Lisp process:
        !           837: 
        !           838: fi:subprocess-interrupt.............................................[function]
        !           839:    Invoke with: C-c C-c in Inferior Common Lisp mode.
        !           840:    Interrupt the current subprocess.
        !           841: 
        !           842: 
        !           843: fi:subprocess-kill..................................................[function]
        !           844:    Send a `kill' (SIGKILL) signal to the current subprocess.
        !           845: 
        !           846: 
        !           847: fi:subprocess-send-eof..............................................[function]
        !           848:    Invoke with: C-c C-d in Inferior Common Lisp mode.
        !           849:    Send an end of file to the subprocess.
        !           850: 
        !           851: 
        !           852: 
        !           853:    The following three functions are used in fi:tcp-common-lisp-mode to
        !           854: interrupt, kill and input an end-of-file to the Lisp process at the
        !           855: other end of the TCP/IP socket:
        !           856: 
        !           857: fi:tcp-lisp-interrupt-process.......................................[function]
        !           858:    Invoke with: C-c C-c in TCP Common Lisp mode.
        !           859:    Interrupt the tcp-lisp process via a mp:process-interrupt spoken to the
        !           860: backdoor Common Lisp listener.
        !           861: 
        !           862: 
        !           863: fi:tcp-lisp-kill-process............................................[function]
        !           864:    Invoke with: C-c C-\ in TCP Common Lisp mode.
        !           865:    Kill a tcp-lisp process via a mp:process-kill spoken to the backdoor
        !           866: Common Lisp listener.
        !           867: 
        !           868: 
        !           869: fi:tcp-lisp-send-eof................................................[function]
        !           870:    Invoke with: C-c C-d in TCP Common Lisp mode.
        !           871:    Simulate an EOF on the tcp-lisp process via a db:debug-pop spoken to the
        !           872: backdoor Common Lisp listener.
        !           873: 
        !           874: 
        !           875: 
        !           876:    All input typed to a subprocess buffer is saved in a ring.  The
        !           877: following functions retrieve input and manipulate the ring:
        !           878: 
        !           879: fi:pop-input........................................................[function]
        !           880:    Invoke with: C-c C-p in Inferior Common Lisp mode.
        !           881:    Yank previous text from input ring.  Cycle through input ring with each
        !           882: successive invocation.
        !           883: 
        !           884: 
        !           885: fi:push-input.......................................................[function]
        !           886:    Invoke with: C-c C-n in Inferior Common Lisp mode.
        !           887:    Yank next text from input ring.  Cycle through input ring in reverse
        !           888: order with each successive invocation.
        !           889: 
        !           890: 
        !           891: fi:list-input-ring..................................................[function]
        !           892:    Invoke with: C-c C-l in Inferior Common Lisp mode.
        !           893:    Display contents of input ring, starting at arg.  The list is displayed
        !           894: in reverse order if called from a program and the optional second parameter
        !           895: is non-nil.
        !           896: 
        !           897: 
        !           898: fi:re-search-backward-input.........................................[function]
        !           899:    Invoke with: C-c C-r in Inferior Common Lisp mode.
        !           900:    Search in input ring for text that contains regexp and yank.
        !           901: 
        !           902: 
        !           903: fi:re-search-forward-input..........................................[function]
        !           904:    Invoke with: C-c C-s in Inferior Common Lisp mode.
        !           905:    Search in input ring for text that contains regexp and yank.
        !           906: 
        !           907: 
        !           908: 
        !           909: plus the following miscellaneous function:
        !           910: 
        !           911: fi:eval-in-lisp.....................................................[function]
        !           912:    Apply format (in Emacs) to STRING and ARGS and evaluate the result
        !           913: in the Common Lisp to which we are connected.  If a lisp-eval-server has
        !           914: not been started, then this function starts it.
        !           915: 
        !           916: 
        !           917: 
        !           918: 3.4 Hooks
        !           919: 
        !           920:    The hooks run at the end of Inferior Common Lisp mode
        !           921: initialization are:
        !           922: 
        !           923:        fi:lisp-mode-hook
        !           924:        fi:subprocess-mode-hook
        !           925:        fi:inferior-common-lisp-mode-hook
        !           926: 
        !           927: and for TCP Common Lisp mode are:
        !           928: 
        !           929:        fi:lisp-mode-hook
        !           930:        fi:subprocess-mode-hook
        !           931:        fi:tcp-common-lisp-mode-hook
        !           932: 
        !           933: 4. Starting the Interface
        !           934: 
        !           935:    The two parts of the (full) interface which require user setup are:
        !           936: 
        !           937:        * running Lisp as an inferior of Emacs, with a "Lisp
        !           938:          listener daemon" listening for connections from Emacs
        !           939:        * a set of Emacs bindings that query Lisp for information
        !           940:        
        !           941: In this sections the setup of these features will be discussed.
        !           942: 
        !           943: 4.1 Setup
        !           944: 
        !           945:    (After the installation procedure has been followed (see the file
        !           946: INSTALL in the main distribution directory) the interface will be in a
        !           947: subdirectory of the `lisp' directory.  Typically the location is
        !           948: /usr/local/lib/emacs, which is the pathname used throughout the rest
        !           949: of this document.)
        !           950: 
        !           951:    The Lisp part of the interface consists of a Lisp process called
        !           952: the "Lisp listener daemon" which lies dormant until Emacs tries to
        !           953: communicate with it.  When Emacs "connects" an interactive top level
        !           954: is started (called a "read-eval-print" loop) to which Emacs can send
        !           955: expressions for evaluation and from which Emacs receives the results
        !           956: of evaluation (see fi:eval-in-lisp).  The preferred method to start
        !           957: this daemon is to put the following in your .login file:
        !           958: 
        !           959:        setenv EMACSLIBRARY /usr/local/lib/emacs
        !           960: 
        !           961: and to put the following in your .clinit.cl file in your home directory:
        !           962: 
        !           963:        (defparameter *emacs-library*
        !           964:          (let ((emacs-lib (si:getenv "EMACSLIBRARY")))
        !           965:            (if emacs-lib (format nil "~a/lisp/fi/" emacs-lib))))
        !           966: 
        !           967:        (and *emacs-library*
        !           968:             (find "+ipc" (system:command-line-arguments) :test #'string=)
        !           969:             (load (merge-pathnames "clinit.cl" *emacs-library*))
        !           970:             (load-and-start-ipc-package))
        !           971: 
        !           972: and to put the following in your .emacs file in your home directory:
        !           973: 
        !           974:        (load "fi/site-init.el")
        !           975: 
        !           976:        (setq fi:common-lisp-image-arguments '("+ipc"))
        !           977: 
        !           978:        (setq fi:unix-domain-socket
        !           979:          (format "/tmp/%s_emacs_to_acl" (user-login-name)))
        !           980: 
        !           981: Now consider the following typed to Emacs:
        !           982: 
        !           983:        M-x fi:common-lisp RET
        !           984: 
        !           985: This will cause a Common Lisp (the default image name is `cl') to be
        !           986: started in a buffer called `*common-lisp*', as an inferior process of
        !           987: Emacs.  This Common Lisp will be passed a command line argument of
        !           988: `+ipc', which will cause Common Lisp to load and start the Lisp
        !           989: listener daemon.  Emacs and Common Lisp will communicate through a
        !           990: UNIX domain socket (a file) in /tmp called `USER_emacs_to_acl', where
        !           991: USER is the currently-logged-in-user's name.  All of the bindings and
        !           992: functions described above are now available.
        !           993: 
        !           994: 
        !           995: 4.2 Examples
        !           996: 
        !           997:    After fi:common-lisp has started a Common Lisp and all the above
        !           998: modifications to .emacs and .clinit.cl have been made, the following
        !           999: Emacs command will open a second buffer onto the same Lisp.  This
        !          1000: listener is a separate Common Lisp process (as opposed to a separate
        !          1001: Operating System process) and the entire Common Lisp environment
        !          1002: available in the first listener is available in this one:
        !          1003: 
        !          1004:        M-x fi:tcp-common-lisp RET
        !          1005: 
        !          1006: To run a second Common Lisp and get a completely fresh Common Lisp:
        !          1007: 
        !          1008:        C-u 2 M-x fi:common-lisp RET
        !          1009: 
        !          1010: The former uses one Common Lisp for multiple purposes (compiling a
        !          1011: program in one buffer while typing forms to another), while the latter
        !          1012: starts two separate Common Lisp processes, and thus uses twice the
        !          1013: memory and swap space.
        !          1014: 
        !          1015: 
        !          1016: 4.2.1 Remote Common Lisps using TCP/IP
        !          1017: 
        !          1018:    It is possible, with the functions and bindings in this interface,
        !          1019: to run an Emacs and Common Lisp on two different machines.  For
        !          1020: example, to run Emacs on a machine called `snooze' and Common Lisp on
        !          1021: one called `akbar', where both machines are accessible on the network,
        !          1022: ~/.emacs on `snooze' would contain:
        !          1023: 
        !          1024:        (setq fi:unix-domain nil)
        !          1025:        (setq fi:local-host-name "akbar")       ; the remote host name
        !          1026: 
        !          1027: and ~/.clinit.cl on `akbar' would contain the forms given in section
        !          1028: 4.1 with the call to load-and-start-ipc-package replaced with:
        !          1029: 
        !          1030:        (load-and-start-ipc-package :unix-domain nil)
        !          1031: 
        !          1032: Then, make sure the value of ipc::*inet-port* in ipc.cl and
        !          1033: fi:excl-service-name in tcplisp.el (all in the lisp/fi directory)
        !          1034: match what is in /etc/services.  For the interface as distributed, put
        !          1035: the following line in /etc/services:
        !          1036: 
        !          1037:        excl            6789/tcp
        !          1038: 
        !          1039: on both `akbar' and `snooze'.
        !          1040: 
        !          1041: Then, on `akbar', possibly in a shell buffer remotely logged into
        !          1042: `akbar', startup Common Lisp with the +ipc argument:
        !          1043: 
        !          1044:        akbar% cl +ipc
        !          1045: 
        !          1046: (If you get the error "bind: Address already in use" then the port
        !          1047: number you chose is already being used by another program.  In this
        !          1048: case, use something other than 6789 (in the default case) or the one
        !          1049: currently being used.)  Then, on `snooze' do:
        !          1050: 
        !          1051:        M-x fi:tcp-common-lisp RET
        !          1052: 
        !          1053: which will open a connection to the Lisp on `akbar' from `snooze'.
        !          1054: 
        !          1055: 
        !          1056: 4.2.2 Remote Common Lisps using `rsh'
        !          1057: 
        !          1058:    It is also possible to run Common Lisp on another machine using
        !          1059: `rsh'.  For example, typing the following to Emacs will start a Lisp
        !          1060: process on host `akbar' without using the TCP/IP connection between
        !          1061: Common Lisp and Emacs:
        !          1062: 
        !          1063:        M-x fi:remote-common-lisp RET akbar RET
        !          1064: 
        !          1065: NOTE: fi:remote-common-lisp uses fi:common-lisp-image-name to
        !          1066: determine which image to activate.  If the image name is incorrect for
        !          1067: the remote machine, then use fi:explicit-remote-common-lisp.
        !          1068: 
        !          1069:                              Appendix A
        !          1070:                            Sample .emacs
        !          1071: 
        !          1072: ;;                             -[Fri Nov 18 18:53:13 1988 by layer]-
        !          1073: ;; Sample .emacs file
        !          1074: ;;
        !          1075: ;; $Header: dot.emacs,v 1.1 88/11/18 19:00:50 layer Exp $
        !          1076: 
        !          1077: (load "fi/site-init.el")
        !          1078: 
        !          1079: ;; use a socket file in /tmp since can't communicate via files on NFS
        !          1080: ;; mounted file systems
        !          1081: ;;
        !          1082: (setq fi:unix-domain-socket
        !          1083:   (format "/tmp/%s_emacs_to_acl" (user-login-name)))
        !          1084: 
        !          1085: ;; turn on superkeys in subprocess modes
        !          1086: ;;
        !          1087: (setq-default fi:subprocess-enable-superkeys t)
        !          1088: 
        !          1089: ;; the following causes fi:common-lisp to give the inferior Common
        !          1090: ;; Lisp, by default, a command line argument of `+ipc':
        !          1091: ;;
        !          1092: (setq fi:common-lisp-image-arguments '("+ipc"))
        !          1093: 
        !          1094: ;; the following causes fi:common-lisp to invoke the image `acl', but
        !          1095: ;; to ask for an image name when given a prefix argument:
        !          1096: ;;
        !          1097: (setq fi:common-lisp-image-name
        !          1098:   '(lambda ()
        !          1099:     (let ((image "acl"))
        !          1100:       (if current-prefix-arg
        !          1101:          (setq image
        !          1102:            (read-file-name (format "cl image (default: %s): " image)
        !          1103:                            default-directory image nil)))
        !          1104:       (setq mode-line-buffer-identification
        !          1105:        (format "%s (%s)" (buffer-name) (file-name-nondirectory image)))
        !          1106:       image)))
        !          1107: 
        !          1108: ;; This redefines `kill-emacs' so that transaction files in /tmp are
        !          1109: ;; removed emacs is killed:
        !          1110: ;;
        !          1111: (fset 'old-kill-emacs (symbol-function 'kill-emacs))
        !          1112: (defun kill-emacs (&optional arg)
        !          1113:   (interactive "P")
        !          1114:   (fi:remove-all-temporary-lisp-transaction-files)
        !          1115:   (old-kill-emacs arg))
        !          1116: 
        !          1117:                              Appendix B
        !          1118:                          Sample .clinit.cl
        !          1119: 
        !          1120: ;;                             -[Fri Nov 18 19:00:37 1988 by layer]-
        !          1121: ;; Sample .clinit.cl file
        !          1122: ;;
        !          1123: ;; $Header: dot.clinit.cl,v 1.1 88/11/18 19:00:54 layer Exp $
        !          1124: 
        !          1125: (format t "; Loading home clinit...~%")
        !          1126: 
        !          1127: (defparameter *emacs-library*
        !          1128:   (let ((emacs-lib (si:getenv "EMACSLIBRARY")))
        !          1129:     (if emacs-lib (format nil "~a/lisp/fi/" emacs-lib))))
        !          1130: 
        !          1131: (and *emacs-library*
        !          1132:      (find "+ipc" (system:command-line-arguments) :test #'string=)
        !          1133:      (load (merge-pathnames "clinit.cl" *emacs-library*))
        !          1134:      (load-and-start-ipc-package :unix-domain nil))
        !          1135: 
        !          1136: ;; The following emulates the C shell cd, pushd, popd, pwd, and dirs,
        !          1137: ;; and allows Emacs to track directory changes:
        !          1138: 
        !          1139: (defvar *directory-stack*
        !          1140:   (list (namestring
        !          1141:         (setq *default-pathname-defaults* (current-directory)))))
        !          1142: 
        !          1143: (tpl:alias ("pushd" :string) (&optional dir)
        !          1144:   (if* (string= "" dir)
        !          1145:      then (let ((old-top (pop *directory-stack*))
        !          1146:                (new-top (pop *directory-stack*)))
        !          1147:            (push old-top *directory-stack*)
        !          1148:            (push (chdir new-top) *directory-stack*))
        !          1149:      else (push (chdir dir) *directory-stack*))
        !          1150:   (format t "~a~%" *directory-stack*))
        !          1151: 
        !          1152: (tpl:alias "popd" ()
        !          1153:   (if (> (length *directory-stack*) 1)
        !          1154:       (pop *directory-stack*)
        !          1155:     (format t "nothing to pop into~%"))
        !          1156:   (chdir (car *directory-stack*))
        !          1157:   (format t "~a~%" *directory-stack*))
        !          1158: 
        !          1159: (tpl:alias "dirs" ()
        !          1160:   (format t "~a~%" *directory-stack*))
        !          1161: 
        !          1162: (tpl:alias ("cd" :string) (dir)
        !          1163:   (setf (car *directory-stack*)
        !          1164:     (apply #'chdir
        !          1165:           (if (string= "" dir) nil (list dir))))
        !          1166:   (format t "~a~%" *directory-stack*))
        !          1167: 
        !          1168: (tpl:alias "pwd" ()
        !          1169:   (format t "process cwd = ~a~%*default-pathname-defaults* = ~a~%"
        !          1170:          (namestring (current-directory))
        !          1171:          (namestring (truename *default-pathname-defaults*))))
        !          1172: 
        !          1173:                              Appendix C
        !          1174:                        Sample X11 interaction
        !          1175: 
        !          1176: ;;                             -[Fri Nov 18 20:21:56 1988 by layer]-
        !          1177: ;; Sample X11 bindings for .emacs file
        !          1178: ;;
        !          1179: ;; $Header: dot.emacs_x11,v 1.1 88/11/18 20:22:52 layer Exp $
        !          1180: 
        !          1181: (require 'x-mouse)
        !          1182: 
        !          1183: (defun x-lisp-find-tag (arg)
        !          1184:   (x-mouse-set-point arg)
        !          1185:   (cond ((eq major-mode 'fi:common-lisp-mode) (fi:lisp-find-tag))
        !          1186:        (t (find-tag-other-window (find-tag-default)))))
        !          1187: 
        !          1188: (defun x-lisp-eval-defun (arg)
        !          1189:   (x-mouse-set-point arg)
        !          1190:   (cond ((memq major-mode '(fi:common-lisp-mode fi:franz-lisp-mode
        !          1191:                            fi:lisp-mode))
        !          1192:         (fi:lisp-eval-defun nil))
        !          1193:        ((eq major-mode 'fi:emacs-lisp-mode) (eval-defun))))
        !          1194: 
        !          1195: (defun x-lisp-arglist (arg)
        !          1196:   (x-mouse-set-point arg)
        !          1197:   (cond ((eq major-mode 'fi:common-lisp-mode) (fi:lisp-arglist))
        !          1198:        (t (describe-function (intern (find-tag-default))))))
        !          1199: 
        !          1200: (define-key mouse-map x-button-left-up 'x-lisp-find-tag)
        !          1201: (define-key mouse-map x-button-middle-up 'x-lisp-eval-defun)
        !          1202: (define-key mouse-map x-button-right-up 'x-lisp-arglist)
        !          1203: 
        !          1204: ;; we ignore mouse button-down events, because if we put something
        !          1205: ;; on it the `up' event will cause the minibuffer output to disappear
        !          1206: (define-key mouse-map x-button-left 'x-mouse-ignore)
        !          1207: (define-key mouse-map x-button-middle 'x-mouse-ignore)
        !          1208: (define-key mouse-map x-button-right 'x-mouse-ignore)
        !          1209: (define-key mouse-map x-button-c-left 'x-mouse-ignore)
        !          1210: 
        !          1211:                              Appendix D
        !          1212:                          Franz Lisp Support
        !          1213: 
        !          1214: D.1 Introduction
        !          1215: 
        !          1216:    Franz Lisp is handled very similar to Common Lisp, the only
        !          1217: difference being that Franz Lisp does not support TCP/IP socket
        !          1218: communication.  In all other ways, the features, function and variable
        !          1219: names mirror those of the corresponding Common Lisp functions and
        !          1220: variables.
        !          1221: 
        !          1222: D.2 Editing Franz Lisp
        !          1223: 
        !          1224:    As with Common Lisp, editing a Franz Lisp source file (.l
        !          1225: extension) causes fi:franz-lisp-mode to be invoked.  The order of
        !          1226: setup in the mode follows that of fi:common-lisp-mode.
        !          1227: 
        !          1228:    Package system set-up also occurs in the same way as in
        !          1229: fi:common-lisp-mode.
        !          1230: 
        !          1231:    Franz Lisp does not support the commands depending on TCP/IP.
        !          1232: 
        !          1233: D.2.1 Bindings
        !          1234: 
        !          1235: fi:franz-lisp-mode-map................................................[keymap]
        !          1236:    Major mode map used when editing Franz Lisp source.
        !          1237: 
        !          1238: C-c             Prefix Command
        !          1239: RET             fi:lisp-reindent-newline-indent
        !          1240: DEL             backward-delete-char-untabify
        !          1241: TAB             lisp-indent-line
        !          1242: C-x             Prefix Command
        !          1243: ESC             Prefix Command
        !          1244: 
        !          1245: C-c C-r         fi:lisp-eval-region
        !          1246: C-c C-s         fi:lisp-eval-last-sexp
        !          1247: C-c C-b         fi:lisp-eval-current-buffer
        !          1248: 
        !          1249: ESC C-x         fi:lisp-eval-defun
        !          1250: ESC C-q         indent-sexp
        !          1251: 
        !          1252: 
        !          1253: 
        !          1254: 
        !          1255: D.2.2 Variables
        !          1256: 
        !          1257:    The buffer-local variable fi:package is set up as in
        !          1258: fi:common-lisp-mode.
        !          1259: 
        !          1260: D.2.3 Functions
        !          1261: 
        !          1262:    The functions in the keymaps are a subset of those in Common Lisp
        !          1263: mode--refer to the main document for a description of those commands.
        !          1264: 
        !          1265: D.2.4 Hooks
        !          1266: 
        !          1267:    The hooks run are fi:lisp-mode-hook and fi:franz-lisp-mode-hook,
        !          1268: and are done last in the mode initialization.
        !          1269: 
        !          1270: D.3 Running Franz Lisp
        !          1271: 
        !          1272:    As with Common Lisp, there are two entry points for running an
        !          1273: inferior Franz Lisp. `M-x fi:franz-lisp' and `M-x fi:explicit-franz-lisp'
        !          1274: create Franz Lisp processes.  The default name of the Franz Lisp image
        !          1275: is `lisp'.
        !          1276: 
        !          1277: D.3.1 Bindings
        !          1278: 
        !          1279: fi:inferior-franz-lisp-mode-map.......................................[keymap]
        !          1280:    The inferior-franz-lisp major-mode keymap.
        !          1281: 
        !          1282: DEL             backward-delete-char-untabify
        !          1283: TAB             lisp-indent-line
        !          1284: C-x             Prefix Command
        !          1285: ESC             Prefix Command
        !          1286: C-c             Prefix Command
        !          1287: RET             fi:inferior-lisp-newline
        !          1288: 
        !          1289: C-c C-\         fi:subprocess-quit
        !          1290: C-c C-d         fi:subprocess-send-eof
        !          1291: C-c C-c         fi:subprocess-interrupt
        !          1292: C-c C-w         fi:subprocess-backward-kill-word
        !          1293: C-c C-v         fi:subprocess-show-output
        !          1294: C-c C-u         fi:subprocess-kill-input
        !          1295: C-c C-s         fi:re-search-forward-input
        !          1296: C-c C-r         fi:re-search-backward-input
        !          1297: C-c C-p         fi:pop-input
        !          1298: C-c C-o         fi:subprocess-send-flush
        !          1299: C-c C-n         fi:push-input
        !          1300: C-c RET         fi:subprocess-input-region
        !          1301: C-c C-l         fi:list-input-ring
        !          1302: C-c C-k         fi:subprocess-kill-output
        !          1303: C-c C-a         fi:subprocess-beginning-of-line
        !          1304: 
        !          1305: C-x RET         fi:inferior-lisp-input-list
        !          1306: 
        !          1307: ESC RET         fi:inferior-lisp-input-sexp
        !          1308: ESC C-q         indent-sexp
        !          1309: 
        !          1310: 
        !          1311: 
        !          1312: 
        !          1313: D.3.2 Variables
        !          1314: 
        !          1315: fi:franz-lisp-image-name............................................[variable]
        !          1316:    Value: "lisp"
        !          1317:    *Default Franz Lisp image to invoke from `fi:franz-lisp'.  If the value
        !          1318: is a string then it names the image file or image path that
        !          1319: `fi:common-lisp' invokes.  Otherwise, the value of this variable is given
        !          1320: to funcall, the result of which should yield a string which is the image
        !          1321: name or path.
        !          1322: 
        !          1323: 
        !          1324: fi:franz-lisp-image-arguments.......................................[variable]
        !          1325:    Value: nil
        !          1326:    *Default Franz Lisp image arguments when invoked from `fi:franz-lisp'.
        !          1327: 
        !          1328: 
        !          1329: fi:franz-lisp-prompt-pattern........................................[variable]
        !          1330:    Value: "^[-=]> +\\|^c{[0-9]+} +"
        !          1331:    *The regular expression which matches the Franz Lisp prompt, used in
        !          1332: Inferior Franz Lisp mode.  Anything from beginning of line up to the end
        !          1333: of what this pattern matches is deemed to be a prompt.
        !          1334: 
        !          1335: 
        !          1336: 
        !          1337: D.3.3 Functions
        !          1338: 
        !          1339: fi:franz-lisp.......................................................[function]
        !          1340:    Start a Franz Lisp subprocess in a buffer whose name is determined
        !          1341: from the optional prefix argument BUFFER-NUMBER.  Franz Lisp buffer names
        !          1342: start with `*franz-lisp' and end with `*', with an optional `-N' in
        !          1343: between.  If BUFFER-NUMBER is not given it defaults to 1.  If BUFFER-NUMBER
        !          1344: is >= 0, then the buffer is named `*franz-lisp-<BUFFER-NUMBER>*'.  If
        !          1345: BUFFER-NUMBER is < 0, then the first available buffer name is chosen.
        !          1346: 
        !          1347: The image file and image arguments are taken from the variables
        !          1348: `fi:franz-lisp-image-name' and `fi:franz-lisp-image-arguments'.
        !          1349: 
        !          1350: See fi:explicit-franz-lisp.
        !          1351: 
        !          1352: 
        !          1353: fi:explicit-franz-lisp..............................................[function]
        !          1354:    The same as fi:franz-lisp, except that the image and image arguments
        !          1355: are read from the minibuffer.
        !          1356: 
        !          1357: 
        !          1358: 
        !          1359: D.3.3 Hooks
        !          1360: 
        !          1361:    The following hooks are run when starting up an inferior Franz
        !          1362: Lisp:
        !          1363: 
        !          1364:        fi:lisp-mode-hook
        !          1365:        fi:subprocess-mode-hook
        !          1366:        fi:inferior-franz-lisp-mode-hook

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.