aboutsummaryrefslogtreecommitdiff
path: root/doc/PG-adapting.texi
diff options
context:
space:
mode:
Diffstat (limited to 'doc/PG-adapting.texi')
-rw-r--r--doc/PG-adapting.texi3930
1 files changed, 3930 insertions, 0 deletions
diff --git a/doc/PG-adapting.texi b/doc/PG-adapting.texi
new file mode 100644
index 00000000..a2c3b256
--- /dev/null
+++ b/doc/PG-adapting.texi
@@ -0,0 +1,3930 @@
+
+\def\fontdefs{\psfamily{bsf}{r}{c}{b}{b}{ri}{ri}{ro}{bo}\def\mainmagstep{1200}}
+\input texinfo
+@c TODO: setting for configuring proof hidden regions.
+@c
+@c
+@c $Id$
+@c
+@c NB: the first line of this file uses a non-standard TeXinfo
+@c hack to print in Serifa fonts. It has no effect if you don't have
+@c my hacked version of TeXinfo - da.
+@c
+@c
+@setfilename PG-adapting.info
+@settitle Adapting Proof General
+@setchapternewpage odd
+@paragraphindent 0
+@c A flag for whether to include the front image in the
+@c DVI file. You can download the front image from
+@c http://www.proofgeneral.org/ProofGeneralPortrait.eps.gz
+@c then put it into this directory and 'make dvi' (pdf,ps)
+@c will set the flag below automatically.
+@clear haveeps
+@iftex
+@afourpaper
+@end iftex
+
+@c
+@c Some URLs.
+@c FIXME: unfortunately, broken in buggy pdftexinfo.
+@c so removed for now.
+@set URLxsymbol http://x-symbol.sourceforge.net/
+@set URLisamode http://zermelo.dcs.ed.ac.uk/~isamode
+@set URLpghome http://www.proofgeneral.org
+@set URLpglatestrpm http://www.proofgeneral.org/ProofGeneral-latest.noarch.rpm
+@set URLpglatesttar http://www.proofgeneral.org/ProofGeneral-latest.tar.gz
+@set URLpglatestdev http://www.proofgeneral.org/ProofGeneral-devel-latest.tar.gz
+@c
+@c
+
+@c
+@c IMPORTANT NOTE ABOUT THIS TEXINFO FILE:
+@c I've tried keep full node lines *out* of this file because Emacs makes a
+@c mess of updating them and they are a nuisance to do by hand.
+@c Instead, rely on makeinfo and friends to do the equivalent job.
+@c For this to work, we must follow each node
+@c immediately with a section command, i.e.:
+@c
+@c @node node-name
+@c <section-command>
+@c
+@c And each section with lower levels must have a menu command in
+@c it. Menu updating with Emacs is a bit better than node updating,
+@c but tends to delete the first section of the file in XEmacs!
+@c (it's better in GNU Emacs at the time of writing).
+@c
+@c
+@c reminder about references:
+@c @xref{node} blah start of sentence: See [ref]
+@c blah (@pxref{node}) blah bla (see [ref]), best at end of sentence
+@c @ref{node} without "see". Careful for info.
+
+
+@set version 3.5pre
+@set xemacsversion 21.4
+@set fsfversion 21.2
+@set last-update September 2002
+@set rcsid $Id$
+
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* Adapting Proof General: (PG-adapting). Adapt Proof General to new provers
+END-INFO-DIR-ENTRY
+@end format
+@end ifinfo
+
+@c
+@c MACROS
+@c
+@c define one here for a command with a key-binding?
+@c
+@c I like the idea, but it's maybe against the TeXinfo
+@c style to fix together a command and its key-binding.
+@c
+@c merge functions and variables into concept index.
+@c @syncodeindex fn cp
+@c @syncodeindex vr cp
+
+@c merge functions into variables index
+@c @syncodeindex fn vr
+
+@finalout
+@titlepage
+@title Adapting Proof General
+@subtitle Proof General --- Organize your proofs!
+@sp 1
+@subtitle Adapting Proof General @value{version} to new provers
+@subtitle @value{last-update}
+@subtitle @b{www.proofgeneral.org}
+
+@c nested ifs fail here completely, WHY?
+@iftex
+@ifset haveeps
+@c @vskip 1cm
+@c The .eps file takes 8.4M! A pity texi can't seem
+@c to deal with gzipped files? (goes down to 1.7M).
+@c But this still seems too much to put into the
+@c PG distribution just for an image on the manual page,
+@c so we take it out for now.
+@c Ideally would like some way of generating eps from
+@c the .jpg file.
+@c image{ProofGeneralPortrait}
+@end ifset
+@end iftex
+@author David Aspinall with T. Kleymann
+@page
+@vskip 0pt plus 1filll
+This manual and the program Proof General are
+Copyright @copyright{} 2000-2002 by members
+of the Proof General team, LFCS Edinburgh.
+
+
+@c
+@c COPYING NOTICE
+@c
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+@end ignore
+
+@sp 2
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+@sp 2
+
+This manual documents Proof General, Version @value{version}, for use
+with XEmacs @value{xemacsversion} and GNU Emacs @value{fsfversion} or
+later versions. Proof General is distributed under the terms of the GNU
+General Public License (GPL); please check the accompanying file
+@file{COPYING} for more details.
+
+@sp 1
+
+Visit Proof General on the web at @code{http://www.proofgeneral.org}
+
+Version control: @code{@value{rcsid}}
+@end titlepage
+
+@page
+
+
+@ifinfo
+@node Top
+@top Proof General
+
+This file documents configuration mechanisms for version @value{version}
+of @b{Proof General}, a generic Emacs interface for proof assistants.
+
+Proof General @value{version} has been tested with XEmacs
+@value{xemacsversion} and GNU Emacs @value{fsfversion}. It is
+supplied ready customized for the proof assistants Coq, Lego,
+Isabelle, and HOL.
+
+This manual contains information for customizing to new proof
+assistants; see the user manual for details about how to use
+Proof General.
+
+@menu
+* Introduction::
+* Beginning with a new prover::
+* Menus and toolbar and user-level commands::
+* Proof script settings::
+* Proof shell settings::
+* Goals buffer settings::
+* Splash screen settings::
+* Global constants::
+* Handling multiple files::
+* Configuring Font Lock::
+* Configuring X-Symbol::
+* Writing more lisp code::
+* Internals of Proof General::
+* Plans and ideas::
+* Demonstration Instantiations::
+* Function Index::
+* Variable Index::
+* Concept Index::
+@end menu
+@end ifinfo
+
+@node Introduction
+@unnumbered Introduction
+
+Welcome to Proof General!
+
+Proof General a generic Emacs-based interface for proof assistants.
+
+This manual contains information for adapting Proof General to new proof
+assistants, and some sketches of the internal implementation. It is not
+intended for most ordinary users of the system.
+For full details about how to use Proof General, and information on its
+availability and installation, please see the main Proof General manual
+which should accompany this one.
+
+We positively encourage the support of new systems. Proof General has
+grown more flexible and useful as it has been adapted to more proof
+assistants.
+
+Typically, adding support for a new prover improves support for others,
+both because the code becomes more robust, and because new ideas are
+brought into the generic setting. Notice that the Proof General
+framework has been built as a "product line architecture": generality
+has been introduced step-by-step in a demand-driven way, rather than at
+the outset as a grand design. Despite this strategy, the interface has
+a surprisingly clean structure. The approach means that we fully expect
+hiccups when adding support for new assistants, so the generic core may
+need extension or modification. To support this we have an open
+development method: if you require changes in the generic support,
+please contact us (or make adjustments yourself and send them to us).
+
+Proof General has a home page at
+@uref{http://www.proofgeneral.org}. Visit this page
+for the latest version of the manuals, other documentation, system
+downloads, etc.
+
+
+@menu
+* Future::
+* Credits::
+@end menu
+
+@node Future
+@unnumberedsec Future
+@cindex Proof General Kit
+@cindex Future
+
+The aim of the Proof General project is to provide a powerful and
+configurable interfaces which help user-interaction with interactive
+proof assistants.
+
+The strategy Proof General uses is to targets power users rather than
+novices; other interfaces have often neglected this class of users. But
+we do include general user interface niceties, such as toolbar and
+menus, which make use easier for all.
+
+Proof General has been Emacs based so far, but plans are afoot to
+liberate it from the points and parentheses of Emacs Lisp. The
+successor project Proof General Kit proposes that proof assistants use a
+@i{standard} XML-based protocol for interactive proof, dubbed @b{PGIP}.
+
+PGIP enables middleware for interactive proof tools and interface
+components. Rather than configuring Proof General for your proof
+assistant, you will need to configure your proof assistant to understand
+PGIP. There is a similarity however; the design of PGIP was based
+heavily on the Emacs Proof General framework. This means that effort on
+customizing Emacs Proof General to a new proof assistant is worthwhile
+even in the light of PGIP: it will help you to understand Proof
+General's model of interaction, and moreover, we hope to use the Emacs
+customizations to provide experimental filters which allow supported
+provers to communicate using PGIP.
+
+At the time of writing, these ideas are in early stages. For latest
+details, or to become involved, see
+@uref{http://www.proofgeneral.org/kit, the Proof General Kit
+webpage}.
+
+
+@node Credits
+@unnumberedsec Credits
+
+David Aspinall put together and wrote most of this manual. Thomas
+Kleymann wrote some of the text in Chapter 8. Much of the content is
+generated automatically from Emacs docstrings, some of which have been
+written by other Proof General developers.
+
+
+
+@node Beginning with a new prover
+@chapter Beginning with a new prover
+
+Proof General has about 100 configuration variables which are set on a
+per-prover basis to configure the various features. It may sound like a
+lot but don't worry! Many of the variables occur in pairs (typically
+regular expressions matching the start and end of some text), and you
+can begin by setting just a fraction of the variables to get the basic
+features of script management working. The bare minimum for a working
+prototype is about 25 simple settings.
+
+For more advanced features you may need (or want) to write some Emacs
+Lisp. If you're adding new functionality please consider making it
+generic for different proof assistants, if appropriate. When writing
+your modes, please follow the Emacs Lisp conventions @inforef{Style
+Tips, ,lispref}.
+
+The configuration variables are declared in the file
+@file{generic/proof-config.el}. The details in the central part of this
+manual are based on the contents of that file, beginning in @ref{Menus and toolbar
+and user-level commands}, and continuing until @ref{Global constants}.
+Other chapters cover the details of configuring for multiple files and
+for supporting the other Emacs packages mentioned in the user manual
+(@i{Support for other Packages}). If you write additional Elisp code
+interfacing to Proof General, you can find out about some useful functions
+by reading @ref{Writing more lisp code}. The last chapter of this
+manual describes some of the internals of Proof General, in case you are
+interested, maybe because you need to extend the generic core to do
+something new.
+
+In the rest of this chapter we describe the general mechanisms for
+instantiating Proof General. We assume some knowledge of the content
+of the main Proof General manual.
+
+@menu
+* Overview of adding a new prover::
+* Demonstration instance and easy configuration::
+* Major modes used by Proof General::
+@end menu
+
+
+@node Overview of adding a new prover
+@section Overview of adding a new prover
+
+Each proof assistant supported has its own subdirectory under
+@code{proof-home-directory}, used to store a root elisp file and any
+other files needed to adapt the proof assistant for Proof General.
+
+@c Here we show how a minimal configuration of Proof General works for
+@c Isabelle, without any special changes to Isabelle.
+
+Here is how to go about adding support for a new prover.
+
+@enumerate
+@item Make a directory called @file{myassistant/} under the Proof General home
+directory @code{proof-home-directory}, to put the specific customization
+and associated files in.
+@item Add a file @file{myassistant.el} to the new directory.
+@item Edit @file{proof-site.el} to add a new entry to the
+ @code{proof-assistants-table} variable. The new entry should look
+like this:
+@lisp
+ (myassistant "My Proof Assistant" "\\.myasst$")
+@end lisp
+The first item is used to form the name of the internal variables for
+the new mode as well as the directory and file where it loads from. The
+second is a string, naming the proof assistant. The third item is a
+regular expression to match names of proof script files for this
+assistant. See the documentation of @code{proof-assistant-table} for
+more details.
+@item Define the new Proof General modes in @file{myassistant.el},
+ by setting configuration variables to customize the
+ behaviour of the generic modes.
+@end enumerate
+
+@c You could begin by setting a minimum number of the variables, then
+@c adjust the settings via the customize menus, under Proof-General ->
+@c Internals.
+
+@c TEXI DOCSTRING MAGIC: proof-assistant-table
+@defopt proof-assistant-table
+Proof General's table of supported proof assistants.@*
+Extend this table to add a new proof assistant.
+Each entry is a list of the form
+@lisp
+ (@var{symbol} @var{name} @var{automode-regexp})
+@end lisp
+The @var{name} is a string, naming the proof assistant.
+The @var{symbol} is used to form the name of the mode for the
+assistant, @samp{SYMBOL-mode}, run when files with @var{automode-regexp}
+are visited. @var{symbol} is also used to form the name of the
+directory and elisp file for the mode, which will be
+@lisp
+ @var{proof-home-directory}/@var{symbol}/@var{symbol}.el
+@end lisp
+where @samp{PROOF-HOME-DIRECTORY} is the value of the
+variable @code{proof-home-directory}.
+
+The default value is @code{((demoisa "Isabelle Demo" "\\.ML$") (isa "Isabelle" "\\.ML$\\|\\.thy$") (isar "Isabelle/Isar" "\\.thy$") (lego "LEGO" "\\.l$") (coq "Coq" "\\.v$") (phox "PhoX" "\\.phx$") (hol98 "HOL" "\\.sml$") (acl2 "ACL2" "\\.acl2$") (twelf "Twelf" "\\.elf$") (plastic "Plastic" "\\.lf$") (lclam "Lambda-CLAM" "\\.lcm$"))}.
+@end defopt
+
+
+The final step of the description above is where the work lies. There
+are two basic methods. You can write some Emacs lisp functions and
+define the modes using the macro @code{define-derived-mode}. Or you can
+use the new easy configuration mechanism of Proof General 3.0 described
+in the next section, which calls @code{define-derived-mode} for you.
+You still need to know which configuration variables should be set, and
+how to set them.
+
+The documentation below (and inside Emacs) should help with that, but
+the best way to begin might be to use an existing Proof General instance
+as an example.
+
+
+@node Demonstration instance and easy configuration
+@section Demonstration instance and easy configuration
+
+Proof General is supplied with a demonstration instance for Isabelle
+which configures the basic features. This is a whittled down version of
+Isabelle Proof General, which you can use as a template to get support
+for a new assistant going. Check the directory @file{demoisa} for the
+two files @file{demoisa.el} and @file{demoisa-easy.el}.
+
+The file @file{demoisa.el} follows the scheme described in @ref{Major
+modes used by Proof General}. It uses the Emacs Lisp macro
+@code{define-derived-mode} to define the four modes for a Proof General
+instance, by inheriting from the generic code. Settings which configure
+Proof General are made by functions called from within each mode, as
+appropriate.
+
+The file @file{demoisa-easy.el} uses a new simplified mechanism to
+achieve (virtually) the same result. It uses the macro
+@code{proof-easy-config} defined in @file{proof-easy-configl.el} to make
+all of the settings for the Proof General instance in one go, defining
+the derived modes automatically using a regular naming scheme. No lisp
+code is used in this file except the call to this macro. The minor
+difference in the end result is that all the variables are set at once,
+rather than inside each mode. But since the configuration variables are
+all global variables anyway, this makes no real difference.
+
+The macro @code{proof-easy-config} is called like this:
+@lisp
+ (proof-easy-config @var{myprover} "@var{MyProver}"
+ @var{config_1} @var{val_1}
+ ...
+ @var{config_n} @var{val_n})
+@end lisp
+The main body of the macro call is like the body of a @code{setq}. It
+contains pairs of variables and value settings. The first argument to
+the macro is a symbol defining the mode root, the second argument is a
+string defining the mode name. These should be the same as the first
+part of the entry in @code{proof-assistant-table} for your prover.
+@xref{Overview of adding a new prover}. After the call to
+@code{proof-easy-config}, the new modes @code{@var{myprover}-mode},
+@code{@var{myprover}-shell-mode}, @code{@var{myprover}-response-mode},
+and @code{@var{myprover}-goals-mode} will be defined. The configuration
+variables in the body will be set immediately.
+
+
+This mechanism is in fact recommended for new instantiations of
+Proof General since it follows a regular pattern, and we can more
+easily adapt it in the future to new versions of Proof General.
+
+Even Emacs Lisp experts should prefer the simplified mechanism. If you
+want to set some buffer-local variables in your Proof General modes, or
+invoke supporting lisp code, this can easily be done by adding functions
+to the appropriate mode hooks after the @code{proof-easy-config} call.
+For example, to add extra settings for the shell mode for
+@code{demoisa}, we could do this:
+@lisp
+ (defun demoisa-shell-extra-config ()
+ @var{extra configuration ...}
+ )
+ (add-hook 'demoisa-shell-mode-hook 'demoisa-shell-extra-config)
+@end lisp
+The function to do extra configuration @code{demoisa-shell-extra-config}
+is then called as the final step when @code{demoisa-shell-mode} is
+entered (be wary, this will be after the generic
+@code{proof-shell-config-done} is called, so it will be too late to set
+normal configuration variables which may be examined by
+@code{proof-shell-config-done}).
+
+
+@node Major modes used by Proof General
+@section Major modes used by Proof General
+
+There are four major modes used by Proof General, one for each type of
+buffer it handles. The buffer types are: script, shell, response and
+goals. Each of these has a generic mode, respectively:
+@code{proof-mode}, @code{proof-shell-mode}, @code{proof-response-mode},
+and @code{proof-goals-mode}.
+
+The pattern for defining the major mode for an instance of Proof General
+is to use @code{define-derived-mode} to define a specific mode to inherit from
+each generic one, like this:
+@lisp
+(define-derived-mode myass-shell-mode proof-shell-mode
+ "MyAss shell" nil
+ (myass-shell-config)
+ (proof-shell-config-done))
+@end lisp
+Where @code{myass-shell-config} is a function which sets the
+configuration variables for the shell (@pxref{Proof shell settings}).
+
+It's important that each of your modes invokes one of the functions
+ @code{proof-config-done},
+ @code{proof-shell-config-done},
+ @code{proof-response-config-done}, or
+ @code{proof-goals-config-done}
+once it has set its configuration variables. These functions
+finalize the configuration of the mode.
+
+For each mode, there is a configuration variable which names it so that
+Proof General can set buffers to the proper mode, or find buffers in
+that mode. These are documented below, and set like this:
+@lisp
+ (setq proof-mode-for-script 'myass-mode)
+@end lisp
+where @code{myass-mode} is your major mode for scripts, derived from
+@code{proof-mode}. You must set these variables before the proof shell
+is started; one way to do this is inside a function which is called from
+the hook @code{pre-shell-start-hook}. See the file @file{demoisa.el}
+for details of how to do this.
+
+For future instantiations, it is recommended to follow the standard
+scheme: @code{@var{PA}-mode}, @code{@var{PA}-shell-mode}, etc.
+
+@c TEXI DOCSTRING MAGIC: proof-mode-for-script
+@defvar proof-mode-for-script
+Mode for proof script buffers.@*
+This is used by Proof General to find out which buffers
+contain proof scripts.
+The regular name for this is <PA>-mode. If you use any of the
+convenience macros Proof General provides for defining commands
+etc, then you should stick to this name.
+Suggestion: this can be set in the script mode configuration.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-mode-for-shell
+@defvar proof-mode-for-shell
+Mode for proof shell buffers.@*
+Usually customised for specific prover.
+Suggestion: this can be set a function called by @samp{@code{proof-pre-shell-start-hook}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-mode-for-response
+@defvar proof-mode-for-response
+Mode for proof response buffer (and trace buffer, if used).@*
+Usually customised for specific prover.
+Suggestion: this can be set a function called by @samp{@code{proof-pre-shell-start-hook}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-mode-for-goals
+@defvar proof-mode-for-goals
+Mode for proof state display buffers.@*
+Usually customised for specific prover.
+Suggestion: this can be set a function called by @samp{@code{proof-pre-shell-start-hook}}.
+@end defvar
+
+@node Menus and toolbar and user-level commands
+@chapter Menus, toolbar, and user-level commands
+
+The variables described in this chapter configure the menus, toolbar,
+and user-level commands. They should be set in the script mode
+before @code{proof-config-done} is called. (Toolbar configuration must
+be made before @file{proof-toolbar.el} is loaded, which usually is
+triggered automatically by an attempt to display the toolbar).
+
+@menu
+* Settings for generic user-level commands::
+* Menu configuration::
+* Toolbar configuration::
+@end menu
+
+@node Settings for generic user-level commands
+@section Settings for generic user-level commands
+
+@c TEXI DOCSTRING MAGIC: proof-assistant-home-page
+@defvar proof-assistant-home-page
+Web address for information on proof assistant.@*
+Used for Proof General's help menu.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-context-command
+@defvar proof-context-command
+Command to display the context in proof assistant.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-info-command
+@defvar proof-info-command
+Command to ask for help or information in the proof assistant.@*
+String or fn. If a string, the command to use.
+If a function, it should return the command string to insert.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-showproof-command
+@defvar proof-showproof-command
+Command to display proof state in proof assistant.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-goal-command
+@defvar proof-goal-command
+Command to set a goal in the proof assistant. String or fn.@*
+If a string, the format character @samp{%s} will be replaced by the
+goal string.
+If a function, it should return the command string to insert.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-save-command
+@defvar proof-save-command
+Command to save a proved theorem in the proof assistant. String or fn.@*
+If a string, the format character @samp{%s} will be replaced by the
+theorem name.
+If a function, it should return the command string to insert.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-find-theorems-command
+@defvar proof-find-theorems-command
+Command to search for a theorem containing a given term. String or fn.@*
+If a string, the format character @samp{%s} will be replaced by the term.
+If a function, it should return the command string to insert.
+@end defvar
+
+
+
+@node Menu configuration
+@section Menu configuration
+
+As well as the generic Proof General menu, each proof assistant is
+provided with a specific menu which can have prover-specific commands.
+Proof General puts some default things on this menu, including the
+commands to start/stop the prover, and the user-extensible "Favourites"
+menu.
+
+@c TEXI DOCSTRING MAGIC: PA-menu-entries
+@defvar PA-menu-entries
+Extra entries for proof assistant specific menu. @*
+A list of menu items [@var{name} @var{callback} @var{enabler} ...]. See the documentation
+of @samp{@code{easy-menu-define}} for more details.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: PA-help-menu-entries
+@defvar PA-help-menu-entries
+Extra entries for help submenu for proof assistant specific help menu.@*
+A list of menu items [@var{name} @var{callback} @var{enabler} ...]. See the documentation
+of @samp{@code{easy-menu-define}} for more details.
+@end defvar
+
+
+@node Toolbar configuration
+@section Toolbar configuration
+
+Unlike the menus, Proof General has only one toolbar. For the "generic"
+aspect of Proof General to work well, we shouldn't change (the meaning
+of) the existing toolbar buttons too far. This would discourage people
+from experimenting with different proof assistants when they don't
+really know them, which is one of the advantages that Proof General
+brings.
+
+But in case it is hard to map some of the generic buttons
+onto functions in particular provers, and to allow extra
+buttons, there is a mechanism for adjustment.
+
+I used The Gimp to create the buttons for Proof General. The
+development distribution includes a button blank and some notes in
+@file{etc/notes.txt} about making new buttons.
+
+
+@c TEXI DOCSTRING MAGIC: proof-toolbar-entries-default
+@defvar proof-toolbar-entries-default
+Example value for proof-toolbar-entries. Also used to define scripting menu.@*
+This gives a bare toolbar that works for any prover, providing the
+appropriate configuration variables are set.
+To add/remove prover specific buttons, adjust the @samp{<PA>-toolbar-entries}
+variable, and follow the pattern in @samp{@code{proof-toolbar}.el} for
+defining functions, images.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: PA-toolbar-entries
+@defvar PA-toolbar-entries
+List of entries for Proof General toolbar and Scripting menu.@*
+Format of each entry is (@var{token} @var{menuname} @var{tooltip} @var{dynamic-enabler-p} @var{enable}).
+
+For each @var{token}, we expect an icon with base filename @var{token},
+a function proof-toolbar-<TOKEN>, and (optionally) a dynamic enabler
+proof-toolbar-<TOKEN>-enable-p.
+
+If @var{enablep} is absent, item is enabled; if @var{enablep} is present, item
+is only added to menubar and toolbar if @var{enablep} is non-null.
+
+If @var{menuname} is nil, item will not appear on the scripting menu.
+
+If @var{tooltip} is nil, item will not appear on the toolbar.
+
+The default value is @samp{@code{proof-toolbar-entries-default}} which contains
+the standard Proof General buttons.
+@end defvar
+
+Here's an example of how to remove a button, from @file{af2.el}:
+@lisp
+(setq af2-toolbar-entries
+ (remassoc 'state af2-toolbar-entries))
+@end lisp
+
+
+
+@c defgroup proof-script
+@node Proof script settings
+@chapter Proof script settings
+
+The variables described in this chapter should be set in the script mode
+before @code{proof-config-done} is called. These variables configure
+recognition of commands in the proof script, and also control some of
+the behaviour of script management.
+
+
+@menu
+* Recognizing commands and comments::
+* Recognizing proofs::
+* Recognizing other elements::
+* Configuring undo behaviour::
+* Nested proofs::
+* Safe (state-preserving) commands::
+* Activate scripting hook::
+* Automatic multiple files::
+* Completions::
+@end menu
+
+
+@node Recognizing commands and comments
+@section Recognizing commands and comments
+
+The first four settings configure the generic parsing strategy for
+commands in the proof script. Usually only one of these three needs to
+be set. If the generic parsing functions are not flexible for your
+needs, you can supply a value for @code{proof-script-parse-function}.
+
+Note that for the generic functions to work properly, it is
+@strong{essential} that you set the syntax table for your mode properly,
+so that comments and strings are recognized. See the Emacs
+documentation to discover how to do this (particularly for the function
+@code{modify-syntax-entry}).
+
+@xref{Proof script mode}, for more details of the parsing
+functions.
+
+@c TEXI DOCSTRING MAGIC: proof-terminal-char
+@defvar proof-terminal-char
+Character which terminates every command sent to proof assistant. nil if none.
+
+To configure command recognition properly, you must set at least one
+of these: @samp{@code{proof-script-sexp-commands}}, @samp{@code{proof-script-command-end-regexp}},
+@samp{@code{proof-script-command-start-regexp}}, @samp{@code{proof-terminal-char}},
+or @samp{@code{proof-script-parse-function}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-script-sexp-commands
+@defvar proof-script-sexp-commands
+Non-nil if proof script has a LISP-like syntax, and commands are @code{top-level} sexps.@*
+You should set this variable in script mode configuration.
+
+To configure command recognition properly, you must set at least one
+of these: @samp{@code{proof-script-sexp-commands}}, @samp{@code{proof-script-command-end-regexp}},
+@samp{@code{proof-script-command-start-regexp}}, @samp{@code{proof-terminal-char}},
+or @samp{@code{proof-script-parse-function}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-script-command-start-regexp
+@defvar proof-script-command-start-regexp
+Regular expression which matches start of commands in proof script.@*
+You should set this variable in script mode configuration.
+
+To configure command recognition properly, you must set at least one
+of these: @samp{@code{proof-script-sexp-commands}}, @samp{@code{proof-script-command-end-regexp}},
+@samp{@code{proof-script-command-start-regexp}}, @samp{@code{proof-terminal-char}},
+or @samp{@code{proof-script-parse-function}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-script-command-end-regexp
+@defvar proof-script-command-end-regexp
+Regular expression which matches end of commands in proof script.@*
+You should set this variable in script mode configuration.
+
+To configure command recognition properly, you must set at least one
+of these: @samp{@code{proof-script-sexp-commands}}, @samp{@code{proof-script-command-end-regexp}},
+@samp{@code{proof-script-command-start-regexp}}, @samp{@code{proof-terminal-char}},
+or @samp{@code{proof-script-parse-function}}.
+@end defvar
+
+
+The next four settings configure the comment syntax. Notice that to get
+reliable behaviour of the parsing functions, you may need to modify the
+syntax table for your prover's mode. Read the Elisp manual for details
+about that.
+
+@c TEXI DOCSTRING MAGIC: proof-script-comment-start
+@defvar proof-script-comment-start
+String which starts a comment in the proof assistant command language.@*
+The script buffer's @code{comment-start} is set to this string plus a space.
+Moreover, comments are usually ignored during script management, and not
+sent to the proof process.
+
+You should set this variable for reliable working of Proof General,
+as well as @samp{@code{proof-script-comment-end}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-script-comment-start-regexp
+
+@defvar proof-script-comment-start-regexp
+Regexp which matches a comment start in the proof command language.
+
+The default value for this is set as (@code{regexp-quote} @code{proof-script-comment-start})
+but you can set this variable to something else more precise if necessary.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-script-comment-end
+@defvar proof-script-comment-end
+String which ends a comment in the proof assistant command language.@*
+The script buffer's @code{comment-end} is set to a space plus this string.
+See also @samp{@code{proof-script-comment-start}}.
+
+You should set this variable for reliable working of Proof General,
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-script-comment-end-regexp
+@defvar proof-script-comment-end-regexp
+Regexp which matches a comment end in the proof command language.
+
+The default value for this is set as (@code{regexp-quote} @code{proof-script-comment-end})
+but you can set this variable to something else more precise if necessary.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-case-fold-search
+@defvar proof-case-fold-search
+Value for @code{case-fold-search} when recognizing portions of proof scripts.@*
+Also used for completion, via @samp{@code{proof-script-complete}}.
+The default value is @samp{nil}. If your prover has a case @strong{insensitive}
+input syntax, @code{proof-case-fold-search} should be set to @samp{t} instead.
+NB: This setting is not used for matching output from the prover.
+@end defvar
+
+
+@node Recognizing proofs
+@section Recognizing proofs
+
+Up to three settings each may be supplied for recognizing goal-like and
+save-like commands. The @code{-with-hole-} settings are used to make a
+record of the name of the theorem proved, and also to build a default
+value for the rather complicated setting
+@code{proof-script-next-entity-regexps}, which activates the @i{function
+menu} feature.
+
+The @code{-p} subsidiary predicates were added to allow more
+discriminating behaviour for particular proof assistants. (This is a
+typical example of where the core framework needs some additional
+generalization, to simplify matters, and allow for a smooth handling of
+nested proofs; the present state is only part of the way there).
+
+
+@c TEXI DOCSTRING MAGIC: proof-goal-command-regexp
+@defvar proof-goal-command-regexp
+Matches a goal command in the proof script. @*
+This is used (1) to make the default value for @samp{@code{proof-goal-command-p}},
+used as an important part of script management to find the start
+of an atomic undo block, and (2) to construct the default
+for @samp{@code{proof-script-next-entity-regexps}} used for function menus.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-goal-with-hole-regexp
+@defvar proof-goal-with-hole-regexp
+Regexp which matches a command used to issue and name a goal.@*
+The name of the theorem is build from the variable
+@code{proof-goal-with-hole-result} using the same convention as
+@code{query-replace-regexp}.
+Used for setting names of goal..save regions and for default
+@code{function-menu} configuration in @code{proof-script-find-next-entity}.
+
+It's safe to leave this setting as nil.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-goal-command-p
+@defvar proof-goal-command-p
+A function to test: is this really a goal command?
+
+This is added as a more refined addition to @code{proof-goal-command-regexp},
+to solve the problem that Coq and some other provers can have goals which
+look like definitions, etc. (In the future we may generalize
+@code{proof-goal-command-regexp} instead).
+@end defvar
+
+
+@c TEXI DOCSTRING MAGIC: proof-save-command-regexp
+@defvar proof-save-command-regexp
+Matches a save command.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-save-with-hole-regexp
+@defvar proof-save-with-hole-regexp
+Regexp which matches a command to save a named theorem.@*
+The name of the theorem is build from the variable
+@code{proof-save-with-hole-result} using the same convention as
+@code{query-replace-regexp}.
+Used for setting names of goal..save and proof regions and for
+default @code{function-menu} configuration in @code{proof-script-find-next-entity}.
+
+It's safe to leave this setting as nil.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-completed-proof-behaviour
+@defvar proof-completed-proof-behaviour
+Indicates how Proof General treats commands beyond the end of a proof.@*
+Normally goal...save regions are "closed", i.e. made atomic for undo.
+But once a proof has been completed, there may be a delay before
+the "save" command appears --- or it may not appear at all. Unless
+nested proofs are supported, this can spoil the undo-behaviour in
+script management since once a new goal arrives the old undo history
+may be lost in the prover. So we allow Proof General to close
+off the goal..[save] region in more flexible ways.
+The possibilities are:
+@lisp
+ nil - nothing special; close only when a save arrives
+ @code{'closeany} - close as soon as the next command arrives, save or not
+ @code{'closegoal} - close when the next "goal" command arrives
+ @code{'extend} - keep extending the closed region until a save or goal.
+@end lisp
+If your proof assistant allows nested goals, it will be wrong to close
+off the portion of proof so far, so this variable should be set to nil.
+
+NB: @code{'extend} behaviour is not currently compatible with appearance of
+save commands, so don't use that if your prover has save commands.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-really-save-command-p
+@defvar proof-really-save-command-p
+Is this really a save command?
+
+This is a more refined addition to @code{proof-save-command-regexp}.
+It should be a function taking a span and command as argument,
+and can be used to track nested proofs. (See what is done in
+isar/ for example). In the future, this setting should be
+removed when the generic core is extended to handle nested
+proofs smoothly.
+@end defvar
+
+
+@node Recognizing other elements
+@section Recognizing other elements
+
+To configure the @i{function menu} feature, there are a couple of
+settings. These can be used to recognize named proofs, and other
+elements in the proof script as well.
+
+@c TEXI DOCSTRING MAGIC: proof-script-next-entity-regexps
+@defvar proof-script-next-entity-regexps
+Regular expressions to help find definitions and proofs in a script.@*
+This is the list of the form
+@lisp
+ (@var{anyentity-regexp}
+ @var{discriminator-regexp} ... @var{discriminator-regexp})
+@end lisp
+The idea is that @var{anyentity-regexp} matches any named entity in the
+proof script, on a line where the name appears. This is assumed to be
+the start or the end of the entity. The discriminators then test
+which kind of entity has been found, to get its name. A
+@var{discriminator-regexp} has one of the forms
+@lisp
+ (@var{regexp} @var{matchnos})
+ (@var{regexp} @var{matchnos} @code{'backward} @var{backregexp})
+ (@var{regexp} @var{matchnos} @code{'forward} @var{forwardregexp})
+@end lisp
+If @var{regexp} matches the string captured by @var{anyentity-regexp}, then
+@var{matchnos} are the match numbers for the substrings which name the entity
+(these may be either a single number or a list of numbers).
+
+If @code{'backward} @var{backregexp} is present, then the start of the entity
+is found by searching backwards for @var{backregexp}.
+
+Conversely, if @code{'forward} @var{forwardregexp} is found, then the end of
+the entity is found by searching forwards for @var{forwardregexp}.
+
+Otherwise, the start and end of the entity will be the region matched
+by @var{anyentity-regexp}.
+
+This mechanism allows fairly complex parsing of the buffer, in
+particular, it allows for goal..save regions which are named
+only at the end. However, it does not parse strings,
+comments, or parentheses.
+
+This variable may not need to be set: a default value which should
+work for goal..saves is calculated from @code{proof-goal-with-hole-regexp},
+@code{proof-goal-command-regexp}, and @code{proof-save-with-hole-regexp}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-script-find-next-entity-fn
+@defvar proof-script-find-next-entity-fn
+Name of function to find next interesting entity in a script buffer.@*
+This is used to configure @code{func-menu}. The default value is
+@code{proof-script-find-next-entity}, which searches for the next entity
+based on fume-function-name-regexp which by default is set from
+@code{proof-script-next-entity-regexps}.
+
+The function should move point forward in a buffer, and return a cons
+cell of the name and the beginning of the entity's region.
+
+Note that @code{proof-script-next-entity-regexps} is set to a default value
+from @code{proof-goal-with-hole-regexp} and @code{proof-save-with-hole-regexp} in
+the function @code{proof-config-done}, so you may not need to worry about any
+of this. See whether function menu does something sensible by
+default.
+@end defvar
+
+@node Configuring undo behaviour
+@section Configuring undo behaviour
+
+The settings here are used to configure the way "undo" commands are
+calculated.
+
+@c TEXI DOCSTRING MAGIC: proof-non-undoables-regexp
+@defvar proof-non-undoables-regexp
+Regular expression matching commands which are @strong{not} undoable.@*
+These are commands which should not appear in proof scripts,
+for example, undo commands themselves (if the proof assistant
+cannot "redo" an "undo").
+Used in default functions @samp{@code{proof-generic-state-preserving-p}}
+and @samp{@code{proof-generic-count-undos}}. If you don't use those,
+may be left as nil.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-undo-n-times-cmd
+@defvar proof-undo-n-times-cmd
+Command to undo n steps of the currently open goal.@*
+String or function.
+If this is set to a string, @samp{%s} will be replaced by the number of
+undo steps to issue.
+If this is set to a function, it should return the appropriate
+command when called with an integer (the number of undo steps).
+
+This setting is used for the default @samp{@code{proof-generic-count-undos}}.
+If you set @samp{@code{proof-count-undos-fn}} to some other function, there is no
+need to set this variable.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-ignore-for-undo-count
+@defvar proof-ignore-for-undo-count
+Matcher for script commands to be ignored in undo count.@*
+May be left as nil, in which case it will be set to
+@samp{@code{proof-non-undoables-regexp}}.
+Used in default function @samp{@code{proof-generic-count-undos}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-count-undos-fn
+@defvar proof-count-undos-fn
+Function to calculate a command to issue undos to reach a target span.@*
+The function takes a span as an argument, and should return a string
+which is the command to undo to the target span. The target is
+guaranteed to be within the current (open) proof.
+This is an important function for script management.
+The default setting @samp{@code{proof-generic-count-undos}} is based on the
+settings @samp{@code{proof-non-undoables-regexp}} and
+@samp{@code{proof-non-undoables-regexp}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-generic-count-undos
+@defun proof-generic-count-undos span
+Count number of undos in a span, return command needed to undo that far.@*
+Command is set using @samp{@code{proof-undo-n-times-cmd}}.
+
+A default value for @samp{@code{proof-count-undos-fn}}.
+
+For this function to work properly, you must configure
+@samp{@code{proof-undo-n-times-cmd}} and @samp{@code{proof-ignore-for-undo-count}}.
+@end defun
+
+
+
+
+
+
+@c TEXI DOCSTRING MAGIC: proof-find-and-forget-fn
+@defvar proof-find-and-forget-fn
+Function that returns a command to forget back to before its argument span.@*
+This setting is used to for retraction (undoing) in proof scripts.
+
+It should undo the effect of all settings between its target span
+up to (@code{proof-locked-end}). This may involve forgetting a number
+of definitions, declarations, or whatever.
+
+The special string @code{proof-no-command} means there is nothing to do.
+
+This is an important function for script management.
+Study one of the existing instantiations for examples of how to write it,
+or leave it set to the default function @samp{@code{proof-generic-find-and-forget}}
+(which see).
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-generic-find-and-forget
+@defun proof-generic-find-and-forget span
+Calculate a forget/undo command to forget back to @var{span}.@*
+This is a long-range forget: we know that there is no
+open goal at the moment, so forgetting involves unbinding
+declarations, etc, rather than undoing proof steps.
+
+This generic implementation assumes it is enough to find the
+nearest following span with a @samp{name} property, and retract
+that using @samp{@code{proof-forget-id-command}} with the given name.
+
+If this behaviour is not correct, you must customize the function
+with something different.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-forget-id-command
+
+
+@defvar proof-forget-id-command
+Command to forget back to a given named span.@*
+A string; @samp{%s} will be replaced by the name of the span.
+
+This is only used in the implementation of @samp{@code{proof-generic-find-and-forget}},
+you only need to set if you use that function (by not customizing
+@samp{@code{proof-find-and-forget-fn}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-topterm-goalhyp-fn
+@defvar pg-topterm-goalhyp-fn
+Function which returns cons cell if point is at a goal/hypothesis.@*
+This is used to parse the proofstate output to mark it up for
+proof-by-pointing. It should return a cons or nil. First element of
+the cons is a symbol, @code{'goal'} or @code{'hyp'}. The second element is a
+string: the goal or hypothesis itself.
+
+If you leave this variable unset, no proof-by-pointing markup
+will be attempted.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-kill-goal-command
+@defvar proof-kill-goal-command
+Command to kill the currently open goal.
+
+If this is set to nil, PG will expect @code{proof-find-and-forget-fn}
+to do all the work of retracting to an arbitrary point in a file.
+Otherwise, the generic split-phase mechanism will be used:
+@lisp
+ 1. If inside an unclosed proof, use proof-count-undos.
+ 2. If retracting to before an unclosed proof, use
+ @code{proof-kill-goal-command}, followed by @code{proof-find-and-forget-fn}
+ if necessary.
+@end lisp
+@end defvar
+
+
+
+@node Nested proofs
+@section Nested proofs
+
+Proof General allows configuration for provers which have particular
+notions of nested proofs. The right thing may happen automatically,
+or you may need to adjust some of the following settings.
+
+First, you should alter the next setting if the prover retains history
+for nested proofs.
+
+@c TEXI DOCSTRING MAGIC: proof-nested-goals-history-p
+@defvar proof-nested-goals-history-p
+Whether the prover supports recovery of history for nested proofs.@*
+If it does (non-nil), Proof General will retain history inside
+nested proofs.
+If it does not, Proof General will amalgamate nested proofs into single
+steps within the outer proof.
+@end defvar
+Second, it may happen (i.e. it does for Coq) that the prover has a
+history mechanism which necessitates keeping track of the number of
+nested "undoable" commands, even if the history of the proof itself is
+lost.
+
+@c TEXI DOCSTRING MAGIC: proof-nested-undo-regexp
+@defvar proof-nested-undo-regexp
+Regexp for commands that must be counted in nested goal-save regions.
+
+Used for provers which allow nested atomic goal-saves, but with some
+nested history that must be undone specially.
+
+At the moment, the behaviour is that a goal-save span has a @code{'nestedundos}
+property which is set to the number of commands within it which match
+this regexp. The idea is that the prover-specific code can create a
+customized undo command to retract the goal-save region, based on the
+@code{'nestedundos} setting. Coq uses this to forget declarations, since
+declarations in Coq reside in a separate context with its own (flat)
+history.
+@end defvar
+
+
+@node Safe (state-preserving) commands
+@section Safe (state-preserving) commands
+
+A proof command is "safe" if it can be issued away from the proof
+script. For this to work it should be state-preserving in the proof
+assistant (with respect to an on-going proof).
+
+@c TEXI DOCSTRING MAGIC: proof-state-preserving-p
+@defvar proof-state-preserving-p
+A predicate, non-nil if its argument (a command) preserves the proof state.@*
+This is a safety-test used by @code{proof-minibuffer-cmd} to filter out scripting
+commands which should be entered directly into the script itself.
+
+The default setting for this function, @samp{@code{proof-generic-state-preserving-p}}
+tests by negating the match on @samp{@code{proof-non-undoables-regexp}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-generic-state-preserving-p
+@defun proof-generic-state-preserving-p cmd
+Is @var{cmd} state preserving? Match on @code{proof-non-undoables-regexp}.
+@end defun
+
+
+@node Activate scripting hook
+@section Activate scripting hook
+
+
+@c TEXI DOCSTRING MAGIC: proof-activate-scripting-hook
+@defvar proof-activate-scripting-hook
+Hook run when a buffer is switched into scripting mode.@*
+The current buffer will be the newly active scripting buffer.
+
+This hook may be useful for synchronizing with the proof
+assistant, for example, to switch to a new theory
+(in case that isn't already done by commands in the proof
+script).
+
+When functions in this hook are called, the variable
+@samp{activated-interactively} will be non-nil if
+@code{proof-activate-scripting} was called interactively
+(rather than as a side-effect of some other action).
+If a hook function sends commands to the proof process,
+it should wait for them to complete (so the queue is cleared
+for scripting commands), unless activated-interactively is set.
+@end defvar
+
+
+@node Automatic multiple files
+@section Automatic multiple files
+
+@xref{Handling multiple files}, for more details about this
+setting.
+
+@c TEXI DOCSTRING MAGIC: proof-auto-multiple-files
+@defvar proof-auto-multiple-files
+Whether to use automatic multiple file management.@*
+If non-nil, Proof General will automatically retract a script file
+whenever another one is retracted which it depends on. It assumes
+a simple linear dependency between files in the order which
+they were processed.
+
+If your proof assistant has no management of file dependencies, or one
+which depends on a simple linear context, you may be able to use this
+setting to good effect. If the proof assistant has more complex
+file dependencies then you should configure it to communicate with
+Proof General about the dependencies rather than using this setting.
+@end defvar
+
+
+@node Completions
+@section Completions
+
+Proof General allows provers to create a @i{completion table} to help
+writing keywords and identifiers in proof scripts. This is documented
+in the main @i{Proof General} user manual but summarized here for (a
+different kind of) completion.
+
+Completions are filled in according to what has been recently typed,
+from a database of symbols. The database is automatically saved at the
+end of a session. Completion is usually a hand-wavy thing, so we don't
+make any attempt to maintain a precise completion table or anything.
+
+The completion table maintained by @file{complete.el} is initialized
+from @code{PA-completion-table} when @file{proof-script.el} is loaded.
+This is done with the function @code{proof-add-completions} which
+you may want to call at other times.
+
+
+@c TEXI DOCSTRING MAGIC: PA-completion-table
+@defvar PA-completion-table
+List of identifiers to use for completion for this proof assistant.@*
+Completion is activated with C-return.
+
+If this table is empty or needs adjusting, please make changes using
+@samp{@code{customize-variable}} and send suggestions to support@@proofgeneral.org
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-add-completions
+@deffn Command proof-add-completions
+Add completions from <PA>-completion-table to completion database.@*
+Uses @samp{@code{add-completion}} with a negative number of uses and ancient
+last use time, to discourage saving these into the users database.
+@end deffn
+
+
+
+
+
+
+@node Proof shell settings
+@chapter Proof shell settings
+
+The variables in this chapter concern the proof shell mode, and are the
+largest group. They are split into several subgroups. The first
+subgroup are commands invoked at various points. The second subgroup of
+variables are concerned with matching the output from the proof
+assistant. The final subgroup contains various hooks which you can set
+to add lisp customization to Proof General in various points (some of
+them are also used internally for behaviour you may wish to adjust).
+
+Variables for configuring the proof shell are put into the customize
+group @code{proof-shell}.
+
+These should be set in the shell mode configuration, before
+@code{proof-shell-config-done} is called.
+
+To understand the way the proof assistant runs inside Emacs, you may
+want to refer to the @code{comint.el} (Command interpreter) package
+distributed with Emacs. This package controls several shell-like modes
+available in Emacs, including the @code{proof-shell-mode} and
+all specific shell modes derived from it.
+
+@menu
+* Proof shell commands::
+* Script input to the shell::
+* Settings for matching various output from proof process::
+* Settings for matching urgent messages from proof process::
+* Hooks and other settings::
+@end menu
+
+@node Proof shell commands
+@section Commands
+
+Settings in this section configure Proof General with commands
+to send to the prover to activate certain actions.
+
+@c TEXI DOCSTRING MAGIC: proof-prog-name
+@defvar proof-prog-name
+System command to run the proof assistant in the proof shell.@*
+Suggestion: this can be set in @code{proof-pre-shell-start-hook} from
+a variable which is in the proof assistant's customization
+group. This allows different proof assistants to coexist
+(albeit in separate Emacs sessions).
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-auto-terminate-commands
+
+@defvar proof-shell-auto-terminate-commands
+Non-nil if Proof General should try to add terminator to every command.@*
+If non-nil, whenever a command is sent to the prover using
+@samp{@code{proof-shell-invisible-command}}, Proof General will check to see if it
+ends with @code{proof-terminal-char}, and add it if not.
+If @code{proof-terminal-char} is nil, this has no effect.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-pre-sync-init-cmd
+@defvar proof-shell-pre-sync-init-cmd
+The command for configuring the proof process to gain synchronization.@*
+This command is sent before Proof General's synchronization
+mechanism is engaged, to allow customization inside the process
+to help gain syncrhonization (e.g. engaging special markup).
+
+It is better to configure the proof assistant for this purpose
+via command line options if possible, in which case this variable
+does not need to be set.
+
+See also @samp{@code{proof-shell-init-cmd}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-init-cmd
+@defvar proof-shell-init-cmd
+The command for initially configuring the proof process.@*
+This command is sent to the process as soon as synchronization is gained
+(when an annotated prompt is first recognized). It can be used to configure
+the proof assistant in some way, or print a welcome message
+(since output before the first prompt is discarded).
+
+See also @samp{@code{proof-shell-pre-sync-init-cmd}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-restart-cmd
+@defvar proof-shell-restart-cmd
+A command for re-initialising the proof process.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-quit-cmd
+@defvar proof-shell-quit-cmd
+A command to quit the proof process. If nil, send EOF instead.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-quit-timeout
+@defvar proof-shell-quit-timeout
+The number of seconds to wait after sending @code{proof-shell-quit-cmd}.@*
+After this timeout, the proof shell will be killed off more rudely.
+If your proof assistant takes a long time to clean up (for
+example writing persistent databases out or the like), you may
+need to bump up this value.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-cd-cmd
+@defvar proof-shell-cd-cmd
+Command to the proof assistant to change the working directory.@*
+The format character @samp{%s} is replaced with the directory, and
+the escape sequences in @samp{@code{proof-shell-filename-escapes}} are
+applied to the filename.
+
+This setting is used to define the function @code{proof-cd} which
+changes to the value of (@code{default-directory}) for script buffers.
+For files, the value of (@code{default-directory}) is simply the
+directory the file resides in.
+
+NB: By default, @code{proof-cd} is called from @code{proof-activate-scripting-hook},
+so that the prover switches to the directory of a proof
+script every time scripting begins.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-start-silent-cmd
+@defvar proof-shell-start-silent-cmd
+Command to turn prover goals output off when sending many script commands.@*
+If non-nil, Proof General will automatically issue this command
+to help speed up processing of long proof scripts.
+See also @code{proof-shell-stop-silent-cmd}.
+NB: terminator not added to command.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-stop-silent-cmd
+@defvar proof-shell-stop-silent-cmd
+Command to turn prover output on. @*
+If non-nil, Proof General will automatically issue this command
+to help speed up processing of long proof scripts.
+See also @code{proof-shell-start-silent-cmd}.
+NB: Terminator not added to command.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-silent-threshold
+@defvar proof-shell-silent-threshold
+Number of waiting commands in the proof queue needed to trigger silent mode.@*
+Default is 2, but you can raise this in case switching silent mode
+on or off is particularly expensive (or make it ridiculously large
+to disable silent mode altogether).
+@end defvar
+@xref{Handling multiple files},
+for more details about the final two settings in this group,
+
+
+@c TEXI DOCSTRING MAGIC: proof-shell-inform-file-processed-cmd
+@defvar proof-shell-inform-file-processed-cmd
+Command to the proof assistant to tell it that a file has been processed.@*
+The format character @samp{%s} is replaced by a complete filename for a
+script file which has been fully processed interactively with
+Proof General. See @samp{@code{proof-format-filename}} for other possibilities
+to process the filename.
+
+This setting used to interface with the proof assistant's internal
+management of multiple files, so the proof assistant is kept aware of
+which files have been processed. Specifically, when scripting
+is deactivated in a completed buffer, it is added to Proof General's
+list of processed files, and the prover is told about it by
+issuing this command.
+
+If this is set to nil, no command is issued.
+
+See also: @code{proof-shell-inform-file-retracted-cmd},
+@code{proof-shell-process-file}, @code{proof-shell-compute-new-files-list}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-inform-file-retracted-cmd
+@defvar proof-shell-inform-file-retracted-cmd
+Command to the proof assistant to tell it that a file has been retracted.@*
+The format character @samp{%s} is replaced by a complete filename for a
+script file which Proof General wants the prover to consider as not
+completely processed. See @samp{@code{proof-format-filename}} for other
+possibilities to process the filename.
+
+This is used to interface with the proof assistant's internal
+management of multiple files, so the proof assistant is kept aware of
+which files have been processed. Specifically, when scripting
+is activated, the file is removed from Proof General's list of
+processed files, and the prover is told about it by issuing this
+command. The action may cause the prover in turn to suggest to
+Proof General that files depending on this one are
+also unlocked.
+
+If this is set to nil, no command is issued.
+
+See also: @code{proof-shell-inform-file-processed-cmd},
+@code{proof-shell-process-file}, @code{proof-shell-compute-new-files-list}.
+@end defvar
+
+
+@node Script input to the shell
+@section Script input to the shell
+
+Generally, commands from the proof script are sent verbatim to the proof
+process running in the proof shell. For historical reasons, carriage
+returns are stripped by default. You can set
+@code{proof-shell-strip-crs-from-input} to adjust that. For more
+sophisticated pre-processing of the sent string, you may like to set
+@code{proof-shell-insert-hook}.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-strip-crs-from-input
+@defvar proof-shell-strip-crs-from-input
+If non-nil, replace carriage returns in every input with spaces.@*
+This is enabled by default: it is appropriate for some systems
+because several CR's can result in several prompts, which may mess
+up the display (or even worse, the synchronization).
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-insert-hook
+@defvar proof-shell-insert-hook
+Hooks run by @code{proof-shell-insert} before inserting a command.@*
+Can be used to configure the proof assistant to the interface in
+various ways -- for example, to observe or alter the commands sent to
+the prover, or to sneak in extra commands to configure the prover.
+
+This hook is called inside a @code{save-excursion} with the @code{proof-shell-buffer}
+current, just before inserting and sending the text in the
+variable @samp{string}. The hook can massage @samp{string} or insert additional
+text directly into the @code{proof-shell-buffer}.
+Before sending @samp{string}, it will be stripped of carriage returns.
+
+Additionally, the hook can examine the variable @samp{action}. It will be
+a symbol, set to the callback command which is executed in the proof
+shell filter once @samp{string} has been processed. The @samp{action} variable
+suggests what class of command is about to be inserted:
+@lisp
+ @code{'proof-done-invisible} A non-scripting command
+ @code{'proof-done-advancing} A "forward" scripting command
+ @code{'proof-done-retracting} A "backward" scripting command
+@end lisp
+Caveats: You should be very careful about setting this hook. Proof
+General relies on a careful synchronization with the process between
+inputs and outputs. It expects to see a prompt for each input it
+sends from the queue. If you add extra input here and it causes more
+prompts than expected, things will break! Extending the variable
+@samp{string} may be safer than inserting text directly, since it is
+stripped of carriage returns before being sent.
+
+Example uses:
+@var{lego} uses this hook for setting the pretty printer width if
+the window width has changed;
+Plastic uses it to remove literate-style markup from @samp{string}.
+The x-symbol support uses this hook to convert special characters
+into tokens for the proof assistant.
+@end defvar
+
+
+
+
+
+
+@node Settings for matching various output from proof process
+@section Settings for matching various output from proof process
+
+These settings control the way Proof General reacts to process output.
+The single most important setting is
+@code{proof-shell-annotated-prompt-regexp}, which @b{must} be set as
+part of the prover configuraton. This is used to configure the
+communication with the prover process.
+
+
+@c TEXI DOCSTRING MAGIC: proof-shell-wakeup-char
+@defvar proof-shell-wakeup-char
+A special character which terminates an annotated prompt.@*
+Set to nil if proof assistant does not support annotated prompts.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-subterm-first-special-char
+@defvar pg-subterm-first-special-char
+First special character.@*
+Codes above this character can have special meaning to Proof General,
+and are stripped from the prover's output strings.
+Leave unset if no special characters are being used.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-prompt-pattern
+@defvar proof-shell-prompt-pattern
+Proof shell's value for comint-prompt-pattern, which see.@*
+This pattern is just for interaction in comint (shell buffer).
+You don't really need to set it.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-annotated-prompt-regexp
+@defvar proof-shell-annotated-prompt-regexp
+Regexp matching a (possibly annotated) prompt pattern.
+
+@var{this} IS THE @var{most} @var{important} @var{setting} TO @var{configure}!!
+
+Output is grabbed between pairs of lines matching this regexp,
+and the appearance of this regexp is used by Proof General to
+recognize when the prover has finished processing a command.
+
+To help speed up matching you may be able to annotate the
+proof assistant prompt with a special character not appearing
+in ordinary output. The special character should appear in
+this regexp, and should be the value of @code{proof-shell-wakeup-char}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-abort-goal-regexp
+@defvar proof-shell-abort-goal-regexp
+Regexp matching output from an aborted proof.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-error-regexp
+@defvar proof-shell-error-regexp
+Regexp matching an error report from the proof assistant.
+
+We assume that an error message corresponds to a failure in the last
+proof command executed. So don't match mere warning messages with
+this regexp. Moreover, an error message should not be matched as an
+eager annotation (see @code{proof-shell-eager-annotation-start}) otherwise it
+will be lost.
+
+Error messages are considered to begin from @code{proof-shell-error-regexp}
+and continue until the next prompt. The variable
+@samp{@code{proof-shell-truncate-before-error}} controls whether text before the
+error message is displayed.
+
+The engine matches interrupts before errors, see @code{proof-shell-interrupt-regexp}.
+
+It is safe to leave this variable unset (as nil).
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-interrupt-regexp
+@defvar proof-shell-interrupt-regexp
+Regexp matching output indicating the assistant was interrupted.@*
+We assume that an interrupt message corresponds to a failure in the last
+proof command executed. So don't match mere warning messages with
+this regexp. Moreover, an interrupt message should not be matched as an
+eager annotation (see @code{proof-shell-eager-annotation-start}) otherwise it
+will be lost.
+
+The engine matches interrupts before errors, see @code{proof-shell-error-regexp}.
+
+It is safe to leave this variable unset (as nil).
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-truncate-before-error
+@defvar proof-shell-truncate-before-error
+Non-nil means truncate output that appears before error messages.@*
+If nil, the whole output that the prover generated before the last
+error message will be shown.
+
+NB: the default setting for this is @samp{t} to be compatible with
+behaviour in Proof General before version 3.4. The more obvious
+setting for new instances is probably @samp{nil}.
+
+Interrupt messages are treated in the same way.
+See @samp{@code{proof-shell-error-regexp}} and @samp{@code{proof-shell-interrupt-regexp}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-proof-completed-regexp
+@defvar proof-shell-proof-completed-regexp
+Regexp matching output indicating a finished proof.
+
+When output which matches this regexp is seen, we clear the goals
+buffer in case this is not also marked up as a @samp{goals} type of
+message.
+
+We also enable the QED function (save a proof) and we may automatically
+close off the proof region if another goal appears before a save
+command, depending on whether the prover supports nested proofs or not.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-start-goals-regexp
+@defvar proof-shell-start-goals-regexp
+Regexp matching the start of the proof state output.@*
+This is an important setting. Output between @samp{@code{proof-shell-start-goals-regexp}}
+and @samp{@code{proof-shell-end-goals-regexp}} will be pasted into the goals buffer
+and possibly analysed further for proof-by-pointing markup.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-end-goals-regexp
+@defvar proof-shell-end-goals-regexp
+Regexp matching the end of the proof state output, or nil.@*
+If nil, just use the rest of the output following @code{proof-shell-start-goals-regexp}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-assumption-regexp
+@defvar proof-shell-assumption-regexp
+A regular expression matching the name of assumptions.
+
+At the moment, this setting is not used in the generic Proof General.
+
+In the future it will be used for a generic implementation for @samp{@code{pg-topterm-goalhyp-fn}},
+used to help parse the goals buffer to annotate it for proof by pointing.
+@end defvar
+
+
+
+@node Settings for matching urgent messages from proof process
+@section Settings for matching urgent messages from proof process
+
+Among the various dialogue messages that the proof assistant outputs
+during proof, Proof General can consider certain messages to be
+"urgent". When processing many lines of a proof, Proof General will
+normally supress the output, waiting until the final message appears
+before displaying anything to the user. Urgent messages escape this:
+typically they include messages that the prover wants the user to
+notice, for example, perhaps, file loading messages, or timing
+statistics.
+
+So that Proof General notices, these urgent messages should be marked-up
+with "eager" annotations.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-eager-annotation-start
+@defvar proof-shell-eager-annotation-start
+Eager annotation field start. A regular expression or nil.@*
+An eager annotation indicates to Proof General that some following output
+should be displayed (or processed) immediately and not accumulated for
+parsing later.
+
+It is nice to recognize (starts of) warnings or file-reading messages
+with this regexp. You must also recognize any special messages
+from the prover to PG with this regexp (e.g. @samp{@code{proof-shell-clear-goals-regexp}},
+@samp{@code{proof-shell-retract-files-regexp}}, etc.)
+
+See also @samp{@code{proof-shell-eager-annotation-start-length}},
+@samp{@code{proof-shell-eager-annotation-end}}.
+
+Set to nil to disable this feature.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-eager-annotation-start-length
+
+@defvar proof-shell-eager-annotation-start-length
+Maximum length of an eager annotation start. @*
+Must be set to the maximum length of the text that may match
+@samp{@code{proof-shell-eager-annotation-start}} (at least 1).
+If this value is too low, eager annotations may be lost!
+
+This value is used internally by Proof General to optimize the process
+filter to avoid unnecessary searching.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-eager-annotation-end
+@defvar proof-shell-eager-annotation-end
+Eager annotation field end. A regular expression or nil.@*
+An eager annotation indicates to Emacs that some following output
+should be displayed or processed immediately.
+
+See also @samp{@code{proof-shell-eager-annotation-start}}.
+
+It is nice to recognize (ends of) warnings or file-reading messages
+with this regexp. You must also recognize (ends of) any special messages
+from the prover to PG with this regexp (e.g. @samp{@code{proof-shell-clear-goals-regexp}},
+@samp{@code{proof-shell-retract-files-regexp}}, etc.)
+
+The default value is "\n" to match up to the end of the line.
+@end defvar
+
+
+The default action for urgent messages is to display them in the
+response buffer, highlighted. But we also allow for some control
+messages, issued from the proof assistant to Proof General and not
+intended for the user to see. These are recognized in the same way as
+urgent messages (marked with eager annotations), so they will
+be acted on as soon as they are issued by the prover.
+
+
+@c TEXI DOCSTRING MAGIC: proof-shell-clear-response-regexp
+@defvar proof-shell-clear-response-regexp
+Regexp matching output telling Proof General to clear the response buffer.@*
+This feature is useful to give the prover more control over what output
+is shown to the user. Set to nil to disable.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-clear-goals-regexp
+@defvar proof-shell-clear-goals-regexp
+Regexp matching output telling Proof General to clear the goals buffer.@*
+This feature is useful to give the prover more control over what output
+is shown to the user. Set to nil to disable.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-set-elisp-variable-regexp
+@defvar proof-shell-set-elisp-variable-regexp
+Regexp matching output telling Proof General to set some variable.@*
+This allows the proof assistant to configure Proof General directly
+and dynamically.
+
+If the regexp matches output from the proof assistant, there should be
+two match strings: (@code{match-string} 1) should be the name of the elisp
+variable to be set, and (@code{match-string} 2) should be the value of the
+variable (which will be evaluated as a lisp expression).
+
+A good markup for the second string is to delimit with #'s, since
+these are not valid syntax for elisp evaluation.
+
+Elisp errors will be trapped when evaluating; set
+@code{proof-show-debug-messages} to be informed when this happens.
+
+Example uses are to adjust PG's internal copies of proof assistant's
+settings, or to make automatic dynamic syntax adjustments in Emacs to
+match changes in theory, etc.
+
+If you pick a dummy variable name (e.g. @samp{proof-dummy-setting}) you
+can just evaluation arbitrary elisp expressions for their side
+effects, to adjust menu entries, or even launch auxiliary programs.
+But use with care -- there is no protection against catastrophic elisp!
+
+This setting could also be used to move some configuration settings
+from PG to the prover, but this is not really supported (most settings
+must be made before this mechanism will work). In future, the PG
+standard protocol, @var{pgip}, will use this mechanism for making all
+settings.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-theorem-dependency-list-regexp
+@defvar proof-shell-theorem-dependency-list-regexp
+Regexp matching output telling Proof General about dependencies.@*
+This is to allow navigation and display of dependency information.
+The output from the prover should be a message with the form
+@lisp
+ @var{dependencies} OF X Y Z ARE A B C
+@end lisp
+with X Y Z, A B C separated by whitespace or somehow else (see
+@samp{@code{proof-shell-theorem-dependency-list-split}}. This variable should
+be set to a regexp to match the overall message (which should
+be an urgent message), with two sub-matches for X Y Z and A B C.
+
+This is an experimental feature, currently work-in-progress.
+@end defvar
+
+Two important control messages are recognized by
+@code{proof-shell-process-file} and
+@code{proof-shell-retract-files-regexp}, used for synchronizing Proof
+General with a file loading mechanism built into the proof assistant.
+@xref{Handling multiple files}, for more details about how to use the
+final three settings described here.
+
+@vindex proof-included-files-list
+@c TEXI DOCSTRING MAGIC: proof-shell-process-file
+@defvar proof-shell-process-file
+A pair (@var{regexp} . @var{function}) to match a processed file name.
+
+If @var{regexp} matches output, then the function @var{function} is invoked on the
+output string chunk. It must return the name of a script file (with
+complete path) that the system has successfully processed. In
+practice, @var{function} is likely to inspect the match data. If it returns
+the empty string, the file name of the scripting buffer is used
+instead. If it returns nil, no action is taken.
+
+Care has to be taken in case the prover only reports on compiled
+versions of files it is processing. In this case, @var{function} needs to
+reconstruct the corresponding script file name. The new (true) file
+name is added to the front of @samp{@code{proof-included-files-list}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-retract-files-regexp
+@defvar proof-shell-retract-files-regexp
+Matches a message that the prover has retracted a file.
+
+At this stage, Proof General's view of the processed files is out of
+date and needs to be updated with the help of the function
+@samp{@code{proof-shell-compute-new-files-list}}.
+@end defvar
+@vindex proof-included-files-list
+
+@c TEXI DOCSTRING MAGIC: proof-shell-compute-new-files-list
+@defvar proof-shell-compute-new-files-list
+Function to update @samp{proof-included-files list}.
+
+It needs to return an up to date list of all processed files. Its
+output is stored in @samp{@code{proof-included-files-list}}. Its input is the
+string of which @samp{@code{proof-shell-retract-files-regexp}} matched a
+substring. In practice, this function is likely to inspect the
+previous (global) variable @samp{@code{proof-included-files-list}} and the match
+data triggered by @samp{@code{proof-shell-retract-files-regexp}}.
+@end defvar
+
+
+
+@node Hooks and other settings
+@section Hooks and other settings
+
+@c TEXI DOCSTRING MAGIC: proof-shell-filename-escapes
+@defvar proof-shell-filename-escapes
+A list of escapes that are applied to %s for filenames.@*
+A list of cons cells, car of which is string to be replaced
+by the cdr.
+For example, when directories are sent to Isabelle, HOL, and Coq,
+they appear inside ML strings and the backslash character and
+quote characters must be escaped. The setting
+@lisp
+ '(("@var{\\\\}" . "@var{\\\\}")
+ ("\"" . "\\\""))
+@end lisp
+achieves this. This does not apply to @var{lego}, which does not
+need backslash escapes and does not allow filenames with
+quote characters.
+
+This setting is used inside the function @samp{@code{proof-format-filename}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-process-connection-type
+@defvar proof-shell-process-connection-type
+The value of @code{process-connection-type} for the proof shell.@*
+Set non-nil for ptys, nil for pipes.
+The default (and preferred) option is to use pty communication.
+However there is a long-standing backslash/long line problem with
+Solaris which gives a mess of ^G characters when some input is sent
+which has a in the 256th position.
+So we select pipes by default if it seems like we're on Solaris.
+We do not force pipes everywhere because this risks loss of data.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-pre-shell-start-hook
+@defvar proof-pre-shell-start-hook
+Hooks run before proof shell is started.@*
+Suggestion: set this to a function which configures just these proof
+shell variables:
+@lisp
+ @code{proof-prog-name}
+ @code{proof-mode-for-shell}
+ @code{proof-mode-for-response}
+ @code{proof-mode-for-goals}
+ @code{proof-shell-trace-output-regexp}
+@end lisp
+This is the bare minimum needed to get a shell buffer and
+its friends configured in the function @code{proof-shell-start}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-handle-error-or-interrupt-hook
+@defvar proof-shell-handle-error-or-interrupt-hook
+Run after an error or interrupt has been reported in the response buffer.@*
+Hook functions may inspect @samp{@code{proof-shell-error-or-interrupt-seen}} to
+determine whether the cause was an error or interrupt.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-pre-interrupt-hook
+@defvar proof-shell-pre-interrupt-hook
+Run immediately after @samp{@code{comint-interrupt-subjob}} is called.@*
+This hook is added to allow customization for Poly/ML and other
+systems where the system queries the user before returning to
+the top level. For Poly/ML it can be used to send the string "f",
+for example.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-process-output-system-specific
+@defvar proof-shell-process-output-system-specific
+Set this variable to handle system specific output.@*
+Errors, start of proofs, abortions of proofs and completions of
+proofs are recognised in the function @samp{@code{proof-shell-process-output}}.
+All other output from the proof engine is simply reported to the
+user in the @var{response} buffer.
+
+To catch further special cases, set this variable to a pair of
+functions '(condf . actf). Both are given (cmd string) as arguments.
+@samp{cmd} is a string containing the currently processed command.
+@samp{string} is the response from the proof system. To change the
+behaviour of @samp{@code{proof-shell-process-output}}, (condf cmd string) must
+return a non-nil value. Then (actf cmd string) is invoked.
+
+See the documentation of @samp{@code{proof-shell-process-output}} for the required
+output format.
+@end defvar
+
+
+
+
+
+@node Goals buffer settings
+@chapter Goals buffer settings
+
+The goals buffer settings allow configuration of Proof General for proof
+by pointing or similar features.
+See the Proof General @uref{http://www.proofgeneral.org/doc, documentation web page}
+for a link to the technical report ECS-LFCS-97-368 which hints
+at how to use these settings.
+
+@c At the moment these settings are disabled.
+
+@c TEXI DOCSTRING MAGIC: pg-goals-change-goal
+@defvar pg-goals-change-goal
+Command to change to the goal @samp{%s}
+@end defvar
+@c TEXI DOCSTRING MAGIC: pbp-goal-command
+@defvar pbp-goal-command
+Command sent when @samp{@code{pg-goals-button-action}} is requested on a goal.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pbp-hyp-command
+@defvar pbp-hyp-command
+Command sent when @samp{@code{pg-goals-button-action}} is requested on an assumption.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-goals-error-regexp
+@defvar pg-goals-error-regexp
+Regexp indicating that the proof process has identified an error.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-result-start
+@defvar proof-shell-result-start
+Regexp matching start of an output from the prover after pbp commands.@*
+In particular, after a @samp{@code{pbp-goal-command}} or a @samp{@code{pbp-hyp-command}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-result-end
+@defvar proof-shell-result-end
+Regexp matching end of output from the prover after pbp commands.@*
+In particular, after a @samp{@code{pbp-goal-command}} or a @samp{@code{pbp-hyp-command}}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: pg-subterm-start-char
+@defvar pg-subterm-start-char
+Opening special character for subterm markup.@*
+Subsequent special characters with values @strong{below}
+@code{pg-subterm-first-special-char} are assumed to be subterm position
+indicators. Annotations should be finished with @code{pg-subterm-sep-char};
+the end of the concrete syntax is indicated by @code{pg-subterm-end-char}.
+
+If @samp{@code{pg-subterm-start-char}} is nil, subterm markup is disabled.
+
+See doc of @samp{@code{pg-goals-analyse-structure}} for more details of
+subterm and proof-by-pointing markup mechanisms..
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-subterm-sep-char
+@defvar pg-subterm-sep-char
+Finishing special for a subterm markup.@*
+See doc of @samp{@code{pg-subterm-start-char}}.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-topterm-char
+@defvar pg-topterm-char
+Annotation character that indicates the beginning of a "top" element.@*
+A "top" element may be a sub-goal to be proved or a named hypothesis,
+for example. It is currently assumed (following @var{lego}/Coq conventions)
+to span a whole line.
+
+The function @samp{@code{pg-topterm-goalhyp-fn}} examines text following this
+special character, to determine what kind of top element it is.
+
+This setting is also used to see if proof-by-pointing features
+are configured. If it is unset, some of the code
+for parsing the prover output is disabled.
+@end defvar
+@c TEXI DOCSTRING MAGIC: pg-subterm-end-char
+@defvar pg-subterm-end-char
+Closing special character for subterm markup.@*
+See @samp{@code{pg-subterm-start-char}}.
+@end defvar
+
+
+@node Splash screen settings
+@chapter Splash screen settings
+
+The splash screen can be configured, in a rather limited way.
+
+@c TEXI DOCSTRING MAGIC: proof-splash-time
+@defvar proof-splash-time
+Minimum number of seconds to display splash screen for.@*
+The splash screen may be displayed for a couple of seconds longer than
+this, depending on how long it takes the machine to initialise
+Proof General.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-splash-contents
+@defvar proof-splash-contents
+Evaluated to configure splash screen displayed when entering Proof General.@*
+A list of the screen contents. If an element is a string or an image
+specifier, it is displayed centred on the window on its own line.
+If it is nil, a new line is inserted.
+@end defvar
+
+
+
+
+
+
+@node Global constants
+@chapter Global constants
+
+The settings here are internal constants used by Proof General.
+You don't need to configure these for your proof assistant
+unless you want to modify or extend the defaults.
+
+@c TEXI DOCSTRING MAGIC: proof-general-name
+@defvar proof-general-name
+Proof General name used internally and in menu titles.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-general-home-page
+@defopt proof-general-home-page
+Web address for Proof General
+
+The default value is @code{"http://www.proofgeneral.org"}.
+@end defopt
+@c TEXI DOCSTRING MAGIC: proof-universal-keys
+@defvar proof-universal-keys
+List of key-bindings made for the script, goals and response buffer. @*
+Elements of the list are tuples @samp{(k . f)}
+where @samp{k} is a @code{key-binding} (vector) and @samp{f} the designated function.
+@end defvar
+
+
+
+@node Handling multiple files
+@chapter Handling multiple files
+@cindex Multiple files
+
+Large proof developments are typically spread across multiple files.
+Many provers support such developments by keeping track of dependencies
+and automatically processing scripts. Proof General supports this
+mechanism. The user's point of view is considered in the user manual.
+Here, we describe the more technical nitty gritty. This is what you
+need to know when you customise another proof assistant to work with
+Proof General.
+
+Documentation for the configuration settings mentioned here appears in
+the previous sections, this section is intended to help explain the use
+of those settings.
+
+Proof General maintains a list @code{proof-included-files-list} of files
+which it thinks have been processed by the proof assistant. When a file
+which is on this list is visited in Emacs, it will be coloured entirely
+blue to indicate that it has been processed. No editing of the file
+will be allowed (unless @code{proof-strict-read-only} allows it).
+
+
+@c TEXI DOCSTRING MAGIC: proof-included-files-list
+@defvar proof-included-files-list
+List of files currently included in proof process.@*
+This list contains files in canonical truename format
+(see @samp{@code{file-truename}}).
+
+Whenever a new file is being processed, it gets added to this list
+via the @code{proof-shell-process-file} configuration settings.
+When the prover retracts a file, this list is resynchronised via the
+@code{proof-shell-retract-files-regexp} and @code{proof-shell-compute-new-files-list}
+configuration settings.
+
+Only files which have been @strong{fully} processed should be included here.
+Proof General itself will automatically add the filenames of a script
+buffer which has been completely read when scripting is deactivated.
+It will automatically remove the filename of a script buffer which
+is completely unread when scripting is deactivated.
+
+NB: Currently there is no generic provision for removing files which
+are only partly read-in due to an error, so ideally the proof assistant
+should only output a processed message when a file has been successfully
+read.
+@end defvar
+
+The way that @code{proof-included-files-list} is maintained is the key
+to multiple file management. (But you should not set this variable
+directly, it is managed via the configuration settings).
+
+@vindex proof-shell-process-file
+@vindex proof-shell-retract-files-regexp
+@vindex proof-shell-compute-new-files-list
+
+There is a range of strategies for managing multiple files. Ideally,
+file dependencies should be managed by the proof assistant. Proof
+General will use the prover's low-level commands to process a whole file
+and its requirements non-interactively, without going through script
+management. So that the user knows which files have been processed, the
+proof assistant should issue messages which Proof General can recognize
+(``file @code{foo} has been processed'') --- see
+@code{proof-shell-process-file}. When the user wants to edit a file
+which has been processed, the file must be retracted (unlocked). The
+proof assistant should provide a command corresponding to this action,
+which undoes a given file and all its dependencies. As each file is
+undone, a message should be issued which Proof General can recognize
+(``file @code{foo} has been undone'') -- see
+@code{proof-shell-retract-files-regexp}. (The function
+@code{proof-shell-compute-new-files-list} should be set to calculate the
+new value for @code{proof-included-files-list} after a retract message
+has been seen).
+
+
+@c The key idea is that we leave it to the specific proof assistant to
+@c worry about managing multiple files, as far as possible. Whenever the
+@c proof assistant processes or retracts a file it must clearly say so, so
+@c that Proof General can register this.
+
+As well as this communication from the assistant to Proof General about
+processed or retracted files, Proof General can communicate the other
+way: it will tell the proof assistant when it has processed or retracted
+a file via script management. This is because during script management,
+the proof assistant may not be aware that it is actually dealing with a
+file of proof commands (rather than just terminal input).
+
+Proof General will provide this information in two special instances.
+First, when scripting is turned off in a file that has been completely
+processed, Proof General will tell the proof assistant using
+@code{proof-shell-inform-file-processed-cmd}. Second, when scripting is
+turned on in a file which is completely processed, Proof General will
+tell the proof assistant to reconsider: the file should not be
+considered completely processed yet. This uses the setting
+@code{proof-shell-inform-file-retracted-cmd}. This second case might
+lead to a series of messages from the prover telling Proof General to
+unlock files which depend on the present one, again via
+@code{proof-shell-retract-files-regexp}.
+
+What we have described so far is the ideal case, but it may require some
+support from the proof assistant to set up (for example, if file-level
+undo is not normally supported, or the messages during file processing
+are not suitable). Moreover, some proof assistants may not have file
+handling with dependencies, or may have a particularly simple case of a
+linear context: each file depends on all the ones processed before it.
+Proof General allows you a shortcut to get automatic management of
+multiple files in these cases by setting the flag
+@code{proof-auto-multiple-files}. This setting is probably an
+approximation to the right thing for any proof assistant. More files
+than necessary will be retracted if the prover has a tree-like file
+dependency rather than a linear one.
+
+@vindex proof-shell-eager-annotation-start
+@vindex proof-shell-eager-annotation-end
+Finally, we should mention how Proof General recognizes file processing
+messages from the proof assistant. Proof General considers @var{output}
+delimited by the the two regular expressions
+@code{proof-shell-eager-annotation-start} and
+@code{proof-shell-eager-annotation-end} as being important. It displays
+the @var{output} in the Response buffer and analyses the contents
+further. Among other important messages characterised by these regular
+expressions (warnings, errors, or information), the prover can tell the
+interface whenever it processes or retracts a file.
+
+
+To summarize, the settings for multiple file management that may be
+customized are as follows. To recognize file-processing,
+@code{proof-shell-process-file}. To recognize messages about file
+undoing, @code{proof-shell-retract-files-regexp} and
+@code{proof-shell-compute-new-files-list}. @xref{Settings for matching
+urgent messages from proof process}. To tell the prover about files
+handled with script management, use
+ @code{proof-shell-inform-file-processed-cmd} and
+ @code{proof-shell-inform-file-retracted-cmd}. @xref{Proof shell
+ commands}. Finally, set the flag @code{proof-auto-multiple-files}
+for a automatic approximation to multiple file handling.
+@xref{Proof script settings}.
+
+
+@node Configuring Font Lock
+@chapter Configuring Font Lock
+@cindex font lock
+
+Support for Font Lock in Proof General is described in the user manual
+(see the @i{Syntax highlighting} section). To configure Font Lock for a
+new proof assistant, you need to set the variable
+@code{font-lock-keywords} in each of the mode functions you want
+highlighting for. Proof General will automatically install these
+settings, and use font lock minor mode (for syntax highlighting as you
+type) in script buffers.
+
+@c nope: too big. TEXI DOCSTRING MAGIC: font-lock-keywords
+To understand its format, check the documentation of
+@code{font-lock-keywords} inside Emacs.
+
+Proof General provides a special function, @code{proof-zap-commas}, for
+tweaking the font lock behaviour of provers which have declarations of
+the form @code{x,y,z:Ty}. This function removes highlighting on the
+commas, and can be added as the last element of
+@code{font-lock-keywords}. Further manipulation of font lock behaviour
+can be achieved via two hook functions which are run before and after
+fontifying the output buffers.
+
+@c TEXI DOCSTRING MAGIC: proof-zap-commas
+@defun proof-zap-commas limit
+Remove the face of all @samp{,} from point to @var{limit}.@*
+Meant to be used from @samp{@code{font-lock-keywords}}.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: pg-before-fontify-output-hook
+@defvar pg-before-fontify-output-hook
+This hook is called before fontifying a region in an output buffer.@*
+A function on this hook can alter the region of the buffer within
+the current restriction, and must return the final value of (@code{point-max}).
+[This hook is presently only used by @code{phox-sym-lock}].
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: pg-after-fontify-output-hook
+@defvar pg-after-fontify-output-hook
+This hook is called before fonfitying a region in an output buffer.@*
+[This hook is presently only used by Isabelle].
+@end defvar
+@node Configuring X-Symbol
+@chapter Configuring X-Symbol
+@cindex X-Symbol
+
+The X-Symbol package is described in the Proof General user manual. To
+configure X-Symbol for Proof General, you must understand a little bit
+of how X-Symbol works: read the documentation that is supplied with it.
+
+The basic task is to set up a @i{token language} for your proof
+assistant. If your assistant is stored in the subdirectory
+@var{myprover}, the token language will be called @var{myprover} and be
+defined in a file @file{x-symbol-@var{myprover}.el} which is
+automatically loaded by X-Symbol. The name of the token language mode
+will be @code{@var{myprover}sym}.
+
+Proof General will check that the file @file{x-symbol-@var{myprover}.el}
+exists and set up X-Symbol to load it. The token language file must
+define a number of standard settings, and X-Symbol will give warnings if
+any of them are missing.
+
+Apart from the token language file, there are several settings for
+X-Symbol which you can set in the usual configuration file
+@file{@var{myprover}.el}. These settings are optional.
+
+@c There's also proof-xsym-font-lock-keywords, but I don't
+@c really know what this setting is good for.
+
+@c TEXI DOCSTRING MAGIC: proof-xsym-activate-command
+@defvar proof-xsym-activate-command
+Command to activate token input/output for X-Symbol.@*
+If non-nil, this command is sent to the proof assistant when
+X-Symbol support is activated.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-xsym-deactivate-command
+@defvar proof-xsym-deactivate-command
+Command to deactivate token input/output for X-Symbol.@*
+If non-nil, this command is sent to the proof assistant when
+X-Symbol support is deactivated.
+@end defvar
+
+We expect tokens to be used uniformly, so that along with each script
+mode buffer, the response buffer and goals buffer also invoke X-Symbol
+to display special characters in the same token language. This happens
+automatically. If you want additional modes to use X-Symbol with the
+token language for your proof assistant, you can set
+@code{proof-xsym-extra-modes}.
+
+@c TEXI DOCSTRING MAGIC: proof-xsym-extra-modes
+@defvar proof-xsym-extra-modes
+List of additional mode names to use X-Symbol with Proof General tokens.@*
+These modes will have X-Symbol enabled for the proof assistant token language,
+in addition to the four modes for Proof General (script, shell, response, pbp).
+
+Set this variable if you want additional modes to also display
+tokens (for example, editing documentation or source code files).
+@end defvar
+
+
+
+@node Writing more lisp code
+@chapter Writing more lisp code
+
+You may want to add some extra features to your instance of Proof
+General which are not supported in the generic core. To do this, you
+can use the settings described above, plus a small number of fundamental
+functions in Proof General which you can consider as exported in the
+generic interface. Be careful using more functions than are mentioned
+here because the internals of Proof General may change between versions.
+
+@menu
+* Default values for generic settings::
+* Adding prover-specific configurations::
+* Useful variables::
+* Useful functions and macros::
+@end menu
+
+@node Default values for generic settings
+@section Default values for generic settings
+
+Several generic settings are defined using @code{defpgcustom} in
+@file{proof-config.el}. This introduces settings of the form
+@code{<PA>-name} for each proof assistant @var{PA}.
+
+To set the default value for these settings in prover-specific cases,
+you should use the special @code{defpgdefault} macro:
+
+@c TEXI DOCSTRING MAGIC: defpgdefault
+@deffn Macro defpgdefault
+Set default for the proof assistant specific variable <PA>@var{-sym} to @var{value}.@*
+This should be used in prover-specific code to alter the default values
+for prover specific settings.
+
+Usage: (defpgdefault SYM @var{value})
+@end deffn
+
+In your prover-specific code you can simply use the setting
+@code{<PA>-sym} directly, i.e., write @code{myprover-home-page}.
+
+In the generic code, you can use a macro, writing @code{(proof-ass
+home-page)} to refer to the @code{<PA>-home-page} setting for the
+currently running instance of Proof General.
+
+@xref{Configuration variable mechanisms}, for more details on this
+mechanism.
+
+
+@node Adding prover-specific configurations
+@section Adding prover-specific configurations
+
+Apart from the generic settings, your prover instance will probably need
+some specific customizable settings.
+
+Defining new prover-specific settings using customize is pretty easy.
+You should do it at least for your prover-specific user options.
+
+The code in @file{proof-site.el} provides each prover with two
+customization groups automatically (based on the name of the assistant):
+@code{<PA>} for user options for prover @var{PA}
+and
+@code{<PA>-config} for configuration of prover @var{PA}.
+Typically @code{<PA>-config} holds settings which are
+constants but which may be nice to tweak.
+
+The first group appears in the menu
+@lisp
+ ProofGeneral -> Customize -> <PA>
+@end lisp
+The second group appears in the menu:
+@lisp
+ ProofGeneral -> Internals -> <PA> config
+@end lisp
+
+A typical use of @code{defcustom} looks like this:
+@lisp
+(defcustom myprover-search-page
+ "http://findtheorem.myprover.org"
+ "URL of search web page for myprover."
+ :type 'string
+ :group 'myprover-config)
+@end lisp
+This introduces a new customizable setting, which you might use to make
+a menu entry, for example. The default value is the string
+@code{"http://findtheorem.myprover.org"}.
+
+
+
+
+
+
+@node Useful variables
+@section Useful variables
+
+In @file{proof-compat}, two architecture flags are defined. These can
+be used to write conditional pieces of code for different Emacs and
+operating systems.
+
+
+@c TEXI DOCSTRING MAGIC: proof-running-on-XEmacs
+
+@defvar proof-running-on-XEmacs
+Non-nil if Proof General is running on XEmacs.
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-running-on-win32
+
+
+
+
+@defvar proof-running-on-win32
+Non-nil if Proof General is running on a win32 system.
+@end defvar
+@node Useful functions and macros
+@section Useful functions and macros
+
+The recommended functions you may invoke are these:
+
+@itemize @bullet
+@item Any of the interactive commands (i.e. anything you
+ can invoke with @kbd{M-x}, including all key-bindings)
+@item Any of the internal functions and macros mentioned below
+@end itemize
+
+To insert text into the current (usually script) buffer, the function
+@code{proof-insert} is useful. There's also a handy macro
+@code{proof-defshortcut} for defining shortcut functions using it.
+
+
+@c TEXI DOCSTRING MAGIC: proof-insert
+@defun proof-insert text
+Insert @var{text} into the current buffer.@*
+@var{text} may include these special characters:
+@lisp
+ %p - place the point here after input
+@end lisp
+Any other %-prefixed character inserts itself.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-defshortcut
+@deffn Macro proof-defshortcut
+Define shortcut function FN to insert @var{string}, optional keydef KEY.@*
+This is intended for defining proof assistant specific functions.
+@var{string} is inserted using @samp{@code{proof-insert}}, which see.
+KEY is added onto @code{proof-assistant} map.
+@end deffn
+The function @code{proof-shell-invisible-command} is a useful utility
+for sending a single command to the process. You should use this to
+implement user-level or internal functions rather than attempting to
+directly manipulate the proof action list, or insert into the shell
+buffer.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-invisible-command
+@defun proof-shell-invisible-command cmd &optional wait
+Send @var{cmd} to the proof process. @*
+Automatically add @code{proof-terminal-char} if necessary, examining
+proof-shell-no-auto-terminate-commands.
+By default, let the command be processed asynchronously.
+But if optional @var{wait} command is non-nil, wait for processing to finish
+before and after sending the command.
+If @var{wait} is an integer, wait for that many seconds afterwards.
+@end defun
+
+There are several handy macros to help you define functions
+which invoke @code{proof-shell-invisible-command}.
+
+@c TEXI DOCSTRING MAGIC: proof-definvisible
+@deffn Macro proof-definvisible
+Define function FN to send @var{string} to proof assistant, optional keydef KEY.@*
+This is intended for defining proof assistant specific functions.
+@var{string} is sent using @code{proof-shell-invisible-command}, which see.
+KEY is added onto @code{proof-assistant} map.
+@end deffn
+
+@c TEXI DOCSTRING MAGIC: proof-define-assistant-command
+@deffn Macro proof-define-assistant-command
+Define command FN to send string @var{body} to proof assistant, based on @var{cmdvar}.@*
+@var{body} defaults to @var{cmdvar}, a variable.
+@end deffn
+
+@c TEXI DOCSTRING MAGIC: proof-define-assistant-command-witharg
+@deffn Macro proof-define-assistant-command-witharg
+Define command FN to prompt for string @var{cmdvar} to proof assistant.@*
+@var{cmdvar} is a function or string. Automatically has history.
+@end deffn
+
+@c TEXI DOCSTRING MAGIC: proof-format-filename
+
+
+
+
+
+
+@defun proof-format-filename string filename
+Format @var{string} by replacing quoted chars by escaped version of @var{filename}.
+
+%e uses the canonicalized expanded version of filename (including
+directory, using @code{default-directory} -- see @samp{@code{expand-file-name}}).
+
+%r uses the unadjusted (possibly relative) version of @var{filename}.
+
+%m ('module') uses the basename of the file, without directory
+or extension.
+
+%s means the same as %e.
+
+Using %e can avoid problems with dumb proof assistants who don't
+understand ~, for example.
+
+For all these cases, the escapes in @samp{@code{proof-shell-filename-escapes}}
+are processed.
+
+If @var{string} is in fact a function, instead invoke it on @var{filename} and
+return the resulting (string) value.
+@end defun
+@node Internals of Proof General
+@chapter Internals of Proof General
+
+This chapter sketches some of the internal functions and variables of
+Proof General, to help developers who wish to understand or modify the
+code.
+
+Most of the documentation below is generated automatically from the
+comments in the code. Because Emacs lisp is interpreted and
+self-documenting, the best way to find your way around the source is
+inside Emacs once Proof General is loaded. Read the source files, and
+use functions such as @kbd{C-h v} and @kbd{C-h f}.
+
+The code is split into files. The following sections document the
+important files, kept in the @file{generic/} subdirectory.
+
+@menu
+* Spans::
+* Configuration variable mechanisms::
+* Proof General site configuration::
+* Global variables::
+* Proof script mode::
+* Proof shell mode::
+* Debugging::
+@end menu
+
+
+
+@node Spans
+@section Spans
+@cindex spans
+@cindex extents
+@cindex overlays
+
+@dfn{Spans} are an abstraction of XEmacs @dfn{extents} used to help
+bridge the gulf between GNU Emacs and XEmacs. In GNU Emacs, spans are
+implemented using @dfn{overlays}.
+
+See the files @file{span-extent.el} and @file{span-overlay.el} for the
+implementation of the common interface in each case.
+
+@node Proof General site configuration
+@section Proof General site configuration
+@cindex installation directories
+@cindex site configuration
+
+The file @file{proof-site.el} contains the initial configuration for
+Proof General for the site (or user) and the choice of provers.
+
+The first part of the configuration is to set
+@code{proof-home-directory} to the directory that @file{proof-site.el}
+is located in, or to the variable of the environment variable
+@code{PROOFGENERAL_HOME} if that is set.
+
+@c TEXI DOCSTRING MAGIC: proof-home-directory
+@defvar proof-home-directory
+Directory where Proof General is installed. Ends with slash.@*
+Default value taken from environment variable @samp{PROOFGENERAL_HOME} if set,
+otherwise based on where the file @samp{proof-site.el} was loaded from.
+You can use customize to set this variable.
+@end defvar
+
+@c They're no longer options.
+@c The default value for @code{proof-home-directory} mentioned above is the
+@c one for the author's system, it won't be the same for you!
+
+Further directory variables allow the files of Proof General to be split
+up and installed across a system if need be, rather than under the
+@code{proof-home-directory} root.
+
+@c TEXI DOCSTRING MAGIC: proof-images-directory
+@defvar proof-images-directory
+Where Proof General image files are installed. Ends with slash.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-info-directory
+@defvar proof-info-directory
+Where Proof General Info files are installed. Ends with slash.
+@end defvar
+
+
+
+@cindex mode stub
+After defining these settings, we define a @dfn{mode stub} for each
+proof assistant enabled. The mode stub will autoload Proof General for
+the right proof assistant when a file is visited with the corresponding
+extension. The proof assistants enabled are the ones listed
+in the @code{proof-assistants} setting.
+
+@c TEXI DOCSTRING MAGIC: proof-assistants
+@defopt proof-assistants
+Choice of proof assistants to use with Proof General.@*
+A list of symbols chosen from: @code{'demoisa} @code{'isa} @code{'isar} @code{'lego} @code{'coq} @code{'phox} @code{'hol98} @code{'acl2} @code{'twelf} @code{'plastic} @code{'lclam}.
+If nil, the default will be ALL proof assistants.
+
+Each proof assistant defines its own instance of Proof General,
+providing session control, script management, etc. Proof General
+will be started automatically for the assistants chosen here.
+To avoid accidently invoking a proof assistant you don't have,
+only select the proof assistants you (or your site) may need.
+
+You can select which proof assistants you want by setting this
+variable before @samp{proof-site.el} is loaded, or by setting
+the environment variable @samp{PROOFGENERAL_ASSISTANTS} to the
+symbols you want, for example "lego isa". Or you can
+edit the file @samp{proof-site.el} itself.
+
+Note: to change proof assistant, you must start a new Emacs session.
+
+The default value is @code{nil}.
+@end defopt
+
+The file @file{proof-site.el} also defines a version variable.
+
+@c TEXI DOCSTRING MAGIC: proof-general-version
+@defvar proof-general-version
+Version string identifying Proof General release.
+@end defvar
+
+
+
+@node Configuration variable mechanisms
+@section Configuration variable mechanisms
+@cindex conventions
+@cindex user options
+@cindex configuration
+@cindex settings
+
+The file @file{proof-config.el} defines the configuration variables for
+Proof General, including instantiation parameters and user options. See
+previous chapters for details of its contents. Here we mention some
+conventions for declaring user options.
+
+Global user options and instantiation parameters are declared using
+@code{defcustom} as usual. User options should have `@code{*}' as the
+first character of their docstrings (standard Emacs convention) and live
+in the customize group @code{proof-user-options}. See
+@file{proof-config.el} for the groups for instantiation parameters.
+
+User options which are generic (having separate instances for each
+prover) and instantiation parameters (by definition generic) can be
+declared using the special macro @code{defpgcustom}. It is used in the
+same way as @code{defcustom}, except that the symbol declared will
+automatically be prefixed by the current proof assistant symbol.
+
+@c TEXI DOCSTRING MAGIC: defpgcustom
+@deffn Macro defpgcustom
+Define a new customization variable <PA>@var{-sym} for the current proof assistant.@*
+The function proof-assistant-<SYM> is also defined, which can be used in the
+generic portion of Proof General to set and retrieve the value for the current p.a.
+Arguments as for @samp{defcustom}, which see.
+
+Usage: (defpgcustom SYM &rest @var{args}).
+@end deffn
+
+In specific instances of Proof General, the macro @code{defpgdefault}
+can be used to give a default value for a generic setting.
+
+@c TEXI DOCSTRING MAGIC: defpgdefault
+@deffn Macro defpgdefault
+Set default for the proof assistant specific variable <PA>@var{-sym} to @var{value}.@*
+This should be used in prover-specific code to alter the default values
+for prover specific settings.
+
+Usage: (defpgdefault SYM @var{value})
+@end deffn
+
+All new instantiation variables are best declared using the
+@code{defpgcustom} mechanism (old code may be converted gradually).
+Customizations which are liable to be different for different instances
+of Proof General are also best declared in this way. An example is the
+use of X Symbol, controlled by @code{@emph{PA}-x-symbol-enable}, since
+it works poorly or not at all with some provers.
+
+To access the generic settings, the following four functions and
+macros are useful.
+
+@c TEXI DOCSTRING MAGIC: proof-ass
+@deffn Macro proof-ass
+Return the value for SYM for the current prover.
+@end deffn
+@c TEXI DOCSTRING MAGIC: proof-ass-sym
+@deffn Macro proof-ass-sym
+Return the symbol for SYM for the current prover. SYM not evaluated.
+@end deffn
+@c TEXI DOCSTRING MAGIC: proof-ass-symv
+@defun proof-ass-symv sym
+Return the symbol for @var{sym} for the current prover. @var{sym} is evaluated.
+@end defun
+
+If changing a user option setting amounts to more than just setting a
+variable (it may have some dynamic effect), we can set the
+@code{custom-set} property for the variable to the function
+@code{proof-set-value} which does an ordinary @code{set-default} to set
+the variable, and then calls a function with the same name as the
+variable, to do whatever is necessary according to the new value for the
+variable.
+
+There are several settings which can be switched on or off by the user,
+which use this @code{proof-set-value} mechanism. They are controlled by
+boolean variables with names like @code{proof-@var{foo}-enable}, and
+appear at the start of the customize group @code{proof-user-options}.
+They should be edited by the user through the customization mechanism,
+and set in the code using @code{customize-set-variable}.
+
+In @code{proof-utils.el} there is a handy macro,
+@code{proof-deftoggle}, which constructs an interactive function
+for toggling boolean customize settings. We can use this to make an
+interactive function @code{proof-@var{foo}-toggle} to put on a menu or
+bind to a key, for example.
+
+This general scheme is followed as far as possible, to give uniform
+behaviour and appearance for boolean user options, as well as
+interfacing properly with the @code{customize} mechanism.
+
+@c TEXI DOCSTRING MAGIC: proof-set-value
+@defun proof-set-value sym value
+Set a customize variable using @code{set-default} and a function.@*
+We first call @samp{@code{set-default}} to set @var{sym} to @var{value}.
+Then if there is a function @var{sym} (i.e. with the same name as the
+variable @var{sym}), it is called to take some dynamic action for the new
+setting.
+
+If there is no function @var{sym}, we try stripping
+@code{proof-assistant-symbol} and adding "proof-" instead to get
+a function name. This extends @code{proof-set-value} to work with
+generic individual settings.
+
+The dynamic action call only happens when values @strong{change}: as an
+approximation we test whether proof-config is fully-loaded yet.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-deftoggle
+@deffn Macro proof-deftoggle
+Define a function VAR-toggle for toggling a boolean customize setting VAR.@*
+The toggle function uses @code{customize-set-variable} to change the variable.
+@var{othername} gives an alternative name than the default <VAR>-toggle.
+The name of the defined function is returned.
+@end deffn
+@node Global variables
+@section Global variables
+
+Global variables are defined in @file{proof.el}. The same file defines
+a few utility functions and some triggers to load in the other files.
+
+@c TEXI DOCSTRING MAGIC: proof-script-buffer
+@defvar proof-script-buffer
+The currently active scripting buffer or nil if none.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-buffer
+@defvar proof-shell-buffer
+Process buffer where the proof assistant is run.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-response-buffer
+@defvar proof-response-buffer
+The response buffer.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-goals-buffer
+@defvar proof-goals-buffer
+The goals buffer.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-buffer-type
+@defvar proof-buffer-type
+Symbol for the type of this buffer: @code{'script}, @code{'shell}, @code{'goals}, or @code{'response}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-included-files-list
+@defvar proof-included-files-list
+List of files currently included in proof process.@*
+This list contains files in canonical truename format
+(see @samp{@code{file-truename}}).
+
+Whenever a new file is being processed, it gets added to this list
+via the @code{proof-shell-process-file} configuration settings.
+When the prover retracts a file, this list is resynchronised via the
+@code{proof-shell-retract-files-regexp} and @code{proof-shell-compute-new-files-list}
+configuration settings.
+
+Only files which have been @strong{fully} processed should be included here.
+Proof General itself will automatically add the filenames of a script
+buffer which has been completely read when scripting is deactivated.
+It will automatically remove the filename of a script buffer which
+is completely unread when scripting is deactivated.
+
+NB: Currently there is no generic provision for removing files which
+are only partly read-in due to an error, so ideally the proof assistant
+should only output a processed message when a file has been successfully
+read.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-proof-completed
+@defvar proof-shell-proof-completed
+Flag indicating that a completed proof has just been observed.@*
+If non-nil, the value counts the commands from the last command
+of the proof (starting from 1).
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-error-or-interrupt-seen
+@defvar proof-shell-error-or-interrupt-seen
+Flag indicating that an error or interrupt has just occurred.@*
+Set to @code{'error} or @code{'interrupt} if one was observed from the proof
+assistant during the last group of commands.
+@end defvar
+
+
+@node Proof script mode
+@section Proof script mode
+
+The file @file{proof-script.el} contains the main code for proof script
+mode, as well as definitions of menus, key-bindings, and user-level
+functions.
+
+Proof scripts have two important variables for the locked and queue
+regions. These variables are local to each script buffer (although we
+only really need one queue span in total rather than one per buffer).
+
+@c TEXI DOCSTRING MAGIC: proof-locked-span
+@defvar proof-locked-span
+The locked span of the buffer.@*
+Each script buffer has its own locked span, which may be detached
+from the buffer.
+Proof General allows buffers in other modes also to be locked;
+these also have a non-nil value for this variable.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-queue-span
+@defvar proof-queue-span
+The queue span of the buffer. May be detached if inactive or empty.@*
+Each script buffer has its own queue span, although only the active
+scripting buffer may have an active queue span.
+@end defvar
+
+Various utility functions manipulate and examine the spans. An
+important one is @code{proof-init-segmentation}.
+
+@c TEXI DOCSTRING MAGIC: proof-init-segmentation
+@defun proof-init-segmentation
+Initialise the queue and locked spans in a proof script buffer.@*
+Allocate spans if need be. The spans are detached from the
+buffer, so the regions are made empty by this function.
+Also clear list of script portions.
+@end defun
+
+For locking files loaded by a proof assistant, we use the next function.
+
+@c TEXI DOCSTRING MAGIC: proof-complete-buffer-atomic
+@defun proof-complete-buffer-atomic buffer
+Make sure @var{buffer} is marked as completely processed, completing with a single step.
+
+If buffer already contains a locked region, only the remainder of the
+buffer is closed off atomically.
+
+This works for buffers which are not in proof scripting mode too,
+to allow other files loaded by proof assistants to be marked read-only.
+@end defun
+
+Atomic locking is instigated by the next function, which uses the
+variables @code{proof-included-files-list} documented earlier
+(@pxref{Handling multiple files} and @pxref{Global variables}).
+
+@c TEXI DOCSTRING MAGIC: proof-register-possibly-new-processed-file
+@defun proof-register-possibly-new-processed-file file &optional informprover noquestions
+Register a possibly new @var{file} as having been processed by the prover.
+
+If @var{informprover} is non-nil, the proof assistant will be told about this,
+to co-ordinate with its internal file-management. (Otherwise we assume
+that it is a message from the proof assistant which triggers this call).
+In this case, the user will be queried to save some buffers, unless
+@var{noquestions} is non-nil.
+
+No action is taken if the file is already registered.
+
+A warning message is issued if the register request came from the
+proof assistant and Emacs has a modified buffer visiting the file.
+@end defun
+
+An important pair of functions activate and deactivate scripting for the
+current buffer. A change in the state of active scripting can trigger
+various actions, such as starting up the proof assistant, or altering
+@code{proof-included-files-list}.
+
+@c TEXI DOCSTRING MAGIC: proof-activate-scripting
+@deffn Command proof-activate-scripting &optional nosaves queuemode
+Ready prover and activate scripting for the current script buffer.
+
+The current buffer is prepared for scripting. No changes are
+necessary if it is already in Scripting minor mode. Otherwise, it
+will become the new active scripting buffer, provided scripting
+can be switched off in the previous active scripting buffer
+with @samp{@code{proof-deactivate-scripting}}.
+
+Activating a new script buffer may be a good time to ask if the
+user wants to save some buffers; this is done if the user
+option @samp{@code{proof-query-file-save-when-activating-scripting}} is set
+and provided the optional argument @var{nosaves} is non-nil.
+
+The optional argument @var{queuemode} relaxes the test for a
+busy proof shell to allow one which has mode @var{queuemode}.
+In all other cases, a proof shell busy error is given.
+
+Finally, the hooks @samp{@code{proof-activate-scripting-hook}} are run.
+This can be a useful place to configure the proof assistant for
+scripting in a particular file, for example, loading the
+correct theory, or whatever. If the hooks issue commands
+to the proof assistant (via @samp{@code{proof-shell-invisible-command}})
+which result in an error, the activation is considered to
+have failed and an error is given.
+@end deffn
+
+@c TEXI DOCSTRING MAGIC: proof-deactivate-scripting
+@deffn Command proof-deactivate-scripting &optional forcedaction
+Deactivate scripting for the active scripting buffer.
+
+Set @code{proof-script-buffer} to nil and turn off the modeline indicator.
+No action if there is no active scripting buffer.
+
+We make sure that the active scripting buffer either has no locked
+region or a full locked region (everything in it has been processed).
+If this is not already the case, we question the user whether to
+retract or assert, or automatically take the action indicated in the
+user option @samp{@code{proof-auto-action-when-deactivating-scripting}.}
+
+If the scripting buffer is (or has become) fully processed, and it is
+associated with a file, it is registered on
+@samp{@code{proof-included-files-list}}. Conversely, if it is (or has become)
+empty, we make sure that it is @strong{not} registered. This is to be
+certain that the included files list behaves as we might expect with
+respect to the active scripting buffer, in an attempt to harmonize
+mixed scripting and file reading in the prover.
+
+This function either succeeds, fails because the user refused to
+process or retract a partly finished buffer, or gives an error message
+because retraction or processing failed. If this function succeeds,
+then @code{proof-script-buffer} is nil afterwards.
+
+The optional argument @var{forcedaction} overrides the user option
+@samp{@code{proof-auto-action-when-deactivating-scripting}} and prevents
+questioning the user. It is used to make a value for
+the @code{kill-buffer-hook} for scripting buffers, so that when
+a scripting buffer is killed it is always retracted.
+@end deffn
+
+The function @code{proof-segment-up-to} is the main one used for parsing
+the proof script buffer. There are several variants of this function
+available corresponding to different parsing strategies; the appropriate
+one is aliased to @code{proof-segment-up-to} according to which
+configuration variables have been set. If only
+@code{proof-script-command-end-regexp} or @code{proof-terminal-char} are set,
+then the default is @code{proof-segment-up-to-cmdend}. If
+@code{proof-script-command-start-regexp} is set, the choice is
+@code{proof-segment-up-to-cmdstart}.
+
+@c TEXI DOCSTRING MAGIC: proof-segment-up-to-cmdend
+@defun proof-segment-up-to-cmdend pos &optional next-command-end
+Parse the script buffer from end of locked to @var{pos}.@*
+Return a list of (type, string, int) tuples.
+
+Each tuple denotes the command and the position of its terminator,
+type is one of @code{'comment}, or @code{'cmd}. @code{'unclosed-comment} may be consed onto
+the start if the segment finishes with an unclosed comment.
+
+If optional @var{next-command-end} is non-nil, we include the command
+which continues past @var{pos}, if any.
+
+This version is used when @samp{@code{proof-script-command-end-regexp}} is set.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-segment-up-to-cmdstart
+@defun proof-segment-up-to-cmdstart pos &optional next-command-end
+Parse the script buffer from end of locked to @var{pos}.@*
+Return a list of (type, string, int) tuples.
+
+Each tuple denotes the command and the position of its terminator,
+type is one of @code{'comment}, or @code{'cmd}.
+
+If optional @var{next-command-end} is non-nil, we include the command
+which continues past @var{pos}, if any. (NOT @var{implemented} IN @var{this} @var{version}).
+
+This version is used when @samp{@code{proof-script-command-start-regexp}} is set.
+@end defun
+
+
+The function @code{proof-semis-to-vanillas} is used to convert
+a parsed region of the script into a series of commands to
+be sent to the proof assistant.
+
+@c TEXI DOCSTRING MAGIC: proof-semis-to-vanillas
+@defun proof-semis-to-vanillas semis &optional callback-fn
+Convert a sequence of terminator positions to a set of vanilla extents.@*
+Proof terminator positions @var{semis} has the form returned by
+the function proof-segment-up-to.
+Set the callback to @var{callback-fn} or @code{'proof-done-advancing} by default.
+@end defun
+
+The function @code{proof-assert-until-point} is the main one used to
+process commands in the script buffer. It's actually used to implement
+the assert-until-point, electric terminator keypress, and
+find-next-terminator behaviours. In different cases we want different
+things, but usually the information (i.e. are we inside a comment) isn't
+available until we've actually run @code{proof-segment-up-to (point)},
+hence all the different options when we've done so.
+
+@c TEXI DOCSTRING MAGIC: proof-assert-until-point
+@defun proof-assert-until-point &optional unclosed-comment-fun ignore-proof-process-p
+Process the region from the end of the locked-region until point.@*
+Default action if inside a comment is just process as far as the start of
+the comment.
+
+If you want something different, put it inside
+@var{unclosed-comment-fun}. If @var{ignore-proof-process-p} is set, no commands
+will be added to the queue and the buffer will not be activated for
+scripting.
+@end defun
+
+@code{proof-assert-next-command} is a variant of this function.
+
+@c TEXI DOCSTRING MAGIC: proof-assert-next-command
+@deffn Command proof-assert-next-command &optional unclosed-comment-fun ignore-proof-process-p dont-move-forward for-new-command
+Process until the end of the next unprocessed command after point.@*
+If inside a comment, just process until the start of the comment.
+
+If you want something different, put it inside @var{unclosed-comment-fun}.
+If @var{ignore-proof-process-p} is set, no commands will be added to the queue.
+Afterwards, move forward to near the next command afterwards, unless
+@var{dont-move-forward} is non-nil. If @var{for-new-command} is non-nil,
+a space or newline will be inserted automatically.
+@end deffn
+
+The main command for retracting parts of a script is
+@code{proof-retract-until-point}.
+
+@c TEXI DOCSTRING MAGIC: proof-retract-until-point
+@defun proof-retract-until-point &optional delete-region
+Set up the proof process for retracting until point.@*
+In particular, set a flag for the filter process to call
+@samp{@code{proof-done-retracting}} after the proof process has successfully
+reset its state.
+If @var{delete-region} is non-nil, delete the region in the proof script
+corresponding to the proof command sequence.
+If invoked outside a locked region, undo the last successfully processed
+command.
+@end defun
+
+To clean up when scripting is stopped, a script buffer is killed, or the
+proof assistant exits, we use the functions
+@code{proof-restart-buffers} and
+@code{proof-script-remove-all-spans-and-deactivate}.
+
+@c TEXI DOCSTRING MAGIC: proof-restart-buffers
+@defun proof-restart-buffers buffers
+Remove all extents in @var{buffers} and maybe reset @samp{@code{proof-script-buffer}}.@*
+No effect on a buffer which is nil or killed. If one of the buffers
+is the current scripting buffer, then @code{proof-script-buffer}
+will deactivated.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-script-remove-all-spans-and-deactivate
+@defun proof-script-remove-all-spans-and-deactivate
+Remove all spans from scripting buffers via @code{proof-restart-buffers}.
+@end defun
+
+
+@c
+@c SECTION: Proof Shell Mode
+@c
+@node Proof shell mode
+@section Proof shell mode
+@cindex proof shell mode
+@cindex comint-mode
+
+The proof shell mode code is in the file @file{proof-shell.el}. Proof
+shell mode is defined to inherit from @code{comint-mode} using
+@code{define-derived-mode} near the end of the file. The bulk of the
+code in the file is concerned with sending code to and from the shell,
+and processing output for the associated buffers (goals and response).
+
+Good process handling is a tricky issue. Proof General attempts to
+manage the process strictly, by maintaining a queue of commands to send
+to the process. Once a command has been processed, another one is
+popped off the queue and sent.
+
+There are several important internal variables which control
+interaction with the process.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-busy
+@defvar proof-shell-busy
+A lock indicating that the proof shell is processing.@*
+When this is non-nil, @code{proof-shell-ready-prover} will give
+an error.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-marker
+@defvar proof-marker
+Marker in proof shell buffer pointing to previous command input.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-action-list
+@defvar proof-action-list
+A list of@*
+@lisp
+ (@var{span} @var{command} @var{action})
+@end lisp
+triples, which is a queue of things to do.
+See the functions @samp{@code{proof-start-queue}} and @samp{proof-exec-loop}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: pg-subterm-anns-use-stack
+@defvar pg-subterm-anns-use-stack
+Choice of syntax tree encoding for terms.
+
+If nil, prover is expected to make no optimisations.
+If non-nil, the pretty printer of the prover only reports local changes.
+For @var{lego} 1.3.1 use @samp{nil}, for Coq 6.2, use @samp{t}.
+@end defvar
+
+
+The function @code{proof-shell-start} is used to initialise a shell
+buffer and the associated buffers.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-start
+@deffn Command proof-shell-start
+Initialise a shell-like buffer for a proof assistant.
+
+Also generates goal and response buffers.
+Does nothing if proof assistant is already running.
+@end deffn
+
+The function @code{proof-shell-kill-function} performs the converse
+function of shutting things down; it is used as a hook function for
+@code{kill-buffer-hook}. Then no harm occurs if the user kills the
+shell directly, or if it is done more cautiously via
+@code{proof-shell-exit}. The function @code{proof-shell-restart} allows
+a less drastic way of restarting scripting, other than killing and
+restarting the process.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-kill-function
+@defun proof-shell-kill-function
+Function run when a proof-shell buffer is killed.@*
+Attempt to shut down the proof process nicely and
+clear up all the locked regions and state variables.
+Value for @code{kill-buffer-hook} in shell buffer.
+Also called by @code{proof-shell-bail-out} if the process is
+exited by hand (or exits by itself).
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-shell-exit
+@deffn Command proof-shell-exit
+Query the user and exit the proof process.
+
+This simply kills the @code{proof-shell-buffer} relying on the hook function
+@code{proof-shell-kill-function} to do the hard work.
+@end deffn
+
+@c TEXI DOCSTRING MAGIC: proof-shell-bail-out
+@defun proof-shell-bail-out process event
+Value for the process sentinel for the proof assistant process.@*
+If the proof assistant dies, run @code{proof-shell-kill-function} to
+cleanup and remove the associated buffers. The shell buffer is
+left around so the user may discover what killed the process.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-shell-restart
+@deffn Command proof-shell-restart
+Clear script buffers and send @code{proof-shell-restart-cmd}.@*
+All locked regions are cleared and the active scripting buffer
+deactivated.
+
+If the proof shell is busy, an interrupt is sent with
+@code{proof-interrupt-process} and we wait until the process is ready.
+
+The restart command should re-synchronize Proof General with the proof
+assistant, without actually exiting and restarting the proof assistant
+process.
+
+It is up to the proof assistant how much context is cleared: for
+example, theories already loaded may be "cached" in some way,
+so that loading them the next time round only performs a re-linking
+operation, not full re-processing. (One way of caching is via
+object files, used by Lego and Coq).
+@end deffn
+
+@c
+@c INPUT
+@c
+@subsection Input to the shell
+
+Input to the proof shell via the queue region is managed by the
+functions @code{proof-start-queue} and @code{proof-shell-exec-loop}.
+
+@c TEXI DOCSTRING MAGIC: proof-start-queue
+@defun proof-start-queue start end alist
+Begin processing a queue of commands in @var{alist}.@*
+If @var{start} is non-nil, @var{start} and @var{end} are buffer positions in the
+active scripting buffer for the queue region.
+
+This function calls @samp{@code{proof-append-alist}}.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-append-alist
+
+@defun proof-append-alist alist &optional queuemode
+Chop off the vacuous prefix of the command queue @var{alist} and queue it.@*
+For each @samp{@code{proof-no-command}} item at the head of the list, invoke its
+callback and remove it from the list.
+
+Append the result onto @samp{@code{proof-action-list}}, and if the proof
+shell isn't already busy, grab the lock with @var{queuemode} and
+start processing the queue.
+
+If the proof shell is busy when this function is called,
+then @var{queuemode} must match the mode of the queue currently
+being processed.
+@end defun
+@vindex proof-action-list
+@c TEXI DOCSTRING MAGIC: proof-shell-exec-loop
+@defun proof-shell-exec-loop
+Process the @code{proof-action-list}.
+
+@samp{@code{proof-action-list}} contains a list of (@var{span} @var{command} @var{action}) triples.
+
+If this function is called with a non-empty @code{proof-action-list}, the
+head of the list is the previously executed command which succeeded.
+We execute (@var{action} @var{span}) on the first item, then (@var{action} @var{span}) on any
+following items which have @code{proof-no-command} as their cmd components.
+If a there is a next command after that, send it to the process. If
+the action list becomes empty, unlock the process and remove the queue
+region.
+
+The return value is non-nil if the action list is now empty.
+@end defun
+
+Input is actually inserted into the shell buffer and sent to the process
+by the low-level function @code{proof-shell-insert}.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-insert
+@defun proof-shell-insert string action
+Insert @var{string} at the end of the proof shell, call @code{comint-send-input}.
+
+First call @code{proof-shell-insert-hook}. The argument @var{action} may be
+examined by the hook to determine how to process the @var{string} variable.
+
+Then strip @var{string} of carriage returns before inserting it and updating
+@code{proof-marker} to point to the end of the newly inserted text.
+
+Do not use this function directly, or output will be lost. It is only
+used in @code{proof-append-alist} when we start processing a queue, and in
+@code{proof-shell-exec-loop}, to process the next item.
+@end defun
+
+
+When Proof General is processing a queue of commands, the lock
+is managed using a couple of utility functions. You should
+not need to use these directly.
+
+
+@c TEXI DOCSTRING MAGIC: proof-grab-lock
+
+@defun proof-grab-lock &optional queuemode
+Grab the proof shell lock, starting the proof assistant if need be.@*
+Runs @code{proof-state-change-hook} to notify state change.
+Clears the @code{proof-shell-error-or-interrupt-seen} flag.
+If @var{queuemode} is supplied, set the lock to that value.
+@end defun
+@c TEXI DOCSTRING MAGIC: proof-release-lock
+
+
+
+
+
+
+
+@defun proof-release-lock &optional err-or-int
+Release the proof shell lock, with error or interrupt flag @var{err-or-int}.@*
+Clear @code{proof-shell-busy}, and set @code{proof-shell-error-or-interrupt-seen}
+to err-or-int.
+@end defun
+
+
+@c
+@c OUTPUT
+@c
+@subsection Output from the shell
+
+Two main functions deal with output, @code{proof-shell-process-output}
+and @code{proof-shell-process-urgent-message}. In effect we consider
+the output to be two streams intermingled: the "urgent" messages which
+have "eager" annotations, as well as the ordinary ruminations from the
+prover.
+
+The idea is to conceal as much irrelevant information from the user as
+possible; only the remaining output between prompts and after the last
+urgent message will be a candidate for the goal or response buffer. The
+internal variable @code{proof-shell-urgent-message-marker} tracks the
+last urgent message seen.
+
+When output is grabbed from the prover process, the first action
+is to strip spurious carriage return characters from the end of
+lines, if @code{proof-shell-strip-crs-from-output} requires it.
+Then the output is stored into
+@code{proof-shell-last-output}, and its type is stored in
+@code{proof-shell-last-output-kind}. Output which is deferred or
+possibly discarded until the queue is empty is copied into
+@code{proof-shell-delayed-output}, with type
+@code{proof-shell-delayed-output-kind}. A record of the last prompt
+seen from the prover process is also kept, in
+@code{proof-shell-last-prompt}.
+
+
+@c TEXI DOCSTRING MAGIC: proof-shell-strip-crs-from-output
+
+
+@defvar proof-shell-strip-crs-from-output
+If non-nil, remove carriage returns (^M) at the end of lines from output.@*
+This is enabled for cygwin32 systems by default. You should turn it off
+if you don't need it (slight speed penalty).
+@end defvar
+@c TEXI DOCSTRING MAGIC: proof-shell-last-prompt
+@defvar proof-shell-last-prompt
+A record of the last prompt seen from the proof system.@*
+This is the string matched by @code{proof-shell-annotated-prompt-regexp}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-last-output
+@defvar proof-shell-last-output
+A record of the last string seen from the proof system.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-last-output-kind
+@defvar proof-shell-last-output-kind
+A symbol denoting the type of the last output string from the proof system.@*
+Specifically:
+@lisp
+ @code{'interrupt} An interrupt message
+ @code{'error} An error message
+ @code{'abort} A proof abort message
+ @code{'loopback} A command sent from the PA to be inserted into the script
+ @code{'response} A response message
+ @code{'goals} A goals (proof state) display
+ @code{'systemspecific} Something specific to a particular system,
+ -- see @samp{@code{proof-shell-process-output-system-specific}}
+@end lisp
+The output corresponding to this will be in @code{proof-shell-last-output}.
+
+See also @samp{@code{proof-shell-proof-completed}} for further information about
+the proof process output, when ends of proofs are spotted.
+
+This variable can be used for instance specific functions which want
+to examine @code{proof-shell-last-output}.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-delayed-output
+@defvar proof-shell-delayed-output
+A copy of @code{proof-shell-last-output} held back for processing at end of queue.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-delayed-output-kind
+@defvar proof-shell-delayed-output-kind
+A copy of proof-shell-last-output-lind held back for processing at end of queue.
+@end defvar
+@vindex proof-action-list
+
+@c TEXI DOCSTRING MAGIC: proof-shell-process-output
+@defun proof-shell-process-output cmd string
+Process shell output (resulting from @var{cmd}) by matching on @var{string}.@*
+@var{cmd} is the first part of the @code{proof-action-list} that lead to this
+output. The result of this function is a pair (@var{symbol} @var{newstring}).
+
+Here is where we recognizes interrupts, abortions of proofs, errors,
+completions of proofs, and proof step hints (proof by pointing results).
+They are checked for in this order, using
+@lisp
+ @code{proof-shell-interrupt-regexp}
+ @code{proof-shell-error-regexp}
+ @code{proof-shell-abort-goal-regexp}
+ @code{proof-shell-proof-completed-regexp}
+ @code{proof-shell-result-start}
+@end lisp
+All other output from the proof engine will be reported to the user in
+the response buffer by setting @code{proof-shell-delayed-output} to a cons
+cell of ('insert . @var{text}) where @var{text} is the text string to be inserted.
+
+Order of testing is: interrupt, abort, error, completion.
+
+To extend this function, set @code{proof-shell-process-output-system-specific}.
+
+The "aborted" case is intended for killing off an open proof during
+retraction. Typically it matches the message caused by a
+@code{proof-kill-goal-command}. It simply inserts the word "Aborted" into
+the response buffer. So it is expected to be the result of a
+retraction, rather than the indication that one should be made.
+
+This function sets @samp{@code{proof-shell-last-output}} and @samp{@code{proof-shell-last-output-kind}},
+which see.
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-shell-urgent-message-marker
+@defvar proof-shell-urgent-message-marker
+Marker in proof shell buffer pointing to end of last urgent message.
+@end defvar
+
+@c TEXI DOCSTRING MAGIC: proof-shell-process-urgent-message
+@defun proof-shell-process-urgent-message message
+Analyse urgent @var{message} for various cases.@*
+Cases are: included file, retracted file, cleared response buffer,
+variable setting or dependency list.
+If none of these apply, display @var{message}.
+
+@var{message} should be a string annotated with
+@code{proof-shell-eager-annotation-start}, @code{proof-shell-eager-annotation-end}.
+@end defun
+
+The main processing point which triggers other actions is
+@code{proof-shell-filter}.
+
+@c TEXI DOCSTRING MAGIC: proof-shell-filter
+@defun proof-shell-filter str
+Filter for the proof assistant shell-process.@*
+A function for @code{comint-output-filter-functions}.
+
+Deal with output and issue new input from the queue.
+
+Handle urgent messages first. As many as possible are processed,
+using the function @samp{@code{proof-shell-process-urgent-messages}}.
+
+Otherwise wait until an annotated prompt appears in the input.
+If @code{proof-shell-wakeup-char} is set, wait until we see that in the
+output chunk @var{str}. This optimizes the filter a little bit.
+
+If a prompt is seen, run @code{proof-shell-process-output} on the output
+between the new prompt and the last input (position of @code{proof-marker})
+or the last urgent message (position of
+@code{proof-shell-urgent-message-marker}), whichever is later.
+For example, in this case:
+@lisp
+ PROMPT> @var{input}
+ @var{output-1}
+ @var{urgent-message}
+ @var{output-2}
+ PROMPT>
+@end lisp
+@code{proof-marker} is set after @var{input} by @code{proof-shell-insert} and
+@code{proof-shell-urgent-message-marker} is set after @var{urgent-message}.
+Only @var{output-2} will be processed. For this reason, error
+messages and interrupt messages should @strong{not} be considered
+urgent messages.
+
+Output is processed using the function
+@samp{@code{proof-shell-filter-process-output}}.
+
+The first time that a prompt is seen, @code{proof-marker} is
+initialised to the end of the prompt. This should
+correspond with initializing the process. The
+ordinary output before the first prompt is ignored (urgent messages,
+however, are always processed; hence their name).
+@end defun
+
+@c TEXI DOCSTRING MAGIC: proof-shell-filter-process-output
+@defun proof-shell-filter-process-output string
+Subroutine of @code{proof-shell-filter} to process output @var{string}.
+
+Appropriate action is taken depending on the what
+@code{proof-shell-process-output} returns: maybe handle an interrupt, an
+error, or deal with ordinary output which is a candidate for the goal
+or response buffer. Ordinary output is only displayed when the proof
+action list becomes empty, to avoid a confusing rapidly changing
+output.
+
+After processing the current output, the last step undertaken
+by the filter is to send the next command from the queue.
+@end defun
+
+
+
+
+
+
+@c
+@c SECTION: Debugging
+@c
+@node Debugging
+@section Debugging
+@cindex debugging
+
+@c FIXME: better to have general hints on Elisp earlier, plus some
+@c links to helpful docs.
+
+To debug Proof General, it may be helpful to set the
+configuration variable @code{proof-show-debug-messages}.
+
+@c TEXI DOCSTRING MAGIC: proof-show-debug-messages
+@defopt proof-show-debug-messages
+Whether to display debugging messages in the response buffer.@*
+If non-nil, debugging messages are displayed in the response giving
+information about what Proof General is doing.
+To avoid erasing the messages shortly after they're printed,
+you should set @samp{@code{proof-tidy-response}} to nil.
+
+The default value is @code{nil}.
+@end defopt
+
+For more information about debugging Emacs lisp, consult the Emacs Lisp
+Reference Manual. I recommend using the source-level debugger
+@code{edebug}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@c
+@c
+@c APPENDIX: Plans and ideas
+@c
+@c
+@node Plans and ideas
+@appendix Plans and ideas
+
+This appendix contains some tentative plans and ideas for improving
+Proof General.
+
+This appendix is no longer extended: instead we keep a list of Proof
+General projects on the web, and forthcoming plans and ideas in the
+@file{TODO} and @file{todo} files included in the ordinary and
+developers PG distributions, respectively. Once the items mentioned
+below are implemented, they will be removed from here.
+
+Please send us contributions to our wish lists, or better still, an
+offer to implement something from them!
+
+@menu
+* Proof by pointing and similar features::
+* Granularity of atomic command sequences::
+* Browser mode for script files and theories::
+@end menu
+
+@node Proof by pointing and similar features
+@section Proof by pointing and similar features
+@cindex proof by pointing
+
+This is a note by David Aspinall about proof by pointing and similar
+features.
+
+Proof General already supports proof by pointing, and experimental
+support is provided in LEGO. We would like to extend this support to
+other proof assistants. Unfortunately, proof by pointing requires
+rather heavy support from the proof assistant. There are two aspects to
+the support:
+@itemize @bullet
+@item term structure mark-up
+@item proof by pointing command generation
+@end itemize
+Term structure mark-up is useful in itself: it allows the user to
+explore the structure of a term using the mouse (the smallest
+subexpression that the mouse is over is highlighted), and easily copy
+subterms from the output to a proof script.
+
+Command generation for proof by pointing is usually specific to a
+particular logic in use, if we hope to generate a good proof command
+unambiguously for any particular click. However, Proof General could
+easily be generalised to offer the user a context-sensitive choice of
+next commands to apply, which may be more useful in practice, and a
+worthy addition to Proof General.
+
+Implementors of new proof assistants should be encouraged to consider
+supporting term-structure mark up from the start. Command generation
+should be something that the logic-implementor can specify in some way.
+
+Of the supported provers, we can certainly hope for proof-by-pointing
+support from Coq, since the CtCoq proof-by-pointing code has been moved
+into the Coq kernel lately. I hope the Coq community can encourage
+somebody to do this.
+
+
+@node Granularity of atomic command sequences
+@section Granularity of atomic command sequences
+@c @cindex Granularity of Atomic Sequences
+@c @cindex Retraction
+@c @cindex Goal
+@cindex ACS (Atomic Command Sequence)
+
+This is a proposal by Thomas Kleymann for generalising the way Proof
+General handles sequences of proof commands (see @i{Goal-save
+sequences} in the user manual), particularly to make retraction more flexible.
+
+The blue region of a script buffer contains the initial segment of
+the proof script which has been processed successfully. It consists of
+atomic sequences of commands (ACS). Retraction is supported to the
+beginning of every ACS. By default, every command is an ACS. But the
+granularity of atomicity should be able to be adjusted.
+
+This is essential when arbitrary retraction is not supported. Usually,
+after a theorem has been proved, one may only retract to the start of
+the goal. One needs to mark the proof of the theorem as an ACS. At
+present, support for goal-save sequences (see @i{Goal-save sequences} in
+the user manual), has been hard wired. No other ACS are currently
+supported. We propose the following to overcome this deficiency:
+
+@vtable @code
+@item proof-atomic-sequents-list
+is a list of instructions for setting up ACSs. Each instruction is a
+list of the form @code{(@var{end} @var{start} &optional
+@var{forget-command})}. @var{end} is a regular expression to recognise
+the last command in an ACS. @var{start} is a function. Its input is the
+last command of an ACS. Its output is a regular expression to recognise
+the first command of the ACS. It is evaluated once and, starting with the
+command matched by @var{end}, the output is
+successively matched against previously processed commands until a match
+occurs (or the beginning of the current buffer is reached). The region
+determined by (@var{start},@var{end}) is locked as an ACS. Optionally,
+the ACS is annotated with the actual command to retract the ACS. This is
+computed by applying @var{forget-command} to the first and last command
+of the ACS.
+
+For convenience one might also want to allow @var{start} to be the
+symbol @samp{t} as a convenient short-hand for @code{'(lambda (str)
+".")} which always matches.
+@end vtable
+
+@node Browser mode for script files and theories
+@section Browser mode for script files and theories
+
+This is a proposal by David Aspinall for a browser window.
+
+A browser window should provide support for browsing script files and
+theories. We should be able to inspect data in varying levels of
+detail, perhaps using outlining mechanisms. For theories, it would be
+nice to query the running proof assistant. This may require support
+from the assistant in the form of output which has been specially
+marked-up with an SGML like syntax, for example.
+
+A browser would be useful to:
+@itemize @bullet
+@item Provide impoverished proof assistants with a browser
+@item Extend the uniform interface of Proof General to theory browsing
+@item Interact closely with proof script writing
+@end itemize
+The last point is the most important. We should be able to integrate a
+search mechanism for proofs of similar theorems, theorems containing
+particular constants, etc.
+
+
+
+
+@c
+@c
+@c APPENDIX: Demonstration instantiation for Isabelle
+@c
+@c
+@node Demonstration Instantiations
+@appendix Demonstration Instantiations
+
+This appendix contains the code for the two demonstration
+instantiations of Proof General, for Isabelle.
+
+These instantiations make an almost-bare minimum of settings to get
+things working. To add embellishments, you should refer to
+the instantiations for other systems distributed with
+Proof General.
+
+@menu
+* demoisa-easy.el::
+* demoisa.el::
+@end menu
+
+@node demoisa-easy.el
+@section demoisa-easy.el
+
+@lisp
+@c FIXME: MAGIC NEEDED TO INCLUDE FILE VERBATIM
+@c @includeverbatim ../demoisa/demoisa-easy.el
+;; demoisa-easy.el Example Proof General instance for Isabelle
+;;
+;; Copyright (C) 1999 LFCS Edinburgh.
+;;
+;; Author: David Aspinall <David.Aspinall@@ed.ac.uk>
+;;
+;; $Id$
+;;
+;; This is an alternative version of demoisa.el which uses the
+;; proof-easy-config macro to do the work of declaring derived modes,
+;; etc.
+;;
+;; See demoisa.el and the Proof General manual for more documentation.
+;;
+;; To test this file you must rename it demoisa.el.
+;;
+
+(require 'proof-easy-config) ; easy configure mechanism
+
+(proof-easy-config
+ 'demoisa "Isabelle Demo"
+ proof-prog-name "isabelle"
+ proof-terminal-char ?\;
+ proof-script-comment-start "(*"
+ proof-script-comment-end "*)"
+ proof-goal-command-regexp "^Goal"
+ proof-save-command-regexp "^qed"
+ proof-goal-with-hole-regexp "qed_goal \"\\(\\(.*\\)\\)\""
+ proof-save-with-hole-regexp "qed \"\\(\\(.*\\)\\)\""
+ proof-non-undoables-regexp "undo\\|back"
+ proof-goal-command "Goal \"%s\";"
+ proof-save-command "qed \"%s\";"
+ proof-kill-goal-command "Goal \"PROP no_goal_set\";"
+ proof-showproof-command "pr()"
+ proof-undo-n-times-cmd "pg_repeat undo %s;"
+ proof-auto-multiple-files t
+ proof-shell-cd-cmd "cd \"%s\""
+ proof-shell-prompt-pattern "[ML-=#>]+>? "
+ proof-shell-interrupt-regexp "Interrupt"
+ proof-shell-start-goals-regexp "Level [0-9]"
+ proof-shell-end-goals-regexp "val it"
+ proof-shell-quit-cmd "quit();"
+ proof-assistant-home-page
+ "http://www.cl.cam.ac.uk/Research/HVG/Isabelle/"
+ proof-shell-annotated-prompt-regexp
+ "^\\(val it = () : unit\n\\)?ML>? "
+ proof-shell-error-regexp
+ "\\*\\*\\*\\|^.*Error:\\|^uncaught exception \\|^Exception- "
+ proof-shell-init-cmd
+ "fun pg_repeat f 0 = () | pg_repeat f n = (f(); pg_repeat f (n-1));"
+ proof-shell-proof-completed-regexp "^No subgoals!"
+ proof-shell-eager-annotation-start
+ "^\\[opening \\|^###\\|^Reading")
+
+(provide 'demoisa)
+@end lisp
+
+@node demoisa.el
+@section demoisa.el
+
+@lisp
+@c FIXME: MAGIC NEEDED TO INCLUDE FILE VERBATIM
+@c @includeverbatim ../demoisa/demoisa-easy.el
+;; demoisa.el Example Proof General instance for Isabelle
+;;
+;; Copyright (C) 1999 LFCS Edinburgh.
+;;
+;; Author: David Aspinall <David.Aspinall@@ed.ac.uk>
+;;
+;; $Id$
+;;
+;; =================================================================
+;;
+;; See README in this directory for an introduction.
+;;
+;; Basic configuration is controlled by one line in `proof-site.el'.
+;; It has this line in proof-assistant-table:
+;;
+;; (demoisa "Isabelle Demo" "\\.ML$")
+;;
+;; From this it loads this file "demoisa/demoisa.el" whenever
+;; a .ML file is visited, and sets the mode to `demoisa-mode'
+;; (defined below).
+;;
+;; I've called this instance "Isabelle Demo Proof General" just to
+;; avoid confusion with the real "Isabelle Proof General" in case the
+;; demo gets loaded by accident.
+;;
+;; To make the line above take precedence over the real Isabelle mode
+;; later in the table, set PROOFGENERAL_ASSISTANTS=demoisa in the
+;; shell before starting Emacs (or customize proof-assistants).
+;;
+
+
+(require 'proof) ; load generic parts
+
+
+;; ======== User settings for Isabelle ========
+;;
+;; Defining variables using customize is pretty easy.
+;; You should do it at least for your prover-specific user options.
+;;
+;; proof-site provides us with two customization groups
+;; automatically: (based on the name of the assistant)
+;;
+;; 'isabelledemo - User options for Isabelle Demo Proof General
+;; 'isabelledemo-config - Configuration of Isabelle Proof General
+;; (constants, but may be nice to tweak)
+;;
+;; The first group appears in the menu
+;; ProofGeneral -> Customize -> Isabelledemo
+;; The second group appears in the menu:
+;; ProofGeneral -> Internals -> Isabelledemo config
+;;
+
+(defcustom isabelledemo-prog-name "isabelle"
+ "*Name of program to run Isabelle."
+ :type 'file
+ :group 'isabelledemo)
+
+(defcustom isabelledemo-web-page
+ "http://www.cl.cam.ac.uk/Research/HVG/isabelle.html"
+ "URL of web page for Isabelle."
+ :type 'string
+ :group 'isabelledemo-config)
+
+
+;;
+;; ======== Configuration of generic modes ========
+;;
+
+(defun demoisa-config ()
+ "Configure Proof General scripting for Isabelle."
+ (setq
+ proof-terminal-char ?\; ; ends every command
+ proof-script-comment-start "(*"
+ proof-script-comment-end "*)"
+ proof-goal-command-regexp "^Goal"
+ proof-save-command-regexp "^qed"
+ proof-goal-with-hole-regexp "qed_goal \"\\(\\(.*\\)\\)\""
+ proof-save-with-hole-regexp "qed \"\\(\\(.*\\)\\)\""
+ proof-non-undoables-regexp "undo\\|back"
+ proof-undo-n-times-cmd "pg_repeat undo %s;"
+ proof-showproof-command "pr()"
+ proof-goal-command "Goal \"%s\";"
+ proof-save-command "qed \"%s\";"
+ proof-kill-goal-command "Goal \"PROP no_goal_set\";"
+ proof-assistant-home-page isabelledemo-web-page
+ proof-auto-multiple-files t))
+
+
+(defun demoisa-shell-config ()
+ "Configure Proof General shell for Isabelle."
+ (setq
+ proof-shell-annotated-prompt-regexp "^\\(val it = () : unit\n\\)?ML>? "
+ proof-shell-cd-cmd "cd \"%s\""
+ proof-shell-prompt-pattern "[ML-=#>]+>? "
+ proof-shell-interrupt-regexp "Interrupt"
+ proof-shell-error-regexp "\\*\\*\\*\\|^.*Error:\\|^uncaught exception \\|^Exception- "
+ proof-shell-start-goals-regexp "Level [0-9]"
+ proof-shell-end-goals-regexp "val it"
+ proof-shell-proof-completed-regexp "^No subgoals!"
+ proof-shell-eager-annotation-start "^\\[opening \\|^###\\|^Reading"
+ proof-shell-init-cmd ; define a utility function, in a lib somewhere?
+ "fun pg_repeat f 0 = ()
+ | pg_repeat f n = (f(); pg_repeat f (n-1));"
+ proof-shell-quit-cmd "quit();"))
+
+
+
+;;
+;; ======== Defining the derived modes ========
+;;
+
+;; The name of the script mode is always <proofsym>-script,
+;; but the others can be whatever you like.
+;;
+;; The derived modes set the variables, then call the
+;; <mode>-config-done function to complete configuration.
+
+(define-derived-mode demoisa-mode proof-mode
+ "Isabelle Demo script" nil
+ (demoisa-config)
+ (proof-config-done))
+
+(define-derived-mode demoisa-shell-mode proof-shell-mode
+ "Isabelle Demo shell" nil
+ (demoisa-shell-config)
+ (proof-shell-config-done))
+
+(define-derived-mode demoisa-response-mode proof-response-mode
+ "Isabelle Demo response" nil
+ (proof-response-config-done))
+
+(define-derived-mode demoisa-goals-mode proof-goals-mode
+ "Isabelle Demo goals" nil
+ (proof-goals-config-done))
+
+;; The response buffer and goals buffer modes defined above are
+;; trivial. In fact, we don't need to define them at all -- they
+;; would simply default to "proof-response-mode" and "pg-goals-mode".
+
+;; A more sophisticated instantiation might set font-lock-keywords to
+;; add highlighting, or some of the proof by pointing markup
+;; configuration for the goals buffer.
+
+;; The final piece of magic here is a hook which configures settings
+;; to get the proof shell running. Proof General needs to know the
+;; name of the program to run, and the modes for the shell, response,
+;; and goals buffers.
+
+(add-hook 'proof-pre-shell-start-hook 'demoisa-pre-shell-start)
+
+(defun demoisa-pre-shell-start ()
+ (setq proof-prog-name isabelledemo-prog-name)
+ (setq proof-mode-for-shell 'demoisa-shell-mode)
+ (setq proof-mode-for-response 'demoisa-response-mode)
+ (setq proof-mode-for-goals 'demoisa-goals-mode))
+
+(provide 'demoisa)
+@end lisp
+
+
+
+
+@node Function Index
+@unnumbered Function and Command Index
+@printindex fn
+
+@node Variable Index
+@unnumbered Variable and User Option Index
+@printindex vr
+
+@c Nothing in this one!
+@c @node Keystroke Index
+@c @unnumbered Keystroke Index
+@c @printindex ky
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@page
+@contents
+@bye
+
+