aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml22
-rw-r--r--AUTHORS12
-rw-r--r--CHANGES135
-rw-r--r--COMPATIBILITY37
-rw-r--r--FAQ298
-rw-r--r--FAQ.md292
-rw-r--r--INSTALL15
-rw-r--r--Makefile75
-rw-r--r--Makefile.devel173
-rw-r--r--Makefile.travis29
-rw-r--r--README48
-rw-r--r--README.md59
-rw-r--r--TAGS3081
-rw-r--r--acl2/acl2.el2
-rwxr-xr-x[-rw-r--r--]bin/proofgeneral0
-rw-r--r--coq/coq-abbrev.el77
-rw-r--r--coq/coq-compile-common.el341
-rw-r--r--coq/coq-db.el14
-rw-r--r--coq/coq-indent.el16
-rw-r--r--coq/coq-par-compile.el1493
-rw-r--r--coq/coq-par-test.el953
-rw-r--r--coq/coq-seq-compile.el67
-rw-r--r--coq/coq-smie.el63
-rw-r--r--coq/coq-syntax.el635
-rw-r--r--coq/coq-system.el147
-rw-r--r--coq/coq.el293
-rwxr-xr-x[-rw-r--r--]coq/coqtags0
-rw-r--r--doc/.gitignore (renamed from doc/.cvsignore)0
-rw-r--r--doc/Makefile.doc2
-rw-r--r--doc/PG-adapting.texi23
-rw-r--r--doc/ProofGeneral-image.jpgbin42514 -> 36953 bytes
-rw-r--r--doc/ProofGeneral.texi785
-rw-r--r--etc/ProofGeneral.spec2
-rw-r--r--etc/desktop/icons/128x128/proofgeneral.pngbin0 -> 14117 bytes
-rw-r--r--etc/desktop/icons/16x16/proofgeneral.pngbin746 -> 1020 bytes
-rw-r--r--etc/desktop/icons/32x32/proofgeneral.pngbin1974 -> 2098 bytes
-rw-r--r--etc/desktop/icons/48x48/proofgeneral.pngbin4966 -> 3682 bytes
-rw-r--r--etc/desktop/icons/64x64/proofgeneral.pngbin0 -> 5045 bytes
-rw-r--r--generic/pg-custom.el2
-rw-r--r--generic/pg-response.el49
-rw-r--r--generic/pg-user.el6
-rw-r--r--generic/pg-vars.el2
-rw-r--r--generic/proof-config.el7
-rw-r--r--generic/proof-faces.el2
-rw-r--r--generic/proof-script.el19
-rw-r--r--generic/proof-shell.el50
-rw-r--r--generic/proof-site.el6
-rw-r--r--generic/proof-splash.el64
-rw-r--r--generic/proof-tree.el16
-rw-r--r--generic/proof-utils.el93
-rw-r--r--images/ProofGeneral-splash.pngbin0 -> 66563 bytes
-rw-r--r--images/ProofGeneral.pngbin0 -> 162068 bytes
-rw-r--r--images/README21
-rwxr-xr-x[-rw-r--r--]isar/interface0
-rwxr-xr-x[-rw-r--r--]isar/isartags0
-rwxr-xr-x[-rw-r--r--]lego/legotags0
-rw-r--r--lib/span.el131
-rw-r--r--previous-art/doc/ProofGeneral-image.jpgbin0 -> 42514 bytes
-rw-r--r--previous-art/etc/desktop/icons/16x16/proofgeneral.pngbin0 -> 746 bytes
-rw-r--r--previous-art/etc/desktop/icons/32x32/proofgeneral.pngbin0 -> 1974 bytes
-rw-r--r--previous-art/etc/desktop/icons/48x48/proofgeneral.pngbin0 -> 4966 bytes
-rw-r--r--previous-art/images/ProofGeneral-image.gif (renamed from images/ProofGeneral-image.gif)bin18165 -> 18165 bytes
-rw-r--r--previous-art/images/ProofGeneral-image.jpg (renamed from images/ProofGeneral-image.jpg)bin16123 -> 16123 bytes
-rw-r--r--previous-art/images/ProofGeneral-splash.pngbin0 -> 60951 bytes
65 files changed, 4607 insertions, 5051 deletions
diff --git a/.gitignore b/.gitignore
index 76ce80f6..9cd6d703 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@ nohup.out
TAGS
ChangeLog
*.elc
+*~
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..f9f10d8c
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,22 @@
+language: emacs-lisp
+sudo: false
+
+env:
+ - EMACS_TARGET=emacs-24.3
+ - EMACS_TARGET=emacs-24.4
+ - EMACS_TARGET=emacs-24.5
+ - EMACS_TARGET=emacs-git
+
+before_install:
+ - make -f Makefile.travis before_install
+
+install:
+ - make -f Makefile.travis install
+
+script:
+ - emacs --version
+ - make -f Makefile.travis script
+
+notifications:
+ slack:
+ secure: "Cul0iDgsNZgDYCyuHE7a2D1XCWzbFMBi/3J9MIfddWwChL5EEEv/A1EI+VVjXwzWLyvyeJLv7V8PmPUKMuACjlcQcTKcb1q/1WV3k6Y5kR5Z29HktCNTF27KX/e/6bNeKMVvjC0EERRxIi9GAwCOOokapCxS5FjjPnVubGf99FNfRFXePh9FeRg3I7XcSNCjKicZgNGczME1vPxERbpcFnMXPD5+vPhjKjJWQJUNpZUnonRRqfbNmSCwu/oy0Uby3lJhmcLm2Fc7UggD/IYcFbefbLgzmImVmra1qzRH9ZLF5fVS59npd+o2iowL27SQCYxGtqMc6gX85h9evzwgL2KFMXCV6om1r5pwBOBnEPgkiNKqCig9R5Ij+nHbkEkZqPBwEcXqeQyVsXUEV5yiU5qwDZXe2z1dlqhPa8tRpxRNk0IUdVVYeOsOS+AhbkUDkbYMlOY+yMiY5J4P94AhhDmYzuLTuSNi3ZGdPNCJcx0JSTLALITT5NJp1QljaOO5Xq/8UHTRlVdfFKijfpLfaCT6VloigXw8kTbxhm5Kpf5aZqFC/3uCg+4D6CuBI/IiWNADJcLMocJqS/Rp6kUA+VqAMMWfpyWySihDHSuw0WXeDVZL/ZhynVagIV+0/VcqYzQKXDzCEOaD0lJp3ypeKfjBAz18N6s7LH/yBFHfJck="
diff --git a/AUTHORS b/AUTHORS
index ae8705ee..03911df7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,10 +1,12 @@
Current Authors/Maintainers:
- David Aspinall (all)
- Pierre Courtieu (coq)
- Christoph Raffalli (phox)
- Makarius Wenzel (isar)
-
+ David Aspinall (all)
+ Pierre Courtieu (coq)
+ Erik Martin-Dorel (coq, website)
+ Clément Pit-Claudel (coq)
+ Christoph Raffalli (phox)
+ Makarius Wenzel (isar)
+
Previous Authors:
Stefan Berghofer (isar)
diff --git a/CHANGES b/CHANGES
index 384cb1df..4ac96315 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,16 +1,100 @@
-*- outline -*-
This is a summary of main changes. For details, please see
-the GIT ChangeLog and PG Trac, http://proofgeneral.inf.ed.ac.uk/trac.
+the Git ChangeLog, the GitHub repo https://github.com/ProofGeneral/PG
+and the PG Trac http://proofgeneral.inf.ed.ac.uk/trac
-* Changes of Proof General 4.3 from Proof General 4.2
+* Changes of Proof General 4.4.1 from Proof General 4.4
+
+** Generic changes
+
+*** bug fixes
+ - Using query-replace (or replace-string) in the processed region
+ doesn't wrongly jump to the first match anymore.
+
+** Coq changes
+
+*** new menu Coq -> Auto Compilation for all background compilation options
+
+*** support for 8.5 quick compilation
-** ProofGeneral has moved to github!
+ See new menu Coq -> Auto Compilation. Select "no quick" as
+ long as you have not switched to "Proof using" to compile
+ without -quick. Select "quick no vio2vo" to use -quick
+ without vio2vo (and guess what "quick and vio2vo" means ;-),
+ select "ensure vo" to ensure a sound development. See the
+ option `coq-compile-quick' or the subsection "11.3.3 Quick
+ compilation and .vio Files" in the Coq reference manual.
- https://github.com/ProofGeneral/PG.
+*** new option coq-compile-keep-going (in menu Coq -> Auto Compilation)
+
+ Similar to ``make -k'', with this option enabled, background
+ compilation does not stop at the first error but rather
+ continues as far as possible.
+
+*** bug fixes
+ - avoid leaving partial files behind when compilation fails
+ - 123: Parallel background compliation fails to execute some
+ imports
+ - fix error in process filter: Cannot resize window
+ - 54 partially: Buffer coq-compile-response sometimes takes
+ over the whole window
+ - 75: Library more.v is required
+ - 70: Coq trunk + compile before require => « Invalid version
+ syntax: 'trunk' »
+ - 92: Compile before require from current directory failing
+ with 8.5
+
+* Changes of Proof General 4.4 from Proof General 4.3
+
+** ProofGeneral has moved to GitHub!
+
+ https://github.com/ProofGeneral/PG
Please submit new bugs there, old bugs may stay in good old PG trac
- for a while though: http://proofgeneral.inf.ed.ac.uk/trac.
+ for a while though: http://proofgeneral.inf.ed.ac.uk/trac
+
+** Coq changes
+
+*** indentation of ";" tactical:
+ by default the indentation is like this:
+ tac1;
+ tac2;
+ tac3.
+ do this: (setq coq-indent-semicolon-tactical 0) to have this:
+ tac1;
+ tac2;
+ tac3.
+
+*** Option to disable the auto resizing of response buffer:
+
+ By default when the response buffer is on the same column than
+ goals buffer, pg changes its size dynamically to optimize goals
+ displaying.
+
+ To disable this feature use:
+ (setq coq-optimise-resp-windows-enable nil)
+
+*** Option to prefer top of conclusion instead of bottom
+
+ When display goals that do not fit in the goals window, PG prefers
+ to display the bottom of the goal (where lies it own conclusion.
+ You can make it prefer the top of the conclusion by setting this:
+ (setq coq-prefer-top-of-conclusion t)
+
+*** Auto adjusting of printing width
+
+ On by default. To disable: Coq/Settings/Auto Adapt Printing Width
+ or (setq coq-auto-adapt-printing-width nil).
+
+*** Removed the Set Undo 500 at start.
+ This is obsolete. To recover: (setq coq-user-init-cmd `("Set Undo 500."))
+
+*** Option to highlight usual symbols
+ Off by default, enable using:
+ (setq coq-symbol-highlight-enable t)
+
+* Changes of Proof General 4.3 from Proof General 4.2
** Prooftree changes
@@ -65,15 +149,13 @@ the GIT ChangeLog and PG Trac, http://proofgeneral.inf.ed.ac.uk/trac.
| S n => ...
end
-*** indentation of ";" tactical:
- by default the indentation is like this:
- tac1;
- tac2;
- tac3.
- do this: (setq coq-indent-semicolon-tactical 0) to have this:
- tac1;
- tac2;
- tac3.
+*** indentation now supports { at end of line:
+ example:
+
+ assert (h:n = k). {
+ apply foo.
+ reflexivity. }
+ apply h.
*** Default indentation of forall and exists is not boxed anymore
For instance, this is now indented like this:
@@ -91,6 +173,20 @@ the GIT ChangeLog and PG Trac, http://proofgeneral.inf.ed.ac.uk/trac.
Lemma foo: forall x y,
x = 0 -> ... .
+*** Default indentation cases of "match with" are now indented by 2 instead of 4.
+ "|" is indented by zero:
+
+ match n with
+ 0 => ...
+ | S n => ...
+ end
+ instead of:
+ match n with
+ 0 => ...
+ | S n => ...
+ end
+ do this: (setq coq-match-indent 4) to bring old behaviour back.
+
*** Support for bullets, braces and Grab Existential Variables for Prooftree.
*** Support for _Coqproject files
@@ -116,19 +212,8 @@ the GIT ChangeLog and PG Trac, http://proofgeneral.inf.ed.ac.uk/trac.
Experimental: colorize hypothesis names and some parts of error
and warning messages, and also evars. For readability.
-*** Auto adjusting of printing width
-
- On by default. To disable: Coq/Settings/Auto Adapt Printing Width
- or (setq coq-auto-adapt-printing-width nil).
-
*** Coq Querying facilities
-*** Removed the Set Undo 500 at start.
- This is obsolete. To recover: (setq coq-user-init-cmd `("Set Undo 500."))
-
-
-
-
**** Minibuffer interactive queries
Menu Coq/Other Queries (C-c C-a C-q) allows to send queries (like
diff --git a/COMPATIBILITY b/COMPATIBILITY
index 6af37517..e2345a99 100644
--- a/COMPATIBILITY
+++ b/COMPATIBILITY
@@ -4,36 +4,32 @@ Compatibility of Proof General
This version of Proof General has been tested with these Emacs versions
on recent Linux systems:
- Emacs 23.4 -- recommended and supported
- Emacs 23.3,23.2 -- previous versions, should work
- Emacs 24 (development) -- next version, should work
- Emacs 23.1, earlier -- obsolete versions, do NOT work
+ Emacs 24.5 -- recommended and supported
+ Emacs 24.3, 24.4 -- previous versions, should work
+ Emacs 25 (dev) -- next version, should work
+ Emacs 23.2, earlier -- obsolete versions, do NOT work
-and (main) prover versions: Coq 8.3, Isabelle2011[-1]
+and (main) prover versions: Coq 8.4, Coq 8.5
See below for notes about other operating systems.
-Maintaining compatibility across proof assistant versions, Emacs
-versions and operating systems is virtually impossible.
-
In the major 4.0 release ** XEmacs compatibility was dropped **
-
-Running on Mac OS X
+Running on macOS
-------------------
For tips, please see here:
http://proofgeneral.inf.ed.ac.uk/wiki/PGEmacsOnMacOSX
-We recommend the 23.2 build of GNU Emacs, which builds natively on Mac
-OS X (based on the NextStep port). Binaries are available at various
+We recommend the 24.5 build of GNU Emacs, which builds natively on macOS
+(based on the NextStep port). Binaries are available at various
websites (e.g., http://emacsformacosx.com), or you can build your own
by compiling from the FSF CVS. See the Emacs Wiki at
http://www.emacswiki.org/emacs/EmacsForMacOS for more.
-Note that Mac compatibility isn't thoroughly tested. If you discover
-problems, please send a report and/or fix to the PG trac. Please
+Note that macOS compatibility isn't thoroughly tested. If you discover
+problems, please send a report and/or fix to the PG tracker. Please
add tips to the wiki page above.
@@ -44,19 +40,6 @@ For tips, please see here:
http://proofgeneral.inf.ed.ac.uk/wiki/PGEmacsOnWindows
-We recommend EmacsW32 available at:
-
- http://www.ourcomments.org/Emacs/EmacsW32.html
-
-Unpack the Proof General tar or zip file, and rename the folder to
-"ProofGeneral" to remove the version number. Put a line like this:
-
- (load-file "c:\\ProofGeneral\\generic\\proof-site.el")
-
-into .emacs. You should put .emacs in value of HOME if you set that,
-or else in directory you installled Emacs in, e.g.
-c:\Program Files\Emacs\.emacs
-
Note that Windows compatibility isn't tested by the maintainers. If
you discover problems, please add notes on the Wiki page above, and
submit patches to http://proofgeneral.inf.ed.ac.uk/trac
diff --git a/FAQ b/FAQ
deleted file mode 100644
index 92370801..00000000
--- a/FAQ
+++ /dev/null
@@ -1,298 +0,0 @@
-FAQs for using/installing Proof General
-=======================================
-
-With thanks to the anonymous authors of questions/answers below.
-
-For latest version, see http://proofgeneral.inf.ed.ac.uk/FAQ
-Please also check the BUGS file.
-
------------------------------------------------------------------
-
-Q. The prover process produces some useful output I'd like to
- keep a note of, how do I do that?
-
-A. Some people cut and paste into comments in their source files.
- But you can easily make new files or temporary buffers in Emacs:
-
- * copy text from *response* or *goals* buffer
- * C-x b <enter new name> RET
- * Switch to correct mode, e.g.: M-x isar-response-mode RET
- * Paste text, the highlighting/sumbols should appear correctly.
-
------------------------------------------------------------------
-
-Q. Proof General fails to load with an error message on start-up,
- containing text like this:
-
- Proof General was compiled for GNU Emacs 23.1 but
- is running on Emacs 22.3: please run "make clean; make"
-
- What's wrong?
-
-A. We distribute compiled .elcs for one version of Emacs, but other
- versions use different bytecode formats. You will have to delete
- the compiled files and (optionally) recompile for your preferred
- Emacs version. Using the Makefile:
-
- make clean # removes all .elc files.
-
- and then a command like this:
-
- make EMACS=emacs-22.3
-
- (without the EMACS setting just uses 'emacs').
-
------------------------------------------------------------------
-
-Q. I have just installed Emacs, ProofGeneral and a proof assistant.
- It works but Tokens (e.g. \<Longrightarrow>) are not being displayed
- as symbols.
-
-A. You need to enable Unicode Tokens by the menu item:
-
- Proof-General -> Options -> Unicode Tokens
-
- To enable it automatically every time you use Proof General,
- use
-
- Proof-General -> Options -> Save Options
-
- after doing this.
-
- Note that we don't do this by default, because from the system's
- perspective it is difficult to determine if this will succeed ---
- or just produce funny characters that confuse new users even more.
-
- If you are using Isabelle, the wrapper script will load Tokens
- from any location, and you can enable it by passing the option
- "-x true".
-
------------------------------------------------------------------
-
-
-Q. With Unicode symbols enabled, the symbols look a mess, e.g.
- compressed and overlap one another.
-
-A. Unfortunately this is a bug in the display engine inside
- certain versions of Emacs, for example the default version
- of emacs, Emacs 23.3.1 on Ubuntu 11.10, suffers.
-
- The solution is to switch to another version (e.g. Emacs 23.2).
- (See Trac#409: http://proofgeneral.inf.ed.ac.uk/trac/ticket/409)
-
- You may be able to get better results with different fonts, even
- without upgrading Emacs.
-
- Proof General uses Deja Vu Sans Mono by default because
- this often works out-of-the-box. But STIX is better if you
- install it. See http://www.stixfonts.org/. On Ubuntu try:
-
- sudo apt-get install fonts-stix
-
- To change to STIX, either
-
- M-x customize face RET unicode-tokens-symbol-font-face RET
-
- and edit to set the family name to "STIXGeneral", or edit
- the line beginning "(defface unicode-tokens-symbol-font-face" in
- lib/unicode-tokens.el.
-
-
------------------------------------------------------------------
-
-Q. Help, I'm stuck!! Emacs keeps telling me "Cannot switch buffers in a
- dedicated window"
-
-A. This can happen if you enabled "Use Three Panes" and then change
- the panes (window) layout manually, typically by deleting another
- window or frame so you only have a "dedicated" window on the
- display. Don't kill Emacs! There are many ways of getting out,
- e.g.
- -- In single window mode, C-c C-l (proof-layout-windows) refreshes
- the display
-
- -- In multiple window mode, if you have accidently deleted the main
- window, get a new one with M-x new-frame RET
-
-
-
------------------------------------------------------------------
-
-Q. I have a problem installing/using Proof General, what can I do?
-
-A. Please check the documentation carefully, particularly the
- requirements for a full-featured and recent Emacs version, as
- mentioned in INSTALL (see "Dependency on Other Emacs Packages").
- If you still cannot solve your problem, try to contact someone
- else who is using Proof General with a similar setup. The
- best way to do this may be through the user mailing list for your
- proof assistant. If you think the problem is Proof General related,
- consult the PG Wiki and Trac pages.
-
-
-
------------------------------------------------------------------
-
-Q. I'm using Proof General for prover X, then I load a file for
- prover Y. I get an error. Why?
-
-A. Unfortunately the architecture of Proof General is designed so
- that you can only use one prover at a time in the same Emacs
- session. If you want to run more than one prover at a time,
- you have to run more than one Emacs.
-
-
-
------------------------------------------------------------------
-
-
-Q. I'm afraid I got stuck very early on. I sent the following line:
-
- by (swap_res_tac [psubsetI] 1;
-
- Notice that I forgot the right bracket. The line went pink, the
- buffer went read-only and nothing I tried would let me fix the
- error.
-
-A. The proof process is waiting for more input because of the missing
- parenthesis, but Proof General doesn't realise this and waits for a
- response. You should type something in the proof shell buffer
- (*isabelle*), or interrupt the process with C-c C-c or the Stop button.
-
-
------------------------------------------------------------------
-
-Q. How can I keep the Proof General option settings across sessions?
-
-A. For options set in the Proof General -> Options menu use the
- "Save Options" menu item (Proof General -> Options -> Save Options).
-
- For other options set via customize (Proof General -> Advanced ->
- Customize), use the customize buttons, or M-x customize-save-customized.
-
-
------------------------------------------------------------------
-
-Q. The "Favourites" feature to insert/send fixed strings is great,
- but I'd like to define a command which takes arguments.
-
-A. You can do that in Elisp with a command like this:
-
- (proof-definvisible isar-theorem
- '(format "thm %s" (read-string "theorem: "))
- [(control t)])
-
- (NB: it binds the key C-c C-a C-t). See the documentation for
- `proof-definvisible' and `proof-defshortcut`.
-
-
------------------------------------------------------------------
-
-Q. Why do I get a warning "Bad version of xml.el found, ..."?
-
-A. Your Emacs distribution includes a version of xml.el which has
- fundamental bugs. The patched version of xml.el, in lib/xml-fixed.el
- has been loaded instead. This works for Proof General because it fixes
- the basic bugs, but it may cause compatibility issues in other packages
- (e.g. it is quite different from the latest xml.el with GNU Emacs
- development versions).
-
- This message is probably nothing to worry about unless you are using
- the same Emacs session for other packages that heavily use xml.el
- (e.g. GNUS).
-
-
------------------------------------------------------------------
-
-Q. Undo behaviour in Coq seems to stop working with very long
- sequences of commands.
-
-A. Coq has a limited history for Undo. Change
-
- Coq -> Settings -> Undo Depth
-
- to something higher. Default is 200 (100 outside PG).
-
-
------------------------------------------------------------------
-
-
-Q. Can I join any mailing lists for Proof General?
-
-A. Of course, email "proofgeneral-request@informatics.ed.ac.uk"
- with the line "subscribe" in the message body, to join the
- users' and announcements list.
-
- There is also a list for developers, proofgeneral-devel:
-
- http://proofgeneral.inf.ed.ac.uk/mailinglist
-
- for more details.
-
-
------------------------------------------------------------------
-
-Q. Emacs appears to hang when the prover process is started.
-
-A. One thing is to check the variable 'comint-process-echoes' which
- might be non-nil for the *coq* (or other prover) buffer. It
- should be nil.
-
- The default value of comint-process-echoes is nil. Move any
- modifications of this variable away from the top level (e.g.,
- .emacs file, which affects the *coq*-buffer), and down to the
- mode-hooks which require them (e.g. shell-mode-hook). The
- variable might also have been set by Customize, it can be reset
- with M-x customize-variable RET comint-process-echoes RET.
-
- A reason with older versions of Isabelle and Coq (before 2007) was
- the emergence of UTF-8 support in linuxes with Glibc 2.2 and
- later, enabled with UTF8 encoded output in your default locale.
- Proof General used on 8-bit characters which are UTF8 prefixes in
- the output of proof assistants. These prefix characters were not
- flushed to stdout individually.
-
- As a workaround we can disable interpretation of UTF8 in the C
- libraries. Doing this inside Proof General is unreliable; locale
- settings are set/inherited in strange ways. One solution is to
- run the Emacs process itself with an altered locale setting, e.g.,
-
- $ LC_CTYPE=en_GB xemacs &
-
- (where $ is the shell prompt; this example is for my locale which
- by default is "en_GB.UTF-8": I see this by typing "locale" at
- the prompt).
-
- (This fix is attempted in the supplied "proofgeneral" script, as
- well as making an adjustment in Proof General when the string UTF
- appears in the current value of LC_CTYPE. Alternatively you can
- set LC_CTYPE inside a file ~/.i18n, which will be read the shell.
- Put a line such as "LC_CTYPE=en_GB" into this file. However, this
- action will affect all applications.
-
- NB: a related issue is warnings from X-Symbol: "Emacs language
- environment and system locale specify different encoding, I'll
- assume `iso-8859-1'". This warning appears to be mostly harmless.
- Notice that the variable `buffer-file-coding-system' may determine
- the format that files are saved in.
-
- Another way to affect this which has been suggested is to add a line
- like this to the init.el file on XEmacs:
-
- (prefer-coding-system 'ctext)
-
- but I haven't tried this.
-
- The above fixes should not be necessary with most recent prover
- versions. Isabelle 2007 has a "Unicode-safe" interaction mode,
- enabled by default (to disable, customise `proof-shell-unicode').
- This is also used by the Isabelle startup scripts. Coq 8.1 and
- later do not use non-ASCII characters in output.
-
-
-
-
-
-
-$Id$
-
diff --git a/FAQ.md b/FAQ.md
new file mode 100644
index 00000000..3aeeffc5
--- /dev/null
+++ b/FAQ.md
@@ -0,0 +1,292 @@
+FAQs for using/installing Proof General
+=======================================
+
+With thanks to the anonymous authors of questions/answers below.
+
+For latest version, see https://github.com/ProofGeneral/PG/blob/master/FAQ.md
+Please also check the BUGS file.
+
+-----------------------------------------------------------------
+
+Q. I use ProofGeneral with custom installations of Coq, depending
+ on the project I am working on. How can I change `coq-prog-name`
+ accordingly?
+
+A. The recommended way to set `coq-prog-name` is to create a file
+ .dir-locals.el in the top-level folder of your Coq project (or
+ if applicable, in the sub-folder containing the Coq source files)
+ with content:
+
+ ((coq-mode . ((coq-prog-name . ".../path/to/coqtop"))))
+
+ Then restart Emacs
+ (or just run: `M-x proof-shell-exit RET yes RET`, `M-x normal-mode RET`
+ in the Coq buffer before restarting the Coq process) in order
+ to take this change into account.
+
+-----------------------------------------------------------------
+
+Q. The prover process produces some useful output I'd like to
+ keep a note of, how do I do that?
+
+A. Some people cut and paste into comments in their source files.
+ But you can easily make new files or temporary buffers in Emacs:
+
+ * copy text from \*response* or \*goals* buffer
+ * `C-x b <enter new name> RET`
+ * Switch to correct mode, e.g.: `M-x isar-response-mode RET`
+ * Paste text, the highlighting/sumbols should appear correctly.
+
+-----------------------------------------------------------------
+
+Q. Proof General fails to load with an error message on start-up,
+ containing text like this:
+
+ Proof General was compiled for GNU Emacs 23.1 but
+ is running on Emacs 22.3: please run "make clean; make"
+
+ What's wrong?
+
+A. We distribute compiled .elcs for one version of Emacs, but other
+ versions use different bytecode formats. You will have to delete
+ the compiled files and (optionally) recompile for your preferred
+ Emacs version. Using the Makefile:
+
+ make clean # removes all .elc files.
+
+ and then a command like this:
+
+ make EMACS=emacs-22.3
+
+ (without the EMACS setting just uses 'emacs').
+
+-----------------------------------------------------------------
+
+Q. I have just installed Emacs, ProofGeneral and a proof assistant.
+ It works but Tokens (e.g. \\&lt;Longrightarrow&gt;) are not being displayed
+ as symbols.
+
+A. You need to enable Unicode Tokens by the menu item:
+
+ Proof-General -> Options -> Unicode Tokens
+
+ To enable it automatically every time you use Proof General,
+ use
+
+ Proof-General -> Options -> Save Options
+
+ after doing this.
+
+ Note that we don't do this by default, because from the system's
+ perspective it is difficult to determine if this will succeed ---
+ or just produce funny characters that confuse new users even more.
+
+ If you are using Isabelle, the wrapper script will load Tokens
+ from any location, and you can enable it by passing the option
+ "-x true".
+
+-----------------------------------------------------------------
+
+Q. With Unicode symbols enabled, the symbols look a mess, e.g.
+ compressed and overlap one another.
+
+A. Unfortunately this is a bug in the display engine inside
+ certain versions of Emacs, for example the default version
+ of emacs, Emacs 23.3.1 on Ubuntu 11.10, suffers.
+
+ The solution is to switch to another version (e.g. Emacs 23.2).
+ (See Trac#409: <http://proofgeneral.inf.ed.ac.uk/trac/ticket/409>)
+
+ You may be able to get better results with different fonts, even
+ without upgrading Emacs.
+
+ Proof General uses Deja Vu Sans Mono by default because
+ this often works out-of-the-box. But STIX is better if you
+ install it. See <http://www.stixfonts.org/>. On Ubuntu try:
+
+ sudo apt-get install fonts-stix
+
+ To change to STIX, either
+
+ M-x customize face RET unicode-tokens-symbol-font-face RET
+
+ and edit to set the family name to "STIXGeneral", or edit
+ the line beginning `(defface unicode-tokens-symbol-font-face` in
+ lib/unicode-tokens.el.
+
+-----------------------------------------------------------------
+
+Q. Help, I'm stuck!! Emacs keeps telling me "Cannot switch buffers in a
+ dedicated window"
+
+A. This can happen if you enabled "Use Three Panes" and then change
+ the panes (window) layout manually, typically by deleting another
+ window or frame so you only have a "dedicated" window on the
+ display. Don't kill Emacs! There are many ways of getting out,
+ e.g.
+
+ * In single window mode, `C-c C-l` (proof-layout-windows) refreshes
+ the display
+
+ * In multiple window mode, if you have accidently deleted the main
+ window, get a new one with `M-x new-frame RET`
+
+-----------------------------------------------------------------
+
+Q. I have a problem installing/using Proof General, what can I do?
+
+A. Please check the documentation carefully, particularly the
+ requirements for a full-featured and recent Emacs version, as
+ mentioned in [INSTALL](INSTALL) (see "Dependency on Other Emacs Packages").
+ If you still cannot solve your problem, try to contact someone
+ else who is using Proof General with a similar setup. The
+ best way to do this may be through the user mailing list for your
+ proof assistant. If you think the problem is Proof General related,
+ consult the PG Wiki and Trac pages.
+
+-----------------------------------------------------------------
+
+Q. I'm using Proof General for prover X, then I load a file for
+ prover Y. I get an error. Why?
+
+A. Unfortunately the architecture of Proof General is designed so
+ that you can only use one prover at a time in the same Emacs
+ session. If you want to run more than one prover at a time,
+ you have to run more than one Emacs.
+
+-----------------------------------------------------------------
+
+Q. I'm afraid I got stuck very early on. I sent the following line:
+
+ by (swap_res_tac [psubsetI] 1;
+
+ Notice that I forgot the right bracket. The line went pink, the
+ buffer went read-only and nothing I tried would let me fix the
+ error.
+
+A. The proof process is waiting for more input because of the missing
+ parenthesis, but Proof General doesn't realise this and waits for a
+ response. You should type something in the proof shell buffer
+ (\*isabelle*), or interrupt the process with `C-c C-c` or the Stop button.
+
+-----------------------------------------------------------------
+
+Q. How can I keep the Proof General option settings across sessions?
+
+A. For options set in the `Proof General -> Options` menu use the
+ "Save Options" menu item (`Proof General -> Options -> Save Options`).
+
+ For other options set via customize
+ (`Proof General -> Advanced -> Customize`), use the customize buttons,
+ or `M-x customize-save-customized`.
+
+-----------------------------------------------------------------
+
+Q. The "Favourites" feature to insert/send fixed strings is great,
+ but I'd like to define a command which takes arguments.
+
+A. You can do that in Elisp with a command like this:
+
+ (proof-definvisible isar-theorem
+ '(format "thm %s" (read-string "theorem: "))
+ [(control t)])
+
+ (NB: it binds the key `C-c C-a C-t`). See the documentation for
+ `proof-definvisible` and `proof-defshortcut`.
+
+-----------------------------------------------------------------
+
+Q. Why do I get a warning "Bad version of xml.el found, ..."?
+
+A. Your Emacs distribution includes a version of xml.el which has
+ fundamental bugs. The patched version of xml.el, in lib/xml-fixed.el
+ has been loaded instead. This works for Proof General because it fixes
+ the basic bugs, but it may cause compatibility issues in other packages
+ (e.g. it is quite different from the latest xml.el with GNU Emacs
+ development versions).
+
+ This message is probably nothing to worry about unless you are using
+ the same Emacs session for other packages that heavily use xml.el
+ (e.g. GNUS).
+
+-----------------------------------------------------------------
+
+Q. Undo behaviour in Coq seems to stop working with very long
+ sequences of commands.
+
+A. Coq has a limited history for Undo. Change
+
+ Coq -> Settings -> Undo Depth
+
+ to something higher. Default is 200 (100 outside PG).
+
+-----------------------------------------------------------------
+
+Q. Can I join any mailing lists for Proof General?
+
+A. Of course, email <proofgeneral-request@informatics.ed.ac.uk>
+ with the line "subscribe" in the message body, to join the
+ users' and announcements list.
+
+ There is also a list for developers, proofgeneral-devel:
+ <http://proofgeneral.inf.ed.ac.uk/mailinglist>
+ for more details.
+
+-----------------------------------------------------------------
+
+Q. Emacs appears to hang when the prover process is started.
+
+A. One thing is to check the variable `comint-process-echoes` which
+ might be non-nil for the \*coq* (or other prover) buffer. It
+ should be nil.
+
+ The default value of comint-process-echoes is nil. Move any
+ modifications of this variable away from the top level (e.g.,
+ .emacs file, which affects the \*coq*-buffer), and down to the
+ mode-hooks which require them (e.g. shell-mode-hook). The
+ variable might also have been set by Customize, it can be reset
+ with `M-x customize-variable RET comint-process-echoes RET`.
+
+ A reason with older versions of Isabelle and Coq (before 2007) was
+ the emergence of UTF-8 support in linuxes with Glibc 2.2 and
+ later, enabled with UTF8 encoded output in your default locale.
+ Proof General used on 8-bit characters which are UTF8 prefixes in
+ the output of proof assistants. These prefix characters were not
+ flushed to stdout individually.
+
+ As a workaround we can disable interpretation of UTF8 in the C
+ libraries. Doing this inside Proof General is unreliable; locale
+ settings are set/inherited in strange ways. One solution is to
+ run the Emacs process itself with an altered locale setting, e.g.,
+
+ $ LC_CTYPE=en_GB xemacs &
+
+ (where $ is the shell prompt; this example is for my locale which
+ by default is "en_GB.UTF-8": I see this by typing "locale" at
+ the prompt).
+
+ (This fix is attempted in the supplied "proofgeneral" script, as
+ well as making an adjustment in Proof General when the string UTF
+ appears in the current value of LC\_CTYPE. Alternatively you can
+ set LC\_CTYPE inside a file ~/.i18n, which will be read the shell.
+ Put a line such as "LC\_CTYPE=en_GB" into this file. However, this
+ action will affect all applications.
+
+ NB: a related issue is warnings from X-Symbol: "Emacs language
+ environment and system locale specify different encoding, I'll
+ assume `iso-8859-1`". This warning appears to be mostly harmless.
+ Notice that the variable `buffer-file-coding-system` may determine
+ the format that files are saved in.
+
+ Another way to affect this which has been suggested is to add a line
+ like this to the init.el file on XEmacs:
+
+ (prefer-coding-system 'ctext)
+
+ but I haven't tried this.
+
+ The above fixes should not be necessary with most recent prover
+ versions. Isabelle 2007 has a "Unicode-safe" interaction mode,
+ enabled by default (to disable, customize `proof-shell-unicode`).
+ This is also used by the Isabelle startup scripts. Coq 8.1 and
+ later do not use non-ASCII characters in output.
diff --git a/INSTALL b/INSTALL
index 92ba16ca..31331c2f 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,3 +1,18 @@
+From GitHub
+===========
+
+Download and install Proof General from GitHub:
+
+ git clone https://github.com/ProofGeneral/PG ~/.emacs.d/lisp/PG
+ make -C ~/.emacs.d/lisp/PG
+
+Then add the following to your .emacs:
+
+ ;; Open .v files with Proof General's Coq mode
+ (require 'proof-site "~/.emacs.d/lisp/PG/generic/proof-site")
+
+This should be enough. Instructions for previous releases are below.
+
Short Instructions for installing Proof General (details below)
===============================================================
diff --git a/Makefile b/Makefile
index 6c92ef53..b6006aa0 100644
--- a/Makefile
+++ b/Makefile
@@ -33,12 +33,10 @@ EMACS=$(shell if [ -z "`which emacs`" ]; then echo "Emacs executable not found";
PREFIX=$(DESTDIR)/usr
DEST_PREFIX=$(DESTDIR)/usr
-PWD=$(shell pwd)
-
PROVERS=acl2 ccc coq hol98 isar lego hol-light phox pgshell pgocaml pghaskell
OTHER_ELISP=generic lib contrib/mmm
ELISP_DIRS=${PROVERS} ${OTHER_ELISP}
-ELISP_EXTRAS=isar/interface isar/isartags
+ELISP_EXTRAS=
EXTRA_DIRS = images
DOC_FILES=AUTHORS BUGS COMPATIBILITY CHANGES COPYING INSTALL README REGISTER doc/*.pdf
@@ -51,6 +49,9 @@ BATCHEMACS=${EMACS} --batch --no-site-file -q
BASH_SCRIPTS = isar/interface bin/proofgeneral
PERL_SCRIPTS = lego/legotags coq/coqtags isar/isartags
# Scripts to edit path to PG
+# the scripts target (part of install) and the cleanscripts target
+# (part of clean) work only under the assumption that PG_SCRIPTS is a subset of
+# the union of BASH_SCRIPTS and PERL_SCRIPTS.
PG_SCRIPTS = bin/proofgeneral
# Scripts to install to bin directory
@@ -61,7 +62,7 @@ BIN_SCRIPTS = bin/proofgeneral lego/legotags coq/coqtags isar/isartags
# to output the compile-time load path and ELISP_DIRS so these are set
# just in that one place.
ERROR_ON_WARN = nil
-BYTECOMP = $(BATCHEMACS) -eval '(setq load-path (append (mapcar (lambda (d) (concat "${PWD}/" (symbol-name d))) (quote (${ELISP_DIRS}))) load-path))' -eval '(progn (require (quote bytecomp)) (require (quote mouse)) (require (quote tool-bar)) (require (quote fontset)) (setq byte-compile-warnings (remove (quote cl-functions) (remove (quote noruntime) byte-compile-warning-types))) (setq byte-compile-error-on-warn $(ERROR_ON_WARN)))' -f batch-byte-compile
+BYTECOMP = $(BATCHEMACS) -eval '(setq load-path (append (mapcar (lambda (d) (expand-file-name (symbol-name d))) (quote (${ELISP_DIRS}))) load-path))' -eval '(progn (require (quote bytecomp)) (require (quote mouse)) (require (quote tool-bar)) (require (quote fontset)) (setq byte-compile-warnings (remove (quote cl-functions) (remove (quote noruntime) byte-compile-warning-types))) (setq byte-compile-error-on-warn $(ERROR_ON_WARN)))' -f batch-byte-compile
EL=$(shell for f in $(ELISP_DIRS); do ls $$f/*.el; done)
ELC=$(EL:.el=.elc)
@@ -133,7 +134,7 @@ all: compile
##
## Remove generated targets
##
-clean: cleanpgscripts
+clean: cleanscripts
rm -f $(ELC) .\#* */.\#* */.autotest.log */.profile.log
(cd doc; $(MAKE) clean)
@@ -162,14 +163,16 @@ INFODIR=${PREFIX}/share/info
install: install-desktop install-elisp install-bin install-init
install-desktop:
- mkdir -p ${DESKTOP}/icons/hicolor/16x16
- cp etc/desktop/icons/16x16/proofgeneral.png ${DESKTOP}/icons/hicolor/16x16
- mkdir -p ${DESKTOP}/icons/hicolor/32x32
- cp etc/desktop/icons/32x32/proofgeneral.png ${DESKTOP}/icons/hicolor/32x32
- mkdir -p ${DESKTOP}/icons/hicolor/48x48
- cp etc/desktop/icons/48x48/proofgeneral.png ${DESKTOP}/icons/hicolor/48x48
- mkdir -p ${DESKTOP}/pixmaps
- cp etc/desktop/icons/48x48/proofgeneral.png ${DESKTOP}/pixmaps
+ mkdir -p ${DESKTOP}/icons/hicolor/16x16/apps
+ cp etc/desktop/icons/16x16/proofgeneral.png ${DESKTOP}/icons/hicolor/16x16/apps
+ mkdir -p ${DESKTOP}/icons/hicolor/32x32/apps
+ cp etc/desktop/icons/32x32/proofgeneral.png ${DESKTOP}/icons/hicolor/32x32/apps
+ mkdir -p ${DESKTOP}/icons/hicolor/48x48/apps
+ cp etc/desktop/icons/48x48/proofgeneral.png ${DESKTOP}/icons/hicolor/48x48/apps
+ mkdir -p ${DESKTOP}/icons/hicolor/64x64/apps
+ cp etc/desktop/icons/64x64/proofgeneral.png ${DESKTOP}/icons/hicolor/64x64/apps
+ mkdir -p ${DESKTOP}/icons/hicolor/128x128/apps
+ cp etc/desktop/icons/128x128/proofgeneral.png ${DESKTOP}/icons/hicolor/128x128/apps
mkdir -p ${DESKTOP}/applications
cp etc/desktop/proofgeneral.desktop ${DESKTOP}/applications
mkdir -p ${DESKTOP}/mime-info
@@ -232,48 +235,50 @@ doc.%: FORCE
##
## scripts: try to patch bash and perl scripts with correct paths
##
+.PHONY: scripts
scripts: bashscripts perlscripts pgscripts
+.PHONY: bashscripts
bashscripts:
- @(bash="`which bash`"; \
+ (bash="`which bash`"; \
if [ -z "$$bash" ]; then \
echo "Could not find bash - bash paths not checked" >&2; \
exit 0; \
fi; \
for i in $(BASH_SCRIPTS); do \
- sed "s|^#.*!.*/bin/bash.*$$|#!$$bash|" < $$i > .tmp \
- && cat .tmp > $$i; \
- done; \
- rm -f .tmp)
+ sed -i.orig "s|^#.*!.*/bin/bash.*$$|#!$$bash|" $$i; \
+ done)
+.PHONY: perlscripts
perlscripts:
- @(perl="`which perl`"; \
+ (perl="`which perl`"; \
if [ -z "$$perl" ]; then \
echo "Could not find perl - perl paths not checked" >&2; \
exit 0; \
fi; \
for i in $(PERL_SCRIPTS); do \
- sed "s|^#.*!.*/bin/perl.*$$|#!$$perl|" < $$i > .tmp \
- && cat .tmp > $$i; \
- done; \
- rm -f .tmp)
+ sed -i.orig "s|^#.*!.*/bin/perl.*$$|#!$$perl|" $$i; \
+ done)
# FIXME: this next edit is really for install case, shouldn't be made
# just when user types 'make'
-pgscripts:
- @(for i in $(PG_SCRIPTS); do \
- sed "s|PGHOMEDEFAULT=.*$$|PGHOMEDEFAULT=${DEST_ELISP}|" < $$i > .tmp \
- && cat .tmp > $$i; \
- done; \
- rm -f .tmp)
+.PHONY: pgscripts
+pgscripts: bashscripts perlscripts
+ (for i in $(PG_SCRIPTS); do \
+ sed -i.rm "s|PGHOMEDEFAULT=.*$$|PGHOMEDEFAULT=${DEST_ELISP}|" $$i; \
+ done)
# Set PGHOME path in scripts back to default location.
-cleanpgscripts:
- @(for i in $(PG_SCRIPTS); do \
- sed "s|PGHOMEDEFAULT=.*$$|PGHOMEDEFAULT=\$$HOME/ProofGeneral|" < $$i > .tmp \
- && cat .tmp > $$i; \
- done; \
- rm -f .tmp)
+.PHONY: cleanscripts
+cleanscripts:
+ (for i in $(PG_SCRIPTS) $(BASH_SCRIPTS) $(PERL_SCRIPTS); do \
+ if [ -f $$i.rm ] ; then \
+ rm -f $$i.rm; \
+ fi; \
+ if [ -f $$i.orig ] ; then \
+ mv -f $$i.orig $$i; \
+ fi; \
+ done)
##
## Include developer's makefile if it exists here.
diff --git a/Makefile.devel b/Makefile.devel
index a201231b..bba2efef 100644
--- a/Makefile.devel
+++ b/Makefile.devel
@@ -13,12 +13,12 @@
##
## make elisptidy - tidy up elisp files (run whitespace-cleanup)
##
-## make ChangeLog - make ChangeLog from CVS sources
+## make ChangeLog - make ChangeLog from git log
## make tags - update TAGS file for Elisp sources
## make autoloads - update autoloads
##
-## make tag - tag the CVS sources with CVS_RELEASENAME
-## make untag - remove tag CVS_RELEASENAME from the sources
+## make tag - tag the sources with GIT_RELEASENAME
+## make untag - remove tag GIT_RELEASENAME from the sources
## make dist - make a distribution from sources with above tag
## make rpm - make RPM packages based on etc/ProofGeneral.spec
## make pkg - make Emacs tar file packages (Tromey's package.el)
@@ -43,8 +43,8 @@
##
## Use 'make releaseclean' if giving up, to remove temp dirs.
##
-## NB: no facility to edit html to make a full release in this Makefile.
-## Edit download.html by hand, then run
+## NB: no facility to edit html to make a full release in this Makefile.
+## Edit download.html by hand, then run
##
## make releaseall VERSION=2.0
##
@@ -57,7 +57,7 @@
##
##
## $Id$
-##
+##
###########################################################################
## TODO: could include prerel tag in web pages, and link using -latest
@@ -89,13 +89,14 @@ DEVELOPERS=\
# PRERELEASE_PREFIX is used to match PRERELEASE_TAG in sed
# line in tag target below, which edits $(DOWNLOADHTML)
# The prereltag.txt is kept as a record in the distrib area
-# of the current pre-release version (currently not used explicitly
+# of the current pre-release version (currently not used explicitly
# anywhere for web pages/whatever).
-PRERELEASE_PREFIX=4\.3pre
-PRERELEASE_TAG=4.3pre$(shell date "+%y%m%d")
+PRERELEASE_PREFIX=4\.4\.1~pre
+PRERELEASE_TAG=4.4.1~pre
+### Formerly: PRERELEASE_TAG=4.4pre$(shell date "+%y%m%d")
PREREL_TAG_FILE=prereltag.txt
-# Path to web pages in repository, used for automatically
+# Path to web pages in repository, used for automatically
# updating with release information.
HTMLDIR=../web
DOWNLOADHTMLS=devel.html
@@ -123,14 +124,9 @@ VERSIONFILE=proof-site.el
# Full version number defaults to ordinary version number.
FULLVERSION=$(VERSION)
-# NB: CVS tags can't have points in them.
-# Substitute points for hyphens.
-CVS_VERSION=$(shell echo $(FULLVERSION) | sed 's/\./-/g')
-
-
# Name of tar file and RPM file.
RELEASENAME = $(NAME)-$(VERSION)
-CVS_RELEASENAME = Release-$(CVS_VERSION)
+GIT_RELEASENAME ?= v$(FULLVERSION)
# Where to release (i.e. copy) a new distribution to.
# This may be the final directory (local) or temporary directory.
@@ -140,16 +136,6 @@ RELEASEDIR = /tmp/proofgeneral-www
# How to make the release "live". (Could be "true" to do nothing).
GOLIVE=rsync -e ssh -auv $(RELEASEDIR)/* ssh.inf.ed.ac.uk:/group/project/proofgeneral/web/releases/
-
-CVSNAME = ProofGeneral
-
-# Remote commands to use CVS in server mode and install files.
-# With these settings the build can be done remotely.
-# CVSROOT = :pserver:da@cvs.inf.ed.ac.uk:/disk/cvs/proofgen
-# FIXME: this command causes an error on some recursive calls, e.g. to do
-# make clean in a non cvs directory.
-CVSROOT=$(shell cat CVS/Root)
-
# Emacs for batch compiling
BATCHEMACS=$(EMACS) -batch -q -no-site-file
@@ -159,10 +145,10 @@ EMACSFLAGS=-q -no-site-file
# GNU version of tar, please
TAR=tar
-# Files not to include the distribution area or tarball
+# Files not to include the distribution area or tarball
UNFINISHED_ELISP=
-ETC_FILES=etc/lego etc/coq etc/demoisa etc/isa etc/isar etc/lego etc/patches etc/*.txt
-NONDISTFILES=.cvsignore */.cvsignore Makefile.devel etc/trac etc/testsuite $(UNFINISHED_ELISP) $(ETC_FILES)
+ETC_FILES=etc/lego etc/coq etc/demoisa etc/isa etc/isar etc/lego etc/patches etc/*.txt
+NONDISTFILES=.gitignore */.gitignore Makefile.devel etc/trac etc/testsuite $(UNFINISHED_ELISP) $(ETC_FILES)
DOCDISTFILES=ProofGeneral.info PG-adapting.info
# Files not to include in the ordinary distribution tarball, but left
@@ -180,7 +166,7 @@ RELEASENAMETGZ = $(RELEASENAME).tgz
RELEASENAMERPM = $(RELEASENAME)-1.noarch.rpm
RELEASENAMEDMG = $(RELEASENAME).dmg
-# Where to install a distribution
+# Where to install a distribution
DISTINSTALLDIR=/usr/local/share/elisp/proofgeneral
SUBDIRS=$(ELISP_DIRS) etc doc images
@@ -191,7 +177,7 @@ FORCE:
# Targets to pre-compile for distribution
# Warning: elisp files are incompatible across emacs versions!
-alldist: distcompile distdocs
+alldist: distcompile distdocs
############################################################
@@ -211,37 +197,30 @@ tags: $(EL) $(TAGS_EXTRAS)
run.%:
$(EMACS) $(EMACSFLAGS) -l generic/proof-site.el -eval '(proof-visit-example-file "$*")'
-test.%:
+test.%:
if [ -f "$*/$*-autotest.el" ]; then if $(EMACS) $(EMACSFLAGS) -l generic/proof-site.el $*/$*-autotest.el -f eval-current-buffer; then echo "Autotests for $* run successfully on `date`"; else cat $*/.autotest.log; echo "Autotests for $* ran with failures on `date`"; exit 1; fi; fi
-profile.%:
+profile.%:
if [ -f "$*/$*-profiling.el" ]; then if $(EMACS) $(EMACSFLAGS) -l generic/proof-site.el $*/$*-profiling.el -f eval-current-buffer; then echo "Profiling for $* run successfully on `date`"; else echo "Profiling for $* ran with failures on `date`"; exit 1; fi; cat $*/.profile.log; fi
-testall.%:
+testall.%:
for prover in ${PROVERS}; do $(MAKE) test.$$prover EMACS=$*; done
############################################################
#
-# Add recent messages to ChangeLog. CVSROOT must be set correctly.
+# Add recent messages to ChangeLog.
#
# FIXME: this duplicates entries made on the same day: we could do
# with a way of cleaning the last day from the ChangeLog.
#
-# Debian default path
-RCS2LOG=/usr/share/cvs/contrib/rcs2log
ChangeLog: FORCE
- $(RCS2LOG) -h "inf.ed.ac.uk" $(DEVELOPERS) -r -b -i 4 | sed 's|/home/proofgen/src/ProofGeneral/||g' > ChangeLog.prefix
- if [ -f ChangeLog ]; then mv ChangeLog ChangeLog.old; else echo > ChangeLog.old; fi
- cat ChangeLog.prefix ChangeLog.old | sed 's|/disk/cvs/proofgen/ProofGeneral/||g' > ChangeLog
- rm ChangeLog.prefix ChangeLog.old
+ git log --pretty="format:%ad %s" --date=short > ChangeLog
-logupdate: ChangeLog.gz
- cvs commit -m"Updated" ChangeLog.gz
############################################################
#
-# Clean up intermediate files
+# Clean up intermediate files
#
devclean: FORCE
@echo "***** CLEANING UP INTERMEDIATE FILES ****"
@@ -252,23 +231,14 @@ devclean: FORCE
############################################################
#
-# Clean up intermediate files, all generated files
-# and Emacs backups, CVS temps
+# Clean up intermediate files, all generated files
+# and Emacs backups.
#
distclean: devclean clean
@echo "***** CLEANING UP ALL JUNK FILES ****"
find . \( -name '*~' -o -name '#*#' -o -name '\.\#*' -o -name '\.*\.log' \) -print | xargs rm -f
(cd doc; $(MAKE) distclean)
-############################################################
-#
-# Clean up all non-cvs files.
-#
-cvsclean: clean
- @echo "***** CLEANING UP ALL NON-CVS FILES ****"
-# rm -rf $(FILES_NONCVS)
- (cd doc; $(MAKE) distclean)
-
############################################################
#
@@ -308,51 +278,49 @@ distcompile: FORCE
############################################################
##
-## tag: tag the CVS sources of working directory with CVS_RELEASENAME,
-## set version stamp in proof-site.el and ProofGeneral.spec
+## tag: tag the sources of working directory with GIT_RELEASENAME,
+## set version stamp in proof-site.el and ProofGeneral.spec
## to VERSION, and edit $(DOWNLOADHTMLS)
## if VERSION matches PRERELEASE_TAG.
##
-tag:
+tag:
@echo "*************************************************"
- @echo " Tagging sources... (you must rerun if CVS source dirty)"
+ @echo " Tagging sources... "
@echo "*************************************************"
-# Update the sources, this is almost always what we want to do.
- if [ -z "$(NOCVS)" ] && [ -n "`cvs -n -q update -Pd | grep '^[MC] '`" ]; then cvs update -Pd; exit 1; fi
+ if [ -z "$(NOCVS)" ]; then git fetch origin && git log --exit-code master...origin/master || exit 1; fi
# Update version in proof-site.el
- (cd generic; mv $(VERSIONFILE) $(VERSIONFILE).old; sed -e 's/defconst $(VERSIONVARIABLE) \".*\"/defconst $(VERSIONVARIABLE) \"Proof General Version $(FULLVERSION). Released by da$(DATEMSG).\"/g' $(VERSIONFILE).old > $(VERSIONFILE); rm $(VERSIONFILE).old)
+ (cd generic; mv $(VERSIONFILE) $(VERSIONFILE).old; sed -e 's/defconst $(VERSIONVARIABLE) \".*\"/defconst $(VERSIONVARIABLE) \"Proof General Version $(FULLVERSION).\"/g' $(VERSIONFILE).old > $(VERSIONFILE); rm $(VERSIONFILE).old)
# Tag ProofGeneral.spec
(cd etc; mv ProofGeneral.spec ProofGeneral.spec.old; sed -e 's/Version:.*$$/Version: $(VERSION)/g' ProofGeneral.spec.old > ProofGeneral.spec; rm ProofGeneral.spec.old)
# Edit $(DOWNLOADHTMLS) only for prereleases.
# Careful: the sed command below relies on previous value of PRERELEASE_TAG.
- if [ $(PRERELEASE_TAG) = $(VERSION) ]; then \
- (cd $(HTMLDIR); \
- for f in $(DOWNLOADHTMLS); do \
- mv $$f $$f.old; \
- sed -e 's|ProofGeneral\([emacselc-]*\)-$(PRERELEASE_PREFIX)......|ProofGeneral\1-$(PRERELEASE_TAG)|g' $$f.old > $$f; \
- rm $$f.old; \
- done) \
- fi
- if [ -z "$(NOCVS)" ]; then cvs commit -m"Set version tag for new release." generic/$(VERSIONFILE) etc/ProofGeneral.spec; (cd $(HTMLDIR); cvs commit -m"Set version tag for new release." $(DOWNLOADHTMLS)); fi
- if [ -z "$(NOCVS)" ]; then cvs tag -cF "$(CVS_RELEASENAME)"; fi
+# if [ $(PRERELEASE_TAG) = $(VERSION) ]; then \
+# (cd $(HTMLDIR); \
+# for f in $(DOWNLOADHTMLS); do \
+# mv $$f $$f.old; \
+# sed -e 's|ProofGeneral\([emacselc-]*\)-$(PRERELEASE_PREFIX)......|ProofGeneral\1-$(PRERELEASE_TAG)|g' $$f.old > $$f; \
+# rm $$f.old; \
+# done) \
+# fi
+ if [ -z "$(NOCVS)" ]; then git add generic/$(VERSIONFILE) etc/ProofGeneral.spec && git commit -m"Set version tag for new release." ; fi
+ if [ -z "$(NOCVS)" ]; then git tag -a "$(GIT_RELEASENAME)"; fi
############################################################
##
-## untag: Remove the CVS_RELEASENAME tag from the CVS sources.
+## untag: Remove the GIT_RELEASENAME tag from the sources.
##
untag:
- cvs tag -d "$(CVS_RELEASENAME)"
+ git tag -d "$(GIT_RELEASENAME)"
############################################################
##
## dist: make a distribution in DISTBUILDIR from CVS sources
-## Builds for user-distribution, from sources tagged
-## with CVS_RELEASENAME.
+## Builds for user-distribution, from sources tagged
+## with GIT_RELEASENAME.
## Moves html files to parent directory, removes
## non-distributed files.
-## (NB: lines in subshells here inherit CVSROOT settings from above)
-##
+##
cvsexport:
@echo "*************************************************"
@@ -361,8 +329,7 @@ cvsexport:
rm -rf $(DISTBUILDIR)
mkdir -p $(DISTBUILDIR)
if [ -z "$(NOCVS)" ]; then \
- (cd $(DISTBUILDIR); \
- cvs -d $(CVSROOT) export -kv -r "${CVS_RELEASENAME}" -d ${RELEASENAME} ${CVSNAME}) \
+ git archive --format=tar --prefix=$(RELEASENAME)/ $(GIT_RELEASENAME) | (cd "$(DISTBUILDIR)" && tar xf -) \
else \
mkdir -p $(DISTBUILDIR)/$(RELEASENAME); \
cp -pr . $(DISTBUILDIR)/$(RELEASENAME); \
@@ -389,7 +356,7 @@ dist: cvsexport
-(cd $(DISTBUILDIR); ls $(IGNOREDFILES) > ignoredfiles; echo ignoredfiles >> ignoredfiles)
# link the long name to short name for convenience of user
(cd $(DISTBUILDIR); ln -sf $(RELEASENAME) $(NAME))
- $(TAR) cvzf $(DISTBUILDIR)/$(RELEASENAMETGZ) --directory $(DISTBUILDIR) --exclude-from $(DISTBUILDIR)/ignoredfiles $(RELEASENAME) $(NAME)
+ $(TAR) cvzf $(DISTBUILDIR)/$(RELEASENAMETGZ) --directory $(DISTBUILDIR) --exclude-from $(DISTBUILDIR)/ignoredfiles $(RELEASENAME) $(NAME)
# remove temporary files made for tar/zip only
(cd $(DISTBUILDIR); rm -f ignoredfiles $(NAME))
@echo "*************************************************"
@@ -400,12 +367,12 @@ dist: cvsexport
############################################################
##
## release:
-## tag the CVS sources, and make a distribution.
+## tag the sources, and make a distribution.
## Then install the distribution in RELEASEDIR
## WARNING: RELEASEDIR is not cleaned except to remove
## links, but files there with same names will be overwritten.
##
-release: check distclean tag dist
+release: check distclean tag dist
@echo "*************************************************"
@echo " Making release (installing tarball distributions)."
@echo "*************************************************"
@@ -424,16 +391,16 @@ release: check distclean tag dist
############################################################
##
## rpm:
-## Build an RPM binary package from the recently made distribution
+## Build an RPM binary package from the recently made distribution
## using the tarball. (Any user could do this)
##
-##
+##
# Temporary RPM topdir for building packages as non-root user.
RPMTOPDIR=/tmp/$(NAME)-rpm
RPMBUILD=rpmbuild --define '_topdir $(RPMTOPDIR)'
-rpm:
+rpm:
rm -rf $(RPMTOPDIR)
mkdir -p $(RPMTOPDIR)/RPMS
mkdir -p $(RPMTOPDIR)/SPECS
@@ -446,8 +413,8 @@ rpm:
##
## pkg:
## Build an Emacs .tar file package
-##
-PKGMOVES=doc/dir doc/ProofGeneral.info doc/PG-adapting.info
+##
+PKGMOVES=doc/dir doc/ProofGeneral.info doc/PG-adapting.info
PKGDELETES=obsolete etc doc
# Emacs package version is fussy about non-numbers in version, have to make version
# from date.
@@ -465,7 +432,7 @@ pkg: cvsexport
##
## rpmrelease:
## Build and install RPM package into RELEASEDIR.
-##
+##
rpmrelease: rpm
cp -pf $(RPMTOPDIR)/RPMS/noarch/* $(RELEASEDIR)
@@ -475,9 +442,9 @@ rpmrelease: rpm
## Build (on Linux) a Mac OS X dmg disk image file
## This requires sudo powers for mounting, and
## (on Ubuntu), packages hfsplus and hfsprogs
-##
+##
DMGBUILD=$(DISTBUILDIR)/dmg
-dmg:
+dmg:
rm -rf $(DMGBUILD)
mkdir -p $(DMGBUILD)
dd if=/dev/zero of=$(DISTBUILDIR)/$(RELEASENAMEDMG) bs=1 count=0 seek=16M
@@ -510,23 +477,23 @@ releaseclean:
## fakereleaseall:
## Do everything, but don't access CVS. Just for
## testing on non-live system, really.
-##
-##
-fakereleaseall:
- $(MAKE) -f Makefile.devel release releaseclean NOCVS="no"
+## FIXME: does this still make sense now that git is used version control?
+##
+fakereleaseall:
+ $(MAKE) -f Makefile.devel release releaseclean NOCVS="no"
############################################################
##
## releaseall:
## Do everything! (EXCEPT: ChangeLog.gz update)
-##
+##
releaseall: release releaseclean golive
############################################################
##
## golive:
## Execute golive command.
-##
+##
golive:
$(GOLIVE)
cd $(HTMLDIR); for f in $(DOWNLOADHTMLS); do $(MAKE) pub.$$f; done;
@@ -539,8 +506,8 @@ golive:
## Do everything for a final release based on a pre-release.
## Except editing download file.
##
-releasefinal: release releaseclean
-# Link the latest version
+releasefinal: release releaseclean
+# Link the latest version
# 31.5.13: remove this link from tar file, it is unconventional
# (cd $(DISTBUILDIR); rm -f $(NAME); ln -sf $(RELEASENAME) $(NAME))
@@ -549,7 +516,7 @@ releasefinal: release releaseclean
##
## distinstall:
## Do everything for a local release.
-##
+##
distall: distclean tag dist distinstall releaseclean
@@ -572,7 +539,7 @@ distinstall:
############################################################
#
# links:
-#
+#
# Make some handy links for developers.
#
links:
@@ -581,9 +548,9 @@ links:
#################################################################
##
-## Reporting Makefile settings.
+## Reporting Makefile settings.
##
-## Useful for debugging Makefile
+## Useful for debugging Makefile
show.%:
@echo $($*)
diff --git a/Makefile.travis b/Makefile.travis
new file mode 100644
index 00000000..c3711e59
--- /dev/null
+++ b/Makefile.travis
@@ -0,0 +1,29 @@
+VERSIONS = 21.4a 22.1 22.2 22.3 23.1 23.2b 23.3b 23.4 24.1 24.2 24.3 24.4 24.5
+STABLE_TARGETS = $(addprefix prepare-emacs-,$(VERSIONS))
+
+.PHONY: prepare-emacs-24 prepare-emacs-git $(STABLE_TARGETS) \
+ prepare-emacs before_install install script
+
+$(STABLE_TARGETS):
+ curl -o /tmp/$(EMACS_TARGET).tar.gz "https://ftp.gnu.org/gnu/emacs/$(EMACS_TARGET).tar.gz"
+ mkdir /tmp/emacs-tmp
+ tar xzf /tmp/$(EMACS_TARGET).tar.gz -C /tmp/emacs-tmp
+ mv /tmp/emacs-tmp/* "/tmp/emacs" || (ls /tmp/*; exit 1)
+
+prepare-emacs-git:
+ git clone --depth=1 'git://git.savannah.gnu.org/emacs.git' --branch emacs-25 /tmp/emacs
+ cd /tmp/emacs && ./autogen.sh
+
+prepare-emacs: prepare-$(EMACS_TARGET)
+ cd /tmp/emacs && ./configure --prefix="$(HOME)" --without-all --with-x-toolkit=no --without-x --with-xml2 && make -j2 install
+
+before_install: prepare-emacs
+
+install:
+
+script:
+ make
+
+# Local Variables:
+# indent-tabs-mode: t
+# End:
diff --git a/README b/README
deleted file mode 100644
index d60f4d78..00000000
--- a/README
+++ /dev/null
@@ -1,48 +0,0 @@
- Proof General --- Organize your proofs!
-
-Proof General is a generic Emacs interface for proof assistants.
-The aim of the Proof General project is to provide a powerful, generic
-environment for using interactive proof assistants.
-
-This is version 4.2 (prerelease) of Proof General. See About for exact version.
-It is built for Emacs 23.3.
-
-The code *may* also work with previous emacs versions, back as far as
-Emacs 22.3. But you will need to regenerated the byte-compiled files
-with "make clean; make compile". Backward compatibility cannot be
-guaranteed.
-
-See
- INSTALL for installation details.
- COPYING for license details.
- COMPATIBILITY for version compatibility information.
- REGISTER for registration information (please register).
- FAQ, doc/ for documentation of Proof General.
-
- <prover>/README for additional prover-specific notes
-
-Links:
-
- Bug/feature reports: http://proofgeneral.inf.ed.ac.uk/trac
- Wiki: http://proofgeneral.inf.ed.ac.uk/wiki
- Lists: http://proofgeneral.inf.ed.ac.uk/mailinglist
-
-Supported proof assistants: Coq, Isabelle, LEGO, PhoX
-Experimental (less useful): CCC,ACL2,HOL98,Hol-Light,Lambda-Clam,Shell,Twelf
- Obsolete instances: Demoisa,Lambda-Clam,Plastic
-
-A few example proofs are included in each prover subdirectory. The
-"root2" proofs of the irrationality of the square root of 2 were
-proofs written for Freek Wiedijk's challenge in his comparison of
-different theorem provers, see http://www.cs.kun.nl/~freek/comparison/.
-Those proof scripts are copyright by their named authors.
-(NB: most of these have rusted)
-
-Check BUGS files for some static problems and issues. Please report
-new bugs on the Trac site at http://proofgeneral.inf.ed.ac.uk/trac.
-
-For the latest news and downloads, visit Proof General on the web
-at: http://proofgeneral.inf.ed.ac.uk
-
-David Aspinall <da+pg-feedback@inf.ed.ac.uk>
-October 2011.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..77dddcf1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,59 @@
+# Proof General — Organize your proofs!
+
+[![Build Status](https://travis-ci.org/ProofGeneral/PG.svg?branch=master)](https://travis-ci.org/ProofGeneral/PG)
+
+Proof General is a generic Emacs interface for proof assistants.
+The aim of the Proof General project is to provide a powerful, generic
+environment for using interactive proof assistants.
+
+This is version 4.4.1~pre of Proof General.
+
+## Setup
+
+Remove old versions of Proof General, then download and install the new release from GitHub:
+
+```sh
+git clone https://github.com/ProofGeneral/PG ~/.emacs.d/lisp/PG
+cd ~/.emacs.d/lisp/PG
+make
+```
+
+Then add the following to your `.emacs`:
+
+```elisp
+;; Open .v files with Proof General's Coq mode
+(load "~/.emacs.d/lisp/PG/generic/proof-site")
+```
+
+If Proof General complains about a version mismatch, make sure that the shell's `emacs` is indeed your usual Emacs. If not, run the Makefile again with an explicit path to Emacs. On macOS in particular you'll probably need something like
+
+```sh
+make clean; make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
+```
+
+## More info
+
+See:
+
+* [INSTALL](INSTALL) for installation details
+* [COPYING](COPYING) for license details
+* [COMPATIBILITY](COMPATIBILITY) for version compatibility information
+* [FAQ.md](FAQ.md) for frequently asked questions
+* [coq/README](coq/README) for additional notes specific to the Coq prover
+
+Links:
+
+* [https://proofgeneral.github.io/doc](https://proofgeneral.github.io/doc) for online documentation of Proof General
+* [http://proofgeneral.inf.ed.ac.uk/mailinglist](http://proofgeneral.inf.ed.ac.uk/mailinglist) for mailing list information
+
+Supported proof assistants:
+
+* Full support for latest versions of: [Coq](https://coq.inria.fr/)
+* Support for previous versions of:
+ [Isabelle](http://www.cl.cam.ac.uk/research/hvg/Isabelle/),
+ [LEGO](http://www.dcs.ed.ac.uk/home/lego),
+ [PhoX](http://www.lama.univ-savoie.fr/~RAFFALLI/phox.html)
+* Experimental (less useful): CCC, ACL2, HOL98, Hol-Light, Lambda-Clam, Shell, Twelf
+* Obsolete instances: Demoisa, Lambda-Clam, Plastic
+
+A few example proofs are included in each prover subdirectory.
diff --git a/TAGS b/TAGS
deleted file mode 100644
index 732d91b4..00000000
--- a/TAGS
+++ /dev/null
@@ -1,3081 +0,0 @@
-
-ccc/ccc.el,87
-(defvar ccc-keywords 17,587
-(defvar ccc-tactics 18,613
-(defvar ccc-tacticals 19,638
-
-coq/coq-abbrev.el,590
-(defun holes-show-doc 12,313
-(defun coq-local-vars-list-show-doc 16,390
-(defconst coq-tactics-menu21,490
-(defconst coq-tactics-abbrev-table26,746
-(defconst coq-tacticals-menu29,863
-(defconst coq-tacticals-abbrev-table33,972
-(defconst coq-commands-menu36,1063
-(defconst coq-commands-abbrev-table43,1286
-(defconst coq-terms-menu46,1375
-(defconst coq-terms-abbrev-table51,1513
-(defun coq-install-abbrevs 58,1707
-(defconst coq-menu-common-entries81,2663
-(defpgdefault menu-entries182,7261
-(defpgdefault help-menu-entries216,8368
-(defpgdefault other-buffers-menu-entries 220,8498
-
-coq/coq-compile-common.el,2047
-(defun get-coq-library-directory 31,821
-(defconst coq-library-directory 37,1008
-(defcustom coq-dependency-analyzer40,1135
-(defcustom coq-compiler46,1275
-(defun coq-par-enable 60,1800
-(defun coq-par-disable 70,2161
-(defun coq-seq-enable 80,2541
-(defun coq-seq-disable 86,2747
-(defun coq-load-path-safep 95,2998
-(defun coq-switch-compilation-method 115,3594
-(defun number-of-cpus 124,3829
-(defvar coq-internal-max-jobs 138,4170
-(defun coq-max-jobs-setter 141,4279
-(defgroup coq-auto-compile 157,4741
-(defpacustom compile-before-require 162,4892
-(defpacustom compile-parallel-in-background 174,5384
-(defcustom coq-max-background-compilation-jobs 195,6275
-(defcustom coq-compile-command 209,6964
-(defconst coq-compile-substitution-list239,8243
-(defcustom coq-load-path 259,9164
-(defcustom coq-compile-auto-save 296,10909
-(defcustom coq-lock-ancestors 321,11966
-(defpacustom confirm-external-compilation 330,12287
-(defcustom coq-load-path-include-current 339,12594
-(defcustom coq-compile-ignored-directories 348,12912
-(defcustom coq-compile-ignore-library-directory 361,13544
-(defcustom coq-coqdep-error-regexp373,14032
-(defconst coq-require-command-regexp390,14811
-(defconst coq-require-id-regexp397,15168
-(defvar coq-compile-history 405,15602
-(defvar coq-compile-response-buffer 408,15686
-(defvar coq-debug-auto-compilation 412,15821
-(defun time-less-or-equal 418,15930
-(defun coq-max-dep-mod-time 426,16268
-(defun coq-option-of-load-path-entry 449,17073
-(defun coq-include-options 463,17588
-(defun coq-prog-args 487,18607
-(defun coq-compile-ignore-file 496,18880
-(defun coq-library-src-of-obj-file 522,19802
-(defun coq-unlock-ancestor 531,20126
-(defun coq-unlock-all-ancestors-of-span 538,20421
-(defun coq-init-compile-response-buffer 546,20706
-(defun coq-display-compile-response-buffer 569,21778
-(defvar coq-compile-buffer-with-current-require582,22297
-(defun coq-compile-save-buffer-filter 588,22533
-(defun coq-compile-save-some-buffers 599,22959
-(defun coq-switch-buffer-kill-proof-shell 624,23913
-
-coq/coq-db.el,678
-(defconst coq-syntax-db 24,596
-(defun coq-insert-from-db 70,2319
-(defun coq-build-regexp-list-from-db 88,3050
-(defun coq-build-opt-regexp-from-db 107,3856
-(defun max-length-db 126,4677
-(defun coq-build-menu-from-db-internal 138,4952
-(defun coq-build-title-menu 175,6493
-(defun coq-sort-menu-entries 184,6861
-(defun coq-build-menu-from-db 190,6991
-(defcustom coq-holes-minor-mode 212,7830
-(defun coq-build-abbrev-table-from-db 218,7974
-(defun filter-state-preserving 237,8600
-(defun filter-state-changing 242,8754
-(defface coq-solve-tactics-face249,8975
-(defface coq-cheat-face258,9266
-(defconst coq-solve-tactics-face 266,9515
-(defconst coq-cheat-face 270,9679
-
-coq/coq.el,9459
-(defcustom coq-prog-name63,2161
-(defcustom coq-translate-to-v8 82,3012
-(defun coq-build-prog-args 87,3127
-(defcustom coq-use-makefile 97,3450
-(defcustom coq-default-undo-limit 103,3622
-(defconst coq-shell-init-cmd108,3750
-(defcustom coq-prog-env 117,4077
-(defconst coq-shell-restart-cmd 125,4326
-(defvar coq-shell-prompt-pattern127,4380
-(defvar coq-shell-cd 135,4683
-(defvar coq-shell-proof-completed-regexp 139,4843
-(defvar coq-goal-regexp142,5058
-(defcustom coq-tags 146,5149
-(defconst coq-interrupt-regexp 151,5297
-(defcustom coq-www-home-page 154,5390
-(defcustom coq-end-goals-regexp-show-subgoals 159,5497
-(defcustom coq-end-goals-regexp-hide-subgoals166,5781
-(defgroup coq-proof-tree 177,6113
-(defcustom coq-proof-tree-ignored-commands-regexp185,6476
-(defcustom coq-navigation-command-regexp194,6870
-(defcustom coq-proof-tree-cheating-regexp201,7124
-(defcustom coq-proof-tree-new-layer-command-regexp207,7264
-(defcustom coq-proof-tree-current-goal-regexp213,7470
-(defcustom coq-proof-tree-update-goal-regexp221,7806
-(defcustom coq-proof-tree-additional-subgoal-ID-regexp228,8040
-(defcustom coq-proof-tree-existential-regexp 234,8238
-(defcustom coq-proof-tree-instantiated-existential-regexp239,8392
-(defcustom coq-proof-tree-existentials-state-start-regexp245,8612
-(defcustom coq-proof-tree-existentials-state-end-regexp 251,8802
-(defcustom coq-proof-tree-branch-finished-regexp256,8971
-(defvar coq-outline-regexp272,9472
-(defvar coq-outline-heading-end-regexp 281,9746
-(defvar coq-shell-outline-regexp 283,9800
-(defvar coq-shell-outline-heading-end-regexp 284,9850
-(defconst coq-state-preserving-tactics-regexp287,9914
-(defconst coq-state-changing-commands-regexp289,10016
-(defconst coq-state-preserving-commands-regexp291,10125
-(defconst coq-commands-regexp293,10238
-(defvar coq-retractable-instruct-regexp295,10317
-(defvar coq-non-retractable-instruct-regexp297,10409
-(defcustom coq-use-smie 329,11105
-(defconst coq-script-command-end-regexp 354,11943
-(defun coq-script-parse-function 363,12372
-(defun coq-set-undo-limit 370,12598
-(defun build-list-id-from-string 376,12730
-(defun coq-last-prompt-info 385,13205
-(defun coq-last-prompt-info-safe 403,14099
-(defvar coq-last-but-one-statenum 411,14452
-(defvar coq-last-but-one-proofnum 418,14749
-(defvar coq-last-but-one-proofstack 421,14847
-(defsubst coq-get-span-statenum 424,14957
-(defsubst coq-get-span-proofnum 428,15072
-(defsubst coq-get-span-proofstack 432,15187
-(defsubst coq-set-span-statenum 436,15331
-(defsubst coq-get-span-goalcmd 440,15462
-(defsubst coq-set-span-goalcmd 444,15576
-(defsubst coq-set-span-proofnum 448,15706
-(defsubst coq-set-span-proofstack 452,15837
-(defsubst proof-last-locked-span 456,15997
-(defun proof-clone-buffer 460,16131
-(defun proof-store-buffer-win 474,16668
-(defun proof-store-response-win 485,17161
-(defun proof-store-goals-win 489,17288
-(defun coq-set-state-infos 501,17820
-(defun count-not-intersection 539,19910
-(defun coq-find-and-forget 569,21162
-(defvar coq-current-goal 596,22467
-(defun coq-goal-hyp 599,22532
-(defun coq-state-preserving-p 612,23012
-(defun coq-hide-additional-subgoals-switch 622,23306
-(defconst notation-print-kinds-table634,23647
-(defun coq-PrintScope 638,23814
-(defun coq-remove-trailing-dot 656,24363
-(defun coq-id-at-point 664,24600
-(defun coq-guess-or-ask-for-string 678,25163
-(defun coq-ask-do 697,25778
-(defun coq-flag-is-on-p 706,26161
-(defun coq-command-with-set-unset 712,26368
-(defun coq-ask-do-set-unset 723,27018
-(defun coq-ask-do-show-implicits 733,27548
-(defun coq-ask-do-show-all 741,27908
-(defsubst coq-put-into-brackets 762,28589
-(defsubst coq-put-into-quotes 765,28650
-(defun coq-SearchIsos 768,28709
-(defun coq-SearchConstant 776,28948
-(defun coq-Searchregexp 780,29041
-(defun coq-SearchRewrite 786,29182
-(defun coq-SearchAbout 790,29279
-(defun coq-Print 796,29422
-(defun coq-Print-with-implicits 804,29692
-(defun coq-Print-with-all 809,29846
-(defun coq-About 814,29988
-(defun coq-About-with-implicits 821,30195
-(defun coq-About-with-all 826,30344
-(defun coq-LocateConstant 832,30482
-(defun coq-LocateLibrary 837,30585
-(defun coq-LocateNotation 842,30702
-(defun coq-Pwd 850,30933
-(defun coq-Inspect 855,31057
-(defun coq-PrintSection(859,31157
-(defun coq-Print-implicit 863,31250
-(defun coq-Check 868,31401
-(defun coq-Check-show-implicits 876,31655
-(defun coq-Check-show-all 881,31793
-(defun coq-get-response-string-at 886,31919
-(defun coq-Show 900,32509
-(defun coq-Show-with-implicits 930,33917
-(defun coq-Show-with-all 935,34073
-(defun coq-Compile 962,35450
-(defun coq-guess-command-line 974,35775
-(defpacustom use-project-file 1012,37560
-(defpacustom project-filename 1022,38036
-(defun coq-find-project-file 1039,38775
-(defconst coq-load-path--R-regexp1055,39627
-(defconst coq-load-path--I-regexp1058,39746
-(defconst coq-prog-args-regexp1063,39952
-(defun coq-read-option-from-project-file 1066,40062
-(defun coq-search-load-path 1091,41273
-(defun coq-search-prog-args 1101,41705
-(defun coq-load-project-file 1108,41911
-(defun coq-local-variables-if-enabled 1134,43305
-(defun coq-mode-config 1171,44627
-(defun coq-shell-mode-config 1284,48815
-(defun coq-goals-mode-config 1377,52762
-(defun coq-response-config 1384,53006
-(defpacustom hide-additional-subgoals 1407,53723
-(defpacustom printing-depth 1428,54390
-(defpacustom undo-depth 1433,54551
-(defpacustom time-commands 1438,54717
-(defun coq-proof-tree-get-proof-info 1448,54922
-(defun coq-extract-instantiated-existentials 1458,55310
-(defun coq-show-sequent-command 1467,55702
-(defun coq-proof-tree-get-new-subgoals 1471,55856
-(defun coq-find-begin-of-unfinished-proof 1515,57981
-(defun coq-proof-tree-find-undo-position 1533,58815
-(defun coq-preprocessing 1553,59556
-(defun coq-fake-constant-markup 1567,60011
-(defun coq-create-span-menu 1583,60616
-(defconst module-kinds-table1601,61129
-(defconst modtype-kinds-table1605,61278
-(defun coq-postfix-.v-p 1609,61407
-(defun coq-directories-files 1612,61468
-(defun coq-remove-dot-v-extension 1618,61696
-(defun coq-load-path-to-paths 1621,61757
-(defun coq-build-accessible-modules-list 1624,61836
-(defun coq-insert-section-or-module 1631,62153
-(defconst reqkinds-kinds-table1653,63033
-(defun coq-insert-requires 1657,63190
-(defun coq-end-Section 1672,63770
-(defun coq-insert-intros 1690,64348
-(defvar coq-commands-accepting-as 1703,64880
-(defvar coq-last-input-action 1705,64979
-(defun coq-insert-infoH 1711,65195
-(defun coq-auto-insert-as 1725,65860
-(defpacustom auto-insert-as 1735,66274
-(defun coq-tactic-already-has-an-as-close(1742,66509
-(defun coq-insert-as 1757,67274
-(defun coq-insert-as-in-region 1797,69418
-(defun coq-insert-match 1808,69699
-(defun coq-insert-solve-tactic 1837,70868
-(defun coq-insert-tactic 1843,71119
-(defun coq-insert-tactical 1849,71321
-(defun coq-insert-command 1855,71552
-(defun coq-insert-term 1860,71717
-(define-key coq-keymap 1866,71900
-(define-key coq-keymap 1867,71958
-(define-key coq-keymap 1868,72015
-(define-key coq-keymap 1869,72084
-(define-key coq-keymap 1870,72140
-(define-key coq-keymap 1871,72198
-(define-key coq-keymap 1872,72248
-(define-key coq-keymap 1873,72321
-(define-key coq-keymap 1874,72378
-(define-key coq-keymap 1875,72441
-(define-key coq-keymap 1878,72519
-(define-key coq-keymap 1879,72568
-(define-key coq-keymap 1880,72623
-(define-key coq-keymap 1881,72675
-(define-key coq-keymap 1882,72730
-(define-key coq-keymap 1883,72780
-(define-key coq-keymap 1884,72830
-(define-key coq-keymap 1885,72886
-(define-key coq-keymap 1886,72936
-(define-key coq-keymap 1887,72980
-(define-key coq-keymap 1888,73039
-(define-key coq-goals-mode-map 1896,73307
-(define-key coq-goals-mode-map 1897,73389
-(define-key coq-goals-mode-map 1898,73471
-(define-key coq-goals-mode-map 1899,73558
-(define-key coq-goals-mode-map 1900,73640
-(define-key coq-goals-mode-map 1901,73728
-(define-key coq-goals-mode-map 1902,73809
-(define-key coq-goals-mode-map 1903,73896
-(define-key coq-goals-mode-map 1904,73980
-(define-key coq-response-mode-map 1907,74058
-(define-key coq-response-mode-map 1908,74143
-(define-key coq-response-mode-map 1909,74228
-(define-key coq-response-mode-map 1910,74318
-(define-key coq-response-mode-map 1911,74403
-(define-key coq-response-mode-map 1912,74494
-(define-key coq-response-mode-map 1913,74578
-(define-key coq-response-mode-map 1914,74678
-(define-key coq-response-mode-map 1915,74775
-(defvar last-coq-error-location 1922,74925
-(defun coq-get-last-error-location 1930,75309
-(defun coq-highlight-error 1980,77872
-(defun coq-highlight-error-hook 2008,78953
-(defun coq-first-word-before 2018,79170
-(defun coq-get-from-to-paren 2028,79501
-(defun coq-show-first-goal 2041,79907
-(defvar coq-modeline-string2 2057,80572
-(defvar coq-modeline-string1 2058,80606
-(defvar coq-modeline-string0 2059,80640
-(defun coq-build-subgoals-string 2060,80681
-(defun coq-update-minor-mode-alist 2066,80865
-(defun is-not-split-vertic 2100,82434
-(defun coq-optimise-resp-windows 2114,83227
-(defcustom coq-double-hit-enable 2154,85054
-(defadvice proof-electric-terminator-enable 2173,85840
-(defvar coq-double-hit-delay 2181,86218
-(defvar coq-double-hit-timer 2184,86333
-(defvar coq-double-hit-hot 2187,86413
-(defun coq-unset-double-hit-hot 2191,86509
-(defun coq-colon-self-insert 2199,86840
-(defun coq-terminator-insert 2213,87396
-(defun coq-activate-ml4pg 2230,88187
-
-coq/coq-indent.el,2698
-(defconst coq-any-command-regexp20,368
-(defconst coq-indent-inner-regexp23,442
-(defconst coq-comment-start-regexp 33,799
-(defconst coq-comment-end-regexp 34,842
-(defconst coq-comment-start-or-end-regexp35,883
-(defconst coq-indent-open-regexp37,991
-(defconst coq-indent-close-regexp42,1188
-(defconst coq-indent-closepar-regexp 48,1387
-(defconst coq-indent-closematch-regexp 49,1432
-(defconst coq-indent-openpar-regexp 50,1503
-(defconst coq-indent-openmatch-regexp 51,1547
-(defconst coq-tacticals-tactics-regex52,1627
-(defconst coq-indent-any-regexp54,1746
-(defconst coq-indent-kw58,1962
-(defconst coq-indent-pattern-regexp 68,2428
-(defun coq-indent-goal-command-p 72,2531
-(defconst coq-period-end-command93,3549
-(defconst coq-curlybracket-end-command99,3831
-(defconst coq-bullet-end-command104,4060
-(defconst coq-end-command-regexp117,4515
-(defun coq-search-comment-delimiter-forward 133,5240
-(defun coq-search-comment-delimiter-backward 142,5570
-(defun coq-skip-until-one-comment-backward 149,5844
-(defun coq-skip-until-one-comment-forward 164,6551
-(defun coq-looking-at-comment 175,7069
-(defun coq-find-comment-start 180,7234
-(defun coq-find-comment-end 192,7711
-(defun coq-looking-at-syntactic-context 204,8204
-(defconst coq-end-command-or-comment-regexp210,8426
-(defconst coq-end-command-or-comment-start-regexp213,8535
-(defun coq-find-not-in-comment-backward 216,8652
-(defun coq-find-not-in-comment-forward 235,9531
-(defun coq-is-on-ending-context 261,10723
-(defun coq-empty-command-p 270,10936
-(defun coq-script-parse-cmdend-forward 285,11677
-(defun coq-script-parse-cmdend-backward 337,14178
-(defun coq-find-current-start 378,16099
-(defun coq-find-real-start 387,16425
-(defun same-line 393,16643
-(defun coq-command-at-point 396,16730
-(defun coq-commands-at-line 411,17341
-(defun coq-indent-only-spaces-on-line 435,18307
-(defun coq-indent-find-reg 441,18584
-(defun coq-find-no-syntactic-on-line 455,19120
-(defun coq-back-to-indentation-prevline 468,19593
-(defun coq-find-unclosed 514,21660
-(defun coq-find-at-same-level-zero 544,22970
-(defun coq-find-unopened 573,24236
-(defun coq-find-last-unopened 616,25670
-(defun coq-end-offset 627,26067
-(defun coq-add-iter 652,26837
-(defun coq-goal-count 655,26943
-(defun coq-save-count 657,27015
-(defun coq-proof-count 662,27214
-(defun coq-goal-save-diff-maybe-proof 668,27500
-(defun coq-indent-command-offset 678,27794
-(defun coq-indent-expr-offset 744,30975
-(defun coq-indent-comment-offset 863,35857
-(defun coq-indent-offset 895,37309
-(defun coq-indent-calculate 914,38183
-(defun coq-indent-line 917,38271
-(defun coq-indent-line-not-comments 927,38637
-(defun coq-indent-region 937,39026
-
-coq/coq-local-vars.el,229
-(defconst coq-local-vars-doc 23,470
-(defun coq-insert-coq-prog-name 86,2815
-(defun coq-read-directory 99,3383
-(defun coq-ask-load-path 116,4198
-(defun coq-ask-prog-name 135,5165
-(defun coq-ask-insert-coq-prog-name 152,5876
-
-coq/coq-par-compile.el,2176
-(defvar coq-par-ancestor-files 251,10947
-(defvar coq-current-background-jobs 267,11596
-(defvar coq-compilation-object-hash 270,11685
-(defvar coq-last-compilation-job 278,12058
-(defvar coq-par-next-id 282,12201
-(defun split-list-at-predicate 289,12358
-(defun coq-par-time-less 313,13210
-(defun coq-par-init-compilation-hash 323,13558
-(defun coq-par-init-ancestor-hash 327,13719
-(defun coq-par-new-compilation-queue 338,14004
-(defvar coq-par-compilation-queue 342,14126
-(defun coq-par-enqueue 346,14310
-(defun coq-par-dequeue 352,14544
-(defun coq-par-find-dependency-circle-for-job 411,16514
-(defun coq-par-find-dependency-circle 434,17285
-(defun coq-par-coq-arguments 455,18019
-(defun coq-par-analyse-coq-dep-exit 463,18388
-(defun coq-par-get-library-dependencies 482,19171
-(defun coq-par-map-module-id-to-obj-file 526,21141
-(defun coq-par-kill-all-processes 585,23970
-(defun coq-par-unlock-ancestors-on-error 612,24984
-(defun coq-par-emergency-cleanup 622,25327
-(defun coq-par-process-filter 637,25888
-(defun coq-par-start-process 642,26097
-(defun coq-par-process-sentinel 676,27711
-(defun coq-par-job-coqc-finished 728,29684
-(defun coq-par-job-is-ready 733,29853
-(defun coq-par-dependencies-ready 737,29959
-(defun coq-par-add-coqc-dependency 741,30103
-(defun coq-par-add-queue-dependency 750,30516
-(defun coq-par-get-obj-mod-time 760,30982
-(defun coq-par-job-needs-compilation 774,31512
-(defun coq-par-kickoff-queue-maybe 803,32743
-(defun coq-par-compile-job-maybe 869,35612
-(defun coq-par-decrease-coqc-dependency 883,36281
-(defun coq-par-kickoff-coqc-dependants 918,38051
-(defun coq-par-start-coqdep 966,40249
-(defun coq-par-start-task 983,40936
-(defun coq-par-start-jobs-until-full 999,41497
-(defun coq-par-start-or-enqueue 1008,41794
-(defun coq-par-create-library-job 1017,42181
-(defun coq-par-process-coqdep-result 1093,45567
-(defun coq-par-coqc-continuation 1151,48050
-(defun coq-par-handle-module 1174,48896
-(defun coq-par-handle-require-list 1203,50120
-(defun coq-par-item-require-predicate 1250,52245
-(defun coq-par-preprocess-require-commands-internal 1259,52568
-(defun coq-par-preprocess-require-commands 1326,55407
-
-coq/coq-seq-compile.el,422
-(defun coq-seq-lock-ancestor 38,1174
-(defun coq-seq-get-library-dependencies 56,2005
-(defun coq-seq-compile-library 109,4420
-(defun coq-seq-compile-library-if-necessary 136,5649
-(defun coq-seq-make-lib-up-to-date 182,7533
-(defun coq-seq-auto-compile-externally 240,10027
-(defun coq-seq-map-module-id-to-obj-file 284,12191
-(defun coq-seq-check-module 337,14809
-(defun coq-seq-preprocess-require-commands 365,16275
-
-coq/coq-smie-lexer.el,859
-(defun coq-dot-friend-p 25,1267
-(defun coq-time-indent 30,1437
-(defun coq-time-indent-region 36,1578
-(defun coq-smie-is-tactic 45,1749
-(defun coq-smie-.-deambiguate 55,1982
-(defun coq-smie-complete-qualid-backward 88,2927
-(defun coq-smie-find-unclosed-match-backward 96,3147
-(defun coq-smie-with-deambiguate(106,3475
-(defun coq-smie-search-token-forward 123,4057
-(defun coq-smie-search-token-backward 168,5949
-(defun coq-lonely-:=212,7802
-(defun coq-smie-detect-goal-command 229,8570
-(defun coq-smie-module-deambiguate 245,9340
-(defconst coq-smie-proof-end-tokens264,10236
-(defun coq-smie-forward-token 268,10387
-(defun coq-is-at-command-real-start(343,13317
-(defun coq-smie-:=348,13417
-(defun coq-smie-backward-token 374,14416
-(defcustom coq-indent-box-style 565,20577
-(defconst coq-smie-grammar588,21319
-(defun coq-smie-rules 720,26572
-
-coq/coq-syntax.el,2786
-(defcustom coq-user-tactics-db 21,586
-(defcustom coq-user-commands-db 38,1099
-(defcustom coq-user-tacticals-db 54,1618
-(defcustom coq-user-solve-tactics-db 70,2139
-(defcustom coq-user-cheat-tactics-db 86,2658
-(defcustom coq-user-reserved-db 105,3204
-(defvar coq-tactics-db123,3735
-(defvar coq-solve-tactics-db296,12869
-(defvar coq-solve-cheat-tactics-db323,13892
-(defvar develock-coq-font-lock-keywords331,14098
-(defvar coq-tacticals-db342,14405
-(defvar coq-decl-db366,15291
-(defvar coq-defn-db391,16747
-(defvar coq-goal-starters-db456,21469
-(defvar coq-other-commands-db487,23350
-(defvar coq-commands-db622,33335
-(defvar coq-terms-db629,33555
-(defun coq-count-match 691,36170
-(defun coq-module-opening-p 707,36899
-(defun coq-section-command-p 717,37333
-(defun coq-goal-command-str-p 721,37430
-(defun coq-goal-command-p 747,38755
-(defvar coq-keywords-save-strict756,39099
-(defvar coq-keywords-save763,39340
-(defun coq-save-command-p 768,39419
-(defvar coq-keywords-kill-goal779,39747
-(defvar coq-keywords-state-changing-misc-commands783,39837
-(defvar coq-keywords-goal786,39962
-(defvar coq-keywords-decl789,40045
-(defvar coq-keywords-defn792,40119
-(defvar coq-keywords-state-changing-commands796,40194
-(defvar coq-keywords-state-preserving-commands805,40454
-(defvar coq-keywords-commands810,40670
-(defvar coq-solve-tactics815,40818
-(defvar coq-solve-tactics-regexp819,40939
-(defvar coq-solve-cheat-tactics823,41073
-(defvar coq-solve-cheat-tactics-regexp827,41218
-(defvar coq-tacticals831,41376
-(defvar coq-reserved837,41515
-(defvar coq-reserved-regexp 847,41850
-(defvar coq-state-changing-tactics851,41961
-(defvar coq-state-preserving-tactics854,42070
-(defvar coq-tactics858,42184
-(defvar coq-tactics-regexp 861,42273
-(defvar coq-retractable-instruct864,42428
-(defvar coq-non-retractable-instruct867,42538
-(defvar coq-keywords871,42666
-(defun proof-regexp-alt-list-symb 877,42890
-(defvar coq-keywords-regexp 880,42995
-(defvar coq-symbols883,43068
-(defvar coq-error-regexp 905,43309
-(defvar coq-id 908,43537
-(defvar coq-id-shy 909,43562
-(defvar coq-ids 912,43655
-(defun coq-first-abstr-regexp 914,43721
-(defcustom coq-variable-highlight-enable 917,43816
-(defvar coq-font-lock-terms923,43943
-(defconst coq-save-command-regexp-strict945,45026
-(defconst coq-save-command-regexp951,45194
-(defconst coq-save-with-hole-regexp956,45347
-(defconst coq-goal-command-regexp960,45507
-(defconst coq-goal-with-hole-regexp963,45609
-(defconst coq-decl-with-hole-regexp967,45743
-(defconst coq-defn-with-hole-regexp974,45993
-(defconst coq-with-with-hole-regexp984,46283
-(defvar coq-font-lock-keywords-1999,46813
-(defvar coq-font-lock-keywords 1027,48148
-(defun coq-init-syntax-table 1029,48206
-(defconst coq-generic-expression1054,48933
-
-coq/coq-unicode-tokens.el,454
-(defconst coq-token-format 39,1427
-(defconst coq-token-match 40,1475
-(defconst coq-hexcode-match 41,1506
-(defun coq-unicode-tokens-set 43,1540
-(defcustom coq-token-symbol-map49,1768
-(defcustom coq-shortcut-alist165,4719
-(defconst coq-control-char-format-regexp254,6808
-(defconst coq-control-char-format 258,6933
-(defconst coq-control-characters260,6976
-(defconst coq-control-region-format-regexp 264,7068
-(defconst coq-control-regions266,7151
-
-hol98/hol98.el,121
-(defvar hol98-keywords 17,419
-(defvar hol98-rules 18,447
-(defvar hol98-tactics 19,472
-(defvar hol98-tacticals 20,499
-
-isar/isabelle-system.el,1255
-(defgroup isabelle 31,882
-(defcustom isabelle-web-page35,1010
-(defcustom isa-isabelle-command44,1227
-(defvar isabelle-not-found 62,1909
-(defun isa-set-isabelle-command 65,2024
-(defun isa-shell-command-to-string 88,3042
-(defun isa-getenv 94,3266
-(defcustom isabelle-program-name-override 114,3965
-(defun isa-tool-list-logics 125,4311
-(defcustom isabelle-logics-available 132,4557
-(defcustom isabelle-chosen-logic 142,4894
-(defvar isabelle-chosen-logic-prev 158,5478
-(defun isabelle-hack-local-variables-function 161,5598
-(defun isabelle-set-prog-name 173,6037
-(defun isabelle-choose-logic 197,7157
-(defun isa-view-doc 216,7919
-(defun isa-tool-list-docs 223,8145
-(defconst isabelle-verbatim-regexp 241,8875
-(defun isabelle-verbatim 244,9017
-(defcustom isabelle-refresh-logics 251,9178
-(defvar isabelle-docs-menu259,9506
-(defvar isabelle-logics-menu-entries 266,9809
-(defun isabelle-logics-menu-calculate 269,9882
-(defvar isabelle-time-to-refresh-logics 290,10524
-(defun isabelle-logics-menu-refresh 294,10619
-(defun isabelle-menu-bar-update-logics 309,11266
-(defun isabelle-load-isar-keywords 325,11895
-(defun isabelle-create-span-menu 346,12623
-(defun isabelle-xml-sml-escapes 362,13054
-(defun isabelle-process-pgip 365,13155
-
-isar/isar-autotest.el,31
-(defvar isar-long-tests 8,186
-
-isar/isar.el,1595
-(defcustom isar-keywords-name 41,945
-(defpgdefault completion-table 57,1456
-(defcustom isar-web-page59,1509
-(defun isar-strip-terminators 73,1854
-(defun isar-markup-ml 85,2210
-(defun isar-mode-config-set-variables 90,2345
-(defun isar-shell-mode-config-set-variables 155,5144
-(defun isar-set-proof-find-theorems-command 237,8334
-(defpacustom use-find-theorems-form 243,8518
-(defun isar-set-undo-commands 248,8684
-(defpacustom use-linear-undo 263,9317
-(defun isar-configure-from-settings 268,9475
-(defun isar-remove-file 276,9625
-(defun isar-shell-compute-new-files-list 288,9929
-(define-derived-mode isar-shell-mode 307,10499
-(define-derived-mode isar-response-mode 312,10626
-(define-derived-mode isar-goals-mode 317,10759
-(define-derived-mode isar-mode 322,10885
-(defpgdefault menu-entries374,12600
-(defun isar-set-command 405,13794
-(defpgdefault help-menu-entries 410,13924
-(defun isar-count-undos 413,14000
-(defun isar-find-and-forget 439,14966
-(defun isar-goal-command-p 475,16309
-(defun isar-global-save-command-p 480,16486
-(defvar isar-current-goal 501,17270
-(defun isar-state-preserving-p 504,17336
-(defvar isar-shell-current-line-width 529,18185
-(defun isar-shell-adjust-line-width 534,18377
-(defsubst isar-string-wrapping 557,19142
-(defsubst isar-positions-of 566,19336
-(defcustom isar-wrap-commands-singly 572,19541
-(defun isar-command-wrapping 578,19737
-(defun isar-preprocessing 586,20051
-(defun isar-mode-config 604,20602
-(defun isar-shell-mode-config 618,21255
-(defun isar-response-mode-config 628,21604
-(defun isar-goals-mode-config 638,21939
-
-isar/isar-find-theorems.el,779
-(defvar isar-find-theorems-data 19,565
-(defun isar-find-theorems-minibuffer 35,1039
-(defun isar-find-theorems-form 49,1658
-(defvar isar-find-theorems-widget-number 92,3532
-(defvar isar-find-theorems-widget-pattern 95,3630
-(defvar isar-find-theorems-widget-intro 98,3722
-(defvar isar-find-theorems-widget-elim 101,3808
-(defvar isar-find-theorems-widget-dest 104,3892
-(defvar isar-find-theorems-widget-name 107,3976
-(defvar isar-find-theorems-widget-simp 110,4063
-(defun isar-find-theorems-create-searchform115,4209
-(defun isar-find-theorems-create-help 255,8752
-(defun isar-find-theorems-submit-searchform298,10924
-(defun isar-find-theorems-parse-criteria 376,13294
-(defun isar-find-theorems-parse-number 469,16275
-(defun isar-find-theorems-filter-empty 479,16552
-
-isar/isar-keywords.el,1064
-(defconst isar-keywords-major7,222
-(defconst isar-keywords-minor280,4856
-(defconst isar-keywords-control339,5659
-(defconst isar-keywords-diag360,6153
-(defconst isar-keywords-theory-begin434,7438
-(defconst isar-keywords-theory-switch437,7491
-(defconst isar-keywords-theory-end440,7537
-(defconst isar-keywords-theory-heading443,7585
-(defconst isar-keywords-theory-decl449,7692
-(defconst isar-keywords-theory-script552,9481
-(defconst isar-keywords-theory-goal555,9544
-(defconst isar-keywords-qed583,10059
-(defconst isar-keywords-qed-block590,10145
-(defconst isar-keywords-qed-global593,10192
-(defconst isar-keywords-proof-heading596,10241
-(defconst isar-keywords-proof-goal601,10324
-(defconst isar-keywords-proof-block606,10401
-(defconst isar-keywords-proof-open610,10463
-(defconst isar-keywords-proof-close613,10509
-(defconst isar-keywords-proof-chain616,10556
-(defconst isar-keywords-proof-decl623,10659
-(defconst isar-keywords-proof-asm635,10821
-(defconst isar-keywords-proof-asm-goal642,10916
-(defconst isar-keywords-proof-script648,11005
-
-isar/isar-mmm.el,81
-(defconst isar-start-latex-regexp24,744
-(defconst isar-start-sml-regexp36,1172
-
-isar/isar-syntax.el,4005
-(defconst isar-script-syntax-table-entries18,483
-(defconst isar-script-syntax-table-alist42,885
-(defun isar-init-syntax-table 51,1168
-(defun isar-init-output-syntax-table 59,1415
-(defconst isar-keyword-begin 74,1857
-(defconst isar-keyword-end 75,1895
-(defconst isar-keywords-theory-enclose77,1930
-(defconst isar-keywords-theory82,2068
-(defconst isar-keywords-save87,2199
-(defconst isar-keywords-proof-enclose92,2314
-(defconst isar-keywords-proof98,2475
-(defconst isar-keywords-proof-context105,2652
-(defconst isar-keywords-local-goal109,2759
-(defconst isar-keywords-proper113,2864
-(defconst isar-keywords-improper118,2983
-(defconst isar-keyword-level-alist123,3115
-(defconst isar-keywords-outline 138,3586
-(defconst isar-keywords-indent-open141,3662
-(defconst isar-keywords-indent-close148,3848
-(defconst isar-keywords-indent-enclose153,3981
-(defconst isar-ext-first 163,4210
-(defconst isar-ext-rest 164,4277
-(defconst isar-text 166,4349
-(defconst isar-long-id-stuff 167,4382
-(defconst isar-id 168,4456
-(defconst isar-idx 169,4526
-(defconst isar-string 171,4585
-(defun isar-ids-to-regexp 173,4645
-(defconst isar-any-command-regexp205,6437
-(defconst isar-name-regexp212,6810
-(defconst isar-improper-regexp218,7105
-(defconst isar-save-command-regexp222,7239
-(defconst isar-global-save-command-regexp225,7340
-(defconst isar-goal-command-regexp228,7454
-(defconst isar-local-goal-command-regexp231,7562
-(defconst isar-comment-start 234,7675
-(defconst isar-comment-end 235,7710
-(defconst isar-comment-start-regexp 236,7743
-(defconst isar-comment-end-regexp 237,7814
-(defconst isar-string-start-regexp 239,7882
-(defconst isar-string-end-regexp 240,7934
-(defun isar-syntactic-context 242,7985
-(defconst isar-antiq-regexp257,8380
-(defconst isar-nesting-regexp263,8531
-(defun isar-nesting 266,8629
-(defun isar-match-nesting 278,9022
-(defface isabelle-string-face 290,9356
-(defface isabelle-quote-face 298,9556
-(defface isabelle-class-name-face306,9752
-(defface isabelle-tfree-name-face314,9939
-(defface isabelle-tvar-name-face322,10132
-(defface isabelle-free-name-face330,10324
-(defface isabelle-bound-name-face338,10512
-(defface isabelle-var-name-face346,10703
-(defconst isabelle-string-face 354,10894
-(defconst isabelle-quote-face 355,10948
-(defconst isabelle-class-name-face 356,11001
-(defconst isabelle-tfree-name-face 357,11063
-(defconst isabelle-tvar-name-face 358,11125
-(defconst isabelle-free-name-face 359,11186
-(defconst isabelle-bound-name-face 360,11247
-(defconst isabelle-var-name-face 361,11309
-(defun isar-font-lock-fontify-syntactically-region 367,11458
-(defvar isar-font-lock-keywords-1402,12736
-(defun isar-output-flkprops 420,13744
-(defun isar-output-flk 426,13996
-(defvar isar-output-font-lock-keywords-1429,14105
-(defun isar-strip-output-markup 453,15104
-(defconst isar-shell-font-lock-keywords457,15240
-(defvar isar-goals-font-lock-keywords460,15324
-(defconst isar-linear-undo 494,16003
-(defconst isar-undo 496,16046
-(defconst isar-pr498,16089
-(defun isar-remove 505,16247
-(defun isar-undos 508,16322
-(defun isar-cannot-undo 518,16556
-(defconst isar-undo-commands521,16626
-(defconst isar-theory-start-regexp529,16763
-(defconst isar-end-regexp535,16921
-(defconst isar-undo-fail-regexp539,17022
-(defconst isar-undo-skip-regexp543,17126
-(defconst isar-undo-ignore-regexp546,17247
-(defconst isar-undo-remove-regexp549,17312
-(defconst isar-keywords-imenu557,17469
-(defconst isar-entity-regexp 564,17660
-(defconst isar-named-entity-regexp567,17756
-(defconst isar-named-entity-name-match-number572,17886
-(defconst isar-generic-expression575,17987
-(defconst isar-indent-any-regexp586,18221
-(defconst isar-indent-inner-regexp588,18314
-(defconst isar-indent-enclose-regexp590,18380
-(defconst isar-indent-open-regexp592,18496
-(defconst isar-indent-close-regexp594,18606
-(defconst isar-outline-regexp600,18743
-(defconst isar-outline-heading-end-regexp 604,18896
-(defconst isar-outline-heading-alist 606,18945
-
-isar/isar-unicode-tokens.el,1363
-(defgroup isabelle-tokens 25,672
-(defun isar-set-and-restart-tokens 30,812
-(defconst isar-control-region-format-regexp43,1165
-(defconst isar-control-char-format-regexp46,1259
-(defconst isar-control-char-format 52,1406
-(defconst isar-control-region-format-start 53,1455
-(defconst isar-control-region-format-end 54,1509
-(defcustom isar-control-characters57,1565
-(defcustom isar-control-regions71,1978
-(defconst isar-token-format 97,2790
-(defconst isar-token-variant-format-regexp101,2941
-(defcustom isar-greek-letters-tokens104,3055
-(defcustom isar-misc-letters-tokens144,3913
-(defcustom isar-symbols-tokens156,4231
-(defcustom isar-extended-symbols-tokens362,9042
-(defun isar-try-char 431,10697
-(defcustom isar-symbols-tokens-fallbacks435,10841
-(defcustom isar-bold-nums-tokens462,11771
-(defun isar-map-letters 478,12160
-(defconst isar-script-letters-tokens 484,12308
-(defconst isar-roman-letters-tokens 489,12462
-(defconst isar-fraktur-uppercase-letters-tokens 494,12636
-(defconst isar-fraktur-lowercase-letters-tokens 499,12805
-(defcustom isar-token-symbol-map 504,12996
-(defcustom isar-user-tokens 521,13537
-(defun isar-init-token-symbol-map 535,13977
-(defcustom isar-symbol-shortcuts560,14626
-(defcustom isar-shortcut-alist 632,16825
-(defun isar-init-shortcut-alists 640,17084
-(defconst isar-tokens-customizable-variables661,17747
-
-lego/lego.el,1636
-(defcustom lego-tags 21,539
-(defcustom lego-test-all-name 26,675
-(defpgdefault help-menu-entries32,833
-(defpgdefault menu-entries36,993
-(defvar lego-shell-handle-output47,1294
-(defconst lego-process-config55,1604
-(defconst lego-pretty-set-width 66,2035
-(defconst lego-interrupt-regexp 70,2177
-(defcustom lego-www-home-page 75,2294
-(defcustom lego-www-latest-release80,2418
-(defcustom lego-www-refcard86,2593
-(defcustom lego-library-www-page92,2742
-(defvar lego-prog-name 101,2958
-(defvar lego-shell-cd 104,3027
-(defvar lego-shell-proof-completed-regexp 107,3126
-(defvar lego-save-command-regexp110,3266
-(defvar lego-goal-command-regexp112,3356
-(defvar lego-kill-goal-command 115,3447
-(defvar lego-forget-id-command 116,3490
-(defvar lego-undoable-commands-regexp118,3536
-(defvar lego-goal-regexp 127,3910
-(defvar lego-outline-regexp129,3955
-(defvar lego-outline-heading-end-regexp 135,4130
-(defvar lego-shell-outline-regexp 137,4183
-(defvar lego-shell-outline-heading-end-regexp 138,4235
-(define-derived-mode lego-shell-mode 144,4514
-(define-derived-mode lego-mode 151,4675
-(define-derived-mode lego-goals-mode 162,4985
-(defun lego-count-undos 173,5411
-(defun lego-goal-command-p 192,6148
-(defun lego-find-and-forget 197,6319
-(defun lego-goal-hyp 239,8155
-(defun lego-state-preserving-p 248,8352
-(defvar lego-shell-current-line-width 264,9055
-(defun lego-shell-adjust-line-width 272,9362
-(defun lego-mode-config 289,10063
-(defun lego-equal-module-filename 357,12114
-(defun lego-shell-compute-new-files-list 363,12389
-(defun lego-shell-mode-config 373,12772
-(defun lego-goals-mode-config 420,14439
-
-lego/lego-syntax.el,600
-(defconst lego-keywords-goal 15,358
-(defconst lego-keywords-save 17,401
-(defconst lego-commands19,472
-(defconst lego-keywords31,1030
-(defconst lego-tacticals 36,1207
-(defconst lego-error-regexp 39,1315
-(defvar lego-id 42,1473
-(defvar lego-ids 44,1500
-(defconst lego-arg-list-regexp 48,1696
-(defun lego-decl-defn-regexp 51,1812
-(defconst lego-definiendum-alternative-regexp59,2184
-(defvar lego-font-lock-terms63,2368
-(defconst lego-goal-with-hole-regexp89,3221
-(defconst lego-save-with-hole-regexp94,3443
-(defvar lego-font-lock-keywords-199,3660
-(defun lego-init-syntax-table 110,4122
-
-hol-light/hol-light.el,1930
-(defcustom hol-light-home 23,678
-(defcustom hol-light-prog-name 30,879
-(defcustom hol-light-use-custom-toplevel 38,1075
-(defconst hol-light-pre-sync-cmd52,1571
-(defcustom hol-light-init-cmd 56,1745
-(defconst hol-light-plain-start-goals-regexp78,2476
-(defconst hol-light-annotated-start-goals-regexp 85,2722
-(defconst hol-light-plain-interrupt-regexp89,2881
-(defconst hol-light-annotated-interrupt-regexp93,3012
-(defconst hol-light-plain-prompt-regexp97,3174
-(defconst hol-light-annotated-prompt-regexp101,3328
-(defconst hol-light-plain-error-regexp105,3500
-(defconst hol-light-annotated-error-regexp 116,3825
-(defconst hol-light-plain-proof-completed-regexp121,4046
-(defconst hol-light-annotated-proof-completed-regexp125,4199
-(defconst hol-light-plain-message-start 129,4380
-(defconst hol-light-annotated-message-start133,4524
-(defconst hol-light-plain-message-end137,4678
-(defconst hol-light-annotated-message-end141,4809
-(defvar hol-light-keywords 150,4965
-(defvar hol-light-rules 151,4997
-(defvar hol-light-tactics 152,5026
-(defvar hol-light-tacticals 153,5057
-(defvar hol-light-update-goal-regexp 365,13126
-(defconst hol-light-current-goal-regexp369,13252
-(defconst hol-light-additional-subgoal-regexp 375,13446
-(defconst hol-light-statenumber-regexp 379,13602
-(defconst hol-light-existential-regexp 386,13906
-(defconst hol-light-existentials-state-start-regexp 389,14013
-(defconst hol-light-existentials-state-end-regexp 392,14160
-(defvar proof-shell-delayed-output-start 424,15452
-(defvar proof-shell-delayed-output-end 425,15498
-(defvar proof-info 426,15542
-(defvar proof-action-list 427,15566
-(defun proof-shell-action-list-item 428,15597
-(defconst hol-light-show-sequent-command 430,15648
-(defun hol-light-get-proof-info 432,15716
-(defun hol-light-find-begin-of-unfinished-proof 448,16217
-(defun hol-light-proof-tree-get-new-subgoals 459,16665
-(defpgdefault menu-entries509,18887
-
-hol-light/hol-light-unicode-tokens.el,516
-(defconst hol-light-token-format 23,746
-(defconst hol-light-token-match 24,800
-(defconst hol-light-hexcode-match 25,837
-(defun hol-light-unicode-tokens-set 27,877
-(defcustom hol-light-token-symbol-map33,1117
-(defcustom hol-light-shortcut-alist128,3379
-(defconst hol-light-control-char-format-regexp217,5409
-(defconst hol-light-control-char-format 221,5540
-(defconst hol-light-control-characters223,5589
-(defconst hol-light-control-region-format-regexp 227,5687
-(defconst hol-light-control-regions229,5776
-
-phox/phox.el,555
-(defcustom phox-prog-name 32,916
-(defcustom phox-web-page37,1018
-(defcustom phox-doc-dir43,1168
-(defcustom phox-lib-dir49,1315
-(defcustom phox-tags-program55,1458
-(defcustom phox-tags-doc61,1637
-(defcustom phox-etags67,1774
-(defpgdefault menu-entries88,2224
-(defun phox-config 102,2417
-(defun phox-shell-config 146,4343
-(define-derived-mode phox-mode 170,5205
-(define-derived-mode phox-shell-mode 186,5668
-(define-derived-mode phox-response-mode 191,5796
-(define-derived-mode phox-goals-mode 201,6157
-(defpgdefault completion-table224,6943
-
-phox/phox-extraction.el,383
-(defvar phox-prog-orig 19,619
-(defun phox-prog-flags-modify(21,687
-(defun phox-prog-flags-extract(50,1488
-(defun phox-prog-flags-erase(61,1778
-(defun phox-toggle-extraction(69,1974
-(defun phox-compile-theorem(81,2376
-(defun phox-compile-theorem-on-cursor(87,2601
-(defun phox-output 103,3079
-(defun phox-output-theorem 113,3291
-(defun phox-output-theorem-on-cursor(120,3590
-
-phox/phox-font.el,231
-(defvar phox-sym-lock-enabled 1,0
-(defvar phox-sym-lock-color 2,60
-(defvar phox-sym-lock-keywords 3,118
-(defconst phox-font-lock-keywords11,511
-(defconst phox-sym-lock-keywords-table70,2628
-(defun phox-sym-lock-start 93,3202
-
-phox/phox-fun.el,1659
-(defconst phox-forget-id-command 11,186
-(defconst phox-forget-proof-command 12,232
-(defconst phox-forget-new-elim-command 13,287
-(defconst phox-forget-new-intro-command 14,345
-(defconst phox-forget-new-equation-command 15,405
-(defconst phox-forget-close-def-command 16,471
-(defconst phox-comments-regexp 18,597
-(defconst phox-strict-comments-regexp 20,776
-(defconst phox-ident-regexp 21,941
-(defconst phox-inductive-option 22,1027
-(defconst phox-spaces-regexp 23,1079
-(defconst phox-sy-definition-regexp 24,1122
-(defconst phox-sy-inductive-regexp 28,1309
-(defconst phox-inductive-regexp 34,1522
-(defconst phox-data-regexp 40,1673
-(defconst phox-definition-regexp 46,1827
-(defconst phox-prove-claim-regexp 50,1971
-(defconst phox-new-elim-regexp 54,2077
-(defconst phox-new-intro-regexp 57,2196
-(defconst phox-new-rewrite-regexp 60,2317
-(defconst phox-new-equation-regexp 63,2442
-(defconst phox-close-def-regexp 66,2569
-(defun phox-init-syntax-table 71,2706
-(defvar phox-top-keywords87,3178
-(defvar phox-proof-keywords135,3633
-(defun phox-find-and-forget 176,3983
-(defalias 'phox-assert-next-command-interactive phox-assert-next-command-interactive255,6399
-(defun phox-depend-theorem(274,7365
-(defun phox-eshow-extlist(283,7654
-(defun phox-flag-name(297,8251
-(defun phox-path(308,8553
-(defun phox-print-expression(319,8789
-(defun phox-print-sort-expression(332,9245
-(defun phox-priority-symbols-list(343,9557
-(defun phox-search-string(355,9929
-(defun phox-constraints(370,10454
-(defun phox-goals(381,10710
-(defvar phox-state-menu393,10919
-(defun phox-delete-symbol(418,11909
-(defun phox-delete-symbol-on-cursor(424,12117
-
-phox/phox-lang.el,323
-(defvar phox-lang9,306
-(defun phox-lang-absurd 21,583
-(defun phox-lang-suppress 26,677
-(defun phox-lang-opendef 31,874
-(defun phox-lang-instance 36,992
-(defun phox-lang-open-instance 41,1121
-(defun phox-lang-lock 46,1270
-(defun phox-lang-unlock 51,1400
-(defun phox-lang-prove 56,1536
-(defun phox-lang-let 61,1670
-
-phox/phox-outline.el,254
-(defconst phox-outline-title-regexp 19,723
-(defconst phox-outline-section-regexp 20,788
-(defconst phox-outline-save-regexp 21,844
-(defconst phox-outline-heading-end-regexp 38,1387
-(defun phox-outline-level(44,1566
-(defun phox-setup-outline 58,2040
-
-phox/phox-pbrpm.el,513
-(defun phox-pbrpm-left-paren-p 39,1671
-(defun phox-pbrpm-right-paren-p 46,1874
-(defun phox-pbrpm-menu-from-string 54,2078
-(defun phox-pbrpm-rename-in-cmd 63,2410
-(defun phox-pbrpm-get-region-name 96,3658
-(defun phox-pbrpm-escape-string 99,3785
-(defun phox-pbrpm-generate-menu 103,3920
-(defalias 'proof-pbrpm-generate-menu proof-pbrpm-generate-menu310,11400
-(defalias 'proof-pbrpm-left-paren-p proof-pbrpm-left-paren-p311,11464
-(defalias 'proof-pbrpm-right-paren-p proof-pbrpm-right-paren-p312,11526
-
-phox/phox-sym-lock.el,1398
-(defcustom phox-sym-lock-enabled 19,871
-(defvar phox-sym-lock-sym-count 59,2452
-(defvar phox-sym-lock-ext-start 62,2522
-(defvar phox-sym-lock-ext-end 64,2644
-(defvar phox-sym-lock-font-size 67,2763
-(defvar phox-sym-lock-keywords 72,2953
-(defvar phox-sym-lock-enabled 77,3129
-(defvar phox-sym-lock-color 82,3291
-(defvar phox-sym-lock-mouse-face 87,3509
-(defvar phox-sym-lock-mouse-face-enabled 92,3699
-(defconst phox-sym-lock-with-mule 97,3889
-(defun phox-sym-lock-gen-symbol 100,3973
-(defun phox-sym-lock-make-symbols-atomic 108,4275
-(defun phox-sym-lock-compute-font-size 135,5216
-(defvar phox-sym-lock-font-name173,6635
-(defun phox-sym-lock-set-foreground 216,8233
-(defun phox-sym-lock-translate-char 230,8842
-(defun phox-sym-lock-translate-char-or-string 239,9159
-(defun phox-sym-lock-remap-face 246,9387
-(defvar phox-sym-lock-clear-face266,10375
-(defun phox-sym-lock 278,10794
-(defun phox-sym-lock-rec 287,11198
-(defun phox-sym-lock-atom-face 293,11343
-(defun phox-sym-lock-pre-idle-hook-first 298,11639
-(defun phox-sym-lock-pre-idle-hook-last 308,12044
-(defun phox-sym-lock-enable 317,12419
-(defun phox-sym-lock-disable 330,12830
-(defun phox-sym-lock-mouse-face-enable 343,13246
-(defun phox-sym-lock-mouse-face-disable 350,13461
-(defun phox-sym-lock-font-lock-hook 357,13680
-(defun font-lock-set-defaults 372,14371
-(defun phox-sym-lock-patch-keywords 384,14798
-
-phox/phox-tags.el,305
-(defun phox-tags-add-table(26,869
-(defun phox-tags-reset-table(35,1264
-(defun phox-tags-add-doc-table(40,1374
-(defun phox-tags-add-lib-table(46,1523
-(defun phox-tags-add-local-table(52,1658
-(defun phox-tags-create-local-table(58,1841
-(defun phox-complete-tag(69,2091
-(defvar phox-tags-menu76,2200
-
-generic/pg-assoc.el,81
-(defun proof-associated-buffers 33,973
-(defun proof-associated-windows 43,1183
-
-generic/pg-autotest.el,908
-(defvar pg-autotest-success 29,690
-(defvar pg-autotest-log 32,777
-(defun pg-autotest-find-file 37,871
-(defun pg-autotest-find-file-restart 44,1137
-(defmacro pg-autotest-apply 58,1611
-(defmacro pg-autotest 72,2026
-(defun pg-autotest-log 89,2463
-(defun pg-autotest-message 98,2726
-(defun pg-autotest-remark 107,3015
-(defun pg-autotest-timestart 110,3096
-(defun pg-autotest-timetaken 115,3279
-(defun pg-autotest-start 129,3667
-(defun pg-autotest-exit 140,4121
-(defun pg-autotest-test-process-wholefile 160,4904
-(defun pg-autotest-test-script-wholefile 168,5191
-(defun pg-autotest-test-script-randomjumps 193,6123
-(defun pg-autotest-test-retract-file 242,7680
-(defun pg-autotest-test-assert-processed 248,7821
-(defun pg-autotest-test-assert-full 254,8047
-(defun pg-autotest-test-assert-unprocessed 261,8288
-(defun pg-autotest-test-eval 268,8553
-(defun pg-autotest-test-quit-prover 272,8652
-
-generic/pg-custom.el,635
-(defpgcustom script-indent 37,1201
-(defconst proof-toolbar-entries-default42,1338
-(defpgcustom toolbar-entries 71,3173
-(defpgcustom prog-args 90,3906
-(defpgcustom prog-env 102,4484
-(defpgcustom quit-timeout 111,4913
-(defpgcustom favourites 123,5340
-(defpgcustom menu-entries 128,5529
-(defpgcustom help-menu-entries 135,5765
-(defpgcustom keymap 142,6028
-(defpgcustom completion-table 147,6199
-(defpgcustom tags-program 158,6575
-(defpgcustom use-holes 167,6959
-(defpgcustom one-command-per-line174,7217
-(defpgcustom maths-menu-enable 185,7453
-(defpgcustom unicode-tokens-enable 191,7633
-(defpgcustom mmm-enable 197,7840
-
-generic/pg-goals.el,285
-(define-derived-mode proof-goals-mode 29,736
-(define-key proof-goals-mode-map 56,1612
-(define-key proof-goals-mode-map 58,1728
-(define-key proof-goals-mode-map 59,1796
-(defun proof-goals-config-done 68,1943
-(defun pg-goals-display 76,2209
-(defun pg-goals-button-action 119,3668
-
-generic/pg-movie.el,333
-(defconst pg-movie-xml-header 32,923
-(defconst pg-movie-stylesheet34,981
-(defun pg-movie-stylesheet-location 37,1080
-(defvar pg-movie-frame 41,1188
-(defun pg-movie-of-span 43,1242
-(defun pg-movie-of-region 79,2362
-(defun pg-movie-export 86,2550
-(defun pg-movie-export-from 108,3154
-(defun pg-movie-export-directory 119,3475
-
-generic/pg-pamacs.el,534
-(defmacro deflocal 35,1138
-(deflocal proof-buffer-type 42,1376
-(defmacro proof-ass-sym 50,1512
-(defmacro proof-ass-symv 56,1771
-(defmacro proof-ass 62,2029
-(defun proof-ass-differs-from-default 68,2281
-(defun proof-defpgcustom-fn 74,2536
-(defun undefpgcustom 98,3420
-(defmacro defpgcustom 104,3644
-(defun proof-defpgdefault-fn 117,4294
-(defmacro defpgdefault 131,4752
-(defmacro defpgfun 142,5114
-(defun proof-defpacustom-fn 156,5513
-(defmacro defpacustom 223,7701
-(defmacro proof-eval-when-ready-for-assistant 270,9510
-
-generic/pg-pbrpm.el,1808
-(defvar pg-pbrpm-use-buffer-menu 45,1207
-(defvar pg-pbrpm-start-goal-regexp 48,1329
-(defvar pg-pbrpm-start-goal-regexp-par-num 52,1486
-(defvar pg-pbrpm-end-goal-regexp 55,1609
-(defvar pg-pbrpm-start-hyp-regexp 59,1761
-(defvar pg-pbrpm-start-hyp-regexp-par-num 63,1922
-(defvar pg-pbrpm-start-concl-regexp 67,2129
-(defvar pg-pbrpm-auto-select-regexp 71,2293
-(defvar pg-pbrpm-buffer-menu 78,2454
-(defvar pg-pbrpm-spans 79,2488
-(defvar pg-pbrpm-goal-description 80,2516
-(defvar pg-pbrpm-windows-dialog-bug 81,2555
-(defvar pbrpm-menu-desc 82,2596
-(defun pg-pbrpm-erase-buffer-menu 84,2626
-(defun pg-pbrpm-menu-change-hook 90,2798
-(defun pg-pbrpm-create-reset-buffer-menu 108,3373
-(defun pg-pbrpm-analyse-goal-buffer 127,4215
-(defun pg-pbrpm-button-action 187,6620
-(defun pg-pbrpm-exists 194,6846
-(defun pg-pbrpm-eliminate-id 198,6958
-(defun pg-pbrpm-build-menu 206,7204
-(defun pg-pbrpm-setup-span 269,9524
-(defun pg-pbrpm-run-command 329,11823
-(defun pg-pbrpm-get-pos-info 362,13348
-(defun pg-pbrpm-get-region-info 404,14647
-(defun pg-pbrpm-auto-select-around-point 415,15059
-(defun pg-pbrpm-translate-position 430,15583
-(defun pg-pbrpm-process-click 438,15837
-(defvar pg-pbrpm-remember-region-selected-region 458,16862
-(defvar pg-pbrpm-regions-list 459,16916
-(defun pg-pbrpm-erase-regions-list 461,16952
-(defun pg-pbrpm-filter-regions-list 470,17260
-(defface pg-pbrpm-multiple-selection-face477,17523
-(defface pg-pbrpm-menu-input-face485,17725
-(defun pg-pbrpm-do-remember-region 493,17915
-(defun pg-pbrpm-remember-region-drag-up-hook 514,18763
-(defun pg-pbrpm-remember-region-click-hook 518,18934
-(defun pg-pbrpm-remember-region 523,19119
-(defun pg-pbrpm-process-region 537,19833
-(defun pg-pbrpm-process-regions-list 555,20562
-(defun pg-pbrpm-region-expression 559,20745
-
-generic/pg-pgip.el,2932
-(defalias 'pg-pgip-debug pg-pgip-debug39,1091
-(defalias 'pg-pgip-error pg-pgip-error40,1132
-(defalias 'pg-pgip-warning pg-pgip-warning41,1167
-(defconst pg-pgip-version-supported 43,1217
-(defun pg-pgip-process-packet 47,1323
-(defvar pg-pgip-last-seen-id 57,1891
-(defvar pg-pgip-last-seen-seq 58,1925
-(defun pg-pgip-process-pgip 60,1961
-(defun pg-pgip-process-msg 79,2901
-(defvar pg-pgip-post-process-functions94,3492
-(defun pg-pgip-post-process 104,3967
-(defun pg-pgip-process-askpgip 121,4582
-(defun pg-pgip-process-usespgip 127,4786
-(defun pg-pgip-process-usespgml 131,4950
-(defun pg-pgip-process-pgmlconfig 135,5114
-(defun pg-pgip-process-proverinfo 151,5731
-(defun pg-pgip-process-hasprefs 168,6396
-(defun pg-pgip-haspref 182,7028
-(defun pg-pgip-process-prefval 200,7744
-(defun pg-pgip-process-guiconfig 227,8452
-(defvar proof-assistant-idtables 234,8569
-(defun pg-pgip-process-ids 237,8686
-(defun pg-complete-idtable-symbol 263,9758
-(defalias 'pg-pgip-process-setids pg-pgip-process-setids268,9850
-(defalias 'pg-pgip-process-addids pg-pgip-process-addids269,9906
-(defalias 'pg-pgip-process-delids pg-pgip-process-delids270,9962
-(defun pg-pgip-process-idvalue 273,10020
-(defun pg-pgip-process-menuadd 285,10366
-(defun pg-pgip-process-menudel 288,10409
-(defun pg-pgip-process-ready 297,10641
-(defun pg-pgip-process-cleardisplay 300,10682
-(defun pg-pgip-process-proofstate 314,11139
-(defun pg-pgip-process-normalresponse 318,11216
-(defun pg-pgip-process-errorresponse 322,11346
-(defun pg-pgip-process-scriptinsert 326,11475
-(defun pg-pgip-process-metainforesponse 331,11609
-(defun pg-pgip-file-of-url 340,11849
-(defun pg-pgip-process-informfileloaded 345,11984
-(defun pg-pgip-process-informfileretracted 351,12216
-(defun pg-pgip-process-brokerstatus 364,12663
-(defun pg-pgip-process-proveravailmsg 367,12711
-(defun pg-pgip-process-newprovermsg 370,12761
-(defun pg-pgip-process-proverstatusmsg 373,12809
-(defvar pg-pgip-srcids 382,13055
-(defun pg-pgip-process-newfile 386,13162
-(defun pg-pgip-process-filestatus 402,13744
-(defun pg-pgip-process-newobj 422,14398
-(defun pg-pgip-process-delobj 425,14440
-(defun pg-pgip-process-objectstatus 428,14482
-(defun pg-pgip-process-parsescript 442,14834
-(defun pg-pgip-get-pgiptype 465,15708
-(defun pg-pgip-default-for 486,16571
-(defun pg-pgip-subst-for 499,16966
-(defun pg-pgip-interpret-value 512,17336
-(defun pg-pgip-interpret-choice 531,18061
-(defun pg-pgip-string-of-command 562,19078
-(defconst pg-pgip-id579,19839
-(defvar pg-pgip-refseq 585,20119
-(defvar pg-pgip-refid 587,20216
-(defvar pg-pgip-seq 590,20308
-(defun pg-pgip-assemble-packet 592,20372
-(defun pg-pgip-issue 610,21183
-(defun pg-pgip-maybe-askpgip 627,21795
-(defun pg-pgip-askprefs 633,21986
-(defun pg-pgip-askids 637,22100
-(defun pg-pgip-reset 650,22388
-(defconst pg-pgip-start-element-regexp 681,23086
-(defconst pg-pgip-end-element-regexp 682,23138
-
-generic/pg-response.el,1254
-(deflocal pg-response-eagerly-raise 32,791
-(define-derived-mode proof-response-mode 42,1016
-(define-key proof-response-mode-map 69,1971
-(define-key proof-response-mode-map 70,2042
-(define-key proof-response-mode-map 71,2096
-(defun proof-response-config-done 75,2182
-(defvar pg-response-special-display-regexp 86,2528
-(defconst proof-multiframe-parameters90,2695
-(defun proof-multiple-frames-enable 99,2985
-(defun proof-three-window-enable 109,3313
-(defun proof-select-three-b 112,3376
-(defun proof-display-three-b 157,4806
-(defvar pg-frame-configuration 167,5174
-(defun pg-cache-frame-configuration 171,5321
-(defun proof-layout-windows 175,5492
-(defun proof-delete-other-frames 241,8163
-(defvar pg-response-erase-flag 272,9251
-(defun pg-response-maybe-erase276,9380
-(defun pg-response-display 320,10843
-(defun pg-response-display-with-face 345,11626
-(defun pg-response-clear-displays 373,12472
-(defun pg-response-message 391,13178
-(defun pg-response-warning 397,13413
-(defun proof-next-error 412,13819
-(defun pg-response-has-error-location 490,16628
-(defcustom proof-trace-buffer-max-lines 505,17047
-(defun proof-trace-buffer-display 512,17282
-(defun proof-trace-buffer-finish 526,17689
-(defun pg-thms-buffer-clear 550,18342
-
-generic/pg-user.el,3669
-(defvar which-func-modes)28,748
-(defun proof-script-new-command-advance 43,1241
-(defun proof-maybe-follow-locked-end 69,2268
-(defun proof-goto-command-start 95,3104
-(defun proof-goto-command-end 118,4051
-(defun proof-forward-command 133,4473
-(defun proof-backward-command 154,5194
-(defun proof-goto-point 165,5408
-(defun proof-assert-next-command-interactive 179,5842
-(defun proof-assert-until-point-interactive 191,6328
-(defun proof-process-buffer 198,6573
-(defun proof-undo-last-successful-command 216,7085
-(defun proof-undo-and-delete-last-successful-command 221,7247
-(defun proof-undo-last-successful-command-1 233,7766
-(defun proof-retract-buffer 250,8430
-(defun proof-retract-current-goal 265,9038
-(defun proof-mouse-goto-point 284,9558
-(defvar proof-minibuffer-history 299,9834
-(defun proof-minibuffer-cmd 302,9929
-(defun proof-frob-locked-end 341,11336
-(defmacro proof-if-setting-configured 377,12437
-(defmacro proof-define-assistant-command 385,12706
-(defmacro proof-define-assistant-command-witharg 398,13161
-(defun proof-issue-new-command 418,13983
-(defun proof-cd-sync 458,15206
-(defun proof-electric-terminator-enable 509,16805
-(defun proof-electric-terminator 517,17109
-(defun proof-add-completions 545,18079
-(defun proof-script-complete 568,18902
-(defun pg-copy-span-contents 582,19211
-(defun pg-numth-span-higher-or-lower 596,19635
-(defun pg-control-span-of 622,20381
-(defun pg-move-span-contents 628,20585
-(defun pg-fixup-children-spans 679,22703
-(defun pg-move-region-down 689,22960
-(defun pg-move-region-up 698,23253
-(defun pg-pos-for-event 712,23527
-(defun pg-span-for-event 718,23748
-(defun pg-span-context-menu 722,23892
-(defun pg-toggle-visibility 738,24409
-(defun pg-create-in-span-context-menu 747,24716
-(defun pg-span-undo 772,25744
-(defun pg-goals-buffers-hint 785,25982
-(defun pg-slow-fontify-tracing-hint 789,26200
-(defun pg-response-buffers-hint 793,26389
-(defun pg-jump-to-end-hint 805,26804
-(defun pg-processing-complete-hint 809,26933
-(defun pg-next-error-hint 826,27653
-(defun pg-hint 831,27805
-(defun pg-identifier-under-mouse-query 842,28154
-(defun pg-identifier-near-point-query 853,28478
-(defvar proof-query-identifier-history 882,29401
-(defun proof-query-identifier 885,29488
-(defun pg-identifier-query 896,29844
-(defun proof-imenu-enable 929,30992
-(defvar pg-input-ring 969,32470
-(defvar pg-input-ring-index 972,32527
-(defvar pg-stored-incomplete-input 975,32599
-(defun pg-previous-input 978,32702
-(defun pg-next-input 992,33165
-(defun pg-delete-input 997,33287
-(defun pg-get-old-input 1010,33625
-(defun pg-restore-input 1024,34016
-(defun pg-search-start 1035,34306
-(defun pg-regexp-arg 1047,34798
-(defun pg-search-arg 1059,35246
-(defun pg-previous-matching-input-string-position 1073,35663
-(defun pg-previous-matching-input 1100,36828
-(defun pg-next-matching-input 1119,37678
-(defvar pg-matching-input-from-input-string 1127,38061
-(defun pg-previous-matching-input-from-input 1131,38175
-(defun pg-next-matching-input-from-input 1149,38940
-(defun pg-add-to-input-history 1160,39319
-(defun pg-remove-from-input-history 1172,39772
-(defun pg-clear-input-ring 1183,40152
-(define-key proof-mode-map 1200,40622
-(define-key proof-mode-map 1201,40682
-(defun pg-protected-undo 1203,40754
-(defun pg-protected-undo-1 1233,42048
-(defun next-undo-elt 1264,43485
-(defvar proof-autosend-timer 1291,44441
-(deflocal proof-autosend-modified-tick 1293,44502
-(defun proof-autosend-enable 1297,44624
-(defun proof-autosend-delay 1311,45167
-(defun proof-autosend-loop 1315,45300
-(defun proof-autosend-loop-all 1329,45860
-(defun proof-autosend-loop-next 1353,46640
-
-generic/pg-vars.el,1500
-(defvar proof-assistant-cusgrp 22,386
-(defvar proof-assistant-internals-cusgrp 28,646
-(defvar proof-assistant 34,916
-(defvar proof-assistant-symbol 39,1139
-(defvar proof-mode-for-shell 52,1681
-(defvar proof-mode-for-response 57,1871
-(defvar proof-mode-for-goals 62,2097
-(defvar proof-mode-for-script 67,2286
-(defvar proof-ready-for-assistant-hook 72,2463
-(defvar proof-shell-busy 83,2751
-(defvar proof-shell-last-queuemode 101,3422
-(defvar proof-included-files-list 105,3577
-(defvar proof-script-buffer 127,4596
-(defvar proof-previous-script-buffer 130,4688
-(defvar proof-shell-buffer 134,4861
-(defvar proof-goals-buffer 137,4947
-(defvar proof-response-buffer 140,5002
-(defvar proof-trace-buffer 143,5063
-(defvar proof-thms-buffer 147,5217
-(defvar proof-shell-error-or-interrupt-seen 151,5372
-(defvar pg-response-next-error 156,5596
-(defvar proof-shell-proof-completed 159,5703
-(defvar proof-shell-silent 173,6088
-(defvar proof-shell-last-prompt 176,6176
-(defvar proof-shell-last-output 180,6346
-(defvar proof-shell-last-output-kind 184,6486
-(defvar proof-assistant-settings 204,7250
-(defvar pg-tracing-slow-mode 214,7764
-(defvar proof-nesting-depth 217,7853
-(defvar proof-last-theorem-dependencies 224,8088
-(defvar proof-autosend-running 228,8250
-(defvar proof-next-command-on-new-line 233,8449
-(defcustom proof-general-name 244,8683
-(defcustom proof-general-home-page249,8840
-(defcustom proof-unnamed-theorem-name255,9000
-(defcustom proof-universal-keys261,9184
-
-generic/pg-xml.el,1177
-(defalias 'pg-xml-error pg-xml-error18,381
-(defun pg-xml-parse-string 41,1023
-(defun pg-xml-parse-buffer 51,1335
-(defun pg-xml-get-attr 70,1950
-(defun pg-xml-child-elts 78,2252
-(defun pg-xml-child-elt 83,2457
-(defun pg-xml-get-child 91,2739
-(defun pg-xml-get-text-content 101,3106
-(defmacro pg-xml-attr 112,3456
-(defmacro pg-xml-node 114,3518
-(defconst pg-xml-header117,3610
-(defun pg-xml-string-of 121,3686
-(defun pg-xml-output-internal 132,4053
-(defun pg-xml-cdata 166,5192
-(defsubst pg-pgip-get-area 174,5385
-(defun pg-pgip-get-icon 177,5502
-(defsubst pg-pgip-get-name 181,5650
-(defsubst pg-pgip-get-version 184,5767
-(defsubst pg-pgip-get-descr 187,5890
-(defsubst pg-pgip-get-thmname 190,6009
-(defsubst pg-pgip-get-thyname 193,6132
-(defsubst pg-pgip-get-url 196,6255
-(defsubst pg-pgip-get-srcid 199,6370
-(defsubst pg-pgip-get-proverid 202,6489
-(defsubst pg-pgip-get-symname 205,6614
-(defsubst pg-pgip-get-prefcat 208,6734
-(defsubst pg-pgip-get-default 211,6862
-(defsubst pg-pgip-get-objtype 214,6985
-(defsubst pg-pgip-get-value 217,7108
-(defalias 'pg-pgip-get-displaytext pg-pgip-get-displaytext220,7178
-(defun pg-pgip-get-pgmltext 222,7237
-
-generic/proof-autoloads.el,97
-(defsubst proof-shell-live-buffer 736,23730
-(defsubst proof-replace-regexp-in-string 892,29291
-
-generic/proof-auxmodes.el,149
-(defun proof-mmm-support-available 20,495
-(defun proof-maths-menu-support-available 42,1096
-(defun proof-unicode-tokens-support-available 56,1513
-
-generic/proof-config.el,7902
-(defgroup prover-config 80,2634
-(defcustom proof-guess-command-line 98,3484
-(defcustom proof-assistant-home-page 113,3979
-(defcustom proof-context-command 119,4149
-(defcustom proof-info-command 124,4283
-(defcustom proof-showproof-command 131,4554
-(defcustom proof-goal-command 136,4690
-(defcustom proof-save-command 144,4987
-(defcustom proof-find-theorems-command 152,5296
-(defcustom proof-query-identifier-command 159,5604
-(defcustom proof-assistant-true-value 173,6293
-(defcustom proof-assistant-false-value 179,6483
-(defcustom proof-assistant-format-int-fn 185,6677
-(defcustom proof-assistant-format-float-fn 192,6926
-(defcustom proof-assistant-format-string-fn 199,7181
-(defcustom proof-assistant-setting-format 206,7448
-(defcustom proof-tree-configured 216,7931
-(defgroup proof-script 234,8397
-(defcustom proof-terminal-string 239,8527
-(defcustom proof-electric-terminator-noterminator 249,8915
-(defcustom proof-script-sexp-commands 254,9087
-(defcustom proof-script-command-end-regexp 265,9546
-(defcustom proof-script-command-start-regexp 283,10367
-(defcustom proof-script-integral-proofs 294,10830
-(defcustom proof-script-fly-past-comments 309,11486
-(defcustom proof-script-parse-function 314,11657
-(defcustom proof-script-comment-start 332,12302
-(defcustom proof-script-comment-start-regexp 343,12739
-(defcustom proof-script-comment-end 351,13058
-(defcustom proof-script-comment-end-regexp 363,13480
-(defcustom proof-string-start-regexp 371,13793
-(defcustom proof-string-end-regexp 376,13958
-(defcustom proof-case-fold-search 381,14119
-(defcustom proof-save-command-regexp 390,14531
-(defcustom proof-save-with-hole-regexp 395,14641
-(defcustom proof-save-with-hole-result 406,15016
-(defcustom proof-goal-command-regexp 416,15460
-(defcustom proof-goal-with-hole-regexp 424,15747
-(defcustom proof-goal-with-hole-result 436,16190
-(defcustom proof-non-undoables-regexp 445,16568
-(defcustom proof-nested-undo-regexp 456,17031
-(defcustom proof-ignore-for-undo-count 472,17751
-(defcustom proof-script-imenu-generic-expression 480,18062
-(defcustom proof-goal-command-p 488,18401
-(defcustom proof-really-save-command-p 499,18892
-(defcustom proof-completed-proof-behaviour 508,19199
-(defcustom proof-count-undos-fn 536,20548
-(defcustom proof-find-and-forget-fn 548,21099
-(defcustom proof-forget-id-command 565,21808
-(defcustom pg-topterm-goalhyplit-fn 575,22166
-(defcustom proof-kill-goal-command 587,22709
-(defcustom proof-undo-n-times-cmd 601,23213
-(defcustom proof-nested-goals-history-p 615,23750
-(defcustom proof-arbitrary-undo-positions 624,24087
-(defcustom proof-state-preserving-p 638,24668
-(defcustom proof-activate-scripting-hook 648,25140
-(defcustom proof-deactivate-scripting-hook 667,25921
-(defcustom proof-no-fully-processed-buffer 676,26251
-(defcustom proof-script-evaluate-elisp-comment-regexp 687,26749
-(defcustom proof-indent 705,27335
-(defcustom proof-indent-hang 710,27442
-(defcustom proof-indent-enclose-offset 715,27568
-(defcustom proof-indent-open-offset 720,27710
-(defcustom proof-indent-close-offset 725,27847
-(defcustom proof-indent-any-regexp 730,27985
-(defcustom proof-indent-inner-regexp 735,28145
-(defcustom proof-indent-enclose-regexp 740,28299
-(defcustom proof-indent-open-regexp 745,28453
-(defcustom proof-indent-close-regexp 750,28605
-(defcustom proof-script-font-lock-keywords 756,28759
-(defcustom proof-script-syntax-table-entries 764,29111
-(defcustom proof-script-span-context-menu-extensions 782,29507
-(defgroup proof-shell 808,30267
-(defcustom proof-prog-name 818,30437
-(defcustom proof-shell-auto-terminate-commands 830,30904
-(defcustom proof-shell-pre-sync-init-cmd 839,31309
-(defcustom proof-shell-init-cmd 853,31867
-(defcustom proof-shell-init-hook 865,32413
-(defcustom proof-shell-restart-cmd 870,32552
-(defcustom proof-shell-quit-cmd 875,32707
-(defcustom proof-shell-cd-cmd 880,32874
-(defcustom proof-shell-start-silent-cmd 897,33545
-(defcustom proof-shell-stop-silent-cmd 906,33921
-(defcustom proof-shell-silent-threshold 915,34256
-(defcustom proof-shell-inform-file-processed-cmd 923,34590
-(defcustom proof-shell-inform-file-retracted-cmd 944,35518
-(defcustom proof-auto-multiple-files 972,36790
-(defcustom proof-cannot-reopen-processed-files 987,37511
-(defcustom proof-shell-annotated-prompt-regexp 1007,38302
-(defcustom proof-shell-error-regexp 1022,38867
-(defcustom proof-shell-truncate-before-error 1042,39677
-(defcustom pg-next-error-regexp 1056,40216
-(defcustom pg-next-error-filename-regexp 1071,40825
-(defcustom pg-next-error-extract-filename 1095,41858
-(defcustom proof-shell-interrupt-regexp 1102,42101
-(defcustom proof-shell-proof-completed-regexp 1116,42704
-(defcustom proof-shell-clear-response-regexp 1129,43220
-(defcustom proof-shell-clear-goals-regexp 1141,43680
-(defcustom proof-shell-start-goals-regexp 1153,44134
-(defcustom proof-shell-end-goals-regexp 1166,44709
-(defcustom proof-shell-eager-annotation-start 1180,45299
-(defcustom proof-shell-eager-annotation-start-length 1203,46318
-(defcustom proof-shell-eager-annotation-end 1214,46744
-(defcustom proof-shell-strip-output-markup 1230,47419
-(defcustom proof-shell-assumption-regexp 1239,47804
-(defcustom proof-shell-process-file 1249,48208
-(defcustom proof-shell-retract-files-regexp 1275,49284
-(defcustom proof-shell-compute-new-files-list 1288,49772
-(defcustom pg-special-char-regexp 1303,50339
-(defcustom proof-shell-set-elisp-variable-regexp 1308,50483
-(defcustom proof-shell-match-pgip-cmd 1346,52157
-(defcustom proof-shell-issue-pgip-cmd 1360,52647
-(defcustom proof-use-pgip-askprefs 1365,52820
-(defcustom proof-shell-query-dependencies-cmd 1373,53167
-(defcustom proof-shell-theorem-dependency-list-regexp 1380,53427
-(defcustom proof-shell-theorem-dependency-list-split 1396,54095
-(defcustom proof-shell-show-dependency-cmd 1405,54526
-(defcustom proof-shell-trace-output-regexp 1427,55432
-(defcustom proof-shell-thms-output-regexp 1445,56034
-(defcustom proof-shell-interactive-prompt-regexp 1453,56368
-(defcustom proof-tokens-activate-command 1472,57021
-(defcustom proof-tokens-deactivate-command 1479,57261
-(defcustom proof-tokens-extra-modes 1486,57506
-(defcustom proof-shell-unicode 1501,58011
-(defcustom proof-shell-filename-escapes 1510,58401
-(defcustom proof-shell-process-connection-type 1527,59081
-(defcustom proof-shell-strip-crs-from-input 1533,59308
-(defcustom proof-shell-strip-crs-from-output 1545,59791
-(defcustom proof-shell-extend-queue-hook 1553,60159
-(defcustom proof-shell-insert-hook 1563,60589
-(defcustom proof-script-preprocess 1606,62687
-(defcustom proof-shell-handle-delayed-output-hook1612,62838
-(defcustom proof-shell-handle-error-or-interrupt-hook1618,63053
-(defcustom proof-shell-signal-interrupt-hook 1636,63799
-(defcustom proof-shell-pre-interrupt-hook1647,64268
-(defcustom proof-shell-handle-output-system-specific 1655,64539
-(defcustom proof-state-change-hook 1678,65512
-(defcustom proof-shell-syntax-table-entries 1688,65905
-(defgroup proof-goals 1706,66276
-(defcustom pg-subterm-first-special-char 1711,66397
-(defcustom pg-subterm-anns-use-stack 1719,66709
-(defcustom pg-goals-change-goal 1728,67008
-(defcustom pbp-goal-command 1733,67124
-(defcustom pbp-hyp-command 1738,67288
-(defcustom pg-subterm-help-cmd 1743,67458
-(defcustom pg-goals-error-regexp 1750,67702
-(defcustom proof-shell-result-start 1755,67870
-(defcustom proof-shell-result-end 1761,68112
-(defcustom pg-subterm-start-char 1767,68325
-(defcustom pg-subterm-sep-char 1778,68799
-(defcustom pg-subterm-end-char 1784,68978
-(defcustom pg-topterm-regexp 1790,69135
-(defcustom proof-goals-font-lock-keywords 1805,69735
-(defcustom proof-response-font-lock-keywords 1813,70094
-(defcustom proof-shell-font-lock-keywords 1821,70456
-(defcustom pg-before-fontify-output-hook 1832,70970
-(defcustom pg-after-fontify-output-hook 1840,71331
-
-generic/proof-depends.el,917
-(defvar proof-thm-names-of-files 25,639
-(defvar proof-def-names-of-files 31,923
-(defun proof-depends-module-name-for-buffer 42,1238
-(defun proof-depends-module-of 52,1679
-(defun proof-depends-names-in-same-file 60,1970
-(defun proof-depends-process-dependencies 79,2578
-(defun proof-dependency-in-span-context-menu 132,4313
-(defun proof-dep-alldeps-menu 155,5203
-(defun proof-dep-make-alldeps-menu 161,5429
-(defun proof-dep-split-deps 179,5924
-(defun proof-dep-make-submenu 198,6590
-(defun proof-make-highlight-depts-menu 209,7001
-(defun proof-goto-dependency 220,7309
-(defun proof-show-dependency 227,7561
-(defconst pg-dep-span-priority 234,7850
-(defconst pg-ordinary-span-priority 235,7886
-(defun proof-highlight-depcs 237,7928
-(defun proof-highlight-depts 248,8394
-(defun proof-depends-save-old-face 260,8904
-(defun proof-depends-restore-old-face 265,9081
-(defun proof-dep-unhighlight 271,9310
-
-generic/proof-easy-config.el,193
-(defconst proof-easy-config-derived-modes-table17,605
-(defun proof-easy-config-define-derived-modes 24,1011
-(defun proof-easy-config-check-setup 53,2196
-(defmacro proof-easy-config 85,3526
-
-generic/proof-faces.el,1809
-(defgroup proof-faces 29,809
-(defconst pg-defface-window-systems36,989
-(defmacro proof-face-specs 49,1551
-(defface proof-queue-face64,2003
-(defface proof-locked-face72,2278
-(defface proof-declaration-name-face82,2604
-(defface proof-tacticals-name-face91,2890
-(defface proof-tactics-name-face100,3152
-(defface proof-error-face109,3417
-(defface proof-warning-face117,3638
-(defface proof-eager-annotation-face126,3895
-(defface proof-debug-message-face134,4113
-(defface proof-boring-face142,4312
-(defface proof-mouse-highlight-face150,4504
-(defface proof-command-mouse-highlight-face158,4722
-(defface proof-region-mouse-highlight-face166,4961
-(defface proof-highlight-dependent-face174,5203
-(defface proof-highlight-dependency-face182,5410
-(defface proof-active-area-face190,5607
-(defface proof-script-sticky-error-face198,5919
-(defface proof-script-highlight-error-face206,6148
-(defconst proof-face-compat-doc 218,6493
-(defconst proof-queue-face 219,6573
-(defconst proof-locked-face 220,6641
-(defconst proof-declaration-name-face 221,6711
-(defconst proof-tacticals-name-face 222,6801
-(defconst proof-tactics-name-face 223,6887
-(defconst proof-error-face 224,6969
-(defconst proof-script-sticky-error-face 225,7037
-(defconst proof-script-highlight-error-face 226,7133
-(defconst proof-warning-face 227,7235
-(defconst proof-eager-annotation-face 228,7307
-(defconst proof-debug-message-face 229,7397
-(defconst proof-boring-face 230,7481
-(defconst proof-mouse-highlight-face 231,7551
-(defconst proof-command-mouse-highlight-face 232,7639
-(defconst proof-region-mouse-highlight-face 233,7743
-(defconst proof-highlight-dependent-face 234,7845
-(defconst proof-highlight-dependency-face 235,7941
-(defconst proof-active-area-face 236,8039
-(defconst proof-script-error-face 237,8119
-
-generic/proof-indent.el,219
-(defun proof-indent-indent 19,449
-(defun proof-indent-offset 28,715
-(defun proof-indent-inner-p 45,1316
-(defun proof-indent-goto-prev 54,1616
-(defun proof-indent-calculate 61,1949
-(defun proof-indent-line 82,2708
-
-generic/proof-maths-menu.el,83
-(defun proof-maths-menu-set-global 32,906
-(defun proof-maths-menu-enable 46,1357
-
-generic/proof-menu.el,2215
-(defvar proof-display-some-buffers-count 36,820
-(defun proof-display-some-buffers 38,865
-(defun proof-menu-define-keys 95,3006
-(defun proof-menu-define-main 154,5912
-(defvar proof-menu-favourites 163,6097
-(defvar proof-menu-settings 166,6204
-(defun proof-menu-define-specific 170,6293
-(defun proof-assistant-menu-update 213,7555
-(defvar proof-help-menu227,7988
-(defvar proof-show-hide-menu235,8252
-(defvar proof-buffer-menu246,8676
-(defun proof-keep-response-history 312,11125
-(defconst proof-quick-opts-menu320,11435
-(defun proof-quick-opts-vars 546,20709
-(defun proof-quick-opts-changed-from-defaults-p 578,21649
-(defun proof-quick-opts-changed-from-saved-p 582,21754
-(defun proof-set-document-centred 590,21910
-(defun proof-set-non-document-centred 603,22336
-(defun proof-quick-opts-save 622,23047
-(defun proof-quick-opts-reset 627,23215
-(defconst proof-config-menu639,23483
-(defconst proof-advanced-menu646,23662
-(defvar proof-menu664,24346
-(defun proof-main-menu 673,24628
-(defun proof-aux-menu 685,24967
-(defun proof-menu-define-favourites-menu 701,25313
-(defun proof-def-favourite 721,25962
-(defvar proof-make-favourite-cmd-history 748,26955
-(defvar proof-make-favourite-menu-history 751,27040
-(defun proof-save-favourites 754,27126
-(defun proof-del-favourite 759,27274
-(defun proof-read-favourite 776,27830
-(defun proof-add-favourite 800,28604
-(defun proof-menu-define-settings-menu 827,29649
-(defun proof-menu-entry-name 856,30641
-(defun proof-menu-entry-for-setting 866,30991
-(defun proof-settings-vars 889,31629
-(defun proof-settings-changed-from-defaults-p 894,31806
-(defun proof-settings-changed-from-saved-p 898,31912
-(defun proof-settings-save 902,32015
-(defun proof-settings-reset 907,32182
-(defun proof-assistant-invisible-command-ifposs 912,32345
-(defun proof-maybe-askprefs 934,33315
-(defun proof-assistant-settings-cmd 950,33932
-(defun proof-assistant-settings-cmds 958,34215
-(defvar proof-assistant-format-table973,34657
-(defun proof-assistant-format-bool 982,35083
-(defun proof-assistant-format-int 985,35196
-(defun proof-assistant-format-float 988,35288
-(defun proof-assistant-format-string 991,35384
-(defun proof-assistant-format 994,35482
-
-generic/proof-mmm.el,70
-(defun proof-mmm-set-global 43,1439
-(defun proof-mmm-enable 58,1978
-
-generic/proof-script.el,5814
-(deflocal proof-active-buffer-fake-minor-mode 48,1552
-(deflocal proof-script-buffer-file-name 51,1678
-(deflocal pg-script-portions 58,2088
-(defalias 'proof-active-buffer-fake-minor-modeproof-active-buffer-fake-minor-mode61,2194
-(defun proof-next-element-count 70,2389
-(defun proof-element-id 76,2631
-(defun proof-next-element-id 80,2800
-(deflocal proof-locked-span 116,4104
-(deflocal proof-queue-span 123,4370
-(deflocal proof-overlay-arrow 132,4856
-(defun proof-span-give-warning 138,4983
-(defun proof-span-read-only 144,5163
-(defun proof-strict-read-only 153,5536
-(defsubst proof-set-queue-endpoints 163,5914
-(defun proof-set-overlay-arrow 167,6055
-(defsubst proof-set-locked-endpoints 178,6393
-(defsubst proof-detach-queue 183,6569
-(defsubst proof-detach-locked 188,6708
-(defsubst proof-set-queue-start 195,6933
-(defsubst proof-set-locked-end 199,7059
-(defsubst proof-set-queue-end 211,7529
-(defun proof-init-segmentation 222,7826
-(defun proof-colour-locked 252,9077
-(defun proof-colour-locked-span 259,9350
-(defun proof-sticky-errors 265,9623
-(defun proof-restart-buffers 278,10039
-(defun proof-script-buffers-with-spans 302,10972
-(defun proof-script-remove-all-spans-and-deactivate 312,11328
-(defun proof-script-clear-queue-spans-on-error 316,11518
-(defun proof-script-delete-spans 342,12535
-(defun proof-script-delete-secondary-spans 347,12734
-(defun proof-unprocessed-begin 360,13023
-(defun proof-script-end 368,13277
-(defun proof-queue-or-locked-end 377,13587
-(defun proof-locked-region-full-p 396,14180
-(defun proof-locked-region-empty-p 405,14452
-(defun proof-only-whitespace-to-locked-region-p 409,14602
-(defun proof-in-locked-region-p 419,14951
-(defun proof-goto-end-of-locked 431,15208
-(defun proof-goto-end-of-locked-if-pos-not-visible-in-window 448,15995
-(defun proof-goto-end-of-locked-on-error-if-pos-not-visible-in-window 459,16476
-(defun proof-end-of-locked-visible-p 471,17016
-(defconst pg-idioms 490,17609
-(defconst pg-all-idioms 493,17705
-(defun pg-clear-script-portions 497,17826
-(defun pg-remove-element 503,18061
-(defun pg-get-element 511,18364
-(defun pg-add-element 521,18679
-(defun pg-invisible-prop 569,20641
-(defun pg-set-element-span-invisible 574,20842
-(defun pg-toggle-element-span-visibility 587,21408
-(defun pg-open-invisible-span 592,21569
-(defun pg-make-element-invisible 597,21740
-(defun pg-make-element-visible 602,21951
-(defun pg-toggle-element-visibility 607,22145
-(defun pg-show-all-portions 613,22408
-(defun pg-show-all-proofs 635,23152
-(defun pg-hide-all-proofs 640,23280
-(defun pg-add-proof-element 645,23411
-(defun pg-span-name 660,24198
-(defvar pg-span-context-menu-keymap693,25405
-(defun pg-last-output-displayform 700,25643
-(defun pg-set-span-helphighlights 723,26534
-(defun proof-complete-buffer-atomic 786,28681
-(defun proof-register-possibly-new-processed-file815,29951
-(defun proof-query-save-this-buffer-p 861,31825
-(defun proof-inform-prover-file-retracted 866,32050
-(defun proof-auto-retract-dependencies 886,32901
-(defun proof-unregister-buffer-file-name 940,35451
-(defsubst proof-action-completed 986,37276
-(defun proof-protected-process-or-retract 990,37446
-(defun proof-deactivate-scripting-auto 1018,38677
-(defun proof-deactivate-scripting-query-user-action 1027,39035
-(defun proof-deactivate-scripting-choose-action 1071,40544
-(defun proof-deactivate-scripting 1083,40929
-(defun proof-activate-scripting 1180,45052
-(defun proof-toggle-active-scripting 1280,49591
-(defun proof-done-advancing 1319,50836
-(defun proof-done-advancing-comment 1387,53333
-(defun proof-done-advancing-save 1421,54719
-(defun proof-make-goalsave1509,58083
-(defun proof-get-name-from-goal 1527,58948
-(defun proof-done-advancing-autosave 1547,59973
-(defun proof-done-advancing-other 1611,62469
-(defun proof-segment-up-to-parser 1640,63433
-(defun proof-script-generic-parse-find-comment-end 1710,65714
-(defun proof-script-generic-parse-cmdend 1719,66128
-(defun proof-script-generic-parse-cmdstart 1770,68024
-(defun proof-script-generic-parse-sexp 1809,69624
-(defun proof-semis-to-vanillas 1821,70090
-(defun proof-next-command-new-line 1874,71763
-(defun proof-script-next-command-advance 1879,71969
-(defun proof-assert-until-point 1898,72469
-(defun proof-assert-electric-terminator 1914,73140
-(defun proof-assert-semis 1958,74820
-(defun proof-retract-before-change 1972,75581
-(defun proof-insert-pbp-command 1995,76237
-(defun proof-insert-sendback-command 2010,76740
-(defun proof-done-retracting 2036,77643
-(defun proof-setup-retract-action 2071,79097
-(defun proof-last-goal-or-goalsave 2083,79702
-(defun proof-retract-target 2107,80614
-(defun proof-retract-until-point-interactive 2186,83867
-(defun proof-retract-until-point 2195,84274
-(define-derived-mode proof-mode 2253,86415
-(defun proof-script-set-visited-file-name 2289,87797
-(defun proof-script-set-buffer-hooks 2311,88810
-(defun proof-script-kill-buffer-fn 2319,89228
-(defun proof-config-done-related 2351,90545
-(defun proof-generic-goal-command-p 2422,93402
-(defun proof-generic-state-preserving-p 2427,93615
-(defun proof-generic-count-undos 2436,94132
-(defun proof-generic-find-and-forget 2467,95260
-(defconst proof-script-important-settings2518,97032
-(defun proof-config-done 2533,97578
-(defun proof-setup-parsing-mechanism 2605,99856
-(defun proof-setup-imenu 2629,100928
-(deflocal proof-segment-up-to-cache 2666,102210
-(deflocal proof-segment-up-to-cache-start 2670,102353
-(deflocal proof-segment-up-to-cache-end 2671,102398
-(deflocal proof-last-edited-low-watermark 2672,102441
-(defun proof-segment-up-to-using-cache 2674,102489
-(defun proof-segment-cache-contents-for 2702,103609
-(defun proof-script-after-change-function 2719,104191
-(defun proof-script-set-after-change-functions 2731,104698
-
-generic/proof-shell.el,4011
-(defvar proof-marker 35,775
-(defvar proof-action-list 38,871
-(defsubst proof-shell-invoke-callback 80,2584
-(defvar proof-second-action-list-active 86,2794
-(defvar proof-shell-last-goals-output 108,3747
-(defvar proof-shell-last-response-output 111,3827
-(defvar proof-shell-delayed-output-start 114,3914
-(defvar proof-shell-delayed-output-end 118,4096
-(defvar proof-shell-delayed-output-flags 122,4276
-(defvar proof-shell-interrupt-pending 125,4401
-(defvar proof-shell-exit-in-progress 130,4625
-(defcustom proof-shell-active-scripting-indicator142,4970
-(defun proof-shell-ready-prover 194,6554
-(defsubst proof-shell-live-buffer 208,7093
-(defun proof-shell-available-p 215,7313
-(defun proof-grab-lock 221,7535
-(defun proof-release-lock 231,7964
-(defcustom proof-shell-fiddle-frames 241,8138
-(defvar proof-shell-filter-active 246,8296
-(defvar proof-shell-filter-was-blocked 249,8380
-(defun proof-shell-set-text-representation 253,8564
-(defun proof-shell-make-associated-buffers 260,8891
-(defun proof-shell-start 276,9557
-(defvar proof-shell-kill-function-hooks 439,15123
-(defun proof-shell-kill-function 442,15221
-(defun proof-shell-clear-state 507,17520
-(defun proof-shell-exit 523,17995
-(defun proof-shell-bail-out 547,18929
-(defun proof-shell-restart 557,19451
-(defvar proof-shell-urgent-message-marker 598,20823
-(defvar proof-shell-urgent-message-scanner 601,20944
-(defun proof-shell-handle-error-output 605,21129
-(defun proof-shell-handle-error-or-interrupt 631,21991
-(defun proof-shell-error-or-interrupt-action 674,23740
-(defun proof-goals-pos 704,25018
-(defun proof-pbp-focus-on-first-goal 709,25229
-(defsubst proof-shell-string-match-safe 721,25645
-(defun proof-shell-handle-immediate-output 725,25806
-(defun proof-interrupt-process 792,28413
-(defun proof-shell-insert 827,29695
-(defun proof-shell-action-list-item 884,31677
-(defun proof-shell-set-silent 889,31919
-(defun proof-shell-start-silent-item 895,32138
-(defun proof-shell-clear-silent 901,32327
-(defun proof-shell-stop-silent-item 907,32549
-(defsubst proof-shell-should-be-silent 913,32738
-(defsubst proof-shell-insert-action-item 925,33311
-(defsubst proof-shell-slurp-comments 929,33486
-(defun proof-add-to-queue 940,33891
-(defun proof-start-queue 996,35997
-(defun proof-extend-queue 1008,36392
-(defun proof-shell-exec-loop 1027,37011
-(defun proof-shell-insert-loopback-cmd 1111,40037
-(defun proof-shell-process-urgent-message 1136,41201
-(defun proof-shell-process-urgent-message-default 1192,43226
-(defun proof-shell-process-urgent-message-trace 1208,43810
-(defun proof-shell-process-urgent-message-retract 1220,44333
-(defun proof-shell-process-urgent-message-elisp 1246,45463
-(defun proof-shell-process-urgent-message-thmdeps 1261,45958
-(defun proof-shell-process-interactive-prompt-regexp 1271,46302
-(defun proof-shell-strip-eager-annotations 1283,46658
-(defun proof-shell-filter-wrapper 1299,47158
-(defun proof-shell-filter 1331,48402
-(defun proof-shell-filter-first-command 1437,52153
-(defun proof-shell-process-urgent-messages 1452,52696
-(defun proof-shell-filter-manage-output 1502,54262
-(defsubst proof-shell-display-output-as-response 1539,55753
-(defun proof-shell-handle-delayed-output 1545,56048
-(defvar pg-last-tracing-output-time 1649,59620
-(defvar pg-last-trace-output-count 1652,59733
-(defconst pg-slow-mode-trigger-count 1655,59818
-(defconst pg-slow-mode-duration 1658,59923
-(defconst pg-fast-tracing-mode-threshold 1661,60005
-(defun pg-tracing-tight-loop 1664,60134
-(defun pg-finish-tracing-display 1688,61166
-(defun proof-shell-wait 1708,61662
-(defun proof-done-invisible 1738,62873
-(defun proof-shell-invisible-command 1744,63043
-(defun proof-shell-invisible-cmd-get-result 1791,64635
-(defun proof-shell-invisible-command-invisible-result 1803,65071
-(defun pg-insert-last-output-as-comment 1823,65572
-(define-derived-mode proof-shell-mode 1842,66044
-(defconst proof-shell-important-settings1879,67079
-(defun proof-shell-config-done 1885,67194
-
-generic/proof-site.el,708
-(defconst proof-assistant-table-default36,1211
-(defconst proof-general-short-version78,2415
-(defconst proof-general-version-year 84,2602
-(defgroup proof-general 91,2755
-(defgroup proof-general-internals 96,2863
-(defun proof-home-directory-fn 109,3251
-(defcustom proof-home-directory120,3623
-(defcustom proof-images-directory129,3989
-(defcustom proof-info-directory135,4191
-(defun proof-add-to-load-path 150,4667
-(defcustom proof-assistant-table177,5517
-(defcustom proof-assistants 218,6959
-(defun proof-ready-for-assistant 247,8113
-(defvar proof-general-configured-provers 298,10348
-(defun proof-chose-prover 371,12961
-(defun proofgeneral 376,13093
-(defun proof-visit-example-file 385,13411
-
-generic/proof-splash.el,991
-(defcustom proof-splash-enable 34,1009
-(defcustom proof-splash-time 39,1161
-(defcustom proof-splash-contents47,1445
-(defconst proof-splash-startup-msg91,3016
-(defconst proof-splash-welcome 100,3394
-(define-derived-mode proof-splash-mode 103,3498
-(define-key proof-splash-mode-map 109,3672
-(define-key proof-splash-mode-map 110,3724
-(defsubst proof-emacs-imagep 115,3851
-(defun proof-get-image 120,3976
-(defvar proof-splash-timeout-conf 142,4776
-(defun proof-splash-centre-spaces 145,4889
-(defun proof-splash-remove-screen 172,6045
-(defun proof-splash-remove-buffer 189,6701
-(defvar proof-splash-seen 200,7089
-(defun proof-splash-insert-contents 203,7191
-(defun proof-splash-display-screen 243,8321
-(defalias 'pg-about pg-about279,9843
-(defun proof-splash-message 282,9909
-(defun proof-splash-timeout-waiter 295,10367
-(defvar proof-splash-old-frame-title-format 308,10927
-(defun proof-splash-set-frame-titles 310,10977
-(defun proof-splash-unset-frame-titles 319,11292
-
-generic/proof-syntax.el,1278
-(defsubst proof-ids-to-regexp 22,516
-(defsubst proof-anchor-regexp 29,754
-(defconst proof-no-regexp 33,859
-(defsubst proof-regexp-alt 36,950
-(defsubst proof-regexp-alt-list 45,1262
-(defsubst proof-re-search-forward-region 49,1397
-(defsubst proof-search-forward 62,1895
-(defsubst proof-replace-regexp-in-string 69,2165
-(defsubst proof-re-search-forward 74,2416
-(defsubst proof-re-search-backward 79,2674
-(defsubst proof-re-search-forward-safe 84,2935
-(defsubst proof-string-match 90,3216
-(defsubst proof-string-match-safe 95,3445
-(defsubst proof-stringfn-match 99,3649
-(defsubst proof-looking-at 106,3912
-(defsubst proof-looking-at-safe 111,4099
-(defun proof-buffer-syntactic-context 120,4312
-(defsubst proof-looking-at-syntactic-context-default 141,5174
-(defun proof-looking-at-syntactic-context 150,5529
-(defun proof-inside-comment 159,5991
-(defun proof-inside-string 165,6164
-(defsubst proof-replace-string 175,6363
-(defsubst proof-replace-regexp 180,6567
-(defsubst proof-replace-regexp-nocasefold 185,6776
-(defvar proof-id 195,7064
-(defsubst proof-ids 201,7284
-(defun proof-zap-commas 208,7536
-(defadvice font-lock-fontify-keywords-region234,8422
-(defun proof-format 250,9018
-(defun proof-format-filename 269,9657
-(defun proof-insert 316,11059
-
-generic/proof-toolbar.el,2402
-(defun proof-toolbar-function 34,872
-(defun proof-toolbar-icon 38,1019
-(defun proof-toolbar-enabler 42,1166
-(defun proof-toolbar-make-icon 51,1368
-(defun proof-toolbar-make-toolbar-items 60,1676
-(defvar proof-toolbar-map 86,2537
-(defun proof-toolbar-available-p 89,2636
-(defun proof-toolbar-setup 99,2942
-(defun proof-toolbar-enable 121,3833
-(defalias 'proof-toolbar-undo proof-toolbar-undo154,4891
-(defun proof-toolbar-undo-enable-p 156,4959
-(defalias 'proof-toolbar-delete proof-toolbar-delete163,5117
-(defun proof-toolbar-delete-enable-p 165,5198
-(defalias 'proof-toolbar-home proof-toolbar-home173,5380
-(defalias 'proof-toolbar-next proof-toolbar-next177,5447
-(defun proof-toolbar-next-enable-p 179,5518
-(defalias 'proof-toolbar-goto proof-toolbar-goto185,5634
-(defun proof-toolbar-goto-enable-p 187,5684
-(defalias 'proof-toolbar-retract proof-toolbar-retract192,5769
-(defun proof-toolbar-retract-enable-p 194,5826
-(defalias 'proof-toolbar-use proof-toolbar-use200,5945
-(defalias 'proof-toolbar-use-enable-p proof-toolbar-use-enable-p201,5997
-(defalias 'proof-toolbar-prooftree proof-toolbar-prooftree205,6080
-(defalias 'proof-toolbar-restart proof-toolbar-restart209,6165
-(defalias 'proof-toolbar-goal proof-toolbar-goal213,6230
-(defalias 'proof-toolbar-qed proof-toolbar-qed217,6288
-(defun proof-toolbar-qed-enable-p 219,6337
-(defalias 'proof-toolbar-state proof-toolbar-state227,6499
-(defalias 'proof-toolbar-state-enable-p proof-toolbar-state-enable-p228,6542
-(defalias 'proof-toolbar-context proof-toolbar-context232,6621
-(defalias 'proof-toolbar-context-enable-p proof-toolbar-context-enable-p233,6667
-(defalias 'proof-toolbar-command proof-toolbar-command237,6748
-(defalias 'proof-toolbar-command-enable-p proof-toolbar-command-enable-p238,6804
-(defun proof-toolbar-help 242,6909
-(defalias 'proof-toolbar-find proof-toolbar-find248,6989
-(defalias 'proof-toolbar-find-enable-p proof-toolbar-find-enable-p249,7041
-(defalias 'proof-toolbar-info proof-toolbar-info253,7116
-(defalias 'proof-toolbar-info-enable-p proof-toolbar-info-enable-p254,7171
-(defalias 'proof-toolbar-visibility proof-toolbar-visibility258,7269
-(defun proof-toolbar-visibility-enable-p 260,7329
-(defalias 'proof-toolbar-interrupt proof-toolbar-interrupt265,7443
-(defun proof-toolbar-interrupt-enable-p 266,7504
-(defun proof-toolbar-scripting-menu 274,7657
-
-generic/proof-tree.el,3683
-(defgroup proof-tree 99,4376
-(defcustom proof-tree-program 104,4517
-(defcustom proof-tree-arguments 109,4663
-(defgroup proof-tree-internals 119,4823
-(defcustom proof-tree-ignored-commands-regexp 127,5092
-(defcustom proof-tree-navigation-command-regexp 139,5591
-(defcustom proof-tree-cheating-regexp 147,5910
-(defcustom proof-tree-new-layer-command-regexp 156,6307
-(defcustom proof-tree-current-goal-regexp 165,6699
-(defcustom proof-tree-update-goal-regexp 175,7101
-(defcustom proof-tree-additional-subgoal-ID-regexp 187,7670
-(defcustom proof-tree-existential-regexp 195,7989
-(defcustom proof-tree-existentials-state-start-regexp 209,8609
-(defcustom proof-tree-existentials-state-end-regexp 220,9160
-(defcustom proof-tree-branch-finished-regexp 232,9803
-(defcustom proof-tree-get-proof-info 242,10194
-(defcustom proof-tree-extract-instantiated-existentials 266,11235
-(defcustom proof-tree-show-sequent-command 283,11953
-(defcustom proof-tree-find-begin-of-unfinished-proof 297,12575
-(defcustom proof-tree-find-undo-position 308,13138
-(defcustom proof-tree-urgent-action-hook 318,13586
-(defvar proof-tree-external-display 342,14441
-(defvar proof-tree-process 353,14946
-(defconst proof-tree-process-name 356,15035
-(defconst proof-tree-process-buffer-name359,15134
-(defvar proof-tree-process-buffer 363,15291
-(defconst proof-tree-emacs-exec-regexp366,15390
-(defvar proof-tree-last-state 370,15557
-(defvar proof-tree-current-proof 374,15661
-(defvar proof-tree-sequent-hash 379,15842
-(defvar proof-tree-existentials-alist 394,16549
-(defvar proof-tree-existentials-alist-history 405,17048
-(defvar proof-tree-output-marker 414,17267
-(defvar proof-tree-filter-continuation 418,17448
-(defun proof-tree-stop-external-display 425,17802
-(defun proof-tree-handle-proof-tree-undo 432,18065
-(defun proof-tree-insert-script 444,18537
-(defun proof-tree-insert-output 470,19488
-(defun proof-tree-process-filter 487,20174
-(defun proof-tree-process-sentinel 547,22505
-(defun proof-tree-start-process 555,22833
-(defun proof-tree-is-running 592,24292
-(defun proof-tree-ensure-running 597,24453
-(defconst proof-tree-protocol-version 607,24657
-(defun proof-tree-send-message 612,24857
-(defun proof-tree-send-configure 626,25343
-(defun proof-tree-send-goal-state 634,25560
-(defun proof-tree-send-update-sequent 662,26678
-(defun proof-tree-send-switch-goal 675,27115
-(defun proof-tree-send-branch-finished 684,27441
-(defun proof-tree-send-proof-complete 698,27956
-(defun proof-tree-send-undo 706,28205
-(defun proof-tree-send-quit-proof 711,28387
-(defun proof-tree-record-existentials-state 722,28722
-(defun proof-tree-undo-state-var 735,29272
-(defun proof-tree-undo-existentials 754,30053
-(defun proof-tree-delete-existential-assoc 762,30368
-(defun proof-tree-add-existential-assoc 768,30631
-(defun proof-tree-clear-existentials 781,31246
-(defun proof-tree-show-goal-callback 791,31514
-(defun proof-tree-make-show-goal-callback 812,32501
-(defun proof-tree-urgent-action 816,32662
-(defun proof-tree-quit-proof 881,35198
-(defun proof-tree-register-existentials 891,35617
-(defun proof-tree-extract-goals 904,36161
-(defun proof-tree-extract-list 926,37106
-(defun proof-tree-extract-existential-info 949,38076
-(defun proof-tree-handle-proof-progress 970,38967
-(defun proof-tree-handle-navigation 1027,41464
-(defun proof-tree-handle-proof-command 1045,42190
-(defun proof-tree-handle-undo 1061,42893
-(defun proof-tree-update-sequent 1093,44192
-(defun proof-tree-handle-delayed-output 1134,45960
-(defun proof-tree-leave-buffer 1194,48408
-(defun proof-tree-display-current-proof 1206,48691
-(defun proof-tree-external-display-toggle 1238,50032
-
-generic/proof-unicode-tokens.el,497
-(defvar proof-unicode-tokens-initialised 31,827
-(defun proof-unicode-tokens-init 34,934
-(defun proof-unicode-tokens-configure 48,1436
-(defun proof-unicode-tokens-mode-if-enabled 60,1882
-(defun proof-unicode-tokens-set-global 66,2081
-(defun proof-unicode-tokens-enable 82,2651
-(defun proof-unicode-tokens-reconfigure 102,3504
-(defun proof-unicode-tokens-configure-prover 128,4392
-(defun proof-unicode-tokens-activate-prover 133,4573
-(defun proof-unicode-tokens-deactivate-prover 140,4819
-
-generic/proof-useropts.el,1785
-(defgroup proof-user-options 21,566
-(defun proof-set-value 29,745
-(defcustom proof-electric-terminator-enable 62,1868
-(defcustom proof-next-command-insert-space 74,2400
-(defcustom proof-toolbar-enable 82,2730
-(defcustom proof-imenu-enable 88,2903
-(defcustom pg-show-hints 94,3074
-(defcustom proof-shell-quiet-errors 99,3207
-(defcustom proof-trace-output-slow-catchup 106,3478
-(defcustom proof-strict-state-preserving 116,3975
-(defcustom proof-strict-read-only 129,4584
-(defcustom proof-three-window-enable 142,5163
-(defcustom proof-multiple-frames-enable 161,5911
-(defcustom proof-layout-windows-on-visit-file 171,6306
-(defcustom proof-three-window-mode-policy 180,6690
-(defcustom proof-delete-empty-windows 199,7405
-(defcustom proof-shrink-windows-tofit 210,7936
-(defcustom proof-auto-raise-buffers 217,8208
-(defcustom proof-colour-locked 224,8443
-(defcustom proof-sticky-errors 232,8693
-(defcustom proof-query-file-save-when-activating-scripting239,8910
-(defcustom proof-prog-name-ask255,9630
-(defcustom proof-prog-name-guess261,9790
-(defcustom proof-tidy-response269,10055
-(defcustom proof-keep-response-history283,10518
-(defcustom pg-input-ring-size 293,10906
-(defcustom proof-general-debug 298,11058
-(defcustom proof-use-parser-cache 307,11429
-(defcustom proof-follow-mode 314,11683
-(defcustom proof-auto-action-when-deactivating-scripting 338,12860
-(defcustom proof-rsh-command 366,14042
-(defcustom proof-disappearing-proofs 382,14600
-(defcustom proof-full-annotation 387,14761
-(defcustom proof-output-tooltips 397,15224
-(defcustom proof-minibuffer-messages 408,15731
-(defcustom proof-autosend-enable 416,16040
-(defcustom proof-autosend-delay 422,16220
-(defcustom proof-autosend-all 428,16378
-(defcustom proof-fast-process-buffer 433,16547
-
-generic/proof-utils.el,1645
-(defmacro proof-with-current-buffer-if-exists 61,1737
-(defmacro proof-with-script-buffer 70,2114
-(defmacro proof-map-buffers 81,2495
-(defmacro proof-sym 86,2680
-(defsubst proof-try-require 91,2841
-(defun proof-save-some-buffers 104,3172
-(defun proof-save-this-buffer 124,3768
-(defun proof-file-truename 137,4132
-(defun proof-files-to-buffers 141,4314
-(defun proof-buffers-in-mode 149,4553
-(defun pg-save-from-death 163,5003
-(defun proof-define-keys 182,5619
-(defun pg-remove-specials 193,5904
-(defun pg-remove-specials-in-string 203,6240
-(defun proof-safe-split-window-vertically 213,6465
-(defun proof-warn-if-unset 218,6645
-(defun proof-get-window-for-buffer 223,6863
-(defun proof-display-and-keep-buffer 260,8497
-(defun proof-clean-buffer 302,10220
-(defun pg-internal-warning 318,10876
-(defun proof-debug 326,11158
-(defun proof-switch-to-buffer 341,11709
-(defun proof-resize-window-tofit 363,12833
-(defun proof-submit-bug-report 458,16681
-(defun proof-deftoggle-fn 493,18038
-(defmacro proof-deftoggle 508,18704
-(defun proof-defintset-fn 519,19217
-(defmacro proof-defintset 538,20041
-(defun proof-deffloatset-fn 545,20420
-(defmacro proof-deffloatset 561,21134
-(defun proof-defstringset-fn 568,21519
-(defmacro proof-defstringset 581,22145
-(defun proof-escape-keymap-doc 594,22601
-(defmacro proof-defshortcut 598,22755
-(defmacro proof-definvisible 613,23353
-(defun pg-custom-save-vars 640,24282
-(defun pg-custom-reset-vars 656,24926
-(defun proof-locate-executable 669,25263
-(defun pg-current-word-pos 684,25813
-(defsubst proof-shell-strip-output-markup 729,27468
-(defun proof-minibuffer-message 735,27732
-
-lib/bufhist.el,1257
-(defun bufhist-ring-update 38,1391
-(defgroup bufhist 47,1713
-(defcustom bufhist-ring-size 51,1794
-(defvar bufhist-ring 56,1905
-(defvar bufhist-ring-pos 59,1979
-(defvar bufhist-lastswitch-modified-tick 62,2058
-(defvar bufhist-read-only-history 65,2164
-(defvar bufhist-saved-mode-line-format 68,2235
-(defvar bufhist-normal-read-only 71,2338
-(defvar bufhist-top-point 74,2432
-(defun bufhist-mode-line-format-entry 77,2522
-(defconst bufhist-minor-mode-map106,3596
-(define-minor-mode bufhist-mode119,4073
-(defun bufhist-get-buffer-contents 141,4954
-(defun bufhist-restore-buffer-contents 150,5296
-(defun bufhist-checkpoint 159,5610
-(defun bufhist-erase-buffer 167,5979
-(defun bufhist-checkpoint-and-erase 178,6350
-(defun bufhist-switch-to-index 184,6536
-(defun bufhist-first 223,8135
-(defun bufhist-last 228,8294
-(defun bufhist-prev 233,8438
-(defun bufhist-next 241,8661
-(defun bufhist-delete 246,8801
-(defun bufhist-clear 258,9342
-(defun bufhist-init 273,9737
-(defun bufhist-exit 301,10746
-(defun bufhist-set-readwrite 311,11010
-(defun bufhist-before-change-function 326,11630
-(define-button-type 'bufhist-nextbufhist-next340,12053
-(define-button-type 'bufhist-prevbufhist-prev344,12150
-(defun bufhist-insert-buttons 351,12362
-
-lib/holes.el,2465
-(defvar holes-default-hole 44,1123
-(defvar holes-active-hole 50,1301
-(defgroup holes 60,1498
-(defcustom holes-empty-hole-string 65,1597
-(defcustom holes-empty-hole-regexp 70,1740
-(defface active-hole-face92,2442
-(defface inactive-hole-face102,2858
-(defvar hole-map116,3299
-(defvar holes-mode-map126,3690
-(defun holes-region-beginning-or-nil 172,5427
-(defun holes-region-end-or-nil 176,5563
-(defun holes-copy-active-region 180,5681
-(defun holes-is-hole-p 186,5891
-(defun holes-hole-start-position 190,5983
-(defun holes-hole-end-position 196,6166
-(defun holes-hole-buffer 201,6337
-(defun holes-hole-at 207,6511
-(defun holes-active-hole-exist-p 212,6681
-(defun holes-active-hole-start-position 219,6934
-(defun holes-active-hole-end-position 227,7302
-(defun holes-active-hole-buffer 236,7665
-(defun holes-goto-active-hole 244,7966
-(defun holes-highlight-hole-as-active 253,8225
-(defun holes-highlight-hole 261,8533
-(defun holes-disable-active-hole 269,8820
-(defun holes-set-active-hole 282,9352
-(defun holes-is-in-hole-p 292,9697
-(defun holes-make-hole 296,9835
-(defun holes-make-hole-at 314,10491
-(defun holes-clear-hole 328,10944
-(defun holes-clear-hole-at 337,11202
-(defun holes-map-holes 345,11458
-(defun holes-clear-all-buffer-holes 349,11612
-(defun holes-next 359,11912
-(defun holes-next-after-active-hole 366,12163
-(defun holes-set-active-hole-next 373,12379
-(defun holes-replace-segment 392,12916
-(defun holes-replace 401,13269
-(defun holes-replace-active-hole 429,14447
-(defun holes-replace-update-active-hole 436,14738
-(defun holes-delete-update-active-hole 454,15385
-(defun holes-set-make-active-hole 462,15612
-(defalias 'holes-track-mouse-selection holes-track-mouse-selection477,16166
-(defsubst holes-track-mouse-clicks 478,16224
-(defun holes-mouse-replace-active-hole 482,16334
-(defun holes-destroy-hole 496,16805
-(defsubst holes-hole-at-event 510,17187
-(defun holes-mouse-destroy-hole 514,17287
-(defun holes-mouse-forget-hole 521,17508
-(defun holes-mouse-set-make-active-hole 531,17800
-(defun holes-mouse-set-active-hole 547,18299
-(defun holes-set-point-next-hole-destroy 556,18550
-(defun holes-replace-string-by-holes-backward 582,19531
-(defun holes-skeleton-end-hook 600,20231
-(defconst holes-jump-doc609,20669
-(defun holes-replace-string-by-holes-backward-jump 616,20875
-(define-minor-mode holes-mode 634,21632
-(defun holes-abbrev-complete 729,25114
-(defun holes-insert-and-expand 739,25457
-
-lib/local-vars-list.el,276
-(defconst local-vars-list-doc 28,827
-(defun local-vars-list-find 43,1276
-(defun local-vars-list-goto-var 62,2047
-(defun local-vars-list-get-current 88,3094
-(defun local-vars-list-get 109,3944
-(defun local-vars-list-get-safe 130,4653
-(defun local-vars-list-set 135,4847
-
-lib/maths-menu.el,242
-(defvar maths-menu-filter-predicate 56,2328
-(defvar maths-menu-tokenise-insert 59,2436
-(defun maths-menu-build-menu 62,2551
-(defvar maths-menu-menu84,3312
-(defvar maths-menu-mode-map344,12870
-(define-minor-mode maths-menu-mode352,13089
-
-lib/pg-dev.el,199
-(defconst pg-dev-lisp-font-lock-keywords58,1742
-(defun pg-loadpath 84,2444
-(defun unload-pg 94,2615
-(defun profile-pg 125,3509
-(defun elp-pack-number 155,4616
-(defun pg-bug-references 164,4816
-
-lib/pg-fontsets.el,210
-(defcustom pg-fontsets-default-fontset 27,803
-(defvar pg-fontsets-names 32,949
-(defun pg-fontsets-make-fontsetsizes 35,1030
-(defconst pg-fontsets-base-fonts54,1791
-(defun pg-fontsets-make-fontsets 60,1921
-
-lib/proof-compat.el,123
-(defvar proof-running-on-win32 32,975
-(defun pg-custom-undeclare-variable 53,1777
-(defmacro save-selected-frame 86,2602
-
-lib/scomint.el,788
-(defvar scomint-buffer-maximum-size 19,493
-(defvar scomint-output-filter-functions 24,684
-(defvar scomint-mode-map27,794
-(defvar scomint-last-input-start 33,973
-(defvar scomint-last-input-end 34,1011
-(defvar scomint-last-output-start 35,1047
-(defvar scomint-exec-hook 37,1087
-(define-derived-mode scomint-mode 46,1430
-(defsubst scomint-check-proc 65,2345
-(defun scomint-make-in-buffer 73,2685
-(defun scomint-make 97,3952
-(defun scomint-exec 110,4663
-(defun scomint-exec-1 147,6256
-(defalias 'scomint-send-string scomint-send-string197,8386
-(defun scomint-send-eof 199,8440
-(defun scomint-send-input 208,8673
-(defun scomint-truncate-buffer 234,9569
-(defun scomint-strip-ctrl-m 247,9963
-(defun scomint-output-filter 261,10540
-(defun scomint-interrupt-process 284,11295
-
-lib/span.el,1553
-(defalias 'span-start span-start22,609
-(defalias 'span-end span-end23,647
-(defalias 'span-set-property span-set-property24,681
-(defalias 'span-property span-property25,724
-(defalias 'span-make span-make26,763
-(defalias 'span-detach span-detach27,799
-(defalias 'span-set-endpoints span-set-endpoints28,839
-(defalias 'span-buffer span-buffer29,884
-(defun span-read-only-hook 31,925
-(defsubst span-read-only 36,1115
-(defsubst span-read-write 43,1425
-(defsubst span-write-warning 48,1595
-(defsubst span-lt 59,2119
-(defsubst spans-at-point-prop 64,2263
-(defsubst spans-at-region-prop 73,2454
-(defsubst span-at 83,2720
-(defsubst span-delete 87,2846
-(defsubst span-add-delete-action 93,3042
-(defsubst span-mapcar-spans 99,3321
-(defsubst span-mapc-spans 103,3496
-(defsubst span-mapcar-spans-inorder 107,3667
-(defun span-at-before 113,3872
-(defsubst prev-span 130,4596
-(defsubst next-span 136,4749
-(defsubst span-live-p 142,4963
-(defsubst span-raise 148,5129
-(defsubst span-string 152,5262
-(defsubst set-span-properties 157,5422
-(defsubst span-find-span 163,5616
-(defsubst span-at-event 171,5928
-(defun fold-spans 177,6125
-(defsubst span-detached-p 191,6658
-(defsubst set-span-face 195,6774
-(defsubst set-span-keymap 199,6872
-(defsubst span-delete-spans 207,7041
-(defsubst span-property-safe 211,7203
-(defsubst span-set-start 215,7340
-(defsubst span-set-end 219,7472
-(defun span-make-self-removing-span 227,7632
-(defun span-delete-self-modification-hook 237,8000
-(defun span-make-modifying-removing-span 242,8174
-
-lib/texi-docstring-magic.el,584
-(defun texi-docstring-magic-find-face 88,3032
-(defun texi-docstring-magic-splice-sep 93,3197
-(defconst texi-docstring-magic-munge-table103,3502
-(defun texi-docstring-magic-untabify 193,7265
-(defun texi-docstring-magic-munge-docstring 200,7463
-(defun texi-docstring-magic-texi 239,8744
-(defun texi-docstring-magic-format-default 252,9184
-(defun texi-docstring-magic-texi-for 268,9817
-(defconst texi-docstring-magic-comment326,11776
-(defun texi-docstring-magic 332,11930
-(defun texi-docstring-magic-face-at-point 366,13009
-(defun texi-docstring-magic-insert-magic 381,13532
-
-lib/unicode-chars.el,80
-(defvar unicode-chars-alist12,348
-(defun unicode-chars-list-chars 5051,245975
-
-lib/unicode-tokens.el,5902
-(defgroup unicode-tokens-options 58,1844
-(defcustom unicode-tokens-add-help-echo 63,1969
-(defun unicode-tokens-toggle-add-help-echo 68,2136
-(defvar unicode-tokens-token-symbol-map 82,2542
-(defvar unicode-tokens-token-format 101,3201
-(defvar unicode-tokens-token-variant-format-regexp 107,3450
-(defvar unicode-tokens-shortcut-alist 121,3983
-(defvar unicode-tokens-shortcut-replacement-alist 127,4260
-(defvar unicode-tokens-control-region-format-regexp 135,4466
-(defvar unicode-tokens-control-char-format-regexp 142,4834
-(defvar unicode-tokens-control-regions 149,5195
-(defvar unicode-tokens-control-characters 152,5271
-(defvar unicode-tokens-control-char-format 155,5353
-(defvar unicode-tokens-control-region-format-start 158,5466
-(defvar unicode-tokens-control-region-format-end 161,5583
-(defvar unicode-tokens-tokens-customizable-variables 164,5696
-(defconst unicode-tokens-configuration-variables171,5864
-(defun unicode-tokens-config 186,6263
-(defun unicode-tokens-config-var 190,6408
-(defun unicode-tokens-copy-configuration-variables 202,6848
-(defvar unicode-tokens-token-list 230,8064
-(defvar unicode-tokens-hash-table 233,8184
-(defvar unicode-tokens-token-match-regexp 236,8300
-(defvar unicode-tokens-uchar-hash-table 242,8583
-(defvar unicode-tokens-uchar-regexp 246,8770
-(defgroup unicode-tokens-faces 254,8955
-(defconst unicode-tokens-font-family-alternatives264,9257
-(defface unicode-tokens-symbol-font-face279,9776
-(defface unicode-tokens-script-font-face290,10249
-(defface unicode-tokens-fraktur-font-face295,10393
-(defface unicode-tokens-serif-font-face300,10518
-(defface unicode-tokens-sans-font-face305,10655
-(defface unicode-tokens-highlight-face310,10777
-(defconst unicode-tokens-fonts319,11139
-(defconst unicode-tokens-fontsymb-properties328,11356
-(define-widget 'unicode-tokens-token-symbol-map unicode-tokens-token-symbol-map356,12977
-(define-widget 'unicode-tokens-shortcut-alist unicode-tokens-shortcut-alist374,13529
-(defconst unicode-tokens-font-lock-extra-managed-props387,13860
-(defun unicode-tokens-font-lock-keywords 391,14014
-(defun unicode-tokens-calculate-token-match 424,15385
-(defun unicode-tokens-usable-composition 454,16421
-(defun unicode-tokens-help-echo 467,16800
-(defvar unicode-tokens-show-symbols 472,17002
-(defun unicode-tokens-interpret-composition 475,17116
-(defun unicode-tokens-font-lock-compose-symbol 493,17628
-(defun unicode-tokens-prepend-text-properties-in-match 531,19160
-(defun unicode-tokens-prepend-text-property 545,19738
-(defun unicode-tokens-show-symbols 570,20883
-(defun unicode-tokens-symbs-to-props 578,21193
-(defvar unicode-tokens-show-controls 598,21892
-(defun unicode-tokens-show-controls 601,21983
-(defun unicode-tokens-control-char 613,22496
-(defun unicode-tokens-control-region 622,22935
-(defun unicode-tokens-control-font-lock-keywords 633,23482
-(defvar unicode-tokens-use-shortcuts 644,23806
-(defun unicode-tokens-use-shortcuts 647,23909
-(defun unicode-tokens-map-ordering 663,24505
-(defun unicode-tokens-quail-define-rules 672,24858
-(defun unicode-tokens-insert-token 695,25535
-(defun unicode-tokens-annotate-region 704,25839
-(defun unicode-tokens-insert-control 728,26677
-(defun unicode-tokens-insert-uchar-as-token 738,27126
-(defun unicode-tokens-delete-token-near-point 744,27347
-(defun unicode-tokens-delete-backward-char 756,27788
-(defun unicode-tokens-delete-char 767,28169
-(defun unicode-tokens-delete-backward-1 778,28523
-(defun unicode-tokens-delete-1 795,29119
-(defun unicode-tokens-prev-token 811,29663
-(defun unicode-tokens-rotate-token-forward 819,29960
-(defun unicode-tokens-rotate-token-backward 846,30850
-(defun unicode-tokens-replace-shortcut-match 851,31052
-(defun unicode-tokens-replace-shortcuts 860,31422
-(defun unicode-tokens-replace-unicode-match 874,32021
-(defun unicode-tokens-replace-unicode 881,32322
-(defun unicode-tokens-copy-token 898,32924
-(define-button-type 'unicode-tokens-listunicode-tokens-list905,33145
-(defun unicode-tokens-list-tokens 911,33349
-(defun unicode-tokens-list-shortcuts 950,34533
-(defalias 'unicode-tokens-list-unicode-chars unicode-tokens-list-unicode-chars968,35171
-(defun unicode-tokens-encode-in-temp-buffer 970,35244
-(defun unicode-tokens-encode 988,35900
-(defun unicode-tokens-encode-str 994,36136
-(defun unicode-tokens-copy 998,36298
-(defun unicode-tokens-paste 1007,36704
-(defvar unicode-tokens-highlight-unicode 1026,37425
-(defconst unicode-tokens-unicode-highlight-patterns1029,37517
-(defun unicode-tokens-highlight-unicode 1033,37686
-(defun unicode-tokens-highlight-unicode-setkeywords 1045,38149
-(defun unicode-tokens-initialise 1057,38518
-(defvar unicode-tokens-mode-map 1077,39189
-(defvar unicode-tokens-display-table1080,39286
-(define-minor-mode unicode-tokens-mode1087,39537
-(defun unicode-tokens-set-font-var 1223,44112
-(defun unicode-tokens-set-font-var-aux 1239,44601
-(defun unicode-tokens-mouse-set-font 1270,45762
-(defsubst unicode-tokens-face-font-sym 1283,46276
-(defun unicode-tokens-set-font-restart 1287,46456
-(defun unicode-tokens-save-fonts 1298,46766
-(defun unicode-tokens-custom-save-faces 1306,47022
-(define-key unicode-tokens-mode-map1323,47478
-(define-key unicode-tokens-mode-map1326,47585
-(defvar unicode-tokens-quail-translation-keymap1334,47844
-(define-key unicode-tokens-quail-translation-keymap1341,48034
-(defun unicode-tokens-quail-delete-last-char 1345,48168
-(define-key unicode-tokens-mode-map 1360,48595
-(define-key unicode-tokens-mode-map 1362,48687
-(define-key unicode-tokens-mode-map1364,48778
-(define-key unicode-tokens-mode-map1366,48884
-(define-key unicode-tokens-mode-map1369,48999
-(define-key unicode-tokens-mode-map1371,49108
-(define-key unicode-tokens-mode-map1373,49216
-(define-key unicode-tokens-mode-map1375,49322
-(defun unicode-tokens-customize-submenu 1383,49446
-(defun unicode-tokens-define-menu 1390,49669
-
-contrib/mmm/mmm-auto.el,343
-(defvar mmm-autoloaded-classes67,2676
-(defun mmm-autoload-class 89,3439
-(defvar mmm-changed-buffers-list 129,4992
-(defun mmm-major-mode-change 132,5099
-(defun mmm-check-changed-buffers 145,5620
-(defun mmm-mode-on-maybe 154,5970
-(defalias 'mmm-add-find-file-hooks mmm-add-find-file-hooks166,6374
-(defun mmm-add-find-file-hook 167,6434
-
-contrib/mmm/mmm-class.el,415
-(defun mmm-get-class-spec 42,1296
-(defun mmm-get-class-parameter 59,1939
-(defun mmm-set-class-parameter 63,2105
-(defun* mmm-apply-class75,2455
-(defun* mmm-apply-classes90,3072
-(defun* mmm-apply-all 110,3803
-(defun* mmm-ify124,4250
-(defun* mmm-match-region206,7095
-(defun mmm-match->point 269,9480
-(defun mmm-match-and-verify 284,10050
-(defun mmm-get-form 310,11101
-(defun mmm-default-get-form 321,11576
-
-contrib/mmm/mmm-cmds.el,712
-(defun mmm-ify-by-class 41,1210
-(defun mmm-ify-region 63,1822
-(defun mmm-ify-by-regexp75,2243
-(defun mmm-parse-buffer 97,2886
-(defun mmm-parse-region 106,3222
-(defun mmm-parse-block 115,3601
-(defun mmm-get-block 132,4352
-(defun mmm-reparse-current-region 146,4634
-(defun mmm-clear-current-region 167,5210
-(defun mmm-clear-regions 172,5374
-(defun mmm-clear-all-regions 177,5520
-(defun* mmm-end-current-region 185,5680
-(defun mmm-narrow-to-submode-region 220,6928
-(defun mmm-insert-region 239,7542
-(defun mmm-insert-by-key 258,8348
-(defun mmm-get-insertion-spec 342,11613
-(defun mmm-insertion-help 369,12573
-(defun mmm-display-insertion-key 379,12936
-(defun mmm-get-all-insertion-keys 401,13723
-
-contrib/mmm/mmm-compat.el,418
-(defvar mmm-xemacs 40,1313
-(defvar mmm-keywords-used49,1616
-(defmacro mmm-regexp-opt 91,2632
-(defvar mmm-evaporate-property110,3281
-(defmacro mmm-set-keymap-default 128,4047
-(defmacro mmm-event-key 137,4489
-(defvar skeleton-positions 146,4708
-(defun mmm-fixup-skeleton 147,4739
-(defmacro mmm-make-temp-buffer 159,5162
-(defvar mmm-font-lock-available-p 172,5558
-(defmacro mmm-set-font-lock-defaults 179,5772
-
-contrib/mmm/mmm-cweb.el,228
-(defvar mmm-cweb-section-tags38,1117
-(defvar mmm-cweb-section-regexp41,1164
-(defvar mmm-cweb-c-part-tags44,1254
-(defvar mmm-cweb-c-part-regexp47,1313
-(defun mmm-cweb-in-limbo 50,1397
-(defun mmm-cweb-verify-brief-c 57,1622
-
-contrib/mmm/mmm-mason.el,410
-(defvar mmm-mason-perl-tags41,1236
-(defvar mmm-mason-pseudo-perl-tags45,1377
-(defvar mmm-mason-non-perl-tags48,1453
-(defvar mmm-mason-perl-tags-regexp51,1554
-(defvar mmm-mason-pseudo-perl-tags-regexp56,1749
-(defvar mmm-mason-tag-names-regexp61,1966
-(defun mmm-mason-verify-inline 66,2186
-(defun mmm-mason-start-line 156,4838
-(defun mmm-mason-end-line 161,4903
-(defun mmm-mason-set-mode-line 168,4997
-
-contrib/mmm/mmm-mode.el,1025
-(defun mmm-mode 101,3867
-(defun mmm-mode-on 140,5372
-(defun mmm-mode-off 183,7156
-(defvar mmm-mode-map 209,7897
-(defvar mmm-mode-prefix-map 212,7972
-(defvar mmm-mode-menu-map 215,8082
-(defun mmm-define-key 218,8173
-(define-key mmm-mode-prefix-map 242,8928
-(define-key mmm-mode-prefix-map 249,9186
-(define-key mmm-mode-map 252,9297
-(define-key mmm-mode-menu-map 255,9399
-(define-key mmm-mode-menu-map 257,9471
-(define-key mmm-mode-menu-map 259,9530
-(define-key mmm-mode-menu-map 261,9611
-(define-key mmm-mode-menu-map 263,9692
-(define-key mmm-mode-menu-map 265,9779
-(define-key mmm-mode-menu-map 268,9873
-(define-key mmm-mode-menu-map 270,9933
-(define-key mmm-mode-menu-map 273,10024
-(define-key mmm-mode-menu-map 275,10084
-(define-key mmm-mode-menu-map 277,10191
-(define-key mmm-mode-menu-map 279,10276
-(define-key mmm-mode-menu-map 282,10362
-(define-key mmm-mode-menu-map 284,10422
-(define-key mmm-mode-menu-map 286,10535
-(define-key mmm-mode-menu-map 288,10620
-(define-key mmm-mode-map 291,10703
-
-contrib/mmm/mmm-region.el,1643
-(defsubst mmm-overlay-at 54,1749
-(defun mmm-overlays-at 59,1934
-(defun mmm-included-p 72,2387
-(defun mmm-overlays-containing 112,3876
-(defun mmm-overlays-contained-in 125,4314
-(defun mmm-overlays-overlapping 138,4754
-(defun mmm-sort-overlays 149,5117
-(defvar mmm-current-overlay 158,5359
-(defvar mmm-previous-overlay 163,5574
-(defvar mmm-current-submode 168,5762
-(defvar mmm-previous-submode 173,5962
-(defun mmm-update-current-submode 178,6135
-(defun mmm-set-current-submode 199,6930
-(defun mmm-submode-at 210,7373
-(defun mmm-match-front 219,7648
-(defun mmm-match-back 238,8409
-(defun mmm-front-start 257,9154
-(defun mmm-back-end 265,9458
-(defun mmm-valid-submode-region 278,9805
-(defun* mmm-make-region305,10961
-(defun mmm-make-overlay 431,16311
-(defun mmm-get-face 459,17444
-(defun mmm-clear-overlays 470,17736
-(defun mmm-update-mode-info 486,18201
-(defun mmm-update-submode-region 572,21874
-(defun mmm-add-hooks 589,22604
-(defun mmm-remove-hooks 592,22701
-(defun mmm-get-local-variables-list 598,22828
-(defun mmm-get-locals 618,23524
-(defun mmm-get-saved-local 631,24021
-(defun mmm-set-local-variables 635,24186
-(defun mmm-get-saved-local-variables 646,24564
-(defun mmm-save-changed-local-variables 654,24839
-(defun mmm-clear-local-variables 673,25543
-(defun mmm-enable-font-lock 684,25808
-(defun mmm-update-font-lock-buffer 692,26068
-(defun mmm-refontify-maybe 705,26479
-(defun mmm-submode-changes-in 720,26959
-(defun mmm-regions-in 731,27316
-(defun mmm-regions-alist 745,27794
-(defun mmm-fontify-region 762,28321
-(defun mmm-fontify-region-list 783,29343
-(defun mmm-beginning-of-syntax 805,30091
-
-contrib/mmm/mmm-rpm.el,154
-(defconst mmm-rpm-sh-start-tags48,1618
-(defvar mmm-rpm-sh-end-tags53,1842
-(defvar mmm-rpm-sh-start-regexp57,2016
-(defvar mmm-rpm-sh-end-regexp61,2194
-
-contrib/mmm/mmm-sample.el,168
-(defvar mmm-here-doc-mode-alist 84,2601
-(defun mmm-here-doc-get-mode 93,3086
-(defun mmm-file-variables-verify 208,6343
-(defun mmm-file-variables-find-back 232,7148
-
-contrib/mmm/mmm-univ.el,34
-(defun mmm-univ-get-mode 38,1205
-
-contrib/mmm/mmm-utils.el,282
-(defmacro mmm-valid-buffer 42,1332
-(defmacro mmm-save-all 61,1941
-(defun mmm-format-string 74,2223
-(defun mmm-format-matches 85,2661
-(defmacro mmm-save-keyword 108,3419
-(defmacro mmm-save-keywords 116,3746
-(defun mmm-looking-back-at 129,4244
-(defun mmm-make-marker 146,4784
-
-contrib/mmm/mmm-vars.el,2668
-(defgroup mmm 104,3283
-(defvar mmm-c-derived-modes111,3393
-(defvar mmm-save-local-variables115,3512
-(defvar mmm-buffer-saved-locals 341,10293
-(defvar mmm-region-saved-locals-defaults 346,10493
-(defvar mmm-region-saved-locals-for-dominant 352,10753
-(defgroup mmm-faces 362,11130
-(defcustom mmm-submode-decoration-level 368,11301
-(defface mmm-init-submode-face 386,12145
-(defface mmm-cleanup-submode-face 390,12285
-(defface mmm-declaration-submode-face 394,12422
-(defface mmm-comment-submode-face 398,12568
-(defface mmm-output-submode-face 402,12721
-(defface mmm-special-submode-face 406,12870
-(defface mmm-code-submode-face 410,13034
-(defface mmm-default-submode-face 414,13173
-(defface mmm-delimiter-face 419,13381
-(defcustom mmm-mode-string 426,13507
-(defcustom mmm-submode-mode-line-format 431,13638
-(defvar mmm-primary-mode-display-name 448,14293
-(defvar mmm-buffer-mode-display-name 453,14507
-(defun mmm-set-mode-line 459,14806
-(defvar mmm-classes 483,15614
-(defvar mmm-global-classes 489,15859
-(defcustom mmm-mode-ext-classes-alist 496,16041
-(defun mmm-add-mode-ext-class 515,16831
-(defcustom mmm-major-mode-preferences524,17156
-(defun mmm-add-to-major-mode-preferences 542,17884
-(defun mmm-ensure-modename 558,18642
-(defun mmm-modename->function 567,18945
-(defcustom mmm-delimiter-mode 581,19394
-(defcustom mmm-mode-prefix-key 591,19663
-(defcustom mmm-command-modifiers 596,19790
-(defcustom mmm-insert-modifiers 610,20423
-(defcustom mmm-use-old-command-keys 625,21101
-(defun mmm-use-old-command-keys 635,21565
-(defcustom mmm-mode-hook 643,21757
-(defun mmm-run-constructed-hook 663,22564
-(defun mmm-run-major-hook 671,22908
-(defun mmm-run-submode-hook 674,22985
-(defvar mmm-class-hooks-run 677,23072
-(defun mmm-run-class-hook 682,23244
-(defvar mmm-primary-mode-entry-hook 687,23416
-(defcustom mmm-major-mode-hook 702,24063
-(defun mmm-run-major-mode-hook 716,24694
-(defcustom mmm-global-mode 729,25235
-(defcustom mmm-never-modes745,25902
-(defvar mmm-set-file-name-for-modes 763,26202
-(defvar mmm-mode 774,26561
-(defvar mmm-primary-mode 782,26769
-(defvar mmm-classes-alist 793,27135
-(defun mmm-add-classes 948,35342
-(defun mmm-add-group 953,35507
-(defun mmm-add-to-group 963,35880
-(defconst mmm-version 977,36307
-(defun mmm-version 980,36372
-(defvar mmm-temp-buffer-name 987,36515
-(defvar mmm-interactive-history 993,36645
-(defun mmm-add-to-history 999,36914
-(defun mmm-clear-history 1002,36997
-(defvar mmm-mode-ext-classes 1010,37182
-(defun mmm-get-mode-ext-classes 1015,37393
-(defun mmm-clear-mode-ext-classes 1024,37720
-(defun mmm-mode-ext-applies 1028,37845
-(defun mmm-get-all-classes 1042,38224
-
-doc/ProofGeneral.texi,7245
-@node Top140,3994
-@node Preface179,5193
-@node News for Version 4.3News for Version 4.3205,5857
-@node News for Version 4.2News for Version 4.2218,6246
-@node News for Version 4.1News for Version 4.1231,6702
-@node News for Version 4.0News for Version 4.0242,7009
-@node Future263,7860
-@node Credits292,9195
-@node Introducing Proof GeneralIntroducing Proof General414,13304
-@node Installing Proof GeneralInstalling Proof General469,15284
-@node Quick start guideQuick start guide483,15733
-@node Features of Proof GeneralFeatures of Proof General528,17927
-@node Supported proof assistantsSupported proof assistants634,22471
-@node Prerequisites for this manualPrerequisites for this manual689,24464
-@node Organization of this manualOrganization of this manual733,26083
-@node Basic Script ManagementBasic Script Management759,26911
-@node Walkthrough example in IsabelleWalkthrough example in Isabelle778,27511
-@node Proof scriptsProof scripts1064,38921
-@node Script buffersScript buffers1107,41041
-@node Locked queue and editing regionsLocked queue and editing regions1129,41618
-@node Goal-save sequencesGoal-save sequences1185,43765
-@node Active scripting bufferActive scripting buffer1222,45249
-@node Summary of Proof General buffersSummary of Proof General buffers1295,48882
-@node Script editing commandsScript editing commands1344,51139
-@node Script processing commandsScript processing commands1424,54098
-@node Proof assistant commandsProof assistant commands1553,59528
-@node Toolbar commandsToolbar commands1746,66456
-@node Interrupting during trace outputInterrupting during trace output1771,67415
-@node Advanced Script Management and EditingAdvanced Script Management and Editing1811,69345
-@node Document centred workingDocument centred working1832,69966
-@node Automatic processingAutomatic processing1944,74644
-@node Visibility of completed proofsVisibility of completed proofs1999,76692
-@node Switching between proof scriptsSwitching between proof scripts2054,78632
-@node View of processed files View of processed files 2091,80604
-@node Retracting across filesRetracting across files2151,83655
-@node Asserting across filesAsserting across files2164,84286
-@node Automatic multiple file handlingAutomatic multiple file handling2177,84852
-@node Escaping script managementEscaping script management2202,85886
-@node Editing featuresEditing features2259,87998
-@node Unicode symbols and special layout supportUnicode symbols and special layout support2329,90777
-@node Maths menuMaths menu2371,92335
-@node Unicode Tokens modeUnicode Tokens mode2388,93026
-@node Configuring tokens symbols and shortcutsConfiguring tokens symbols and shortcuts2438,95449
-@node Special layout Special layout 2468,96410
-@node Moving between Unicode and tokensMoving between Unicode and tokens2578,100528
-@node Finding available tokens shortcuts and symbolsFinding available tokens shortcuts and symbols2633,102639
-@node Selecting suitable fontsSelecting suitable fonts2672,103813
-@node Support for other PackagesSupport for other Packages2737,106801
-@node Syntax highlightingSyntax highlighting2767,107637
-@node Imenu and SpeedbarImenu and Speedbar2795,108640
-@node Support for outline modeSupport for outline mode2841,110311
-@node Support for completionSupport for completion2866,111440
-@node Support for tagsSupport for tags2923,113602
-@node Subterm Activation and Proof by PointingSubterm Activation and Proof by Pointing2975,115950
-@node Goals buffer commandsGoals buffer commands2991,116545
-@node Graphical Proof-Tree VisualizationGraphical Proof-Tree Visualization3090,120698
-@node Starting and Stopping Proof-Tree VisualizationStarting and Stopping Proof-Tree Visualization3122,121898
-@node Features of ProoftreeFeatures of Prooftree3150,123055
-@node Prooftree CustomizationProoftree Customization3185,124412
-@node Customizing Proof GeneralCustomizing Proof General3209,125291
-@node Basic optionsBasic options3249,126961
-@node How to customizeHow to customize3273,127731
-@node Display customizationDisplay customization3320,129698
-@node User optionsUser options3519,137654
-@node Changing facesChanging faces3764,146669
-@node Script buffer facesScript buffer faces3786,147544
-@node Goals and response facesGoals and response faces3832,149144
-@node Tweaking configuration settingsTweaking configuration settings3877,150676
-@node Hints and TipsHints and Tips3934,153202
-@node Adding your own keybindingsAdding your own keybindings3953,153803
-@node Using file variablesUsing file variables4017,156417
-@node Using abbreviationsUsing abbreviations4100,159456
-@node LEGO Proof GeneralLEGO Proof General4139,160871
-@node LEGO specific commandsLEGO specific commands4180,162240
-@node LEGO tagsLEGO tags4200,162695
-@node LEGO customizationsLEGO customizations4210,162942
-@node Coq Proof GeneralCoq Proof General4240,163782
-@node Coq-specific commandsCoq-specific commands4257,164179
-@node Using the Coq project fileUsing the Coq project file4280,164687
-@node Multiple File SupportMultiple File Support4314,165955
-@node Automatic Compilation in DetailAutomatic Compilation in Detail4402,169287
-@node Locking AncestorsLocking Ancestors4510,174197
-@node Customizing Coq Multiple File SupportCustomizing Coq Multiple File Support4548,175715
-@node Current LimitationsCurrent Limitations4808,186718
-@node Editing multiple proofsEditing multiple proofs4830,187471
-@node User-loaded tacticsUser-loaded tactics4854,188579
-@node Holes featureHoles feature4918,191053
-@node Proof-Tree VisualizationProof-Tree Visualization4943,192272
-@node Isabelle Proof GeneralIsabelle Proof General4967,193219
-@node Choosing logic and starting isabelleChoosing logic and starting isabelle4993,194095
-@node Isabelle commandsIsabelle commands5062,196896
-@node Isabelle settingsIsabelle settings5205,201088
-@node Isabelle customizationsIsabelle customizations5219,201670
-@node HOL Light Proof GeneralHOL Light Proof General5242,202163
-@node Shell Proof GeneralShell Proof General5289,204142
-@node Obtaining and InstallingObtaining and Installing5325,205601
-@node Obtaining Proof GeneralObtaining Proof General5340,205966
-@node Installing Proof General from tarballInstalling Proof General from tarball5366,206848
-@node Setting the names of binariesSetting the names of binaries5390,207638
-@node Notes for syssiesNotes for syssies5418,208578
-@node Bugs and EnhancementsBugs and Enhancements5494,211575
-@node References5515,212390
-@node History of Proof GeneralHistory of Proof General5555,213413
-@node Old News for 3.0Old News for 3.05649,217578
-@node Old News for 3.1Old News for 3.15719,221272
-@node Old News for 3.2Old News for 3.25745,222444
-@node Old News for 3.3Old News for 3.35806,225447
-@node Old News for 3.4Old News for 3.45825,226344
-@node Old News for 3.5Old News for 3.55847,227399
-@node Old News for 3.6Old News for 3.65851,227456
-@node Old News for 3.7Old News for 3.75856,227556
-@node Function IndexFunction Index5886,229010
-@node Variable IndexVariable Index5890,229086
-@node Keystroke IndexKeystroke Index5894,229166
-@node Concept IndexConcept Index5898,229232
-
-doc/PG-adapting.texi,4617
-@node Top137,3997
-@node Introduction175,5147
-@node Future216,6800
-@node Credits252,8396
-@node Beginning with a New ProverBeginning with a New Prover262,8688
-@node Overview of adding a new proverOverview of adding a new prover302,10630
-@node Demonstration instance and easy configurationDemonstration instance and easy configuration384,14250
-@node Major modes used by Proof GeneralMajor modes used by Proof General453,17641
-@node Menus and Toolbar and User-level CommandsMenus and Toolbar and User-level Commands496,19351
-@node Settings for generic user-level commandsSettings for generic user-level commands511,19897
-@node Menu configurationMenu configuration556,21629
-@node Toolbar configurationToolbar configuration580,22546
-@node Proof Script SettingsProof Script Settings639,24783
-@node Recognizing commands and commentsRecognizing commands and comments662,25395
-@node Recognizing proofsRecognizing proofs799,31848
-@node Recognizing other elementsRecognizing other elements903,36152
-@node Configuring undo behaviourConfiguring undo behaviour966,38631
-@node Nested proofsNested proofs1103,44018
-@node Safe (state-preserving) commandsSafe (state-preserving) commands1143,45644
-@node Activate scripting hookActivate scripting hook1166,46597
-@node Automatic multiple filesAutomatic multiple files1190,47467
-@node Completely asserted buffersCompletely asserted buffers1211,48313
-@node Completions1244,49778
-@node Proof Shell SettingsProof Shell Settings1285,51268
-@node Proof shell commandsProof shell commands1316,52550
-@node Script input to the shellScript input to the shell1493,60314
-@node Settings for matching various output from proof processSettings for matching various output from proof process1563,63518
-@node Settings for matching urgent messages from proof processSettings for matching urgent messages from proof process1690,69074
-@node Hooks and other settingsHooks and other settings1950,80364
-@node Goals Buffer SettingsGoals Buffer Settings2029,83508
-@node Splash Screen SettingsSplash Screen Settings2103,86498
-@node Global ConstantsGlobal Constants2129,87253
-@node Handling Multiple FilesHandling Multiple Files2155,88082
-@node Configuring Editing SyntaxConfiguring Editing Syntax2324,96751
-@node Configuring Font LockConfiguring Font Lock2381,98868
-@node Configuring TokensConfiguring Tokens2457,102580
-@node Configuring Proof-Tree VisualizationConfiguring Proof-Tree Visualization2507,104700
-@node A layered set of proof treesA layered set of proof trees2525,105273
-@node Prerequisites2557,106624
-@node Proof-Tree Display InternalsProof-Tree Display Internals2620,109275
-@node Organization of the CodeOrganization of the Code2638,109765
-@node Communication2734,114028
-@node Guards2763,115292
-@node Urgent and Delayed ActionsUrgent and Delayed Actions2817,117437
-@node Full AnnotationFull Annotation2884,120285
-@node Configuring Prooftree for a New Proof AssistantConfiguring Prooftree for a New Proof Assistant2898,120859
-@node Proof Tree Elisp configurationProof Tree Elisp configuration2910,121191
-@node Prooftree AdaptionProoftree Adaption2931,122021
-@node Writing More Lisp CodeWriting More Lisp Code2951,122700
-@node Default values for generic settingsDefault values for generic settings2968,123345
-@node Adding prover-specific configurationsAdding prover-specific configurations2998,124428
-@node Useful variablesUseful variables3041,125710
-@node Useful functions and macrosUseful functions and macros3056,126209
-@node Internals of Proof GeneralInternals of Proof General3166,130521
-@node Spans3196,131451
-@node Proof General site configurationProof General site configuration3211,131824
-@node Configuration variable mechanismsConfiguration variable mechanisms3294,134942
-@node Global variablesGlobal variables3424,140658
-@node Proof script modeProof script mode3499,143282
-@node Proof shell modeProof shell mode3763,155239
-@node Debugging4373,180807
-@node Plans and IdeasPlans and Ideas4416,181683
-@node Proof by pointing and similar featuresProof by pointing and similar features4437,182405
-@node Granularity of atomic command sequencesGranularity of atomic command sequences4475,184063
-@node Browser mode for script files and theoriesBrowser mode for script files and theories4520,186288
-@node Demonstration InstantiationsDemonstration Instantiations4550,187319
-@node demoisa-easy.el4566,187750
-@node demoisa.el4628,189942
-@node Function IndexFunction Index4782,194862
-@node Variable IndexVariable Index4786,194938
-@node Concept IndexConcept Index4795,195117
-
-generic/proof.el,0
-
-pghaskell/pghaskell.el,0
-
-pghaskell/pghashell.el,0
-
-pgocaml/pgocaml.el,0
-
-pgshell/pgshell.el,0
-
-hol-light/hol-light-autotest.el,0
-
-isar/isar-profiling.el,0
-
-isar/interface-setup.el,0
-
-coq/coq-mmm.el,0
-
-coq/coq-autotest.el,0
-
-acl2/acl2.el,0
diff --git a/acl2/acl2.el b/acl2/acl2.el
index 809c62fa..4f023217 100644
--- a/acl2/acl2.el
+++ b/acl2/acl2.el
@@ -92,6 +92,6 @@
(warn "ACL2 Proof General is incomplete! Please help improve it!
-Please add improvements at http://proofgeneral.inf.ed.ac.uk/trac")
+Please add improvements at https://github.com/ProofGeneral/PG")
(provide 'acl2)
diff --git a/bin/proofgeneral b/bin/proofgeneral
index 05d26724..05d26724 100644..100755
--- a/bin/proofgeneral
+++ b/bin/proofgeneral
diff --git a/coq/coq-abbrev.el b/coq/coq-abbrev.el
index 3f8662e7..534c013d 100644
--- a/coq/coq-abbrev.el
+++ b/coq/coq-abbrev.el
@@ -148,6 +148,67 @@ It was constructed with `proof-defstringset-fn'.")
:style toggle
:selected coq-double-hit-enable
:help "Automatically send commands when terminator typed twiced quickly."]
+ ("Auto Compilation"
+ ["Compile Before Require"
+ coq-compile-before-require-toggle
+ :style toggle
+ :selected coq-compile-before-require
+ :help "Check dependencies of required modules and compile on the fly."]
+ ["Parallel background compilation"
+ coq-compile-parallel-in-background-toggle
+ :style toggle
+ :selected coq-compile-parallel-in-background
+ :active coq-compile-before-require
+ :help ,(concat "Compile parallel in background or "
+ "sequentially with blocking ProofGeneral.")]
+ ["Keep going"
+ coq-compile-keep-going-toggle
+ :style toggle
+ :selected coq-compile-keep-going
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help ,(concat "Continue background compilation after "
+ "the first error as far as possible")]
+ ["no quick"
+ (customize-set-variable 'coq-compile-quick 'no-quick)
+ :style radio
+ :selected (eq coq-compile-quick 'no-quick)
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help "Compile without -quick but accept existion .vio's"]
+ ["quick no vio2vo"
+ (customize-set-variable 'coq-compile-quick 'quick-no-vio2vo)
+ :style radio
+ :selected (eq coq-compile-quick 'quick-no-vio2vo)
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help "Compile with -quick, accept existing .vo's, don't run vio2vo"]
+ ["quick and vio2vo"
+ (customize-set-variable 'coq-compile-quick 'quick-and-vio2vo)
+ :style radio
+ :selected (eq coq-compile-quick 'quick-and-vio2vo)
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help "Compile with -quick, accept existing .vo's, run vio2vo later"]
+ ["ensure vo"
+ (customize-set-variable 'coq-compile-quick 'ensure-vo)
+ :style radio
+ :selected (eq coq-compile-quick 'ensure-vo)
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help "Ensure only vo's are used for consistency"]
+ ["Confirm External Compilation"
+ coq-confirm-external-compilation-toggle
+ :style toggle
+ :selected coq-confirm-external-compilation
+ :active (and coq-compile-before-require
+ (not (equal coq-compile-command "")))
+ :help "Confirm external compilation command, see `coq-compile-command'."]
+ ["Abort Background Compilation"
+ coq-par-emergency-cleanup
+ :active (and coq-compile-before-require
+ coq-compile-parallel-in-background)
+ :help "Abort background compilation and kill all compilation processes."])
""
["Print..." coq-Print :help "With prefix arg (C-u): Set Printing All first"]
["Check..." coq-Check :help "With prefix arg (C-u): Set Printing All first"]
@@ -189,16 +250,18 @@ It was constructed with `proof-defstringset-fn'.")
["Print Scope/Visibility..." coq-PrintScope t])
("OPTIONS"
["Set Printing All" coq-set-printing-all t]
- ["UnSet Printing All" coq-unset-printing-all t]
- ["Set Implicit Argument" coq-set-implicit-arguments t]
- ["Unset Implicit Argument" coq-unset-implicit-arguments t]
- ["Set Printing Width" coq-ask-adapt-printing-width-and-show t]
- ["Set Printing Synth" coq-set-printing-synth t]
- ["Unset Printing Synth" coq-unset-printing-synth t]
+ ["Unset Printing All" coq-unset-printing-all t]
+ ["Set Printing Implicit" coq-set-printing-implicit t]
+ ["Unset Printing Implicit" coq-unset-printing-implicit t]
["Set Printing Coercions" coq-set-printing-coercions t]
["Unset Printing Coercions" coq-unset-printing-coercions t]
+ ["Set Printing Synth" coq-set-printing-synth t]
+ ["Unset Printing Synth" coq-unset-printing-synth t]
+ ["Set Printing Universes" coq-set-printing-universes t]
+ ["Unset Printing Universes" coq-unset-printing-universes t]
["Set Printing Wildcards" coq-set-printing-wildcards t]
- ["Unset Printing Wildcards" coq-unset-printing-wildcards t])
+ ["Unset Printing Wildcards" coq-unset-printing-wildcards t]
+ ["Set Printing Width" coq-ask-adapt-printing-width-and-show t])
""
["ML4PG" (coq-activate-ml4pg) :help "Activates ML4PG: machine-learning methods for Proof General"]
))
diff --git a/coq/coq-compile-common.el b/coq/coq-compile-common.el
index 415f65ee..af3e70a4 100644
--- a/coq/coq-compile-common.el
+++ b/coq/coq-compile-common.el
@@ -18,6 +18,7 @@
(eval-when (compile)
;;(defvar coq-pre-v85 nil)
+ (require 'compile)
(defvar coq-confirm-external-compilation nil); defpacustom
(defvar coq-compile-parallel-in-background nil) ; defpacustom
(proof-ready-for-assistant 'coq)) ; compile for coq
@@ -92,11 +93,38 @@ Must be used together with `coq-par-enable'."
ncpus
nil)))
-(defvar coq-internal-max-jobs 1
+(defvar coq--max-background-vio2vo-percentage-shadow 40
+ "Internal shadow value of `coq-max-background-vio2vo-percentage'.
+This variable does always contain the same value as
+`coq-max-background-vio2vo-percentage'. It is used only to break
+the dependency cycle between `coq-set-max-vio2vo-jobs' and
+`coq-max-background-vio2vo-percentage'.")
+
+(defvar coq--internal-max-vio2vo-jobs 1
+ "Internal number of vio2vo jobs.
+This is the internal value, use
+`coq-max-background-vio2vo-percentage' to configure.")
+
+(defvar coq--internal-max-jobs 1
"Value of `coq-max-background-compilation-jobs' translated to a number.")
+(defun coq-set-max-vio2vo-jobs ()
+ "Set `coq--internal-max-vio2vo-jobs'."
+ (setq coq--internal-max-vio2vo-jobs
+ (max 1
+ (round (* coq--internal-max-jobs
+ coq--max-background-vio2vo-percentage-shadow
+ 0.01)))))
+
+(defun coq-max-vio2vo-setter (symbol new-value)
+ ":set function for `coq-max-background-vio2vo-percentage'.
+SYMBOL should be 'coq-max-background-vio2vo-percentage"
+ (set symbol new-value)
+ (setq coq--max-background-vio2vo-percentage-shadow new-value)
+ (coq-set-max-vio2vo-jobs))
+
(defun coq-max-jobs-setter (symbol new-value)
- ":set function for `coq-max-background-compilation-jobs.
+ ":set function for `coq-max-background-compilation-jobs'.
SYMBOL should be 'coq-max-background-compilation-jobs"
(set symbol new-value)
(cond
@@ -106,7 +134,20 @@ SYMBOL should be 'coq-max-background-compilation-jobs"
(setq new-value 1)))
((and (integerp new-value) (> new-value 0)) t)
(t (setq new-value 1)))
- (setq coq-internal-max-jobs new-value))
+ (setq coq--internal-max-jobs new-value)
+ (coq-set-max-vio2vo-jobs))
+
+(defun coq-compile-quick-setter (symbol new-value)
+ ":set function for `coq-compile-quick' for pre 8.5 compatibility.
+Ignore any quick setting for Coq versions before 8.5."
+ (cond
+ ((or (eq new-value 'ensure-vo) (eq new-value 'no-quick))
+ t)
+ ((coq--pre-v85)
+ (message "Ignore coq-compile-quick setting %s for Coq before 8.5"
+ new-value)
+ (setq new-value 'no-quick)))
+ (set symbol new-value))
;;; user options and variables
@@ -123,7 +164,7 @@ required library module and its dependencies are up-to-date. If not, they
are compiled from the sources before the \"Require\" command is processed.
This option can be set/reset via menu
-`Coq -> Settings -> Compile Before Require'."
+`Coq -> Auto Compilation -> Compile Before Require'."
:type 'boolean
:safe 'booleanp
:group 'coq-auto-compile)
@@ -140,7 +181,7 @@ the background. The maximal number of parallel compilation jobs
is set with `coq-max-background-compilation-jobs'.
This option can be set/reset via menu
-`Coq -> Settings -> Compile Parallel In Background'."
+`Coq -> Auto Compilation -> Compile Parallel In Background'."
:type 'boolean
:safe 'booleanp
:group 'coq-auto-compile
@@ -149,13 +190,100 @@ This option can be set/reset via menu
;; defpacustom fails to call :eval during inititialization, see trac #456
(coq-switch-compilation-method)
+(defcustom coq-compile-quick 'no-quick
+ "Control quick compilation, vio2vo and vio/vo files auto compilation.
+This option controls whether ``-quick'' is used for parallel
+background compilation and whether up-date .vo or .vio files are
+used or deleted. Please use the customization system to change
+this option to ensure that any ``-quick'' setting is ignored for
+Coq before 8.5.
+
+Note that ``-quick'' can be noticebly slower when your sources do
+not declare section variables with ``Proof using''. Note that
+even if you do declare section variables, ``-quick'' is typically
+slower on small files.
+
+Use the default `no-quick', if you have not yet switched to
+``Proof using''. Use `quick-no-vio2vo', if you want quick
+recompilation without producing .vo files. Value
+`quick-and-vio2vo' updates missing prerequisites with ``-quick''
+and starts vio2vo conversion on a subset of the availables
+cores (see `coq-compile-vio2vo-percentage') when the quick
+recompilation finished (but see below for a .vio .vo
+incompatibility caveat). Note that all the previously described
+modes might load .vio files and that you therefore might not
+notice certain universe inconsistencies. Finally, use `ensure-vo'
+for only importing .vo files with complete universe checks.
+
+Detailed description of the 4 modes:
+
+no-quick Compile outdated prerequisites without ``-quick'',
+ producing .vo files, but don't compile prerequisites
+ for which an up-to-date .vio file exists. Delete
+ or overwrite outdated .vo files.
+
+quick-no-vio2vo Compile outdated prerequisites with ``-quick'',
+ producing .vio files, but don't compile prerequisites
+ for which an up-to-date .vo file exists. Delete
+ or overwrite outdated .vio files.
+
+quick-and-vio2vo Same as `quick-no-vio2vo', but start vio2vo processes
+ after the last ``Require'' command has been processed
+ to convert the vio dependencies into vo files. With this
+ mode you might see asynchronous errors from vio2vo
+ compilation while you are processing stuff far below the
+ last require. vio2vo compilation is done on a subset of
+ the available cores, see `coq-compile-vio2vo-percentage'.
+ When `coq-compile-keep-going' is set, vio2vo compilation
+ is scheduled for those files for which coqc compilation
+ was successful.
+
+ Warning: This mode does only work when you process require
+ commands in batches. Slowly single-stepping through require's
+ might lead to inconsistency errors when loading some
+ libraries, see Coq issue #5223.
+
+ensure-vo Ensure that all library dependencies are present as .vo
+ files and delete outdated .vio files or .vio files that
+ are more recent than the corresponding .vo file. This
+ setting is the only one that ensures soundness."
+ :type
+ '(radio
+ (const :tag "don't use -quick but accept existing vio files" no-quick)
+ (const :tag "use -quick, don't do vio2vo" quick-no-vio2vo)
+ (const :tag "use -quick and do vio2vo" quick-and-vio2vo)
+ (const :tag "ensure vo compilation, delete vio files" ensure-vo))
+ :safe (lambda (v) (member v '(no-quick quick-no-vio2vo
+ quick-and-vio2vo ensure-vo)))
+ :set 'coq-compile-quick-setter
+ :group 'coq-auto-compile)
+
+(defun coq-compile-prefer-quick ()
+ "Return t if a .vio file would be prefered."
+ (or
+ (eq coq-compile-quick 'quick-no-vio2vo)
+ (eq coq-compile-quick 'quick-and-vio2vo)))
+
+(defcustom coq-compile-keep-going t
+ "Continue compilation after the first error as far as possible.
+Similar to ``make -k'', with this option enabled, the background
+compilation continues after the first error as far as possible.
+With this option disabled, background compilation is
+immediately stopped after the first error.
+
+This option can be set/reset via menu
+`Coq -> Auto Compilation -> Keep going'.")
+
+;; define coq-compile-keep-going-toggle
+(proof-deftoggle coq-compile-keep-going)
+
(defcustom coq-max-background-compilation-jobs 'all-cpus
"Maximal number of parallel jobs, if parallel compilation is enabled.
Use the number of available CPU cores if this is set to
'all-cpus. This variable is the user setting. The value that is
-really used is `coq-internal-max-jobs'. Use `coq-max-jobs-setter'
+really used is `coq--internal-max-jobs'. Use `coq-max-jobs-setter'
or the customization system to change this variable. Otherwise
-your change will have no effect, because `coq-internal-max-jobs'
+your change will have no effect, because `coq--internal-max-jobs'
is not adapted."
:type '(choice (const :tag "use all CPU cores" all-cpus)
(integer :tag "fixed number" :value 1))
@@ -163,6 +291,24 @@ is not adapted."
:set 'coq-max-jobs-setter
:group 'coq-auto-compile)
+(defcustom coq-max-background-vio2vo-percentage 40
+ "Percentage of `coq-max-background-vio2vo-percentage' for vio2vo jobs.
+This setting configures the maximal number of vio2vo background
+jobs (if you set `coq-compile-quick' to 'quick-and-vio2vo) as
+percentage of `coq-max-background-compilation-jobs'."
+ :type 'number
+ :safe 'numberp
+ :set 'coq-max-vio2vo-setter
+ :group 'coq-auto-compile)
+
+(defcustom coq-compile-vio2vo-delay 2.5
+ "Delay in seconds for the vio2vo compilation.
+This delay helps to avoid running into a library inconsistency
+with 'quick-and-vio2vo, see Coq issue #5223."
+ :type 'number
+ :safe 'numberp
+ :group 'coq-auto-compile)
+
(defcustom coq-compile-command ""
"External compilation command. If empty ProofGeneral compiles itself.
If unset (the empty string) ProofGeneral computes the dependencies of
@@ -266,23 +412,14 @@ of the regular expressions in this list then ProofGeneral does
neither compile this file nor check its dependencies for
compilation. It makes sense to include non-standard coq library
directories here if they are not changed and if they are so big
-that dependency checking takes noticeable time."
+that dependency checking takes noticeable time. The regular
+expressions in here are always matched against the .vo file name,
+regardless whether ``-quick'' would be used to compile the file
+or not."
:type '(repeat regexp)
:safe (lambda (v) (every 'stringp v))
:group 'coq-auto-compile)
-(defcustom coq-compile-ignore-library-directory t
- "If non-nil, ProofGeneral does not compile modules from the coq library.
-Should be `t' for normal coq users. If `nil' library modules are
-compiled if their sources are newer.
-
-This option has currently no effect, because Proof General uses
-coqdep to translate qualified identifiers into library file names
-and coqdep does not output dependencies in the standard library."
- :type 'boolean
- :safe 'booleanp
- :group 'coq-auto-compile)
-
(defcustom coq-coqdep-error-regexp
(concat "^\\*\\*\\* Warning: in file .*, library .* is required "
"and has not been found")
@@ -300,12 +437,6 @@ the latter condition into an error, then set this variable to
:safe 'stringp
:group 'coq-auto-compile)
-(defconst coq-require-command-regexp
- "^Require[ \t\n]+\\(Import\\|Export\\)?[ \t\n]*"
- "Regular expression matching Require commands in Coq.
-Should match \"Require\" with its import and export variants up to (but not
-including) the first character of the first required module. The required
-modules are matched separately with `coq-require-id-regexp'")
(defconst coq-require-id-regexp
"[ \t\n]*\\([A-Za-z0-9_']+\\(\\.[A-Za-z0-9_']+\\)*\\)[ \t\n]*"
@@ -315,14 +446,22 @@ white space. The module identifier must be matched with group number 1.
Note that the trailing dot in \"Require A.\" is not part of the module
identifier and should therefore not be matched by this regexp.")
+(defconst coq-require-command-regexp
+ (concat "^\\(?:From[ \t\n]+\\(?1:[A-Za-z0-9_']+\\(?:\\.[A-Za-z0-9_']+\\)*\\)"
+ "[ \t\n]*\\)?"
+ "\\(?2:Require[ \t\n]+\\(?:Import\\|Export\\)?\\)[ \t\n]*")
+ "Regular expression matching Require commands in Coq.
+Should match \"Require\" with its import and export variants up to (but not
+including) the first character of the first required module. The required
+modules are matched separately with `coq-require-id-regexp'")
+
(defvar coq-compile-history nil
"History of external Coq compilation commands.")
-(defvar coq-compile-response-buffer "*coq-compile-response*"
+(defvar coq--compile-response-buffer "*coq-compile-response*"
"Name of the buffer to display error messages from coqc and coqdep.")
-
-(defvar coq-debug-auto-compilation nil
+(defvar coq--debug-auto-compilation nil
"*Display more messages during compilation")
@@ -330,11 +469,11 @@ identifier and should therefore not be matched by this regexp.")
(defun time-less-or-equal (time-1 time-2)
"Return `t' if time value time-1 is earlier or equal to time-2.
-A time value is a list of two integers as returned by `file-attributes'.
-The first integer contains the upper 16 bits and the second the lower
-16 bits of the time."
- (or (time-less-p time-1 time-2)
- (equal time-1 time-2)))
+A time value is a list of two, three or four integers of the
+form (high low micro pico) as returned by `file-attributes' or
+'current-time'. First element high contains the upper 16 bits and
+the second low the lower 16 bits of the time."
+ (not (time-less-p time-2 time-1)))
(defun coq-max-dep-mod-time (dep-mod-times)
"Return the maximum in DEP-MOD-TIMES.
@@ -357,52 +496,53 @@ DEP-MOD-TIMES is empty it returns nil."
max))
-;;; Compute command line for starting coqtop
-
-
-
-
-
;;; ignore library files
(defun coq-compile-ignore-file (lib-obj-file)
"Check whether ProofGeneral should handle compilation of LIB-OBJ-FILE.
Return `t' if ProofGeneral should skip LIB-OBJ-FILE and `nil' if
-ProofGeneral should handle the file. For normal users it does, for instance,
-not make sense to let ProofGeneral check if the coq standard library
-is up-to-date."
- (or
- (and
- coq-compile-ignore-library-directory
- (eq (compare-strings coq-library-directory 0 nil
- lib-obj-file 0 (length coq-library-directory))
- t)
- (if coq-debug-auto-compilation
- (message "Ignore lib file %s" lib-obj-file))
- t)
- (if (some
- (lambda (dir-regexp) (string-match dir-regexp lib-obj-file))
- coq-compile-ignored-directories)
- (progn
- (if coq-debug-auto-compilation
- (message "Ignore %s" lib-obj-file))
- t)
- nil)))
-
-;;; convert .vo files to .v files
-
-(defun coq-library-src-of-obj-file (lib-obj-file)
+ProofGeneral should handle the file. For normal users it does,
+for instance, not make sense to let ProofGeneral check if the coq
+standard library is up-to-date. This function is always invoked
+on the .vo file name, regardless whether the file would be
+compiled with ``-quick'' or not."
+ (if (some
+ (lambda (dir-regexp) (string-match dir-regexp lib-obj-file))
+ coq-compile-ignored-directories)
+ (progn
+ (when coq--debug-auto-compilation
+ (message "Ignore %s" lib-obj-file))
+ t)
+ nil))
+
+;;; convert .vo files to .v files and module names
+
+(defun coq-module-of-src-file (src-file)
+ "Return the module name for SRC-FILE.
+SRC-FILE must be a .v file."
+ (let ((file (file-name-nondirectory src-file)))
+ (substring file 0 (max 0 (- (length file) 2)))))
+
+(defun coq-library-src-of-vo-file (lib-obj-file)
"Return source file name for LIB-OBJ-FILE.
Chops off the last character of LIB-OBJ-FILE to convert \"x.vo\" to \"x.v\"."
(substring lib-obj-file 0 (- (length lib-obj-file) 1)))
+(defun coq-library-vio-of-vo-file (vo-obj-file)
+ "Return .vio file name for VO-OBJ-FILE.
+Changes the suffix from .vio to .vo. VO-OBJ-FILE must have a .vo suffix."
+ (concat (coq-library-src-of-vo-file vo-obj-file) "io"))
+
;;; ancestor unlocking
;;; (locking is different for sequential and parallel compilation)
(defun coq-unlock-ancestor (ancestor-src)
"Unlock ANCESTOR-SRC."
- (let* ((true-ancestor (file-truename ancestor-src)))
+ (let* ((default-directory
+ (buffer-local-value 'default-directory
+ (or proof-script-buffer (current-buffer))))
+ (true-ancestor (file-truename ancestor-src)))
(setq proof-included-files-list
(delete true-ancestor proof-included-files-list))
(proof-restart-buffers (proof-files-to-buffers (list true-ancestor)))))
@@ -413,22 +553,37 @@ Chops off the last character of LIB-OBJ-FILE to convert \"x.vo\" to \"x.v\"."
(span-set-property span 'coq-locked-ancestors ()))
-;;; manage coq-compile-respose-buffer
-
-(defun coq-init-compile-response-buffer (command)
+;;; manage coq--compile-response-buffer
+
+(defun coq-compile-display-error (command error-message display)
+ "Display COMMAND and ERROR-MESSAGE in `coq--compile-response-buffer'.
+If needed, reinitialize `coq--compile-response-buffer'. Then
+display COMMAND and ERROR-MESSAGE."
+ (unless (buffer-live-p (get-buffer coq--compile-response-buffer))
+ (coq-init-compile-response-buffer))
+ (let ((inhibit-read-only t)
+ (deactivate-mark nil))
+ (with-current-buffer coq--compile-response-buffer
+ (save-excursion
+ (goto-char (point-max))
+ (insert command "\n" error-message "\n"))))
+ (when display
+ (coq-display-compile-response-buffer)))
+
+(defun coq-init-compile-response-buffer (&optional command)
"Initialize the buffer for the compilation output.
-If `coq-compile-response-buffer' exists, empty it. Otherwise
-create a buffer with name `coq-compile-response-buffer', put
+If `coq--compile-response-buffer' exists, empty it. Otherwise
+create a buffer with name `coq--compile-response-buffer', put
it into `compilation-mode' and store it in
-`coq-compile-response-buffer' for later use. Argument COMMAND is
+`coq--compile-response-buffer' for later use. Argument COMMAND is
the command whose output will appear in the buffer."
- (let ((buffer-object (get-buffer coq-compile-response-buffer)))
+ (let ((buffer-object (get-buffer coq--compile-response-buffer)))
(if buffer-object
(let ((inhibit-read-only t))
(with-current-buffer buffer-object
(erase-buffer)))
(setq buffer-object
- (get-buffer-create coq-compile-response-buffer))
+ (get-buffer-create coq--compile-response-buffer))
(with-current-buffer buffer-object
(compilation-mode)
;; read-only-mode makes compilation fail if some messages need
@@ -441,17 +596,47 @@ the command whose output will appear in the buffer."
;; the first line are not found for some reason ...
(let ((inhibit-read-only t))
(with-current-buffer buffer-object
- (insert "-*- mode: compilation; -*-\n\n" command "\n")))))
+ (insert "-*- mode: compilation; -*-\n\n")
+ (when command
+ (insert command "\n"))))))
(defun coq-display-compile-response-buffer ()
- "Display the errors in `coq-compile-response-buffer'."
- (with-current-buffer coq-compile-response-buffer
+ "Display the errors in `coq--compile-response-buffer'."
+ (with-current-buffer coq--compile-response-buffer
;; fontification enables the error messages
(let ((font-lock-verbose nil)) ; shut up font-lock messages
(font-lock-fontify-buffer)))
;; Make it so the next C-x ` will use this buffer.
- (setq next-error-last-buffer (get-buffer coq-compile-response-buffer))
- (proof-display-and-keep-buffer coq-compile-response-buffer 1 t))
+ (setq next-error-last-buffer (get-buffer coq--compile-response-buffer))
+ (proof-display-and-keep-buffer coq--compile-response-buffer 1 t)
+ ;; Partial fix for #54: ensure that the compilation response
+ ;; buffer is not in a dedicated window.
+ (mapc (lambda (w) (set-window-dedicated-p w nil))
+ (get-buffer-window-list coq--compile-response-buffer nil t)))
+
+
+;;; enable next-error to find vio2vo errors
+;;
+;; compilation-error-regexp-alist-alist is an alist mapping symbols to
+;; what is expected for compilation-error-regexp-alist. This is
+;; element of the form (REGEXP FILE [LINE COLUMN TYPE HYPERLINK
+;; HIGHLIGHT...]). If REGEXP matches, the FILE'th subexpression gives
+;; the file name, and the LINE'th subexpression gives the line number.
+;; The COLUMN'th subexpression gives the column number on that line,
+;; see the documentation of compilation-error-regexp-alist.
+;;
+;; Need to wrap adding the vio2vo error regex in eval-after-load,
+;; because compile is loaded on demand and might not be present when
+;; the user visits the first Coq file.
+
+(eval-after-load 'compile
+ '(progn
+ (push
+ '(coq-vio2vo
+ "File \\(.*\\): proof of [^:]*\\(: chars \\([0-9]*\\)-\\([0-9]*\\)\\)?"
+ 1 nil 3)
+ compilation-error-regexp-alist-alist)
+ (push 'coq-vio2vo compilation-error-regexp-alist)))
;;; save some buffers
diff --git a/coq/coq-db.el b/coq/coq-db.el
index 631df56d..0d9c0a6e 100644
--- a/coq/coq-db.el
+++ b/coq/coq-db.el
@@ -305,11 +305,21 @@ See `coq-syntax-db' for DB structure."
"Face for unicode binders, by default a bold version of `font-lock-type-face'."
:group 'proof-faces)
+(defface coq-symbol-face
+ '((t :inherit default-face :bold coq-bold-unicode-binders))
+ "Face for unicode binders, by default a bold version of `font-lock-type-face'."
+ :group 'proof-faces)
+
(defface coq-question-mark-face
'((t :inherit font-lock-variable-name-face))
"Face for Ltac binders and evars."
:group 'proof-faces)
+(defface coq-context-qualifier-face
+ '((t :inherit font-lock-preprocessor-face :weight bold))
+ "Face used for `ltac:', `constr:', and `uconstr:' headers."
+ :group 'proof-faces)
+
(defconst coq-solve-tactics-face 'coq-solve-tactics-face
"Expression that evaluates to a face.
Required so that 'coq-solve-tactics-face is a proper facename")
@@ -322,6 +332,10 @@ Required so that 'coq-cheat-face is a proper facename")
"Expression that evaluates to a face.
Required so that 'coq-symbol-binder-face is a proper facename")
+(defconst coq-symbol-face 'coq-symbol-face
+ "Expression that evaluates to a face.
+Required so that 'coq-symbol-binder-face is a proper facename")
+
(defconst coq-question-mark-face 'coq-question-mark-face)
diff --git a/coq/coq-indent.el b/coq/coq-indent.el
index fddfc373..e5179390 100644
--- a/coq/coq-indent.el
+++ b/coq/coq-indent.el
@@ -96,8 +96,8 @@ detect if they start something or not."
(not (proof-string-match "{\\s-*\\(wf\\|measure\\)" str)))))))
-(defconst coq-simple-cmd-ender-regexp "[^.]\\|\\=\\|\\.\\."
- "Used internally. Matches the allow prefix of the coq \".\" command ending.")
+(defconst coq-simple-cmd-ender-prefix-regexp "[^.]\\|\\=\\|\\.\\."
+ "Used internally. Matches the allowed prefixes of coq \".\" command ending.")
(defconst coq-bullet-regexp-nospace "\\(-\\)+\\|\\(+\\)+\\|\\(\\*\\)+"
"Matches single bullet, WARNING: Lots of false positive.
@@ -109,14 +109,14 @@ No context checking.")
;; bullets and curlys and spaces). This is used when search backward.
;; This variable is the regexp of possible prefixes
(defconst coq-bullet-prefix-regexp
- (concat "\\(?:\\(?:" coq-simple-cmd-ender-regexp "\\)"
+ (concat "\\(?:\\(?:" coq-simple-cmd-ender-prefix-regexp "\\)"
"\\(?:\\.\\)\\(?:\\s-\\)\\(?:\\s-\\|{\\|}\\|-\\|+\\|\\*\\)*\\)"))
;; matches regular command end (. and ... followed by a space or buffer end)
;; ". " and "... " are command endings, ".. " is not, same as in
;; proof-script-command-end-regexp in coq.el
(defconst coq-period-end-command
- (concat "\\(?:\\(?2:" coq-simple-cmd-ender-regexp "\\)\\(?1:\\.\\)\\(?3:\\s-\\|\\'\\)\\)")
+ (concat "\\(?:\\(?2:" coq-simple-cmd-ender-prefix-regexp "\\)\\(?1:\\.\\)\\(?3:\\s-\\|\\'\\)\\)")
"Matches coq regular syntax for ending a command (except bullets and curlies).
This should match EXACTLY command ending syntax. No false
@@ -194,10 +194,14 @@ command ended by the bullet-like regexp is empty. This is done in
coq-smie.el, and see `coq-end-command-regexp-backward' for a more
precise regexp (but only when searching backward).")
+; Order here is significant, when two pattern match with the same
+; starting position, the first regexp is preferred. period-command is
+; the shorter one so let us have it at the end, but what about cury vs
+; bullets?
(defconst coq-end-command-regexp-backward
(concat coq-bullet-end-command-backward "\\|"
- coq-period-end-command "\\|"
- coq-curlybracket-end-command-backward)
+ coq-curlybracket-end-command-backward "\\|"
+ coq-period-end-command)
"Matches end of commands, including bullets and curlies.
There are 3 substrings (2 and 3 may be nil):
diff --git a/coq/coq-par-compile.el b/coq/coq-par-compile.el
index 5c37c382..8901a008 100644
--- a/coq/coq-par-compile.el
+++ b/coq/coq-par-compile.el
@@ -63,6 +63,7 @@
;; 1- where to put the Require command and the items that follow it
;; 2- make sure ancestors are properly locked
;; 3- error reporting
+;; 4- using -quick and the handling of .vo/.vio prerequisites
;;
;; For 1- where to put the Require command and the items that follow it:
;;
@@ -84,12 +85,15 @@
;; back into proof-action-list only if all top-level jobs of those
;; modules that are required before it are finished.
;;
-;; A problem occurs with "Require b a.", where b depends on a. To
-;; avoid cycles in the dependency graph, here the top-level
-;; compilation job for "a" will be a so-called clone of the real
-;; compilation job. The Require item is stored with the clone. The
-;; real job has dependency links to all its clones. Every clone waits
-;; until its real job has finished.
+;; A problem occurs with "Require a. Require a.", where two different
+;; action list pieces must be stored with the job for a. The solution
+;; here is to clone the original job when it is needed more than one
+;; time. This cloning is done in general and not only for top-level
+;; jobs. So also when a.v and b.v both depend on c.v, the second
+;; dependency link is managed by a clone of the job for c.v. Every
+;; real job has dependency links to all its clones. All clones wait
+;; until the original job has finished. (In retrospect it seems a
+;; design without clone jobs might have been cleaner.)
;;
;; For 2- make sure ancestors are properly locked:
;;
@@ -100,27 +104,62 @@
;; when only "Require a." is retracted.
;;
;; The problem is solved with the 'coq-locked-ancestors property of
-;; spans that contain Require commands and with the
-;; coq-par-ancestor-files hash. Ancestors in the 'coq-locked-ancestors
-;; property are unlocked when this span is retracted. As locking is
-;; done eagerly (as soon as coqdep runs first on the file), I only
-;; have to make sure the right files appear in 'coq-locked-ancestors.
+;; spans that contain Require commands. Ancestors in the
+;; 'coq-locked-ancestors property are unlocked when this span is
+;; retracted. As locking is done eagerly (as soon as coqdep runs first
+;; on the file), I only have to make sure the right files appear in
+;; 'coq-locked-ancestors.
;;
-;; Ancestor files accumulate in compilation jobs when the compilation
-;; walks upwards the dependency tree. In the end, every top-level job
-;; contains a list of all its direct and indirect ancestors. Because
-;; of eager locking, all its ancestors are already locked, when a
-;; top-level job is about to be retired. The coq-par-ancestor-files
-;; hash therefore records whether some ancestor does already appear in
-;; the 'coq-locked-ancestors property of some span before the current
-;; one. If it doesn't, I store it in the current span.
+;; Ancestors accumulate in compilation jobs when the compilation walks
+;; upwards the dependency tree. In the end, every top-level job
+;; contains a list of all its direct and indirect ancestors in its
+;; 'ancestors property. Because of eager locking, all its ancestors
+;; are already locked, when a top-level job is about to be retired.
+;; Every job records in his 'locked propery whether the file
+;; corresponding to this job has been registered in some
+;; 'coq-locked-ancestors property already.
;;
;; For 3- error reporting:
;;
-;; For now, all compilation jobs are killed on the first error. All
-;; items that are not yet asserted are retract. This is done with
-;; signalling an error and calling `coq-par-emergency-cleanup' in the
-;; sentinel, if there was an error.
+;; Depending on `coq-compile-keep-going' compilation can continue
+;; after an error or stop immediately. For stopping immediately,
+;; processing is aborted with a signal that eventually leads to
+;; `coq-par-emergency-cleanup', which kills all compilation jobs,
+;; retracts the queue region and resets all internal data.
+;;
+;; For `coq-compile-keep-going', the failing job and all dependants
+;; are marked as 'failed. Queue dependants are marked with
+;; 'queue-failed. These marked jobs continue with their normal state
+;; transition, but omit certain steps (eg., running coqc). The first
+;; tricky part is how to unlock ancestors. When marking jobs as
+;; failed, their ancestors (and thereby also the files for the jobs
+;; themselves) are unlocked, unless they are still participating in an
+;; ongoing compilation. If a coqc compilation finishes and all
+;; dependants are marked as failed, ancestors are also unlocked in the
+;; same way. If a top-level job is marked as 'queue-failed, its
+;; ancestors are unlocked when this job finishes coqc compilation.
+;;
+;; The second tricky part is how to delete the queue region. For that
+;; the last top-level job is delayed until proof-action-list is empty.
+;; Then the whole queue is deleted.
+;;
+;; For 4- using -quick and the handling of .vo/.vio prerequisites
+;;
+;; Coq accepts both .vo and .vio files for importing modules
+;; regardless of it is running with -quick or not. However, it is
+;; unclear which file is loaded when both, .vo and .vio, of a
+;; dependency are present. Therefore I delete a .vio file when I
+;; decide to rebuild a .vo file and vica versa. coqdep delivers
+;; dependencies for both, .vio and .vo files. These dependencies are
+;; identical for .vio and vo (last checked for coq trunk in October
+;; 2016). For deciding whether prerequisites must be recompiled the
+;; full path returned form coqdep is relevant. Because it seems odd to
+;; store a full path without a .vo or .vio suffix I decided to always
+;; store the .vo object file name in the 'vo-file property of
+;; compilation jobs. Only when all dependencies are ready, in
+;; `coq-par-job-needs-compilation' I decide whether to build a .vio or
+;; .vo file and if already present .vo or .vio files must be deleted.
+;; Only at that point the relevant property 'required-obj-file is set.
;;
;;
;; Properties of compilation jobs
@@ -128,10 +167,18 @@
;; 'name - some unique string, only used for debugging
;; 'queueitems - holds items from proof-action-list on
;; top-level jobs
-;; 'obj-file - the .vo that this job has to make up-to-date
-;; 'obj-mod-time - modification time of the .vo file, stored
+;; 'vo-file - the .vo file for the module that this job has
+;; to make up-to-date. This slot is filled when the
+;; job is created and independent of whether a .vio
+;; or .vo file must be made up-to-date.
+;; 'required-obj-file - contains the .vio or .vo to be produced or nil
+;; if that has not yet been decided. Does also contain
+;; nil if no file needs to be rebuild at all.
+;; 'obj-mod-time - modification time of 'required-obj-file, stored
;; here, to avoid double stat calls;
-;; contains 'obj-does-not-exist in case .vo is absent
+;; contains 'obj-does-not-exist in case that file is absent
+;; 'use-quick - t if `coq-par-job-needs-compilation' decided to use
+;; -quick
;; 'type - the type of the job, either 'clone or 'file
;; for real compilation jobs
;; 'state - the state of the job, see below
@@ -158,11 +205,22 @@
;; 'src-file - the .v file name
;; 'load-path - value of coq-load-path, propagated to all
;; dependencies
-;; 'ancestor-files - list of ancestors, including the source file
-;; of this job
-;; 'require-span - present for top-level jobs only, there it
+;; 'ancestors - list of ancestor jobs, for real compilation jobs
+;; this list includes the job itself; may contain
+;; duplicates
+;; 'lock-state - nil for clone jobs, 'unlocked if the file
+;; corresponding to job is not locked, 'locked if that
+;; file has been locked, 'asserted if it has been
+;; registered in some span in the 'coq-locked-ancestors
+;; property already
+;; 'require-span - present precisely for top-level jobs only, there it
;; contains the span that must finally store the
;; ancestors
+;; 'vio2vo-needed - t if a subsequent vio2vo process is required to
+;; build the .vo file. Otherwiese nil.
+;; 'failed - t if coqdep or coqc for the job or one dependee failed.
+;; 'queue-failed - t if some direct or indirect queue dependee is
+;; marked 'failed
;; 'visited - used in the dependency cycle detection to mark
;; visited jobs
;;
@@ -178,9 +236,10 @@
;; finish
;; 'enqueued-coqc - coqc is running, or the job is enqueued,
;; waiting for a slot to start coqc
-;; 'waiting-queue - the job is waiting until all top-level queue
-;; dependencies finish (if there are any)
-;; 'ready - ready
+;; 'waiting-queue - coqc is finished and the job is waiting until
+;; all top-level queue dependencies finish (if
+;; there are any)
+;; 'ready - ready, the .vo file might be missing though
;;
;;
;; State transition for clone jobs
@@ -210,16 +269,8 @@
;; 'coq-process-command - the command for error reporting
;; (as string list)
;; 'coq-par-process-killed - t if this process has been killed
-;;
-;;
-;; Symbols in the coq-par-ancestor-files hash
-;;
-;; This hash maps file names to symbols. A file is present in the
-;; hash, if it has been locked.
-;;
-;; 'locked - the file is not yet stored in the
-;; 'coq-locked-ancestors property of some span
-;; 'asserted - the file has been stored in some span
+;; 'coq-process-rm - if not nil, a file to be deleted when
+;; the process is killed
;;
;;
;; To print the states of the compilation jobs for debugging, eval
@@ -237,7 +288,7 @@
;; (mapc (lambda (p) (when (eq (get p 'type) 'clone)
;; (push p clones)))
;; (get v 'coqc-dependants)))
-;; coq-compilation-object-hash)
+;; coq--compilation-object-hash)
;; (mapc (lambda (v)
;; (message "%s type %s for %s state %s dep of %s queue dep of %s"
;; (get v 'name)
@@ -251,41 +302,47 @@
;;; Variables
-(defvar coq-par-ancestor-files nil
- "Hash remembering the state of locked ancestor files.
-This hash maps true file names (in the sense of `file-truename')
-to either 'locked or 'asserted.
-
-'locked means that this ancestor file has been locked
-already (because it appeared in the dependency tree somewhere and
-coqdep has been started on it) but has not been assigned to the
-'coq-locked-ancestors property of some span. That is, 'locked
-ancestors are not an ancestor of any required module in the
-asserted region.
-
-'asserted means that this ancestor is the ancestor of some
-asserted required module (and is in some 'coq-locked-ancestors
-property).")
-
-(defvar coq-current-background-jobs 0
+(defvar coq--current-background-jobs 0
"Number of currently running background jobs.")
-(defvar coq-compilation-object-hash nil
+(defvar coq--compilation-object-hash nil
"Hash for storing the compilation jobs.
-The hash will only store real compilation jobs and no clones.
-They are stored in order to avoid double compilation. The jobs
-stored in here are uninterned symbols that carry all important
+This hash only stores real compilation jobs and no clones. They
+are stored in order to avoid double compilation. The jobs stored
+in here are uninterned symbols that carry all important
information in their property list. See the documentation in the
-source file \"coq-par-compile.el\"")
+source file \"coq-par-compile.el\". The hash always maps .vo file
+names to compilation jobs, regardless of ``-quick''.")
-(defvar coq-last-compilation-job nil
+(defvar coq--last-compilation-job nil
"Pointer to the last top-level compilation job.
Used to link top-level jobs with queue dependencies.")
-(defvar coq-par-next-id 1
+(defvar coq--compile-vio2vo-in-progress nil
+ "Set to t iff vio2vo is running in background.")
+
+(defvar coq--compile-vio2vo-delay-timer nil
+ "Holds the timer for the vio2vo delay.")
+
+(defvar coq--compile-vio2vo-start-id 0
+ "Integer counter to detect races for `coq-par-require-processed'.
+Assume compilation for the last top-level ``Require'' command
+finishes but executing the ``Require'' takes so long that the
+user can assert a next ``Require'' and that the second
+compilation finishes before the first ``Require'' has been
+processed. In this case there are two `coq-par-require-processed'
+callbacks active, of which the first one must be ignored. For
+each new callback this counter is incremented and when there is a
+difference the call to `coq-par-require-processed' is ignored.")
+
+(defvar coq--par-next-id 1
"Increased for every job and process, to get unique job names.
The names are only used for debugging.")
+(defvar coq--par-delayed-last-job nil
+ "Inform the cycle detection that there is a delayed top-level job.
+If t, there is a delayed top-level job (for which the compilation failed).")
+
;;; utility functions
@@ -324,45 +381,73 @@ latter greater then everything else."
(t (time-less-p time-1 time-2))))
(defun coq-par-init-compilation-hash ()
- "(Re-)Initialize `coq-compilation-object-hash'."
- (setq coq-compilation-object-hash (make-hash-table :test 'equal)))
+ "(Re-)Initialize `coq--compilation-object-hash'."
+ (setq coq--compilation-object-hash (make-hash-table :test 'equal)))
-(defun coq-par-init-ancestor-hash ()
- "(Re-)Initialize `coq-par-ancestor-files'"
- (setq coq-par-ancestor-files (make-hash-table :test 'equal))
- (mapc
- (lambda (locked-anc)
- (puthash locked-anc 'asserted coq-par-ancestor-files))
- proof-included-files-list))
+;;; generic queues
+;; Standard implementation with two lists.
+(defun coq-par-new-queue ()
+ "Create a new empty queue."
+ (cons nil nil))
-;;; job queue
+(defun coq-par-enqueue (queue x)
+ "Insert x in queue QUEUE."
+ (push x (car queue)))
-(defun coq-par-new-compilation-queue ()
- "Create a new empty queue for `coq-par-compilation-queue'"
- (cons nil nil))
+(defun coq-par-dequeue (queue)
+ "Dequeue the next item from QUEUE."
+ (let ((res (pop (cdr queue))))
+ (unless res
+ (setcdr queue (nreverse (car queue)))
+ (setcar queue nil)
+ (setq res (pop (cdr queue))))
+ res))
-(defvar coq-par-compilation-queue (coq-par-new-compilation-queue)
- "Queue of compilation jobs with in and out end.
-Use `coq-par-enqueue' and `coq-par-dequeue' to access the queue.")
-(defun coq-par-enqueue (job)
+;;; job queue
+
+(defvar coq-par-compilation-queue (coq-par-new-queue)
+ "Queue of compilation jobs that wait for a free core to get started.
+Use `coq-par-job-enqueue' and `coq-par-job-dequeue' to access the
+queue.")
+
+(defun coq-par-job-enqueue (job)
"Insert job in the queue of waiting compilation jobs."
- (push job (car coq-par-compilation-queue))
- (if coq-debug-auto-compilation
- (message "%s: enqueue job in waiting queue" (get job 'name))))
+ (coq-par-enqueue coq-par-compilation-queue job)
+ (when coq--debug-auto-compilation
+ (message "%s: enqueue job in waiting queue" (get job 'name))))
-(defun coq-par-dequeue ()
+(defun coq-par-job-dequeue ()
"Dequeue the next job from the compilation queue."
- (let ((res (pop (cdr coq-par-compilation-queue))))
- (unless res
- (setq coq-par-compilation-queue
- (cons nil (nreverse (car coq-par-compilation-queue))))
- (setq res (pop (cdr coq-par-compilation-queue))))
- (if coq-debug-auto-compilation
- (if res
- (message "%s: dequeue" (get res 'name))
- (message "compilation queue empty")))
+ (let ((res (coq-par-dequeue coq-par-compilation-queue)))
+ (when coq--debug-auto-compilation
+ (if res
+ (message "%s: dequeue" (get res 'name))
+ (message "compilation queue empty")))
+ res))
+
+
+;;; vio2vo queue
+
+(defvar coq-par-vio2vo-queue (coq-par-new-queue)
+ "Queue of jobs that need a vio2vo process.
+Use `coq-par-vio2vo-enqueue' and `coq-par-vio2vo-dequeue' to
+access the queue.")
+
+(defun coq-par-vio2vo-enqueue (job)
+ "Insert JOB in the queue for vio2vo processing."
+ (coq-par-enqueue coq-par-vio2vo-queue job)
+ (when coq--debug-auto-compilation
+ (message "%s: enqueue job in vio2vo queue" (get job 'name))))
+
+(defun coq-par-vio2vo-dequeue ()
+ "Dequeue the next job from the vio2vo queue."
+ (let ((res (coq-par-dequeue coq-par-vio2vo-queue)))
+ (when coq--debug-auto-compilation
+ (if res
+ (message "%s: vio2vo dequeue" (get res 'name))
+ (message "vio2vo queue empty")))
res))
@@ -408,6 +493,21 @@ Use `coq-par-enqueue' and `coq-par-dequeue' to access the queue.")
(put 'coq-compile-error-circular-dep 'error-message
"Coq compilation error: Circular dependency")
+;; coq-compile-error-rm
+;;
+;; Signaled when we have to delete a .vio or .vo file for consistency and
+;; that deletion fails.
+;;
+;; This error is signaled with one data item -- the file-error error
+;; description. Its car is the error symbol `file-error' and the cdr are
+;; the data items for this error. They seem to be a list of strings with
+;; different parts of the error message.
+
+(put 'coq-compile-error-rm 'error-conditions
+ '(error coq-compile-error coq-compile-error-rm))
+(put 'coq-compile-error-rm 'error-message
+ "Cannot remove outdated file.")
+
;;; find circular dependencies in non-ready compilation jobs
@@ -440,13 +540,13 @@ If no circle is found return nil, otherwise the list of files
belonging to the circle."
(let (cycle result)
(maphash (lambda (key job) (put job 'visited nil))
- coq-compilation-object-hash)
+ coq--compilation-object-hash)
(maphash
(lambda (key job)
(when (and (not cycle) (not (get job 'visited))
(eq (get job 'state) 'waiting-dep))
(setq cycle (coq-par-find-dependency-circle-for-job job nil))))
- coq-compilation-object-hash)
+ coq--compilation-object-hash)
(dolist (j cycle)
(when (eq (get j 'type) 'file)
(push (get j 'src-file) result)))
@@ -464,7 +564,7 @@ load-path options to coqdep."
(list lib-src-file)))
(defun coq-par-coqc-arguments (lib-src-file coq-load-path)
- "Compute the command line arguments for invoking coqdep on LIB-SRC-FILE.
+ "Compute the command line arguments for invoking coqc on LIB-SRC-FILE.
Argument COQ-LOAD-PATH must be `coq-load-path' from the buffer
that triggered the compilation, in order to provide correct
load-path options to coqdep."
@@ -473,22 +573,33 @@ load-path options to coqdep."
(defun coq-par-analyse-coq-dep-exit (status output command)
"Analyse output OUTPUT of coqdep command COMMAND with exit status STATUS.
-Returns the list of dependencies if there is no error. Otherwise,
+Returns the list of .vo dependencies if there is no error. Otherwise,
writes an error message into `coq-compile-response-buffer', makes
-this buffer visible and returns a string."
+this buffer visible and returns a string.
+
+This function does always return .vo dependencies, regardless of the
+value of `coq-compile-quick'. If necessary, the conversion into .vio
+files must be done elsewhere."
+ ;; (when coq--debug-auto-compilation
+ ;; (message "analyse coqdep output \"%s\"" output))
(if (or
(not (eq status 0))
(string-match coq-coqdep-error-regexp output))
(progn
;; display the error
- (coq-init-compile-response-buffer (mapconcat 'identity command " "))
- (let ((inhibit-read-only t))
- (with-current-buffer coq-compile-response-buffer (insert output)))
- (coq-display-compile-response-buffer)
+ (coq-compile-display-error (mapconcat 'identity command " ") output t)
"unsatisfied dependencies")
- (if (string-match ": \\(.*\\)$" output)
- (cdr-safe (split-string (match-string 1 output)))
- ())))
+ ;; In 8.5, coqdep produces two lines. Match with .* here to
+ ;; extract only a part of the first line.
+ ;; We could match against (concat "^[^:]*" obj-file "[^:]*: \\(.*\\)")
+ ;; to select the right line for either .vo or .vio dependencies.
+ ;; However, we want to accept a .vo prerequisite for a .vio target
+ ;; if it is recent enough. Therefore we actually need module dependencies
+ ;; instead of file dependencies and we derive them from the .vo line.
+ (when (string-match "\\`[^:]*: \\(.*\\)" output)
+ (cl-remove-if-not
+ (lambda (f) (string-match-p "\\.vo\\'" f))
+ (split-string (match-string 1 output))))))
(defun coq-par-get-library-dependencies (lib-src-file coq-load-path
&optional command-intro)
@@ -513,7 +624,10 @@ error case. It is prepended to the displayed command.
LIB-SRC-FILE should be an absolute file name. If it is, the
dependencies are absolute too and the simplified treatment of
`coq-load-path-include-current' in `coq-include-options' won't
-break."
+break.
+
+This function always computes the .vo file names. Conversion into .vio,
+depending on `coq-compile-quick', must be done elsewhere."
(let* ((coqdep-arguments
(coq-par-coqdep-arguments lib-src-file coq-load-path))
(this-command (cons coq-dependency-analyzer coqdep-arguments))
@@ -521,21 +635,24 @@ break."
(cons command-intro this-command)
this-command))
coqdep-status coqdep-output)
- ;; (if coq-debug-auto-compilation
- ;; (message "call coqdep arg list: %s" coqdep-arguments))
+ (when coq--debug-auto-compilation
+ (message "Run synchronously: %s"
+ (mapconcat 'identity full-command " ")))
+ ;; (when coq--debug-auto-compilation
+ ;; (message "CPGLD: call coqdep arg list: %s" coqdep-arguments))
(with-temp-buffer
(setq coqdep-status
(apply 'call-process
coq-dependency-analyzer nil (current-buffer) nil
coqdep-arguments))
(setq coqdep-output (buffer-string)))
- ;; (if coq-debug-auto-compilation
- ;; (message "coqdep status %s, output on %s: %s"
+ ;; (when coq--debug-auto-compilation
+ ;; (message "CPGLD: coqdep status %s, output on %s: %s"
;; coqdep-status lib-src-file coqdep-output))
(coq-par-analyse-coq-dep-exit coqdep-status coqdep-output full-command)))
-(defun coq-par-map-module-id-to-obj-file (module-id coq-load-path)
- "Map MODULE-ID to the appropriate coq object file.
+(defun coq-par-map-module-id-to-vo-file (module-id coq-load-path &optional from)
+ "Map MODULE-ID to the appropriate coq object (.vo) file.
The mapping depends of course on `coq-load-path'. The current
implementation invokes coqdep with a one-line require command.
This is probably slower but much simpler than modelling coq file
@@ -545,15 +662,19 @@ decent error message. Argument COQ-LOAD-PATH must be
`coq-load-path' from the buffer that triggered the compilation,
in order to provide correct load-path options to coqdep.
+This function always computes the .vo file name. Conversion into .vio,
+depending on `coq-compile-quick', must be done elsewhere.
+
A peculiar consequence of the current implementation is that this
function returns () if MODULE-ID comes from the standard library."
(let ((coq-load-path
- (if coq-load-path-include-current
+ (if (and coq-load-path-include-current (coq--pre-v85))
(cons default-directory coq-load-path)
coq-load-path))
(coq-load-path-include-current nil)
(temp-require-file (make-temp-file "ProofGeneral-coq" nil ".v"))
- (coq-string (concat "Require " module-id "."))
+ (coq-string (concat (if from (concat "From " from " ") "")
+ "Require " module-id "."))
result)
(unwind-protect
(progn
@@ -563,8 +684,10 @@ function returns () if MODULE-ID comes from the standard library."
(coq-par-get-library-dependencies
temp-require-file
coq-load-path
- (concat "echo \"" coq-string "\" > " temp-require-file))))
+ (concat "echo \"" coq-string "\" > " temp-require-file ";"))))
(delete-file temp-require-file))
+ (when coq--debug-auto-compilation
+ (message "coq-par-get-library-dependencies delivered \"%s\"" result))
(if (stringp result)
;; Error handling: coq-par-get-library-dependencies was not able to
;; translate module-id into a file name. We insert now a faked error
@@ -587,14 +710,15 @@ function returns () if MODULE-ID comes from the standard library."
;; (coq-seq-display-compile-response-buffer)
(error error-message)))
(assert (<= (length result) 1)
- "Internal error in coq-seq-map-module-id-to-obj-file")
+ nil "Internal error in coq-seq-map-module-id-to-obj-file")
(car-safe result)))
;;; manage background jobs
(defun coq-par-kill-all-processes ()
- "Kill all background coqc and coqdep compilation processes."
+ "Kill all background coqc, coqdep or vio2vo compilation processes.
+Return t if some process was killed."
;; need to first mark processes as killed, because delete process
;; starts running sentinels in the order processes terminated, so
;; after the first delete-process we see sentinentels of non-killed
@@ -613,58 +737,74 @@ function returns () if MODULE-ID comes from the standard library."
(when (process-get process 'coq-compilation-job)
(process-put process 'coq-par-process-killed t)
(delete-process process)
- (when coq-debug-auto-compilation
+ (when coq--debug-auto-compilation
(message "%s %s: kill it"
(get (process-get process 'coq-compilation-job) 'name)
(process-name process)))))
(process-list))
- (setq coq-current-background-jobs 0)))
+ (setq coq--current-background-jobs 0)
+ kill-needed))
-(defun coq-par-unlock-ancestors-on-error ()
+(defun coq-par-unlock-all-ancestors-on-error ()
"Unlock ancestors which are not in an asserted span.
Used for unlocking ancestors on compilation errors."
- (when coq-par-ancestor-files
- ;; nil e.g. when enabling on-the-fly compilation after processing imports.
+ (when coq--compilation-object-hash
(maphash
- (lambda (ancestor state)
- (when (eq state 'locked)
- (coq-unlock-ancestor ancestor)
- (puthash ancestor nil coq-par-ancestor-files)))
- coq-par-ancestor-files)))
+ (lambda (key job)
+ (when (eq (get job 'lock-state) 'locked)
+ (coq-unlock-ancestor (get job 'src-file))
+ (put job 'lock-state 'unlocked)))
+ coq--compilation-object-hash)))
(defun coq-par-emergency-cleanup ()
"Emergency cleanup for parallel background compilation.
Kills all processes, unlocks ancestors, clears the queue region
and resets the internal state."
- (coq-par-kill-all-processes)
- (setq coq-par-compilation-queue (coq-par-new-compilation-queue))
- (setq coq-last-compilation-job nil)
- (when proof-action-list
- (setq proof-shell-interrupt-pending t))
- (coq-par-unlock-ancestors-on-error)
- (proof-release-lock)
- (proof-detach-queue)
- (setq proof-second-action-list-active nil)
- (coq-par-init-compilation-hash))
+ (interactive) ; needed for menu
+ (let (proc-killed was-busy)
+ (when coq--debug-auto-compilation
+ (message "emergency cleanup"))
+ (setq proc-killed (coq-par-kill-all-processes))
+ (when (and (boundp 'prover-was-busy)
+ (or proc-killed coq--last-compilation-job
+ coq--compile-vio2vo-in-progress
+ coq--compile-vio2vo-delay-timer))
+ (setq prover-was-busy t))
+ (setq coq-par-compilation-queue (coq-par-new-queue))
+ (setq coq--last-compilation-job nil)
+ (setq coq-par-vio2vo-queue (coq-par-new-queue))
+ (setq coq--compile-vio2vo-in-progress nil)
+ (when coq--compile-vio2vo-delay-timer
+ (cancel-timer coq--compile-vio2vo-delay-timer)
+ (setq coq--compile-vio2vo-delay-timer nil))
+ (coq-par-unlock-all-ancestors-on-error)
+ (when proof-action-list
+ (setq proof-shell-interrupt-pending t))
+ (proof-release-lock)
+ (proof-detach-queue)
+ (setq proof-second-action-list-active nil)
+ (coq-par-init-compilation-hash)))
(defun coq-par-process-filter (process output)
"Store output from coq background compilation."
(process-put process 'coq-process-output
(concat (process-get process 'coq-process-output) output)))
-(defun coq-par-start-process (command arguments continuation job)
+(defun coq-par-start-process (command arguments continuation job file-rm)
"Start asynchronous compilation job for COMMAND.
This function starts COMMAND with arguments ARGUMENTS for
compilation job JOB, making sure that CONTINUATION runs when the
-process finishes successfully."
+process finishes successfully. FILE-RM, if not nil, denotes a
+file to be deleted when the process is killed."
(let ((process-connection-type nil) ; use pipes
- (process-name (format "pro-%s" coq-par-next-id))
+ (process-name (format "pro-%s" coq--par-next-id))
process)
(with-current-buffer (or proof-script-buffer (current-buffer))
- (if coq-debug-auto-compilation
- (message "%s %s: start %s %s"
- (get job 'name) process-name
- command (mapconcat 'identity arguments " ")))
+ (when coq--debug-auto-compilation
+ (message "%s %s: start %s %s in %s"
+ (get job 'name) process-name
+ command (mapconcat 'identity arguments " ")
+ default-directory))
(condition-case err
;; If the command is wrong, start-process aborts with an
;; error. However, in Emacs 23.4.1. it will leave a process
@@ -679,12 +819,13 @@ process finishes successfully."
(set-process-filter process 'coq-par-process-filter)
(set-process-sentinel process 'coq-par-process-sentinel)
(set-process-query-on-exit-flag process nil)
- (setq coq-par-next-id (1+ coq-par-next-id))
- (setq coq-current-background-jobs (1+ coq-current-background-jobs))
+ (setq coq--par-next-id (1+ coq--par-next-id))
+ (setq coq--current-background-jobs (1+ coq--current-background-jobs))
(process-put process 'coq-compilation-job job)
(process-put process 'coq-process-continuation continuation)
(process-put process 'coq-process-command (cons command arguments))
- (process-put process 'coq-process-output ""))))
+ (process-put process 'coq-process-output "")
+ (process-put process 'coq-process-rm file-rm))))
(defun coq-par-process-sentinel (process event)
"Sentinel for all background processes.
@@ -694,28 +835,48 @@ that has been registered with that process. Normal compilation
errors are reported with an error message."
(condition-case err
(if (process-get process 'coq-par-process-killed)
- (if coq-debug-auto-compilation
- (message "%s %s: skip sentinel, process killed"
- (get (process-get process 'coq-compilation-job) 'name)
- (process-name process)))
- (let (exit-status)
- (if coq-debug-auto-compilation
- (message "%s %s: process status changed to %s"
+ (progn
+ (when coq--debug-auto-compilation
+ (message "%s %s: skip sentinel, process killed, %s"
(get (process-get process 'coq-compilation-job) 'name)
(process-name process)
- event))
+ (if (process-get process 'coq-process-rm)
+ (format "rm %s"
+ (process-get process 'coq-process-rm))
+ "no file removal")))
+ (if (process-get process 'coq-process-rm)
+ (ignore-errors
+ (delete-file (process-get process 'coq-process-rm))))
+ (when (eq (process-get process 'coq-process-continuation)
+ 'coq-par-vio2vo-continuation)
+ (when coq--debug-auto-compilation
+ (message "%s: reenqueue for vio2vo"
+ (get (process-get process 'coq-compilation-job) 'name)))
+ (coq-par-vio2vo-enqueue
+ (process-get process 'coq-compilation-job))))
+ (let (exit-status)
+ (when coq--debug-auto-compilation
+ (message "%s %s: process status changed to %s"
+ (get (process-get process 'coq-compilation-job) 'name)
+ (process-name process)
+ event))
(cond
((eq (process-status process) 'exit)
(setq exit-status (process-exit-status process)))
(t (setq exit-status "abnormal termination")))
- (setq coq-current-background-jobs
- (max 0 (1- coq-current-background-jobs)))
+ (setq coq--current-background-jobs
+ (max 0 (1- coq--current-background-jobs)))
(funcall (process-get process 'coq-process-continuation)
process exit-status)
(coq-par-start-jobs-until-full)
+ (when (and coq--compile-vio2vo-in-progress
+ (eq coq--current-background-jobs 0))
+ (setq coq--compile-vio2vo-in-progress nil)
+ (message "vio2vo compilation finished"))
(when (and
- (eq coq-current-background-jobs 0)
- coq-last-compilation-job)
+ (not coq--par-delayed-last-job)
+ (eq coq--current-background-jobs 0)
+ coq--last-compilation-job)
(let ((cycle (coq-par-find-dependency-circle)))
(if cycle
(signal 'coq-compile-error-circular-dep
@@ -736,6 +897,46 @@ errors are reported with an error message."
(signal (car err) (cdr err)))))
+;;; vio2vo compilation
+
+(defun coq-par-run-vio2vo-queue ()
+ "Start delayed vio2vo compilation."
+ (assert (not coq--last-compilation-job)
+ nil "normal compilation and vio2vo in parallel 3")
+ (setq coq--compile-vio2vo-in-progress t)
+ (setq coq--compile-vio2vo-delay-timer nil)
+ (when coq--debug-auto-compilation
+ (message "Start vio2vo processing for %d jobs"
+ (+ (length (car coq-par-vio2vo-queue))
+ (length (cdr coq-par-vio2vo-queue)))))
+ (coq-par-start-jobs-until-full))
+
+(defun coq-par-require-processed (race-counter)
+ "Callback for `proof-action-list' to signal completion of the last require.
+This function ensures that vio2vo compilation starts after
+`coq-compile-vio2vo-delay' seconds after the last module has been
+loaded into Coq. When background compilation is successful, this
+callback is inserted with a dummy item into proof-action-list
+somewhere after the last require command."
+ ;; When the user asserts new stuff while the (previously) last
+ ;; require command is being processed, `coq--last-compilation-job'
+ ;; might get non-nil. In this case there is a new last compilation
+ ;; job that will eventually trigger vio2vo compilation.
+ (unless (or coq--last-compilation-job
+ (not (eq race-counter coq--compile-vio2vo-start-id)))
+ (setq coq--compile-vio2vo-delay-timer
+ (run-at-time coq-compile-vio2vo-delay nil
+ 'coq-par-run-vio2vo-queue))))
+
+(defun coq-par-callback-queue-item (callback)
+ ;; A proof-action-list item has the form of
+ ;; (SPAN COMMANDS ACTION [DISPLAYFLAGS])
+ ;; If COMMANDS is nil, the item is processed as comment and not sent
+ ;; to the proof assistant, only the callback is called, see
+ ;; proof-shell.el.
+ (list nil nil callback))
+
+
;;; background job tasks
(defun coq-par-job-coqc-finished (job)
@@ -756,145 +957,351 @@ errors are reported with an error message."
(put dependant 'coqc-dependency-count
(1+ (get dependant 'coqc-dependency-count)))
(push dependant (get dependee 'coqc-dependants))
- (if coq-debug-auto-compilation
- (message "%s -> %s: add coqc dependency"
- (get dependee 'name) (get dependant 'name))))
+ (when coq--debug-auto-compilation
+ (message "%s -> %s: add coqc dependency"
+ (get dependee 'name) (get dependant 'name))))
(defun coq-par-add-queue-dependency (dependee dependant)
"Add queue dependency from child job DEPENDEE to parent job DEPENDANT."
(assert (and (not (get dependant 'queue-dependant-waiting))
- (not (get dependee 'queue-dependant))))
+ (not (get dependee 'queue-dependant)))
+ nil "queue dependency cannot be added")
(put dependant 'queue-dependant-waiting t)
(put dependee 'queue-dependant dependant)
- (if coq-debug-auto-compilation
- (message "%s -> %s: add queue dependency"
- (get dependee 'name) (get dependant 'name))))
-
-(defun coq-par-get-obj-mod-time (job)
- "Return modification time of the object file as `file-attributes' would do.
-Making sure that file-attributes is called at most once for every job."
- (let ((obj-time (get job 'obj-mod-time)))
- (cond
- ((consp obj-time) obj-time)
- ((eq obj-time 'obj-does-not-exist) nil)
- ((not obj-time)
- (setq obj-time (nth 5 (file-attributes (get job 'obj-file))))
- (if obj-time
- (put job 'obj-mod-time obj-time)
- (put job 'obj-mod-time 'obj-does-not-exist))
- obj-time))))
+ (when coq--debug-auto-compilation
+ (message "%s -> %s: add queue dependency"
+ (get dependee 'name) (get dependant 'name))))
(defun coq-par-job-needs-compilation (job)
- "Determine whether job needs to get compiled."
- (let (src-time obj-time)
- (if (eq (get job 'youngest-coqc-dependency) 'just-compiled)
+ "Determine whether job needs to get compiled and do some side effects.
+This function contains most of the logic nesseary to support
+quick compilation according to `coq-compile-quick'. Taking
+`coq-compile-quick' into account, it determines if a compilation
+is necessary. The property 'required-obj-file is set either to
+the file that we need to produce or to the up-to-date object
+file. If compilation is needed, property 'use-quick is set when
+-quick will be used. If no compilation is needed, property
+'obj-mod-time remembers the time stamp of 'required-obj-file.
+Indepent of whether compilation is required, .vo or .vio files
+that are in the way are deleted. Note that the coq documentation
+does not contain a statement, about what file is loaded, if both
+a .vo and a .vio file are present. To be on the safe side, I
+therefore delete a file if it might be in the way. Sets the
+'vio2vo property on job if necessary."
+ (let* ((vo-file (get job 'vo-file))
+ (vio-file (coq-library-vio-of-vo-file vo-file))
+ (vo-obj-time (nth 5 (file-attributes vo-file)))
+ (vio-obj-time (nth 5 (file-attributes vio-file)))
+ (dep-time (get job 'youngest-coqc-dependency))
+ (src-time (nth 5 (file-attributes (get job 'src-file))))
+ file-to-delete max-obj-time vio-is-newer
+ other-file other-obj-time result)
+ (when coq--debug-auto-compilation
+ (message
+ (concat "%s: compare mod times: vo mod %s, vio mod %s, src mod %s, "
+ "youngest dep %s; vo < src : %s, vio < src : %s, "
+ "vo < dep : %s, vio < dep : %s")
+ (get job 'name)
+ (if vo-obj-time (current-time-string vo-obj-time) "-")
+ (if vio-obj-time (current-time-string vio-obj-time) "-")
+ (if src-time (current-time-string src-time) "-")
+ (if (eq dep-time 'just-compiled) "just compiled"
+ (current-time-string dep-time))
+ (if vo-obj-time (time-less-p vo-obj-time src-time) "-")
+ (if vio-obj-time (time-less-p vio-obj-time src-time) "-")
+ (if vo-obj-time (coq-par-time-less vo-obj-time dep-time) "-")
+ (if vio-obj-time (coq-par-time-less vio-obj-time dep-time) "-")))
+ ;; Compute first the max of vo-obj-time and vio-obj-time and remember
+ ;; which of both is newer. This is only meaningful if at least one of
+ ;; the .vo or .vio file exists.
+ (cond
+ ((and vio-obj-time vo-obj-time
+ (time-less-or-equal vo-obj-time vio-obj-time))
+ (setq max-obj-time vio-obj-time)
+ (setq vio-is-newer t))
+ ((and vio-obj-time vo-obj-time)
+ (setq max-obj-time vo-obj-time))
+ (vio-obj-time
+ (setq max-obj-time vio-obj-time)
+ (setq vio-is-newer t))
+ (t
+ (setq max-obj-time vo-obj-time)))
+ ;; Decide if and what to compile.
+ (if (or (eq dep-time 'just-compiled) ; a dep has been just compiled
+ (and (not vo-obj-time) (not vio-obj-time)) ; no obj exists
+ ;; src younger than any obj?
+ (time-less-or-equal max-obj-time src-time)
+ ;; dep younger than any obj?
+ (time-less-or-equal max-obj-time dep-time))
+ ;; compilation is definitely needed
(progn
- (if coq-debug-auto-compilation
- (message "%s: needs compilation because a dep was just compiled"
- (get job 'name)))
- t)
- (setq src-time (nth 5 (file-attributes (get job 'src-file))))
- (setq obj-time (coq-par-get-obj-mod-time job))
- (if coq-debug-auto-compilation
- (message
- (concat "%s: compare mod times: obj mod %s, src mod %s, "
- "youngest dep %s; obj <= src : %s, obj < dep : %s")
- (get job 'name)
- (current-time-string obj-time)
- (current-time-string src-time)
- (current-time-string (get job 'youngest-coqc-dependency))
- (if obj-time (time-less-or-equal obj-time src-time) "-")
- (if obj-time
- (time-less-p obj-time (get job 'youngest-coqc-dependency))
- "-")))
- (or
- (not obj-time) ; obj does not exist
- (time-less-or-equal obj-time src-time) ; src is newer
- ; youngest dep is newer than obj
- (time-less-p obj-time (get job 'youngest-coqc-dependency))))))
+ (setq result t)
+ (if (coq-compile-prefer-quick)
+ (progn
+ (put job 'required-obj-file vio-file)
+ (put job 'use-quick t)
+ (when vo-obj-time
+ (setq file-to-delete vo-file))
+ (when (eq coq-compile-quick 'quick-and-vio2vo)
+ (put job 'vio2vo-needed t)))
+ (put job 'required-obj-file vo-file)
+ (when vio-obj-time
+ (setq file-to-delete vio-file)))
+ (when coq--debug-auto-compilation
+ (message
+ (concat "%s: definitely need to compile to %s; delete %s")
+ (get job 'name)
+ (get job 'required-obj-file)
+ (if file-to-delete file-to-delete "noting"))))
+ ;; Either the .vio or the .vo file exists and one of .vio or .vo is
+ ;; younger than the source and the youngest dependency. Might not
+ ;; need to compile.
+ (if (eq coq-compile-quick 'ensure-vo)
+ (progn
+ (put job 'required-obj-file vo-file)
+ (if (or (not vio-is-newer) ; vo is newest
+ (and vo-obj-time ; vo is older than vio
+ ; but still newer than src or dep
+ (time-less-p src-time vo-obj-time)
+ (time-less-p dep-time vo-obj-time)))
+ ;; .vo is newer than src and youngest dep - don't compile
+ (progn
+ (put job 'obj-mod-time vo-obj-time)
+ ;; delete vio if it is outdated or newer than vo
+ (when (and vio-obj-time
+ (or vio-is-newer
+ (time-less-or-equal vio-obj-time src-time)
+ (time-less-or-equal vio-obj-time dep-time)))
+ (setq file-to-delete vio-file))
+ (when coq--debug-auto-compilation
+ (message "%s: vo up-to-date 1; delete %s"
+ (get job 'name)
+ (if file-to-delete file-to-delete "noting"))))
+ ;; .vo outdated - need to compile
+ (setq result t)
+ ;; delete vio if it is outdated
+ (when (and vio-obj-time
+ (or (time-less-or-equal vio-obj-time src-time)
+ (time-less-or-equal vio-obj-time dep-time)))
+ (setq file-to-delete vio-file))
+ (when coq--debug-auto-compilation
+ (message "%s: need to compile to vo; delete %s"
+ (get job 'name)
+ (if file-to-delete file-to-delete "noting")))))
+ ;; There is an up-to-date .vio or .vo file and the user does not
+ ;; insist on either .vio or .vo - no need to compile.
+ ;; Ensure to delete outdated .vio or .vo files.
+ ;; First store the other obj file in other-file and other-obj-time.
+ (if vio-is-newer
+ (setq other-file vo-file
+ other-obj-time vo-obj-time)
+ (setq other-file vio-file
+ other-obj-time vio-obj-time))
+ (if (and other-obj-time
+ (time-less-p src-time other-obj-time)
+ ;; dep-time is neither nil nor 'just-compiled here
+ (time-less-p dep-time other-obj-time))
+ ;; Both the .vio and .vo exist and are up-to-date. Coq
+ ;; loads the younger one but we continue with the older
+ ;; one to avoid recompilation for the case where a vio2vo
+ ;; process took a long time for a dependency.
+ (progn
+ (put job 'required-obj-file other-file)
+ (put job 'obj-mod-time other-obj-time)
+ (when coq--debug-auto-compilation
+ (message (concat "%s: .vio and .vo up-to-date, "
+ "continue with the older %s")
+ (get job 'name)
+ (if vio-is-newer ".vio" ".vo"))))
+ ;; The other obj file does not exist or is outdated.
+ ;; Delete the outdated if it exists.
+ (when other-obj-time
+ (setq file-to-delete other-file))
+ (if vio-is-newer
+ (progn
+ (put job 'required-obj-file vio-file)
+ (put job 'obj-mod-time vio-obj-time)
+ (when (eq coq-compile-quick 'quick-and-vio2vo)
+ (put job 'vio2vo-needed t))
+ (when coq--debug-auto-compilation
+ (message "%s: vio up-to-date; delete %s"
+ (get job 'name)
+ (if file-to-delete file-to-delete "noting"))))
+ (put job 'required-obj-file vo-file)
+ (put job 'obj-mod-time vo-obj-time)
+ (when coq--debug-auto-compilation
+ (message "%s: vo up-to-date 2; delete %s"
+ (get job 'name)
+ (if file-to-delete file-to-delete "noting")))))))
+ (when file-to-delete
+ (condition-case err
+ (delete-file file-to-delete)
+ (file-error
+ (signal 'coq-compile-error-rm err))))
+ result))
+
+(defun coq-par-retire-top-level-job (job)
+ "Register ancestors and start queue items.
+This function performs the essential tasks for top-level jobs
+when they transition from 'waiting-queue to 'ready:
+- Registering ancestors in the span and recording this fact in
+ the 'lock-state property.
+- Moving queue items back to `proof-action-list' and start their
+ execution.
+- Insert `coq-par-require-processed' as callback if this is the
+ last top-level job, such that vio2vo compilation will start
+ eventually.
+
+This function can safely be called for non-top-level jobs. This
+function must not be called for failed jobs."
+ (assert (not (get job 'failed))
+ nil "coq-par-retire-top-level-job precondition failed")
+ (let ((span (get job 'require-span))
+ (items (get job 'queueitems)))
+ (when (and span coq-lock-ancestors)
+ (dolist (anc-job (get job 'ancestors))
+ (assert (not (eq (get anc-job 'lock-state) 'unlocked))
+ nil "bad ancestor lock state")
+ (when (eq (get anc-job 'lock-state) 'locked)
+ (put anc-job 'lock-state 'asserted)
+ (push (get anc-job 'src-file)
+ (span-property span 'coq-locked-ancestors)))))
+ (when items
+ (when (and (eq coq-compile-quick 'quick-and-vio2vo)
+ (eq coq--last-compilation-job job))
+ (let ((vio2vo-counter
+ (setq coq--compile-vio2vo-start-id
+ (1+ coq--compile-vio2vo-start-id))))
+ ;; Insert a notification callback for when the last require
+ ;; queue item has been processed.
+ (setq items
+ (cons
+ (car items) ; this is the require
+ (cons
+ (coq-par-callback-queue-item
+ `(lambda (span) (coq-par-require-processed ,vio2vo-counter)))
+ (cdr items))))))
+ (proof-add-to-queue items 'advancing)
+ (when coq--debug-auto-compilation
+ (message "%s: add %s items to action list"
+ (get job 'name) (length items)))
+ (put job 'queueitems nil))))
(defun coq-par-kickoff-queue-maybe (job)
"Try transition 'waiting-queue -> 'ready for job JOB.
This transition is only possible if JOB is in state
'waiting-queue and if it has no queue dependee. If this is the
case, the following actions are taken:
-- for top-level jobs (non-nil 'require-span property), ancestors
- are registered in `coq-par-ancestor-files' and in the span in
- 'queue-span
-- processing of items in 'queueitems is started
+- for successful top-level jobs (non-nil 'require-span property), ancestors
+ are registered in the 'queue-span and marked as 'asserted in their
+ 'lock-state property
+- processing of items in 'queueitems is started (if JOB is successful)
- a possible queue dependant gets it's dependency cleared, and,
if possible the 'waiting-queue -> 'ready transition
is (recursively) done for the dependant
- if this job is the last top-level compilation
- job (`coq-last-compilation-job') then the last compilation job
- and `proof-second-action-list-active' are cleared."
+ job (`coq--last-compilation-job') then the last compilation job
+ and `proof-second-action-list-active' are cleared and vio2vo
+ processing is triggered.
+- If compilation failed, the (failing) last top-level job is
+ delayed until `proof-action-list' is empty, possibly by
+ registering this call as a callback in an empty
+ proof-action-list item. When proof-action-list is empty, the
+ queue span is deleted, remaining spans are cleared and the
+ `proof-shell-busy' lock is freed."
(if (or (not (eq (get job 'state) 'waiting-queue))
(get job 'queue-dependant-waiting))
- (if coq-debug-auto-compilation
- (if (not (eq (get job 'state) 'waiting-queue))
- (message "%s: no queue kickoff because in state %s"
- (get job 'name) (get job 'state))
- (message
- "%s: no queue kickoff because waiting for queue dependency"
- (get job 'name))))
- (if coq-debug-auto-compilation
- (message "%s: has itself no queue dependency" (get job 'name)))
- (when (and (get job 'require-span) coq-lock-ancestors)
- (let ((span (get job 'require-span)))
- (dolist (f (get job 'ancestor-files))
- (unless (eq (gethash f coq-par-ancestor-files) 'asserted)
- (puthash f 'asserted coq-par-ancestor-files)
- (span-set-property
- span 'coq-locked-ancestors
- (cons f (span-property span 'coq-locked-ancestors)))))))
- (when (get job 'queueitems)
- (proof-add-to-queue (get job 'queueitems) 'advancing)
- (if coq-debug-auto-compilation
- (message "%s: add %s items to action list"
- (get job 'name) (length (get job 'queueitems))))
- (put job 'queueitems nil))
- (put job 'state 'ready)
- (if coq-debug-auto-compilation
+ (when coq--debug-auto-compilation
+ (if (not (eq (get job 'state) 'waiting-queue))
+ (message "%s: no queue kickoff because in state %s"
+ (get job 'name) (get job 'state))
+ (message
+ "%s: no queue kickoff because waiting for queue dependency"
+ (get job 'name))))
+ (when coq--debug-auto-compilation
+ (message "%s: has itself no queue dependency" (get job 'name)))
+ (unless (get job 'failed)
+ (coq-par-retire-top-level-job job))
+ (when (and (get job 'failed) (get job 'require-span))
+ (setq coq--par-delayed-last-job nil))
+ (if (and (get job 'failed)
+ (eq coq--last-compilation-job job)
+ proof-action-list)
+ (progn
+ (when coq--debug-auto-compilation
+ (message "%s: delay queue kickoff until action list is empty"
+ (get job 'name)))
+ (setq coq--par-delayed-last-job t)
+ (proof-add-to-queue
+ (list (coq-par-callback-queue-item
+ `(lambda (span) (coq-par-kickoff-queue-maybe ',job))))
+ 'advancing))
+ (put job 'state 'ready)
+ (when coq--debug-auto-compilation
(message "%s: ready" (get job 'name)))
- (let ((dependant (get job 'queue-dependant)))
- (if dependant
- (progn
- (assert (not (eq coq-last-compilation-job job)))
- (put dependant 'queue-dependant-waiting nil)
- (if coq-debug-auto-compilation
+ (let ((dependant (get job 'queue-dependant)))
+ (if dependant
+ (progn
+ (assert (not (eq coq--last-compilation-job job))
+ nil "coq--last-compilation-job invariant error")
+ (put dependant 'queue-dependant-waiting nil)
+ (when coq--debug-auto-compilation
(message
"%s -> %s: clear queue dependency, kickoff queue at %s"
(get job 'name) (get dependant 'name) (get dependant 'name)))
- (coq-par-kickoff-queue-maybe dependant)
- (if coq-debug-auto-compilation
+ (coq-par-kickoff-queue-maybe dependant)
+ (when coq--debug-auto-compilation
(message "%s: queue kickoff finished"
(get job 'name))))
- (when (eq coq-last-compilation-job job)
- (setq coq-last-compilation-job nil)
- (setq proof-second-action-list-active nil)
- (if coq-debug-auto-compilation
+ (when (eq coq--last-compilation-job job)
+ (when (get job 'failed)
+ ;; proof-action-list is empty, see above
+ ;; variables that hold the queue span are buffer local
+ (with-current-buffer (or proof-script-buffer (current-buffer))
+ (proof-script-clear-queue-spans-on-error nil))
+ (proof-release-lock)
+ (when (eq coq-compile-quick 'quick-and-vio2vo)
+ (assert (not coq--compile-vio2vo-delay-timer)
+ nil "vio2vo timer set before last compilation job")
+ (setq coq--compile-vio2vo-delay-timer
+ (run-at-time coq-compile-vio2vo-delay nil
+ 'coq-par-run-vio2vo-queue))))
+ (setq coq--last-compilation-job nil)
+ (setq proof-second-action-list-active nil)
+ (when coq--debug-auto-compilation
(message "clear last compilation job"))
- (message "Library compilation finished"))
- (if coq-debug-auto-compilation
+ (message "Library compilation %s"
+ (if (get job 'failed) "failed" "finished successfully")))
+ (when coq--debug-auto-compilation
(message "%s: no queue dependant, queue kickoff finished"
- (get job 'name)))))))
+ (get job 'name))))))))
(defun coq-par-compile-job-maybe (job)
"Choose next action for JOB after dependencies are ready.
-First JOB is put into state 'enqueued-coqc. Then, if JOB needs
-compilation, compilation is started or enqueued and JOB stays in
-'enqueued-coqc for the time being. Otherwise, the transition
-'enqueued-coqc -> 'waiting-queue is done and, if possible, also
-'waiting-queue -> 'ready."
+First JOB is put into state 'enqueued-coqc. Then it is determined
+if JOB needs compilation, what file must be produced (depending
+on `coq-compile-quick') and if a .vio or .vo file must be
+deleted. If necessary, deletion happens immediately. If JOB needs
+compilation, compilation is started or the JOB is enqueued and
+JOB stays in 'enqueued-coqc for the time being. Otherwise, the
+transition 'enqueued-coqc -> 'waiting-queue is done and, if
+possible, also 'waiting-queue -> 'ready."
(put job 'state 'enqueued-coqc)
- (if (coq-par-job-needs-compilation job)
+ ;; Note that coq-par-job-needs-compilation sets 'required-obj-file
+ ;; as a side effect and deletes .vo or .vio files that are in the way.
+ ;; It also sets the 'vio2vo-needed property if needed.
+ (if (and (not (get job 'failed)) (coq-par-job-needs-compilation job))
(coq-par-start-or-enqueue job)
- (if coq-debug-auto-compilation
- (message "%s: up-to-date, no compilation" (get job 'name)))
+ (when coq--debug-auto-compilation
+ (message "%s: %s, no compilation"
+ (get job 'name)
+ (if (get job 'failed) "failed" "up-to-date")))
+ (when (get job 'vio2vo-needed)
+ (coq-par-vio2vo-enqueue job))
(coq-par-kickoff-coqc-dependants job (get job 'youngest-coqc-dependency))))
(defun coq-par-decrease-coqc-dependency (dependant dependee-time
- dependee-ancestor-files)
+ dependee-ancestors)
"Clear Coq dependency and update dependee information in DEPENDANT.
This function handles a Coq dependency from child dependee to
parent dependant when the dependee has finished compilation (ie.
@@ -907,18 +1314,20 @@ if it reaches 0, the next transition is triggered for DEPENDANT.
For 'file jobs this is 'waiting-dep -> 'enqueued-coqc and for
'clone jobs this 'waiting-dep -> 'waiting-queue."
;(message "%s: CPDCD with time %s" (get dependant 'name) dependee-time)
- (assert (eq (get dependant 'state) 'waiting-dep))
+ (assert (eq (get dependant 'state) 'waiting-dep)
+ nil "wrong state of parent dependant job")
(when (coq-par-time-less (get dependant 'youngest-coqc-dependency)
dependee-time)
(put dependant 'youngest-coqc-dependency dependee-time))
- (put dependant 'ancestor-files
- (append dependee-ancestor-files (get dependant 'ancestor-files)))
+ (put dependant 'ancestors
+ (append dependee-ancestors (get dependant 'ancestors)))
(put dependant 'coqc-dependency-count
(1- (get dependant 'coqc-dependency-count)))
- (assert (<= 0 (get dependant 'coqc-dependency-count)))
- (if coq-debug-auto-compilation
- (message "%s: coqc dependency count down to %d"
- (get dependant 'name) (get dependant 'coqc-dependency-count)))
+ (assert (<= 0 (get dependant 'coqc-dependency-count))
+ nil "dependency count below zero")
+ (when coq--debug-auto-compilation
+ (message "%s: coqc dependency count down to %d"
+ (get dependant 'name) (get dependant 'coqc-dependency-count)))
(when (coq-par-dependencies-ready dependant)
(cond
((eq (get dependant 'type) 'file)
@@ -939,7 +1348,8 @@ waiting-queue for JOB.
DEP-TIME is either 'just-compiled, when JOB has just finished
compilation, or the most recent modification time of all
-dependencies of JOB.
+dependencies of JOB. (If compilation for JOB failed, DEP-TIME is
+meaningless but should nevertheless be a non-nil valid argument.)
This function makes the following actions.
- Clear the dependency from JOB to all its dependants, thereby
@@ -948,50 +1358,87 @@ This function makes the following actions.
- save the maximum of DEP-TIME and .vo modification time in
'youngest-coqc-dependency, in case we later create a clone of this job
- put JOB into state 'waiting-queue
-- try to trigger the transition 'waiting-queue -> ready for JOB"
- (let ((ancestor-files (get job 'ancestor-files)))
+- try to trigger the transition 'waiting-queue -> ready for JOB
+- If JOB is successful but all dependants have failed, unlock all
+ ancestors in case they are not participating in a still ongoing
+ compilation."
+ (let ((ancestors (get job 'ancestors))
+ (dependant-alive nil))
+ (put job 'state 'waiting-queue)
;; take max of dep-time and obj-mod-time
;;
;; dep-time is either 'just-compiled or 'youngest-coqc-dependency of
;; the dependee, in the latter case obj-mod-time is greater than
;; dep-time, because otherwise we would have compiled the file. For
;; a clone job the max has already been taken when processing the
- ;; original file.
- (unless (or (eq dep-time 'just-compiled) (eq (get job 'type) 'clone))
- (setq dep-time (coq-par-get-obj-mod-time job)))
+ ;; original file. If coqdep failed, 'obj-mod-time is not set.
+ (unless (or (eq dep-time 'just-compiled) (eq (get job 'type) 'clone)
+ (get job 'failed))
+ (setq dep-time (get job 'obj-mod-time)))
(put job 'youngest-coqc-dependency dep-time)
- (if coq-debug-auto-compilation
- (message "%s: kickoff %d coqc dependencies with time %s"
- (get job 'name) (length (get job 'coqc-dependants))
- (if (eq dep-time 'just-compiled)
- 'just-compiled
- (current-time-string dep-time))))
- (put job 'state 'waiting-queue)
- (mapc
- (lambda (dependant)
- (coq-par-decrease-coqc-dependency dependant dep-time ancestor-files))
- (get job 'coqc-dependants))
- (if coq-debug-auto-compilation
- (message "%s: coqc kickoff finished, maybe kickoff queue"
- (get job 'name)))
+ (when coq--debug-auto-compilation
+ (message "%s: kickoff %d coqc dependencies with time %s"
+ (get job 'name) (length (get job 'coqc-dependants))
+ (if (eq dep-time 'just-compiled)
+ 'just-compiled
+ (current-time-string dep-time))))
+ (dolist (dependant (get job 'coqc-dependants))
+ (coq-par-decrease-coqc-dependency dependant dep-time ancestors)
+ (unless (get dependant 'failed)
+ (setq dependant-alive t)))
+ (when coq--debug-auto-compilation
+ (message (concat "%s: coqc kickoff finished, %s dependant alive, "
+ "maybe kickoff queue")
+ (get job 'name)
+ (if dependant-alive "some" "no")))
+ (assert (or (not (get job 'failed)) (not dependant-alive))
+ nil "failed job with non-failing dependant")
+ (when (or (and (not dependant-alive)
+ (not (get job 'require-span))
+ (not (get job 'failed)))
+ (and (get job 'queue-failed) (not (get job 'failed))))
+ ;; job has not failed, but all dependants have 'failed set, or
+ ;; top-level job marked with 'queue-failed changes to 'failed
+ (when (get job 'queue-failed)
+ (when coq--debug-auto-compilation
+ (message "%s: queue-failed -> failed, unlock ancestors"
+ (get job 'name)))
+ (put job 'failed t))
+ (coq-par-unlock-job-ancestors-on-error job))
(coq-par-kickoff-queue-maybe job)))
(defun coq-par-start-coqdep (job)
"Start coqdep for JOB.
-Besides starting the background process, the source file is
-locked, registered in the 'ancestor-files property of JOB and in
-`coq-par-ancestor-files'"
- (let ((true-src (file-truename (get job 'src-file))))
- (when coq-lock-ancestors
- (proof-register-possibly-new-processed-file true-src)
- (put job 'ancestor-files (list true-src))
- (unless (gethash true-src coq-par-ancestor-files)
- (puthash true-src 'locked coq-par-ancestor-files)))
+Lock the source file and start the coqdep background process"
+ (when (and coq-lock-ancestors
+ (eq (get job 'lock-state) 'unlocked))
+ (proof-register-possibly-new-processed-file (get job 'src-file))
+ (push job (get job 'ancestors))
+ (put job 'lock-state 'locked))
+ (coq-par-start-process
+ coq-dependency-analyzer
+ (coq-par-coqdep-arguments (get job 'src-file) (get job 'load-path))
+ 'coq-par-process-coqdep-result
+ job
+ nil))
+
+(defun coq-par-start-vio2vo (job)
+ "Start vio2vo background job."
+ (let ((arguments (coq-include-options (get job 'load-path)))
+ (module (coq-module-of-src-file (get job 'src-file)))
+ (default-directory
+ (file-name-directory (file-truename (get job 'src-file)))))
+ (when coq--debug-auto-compilation
+ (message "%s: start vio2vo for %s"
+ (get job 'name)
+ (get job 'src-file)))
+ (message "vio2vo %s" (get job 'src-file))
(coq-par-start-process
- coq-dependency-analyzer
- (coq-par-coqdep-arguments (get job 'src-file) (get job 'load-path))
- 'coq-par-process-coqdep-result
- job)))
+ coq-prog-name
+ (nconc arguments (list "-schedule-vio2vo" "1" module))
+ 'coq-par-vio2vo-continuation
+ job
+ (get job 'vo-file))))
(defun coq-par-start-task (job)
"Start the background job for which JOB is waiting.
@@ -1002,32 +1449,45 @@ coqdep or coqc are started for it."
((eq job-state 'enqueued-coqdep)
(coq-par-start-coqdep job))
((eq job-state 'enqueued-coqc)
- (message "Recompile %s" (get job 'src-file))
- (coq-par-start-process
- coq-compiler
- (coq-par-coqc-arguments (get job 'src-file) (get job 'load-path))
- 'coq-par-coqc-continuation
- job)))))
+ (message "Recompile %s%s"
+ (if (get job 'use-quick) "-quick " "")
+ (get job 'src-file))
+ (let ((arguments
+ (coq-par-coqc-arguments (get job 'src-file) (get job 'load-path))))
+ (when (get job 'use-quick)
+ (push "-quick" arguments))
+ (coq-par-start-process
+ coq-compiler
+ arguments
+ 'coq-par-coqc-continuation
+ job
+ (get job 'required-obj-file))))
+ ((eq job-state 'ready)
+ (coq-par-start-vio2vo job))
+ (t (assert nil nil "coq-par-start-task with invalid job")))))
(defun coq-par-start-jobs-until-full ()
"Start background jobs until the limit is reached."
- (let ((next-job t))
- (while (and next-job
- (< coq-current-background-jobs coq-internal-max-jobs))
- (setq next-job (coq-par-dequeue))
- (when next-job
- (coq-par-start-task next-job)))))
+ (let ((max-jobs (if coq--compile-vio2vo-in-progress
+ coq--internal-max-vio2vo-jobs
+ coq--internal-max-jobs))
+ next-job)
+ (while (and (< coq--current-background-jobs max-jobs)
+ (setq next-job (if coq--compile-vio2vo-in-progress
+ (coq-par-vio2vo-dequeue)
+ (coq-par-job-dequeue))))
+ (coq-par-start-task next-job))))
(defun coq-par-start-or-enqueue (new-job)
"Start NEW-JOB or put it into the queue of waiting jobs.
NEW-JOB goes already into the waiting queue, if the number of
background jobs is one below the limit. This is in order to leave
room for Proof General."
- (if (< (1+ coq-current-background-jobs) coq-internal-max-jobs)
+ (if (< (1+ coq--current-background-jobs) coq--internal-max-jobs)
(coq-par-start-task new-job)
- (coq-par-enqueue new-job)))
+ (coq-par-job-enqueue new-job)))
-(defun coq-par-create-library-job (module-obj-file coq-load-path queue-dep
+(defun coq-par-create-library-job (module-vo-file coq-load-path queue-dep
require-span dependant)
"Create a new compilation job for MODULE-OBJ-FILE.
If there is already a job for MODULE-OBJ-FILE a new clone job is
@@ -1051,25 +1511,26 @@ If the new job is a clone job, its state is
a queue dependency QUEUE-DEP (which cannot be ready yet)
- 'ready otherwise
-If the new job is a 'file job it's state is 'enqueued-coqdep. If
+If the new job is a 'file job its state is 'enqueued-coqdep. If
there is space, coqdep is started immediately, otherwise the new
job is put into the compilation queue.
This function returns the newly created job."
- (let* ((orig-job (gethash module-obj-file coq-compilation-object-hash))
+ (let* ((orig-job (gethash module-vo-file coq--compilation-object-hash))
(new-job (make-symbol "coq-compile-job-symbol")))
- (put new-job 'name (format "job-%d" coq-par-next-id))
- (setq coq-par-next-id (1+ coq-par-next-id))
- (put new-job 'obj-file module-obj-file)
+ (put new-job 'name (format "job-%d" coq--par-next-id))
+ (setq coq--par-next-id (1+ coq--par-next-id))
+ (put new-job 'vo-file module-vo-file)
(put new-job 'coqc-dependency-count 0)
(put new-job 'require-span require-span)
+ ;; fields 'required-obj-file and obj-mod-time are implicitely set to nil
(if orig-job
- ;; there is already a compilation job for module-obj-file
+ ;; there is already a compilation job for module-vo-file
(progn
(put new-job 'type 'clone)
- (if coq-debug-auto-compilation
- (message "%s: create %s compilation job for %s"
- (get new-job 'name) (get new-job 'type) module-obj-file))
+ (when coq--debug-auto-compilation
+ (message "%s: create %s compilation job for %s"
+ (get new-job 'name) (get new-job 'type) module-vo-file))
(when queue-dep
(coq-par-add-queue-dependency queue-dep new-job))
(if (coq-par-job-coqc-finished orig-job)
@@ -1079,44 +1540,143 @@ This function returns the newly created job."
(put new-job 'state 'ready))
(put new-job 'youngest-coqc-dependency
(get orig-job 'youngest-coqc-dependency))
- (put new-job 'ancestor-files (get orig-job 'ancestor-files)))
+ (put new-job 'ancestors (get orig-job 'ancestors)))
(coq-par-add-coqc-dependency orig-job new-job)
(put new-job 'state 'waiting-dep)
(put new-job 'youngest-coqc-dependency '(0 0))))
- ;; there is no compilation for this file yet
+ ;; there is no compilation job for this file yet
(put new-job 'type 'file)
(put new-job 'state 'enqueued-coqdep)
- (put new-job 'src-file (coq-library-src-of-obj-file module-obj-file))
+ (put new-job 'src-file (coq-library-src-of-vo-file module-vo-file))
(when (equal (get new-job 'src-file)
(buffer-file-name proof-script-buffer))
(signal 'coq-compile-error-circular-dep
(concat dependant " -> scripting buffer")))
- (message "Check %s" (get new-job 'src-file))
(put new-job 'load-path coq-load-path)
(put new-job 'youngest-coqc-dependency '(0 0))
- (puthash module-obj-file new-job coq-compilation-object-hash)
- (if coq-debug-auto-compilation
- (message "%s: create %s compilation for %s"
- (get new-job 'name) (get new-job 'type) module-obj-file))
+ (puthash module-vo-file new-job coq--compilation-object-hash)
+ (when coq--debug-auto-compilation
+ (message "%s: create %s compilation for %s"
+ (get new-job 'name) (get new-job 'type) module-vo-file))
+ (if (member (file-truename (get new-job 'src-file))
+ proof-included-files-list)
+ (put new-job 'lock-state 'asserted)
+ (put new-job 'lock-state 'unlocked))
(when queue-dep
(coq-par-add-queue-dependency queue-dep new-job))
+ (message "Check %s" (get new-job 'src-file))
(coq-par-start-or-enqueue new-job))
new-job))
+(defun coq-par-ongoing-compilation (job)
+ "Determine if the source file for JOB needs to stay looked.
+Return t if job has a direct or indirect dependant that has not
+failed yet and that is in a state before 'waiting-queue. Also,
+return t if JOB has a dependant that is a top-level job which has
+not yet failed."
+ (assert (not (eq (get job 'lock-state) 'asserted))
+ nil "coq-par-ongoing-compilation precondition failed")
+ (cond
+ ((get job 'failed)
+ nil)
+ ((or (eq (get job 'state) 'waiting-dep)
+ (eq (get job 'state) 'enqueued-coqc)
+ ;; top-level job that has compilation finished but has not
+ ;; been asserted yet
+ (and (eq (get job 'state) 'waiting-queue) (get job 'require-span))
+ ;; Note that job cannot be a top-level in state 'ready,
+ ;; because we started from job with 'lock-state property equal
+ ;; to 'locked. Top-level job in state 'ready have all
+ ;; dependees with 'lock-state equal to 'asserted.
+ )
+ t)
+ ;; Note that non-top-level jobs switch to 'waiting-queue as soon as
+ ;; all dependencies are ready, before they start to deal with the
+ ;; ancestors. We might therefore see here non-top-level jobs in
+ ;; state 'waiting-queue: they have successfully finished their
+ ;; compilation and are about to go to state 'ready.
+ ((or (eq (get job 'state) 'ready)
+ (eq (get job 'state) 'waiting-queue))
+ ;; internal ready job
+ (let ((dependants (get job 'coqc-dependants))
+ (res nil)
+ dep)
+ (while (and (not res) (setq dep (pop dependants)))
+ (setq res (coq-par-ongoing-compilation dep)))
+ res))
+ (t
+ (assert nil nil
+ "impossible ancestor state %s on job %s"
+ (get job 'state) (get job 'name)))))
+
+(defun coq-par-unlock-job-ancestors-on-error (job)
+ "Unlock those ancestors of JOB that need to be unlocked.
+For a failing job JOB, an ancestor need to stay looked if there
+is still some compilation going on for which this ancestor is a
+dependee or if a top level job with JOB as ancestor has finished
+it's compilation successfully. In all other cases the ancestor
+must be unlocked."
+ (dolist (anc-job (get job 'ancestors))
+ (when (and (eq (get anc-job 'lock-state) 'locked)
+ (not (coq-par-ongoing-compilation anc-job)))
+ (when coq--debug-auto-compilation
+ (message "%s: %s unlock because no ongoing compilation"
+ (get anc-job 'name) (get anc-job 'src-file)))
+ (coq-unlock-ancestor (get anc-job 'src-file))
+ (put anc-job 'lock-state 'unlocked))))
+
+(defun coq-par-mark-queue-failing (job)
+ "Mark JOB with 'queue-failed.
+Mark JOB with 'queue-failed, and, if JOB is in state
+'waiting-queue, transition to 'failed and unlock ancestors as
+appropriate."
+ (unless (or (get job 'failed) (get job 'queue-failed))
+ (put job 'queue-failed t)
+ (assert (not (eq (get job 'state) 'ready))
+ nil "coq-par-mark-queue-failing impossible state")
+ (when coq--debug-auto-compilation
+ (message "%s: mark as queue-failed, %s"
+ (get job 'name)
+ (if (eq (get job 'state) 'waiting-queue)
+ "failed, and unlock ancestors"
+ "wait")))
+ (when (eq (get job 'state) 'waiting-queue)
+ (put job 'failed t)
+ (coq-par-unlock-job-ancestors-on-error job))
+ (when (get job 'queue-dependant)
+ (coq-par-mark-queue-failing (get job 'queue-dependant)))))
+
+(defun coq-par-mark-job-failing (job)
+ "Mark all dependants of JOB as failing and unlock ancestors as appropriate.
+Set the 'failed property on all direct and indirect dependants of
+JOB. Along the way, unlock ancestors as determined by
+`coq-par-ongoing-compilation'. Mark queue dependants with
+'queue-failed."
+ (unless (get job 'failed)
+ (put job 'failed t)
+ (when coq--debug-auto-compilation
+ (message "%s: mark as failed and unlock free ancestors" (get job 'name)))
+ (coq-par-unlock-job-ancestors-on-error job)
+ (dolist (dependant (get job 'coqc-dependants))
+ (coq-par-mark-job-failing dependant))
+ (when (get job 'queue-dependant)
+ (coq-par-mark-queue-failing (get job 'queue-dependant)))))
+
(defun coq-par-process-coqdep-result (process exit-status)
"Coqdep continuation function: Process coqdep output.
-This function analyses the coqdep output of PROCESS and signals
-an error if necessary. If there was no coqdep error, the
-following actions are taken.
+This function analyses the coqdep output of PROCESS. In case of
+error, the job is marked as failed or compilation is aborted via
+a signal (depending on `coq-compile-keep-going'). If there was no
+coqdep error, the following actions are taken.
- the job that started PROCESS is put into sate 'waiting-dep
- a new job is created for every dependency. If this new job is
not immediately ready, a Coq dependency is registered from the
new job to the current job. For dependencies that are 'ready
already, the most recent ancestor modification time is
propagated.
-- if there are no dependencies or all dependencies are ready
- already, the next transition to 'enqueued-coqc is triggered for
- the current job
+- if there are no dependencies (especially if coqdep failed) or
+ all dependencies are ready already, the next transition to
+ 'enqueued-coqc is triggered for the current job
- otherwise the current job is left alone until somebody
decreases its dependency count to 0
@@ -1130,88 +1690,123 @@ is directly passed to `coq-par-analyse-coq-dep-exit'."
(process-get process 'coq-process-command)))
job-max-time)
(if (stringp dependencies-or-error)
- (signal 'coq-compile-error-coqdep (get job 'src-file))
+ (if coq-compile-keep-going
+ (coq-par-mark-job-failing job)
+ (signal 'coq-compile-error-coqdep (get job 'src-file)))
;; no coqdep error -- work on dependencies
- (if coq-debug-auto-compilation
- (message "%s: dependencies of %s are %s"
- (get job 'name) (get job 'src-file) dependencies-or-error))
- (put job 'state 'waiting-dep)
+ (when coq--debug-auto-compilation
+ (message "%s: dependencies of %s are %s"
+ (get job 'name) (get job 'src-file) dependencies-or-error))
(setq job-max-time (get job 'youngest-coqc-dependency))
- (mapc
- (lambda (dep-obj-file)
- (unless (coq-compile-ignore-file dep-obj-file)
- (let* ((dep-job (coq-par-create-library-job dep-obj-file
- (get job 'load-path)
- nil nil
- (get job 'src-file)))
- (dep-time (get dep-job 'youngest-coqc-dependency)))
- (when (coq-par-time-less job-max-time dep-time)
- (setq job-max-time dep-time))
- (unless (coq-par-job-coqc-finished dep-job)
- (coq-par-add-coqc-dependency dep-job job)))))
- dependencies-or-error)
- (put job 'youngest-coqc-dependency job-max-time)
- (if (coq-par-dependencies-ready job)
- (progn
- (if coq-debug-auto-compilation
- (message "%s: coqc dependencies finished" (get job 'name)))
- (coq-par-compile-job-maybe job))
- (if coq-debug-auto-compilation
- (message "%s: wait for %d dependencies"
- (get job 'name) (get job 'coqc-dependency-count)))))))
+ (dolist (dep-vo-file dependencies-or-error)
+ (unless (coq-compile-ignore-file dep-vo-file)
+ (let* ((dep-job (coq-par-create-library-job dep-vo-file
+ (get job 'load-path)
+ nil nil
+ (get job 'src-file)))
+ (dep-time (get dep-job 'youngest-coqc-dependency)))
+ (when (coq-par-time-less job-max-time dep-time)
+ (setq job-max-time dep-time))
+ (unless (coq-par-job-coqc-finished dep-job)
+ (coq-par-add-coqc-dependency dep-job job)))))
+ (put job 'youngest-coqc-dependency job-max-time))
+ ;; common part for job where coqdep was successful and where
+ ;; coqdep failed (when coq-compile-keep-going)
+ (put job 'state 'waiting-dep)
+ (if (coq-par-dependencies-ready job)
+ (progn
+ (when coq--debug-auto-compilation
+ (message "%s: coqc dependencies finished" (get job 'name)))
+ (coq-par-compile-job-maybe job))
+ (when coq--debug-auto-compilation
+ (message "%s: wait for %d dependencies"
+ (get job 'name) (get job 'coqc-dependency-count))))))
(defun coq-par-coqc-continuation (process exit-status)
- "Coqc Continuation function.
-Signal an error, if coqc failed. Otherwise, trigger the
-transition 'enqueued-coqc -> 'waiting-queue for the job behind
-PROCESS."
- (if (eq exit-status 0)
- ;; coqc success
- (coq-par-kickoff-coqc-dependants
- (process-get process 'coq-compilation-job)
- 'just-compiled)
- ;; coqc error
- (coq-init-compile-response-buffer
- (mapconcat 'identity (process-get process 'coq-process-command) " "))
- (let ((inhibit-read-only t))
- (with-current-buffer coq-compile-response-buffer
- (insert (process-get process 'coq-process-output))))
- (coq-display-compile-response-buffer)
- (signal 'coq-compile-error-coqc
- (get (process-get process 'coq-compilation-job) 'src-file))))
+ "Coqc continuation function.
+If coqc failed, signal an error or mark the job as 'failed, and
+unlock ancestors as appropriate. If coqc was successful, trigger
+the transition 'enqueued-coqc -> 'waiting-queue for the job
+behind PROCESS."
+ (let ((job (process-get process 'coq-compilation-job)))
+ (if (eq exit-status 0)
+ (progn
+ ;; coqc success
+ (when (get job 'vio2vo-needed)
+ (coq-par-vio2vo-enqueue job))
+ (coq-par-kickoff-coqc-dependants job 'just-compiled))
+ ;; coqc error
+ (coq-compile-display-error
+ (mapconcat 'identity (process-get process 'coq-process-command) " ")
+ (process-get process 'coq-process-output)
+ t)
+ (if coq-compile-keep-going
+ (progn
+ (coq-par-mark-job-failing job)
+ (coq-par-kickoff-coqc-dependants
+ job
+ (get job 'youngest-coqc-dependency)))
+ (signal 'coq-compile-error-coqc
+ (get (process-get process 'coq-compilation-job) 'src-file))))))
+
+(defun coq-par-vio2vo-continuation (process exit-status)
+ "vio2vo continuation function."
+ (let ((job (process-get process 'coq-compilation-job)))
+ (if (eq exit-status 0)
+ ;; success - nothing to do
+ (when coq--debug-auto-compilation
+ (message "%s: vio2vo finished successfully" (get job 'name)))
+ (when coq--debug-auto-compilation
+ (message "%s: vio2vo failed" (get job 'name)))
+ (coq-compile-display-error
+ (concat
+ "cd "
+ (file-name-directory (file-truename (get job 'src-file)))
+ "; "
+ (mapconcat 'identity (process-get process 'coq-process-command) " "))
+ (process-get process 'coq-process-output)
+ t)
+ ;; don't signal an error or abort other vio2vo processes
+ )))
;;; handle Require commands when queue is extended
-(defun coq-par-handle-module (module-id span)
+(defun coq-par-handle-module (module-id span &optional from)
"Handle compilation of module MODULE-ID.
This function translates MODULE-ID to a file name. If compilation
for this file is not ignored, a new top-level compilation job is
created. If there is a new top-level compilation job, it is saved
-in `coq-last-compilation-job'.
+in `coq--last-compilation-job'.
This function must be evaluated with the buffer that triggered
the compilation as current, otherwise a wrong `coq-load-path'
might be used."
- (let ((module-obj-file
- (coq-par-map-module-id-to-obj-file module-id coq-load-path))
+ (when coq--debug-auto-compilation
+ (if from
+ (message "handle required module \"%s\" from \"%s\"" module-id from)
+ (message "handle required module \"%s\" without from clause" module-id)))
+ (let ((module-vo-file
+ (coq-par-map-module-id-to-vo-file module-id coq-load-path from))
module-job)
- (if coq-debug-auto-compilation
- (message "check compilation for module %s from object file %s"
- module-id module-obj-file))
- ;; coq-par-map-module-id-to-obj-file currently returns () for
+ (when coq--debug-auto-compilation
+ (if module-vo-file
+ (message "check compilation for module %s from object file %s"
+ module-id module-vo-file)
+ (message "nothing to check for module %s" module-id)))
+ ;; coq-par-map-module-id-to-vo-file currently returns () for
;; standard library modules!
- (when (and module-obj-file
- (not (coq-compile-ignore-file module-obj-file)))
+ (when (and module-vo-file
+ (not (coq-compile-ignore-file module-vo-file)))
(setq module-job
- (coq-par-create-library-job module-obj-file coq-load-path
- coq-last-compilation-job span
+ (coq-par-create-library-job module-vo-file coq-load-path
+ coq--last-compilation-job span
"scripting buffer"))
- (setq coq-last-compilation-job module-job)
- (if coq-debug-auto-compilation
- (message "%s: this job is the last compilation job now"
- (get coq-last-compilation-job 'name))))))
+ (setq coq--last-compilation-job module-job)
+ (when coq--debug-auto-compilation
+ (message "%s: this job is the last compilation job now"
+ (get coq--last-compilation-job 'name))))))
(defun coq-par-handle-require-list (require-items)
"Start compilation for the required modules in the car of REQUIRE-ITEMS.
@@ -1225,17 +1820,20 @@ to file names and creates one top-level compilation job for each
required module that is not ignored (eg via
`coq-compile-ignored-directories'). Jobs are started immediately
if possible. The last such created job is remembered in
-`coq-last-compilation-job'. The REQUIRE-ITEMS are attached to
+`coq--last-compilation-job'. The REQUIRE-ITEMS are attached to
this last top-level job or directly to proof-action-list, if
there is no last compilation job."
(let* ((item (car require-items))
(string (mapconcat 'identity (nth 1 item) " "))
(span (car item))
- start)
+ prefix start)
+ (when coq--debug-auto-compilation
+ (message "handle require command \"%s\"" string))
;; We know there is a require in string. But we have to match it
;; again in order to get the end position.
(string-match coq-require-command-regexp string)
(setq start (match-end 0))
+ (setq prefix (match-string 1 string))
(span-add-delete-action
span
`(lambda ()
@@ -1243,21 +1841,27 @@ there is no last compilation job."
;; add a compilation job for all required modules
(while (string-match coq-require-id-regexp string start)
(setq start (match-end 0))
- (coq-par-handle-module (match-string 1 string) span))
+ (coq-par-handle-module (match-string 1 string) span prefix))
;; add the asserted items to the last compilation job
- (if coq-last-compilation-job
+ (if coq--last-compilation-job
(progn
- (assert (not (coq-par-job-is-ready coq-last-compilation-job)))
- (put coq-last-compilation-job 'queueitems require-items)
- (if coq-debug-auto-compilation
- (message "%s: attach %s items"
- (get coq-last-compilation-job 'name)
- (length require-items))))
+ (assert (not (coq-par-job-is-ready coq--last-compilation-job))
+ nil "last compilation job from previous compilation ready")
+ (put coq--last-compilation-job 'queueitems
+ (nconc (get coq--last-compilation-job 'queueitems)
+ require-items))
+ (when coq--debug-auto-compilation
+ (message "%s: attach %s items (containing now %s items)"
+ (get coq--last-compilation-job 'name)
+ (length require-items)
+ (length (get coq--last-compilation-job 'queueitems)))))
;; or add them directly to queueitems if there is no compilation job
;; (this happens if the modules are ignored for compilation)
(setq queueitems (nconc queueitems require-items))
- (if coq-debug-auto-compilation
- (message "attach %s items to queueitems" (length require-items))))))
+ (when coq--debug-auto-compilation
+ (message "attach %s items to queueitems (containing now %s items)"
+ (length require-items)
+ (length queueitems))))))
(defun coq-par-item-require-predicate (item)
@@ -1279,7 +1883,7 @@ If `coq-compile-before-require' is non-nil, this function starts
the compilation (if necessary) of the dependencies
ansynchronously in parallel in the background.
-If there is a last compilation job (`coq-last-compilation-job')
+If there is a last compilation job (`coq--last-compilation-job')
then the queue region is extended, while some background
compilation is still running. In this case I have to preserve the
internal state. Otherwise the hash of the compilation jobs and
@@ -1297,44 +1901,52 @@ first of these batches, buffers are saved with
Finally, `proof-second-action-list-active' is set if I keep some
queue items because they have to wait for a compilation job. Then
the maximal number of background compilation jobs is started."
- (when coq-debug-auto-compilation
+ (when coq--debug-auto-compilation
(message "%d items were added to the queue, scan for require"
(length queueitems)))
- (unless coq-last-compilation-job
+ (unless coq--last-compilation-job
(coq-par-init-compilation-hash)
- (coq-par-init-ancestor-hash))
+ (coq-init-compile-response-buffer))
(let ((splitted-items
(split-list-at-predicate queueitems
'coq-par-item-require-predicate)))
- (if coq-last-compilation-job
+ (if coq--last-compilation-job
(progn
- (put coq-last-compilation-job 'queueitems
- (nconc (get coq-last-compilation-job 'queueitems)
+ (put coq--last-compilation-job 'queueitems
+ (nconc (get coq--last-compilation-job 'queueitems)
(car splitted-items)))
(setq queueitems nil)
(message "attach first %s items to job %s"
(length (car splitted-items))
- (get coq-last-compilation-job 'name)))
+ (get coq--last-compilation-job 'name)))
(setq queueitems (car splitted-items))
- (if coq-debug-auto-compilation
- (message "attach first %s items directly to queue"
- (length (car splitted-items)))))
+ (when coq--debug-auto-compilation
+ (message "attach first %s items directly to queue"
+ (length (car splitted-items)))))
;; XXX handle external compilation here, compile everything
;; with one command, use compilation-finish-functions to get
;; notification
(when (cdr splitted-items)
+ (when coq--compile-vio2vo-delay-timer
+ (cancel-timer coq--compile-vio2vo-delay-timer)
+ (setq coq--compile-vio2vo-delay-timer nil))
+ (when coq--compile-vio2vo-in-progress
+ (assert (not coq--last-compilation-job)
+ nil "normal compilation and vio2vo in parallel 2")
+ ;; there are only vio2vo background processes
+ (coq-par-kill-all-processes)
+ (setq coq--compile-vio2vo-in-progress nil))
;; save buffers before invoking the first coqdep
(coq-compile-save-some-buffers)
- (mapc (lambda (require-items)
- (coq-par-handle-require-list require-items))
- (cdr splitted-items)))
- (when coq-last-compilation-job
+ (dolist (require-items (cdr splitted-items))
+ (coq-par-handle-require-list require-items)))
+ (when coq--last-compilation-job
(setq proof-second-action-list-active t))
(coq-par-start-jobs-until-full)
- (if coq-debug-auto-compilation
- (if coq-last-compilation-job
- (message "return control, waiting for background jobs")
- (message "return control, no background jobs")))))
+ (when coq--debug-auto-compilation
+ (if coq--last-compilation-job
+ (message "return control, waiting for background jobs")
+ (message "return control, no background jobs")))))
(defun coq-par-preprocess-require-commands ()
"Coq function for `proof-shell-extend-queue-hook' doing parallel compilation.
@@ -1349,6 +1961,17 @@ does the error checking/reporting for
(coq-compile-error
(coq-par-emergency-cleanup)
(message "%s %s" (get (car err) 'error-message) (cdr err)))
+ (coq-unclassifiable-version
+ (coq-par-emergency-cleanup)
+ (if (equal (cdr err) "trunk")
+ (message
+ (concat "your Coq version \"trunk\" is too unspecific for "
+ "Proof General; please customize coq-pinned-version"))
+ (message "%s \"%s\"; consider customizing coq-pinned-version"
+ (get (car err) 'error-message) (cdr err))))
+ (file-error
+ (coq-par-emergency-cleanup)
+ (message "Error: %s" (mapconcat 'identity (cdr err) ": ")))
(error
(message "unexpected error during parallel compilation: %s"
err)
diff --git a/coq/coq-par-test.el b/coq/coq-par-test.el
new file mode 100644
index 00000000..f60baacf
--- /dev/null
+++ b/coq/coq-par-test.el
@@ -0,0 +1,953 @@
+;; coq-par-test.el --- tests for parallel compilation
+;; Copyright (C) 2016 Hendrik Tews
+;; Authors: Hendrik Tews
+;; License: GPL (GNU GENERAL PUBLIC LICENSE)
+;; Maintainer: Hendrik Tews <hendrik@askra.de>
+;;
+;;; Commentary:
+;;
+;; This file file contains tests for `coq-par-job-needs-compilation'.
+;; It specifies for all combinations of `coq-compile-quick', existing
+;; files and relative file ages the required result and side effects
+;; of `coq-par-job-needs-compilation'.
+;;
+;; Run the tests with
+;; emacs -batch -L . -L ../generic -L ../lib -load coq-par-test.el
+;;
+;;; TODO:
+;;
+;; - integrate into PG build and test(?) system
+
+
+(require 'coq-par-compile)
+
+(defconst coq--par-job-needs-compilation-tests
+ ;; for documentation see the doc string following the init value
+ '(
+ ;; present files | compilation? | delete | 'req-obj-file
+ ;; ====================================================================
+ ;; all of src dep vo vio present
+ ((src dep vo vio)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ ((src dep vio vo)
+ (no-quick nil nil vio)
+ (quick nil nil vio)
+ (ensure-vo nil nil vo ))
+
+ ((src vo dep vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ((src vo vio dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src vio dep vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((src vio vo dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((dep src vio vo)
+ (no-quick nil nil vio)
+ (quick nil nil vio)
+ (ensure-vo nil nil vo ))
+
+ ((dep src vo vio)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ ((dep vo vio src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((dep vo src vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ((dep vio vo src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((dep vio src vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vo src dep vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((vo src vio dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vo dep src vio)
+ (no-quick nil vo vio )
+ (quick nil vo vio )
+ (ensure-vo t nil vo ))
+
+ ((vo dep vio src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vo vio src dep)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((vo vio dep src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((vio src vo dep)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((vio src dep vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vio dep vo src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((vio dep src vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vio vo dep src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((vio vo src dep)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+
+ ;; only src dep vo present
+ ((src dep vo)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil nil vo ))
+
+ ((src vo dep)
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+ ((dep src vo)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil nil vo ))
+
+ ((dep vo src)
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+ ((vo src dep)
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+ ((vo dep src)
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ;; only src dep vio present
+ ((src dep vio)
+ (no-quick nil nil vio )
+ (quick nil nil vio )
+ (ensure-vo t nil vo ))
+
+ ((src vio dep)
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+
+ ((dep src vio)
+ (no-quick nil nil vio )
+ (quick nil nil vio )
+ (ensure-vo t nil vo ))
+
+ ((dep vio src)
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+
+ ((vio src dep)
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+
+ ((vio dep src)
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ;; only src vo vio present
+ ((src vo vio)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ ((src vio vo)
+ (no-quick nil nil vio)
+ (quick nil nil vio)
+ (ensure-vo nil nil vo ))
+
+ ((vo src vio)
+ (no-quick nil vo vio )
+ (quick nil vo vio )
+ (ensure-vo t nil vo ))
+
+ ((vo vio src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((vio src vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vio vo src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ;; only src dep present
+ ((src dep)
+ (no-quick t nil vo )
+ (quick t nil vio )
+ (ensure-vo t nil vo ))
+
+ ((dep src)
+ (no-quick t nil vo )
+ (quick t nil vio )
+ (ensure-vo t nil vo ))
+
+
+ ;; only src vo present
+ ((src vo)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil nil vo ))
+
+ ((vo src)
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+
+ ;; only src vio present
+ ((src vio)
+ (no-quick nil nil vio )
+ (quick nil nil vio )
+ (ensure-vo t nil vo ))
+
+ ((vio src)
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+
+
+ ;; only src present
+ ((src)
+ (no-quick t nil vo )
+ (quick t nil vio )
+ (ensure-vo t nil vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ;;
+ ;; test cases for some objects with identical time stamp
+ ;;
+ ;; 4 files with same time stamp
+ (((src vo dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; 3 files with same time stamp
+ (((src vo dep) vio)
+ (no-quick nil vo vio )
+ (quick nil vo vio )
+ (ensure-vo t nil vo ))
+
+ ((vio (src vo dep))
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ (((src vo vio) dep)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((dep (src vo vio))
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ (((src dep vio) vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((vo (src dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ (((vo dep vio) src)
+ (no-quick t vio vo )
+ (quick t vo vio )
+ (ensure-vo t vio vo ))
+
+ ((src (vo dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; 2 times 2 files with same time stamp
+ (((src vo) (dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((dep vio) (src vo))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src dep) (vo vio))
+ ;; could also use the vio as 'req-obj-file in the first 2 cases here
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ (((vo vio) (src dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src vio) (vo dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ (((vo dep) (src vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; 2 files with same time stamp
+ (((src vo) dep vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ (((src vo) vio dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((dep (src vo) vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ((dep vio (src vo))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vio (src vo) dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vio dep (src vo))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ (((src dep) vo vio)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ (((src dep) vio vo)
+ (no-quick nil nil vio)
+ (quick nil nil vio)
+ (ensure-vo nil nil vo ))
+
+ ((vo (src dep) vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ((vo vio (src dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vio (src dep) vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vio vo (src dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src vio) vo dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src vio) dep vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vo (src vio) dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((vo dep (src vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((dep (src vio) vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((dep vo (src vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((vo dep) src vio)
+ (no-quick nil vo vio )
+ (quick nil vo vio )
+ (ensure-vo t nil vo ))
+
+ (((vo dep) vio src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src (vo dep) vio)
+ (no-quick nil vo vio)
+ (quick nil vo vio)
+ (ensure-vo t nil vo ))
+
+ ((src vio (vo dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vio (vo dep) src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vio src (vo dep))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ (((vo vio) src dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((vo vio) dep src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src (vo vio) dep)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src dep (vo vio))
+ ;; could also use the vio as 'req-obj-file in the first 2 cases here
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ ((dep (vo vio) src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((dep src (vo vio))
+ ;; could also use the vio as 'req-obj-file in the first 2 cases here
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ (((dep vio) src vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ (((dep vio) vo src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src (dep vio) vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((src vo (dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vo (dep vio) src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((vo src (dep vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ;; 2 files with the same time stamp out of 3 files
+ ;; without vio
+ (((src dep vo))
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ (((src dep) vo)
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil nil vo ))
+
+ ((vo (src dep))
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ (((src vo) dep)
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ ((dep (src vo))
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ (((dep vo) src)
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((src (dep vo))
+ (no-quick t nil vo )
+ (quick t vo vio)
+ (ensure-vo t nil vo ))
+
+ ;; without vo
+ (((src dep vio))
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ (((src dep) vio)
+ (no-quick nil nil vio )
+ (quick nil nil vio )
+ (ensure-vo t nil vo ))
+
+ ((vio (src dep))
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ (((src vio) dep)
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ ((dep (src vio))
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ (((dep vio) src)
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ ((src (dep vio))
+ (no-quick t vio vo )
+ (quick t nil vio)
+ (ensure-vo t vio vo ))
+
+ ;; without dep
+ (((src vio vo))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src vio) vo)
+ (no-quick nil vio vo )
+ (quick nil vio vo )
+ (ensure-vo nil vio vo ))
+
+ ((vo (src vio))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((src vo) vio)
+ (no-quick nil vo vio )
+ (quick nil vo vio )
+ (ensure-vo t nil vo ))
+
+ ;; present files | compilation? | delete | 'req-obj-file
+ ((vio (src vo))
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ (((vio vo) src)
+ (no-quick t vio vo )
+ (quick t vo vio)
+ (ensure-vo t vio vo ))
+
+ ((src (vio vo))
+ ;; could also use the vio as 'req-obj-file in the first 2 cases here
+ (no-quick nil nil vo )
+ (quick nil nil vo )
+ (ensure-vo nil vio vo ))
+
+ ;; 2 files with identical time stamp out of 2 files
+ (((src dep))
+ (no-quick t nil vo )
+ (quick t nil vio )
+ (ensure-vo t nil vo ))
+
+ (((src vo))
+ (no-quick t nil vo )
+ (quick t vo vio )
+ (ensure-vo t nil vo ))
+
+ (((src vio))
+ (no-quick t vio vo )
+ (quick t nil vio )
+ (ensure-vo t vio vo ))
+ )
+ "Test and result specification for `coq-par-job-needs-compilation'.
+
+List of tests. A test is a list of 4 elements. The first element,
+a list, specifies the existing files and their relative age. In
+there, `src' stands for the source (x.v) file, `dep' for
+a (already compiled) dependency (dep.vo or dep.vio), `vo' for the
+.vo file (x.vo) and `vio' for the .vio file (x.vio). A label in
+the list denotes an existing file, a missing label a missing
+file. The first element is the oldest file, the last element the
+newest file. A sublist specifies a set of files with identical
+time stamps. For example, ``(src (vo vio) dep)'' specifies source
+is older than .vo and .vio, .vo and .vio have identical last
+modification time stamps and .vo and .vio are older than the
+dependency.
+
+Elements 2-4 of a test specify the results and side effects of
+`coq-par-job-needs-compilation' for all setting of
+`coq-compile-quick' on the file configuration described in
+element 1. The options `quick-no-vio2vo' and `quick-and-vio2vo'
+are specified together with label `quick'. Each result and side
+effect specification (also called a variant in the source code
+below) is itself a list of 4 elements. Element 1 is the value for
+`coq-compile-quick', where `quick' denotes both `quick-no-vio2vo'
+and `quick-and-vio2vo'. Element 2 specifies the result of
+`coq-par-job-needs-compilation', nil for don't compile, t for do
+compile. Elements 3-5 specify side effects. Element 3 which file
+must be deleted, where nil means no file must be deleted. Element
+4 specifies which file name must be stored in the
+`required-obj-file' property of the job. This file will be used
+as the compiled module library. In case compilation is
+needed (element 2 equals t), this is the target of the
+compilation.
+
+This list contains 1 test for all possible file configuration and
+relative ages.")
+
+(defun coq-par-test-flatten-files (file-descr)
+ "Flatten a file description test case list into a list of files."
+ (let (result)
+ (dolist (f file-descr result)
+ (if (listp f)
+ (setq result (append f result))
+ (push f result)))))
+
+(defun test-coq-par-test-data-invarint ()
+ "Wellformedness check for the test specifications."
+ (mapc
+ (lambda (test)
+ (let ((test-id (format "%s" (car test))))
+ ;; a test is a list of 4 elements and the first element is a list itself
+ (assert
+ (and
+ (eq (length test) 4)
+ (listp (car test)))
+ nil (concat test-id " 1"))
+ (mapc
+ (lambda (variant)
+ ;; a variant is a list of 4 elements
+ (assert (eq (length variant) 4) nil (concat test-id " 2"))
+ (let ((files (coq-par-test-flatten-files (car test)))
+ (quick-mode (car variant))
+ (compilation-result (nth 1 variant))
+ (delete-result (nth 2 variant))
+ (req-obj-result (nth 3 variant)))
+ ;; the delete field, when set, must be a member of the files list
+ (assert (or (not delete-result)
+ (member delete-result files))
+ nil (concat test-id " 3"))
+ ;; 8.4 compatibility check
+ (when (and (or (eq quick-mode 'no-quick) (eq quick-mode 'ensure-vo))
+ (not (member 'vio files)))
+ (assert (not delete-result)
+ nil (concat test-id " 4"))
+ (assert (eq compilation-result
+ (not (eq (car (last (car test))) 'vo)))
+ nil (concat test-id " 5")))))
+ (cdr test))))
+ coq--par-job-needs-compilation-tests))
+
+(defun test-coq-par-sym-to-file (dir sym)
+ "Convert a test file symbol SYM to a file name in directory DIR."
+ (let ((file (cond
+ ((eq sym 'src) "a.v")
+ ((eq sym 'dep) "dep.vo")
+ ((eq sym 'vo) "a.vo")
+ ((eq sym 'vio) "a.vio")
+ (t (assert nil)))))
+ (concat dir "/" file)))
+
+(defun test-coq-par-one-test (counter dir file-descr variant dep-just-compiled)
+ "Do one test for one specific `coq-compile-quick' value.
+
+This function creates the files in DIR, sets up a job with the
+necessary fields, calls `coq--par-job-needs-compilation-tests' and
+test the result and side effects wth `assert'."
+ (let ((id (format "%s: %s %s%s" counter (car variant) file-descr
+ (if dep-just-compiled " just" "")))
+ (job (make-symbol "coq-compile-job-symbol"))
+ (module-vo-file (concat dir "/a.vo"))
+ (quick-mode (car variant))
+ (compilation-result (nth 1 variant))
+ (delete-result (nth 2 variant))
+ (req-obj-result (nth 3 variant))
+ (different-counter 5)
+ (same-counter 5)
+ (different-not-ok t)
+ (same-not-ok t)
+ (last-different-time-stamp '(0 0))
+ (file-descr-flattened (coq-par-test-flatten-files file-descr))
+ same-time-stamp file-list
+ obj-mod-result result)
+ (message "test case %s/576: %s %s%s" counter (car variant) file-descr
+ (if dep-just-compiled " just" ""))
+ (when (not compilation-result)
+ (setq obj-mod-result req-obj-result))
+ (ignore-errors
+ (delete-directory dir t))
+ (make-directory dir)
+ (setq coq-compile-quick quick-mode)
+ (put job 'vo-file module-vo-file)
+ (put job 'src-file (coq-library-src-of-vo-file module-vo-file))
+ (put job 'youngest-coqc-dependency '(0 0))
+ (put job 'name id)
+ ;; create files in order
+ (while different-not-ok
+ ;; (message "enter different loop %s at %s"
+ ;; different-counter (current-time))
+ (setq different-not-ok nil)
+ (setq different-counter (1- different-counter))
+ (assert (> different-counter 0)
+ nil "create files with different time stamps failed")
+ (dolist (same-descr file-descr)
+ (when (symbolp same-descr)
+ (setq same-descr (list same-descr)))
+ (setq file-list
+ (mapcar (lambda (sym) (test-coq-par-sym-to-file dir sym))
+ same-descr))
+ ;; (message "try %s files %s" same-descr file-list)
+ (setq same-counter 5)
+ (setq same-not-ok t)
+ (while same-not-ok
+ (setq same-counter (1- same-counter))
+ (assert (> same-counter 0)
+ nil "create files with same time stamp filed")
+ (dolist (file file-list)
+ (with-temp-file file t))
+ ;; check now that all the files in file-list have the same time stamp
+ (setq same-not-ok nil)
+ (setq same-time-stamp (nth 5 (file-attributes (car file-list))))
+ ;; (message "got first time stamp %s" same-time-stamp)
+ (dolist (file (cdr file-list))
+ (let ((ots (nth 5 (file-attributes file))))
+ ;; (message "got other time stamp %s" ots)
+ (unless (equal same-time-stamp ots)
+ (setq same-not-ok t)))))
+ ;; (message "successful finished %s" same-descr)
+ (when (member 'dep same-descr)
+ (put job 'youngest-coqc-dependency
+ (nth 5 (file-attributes (test-coq-par-sym-to-file dir 'dep)))))
+ ;; (message "XX %s < %s = %s"
+ ;; last-different-time-stamp same-time-stamp
+ ;; (time-less-p last-different-time-stamp same-time-stamp))
+ (unless (time-less-p last-different-time-stamp same-time-stamp)
+ ;; error - got the same time stamp
+ ;; (message "unsuccsessful - need different retry")
+ (setq different-not-ok t))
+ (setq last-different-time-stamp same-time-stamp)
+ (sleep-for 0 15)))
+ (when dep-just-compiled
+ (put job 'youngest-coqc-dependency 'just-compiled))
+ (setq result (coq-par-job-needs-compilation job))
+ ;; check result
+ (assert (eq result compilation-result)
+ nil (concat id " result"))
+ ;; check file deletion
+ (assert (or (not delete-result)
+ (not (file-attributes
+ (test-coq-par-sym-to-file dir delete-result))))
+ nil (concat id " delete file"))
+ ;; check no other file is deleted
+ (dolist (f file-descr-flattened)
+ (unless (eq f delete-result)
+ (assert (file-attributes (test-coq-par-sym-to-file dir f))
+ nil (format "%s non del file %s: %s"
+ id f
+ (test-coq-par-sym-to-file dir f)))))
+ ;; check value of 'required-obj-file property
+ (assert (equal (get job 'required-obj-file)
+ (test-coq-par-sym-to-file dir req-obj-result))
+ nil (concat id " required-obj-file"))
+ ;; check 'obj-mod-time property
+ (if obj-mod-result
+ (assert
+ (equal
+ (get job 'obj-mod-time)
+ (nth 5 (file-attributes
+ (test-coq-par-sym-to-file dir obj-mod-result))))
+ nil (concat id " obj-mod-time non nil"))
+ (assert (not (get job 'obj-mod-time))
+ nil (concat id " obj-mod-time nil")))
+ ;; check 'use-quick property
+ (assert (eq (not (not (and compilation-result (eq req-obj-result 'vio))))
+ (get job 'use-quick))
+ nil (concat id " use-quick"))
+ ;; check vio2vo-needed property
+ (assert (eq
+ (and (eq quick-mode 'quick-and-vio2vo)
+ (eq req-obj-result 'vio)
+ (or (eq delete-result 'vo)
+ (not (member 'vo file-descr-flattened))))
+ (get job 'vio2vo-needed))
+ nil (concat id " vio2vo-needed wrong"))
+ (ignore-errors
+ (delete-directory dir t))))
+
+(defvar test-coq-par-counter 0
+ "Stupid counter.")
+
+(defun test-coq-par-one-spec (dir files variant dep-just-compiled)
+ "Run one test for one variant and split it for the 2 quick settings."
+ (if (eq (car variant) 'quick)
+ (progn
+ (test-coq-par-one-test test-coq-par-counter dir files
+ (cons 'quick-no-vio2vo (cdr variant))
+ dep-just-compiled)
+ (setq test-coq-par-counter (1+ test-coq-par-counter))
+ (test-coq-par-one-test test-coq-par-counter dir files
+ (cons 'quick-and-vio2vo (cdr variant))
+ dep-just-compiled))
+ (test-coq-par-one-test test-coq-par-counter dir files variant
+ dep-just-compiled))
+ (setq test-coq-par-counter (1+ test-coq-par-counter)))
+
+(defun test-coq-par-job-needs-compilation (dir)
+ "Check test data wellformedness and run all the tests."
+ (test-coq-par-test-data-invarint)
+ (setq test-coq-par-counter 1)
+ (mapc
+ (lambda (test)
+ (mapc
+ (lambda (variant)
+ (test-coq-par-one-spec dir (car test) variant nil)
+ (when (eq (car (last (car test))) 'dep)
+ (test-coq-par-one-spec dir (car test) variant t)))
+ (cdr test)))
+ coq--par-job-needs-compilation-tests))
+
+(condition-case err
+ (progn
+ (test-coq-par-job-needs-compilation (make-temp-name "/tmp/coq-par-test"))
+ (message "test completed successfully"))
+ (error
+ (message "test failed with %s" err)
+ (kill-emacs 1)))
+
+
+(provide 'coq-par-test)
+
+;;; coq-par-test.el ends here
diff --git a/coq/coq-seq-compile.el b/coq/coq-seq-compile.el
index e00a2793..a1b2d30a 100644
--- a/coq/coq-seq-compile.el
+++ b/coq/coq-seq-compile.el
@@ -64,7 +64,7 @@ error occurred and the returned list is the (possibly empty) list
of file names LIB-SRC-FILE depends on.
If an error occurs this funtion displays
-`coq-compile-response-buffer' with the complete command and its
+`coq--compile-response-buffer' with the complete command and its
output. The optional argument COMMAND-INTRO is only used in the
error case. It is prepended to the displayed command.
@@ -77,17 +77,17 @@ break."
(nconc (coq-include-options coq-load-path (file-name-directory lib-src-file) (coq--pre-v85))
(list lib-src-file)))
coqdep-status coqdep-output)
- (if coq-debug-auto-compilation
- (message "call coqdep arg list: %S" coqdep-arguments))
+ (when coq--debug-auto-compilation
+ (message "call coqdep arg list: %S" coqdep-arguments))
(with-temp-buffer
(setq coqdep-status
(apply 'call-process
coq-dependency-analyzer nil (current-buffer) nil
coqdep-arguments))
(setq coqdep-output (buffer-string)))
- (if coq-debug-auto-compilation
- (message "coqdep status %s, output on %s: %s"
- coqdep-status lib-src-file coqdep-output))
+ (when coq--debug-auto-compilation
+ (message "coqdep status %s, output on %s: %s"
+ coqdep-status lib-src-file coqdep-output))
(if (or
(not (eq coqdep-status 0))
(string-match coq-coqdep-error-regexp coqdep-output))
@@ -99,7 +99,7 @@ break."
(coq-init-compile-response-buffer
(mapconcat 'identity full-command " "))
(let ((inhibit-read-only t))
- (with-current-buffer coq-compile-response-buffer
+ (with-current-buffer coq--compile-response-buffer
(insert coqdep-output)))
(coq-display-compile-response-buffer)
"unsatisfied dependencies")
@@ -109,7 +109,7 @@ break."
(defun coq-seq-compile-library (src-file)
"Recompile coq library SRC-FILE.
-Display errors in buffer `coq-compile-response-buffer'."
+Display errors in buffer `coq--compile-response-buffer'."
(message "Recompile %s" src-file)
(let ((coqc-arguments
(nconc
@@ -118,16 +118,16 @@ Display errors in buffer `coq-compile-response-buffer'."
coqc-status)
(coq-init-compile-response-buffer
(mapconcat 'identity (cons coq-compiler coqc-arguments) " "))
- (if coq-debug-auto-compilation
- (message "call coqc arg list: %s" coqc-arguments))
+ (when coq--debug-auto-compilation
+ (message "call coqc arg list: %s" coqc-arguments))
(setq coqc-status
(apply 'call-process
- coq-compiler nil coq-compile-response-buffer t coqc-arguments))
- (if coq-debug-auto-compilation
- (message "compilation %s exited with %s, output |%s|"
- src-file coqc-status
- (with-current-buffer coq-compile-response-buffer
- (buffer-string))))
+ coq-compiler nil coq--compile-response-buffer t coqc-arguments))
+ (when coq--debug-auto-compilation
+ (message "compilation %s exited with %s, output |%s|"
+ src-file coqc-status
+ (with-current-buffer coq--compile-response-buffer
+ (buffer-string))))
(unless (eq coqc-status 0)
(coq-display-compile-response-buffer)
(let ((terminated-text (if (numberp coqc-status)
@@ -178,8 +178,8 @@ OBJ have identical modification times."
(progn
(coq-seq-compile-library src)
'just-compiled)
- (if coq-debug-auto-compilation
- (message "Skip compilation of %s" src))
+ (when coq--debug-auto-compilation
+ (message "Skip compilation of %s" src))
obj-time))))
(defun coq-seq-make-lib-up-to-date (coq-obj-hash span lib-obj-file)
@@ -202,8 +202,8 @@ function."
(let ((result (gethash lib-obj-file coq-obj-hash)))
(if result
(progn
- (if coq-debug-auto-compilation
- (message "Checked %s already" lib-obj-file))
+ (when coq--debug-auto-compilation
+ (message "Checked %s already" lib-obj-file))
result)
;; lib-obj-file has not been checked -- do it now
(message "Check %s" lib-obj-file)
@@ -212,7 +212,7 @@ function."
(setq result '(0 0))
(let* ((lib-src-file
(expand-file-name
- (coq-library-src-of-obj-file lib-obj-file)))
+ (coq-library-src-of-vo-file lib-obj-file)))
dependencies deps-mod-time)
(if (file-exists-p lib-src-file)
;; recurse into dependencies now
@@ -260,7 +260,7 @@ therefore the customizations for `compile' do not apply."
(let* ((local-compile-command coq-compile-command)
(physical-dir (file-name-directory absolute-module-obj-file))
(module-object (file-name-nondirectory absolute-module-obj-file))
- (module-source (coq-library-src-of-obj-file module-object))
+ (module-source (coq-library-src-of-vo-file module-object))
(requiring-file buffer-file-name))
(mapc
(lambda (substitution)
@@ -282,9 +282,9 @@ therefore the customizations for `compile' do not apply."
(compilation-start local-compile-command)
(coq-seq-lock-ancestor
span
- (coq-library-src-of-obj-file absolute-module-obj-file)))))
+ (coq-library-src-of-vo-file absolute-module-obj-file)))))
-(defun coq-seq-map-module-id-to-obj-file (module-id span)
+(defun coq-seq-map-module-id-to-obj-file (module-id span &optional from)
"Map MODULE-ID to the appropriate coq object file.
The mapping depends of course on `coq-load-path'. The current
implementation invokes coqdep with a one-line require command.
@@ -301,7 +301,7 @@ function returns () if MODULE-ID comes from the standard library."
coq-load-path))
(coq-load-path-include-current nil)
(temp-require-file (make-temp-file "ProofGeneral-coq" nil ".v"))
- (coq-string (concat "Require " module-id "."))
+ (coq-string (concat (if from (concat "From " from " ") "") "Require " module-id "."))
result)
(unwind-protect
(progn
@@ -315,16 +315,16 @@ function returns () if MODULE-ID comes from the standard library."
(if (stringp result)
;; Error handling: coq-seq-get-library-dependencies was not able to
;; translate module-id into a file name. We insert now a faked error
- ;; message into coq-compile-response-buffer to make next-error happy.
+ ;; message into coq--compile-response-buffer to make next-error happy.
(let ((error-message
(format "Cannot find library %s in loadpath" module-id))
(inhibit-read-only t))
- ;; Writing a message into coq-compile-response-buffer for next-error
+ ;; Writing a message into coq--compile-response-buffer for next-error
;; does currently not work. We do have exact position information
;; about the span, but we don't know how much white space there is
;; between the start of the span and the start of the command string.
- ;; Check that coq-compile-response-buffer is a valid buffer!
- ;; (with-current-buffer coq-compile-response-buffer
+ ;; Check that coq--compile-response-buffer is a valid buffer!
+ ;; (with-current-buffer coq--compile-response-buffer
;; (insert
;; (format "File \"%s\", line %d\n%s.\n"
;; (buffer-file-name (span-buffer span))
@@ -337,7 +337,7 @@ function returns () if MODULE-ID comes from the standard library."
"Internal error in coq-seq-map-module-id-to-obj-file")
(car-safe result)))
-(defun coq-seq-check-module (coq-object-local-hash-symbol span module-id)
+(defun coq-seq-check-module (coq-object-local-hash-symbol span module-id &optional from)
"Locate MODULE-ID and compile if necessary.
If `coq-compile-command' is not nil the whole task of checking which
modules need compilation and the compilation itself is done by an external
@@ -354,7 +354,7 @@ the coq-obj-hash, which is used during internal
compilation (see `coq-seq-make-lib-up-to-date'). This way one hash
will be used for all \"Require\" commands added at once to the
queue."
- (let ((module-obj-file (coq-seq-map-module-id-to-obj-file module-id span)))
+ (let ((module-obj-file (coq-seq-map-module-id-to-obj-file module-id span from)))
;; coq-seq-map-module-id-to-obj-file currently returns () for
;; standard library modules!
(when module-obj-file
@@ -382,7 +382,8 @@ compilation (if necessary) of the dependencies."
(when (and string
(string-match coq-require-command-regexp string))
(let ((span (car item))
- (start (match-end 0)))
+ (start (match-end 0))
+ (prefix (match-string 1 string)))
(span-add-delete-action
span
`(lambda ()
@@ -392,7 +393,7 @@ compilation (if necessary) of the dependencies."
(while (string-match coq-require-id-regexp string start)
(setq start (match-end 0))
(coq-seq-check-module 'coq-object-hash-symbol span
- (match-string 1 string))))))))))
+ (match-string 1 string) prefix)))))))))
(provide 'coq-seq-compile)
diff --git a/coq/coq-smie.el b/coq/coq-smie.el
index a609727a..1c0b9c67 100644
--- a/coq/coq-smie.el
+++ b/coq/coq-smie.el
@@ -107,7 +107,7 @@ attention to case differences."
(goto-char pt)
;; looking for a dummy token to see if we fail before reaching
;; strt, which means that we were in a prenthesized expression.
- (coq-smie-search-token-backward "#dummy#" strt)
+ (coq-smie-search-token-backward '("#dummy#") strt)
(> (point) strt)))))
(defun coq-smie-.-deambiguate ()
@@ -318,7 +318,7 @@ force indentation."
The point should be at the beginning of the command name."
(save-excursion ; FIXME Is there other module starting commands?
(cond
- ((looking-back "with\\s-+") "module") ; lowecase means Module that is not a declaration keyword (like in with Module)
+ ((looking-back "with\\s-+" nil) "module") ; lowecase means Module that is not a declaration keyword (like in with Module)
((proof-looking-at "\\(Module\\|Section\\)\\>")
(if (coq-lonely-:=-in-this-command) "Module start" "Module def")))))
@@ -379,6 +379,9 @@ The point should be at the beginning of the command name."
;; we can.
(save-excursion (coq-smie-backward-token)))
+ ;; easier to return directly than calling coq-smie-backward-token
+ ((member tok '("lazymatch" "multimatch")) "match")
+
;; detect "with signature", otherwies use coq-smie-backward-token
((equal tok "with")
(let ((p (point)))
@@ -456,15 +459,13 @@ The point should be at the beginning of the command name."
((member corresp '("Inductive" "CoInductive")) ":= inductive")
((equal corresp "let") ":= let")
((equal corresp "where") ":= inductive") ;; inductive or fixpoint, nevermind
- ((or (looking-back "{")) ":= record")
+ ((or (looking-back "{" nil)) ":= record")
(t ":=")))) ; a parenthesis stopped the search
(defun coq-smie-backward-token ()
- (let* ((tok (smie-default-backward-token))
- (start (save-excursion (coq-find-real-start) (point)))
- (is-tactic (coq-smie-is-tactic)))
+ (let* ((tok (smie-default-backward-token)))
(cond
;; Distinguish between "," from quantification and other uses of
;; "," (tuples, tactic arguments)
@@ -487,8 +488,8 @@ The point should be at the beginning of the command name."
(cond
((member backtok '("." "Ltac")) "; tactic")
((equal backtok nil)
- (if (or (looking-back "(") (looking-back "\\[")
- (and (looking-back "{")
+ (if (or (looking-back "(" nil) (looking-back "\\[")
+ (and (looking-back "{" nil)
(equal (coq-smie-backward-token) "{ subproof"))) ;; recursive call
"; tactic"
"; record"))))))
@@ -504,10 +505,10 @@ The point should be at the beginning of the command name."
(equal (coq-smie-backward-token) "; tactic")) ;; recursive
"|| tactic")
;; this is wrong half of the time but should not harm indentation
- ((and (equal backtok nil) (looking-back "(")) "||")
+ ((and (equal backtok nil) (looking-back "(" nil)) "||")
((equal backtok nil)
- (if (or (looking-back "\\[")
- (and (looking-back "{")
+ (if (or (looking-back "\\[" nil)
+ (and (looking-back "{" nil)
(equal (coq-smie-backward-token) "{ subproof"))) ;; recursive call
"|| tactic"
"||"))))))
@@ -548,7 +549,7 @@ The point should be at the beginning of the command name."
(forward-char -1)
(if (looking-at "{") "{ subproof" "} subproof"))
- ((and (equal tok ":") (looking-back "\\<\\(constr\\|ltac\\)"))
+ ((and (equal tok ":") (looking-back "\\<\\(constr\\|ltac\\|uconstr\\)" nil))
": ltacconstr")
((equal tok ":=")
@@ -698,10 +699,14 @@ Lemma foo: forall n,
:type 'boolean
:group 'coq)
+(defun coq-indent-safep (indent)
+ (>= indent 0))
+
(defcustom coq-indent-proofstart 2
"Number of spaces used to indent after a proof start."
:type 'integer
- :group 'coq)
+ :group 'coq
+ :safe #'coq-indent-safep)
(defcustom coq-indent-semicolon-tactical 2
"Number of spaces used to indent after the first tactical semi colon of a serie.
@@ -718,12 +723,14 @@ Lemma foo: forall n,
tac3;
tac4."
:type 'integer
- :group 'coq)
+ :group 'coq
+ :safe #'coq-indent-safep)
(defcustom coq-indent-modulestart 2
"Number of spaces used to indent after a module or section start."
:type 'integer
- :group 'coq)
+ :group 'coq
+ :safe #'coq-indent-safep)
(defcustom coq-smie-after-bolp-indentation 2
"Number of spaces used to indent after a quantifier *not* on its own line.
@@ -741,7 +748,8 @@ If it is set to 2 (default) it is as follows:
x <= 0 -> x = 0.
"
:type 'integer
- :group 'coq)
+ :group 'coq
+ :safe #'coq-indent-safep)
(defcustom coq-match-indent 2
"Number of space used to indent cases of a match expression.
@@ -754,7 +762,9 @@ match n with
end
Typical values are 2 or 4."
- :type 'integer :group 'coq)
+ :type 'integer
+ :group 'coq
+ :safe #'coq-indent-safep)
;; - TODO: remove tokens "{ subproof" and "} subproof" but they are
;; needed by the lexers at a lot of places.
@@ -959,14 +969,15 @@ KIND is the situation and TOKEN is the thing w.r.t which the rule applies."
;; now ( tac3 ; <- neither here
;; tac5) ;
;; ]
- ((and (equal token "; tactic")
- coq-indent-semicolon-tactical
- (not (coq-smie-is-ltacdef))
- (not (coq-smie-is-inside-parenthesized-tactic)))
- (if (or (not (smie-rule-parent-p "; tactic"))
- (and smie--parent
- (coq-smie--same-line-as-parent
- (nth 1 smie--parent) (point))))
+ ((equal token "; tactic")
+ (if (and (smie-rule-hanging-p)
+ coq-indent-semicolon-tactical
+ (not (coq-smie-is-ltacdef))
+ (not (coq-smie-is-inside-parenthesized-tactic))
+ (or (not (smie-rule-parent-p "; tactic"))
+ (and smie--parent
+ (coq-smie--same-line-as-parent
+ (nth 1 smie--parent) (point)))))
coq-indent-semicolon-tactical
nil))
@@ -984,7 +995,7 @@ KIND is the situation and TOKEN is the thing w.r.t which the rule applies."
;; the command terminated by ". proofstart".
((equal token ". proofstart")
(save-excursion (forward-char -1) (coq-find-real-start)
- `(column . ,(+ coq-indent-modulestart (current-column)))))
+ `(column . ,(+ coq-indent-proofstart (current-column)))))
((equal token ". modulestart")
(save-excursion (forward-char -1) (coq-find-real-start)
`(column . ,(+ coq-indent-modulestart (current-column)))))))
diff --git a/coq/coq-syntax.el b/coq/coq-syntax.el
index 37867dca..2f6104fe 100644
--- a/coq/coq-syntax.el
+++ b/coq/coq-syntax.el
@@ -119,10 +119,9 @@ so for the following reasons:
:group 'coq)
-
+;; user shortcuts are prioritized by being put at the end
(defvar coq-tactics-db
(append
- coq-user-tactics-db
'(
("absurd " "abs" "absurd " t "absurd")
("apply" "ap" "apply " t "apply")
@@ -136,10 +135,12 @@ so for the following reasons:
("autorewrite with in" "arwi" "autorewrite with @{db,db...} in @{hyp}" t)
("autorewrite with using" "arwu" "autorewrite with @{db,db...} using @{tac}" t)
("autorewrite with" "ar" "autorewrite with @{db,db...}" t "autorewrite")
- ("case" "c" "case " t "case")
+ ("case" nil "case " t "case")
("case_eq" "ceq" "case_eq " t "case_eq")
("case_type" "cty" "case_type " t "case_type")
- ("cbv" "cbv" "cbv beta [#] delta iota zeta" t "cbv")
+ ("cbn" "c" "cbn" t "cbn")
+ ("cbn (with flags)" "cbn" "cbn beta delta [#] iota zeta" t "cbn")
+ ("cbv" "cbv" "cbv beta delta [#] iota zeta" t "cbv")
("change in" "chi" "change # in #" t)
("change with in" "chwi" "change # with # in #" t)
("change with" "chw" "change # with" t)
@@ -188,7 +189,8 @@ so for the following reasons:
("eleft" "eleft" "eleft" t "eleft")
("elim using" "elu" "elim # using #" t)
("elim" "e" "elim #" t "elim")
- ("elimtype" "elt" "elimtype" "elimtype")
+ ("elimtype" "elt" "elimtype" t "elimtype")
+ ("enough" "eng" "enough (#: #).\n{ #\n}" t "enough")
("erewrite" "er" "erewrite #" t "erewrite")
("eright" "erig" "eright" "eright")
("esplit" "esp" "esplit" t "esplit")
@@ -226,20 +228,26 @@ so for the following reasons:
("inversion using in" "invui" "inversion # using # in #" t)
("inversion_clear" "invcl" "inversion_clear" t "inversion_clear")
("lapply" "lap" "lapply" t "lapply")
- ("lazy" "lazy" "lazy beta [#] delta iota zeta" t "lazy")
+ ("lazy" "lazy" "lazy beta delta [#] iota zeta" t "lazy")
("lazymatch with" "m" "lazymatch # with\n| # => #\nend")
("left" "left" "left" t "left")
+ ("lia" nil "lia" t "lia")
("linear" "lin" "linear" t "linear")
("load" "load" "load" t "load")
+ ("lra" nil "lra" t "lra")
("move after" "mov" "move # after #" t "move")
("multimatch with" "m" "multimatch # with\n| # => #\nend")
- ("now_show" nil "now_show" t "now_show")
+ ("nia" nil "nia" t "nia")
+ ("now_show" nil "now_show" t "now_show")
+ ("nra" nil "nra" t "nra")
+ ("nsatz" nil "nsatz" t "nsatz")
("omega" "o" "omega" t "omega")
("pattern" "pat" "pattern" t "pattern")
("pattern(s)" "pats" "pattern # , #" t)
("pattern at" "pata" "pattern # at #" t)
("pose" "po" "pose ( # := # )" t "pose")
("prolog" "prol" "prolog" t "prolog")
+ ("psatz" nil "psatz" t "psatz")
("quote" "quote" "quote" t "quote")
("quote []" "quote2" "quote # [#]" t)
("red" "red" "red" t "red")
@@ -258,6 +266,7 @@ so for the following reasons:
("rewrite" "r" "rewrite #" t "rewrite")
("right" "rig" "right" t "right")
;; ("ring" "ring" "ring #" t "ring")
+ ("romega" nil "romega" t "romega")
("set in * |-" "seth" "set ( # := #) in * |-" t)
("set in *" "set*" "set ( # := #) in *" t)
("set in |- *" "setg" "set ( # := #) in |- *" t)
@@ -268,7 +277,8 @@ so for the following reasons:
("setoid_rewrite" "strew" "setoid_rewrite #" t "setoid_rewrite")
("setoid rewrite" "strew" "setoid rewrite #" t "setoid\\s-+rewrite")
("simpl" "s" "simpl" t "simpl")
- ("simpl" "sa" "simpl # at #" t)
+ ("simpl at" "sa" "simpl # at #" t)
+ ("simpl (all flags)" "simpl" "simpl beta delta [#] iota zeta" t)
("simple destruct" "sdes" "simple destruct" t "simple\\s-+destruct")
("simple inversion" "sinv" "simple inversion" t "simple\\s-+inversion")
("simple induction" "sind" "simple induction" t "simple\\s-+induction")
@@ -308,13 +318,14 @@ so for the following reasons:
("unlock" "unlock" "unlock #" t "unlock")
("suffices" "suffices" "suffices # : #" t "suffices")
("suff" "suff" "suff # : #" t "suff")
- ))
+ )
+ coq-user-tactics-db)
"Coq tactics information list. See `coq-syntax-db' for syntax. "
)
+;; user shortcuts are prioritized by being put at the end
(defvar coq-solve-tactics-db
(append
- coq-user-solve-tactics-db
'(
("assumption" "as" "assumption" t "assumption")
("eassumption" "eas" "eassumption" t "eassumption")
@@ -331,25 +342,34 @@ so for the following reasons:
("fail" "fa" "fail" nil)
("field" "field" "field" t "field")
("gfail" "gfa" "gfail" nil "gfail")
+ ("lia" nil "lia" t "lia")
+ ("lra" nil "lra" t "lra")
+ ("nia" nil "nia" t "nia")
+ ("nra" nil "nra" t "nra")
+ ("nsatz" nil "nsatz" t "nsatz")
("omega" "o" "omega" t "omega")
+ ("romega" nil "romega" t "romega")
+ ("psatz" nil "psatz" t "psatz")
("reflexivity" "refl" "reflexivity #" t "reflexivity")
("ring" "ring" "ring #" t "ring")
("solve" nil "solve [ # | # ]" nil "solve")
("tauto" "ta" "tauto" t "tauto")
;; SSReflect solving tactics.
("done" nil "done" nil "done")
- ))
+ )
+ coq-user-solve-tactics-db)
"Coq tactic(al)s that solve a subgoal."
)
(defvar coq-solve-cheat-tactics-db
(append
- coq-user-cheat-tactics-db
'(("admit" nil "admit" t "admit")
- ("Admitted" nil "Admitted" t "Admitted")))
+ ("Admitted" nil "Admitted" t "Admitted"))
+ coq-user-cheat-tactics-db)
"Coq tactic(al)s that solve a subgoal."
)
+;; FIXME is this needed?
(defvar develock-coq-font-lock-keywords
'((develock-find-long-lines
(1 'develock-long-line-1 t)
@@ -363,7 +383,6 @@ so for the following reasons:
(defvar coq-tacticals-db
(append
- coq-user-tacticals-db
'(
("info" nil "info #" nil "info")
("first" nil "first [ # | # ]" nil "first")
@@ -382,7 +401,8 @@ so for the following reasons:
("||" nil "# || #" nil)
;; SSReflect tacticals.
("last" "lst" nil t "last")
- ))
+ )
+ coq-user-tacticals-db)
"Coq tacticals information list. See `coq-syntax-db' for syntax.")
@@ -390,6 +410,7 @@ so for the following reasons:
(defvar coq-decl-db
'(
+ ("Local Axiom" nil "Local Axiom # : #" t "Local\\s-+Axiom")
("Axiom" "ax" "Axiom # : #" t "Axiom")
("Global Variable" "gv" "Global Variable #: #." t "Global\\s-+Variable")
("Global Variables" "gvs" "Global Variables # , #: #." t "Global\\s-+Variables")
@@ -400,6 +421,7 @@ so for the following reasons:
("Hint Rewrite ->" "hrw" "Hint Rewrite -> @{t1,t2...} using @{tac} : @{db}." t "Hint\\s-+Rewrite")
("Hint Rewrite <-" "hrw" "Hint Rewrite <- @{t1,t2...} using @{tac} : @{db}." t )
("Hint Unfold" "hu" "Hint Unfold # : #." t "Hint\\s-+Unfold")
+ ("Existing Class" nil "Existing Class " t "Existing\\s-+Class")
("Existing Instance" nil "Existing Instance " t "Existing\\s-+Instance")
("Existing Instances" nil "Existing Instances " t "Existing\\s-+Instances")
("Hypothesis" "hyp" "Hypothesis #: #" t "Hypothesis")
@@ -409,6 +431,8 @@ so for the following reasons:
("Conjecture" "conj" "Conjecture #: #." t "Conjecture")
("Variable" "v" "Variable #: #." t "Variable")
("Variables" "vs" "Variables # , #: #." t "Variables")
+ ("Context" nil "Context #, (# : #)." t "Context")
+ ("Local Coercion" nil "Local Coercion @{id} : @{typ1} >-> @{typ2}." t "Local\\s-+Coercion")
("Coercion" "coerc" "Coercion @{id} : @{typ1} >-> @{typ2}." t "Coercion")
)
"Coq declaration keywords information list. See `coq-syntax-db' for syntax."
@@ -425,6 +449,7 @@ so for the following reasons:
("Declare Module Import <: :=" "dmi2" "Declare Module # <: # := #." t);; careful
("Declare Module Export : :=" "dme" "Declare Module # : # := #." t)
("Declare Module Export <: :=" "dme2" "Declare Module # <: # := #." t);; careful
+ ("Local Definition" nil "Local Definition #:# := #." t "Local\\s-+Definition");; careful
("Definition" "def" "Definition #:# := #." t "Definition");; careful
("Definition (2 args)" "def2" "Definition # (# : #) (# : #):# := #." t)
("Definition (3 args)" "def3" "Definition # (# : #) (# : #) (# : #):# := #." t)
@@ -455,6 +480,7 @@ so for the following reasons:
("Instance" nil "Instance #:#.\nProof.\n#Defined." t "Instance")
("Program Instance" "pinstance" "Program Instance [ # ] => # where \n# := #;\n# := #." t "Program\\s-+Instance")
("Let" "Let" "Let # : # := #." t "Let")
+ ("Local Ltac" nil "Local Ltac # := #" t "Local\\s-+Ltac")
("Ltac" "ltac" "Ltac # := #" t "Ltac")
("Module :=" "mo" "Module # : # := #." t ) ; careful
("Module <: :=" "mo2" "Module # <: # := #." t ) ; careful
@@ -517,6 +543,7 @@ so for the following reasons:
'(
("About" nil "About #." nil "About")
("Check" nil "Check" nil "Check")
+ ("Fail" nil "Fail" nil "fail")
("Inspect" nil "Inspect #." nil "Inspect")
("Locate File" nil "Locate File \"#\"." nil "Locate\\s-+File")
("Locate Library" nil "Locate Library #." nil "Locate\\s-+Library")
@@ -531,133 +558,344 @@ so for the following reasons:
("SearchPattern" nil "SearchPattern (#)" nil "SearchPattern")
("SearchRewrite" nil "SearchRewrite #" nil "SearchRewrite")
("Show" nil "Show #." nil "Show")
- ("Test" nil "Test" nil "Test" nil t)
- ("Test Printing Depth" nil "Test Printing Depth." nil "Test\\s-+Printing\\s-+Depth")
- ("Test Printing If" nil "Test Printing If #." nil "Test\\s-+Printing\\s-+If")
- ("Test Printing Let" nil "Test Printing Let #." nil "Test\\s-+Printing\\s-+Let")
- ("Test Printing Synth" nil "Test Printing Synth." nil "Test\\s-+Printing\\s-+Synth")
- ("Test Printing Width" nil "Test Printing Width." nil "Test\\s-+Printing\\s-+Width")
- ("Test Printing Wildcard" nil "Test Printing Wildcard." nil "Test\\s-+Printing\\s-+Wildcard")
+ ("Test" nil "Test" nil "Test" nil t) ; let us not highlight all possible options for Test
+ ("Timeout" nil "Timeout" nil "Timeout")
)
"Coq queries command, that deserve a separate menu for sending them to coq without insertion. "
)
-
;; command that are not declarations, definition or goal starters
(defvar coq-other-commands-db
- '(
- ("Add Parametric Relation" nil "Add Parametric Relation : " t "Add\\s-+Parametric\\s-+Relation")
- ("BeginSubproof" "bs" "BeginSubproof.\n#\nEndSubproof." t "BeginSubproof")
- ("EndSubproof" "es" "EndSubproof.#" t "EndSubproof")
- ;; ("Abort" nil "Abort." t "Abort" nil nil);don't appear in menu
-; ("Add" nil "Add #." nil "Add" nil t)
- ("Add Abstract Ring" nil "Add Abstract Ring #." t "Add\\s-+Abstract\\s-+Ring")
- ("Add Abstract Semi Ring" nil "Add Abstract Semi Ring #." t "Add\\s-+Abstract\\s-+Semi\\s-+Ring")
- ("Add Field" nil "Add Field #." t "Add\\s-+Field")
- ("Add LoadPath" nil "Add LoadPath #." nil "Add\\s-+LoadPath")
- ("Add ML Path" nil "Add ML Path #." nil "Add\\s-+ML\\s-+Path")
- ("Add Printing" nil "Add Printing #." t "Add\\s-+Printing")
- ("Add Printing If" nil "Add Printing If #." t "Add\\s-+Printing\\s-+If")
- ("Add Printing Let" nil "Add Printing Let #." t "Add\\s-+Printing\\s-+Let")
- ("Add Rec LoadPath" nil "Add Rec LoadPath #." nil "Add\\s-+Rec\\s-+LoadPath")
- ("Add Rec ML Path" nil "Add Rec ML Path #." nil "Add\\s-+Rec\\s-+ML\\s-+Path")
- ("Add Ring" nil "Add Ring #." t "Add\\s-+Ring")
- ("Add Semi Ring" nil "Add Semi Ring #." t "Add\\s-+Semi\\s-+Ring")
- ("Add Setoid" nil "Add Setoid #." t "Add\\s-+Setoid")
- ("Admit Obligations" "oblsadmit" "Admit Obligations." nil "Admit\\s-+Obligations")
- ("Arguments Scope" "argsc" "Arguments Scope @{id} [ @{_} ]" t "Arguments\\s-+Scope")
- ("Arguments" "args" "Arguments @{id} : @{rule}" t "Arguments")
- ("Bind Scope" "bndsc" "Bind Scope @{scope} with @{type}" t "Bind\\s-+Scope")
- ("Canonical Structure" nil "Canonical Structure #." t "Canonical\\s-+Structure")
- ("Cd" nil "Cd #." nil "Cd")
- ("Local Close Scope" "lclsc" "Local Close Scope #" t "Local\\s-+Close\\s-+Scope")
- ("Close Scope" "clsc" "Close Scope #" t "Close\\s-+Scope")
- ("Comments" nil "Comments #." nil "Comments")
- ("Declare" nil "Declare #." nil "Declare")
- ("Delimit Scope" "delsc" "Delimit Scope @{scope} with @{id}." t "Delimit\\s-+Scope" )
- ("Eval" nil "Eval #." nil "Eval")
- ("Export" nil "Export #." t "Export")
- ("Extract Constant" "extrc" "Extract Constant @{id} => \"@{id}\"." nil "Extract\\s-+Constant")
- ("Extract Inlined Constant" "extric" "Extract Inlined Constant @{id} => \"@{id}\"." nil "Extract\\s-+Inlined\\s-+Constant")
- ("Extract Inductive" "extri" "Extract Inductive @{id} => \"@{id}\" [\"@{id}\" \"@{id...}\"]." nil "Extract")
- ("Extraction (in a file)" "extrf" "Extraction \"@{file}\" @{id}." nil)
- ("Extraction Inline" nil "Extraction Inline #." t "Extraction\\s-+Inline")
- ("Extraction NoInline" nil "Extraction NoInline #." t "Extraction\\s-+NoInline")
- ("Extraction Language" "extrlang" "Extraction Language #." t "Extraction\\s-+Language")
- ("Extraction Library" "extrl" "Extraction Library @{id}." nil "Extraction\\s-+Library")
- ("Extraction" "extr" "Extraction @{id}." nil "Extraction")
- ("Focus" nil "Focus #." nil "Focus")
- ("Generalizable Variables" nil "Generalizable Variables #." t "Generalizable\\s-+Variables")
- ("Generalizable All Variables" nil "Generalizable All Variables." t "Generalizable\\s-+All\\s-+Variables")
- ("Identity Coercion" nil "Identity Coercion #." t "Identity\\s-+Coercion")
- ("Implicit Arguments Off" nil "Implicit Arguments Off." t "Implicit\\s-+Arguments\\s-+Off")
- ("Implicit Arguments On" nil "Implicit Arguments On." t "Implicit\\s-+Arguments\\s-+On")
- ("Implicit Arguments" nil "Implicit Arguments # [#]." t "Implicit\\s-+Arguments")
- ("Implicit Types" nil "Implicit Types # : #." t "Implicit\\s-+Types")
- ("Import" nil "Import #." t "Import")
- ("Infix" "inf" "Infix \"#\" := # (at level #) : @{scope}." t "Infix")
- ("Notation (assoc)" "notas" "Notation \"#\" := # (at level #, # associativity)." t)
- ("Notation (at assoc)" "notassc" "Notation \"#\" := # (at level #, # associativity) : @{scope}." t)
- ("Notation (at at scope)" "notasc" "Notation \"#\" := # (at level #, # at level #) : @{scope}." t)
- ("Notation (at at)" "nota" "Notation \"#\" := # (at level #, # at level #)." t)
- ("Notation (only parsing)" "notsp" "Notation # := # (only parsing)." t)
- ("Local Notation" "lnots" "Local Notation # := #." t "Local\\s-+Notation")
- ("Local Notation (only parsing)" "lnotsp" "Local Notation # := # (only parsing)." t)
- ("Notation (simple)" "nots" "Notation # := #." t "Notation")
- ("Typeclasses Opaque" nil "Typeclasses Opaque #." nil "Typeclasses\\s-+Opaque")
- ("Opaque" nil "Opaque #." nil "Opaque")
- ("Obligation Tactic" nil "Obligation Tactic := #." t "Obligation\\s-+Tactic")
- ("Local Open Scope" nil "Local Open Scope #" t "Local\\s-+Open\\s-+Scope")
- ("Open Local Scope" nil "Open Local Scope #" t "Open\\s-+Local\\s-+Scope")
- ("Open Scope" "opsc" "Open Scope #" t "Open\\s-+Scope")
- ("Preterm" nil "Preterm." nil "Preterm")
- ("Qed" nil "Qed." nil "Qed")
- ("Recursive Extraction" "recextr" "Recursive Extraction @{id}." nil "Recursive\\s-+Extraction")
- ("Recursive Extraction Library" "recextrl" "Recursive Extraction Library @{id}." nil "Recursive\\s-+Extraction\\s-+Library")
- ("Recursive Extraction Module" "recextrm" "Recursive Extraction Module @{id}." nil "Recursive\\s-+Extraction\\s-+Module")
- ("Remove LoadPath" nil "Remove LoadPath" nil "Remove\\s-+LoadPath")
- ("Remove LoadPath" nil "Remove LoadPath" nil "Remove\\s-+LoadPath")
- ("Remove Printing If" nil "Remove Printing If #." t "Remove\\s-+Printing\\s-+If")
- ("Remove Printing Let" nil "Remove Printing Let #." t "Remove\\s-+Printing\\s-+Let")
- ("Require Export" nil "Require Export #." t "Require\\s-+Export")
- ("Require Import" nil "Require Import #." t "Require\\s-+Import")
- ("Require" nil "Require #." t "Require")
- ("Reserved Notation" nil "Reserved Notation" nil "Reserved\\s-+Notation")
- ("Reset Extraction Inline" nil "Reset Extraction Inline." t "Reset\\s-+Extraction\\s-+Inline")
- ("Save" nil "Save." t "Save")
- ("Set Extraction AutoInline" nil "Set Extraction AutoInline" t "Set\\s-+Extraction\\s-+AutoInline")
- ("Set Extraction Optimize" nil "Set Extraction Optimize" t "Set\\s-+Extraction\\s-+Optimize")
- ("Set Implicit Arguments" nil "Set Implicit Arguments" t "Set\\s-+Implicit\\s-+Arguments")
- ("Set Strict Implicit" nil "Set Strict Implicit" t "Set\\s-+Strict\\s-+Implicit")
- ("Set Printing Synth" nil "Set Printing Synth" t "Set\\s-+Printing\\s-+Synth")
- ("Set Printing Wildcard" nil "Set Printing Wildcard" t "Set\\s-+Printing\\s-+Wildcard")
- ("Set Printing All" "sprall" "Set Printing All" t "Set\\s-+Printing\\s-+All")
- ("Set Hyps Limit" nil "Set Hyps Limit #." nil "Set\\s-+Hyps\\s-+Limit")
- ("Set Printing Coercions" nil "Set Printing Coercions." t "Set\\s-+Printing\\s-+Coercions")
- ("Set Printing Notations" "sprn" "Set Printing Notations" t "Set\\s-+Printing\\s-+Notations")
- ("Set Undo" nil "Set Undo #." nil "Set\\s-+Undo")
- ("Solve Obligations" "oblssolve" "Solve Obligations using #." t "Solve\\s-+Obligations")
- ("Tactic Notation" nil "Tactic Notation # := #." t "Tactic\\s-+Notation")
- ("Transparent" nil "Transparent #." nil "Transparent")
-
- ("Unfocus" nil "Unfocus." nil "Unfocus")
- ("Unset Extraction AutoInline" nil "Unset Extraction AutoInline" t "Unset\\s-+Extraction\\s-+AutoInline")
- ("Unset Extraction Optimize" nil "Unset Extraction Optimize" t "Unset\\s-+Extraction\\s-+Optimize")
- ("Unset Implicit Arguments" nil "Unset Implicit Arguments" t "Unset\\s-+Implicit\\s-+Arguments")
- ("Unset Strict Implicit" nil "Unset Strict Implicit" t "Unset\\s-+Strict\\s-+Implicit")
- ("Unset Printing Synth" nil "Unset Printing Synth" t "Unset\\s-+Printing\\s-+Synth")
- ("Unset Printing Wildcard" nil "Unset Printing Wildcard" t "Unset\\s-+Printing\\s-+Wildcard")
- ("Unset Hyps Limit" nil "Unset Hyps Limit" nil "Unset\\s-+Hyps\\s-+Limit")
- ("Unset Printing All" "unsprall" "Unset Printing All" nil "Unset\\s-+Printing\\s-+All")
- ("Unset Printing Coercion" nil "Unset Printing Coercion #." t "Unset\\s-+Printing\\s-+Coercion")
- ("Unset Printing Coercions" nil "Unset Printing Coercions." nil "Unset\\s-+Printing\\s-+Coercions")
- ("Unset Printing Notations" "unsprn" "Unset Printing Notations" nil "Unset\\s-+Printing\\s-+Notations")
- ("Unset Undo" nil "Unset Undo." nil "Unset\\s-+Undo")
- ; ("print" "pr" "print #" "print")
- )
+ '(
+ ("Add Parametric Relation" nil "Add Parametric Relation : " t "Add\\s-+Parametric\\s-+Relation")
+ ;; ("Abort" nil "Abort." t "Abort" nil nil);don't appear in menu
+ ;; ("Add" nil "Add #." nil "Add" nil t)
+ ("Add Abstract Ring" nil "Add Abstract Ring #." t "Add\\s-+Abstract\\s-+Ring")
+ ("Add Abstract Semi Ring" nil "Add Abstract Semi Ring #." t "Add\\s-+Abstract\\s-+Semi\\s-+Ring")
+ ("Add Field" nil "Add Field #." t "Add\\s-+Field")
+ ("Add LoadPath" nil "Add LoadPath #." nil "Add\\s-+LoadPath")
+ ("Add ML Path" nil "Add ML Path #." nil "Add\\s-+ML\\s-+Path")
+ ("Add Printing" nil "Add Printing #." t "Add\\s-+Printing")
+ ("Add Printing If" nil "Add Printing If #." t "Add\\s-+Printing\\s-+If")
+ ("Add Printing Let" nil "Add Printing Let #." t "Add\\s-+Printing\\s-+Let")
+ ("Add Rec LoadPath" nil "Add Rec LoadPath #." nil "Add\\s-+Rec\\s-+LoadPath")
+ ("Add Rec ML Path" nil "Add Rec ML Path #." nil "Add\\s-+Rec\\s-+ML\\s-+Path")
+ ("Add Ring" nil "Add Ring #." t "Add\\s-+Ring")
+ ("Add Semi Ring" nil "Add Semi Ring #." t "Add\\s-+Semi\\s-+Ring")
+ ("Add Setoid" nil "Add Setoid #." t "Add\\s-+Setoid")
+ ("Admit Obligations" "oblsadmit" "Admit Obligations." nil "Admit\\s-+Obligations")
+ ("Arguments Scope" "argsc" "Arguments Scope @{id} [ @{_} ]" t "Arguments\\s-+Scope")
+ ("Local Arguments" nil "Local Arguments @{id} : @{rule}" t "Local\\s-+Arguments")
+ ("Arguments" "args" "Arguments @{id} : @{rule}" t "Arguments")
+ ("Bind Scope" "bndsc" "Bind Scope @{scope} with @{type}" t "Bind\\s-+Scope")
+ ("Canonical Structure" nil "Canonical Structure #." t "Canonical\\s-+Structure")
+ ("Cd" nil "Cd #." nil "Cd")
+ ("Local Close Scope" "lclsc" "Local Close Scope #" t "Local\\s-+Close\\s-+Scope")
+ ("Close Scope" "clsc" "Close Scope #" t "Close\\s-+Scope")
+ ("Comments" nil "Comments #." nil "Comments")
+ ("Declare" nil "Declare #." nil "Declare")
+ ("Delimit Scope" "delsc" "Delimit Scope @{scope} with @{id}." t "Delimit\\s-+Scope" )
+ ("Eval" nil "Eval #." nil "Eval")
+ ("Export" nil "Export #." t "Export")
+ ("Extract Constant" "extrc" "Extract Constant @{id} => \"@{id}\"." nil "Extract\\s-+Constant")
+ ("Extract Inlined Constant" "extric" "Extract Inlined Constant @{id} => \"@{id}\"." nil "Extract\\s-+Inlined\\s-+Constant")
+ ("Extract Inductive" "extri" "Extract Inductive @{id} => \"@{id}\" [\"@{id}\" \"@{id...}\"]." nil "Extract")
+ ("Extraction (in a file)" "extrf" "Extraction \"@{file}\" @{id}." nil)
+ ("Extraction Inline" nil "Extraction Inline #." t "Extraction\\s-+Inline")
+ ("Extraction NoInline" nil "Extraction NoInline #." t "Extraction\\s-+NoInline")
+ ("Extraction Language" "extrlang" "Extraction Language #." t "Extraction\\s-+Language")
+ ("Extraction Library" "extrl" "Extraction Library @{id}." nil "Extraction\\s-+Library")
+ ("Extraction" "extr" "Extraction @{id}." nil "Extraction")
+ ("Focus" nil "Focus #." nil "Focus")
+ ("Generalizable Variables" nil "Generalizable Variables #." t "Generalizable\\s-+Variables")
+ ("Generalizable All Variables" nil "Generalizable All Variables." t "Generalizable\\s-+All\\s-+Variables")
+ ("Identity Coercion" nil "Identity Coercion #." t "Identity\\s-+Coercion")
+ ("Implicit Arguments Off" nil "Implicit Arguments Off." t "Implicit\\s-+Arguments\\s-+Off")
+ ("Implicit Arguments On" nil "Implicit Arguments On." t "Implicit\\s-+Arguments\\s-+On")
+ ("Implicit Arguments" nil "Implicit Arguments # [#]." t "Implicit\\s-+Arguments")
+ ("Implicit Types" nil "Implicit Types # : #." t "Implicit\\s-+Types")
+ ("Import" nil "Import #." t "Import")
+ ("Include" nil "Include #." t "Include")
+ ("Infix" "inf" "Infix \"#\" := # (at level #) : @{scope}." t "Infix")
+ ("Notation (assoc)" "notas" "Notation \"#\" := # (at level #, # associativity)." t)
+ ("Notation (at assoc)" "notassc" "Notation \"#\" := # (at level #, # associativity) : @{scope}." t)
+ ("Notation (at at scope)" "notasc" "Notation \"#\" := # (at level #, # at level #) : @{scope}." t)
+ ("Notation (at at)" "nota" "Notation \"#\" := # (at level #, # at level #)." t)
+ ("Notation (only parsing)" "notsp" "Notation # := # (only parsing)." t)
+ ("Local Notation" "lnots" "Local Notation # := #." t "Local\\s-+Notation")
+ ("Local Notation (only parsing)" "lnotsp" "Local Notation # := # (only parsing)." t)
+ ("Notation (simple)" "nots" "Notation # := #." t "Notation")
+ ("Typeclasses Opaque" nil "Typeclasses Opaque #." nil "Typeclasses\\s-+Opaque")
+ ("Opaque" nil "Opaque #." nil "Opaque")
+ ("Obligation Tactic" nil "Obligation Tactic := #." t "Obligation\\s-+Tactic")
+ ("Local Open Scope" nil "Local Open Scope #" t "Local\\s-+Open\\s-+Scope")
+ ("Open Local Scope" nil "Open Local Scope #" t "Open\\s-+Local\\s-+Scope")
+ ("Open Scope" "opsc" "Open Scope #" t "Open\\s-+Scope")
+ ("Preterm" nil "Preterm." nil "Preterm")
+ ("Qed" nil "Qed." nil "Qed")
+ ("Recursive Extraction" "recextr" "Recursive Extraction @{id}." nil "Recursive\\s-+Extraction")
+ ("Recursive Extraction Library" "recextrl" "Recursive Extraction Library @{id}." nil "Recursive\\s-+Extraction\\s-+Library")
+ ("Recursive Extraction Module" "recextrm" "Recursive Extraction Module @{id}." nil "Recursive\\s-+Extraction\\s-+Module")
+ ("Remove LoadPath" nil "Remove LoadPath" nil "Remove\\s-+LoadPath")
+ ("Remove LoadPath" nil "Remove LoadPath" nil "Remove\\s-+LoadPath")
+ ("Remove Printing If" nil "Remove Printing If #." t "Remove\\s-+Printing\\s-+If")
+ ("Remove Printing Let" nil "Remove Printing Let #." t "Remove\\s-+Printing\\s-+Let")
+ ("Require Export" nil "Require Export #." t "Require\\s-+Export")
+ ("Require Import" nil "Require Import #." t "Require\\s-+Import")
+ ("Require" nil "Require #." t "Require")
+ ("Reserved Infix" nil "Reserved Infix" nil "Reserved\\s-+Infix")
+ ("Reserved Notation" nil "Reserved Notation" nil "Reserved\\s-+Notation")
+ ("Reset Extraction Inline" nil "Reset Extraction Inline." t "Reset\\s-+Extraction\\s-+Inline")
+ ("Save" nil "Save." t "Save")
+ ("Set Asymmetric Patterns" nil "Set Asymmetric Patterns" t "Set Asymmetric\\s-+Patterns")
+ ("Set Atomic Load" nil "Set Atomic Load" t "Set Atomic\\s-+Load")
+ ("Set Automatic Coercions Import" nil "Set Automatic Coercions Import" t "Set Automatic\\s-+Coercions\\s-+Import")
+ ("Set Automatic Introduction" nil "Set Automatic Introduction" t "Set Automatic\\s-+Introduction")
+ ("Set Boolean Equality Schemes" nil "Set Boolean Equality Schemes" t "Set Boolean\\s-+Equality\\s-+Schemes")
+ ("Set Bracketing Last Introduction Pattern" nil "Set Bracketing Last Introduction Pattern" t "Set Bracketing\\s-+Last\\s-+Introduction\\s-+Pattern")
+ ("Set Bullet Behavior" nil "Set Bullet Behavior" t "Set Bullet\\s-+Behavior")
+ ("Set Case Analysis Schemes" nil "Set Case Analysis Schemes" t "Set Case\\s-+Analysis\\s-+Schemes")
+ ("Set Compat Notations" nil "Set Compat Notations" t "Set Compat\\s-+Notations")
+ ("Set Congruence Depth" nil "Set Congruence Depth" t "Set Congruence\\s-+Depth")
+ ("Set Congruence Verbose" nil "Set Congruence Verbose" t "Set Congruence\\s-+Verbose")
+ ("Set Contextual Implicit" nil "Set Contextual Implicit" t "Set Contextual\\s-+Implicit")
+ ("Set Debug Auto" nil "Set Debug Auto" t "Set Debug\\s-+Auto")
+ ("Set Debug Eauto" nil "Set Debug Eauto" t "Set Debug\\s-+Eauto")
+ ("Set Debug RAKAM" nil "Set Debug RAKAM" t "Set Debug\\s-+RAKAM")
+ ("Set Debug Tactic Unification" nil "Set Debug Tactic Unification" t "Set Debug\\s-+Tactic\\s-+Unification")
+ ("Set Debug Trivial" nil "Set Debug Trivial" t "Set Debug\\s-+Trivial")
+ ("Set Debug Unification" nil "Set Debug Unification" t "Set Debug\\s-+Unification")
+ ("Set Decidable Equality Schemes" nil "Set Decidable Equality Schemes" t "Set Decidable\\s-+Equality\\s-+Schemes")
+ ("Set Default Clearing Used Hypotheses" nil "Set Default Clearing Used Hypotheses" t "Set Default\\s-+Clearing\\s-+Used\\s-+Hypotheses")
+ ("Set Default Goal Selector" nil "Set Default Goal Selector" t "Set Default\\s-+Goal\\s-+Selector")
+ ("Set Default Proof Mode" nil "Set Default Proof Mode" t "Set Default\\s-+Proof\\s-+Mode")
+ ("Set Default Proof Using" nil "Set Default Proof Using" t "Set Default\\s-+Proof\\s-+Using")
+ ("Set Default Timeout" nil "Set Default Timeout" t "Set Default\\s-+Timeout")
+ ("Set Dependent Propositions Elimination" nil "Set Dependent Propositions Elimination" t "Set Dependent\\s-+Propositions\\s-+Elimination")
+ ("Set Discriminate Introduction" nil "Set Discriminate Introduction" t "Set Discriminate\\s-+Introduction")
+ ("Set Dump Bytecode" nil "Set Dump Bytecode" t "Set Dump\\s-+Bytecode")
+ ("Set Elimination Schemes" nil "Set Elimination Schemes" t "Set Elimination\\s-+Schemes")
+ ("Set Equality Scheme" nil "Set Equality Scheme" t "Set Equality\\s-+Scheme")
+ ("Set Extraction AccessOpaque" nil "Set Extraction AccessOpaque" t "Set Extraction\\s-+AccessOpaque")
+ ("Set Extraction AutoInline" nil "Set Extraction AutoInline" t "Set Extraction\\s-+AutoInline")
+ ("Set Extraction Conservative Types" nil "Set Extraction Conservative Types" t "Set Extraction\\s-+Conservative\\s-+Types")
+ ("Set Extraction File Comment" nil "Set Extraction File Comment" t "Set Extraction\\s-+File\\s-+Comment")
+ ("Set Extraction Flag" nil "Set Extraction Flag" t "Set Extraction\\s-+Flag")
+ ("Set Extraction KeepSingleton" nil "Set Extraction KeepSingleton" t "Set Extraction\\s-+KeepSingleton")
+ ("Set Extraction Optimize" nil "Set Extraction Optimize" t "Set Extraction\\s-+Optimize")
+ ("Set Extraction SafeImplicits" nil "Set Extraction SafeImplicits" t "Set Extraction\\s-+SafeImplicits")
+ ("Set Extraction TypeExpand" nil "Set Extraction TypeExpand" t "Set Extraction\\s-+TypeExpand")
+ ("Set Firstorder Depth" nil "Set Firstorder Depth" t "Set Firstorder\\s-+Depth")
+ ("Set Hide Obligations" nil "Set Hide Obligations" t "Set Hide\\s-+Obligations")
+ ("Set Implicit Arguments" nil "Set Implicit Arguments" t "Set Implicit\\s-+Arguments")
+ ("Set Info Auto" nil "Set Info Auto" t "Set Info\\s-+Auto")
+ ("Set Info Eauto" nil "Set Info Eauto" t "Set Info\\s-+Eauto")
+ ("Set Info Level" nil "Set Info Level" t "Set Info\\s-+Level")
+ ("Set Info Trivial" nil "Set Info Trivial" t "Set Info\\s-+Trivial")
+ ("Set Injection L2R Pattern Order" nil "Set Injection L2R Pattern Order" t "Set Injection\\s-+L2R\\s-+Pattern\\s-+Order")
+ ("Set Injection On Proofs" nil "Set Injection On Proofs" t "Set Injection\\s-+On\\s-+Proofs")
+ ("Set Inline Level" nil "Set Inline Level" t "Set Inline\\s-+Level")
+ ("Set Intuition Iff Unfolding" nil "Set Intuition Iff Unfolding" t "Set Intuition\\s-+Iff\\s-+Unfolding")
+ ("Set Intuition Negation Unfolding" nil "Set Intuition Negation Unfolding" t "Set Intuition\\s-+Negation\\s-+Unfolding")
+ ("Set Kernel Term Sharing" nil "Set Kernel Term Sharing" t "Set Kernel\\s-+Term\\s-+Sharing")
+ ("Set Keyed Unification" nil "Set Keyed Unification" t "Set Keyed\\s-+Unification")
+ ("Set Loose Hint Behavior" nil "Set Loose Hint Behavior" t "Set Loose\\s-+Hint\\s-+Behavior")
+ ("Set Maximal Implicit Insertion" nil "Set Maximal Implicit Insertion" t "Set Maximal\\s-+Implicit\\s-+Insertion")
+ ("Set Nonrecursive Elimination Schemes" nil "Set Nonrecursive Elimination Schemes" t "Set Nonrecursive\\s-+Elimination\\s-+Schemes")
+ ("Set Parsing Explicit" nil "Set Parsing Explicit" t "Set Parsing\\s-+Explicit")
+ ("Set Primitive Projections" nil "Set Primitive Projections" t "Set Primitive\\s-+Projections")
+ ("Set Printing All" nil "Set Printing All" t "Set Printing\\s-+All")
+ ("Set Printing Coercions" nil "Set Printing Coercions" t "Set Printing\\s-+Coercions")
+ ("Set Printing Depth" nil "Set Printing Depth" t "Set Printing\\s-+Depth")
+ ("Set Printing Existential Instances" nil "Set Printing Existential Instances" t "Set Printing\\s-+Existential\\s-+Instances")
+ ("Set Printing Implicit" nil "Set Printing Implicit" t "Set Printing\\s-+Implicit")
+ ("Set Printing Implicit Defensive" nil "Set Printing Implicit Defensive" t "Set Printing\\s-+Implicit\\s-+Defensive")
+ ("Set Printing Matching" nil "Set Printing Matching" t "Set Printing\\s-+Matching")
+ ("Set Printing Notations" nil "Set Printing Notations" t "Set Printing\\s-+Notations")
+ ("Set Printing Primitive Projection Compatibility" nil "Set Printing Primitive Projection Compatibility" t "Set Printing\\s-+Primitive\\s-+Projection\\s-+Compatibility")
+ ("Set Printing Primitive Projection Parameters" nil "Set Printing Primitive Projection Parameters" t "Set Printing\\s-+Primitive\\s-+Projection\\s-+Parameters")
+ ("Set Printing Projections" nil "Set Printing Projections" t "Set Printing\\s-+Projections")
+ ("Set Printing Records" nil "Set Printing Records" t "Set Printing\\s-+Records")
+ ("Set Printing Synth" nil "Set Printing Synth" t "Set Printing\\s-+Synth")
+ ("Set Printing Universes" nil "Set Printing Universes" t "Set Printing\\s-+Universes")
+ ("Set Printing Width" nil "Set Printing Width" t "Set Printing\\s-+Width")
+ ("Set Printing Wildcard" nil "Set Printing Wildcard" t "Set Printing\\s-+Wildcard")
+ ("Set Program Mode" nil "Set Program Mode" t "Set Program\\s-+Mode")
+ ("Set Proof Using Clear Unused" nil "Set Proof Using Clear Unused" t "Set Proof\\s-+Using\\s-+Clear\\s-+Unused")
+ ("Set Record Elimination Schemes" nil "Set Record Elimination Schemes" t "Set Record\\s-+Elimination\\s-+Schemes")
+ ("Set Refine Instance Mode" nil "Set Refine Instance Mode" t "Set Refine\\s-+Instance\\s-+Mode")
+ ("Set Regular Subst Tactic" nil "Set Regular Subst Tactic" t "Set Regular\\s-+Subst\\s-+Tactic")
+ ("Set Reversible Pattern Implicit" nil "Set Reversible Pattern Implicit" t "Set Reversible\\s-+Pattern\\s-+Implicit")
+ ("Set Rewriting Schemes" nil "Set Rewriting Schemes" t "Set Rewriting\\s-+Schemes")
+ ("Set Short Module Printing" nil "Set Short Module Printing" t "Set Short\\s-+Module\\s-+Printing")
+ ("Set Shrink Obligations" nil "Set Shrink Obligations" t "Set Shrink\\s-+Obligations")
+ ("Set SimplIsCbn" nil "Set SimplIsCbn" t "Set SimplIsCbn")
+ ("Set Standard Proposition Elimination Names" nil "Set Standard Proposition Elimination Names" t "Set Standard\\s-+Proposition\\s-+Elimination\\s-+Names")
+ ("Set Strict Proofs" nil "Set Strict Proofs" t "Set Strict\\s-+Proofs")
+ ("Set Strict Universe Declaration" nil "Set Strict Universe Declaration" t "Set Strict\\s-+Universe\\s-+Declaration")
+ ("Set Strongly Strict Implicit" nil "Set Strongly Strict Implicit" t "Set Strongly\\s-+Strict\\s-+Implicit")
+ ("Set Suggest Proof Using" nil "Set Suggest Proof Using" t "Set Suggest\\s-+Proof\\s-+Using")
+ ("Set Tactic Compat Context" nil "Set Tactic Compat Context" t "Set Tactic\\s-+Compat\\s-+Context")
+ ("Set Tactic Evars Pattern Unification" nil "Set Tactic Evars Pattern Unification" t "Set Tactic\\s-+Evars\\s-+Pattern\\s-+Unification")
+ ("Set Tactic Pattern Unification" nil "Set Tactic Pattern Unification" t "Set Tactic\\s-+Pattern\\s-+Unification")
+ ("Set Transparent Obligations" nil "Set Transparent Obligations" t "Set Transparent\\s-+Obligations")
+ ("Set Typeclass Resolution After Apply" nil "Set Typeclass Resolution After Apply" t "Set Typeclass\\s-+Resolution\\s-+After\\s-+Apply")
+ ("Set Typeclass Resolution For Conversion" nil "Set Typeclass Resolution For Conversion" t "Set Typeclass\\s-+Resolution\\s-+For\\s-+Conversion")
+ ("Set Typeclasses Debug" nil "Set Typeclasses Debug" t "Set Typeclasses\\s-+Debug")
+ ("Set Typeclasses Dependency Order" nil "Set Typeclasses Dependency Order" t "Set Typeclasses\\s-+Dependency\\s-+Order")
+ ("Set Typeclasses Depth" nil "Set Typeclasses Depth" t "Set Typeclasses\\s-+Depth")
+ ("Set Typeclasses Modulo Eta" nil "Set Typeclasses Modulo Eta" t "Set Typeclasses\\s-+Modulo\\s-+Eta")
+ ("Set Typeclasses Strict Resolution" nil "Set Typeclasses Strict Resolution" t "Set Typeclasses\\s-+Strict\\s-+Resolution")
+ ("Set Typeclasses Unique Instances" nil "Set Typeclasses Unique Instances" t "Set Typeclasses\\s-+Unique\\s-+Instances")
+ ("Set Typeclasses Unique Solutions" nil "Set Typeclasses Unique Solutions" t "Set Typeclasses\\s-+Unique\\s-+Solutions")
+ ("Set Universal Lemma Under Conjunction" nil "Set Universal Lemma Under Conjunction" t "Set Universal\\s-+Lemma\\s-+Under\\s-+Conjunction")
+ ("Set Universe Minimization ToSet" nil "Set Universe Minimization ToSet" t "Set Universe\\s-+Minimization\\s-+ToSet")
+ ("Set Universe Polymorphism" nil "Set Universe Polymorphism" t "Set Universe\\s-+Polymorphism")
+ ("Set Verbose Compat Notations" nil "Set Verbose Compat Notations" t "Set Verbose\\s-+Compat\\s-+Notations")
+ ("Set Function_debug" nil "Set Function_debug" t "Set Function_debug")
+ ("Set Function_raw_tcc" nil "Set Function_raw_tcc" t "Set Function_raw_tcc")
+ ("Set Functional Induction Rewrite Dependent" nil "Set Functional Induction Rewrite Dependent" t "Set Functional\\s-+Induction\\s-+Rewrite\\s-+Dependent")
+ ("Set Hyps Limit" nil "Set Hyps Limit" t "Set Hyps\\s-+Limit")
+ ("Set Ltac Debug" nil "Set Ltac Debug" t "Set Ltac\\s-+Debug")
+ ("Set Silent" nil "Set Silent" t "Set Silent")
+ ("Set Undo" nil "Set Undo" t "Set Undo")
+ ("Set Search Blacklist" nil "Set Search Blacklist" t "Set Search\\s-+Blacklist")
+ ("Set Printing Coercion" nil "Set Printing Coercion" t "Set Printing\\s-+Coercion")
+ ("Set Printing If" nil "Set Printing If" t "Set Printing\\s-+If")
+ ("Set Printing Let" nil "Set Printing Let" t "Set Printing\\s-+Let")
+ ("Set Printing Record" nil "Set Printing Record" t "Set Printing\\s-+Record")
+ ("Set Printing Constructor" nil "Set Printing Constructor" t "Set Printing\\s-+Constructor")
+ ("Solve Obligations" "oblssolve" "Solve Obligations using #." t "Solve\\s-+Obligations")
+ ("Local Strategy" nil "Local Strategy # [#]." t "Local\\s-+Strategy")
+ ("Strategy" nil "Strategy # [#]." t "Strategy")
+ ("Tactic Notation" nil "Tactic Notation # := #." t "Tactic\\s-+Notation")
+ ("Transparent" nil "Transparent #." nil "Transparent")
+
+ ("Unfocus" nil "Unfocus." nil "Unfocus")
+ ("Unset Asymmetric Patterns" nil "Unset Asymmetric Patterns" t "Unset Asymmetric\\s-+Patterns")
+ ("Unset Atomic Load" nil "Unset Atomic Load" t "Unset Atomic\\s-+Load")
+ ("Unset Automatic Coercions Import" nil "Unset Automatic Coercions Import" t "Unset Automatic\\s-+Coercions\\s-+Import")
+ ("Unset Automatic Introduction" nil "Unset Automatic Introduction" t "Unset Automatic\\s-+Introduction")
+ ("Unset Boolean Equality Schemes" nil "Unset Boolean Equality Schemes" t "Unset Boolean\\s-+Equality\\s-+Schemes")
+ ("Unset Bracketing Last Introduction Pattern" nil "Unset Bracketing Last Introduction Pattern" t "Unset Bracketing\\s-+Last\\s-+Introduction\\s-+Pattern")
+ ("Unset Bullet Behavior" nil "Unset Bullet Behavior" t "Unset Bullet\\s-+Behavior")
+ ("Unset Case Analysis Schemes" nil "Unset Case Analysis Schemes" t "Unset Case\\s-+Analysis\\s-+Schemes")
+ ("Unset Compat Notations" nil "Unset Compat Notations" t "Unset Compat\\s-+Notations")
+ ("Unset Congruence Depth" nil "Unset Congruence Depth" t "Unset Congruence\\s-+Depth")
+ ("Unset Congruence Verbose" nil "Unset Congruence Verbose" t "Unset Congruence\\s-+Verbose")
+ ("Unset Contextual Implicit" nil "Unset Contextual Implicit" t "Unset Contextual\\s-+Implicit")
+ ("Unset Debug Auto" nil "Unset Debug Auto" t "Unset Debug\\s-+Auto")
+ ("Unset Debug Eauto" nil "Unset Debug Eauto" t "Unset Debug\\s-+Eauto")
+ ("Unset Debug RAKAM" nil "Unset Debug RAKAM" t "Unset Debug\\s-+RAKAM")
+ ("Unset Debug Tactic Unification" nil "Unset Debug Tactic Unification" t "Unset Debug\\s-+Tactic\\s-+Unification")
+ ("Unset Debug Trivial" nil "Unset Debug Trivial" t "Unset Debug\\s-+Trivial")
+ ("Unset Debug Unification" nil "Unset Debug Unification" t "Unset Debug\\s-+Unification")
+ ("Unset Decidable Equality Schemes" nil "Unset Decidable Equality Schemes" t "Unset Decidable\\s-+Equality\\s-+Schemes")
+ ("Unset Default Clearing Used Hypotheses" nil "Unset Default Clearing Used Hypotheses" t "Unset Default\\s-+Clearing\\s-+Used\\s-+Hypotheses")
+ ("Unset Default Goal Selector" nil "Unset Default Goal Selector" t "Unset Default\\s-+Goal\\s-+Selector")
+ ("Unset Default Proof Mode" nil "Unset Default Proof Mode" t "Unset Default\\s-+Proof\\s-+Mode")
+ ("Unset Default Proof Using" nil "Unset Default Proof Using" t "Unset Default\\s-+Proof\\s-+Using")
+ ("Unset Default Timeout" nil "Unset Default Timeout" t "Unset Default\\s-+Timeout")
+ ("Unset Dependent Propositions Elimination" nil "Unset Dependent Propositions Elimination" t "Unset Dependent\\s-+Propositions\\s-+Elimination")
+ ("Unset Discriminate Introduction" nil "Unset Discriminate Introduction" t "Unset Discriminate\\s-+Introduction")
+ ("Unset Dump Bytecode" nil "Unset Dump Bytecode" t "Unset Dump\\s-+Bytecode")
+ ("Unset Elimination Schemes" nil "Unset Elimination Schemes" t "Unset Elimination\\s-+Schemes")
+ ("Unset Equality Scheme" nil "Unset Equality Scheme" t "Unset Equality\\s-+Scheme")
+ ("Unset Extraction AccessOpaque" nil "Unset Extraction AccessOpaque" t "Unset Extraction\\s-+AccessOpaque")
+ ("Unset Extraction AutoInline" nil "Unset Extraction AutoInline" t "Unset Extraction\\s-+AutoInline")
+ ("Unset Extraction Conservative Types" nil "Unset Extraction Conservative Types" t "Unset Extraction\\s-+Conservative\\s-+Types")
+ ("Unset Extraction File Comment" nil "Unset Extraction File Comment" t "Unset Extraction\\s-+File\\s-+Comment")
+ ("Unset Extraction Flag" nil "Unset Extraction Flag" t "Unset Extraction\\s-+Flag")
+ ("Unset Extraction KeepSingleton" nil "Unset Extraction KeepSingleton" t "Unset Extraction\\s-+KeepSingleton")
+ ("Unset Extraction Optimize" nil "Unset Extraction Optimize" t "Unset Extraction\\s-+Optimize")
+ ("Unset Extraction SafeImplicits" nil "Unset Extraction SafeImplicits" t "Unset Extraction\\s-+SafeImplicits")
+ ("Unset Extraction TypeExpand" nil "Unset Extraction TypeExpand" t "Unset Extraction\\s-+TypeExpand")
+ ("Unset Firstorder Depth" nil "Unset Firstorder Depth" t "Unset Firstorder\\s-+Depth")
+ ("Unset Hide Obligations" nil "Unset Hide Obligations" t "Unset Hide\\s-+Obligations")
+ ("Unset Implicit Arguments" nil "Unset Implicit Arguments" t "Unset Implicit\\s-+Arguments")
+ ("Unset Info Auto" nil "Unset Info Auto" t "Unset Info\\s-+Auto")
+ ("Unset Info Eauto" nil "Unset Info Eauto" t "Unset Info\\s-+Eauto")
+ ("Unset Info Level" nil "Unset Info Level" t "Unset Info\\s-+Level")
+ ("Unset Info Trivial" nil "Unset Info Trivial" t "Unset Info\\s-+Trivial")
+ ("Unset Injection L2R Pattern Order" nil "Unset Injection L2R Pattern Order" t "Unset Injection\\s-+L2R\\s-+Pattern\\s-+Order")
+ ("Unset Injection On Proofs" nil "Unset Injection On Proofs" t "Unset Injection\\s-+On\\s-+Proofs")
+ ("Unset Inline Level" nil "Unset Inline Level" t "Unset Inline\\s-+Level")
+ ("Unset Intuition Iff Unfolding" nil "Unset Intuition Iff Unfolding" t "Unset Intuition\\s-+Iff\\s-+Unfolding")
+ ("Unset Intuition Negation Unfolding" nil "Unset Intuition Negation Unfolding" t "Unset Intuition\\s-+Negation\\s-+Unfolding")
+ ("Unset Kernel Term Sharing" nil "Unset Kernel Term Sharing" t "Unset Kernel\\s-+Term\\s-+Sharing")
+ ("Unset Keyed Unification" nil "Unset Keyed Unification" t "Unset Keyed\\s-+Unification")
+ ("Unset Loose Hint Behavior" nil "Unset Loose Hint Behavior" t "Unset Loose\\s-+Hint\\s-+Behavior")
+ ("Unset Maximal Implicit Insertion" nil "Unset Maximal Implicit Insertion" t "Unset Maximal\\s-+Implicit\\s-+Insertion")
+ ("Unset Nonrecursive Elimination Schemes" nil "Unset Nonrecursive Elimination Schemes" t "Unset Nonrecursive\\s-+Elimination\\s-+Schemes")
+ ("Unset Parsing Explicit" nil "Unset Parsing Explicit" t "Unset Parsing\\s-+Explicit")
+ ("Unset Primitive Projections" nil "Unset Primitive Projections" t "Unset Primitive\\s-+Projections")
+ ("Unset Printing All" nil "Unset Printing All" t "Unset Printing\\s-+All")
+ ("Unset Printing Coercions" nil "Unset Printing Coercions" t "Unset Printing\\s-+Coercions")
+ ("Unset Printing Depth" nil "Unset Printing Depth" t "Unset Printing\\s-+Depth")
+ ("Unset Printing Existential Instances" nil "Unset Printing Existential Instances" t "Unset Printing\\s-+Existential\\s-+Instances")
+ ("Unset Printing Implicit" nil "Unset Printing Implicit" t "Unset Printing\\s-+Implicit")
+ ("Unset Printing Implicit Defensive" nil "Unset Printing Implicit Defensive" t "Unset Printing\\s-+Implicit\\s-+Defensive")
+ ("Unset Printing Matching" nil "Unset Printing Matching" t "Unset Printing\\s-+Matching")
+ ("Unset Printing Notations" nil "Unset Printing Notations" t "Unset Printing\\s-+Notations")
+ ("Unset Printing Primitive Projection Compatibility" nil "Unset Printing Primitive Projection Compatibility" t "Unset Printing\\s-+Primitive\\s-+Projection\\s-+Compatibility")
+ ("Unset Printing Primitive Projection Parameters" nil "Unset Printing Primitive Projection Parameters" t "Unset Printing\\s-+Primitive\\s-+Projection\\s-+Parameters")
+ ("Unset Printing Projections" nil "Unset Printing Projections" t "Unset Printing\\s-+Projections")
+ ("Unset Printing Records" nil "Unset Printing Records" t "Unset Printing\\s-+Records")
+ ("Unset Printing Synth" nil "Unset Printing Synth" t "Unset Printing\\s-+Synth")
+ ("Unset Printing Universes" nil "Unset Printing Universes" t "Unset Printing\\s-+Universes")
+ ("Unset Printing Width" nil "Unset Printing Width" t "Unset Printing\\s-+Width")
+ ("Unset Printing Wildcard" nil "Unset Printing Wildcard" t "Unset Printing\\s-+Wildcard")
+ ("Unset Program Mode" nil "Unset Program Mode" t "Unset Program\\s-+Mode")
+ ("Unset Proof Using Clear Unused" nil "Unset Proof Using Clear Unused" t "Unset Proof\\s-+Using\\s-+Clear\\s-+Unused")
+ ("Unset Record Elimination Schemes" nil "Unset Record Elimination Schemes" t "Unset Record\\s-+Elimination\\s-+Schemes")
+ ("Unset Refine Instance Mode" nil "Unset Refine Instance Mode" t "Unset Refine\\s-+Instance\\s-+Mode")
+ ("Unset Regular Subst Tactic" nil "Unset Regular Subst Tactic" t "Unset Regular\\s-+Subst\\s-+Tactic")
+ ("Unset Reversible Pattern Implicit" nil "Unset Reversible Pattern Implicit" t "Unset Reversible\\s-+Pattern\\s-+Implicit")
+ ("Unset Rewriting Schemes" nil "Unset Rewriting Schemes" t "Unset Rewriting\\s-+Schemes")
+ ("Unset Short Module Printing" nil "Unset Short Module Printing" t "Unset Short\\s-+Module\\s-+Printing")
+ ("Unset Shrink Obligations" nil "Unset Shrink Obligations" t "Unset Shrink\\s-+Obligations")
+ ("Unset SimplIsCbn" nil "Unset SimplIsCbn" t "Unset SimplIsCbn")
+ ("Unset Standard Proposition Elimination Names" nil "Unset Standard Proposition Elimination Names" t "Unset Standard\\s-+Proposition\\s-+Elimination\\s-+Names")
+ ("Unset Strict Proofs" nil "Unset Strict Proofs" t "Unset Strict\\s-+Proofs")
+ ("Unset Strict Universe Declaration" nil "Unset Strict Universe Declaration" t "Unset Strict\\s-+Universe\\s-+Declaration")
+ ("Unset Strongly Strict Implicit" nil "Unset Strongly Strict Implicit" t "Unset Strongly\\s-+Strict\\s-+Implicit")
+ ("Unset Suggest Proof Using" nil "Unset Suggest Proof Using" t "Unset Suggest\\s-+Proof\\s-+Using")
+ ("Unset Tactic Compat Context" nil "Unset Tactic Compat Context" t "Unset Tactic\\s-+Compat\\s-+Context")
+ ("Unset Tactic Evars Pattern Unification" nil "Unset Tactic Evars Pattern Unification" t "Unset Tactic\\s-+Evars\\s-+Pattern\\s-+Unification")
+ ("Unset Tactic Pattern Unification" nil "Unset Tactic Pattern Unification" t "Unset Tactic\\s-+Pattern\\s-+Unification")
+ ("Unset Transparent Obligations" nil "Unset Transparent Obligations" t "Unset Transparent\\s-+Obligations")
+ ("Unset Typeclass Resolution After Apply" nil "Unset Typeclass Resolution After Apply" t "Unset Typeclass\\s-+Resolution\\s-+After\\s-+Apply")
+ ("Unset Typeclass Resolution For Conversion" nil "Unset Typeclass Resolution For Conversion" t "Unset Typeclass\\s-+Resolution\\s-+For\\s-+Conversion")
+ ("Unset Typeclasses Debug" nil "Unset Typeclasses Debug" t "Unset Typeclasses\\s-+Debug")
+ ("Unset Typeclasses Dependency Order" nil "Unset Typeclasses Dependency Order" t "Unset Typeclasses\\s-+Dependency\\s-+Order")
+ ("Unset Typeclasses Depth" nil "Unset Typeclasses Depth" t "Unset Typeclasses\\s-+Depth")
+ ("Unset Typeclasses Modulo Eta" nil "Unset Typeclasses Modulo Eta" t "Unset Typeclasses\\s-+Modulo\\s-+Eta")
+ ("Unset Typeclasses Strict Resolution" nil "Unset Typeclasses Strict Resolution" t "Unset Typeclasses\\s-+Strict\\s-+Resolution")
+ ("Unset Typeclasses Unique Instances" nil "Unset Typeclasses Unique Instances" t "Unset Typeclasses\\s-+Unique\\s-+Instances")
+ ("Unset Typeclasses Unique Solutions" nil "Unset Typeclasses Unique Solutions" t "Unset Typeclasses\\s-+Unique\\s-+Solutions")
+ ("Unset Universal Lemma Under Conjunction" nil "Unset Universal Lemma Under Conjunction" t "Unset Universal\\s-+Lemma\\s-+Under\\s-+Conjunction")
+ ("Unset Universe Minimization ToUnset" nil "Unset Universe Minimization ToUnset" t "Unset Universe\\s-+Minimization\\s-+ToUnset")
+ ("Unset Universe Polymorphism" nil "Unset Universe Polymorphism" t "Unset Universe\\s-+Polymorphism")
+ ("Unset Verbose Compat Notations" nil "Unset Verbose Compat Notations" t "Unset Verbose\\s-+Compat\\s-+Notations")
+ ("Unset Function_debug" nil "Unset Function_debug" t "Unset Function_debug")
+ ("Unset Function_raw_tcc" nil "Unset Function_raw_tcc" t "Unset Function_raw_tcc")
+ ("Unset Functional Induction Rewrite Dependent" nil "Unset Functional Induction Rewrite Dependent" t "Unset Functional\\s-+Induction\\s-+Rewrite\\s-+Dependent")
+ ("Unset Hyps Limit" nil "Unset Hyps Limit" t "Unset Hyps\\s-+Limit")
+ ("Unset Ltac Debug" nil "Unset Ltac Debug" t "Unset Ltac\\s-+Debug")
+ ("Unset Silent" nil "Unset Silent" t "Unset Silent")
+ ("Unset Undo" nil "Unset Undo" t "Unset Undo")
+ ("Unset Search Blacklist" nil "Unset Search Blacklist" t "Unset Search\\s-+Blacklist")
+ ("Unset Printing Coercion" nil "Unset Printing Coercion" t "Unset Printing\\s-+Coercion")
+ ("Unset Printing If" nil "Unset Printing If" t "Unset Printing\\s-+If")
+ ("Unset Printing Let" nil "Unset Printing Let" t "Unset Printing\\s-+Let")
+ ("Unset Printing Record" nil "Unset Printing Record" t "Unset Printing\\s-+Record")
+ ("Unset Printing Constructor" nil "Unset Printing Constructor" t "Unset Printing\\s-+Constructor")
+ ; ("print" "pr" "print #" "print")
+ )
"Command that are not declarations, definition or goal starters."
)
+
(defvar coq-ssreflect-commands-db
'(("Unset Strict Implicit" "unsti" nil t "Strict\\s-+Implicit")
("Prenex Implicits" "pi" "Prenex Implicits #" t "Prenex\\s-+Implicits")
@@ -876,13 +1114,13 @@ It is used:
(coq-build-regexp-list-from-db coq-tacticals-db)
"Keywords for tacticals in a Coq script.")
-(defvar coq-symbol-binders "\\_<∀\\_>\\|\\_<∃\\_>\\|\\_<λ\\_>")
+(defvar coq-symbol-binders "∀\\|∃\\|λ")
+
;; From JF Monin:
(defvar coq-reserved
(append
- coq-user-reserved-db
'(
"False" "True" "after" "as" "cofix" "fix" "forall" "fun" "match"
"lazymatch" "multimatch"
@@ -890,7 +1128,8 @@ It is used:
"using" "with" "beta" "delta" "iota" "zeta" "after" "until"
"at" "Sort" "Time" "dest" "where"
;; SSReflect user reserved.
- "is" "nosimpl" "of"))
+ "is" "nosimpl" "of")
+ coq-user-reserved-db)
"Reserved keywords of Coq.")
;; FIXME: ∀ and ∃ should be followed by a space in coq syntax.
@@ -950,9 +1189,17 @@ It is used:
"++>"
"@"
"->"
- ".")
+ "."
+ "∧"
+ "∨"
+ "→"
+ "\\/"
+ "/\\"
+ "->")
"Punctuation Symbols used by Coq.")
+(defvar coq-symbols-regexp (regexp-opt coq-symbols))
+
;; ----- regular expressions
(defvar coq-error-regexp "^\\(Error:\\|Discarding pattern\\|Syntax error:\\|System Error:\\|User Error:\\|User error:\\|Anomaly[:.]\\|Toplevel input[,]\\)"
"A regexp indicating that the Coq process has identified an error.")
@@ -963,7 +1210,7 @@ It is used:
(defvar coq-id "\\(@\\|_\\|\\w\\)\\(\\w\\|\\s_\\)*") ;; Coq ca start an id with @ or _
(defvar coq-id-shy "\\(?:@\\|_\\|\\w\\)\\(?:\\w\\|\\s_\\)*")
-; do not use proof-ids with a space separator!
+; do not use proof-ids with a space separator!
(defvar coq-ids (concat coq-id "\\(" "\\s-+" coq-id "\\)*"))
(defun coq-first-abstr-regexp (paren end)
@@ -974,29 +1221,37 @@ It is used:
:type 'boolean
:group 'coq)
-(defconst coq-lambda-regexp "\\(?:\\_<fun\\_>\\|\\_<λ\\_>\\)")
+(defcustom coq-symbol-highlight-enable nil
+ "Activates partial bound variable highlighting"
+ :type 'boolean
+ :group 'coq)
+
+(defconst coq-lambda-regexp "\\(?:\\_<fun\\_>\\|λ\\)")
-(defconst coq-forall-regexp "\\(?:\\_<forall\\_>\\|\\_<∀\\_>\\)")
-(defconst coq-exists-regexp "\\(?:\\_<exists\\_>\\|\\_<∃\\_>\\)")
+(defconst coq-forall-regexp "\\(?:\\_<forall\\_>\\|∀\\)")
+(defconst coq-exists-regexp "\\(?:\\_<exists\\_>\\|∃\\)")
(defvar coq-font-lock-terms
- (cons
- (cons coq-symbol-binders 'coq-symbol-binder-face)
- (if coq-variable-highlight-enable
- (list
- ;; lambda binders
- (list (coq-first-abstr-regexp coq-lambda-regexp "\\(?:=>\\|:\\|,\\)") 1 'font-lock-variable-name-face)
- ;; forall binder
- (list (coq-first-abstr-regexp coq-forall-regexp "\\(?:,\\|:\\)") 1 'font-lock-variable-name-face)
- (list (coq-first-abstr-regexp coq-exists-regexp "\\(?:,\\|:\\)") 1 'font-lock-variable-name-face)
- ; (list "\\<forall\\>"
- ; (list 0 font-lock-type-face)
- ; (list (concat "[^ :]\\s-*\\(" coq-ids "\\)\\s-*") nil nil
- ; (list 0 font-lock-variable-name-face)))
- ;; parenthesized binders
- (list (coq-first-abstr-regexp "(" ":[ a-zA-Z]") 1 'font-lock-variable-name-face)
- (list (coq-first-abstr-regexp "{" ":[ a-zA-Z]") 1 'font-lock-variable-name-face)
- )))
+ (append
+ (list ;; flattened by append above
+ (cons coq-symbol-binders 'coq-symbol-binder-face))
+ (when coq-symbol-highlight-enable
+ (list (cons coq-symbols-regexp 'coq-symbol-face)))
+ (when coq-variable-highlight-enable
+ (list
+ ;; lambda binders
+ (list (coq-first-abstr-regexp coq-lambda-regexp "\\(?:=>\\|:\\|,\\)") 1 'font-lock-variable-name-face)
+ ;; forall binder
+ (list (coq-first-abstr-regexp coq-forall-regexp "\\(?:,\\|:\\)") 1 'font-lock-variable-name-face)
+ (list (coq-first-abstr-regexp coq-exists-regexp "\\(?:,\\|:\\)") 1 'font-lock-variable-name-face)
+ ;; (list "\\<forall\\>"
+ ;; (list 0 font-lock-type-face)
+ ;; (list (concat "[^ :]\\s-*\\(" coq-ids "\\)\\s-*") nil nil
+ ;; (list 0 font-lock-variable-name-face)))
+ ;; parenthesized binders
+ (list (coq-first-abstr-regexp "(" ":[ a-zA-Z]") 1 'font-lock-variable-name-face)
+ (list (coq-first-abstr-regexp "{" ":[ a-zA-Z]") 1 'font-lock-variable-name-face)
+ )))
"*Font-lock table for Coq terms.")
@@ -1050,38 +1305,36 @@ It is used:
;; (concat "\\(with\\)\\s-+\\(" coq-id "\\)\\s-*\\([^(.]*:\\|.*)[^(.]*:=\\)"))
;;"\\<Prop\\>\\|\\<Set\\>\\|\\<Type\\>"
-;; (defconst coq-require-command-regexp
-;; (concat "Require\\s-+\\(" coq-id "\\)")
-;; "Regular expression matching Require commands in Coq.
-;; Group number 1 matches the name of the library which is required.")
+
+(defconst coq-context-marker-regexp
+ (concat (regexp-opt '("ltac" "constr" "uconstr") 'symbols) ":"))
;;
;; font-lock
;;
(defvar coq-font-lock-keywords-1
- (append
- coq-font-lock-terms
- (list
- (cons coq-solve-tactics-regexp 'coq-solve-tactics-face)
- (cons coq-solve-cheat-tactics-regexp 'coq-cheat-face)
- (cons coq-keywords-regexp 'font-lock-keyword-face)
- (cons coq-reserved-regexp 'font-lock-type-face)
- (cons coq-tactics-regexp 'proof-tactics-name-face)
- (cons (proof-regexp-alt-list coq-tacticals) 'proof-tacticals-name-face)
- (cons (proof-regexp-alt-list-symb (list "Set" "Type" "Prop")) 'font-lock-type-face)
- (cons "============================" 'font-lock-keyword-face)
- (list coq-goal-with-hole-regexp 2 'font-lock-function-name-face))
- (if coq-variable-highlight-enable
- (list (list coq-decl-with-hole-regexp 2 'font-lock-variable-name-face)))
- (list
- (list coq-defn-with-hole-regexp 2 'font-lock-function-name-face)
- (list coq-with-with-hole-regexp 2 'font-lock-function-name-face)
- (list coq-save-with-hole-regexp 2 'font-lock-function-name-face)
- ;; Remove spurious variable and function faces on commas.
- '(proof-zap-commas))))
-
-
-;; ", " is for multiple hypothesis diplayed in v8.5. If more than
+ (append
+ coq-font-lock-terms
+ `((,coq-solve-tactics-regexp . 'coq-solve-tactics-face)
+ (,coq-solve-cheat-tactics-regexp . 'coq-cheat-face)
+ (,coq-keywords-regexp . 'font-lock-keyword-face)
+ (,coq-reserved-regexp . 'font-lock-type-face)
+ (,coq-tactics-regexp . 'proof-tactics-name-face)
+ (,(proof-regexp-alt-list coq-tacticals) . 'proof-tacticals-name-face)
+ (,(proof-regexp-alt-list-symb (list "Set" "Type" "Prop")) . 'font-lock-type-face)
+ ("============================" . 'font-lock-keyword-face)
+ (,coq-goal-with-hole-regexp 2 'font-lock-function-name-face)
+ (,coq-context-marker-regexp 1 'coq-context-qualifier-face))
+ (if coq-variable-highlight-enable
+ `((,coq-decl-with-hole-regexp 2 'font-lock-variable-name-face)))
+ `((,coq-defn-with-hole-regexp 2 'font-lock-function-name-face)
+ (,coq-with-with-hole-regexp 2 'font-lock-function-name-face)
+ (,coq-save-with-hole-regexp 2 'font-lock-function-name-face)
+ ;; Remove spurious variable and function faces on commas.
+ (proof-zap-commas))))
+
+
+;; ", " is for multiple hypothesis displayed in v8.5. If more than
;; 1 space this is a hypothesis displayed in the middle of a line (> v8.5)
;; "^ " is for goals in debug mode.
(defvar coq-hyp-name-in-goal-or-response-regexp
@@ -1128,14 +1381,15 @@ It is used:
(modify-syntax-entry ?< ".")
(modify-syntax-entry ?> ".")
(modify-syntax-entry ?\& ".")
- (modify-syntax-entry ?_ "_")
- (modify-syntax-entry ?\' "_")
- (modify-syntax-entry ?∀ "_")
- (modify-syntax-entry ?∃ "_")
- (modify-syntax-entry ?λ "_") ;; maybe a bad idea... lambda is a letter
+ (modify-syntax-entry ?_ "_") ; beware: word consituent EXCEPT in head position
+ (modify-syntax-entry ?\' "_") ; always word constituent
+ (modify-syntax-entry ?∀ ".")
+ (modify-syntax-entry ?∃ ".")
+ (modify-syntax-entry ?λ ".") ;; maybe a bad idea... lambda is a letter
(modify-syntax-entry ?\| ".")
;; should maybe be "_" but it makes coq-find-and-forget (in coq.el) bug
+ ;; Hence the coq-with-altered-syntax-table below to put "." into "_" class temporarily
(modify-syntax-entry ?\. ".")
(modify-syntax-entry ?\* ". 23n")
@@ -1146,6 +1400,7 @@ It is used:
;; constituent (better behavior for thing-at and maybe font-lock too,
;; for indentation we use ad hoc smie lexers).
(defmacro coq-with-altered-syntax-table (&rest code)
+ (declare (debug t))
(let ((res (make-symbol "res")))
`(unwind-protect
(progn (modify-syntax-entry ?\. "_")
diff --git a/coq/coq-system.el b/coq/coq-system.el
index 963a0985..0b9b6c58 100644
--- a/coq/coq-system.el
+++ b/coq/coq-system.el
@@ -30,7 +30,8 @@ On Windows you might need something like:
:group 'coq)
(defcustom coq-prog-name
- (proof-locate-executable "coqtop" t '("C:/Program Files/Coq/bin"))
+ (if (executable-find "coqtop") "coqtop"
+ (proof-locate-executable "coqtop" t '("C:/Program Files/Coq/bin")))
"*Name of program to run as Coq. See `proof-prog-name', set from this.
On Windows with latest Coq package you might need something like:
C:/Program Files/Coq/bin/coqtop.opt.exe
@@ -42,22 +43,26 @@ See also `coq-prog-env' to adjust the environment."
:group 'coq)
(defcustom coq-dependency-analyzer
- (proof-locate-executable "coqdep" t '("C:/Program Files/Coq/bin"))
+ (if (executable-find "coqdep") "coqdep"
+ (proof-locate-executable "coqdep" t '("C:/Program Files/Coq/bin")))
"Command to invoke coqdep."
:type 'string
:group 'coq)
(defcustom coq-compiler
- (proof-locate-executable "coqc" t '("C:/Program Files/Coq/bin"))
+ (if (executable-find "coqc") "coqc"
+ (proof-locate-executable "coqc" t '("C:/Program Files/Coq/bin")))
"Command to invoke the coq compiler."
:type 'string
:group 'coq)
(defun get-coq-library-directory ()
- (let ((c (substring (shell-command-to-string (concat coq-prog-name " -where")) 0 -1 )))
- (if (string-match "not found" c)
- "/usr/local/lib/coq"
- c)))
+ (let ((default-directory
+ (if (file-accessible-directory-p default-directory)
+ default-directory
+ "/")))
+ (or (ignore-errors (car (process-lines coq-prog-name "-where")))
+ "/usr/local/lib/coq")))
(defconst coq-library-directory (get-coq-library-directory) ;; FIXME Should be refreshed more often
"The coq library directory, as reported by \"coqtop -where\".")
@@ -69,14 +74,31 @@ See also `coq-prog-env' to adjust the environment."
(defcustom coq-pinned-version nil
"Which version of Coq you are using.
-There should be no need to set this value; Proof General can
-adjust to various releases of Coq automatically."
+There should be no need to set this value unless you use the trunk from
+the Coq github repository. For Coq versions with decent version numbers
+Proof General detects the version automatically and adjusts itself. This
+variable should contain nil or a version string."
:type 'string
:group 'coq)
(defvar coq-autodetected-version nil
"Version of Coq, as autodetected by `coq-autodetect-version'.")
+;;; error symbols
+
+;; coq-unclassifiable-version
+;;
+;; This error is signaled with one data item -- the bad version string
+
+(put 'coq-unclassifiable-version 'error-conditions
+ '(error coq-unclassifiable-version))
+
+(put 'coq-unclassifiable-version 'error-message
+ "Proof General cannot classify your Coq version")
+
+
+;;; version detection code
+
(defun coq-version (&optional may-recompute)
"Return the precomputed version of the current Coq toolchain.
With MAY-RECOMPUTE, try auto-detecting it if it isn't available."
@@ -99,19 +121,37 @@ If it doesn't look right, try `coq-autodetect-version'."
Interactively (with INTERACTIVE-P), show that number."
(interactive '(t))
(setq coq-autodetected-version nil)
- (let ((version-string (car (process-lines "coqtop" "-v"))))
- (when (and version-string (string-match "version \\([^ ]+\\)" version-string))
- (setq coq-autodetected-version (match-string 1 version-string))))
+ (with-temp-buffer
+ ;; Use `shell-command' via `find-file-name-handler' instead of
+ ;; `process-line': when the buffer is running TRAMP, PG uses
+ ;; `start-file-process', loading the binary from the remote server.
+ (let* ((default-directory
+ (if (file-accessible-directory-p default-directory)
+ default-directory
+ "/"))
+ (coq-command (shell-quote-argument (or coq-prog-name "coqtop")))
+ (shell-command-str (format "%s -v" coq-command))
+ (fh (find-file-name-handler default-directory 'shell-command))
+ (retv (if fh (funcall fh 'shell-command shell-command-str (current-buffer))
+ (shell-command shell-command-str (current-buffer)))))
+ (when (equal 0 retv)
+ ;; Fail silently (in that case we'll just assume Coq 8.5)
+ (goto-char (point-min))
+ (when (re-search-forward "version \\([^ ]+\\)" nil t)
+ (setq coq-autodetected-version (match-string 1))))))
(when interactive-p
(coq-show-version))
coq-autodetected-version)
-(defun coq--version< (v1 v2) ;; !!! Check availability in 24.3
+(defun coq--version< (v1 v2)
"Compare Coq versions V1 and V2."
- (let ((version-regexp-alist (cons '("^pl$" . 0) version-regexp-alist)))
+ ;; -snapshot is only supported by Emacs 24.5, not 24.3
+ (let ((version-regexp-alist `(("^[-_+ ]?snapshot$" . -4)
+ ("^pl$" . 0)
+ ,@version-regexp-alist)))
(version< v1 v2)))
-(defcustom coq-pre-v85 nil ;; !!! Mark deprecated
+(defcustom coq-pre-v85 nil
"Deprecated.
Use `coq-pinned-version' if you want to bypass the
version detection that Proof General does automatically."
@@ -121,7 +161,26 @@ version detection that Proof General does automatically."
(defun coq--pre-v85 ()
"Return non-nil if the auto-detected version of Coq is < 8.5.
Returns nil if the version can't be detected."
- (coq--version< (or (coq-version t) "8.5") "8.5snapshot"))
+ (let ((coq-version-to-use (or (coq-version t) "8.5")))
+ (condition-case err
+ (coq--version< coq-version-to-use "8.5snapshot")
+ (error
+ (cond
+ ((equal (substring (cadr err) 0 15) "Invalid version")
+ (signal 'coq-unclassifiable-version coq-version-to-use))
+ (t (signal (car err) (cdr err))))))))
+
+(defun coq--post-v86 ()
+ "Return t if the auto-detected version of Coq is >= 8.6.
+Return nil if the version cannot be detected."
+ (let ((coq-version-to-use (or (coq-version t) "8.5")))
+ (condition-case err
+ (not (coq--version< coq-version-to-use "8.6"))
+ (error
+ (cond
+ ((equal (substring (cadr err) 0 15) "Invalid version")
+ (signal 'coq-unclassifiable-version coq-version-to-use))
+ (t (signal (car err) (cdr err))))))))
(defcustom coq-use-makefile nil
"Whether to look for a Makefile to attempt to guess the command line.
@@ -237,30 +296,32 @@ This setting is only relevant with Coq < 8.5."
(make-obsolete-variable 'coq-load-path-include-current "Coq 8.5 does not need it" "4.3")
- (defun coq-option-of-load-path-entry (entry &optional pre-v85)
- "Translate a single ENTRY from `coq-load-path' into options.
+(defun coq-option-of-load-path-entry (entry &optional pre-v85)
+ "Translate a single ENTRY from `coq-load-path' into options.
See `coq-load-path' for the possible forms of ENTRY and to which
options they are translated. Use a non-nil PRE-V85 flag to
request compatibility handling of flags."
- (if pre-v85 ;; !!! Which base directory do we expand against? Should the entries of load-path just always be absolute?
- ;; Note that we don't handle 'recnoimport in 8.4, and we don't handle
- ;; 'nonrec in 8.5.
- (pcase entry
- ((or (and (pred stringp) dir) `(ocamlimport ,dir))
- (list "-I" (expand-file-name dir)))
- (`(nonrec ,dir ,alias)
- (list "-I" (expand-file-name dir) "-as" alias))
- ((or `(rec ,dir ,alias) `(,dir ,alias))
- (list "-R" (expand-file-name dir) alias)))
- (pcase entry
- ((and (pred stringp) dir)
- (list "-Q" (expand-file-name dir) ""))
- (`(ocamlimport ,dir)
- (list "-I" (expand-file-name dir)))
- (`(recnoimport ,dir ,alias)
- (list "-Q" (expand-file-name dir) alias))
- ((or `(rec ,dir ,alias) `(,dir ,alias))
- (list "-R" (expand-file-name dir) alias)))))
+ (if pre-v85
+ ;; FIXME Which base directory do we expand against? Should the entries of
+ ;; load-path just always be absolute?
+ ;; NOTE we don't handle 'recnoimport in 8.4, and we don't handle 'nonrec
+ ;; in 8.5.
+ (pcase entry
+ ((or (and (pred stringp) dir) `(ocamlimport ,dir))
+ (list "-I" (expand-file-name dir)))
+ (`(nonrec ,dir ,alias)
+ (list "-I" (expand-file-name dir) "-as" alias))
+ ((or `(rec ,dir ,alias) `(,dir ,alias))
+ (list "-R" (expand-file-name dir) alias)))
+ (pcase entry
+ ((and (pred stringp) dir)
+ (list "-Q" (expand-file-name dir) ""))
+ (`(ocamlimport ,dir)
+ (list "-I" (expand-file-name dir)))
+ (`(recnoimport ,dir ,alias)
+ (list "-Q" (expand-file-name dir) alias))
+ ((or `(rec ,dir ,alias) `(,dir ,alias))
+ (list "-R" (expand-file-name dir) alias)))))
(defun coq-include-options (load-path &optional current-directory pre-v85)
"Build the base list of include options for coqc, coqdep and coqtop.
@@ -319,13 +380,11 @@ options of a few coq-project files does the right thing."
LOAD-PATH, CURRENT-DIRECTORY, PRE-V85: see `coq-include-options'."
(coq-include-options load-path current-directory pre-v85))
-;;; !!! Fixme handle proof-prog-name-ask
-
(defun coq-coqc-prog-args (load-path &optional current-directory pre-v85)
"Build a list of options for coqc.
LOAD-PATH, CURRENT-DIRECTORY, PRE-V85: see `coq-include-options'."
;; coqtop always adds the current directory to the LoadPath, so don't
- ;; include it in the -Q options. ;; !!! Check this comment
+ ;; include it in the -Q options.
(append (remove "-emacs" (remove "-emacs-U" coq-prog-args))
(let ((coq-load-path-include-current nil)) ; Not needed in >=8.5beta3
(coq-coqdep-prog-args coq-load-path current-directory pre-v85))))
@@ -336,7 +395,7 @@ LOAD-PATH, CURRENT-DIRECTORY, PRE-V85: see `coq-include-options'."
;; documentation.
(defun coq-coqtop-prog-args (load-path &optional current-directory pre-v85)
- ;; coqtop always adds the current directory to the LoadPath, so don't ;; !!! Check this comment
+ ;; coqtop always adds the current directory to the LoadPath, so don't
;; include it in the -Q options. This is not true for coqdep.
"Build a list of options for coqc.
LOAD-PATH, CURRENT-DIRECTORY, PRE-V85: see `coq-coqc-prog-args'."
@@ -355,8 +414,9 @@ project file (see `coq-project-filename') somewhere in the
current directory or its parent directories. If there is one,
its contents are read and used to determine the arguments that
must be given to coqtop. In particular it sets the load
-path (including the -R lib options) (see `coq-load-path') ."
+path (including the -R lib options) (see `coq-load-path')."
:type 'boolean
+ :safe 'booleanp
:group 'coq)
(defcustom coq-project-filename "_CoqProject"
@@ -373,6 +433,7 @@ variables may still be used to override the coq project file's
configuration. .dir-locals.el files also work and override
project file settings."
:type 'string
+ :safe 'stringp
:group 'coq)
(defun coq-find-project-file ()
@@ -435,7 +496,7 @@ coqtop."
(push opt args))
(`("-arg" ,concatenated-args)
(setq args
- (append (split-string (cadr opt) coq--project-file-separator)
+ (append (split-string-and-unquote (cadr opt) coq--project-file-separator)
args)))))
(cons "-emacs" args)))
diff --git a/coq/coq.el b/coq/coq.el
index 20354046..edf905ae 100644
--- a/coq/coq.el
+++ b/coq/coq.el
@@ -24,6 +24,8 @@
(defvar proof-info nil) ; dynamic scope in proof-tree-urgent-action
(defvar action nil) ; dynamic scope in coq-insert-as stuff
(defvar string nil) ; dynamic scope in coq-insert-as stuff
+ (defvar old-proof-marker nil)
+ ; dynamic scoq in coq-proof-tree-enable-evar-callback
(defvar coq-auto-insert-as nil) ; defpacustom
(defvar coq-time-commands nil) ; defpacustom
(defvar coq-use-project-file t) ; defpacustom
@@ -81,6 +83,11 @@ These are appended at the end of `coq-shell-init-cmd'."
:type '(repeat (cons (string :tag "command")))
:group 'coq)
+(defcustom coq-optimise-resp-windows-enable t
+ "If non-nil (default) resize vertically response windw after each command."
+ :type 'boolean
+ :group 'coq)
+
;; Default coq is only Private_ and _subproof
(defcustom coq-search-blacklist-string ; add this? \"_ind\" \"_rect\" \"_rec\"
"\"Private_\" \"_subproof\""
@@ -88,6 +95,11 @@ These are appended at the end of `coq-shell-init-cmd'."
:type 'string
:group 'coq)
+(defcustom coq-prefer-top-of-conclusion nil
+ "prefer start of the conclusion over its end when displaying goals
+that do not fit in the goals window."
+ :type 'boolean
+ :group 'coq)
;; this remembers the previous value of coq-search-blacklist-string, so that we
;; can cook a remove+add blacklist command each time the variable is changed.
@@ -169,13 +181,14 @@ See also `coq-hide-additional-subgoals'."
(defcustom coq-navigation-command-regexp
(concat "^\\(\\(Focus\\)\\|\\(Unfocus\\)\\|"
+ "\\(all\\s-*:\\s-*\\(cycle\\|swap\\|revgoals\\)\\)\\|"
"\\(\\+\\)\\|\\(-\\)\\|\\(\\*\\)\\|\\({\\)\\|\\(}\\)\\)")
"Regexp for `proof-tree-navigation-command-regexp'."
:type 'regexp
:group 'coq-proof-tree)
(defcustom coq-proof-tree-cheating-regexp
- "admit"
+ "\\(?:admit\\)\\|\\(?:give_up\\)"
"Regexp for `proof-tree-cheating-regexp'."
:type 'regexp
:group 'coq-proof-tree)
@@ -187,8 +200,9 @@ See also `coq-hide-additional-subgoals'."
:group 'coq-proof-tree)
(defcustom coq-proof-tree-current-goal-regexp
- (concat "^[0-9]+ \\(?:focused \\)?subgoal\\(?:s\\)?"
- "\\(?: (unfocused: [-0-9]+)\\)?\\(?:\\s-*, subgoal 1\\)? "
+ (concat "^[0-9]+ \\(?:focused \\)?subgoal\\(?:s\\)?\\s-*"
+ "\\(?:(\\(?:unfocused: [-0-9]+\\)?,?"
+ "\\s-*\\(?:shelved: [-0-9]+\\)?)\\)?\\(?:\\s-*, subgoal 1\\)? "
"(ID \\([0-9]+\\))\n\\s-*\n\\(\\(?: .*\n\\)+\\)\\(?:\n\\|$\\)")
"Regexp for `proof-tree-current-goal-regexp'."
:type 'regexp
@@ -229,13 +243,26 @@ See also `coq-hide-additional-subgoals'."
:type 'regexp
:group 'coq-proof-tree)
-;; pc: <infomsg> now has a newline (better output indentation)
+;; 8.4:
+;; <infomsg>This subproof is complete, but there are still unfocused goals.</infomsg>
+;;
+;; 8.5:
+;; <infomsg>
+;; This subproof is complete, but there are some unfocused goals.
+;; Focus next goal with bullet *.
+;; </infomsg>
+;;
+;; <infomsg>No more subgoals, but there are some goals you gave up:</infomsg>
+;;
+;; <infomsg>All the remaining goals are on the shelf.</infomsg>
(defcustom coq-proof-tree-branch-finished-regexp
- (concat "^\\(\\(?:Proof completed\\.\\)\\|\\(?:No more subgoals\\.\\)\\|"
+ (concat "^\\(\\(?:Proof completed\\.\\)\\|"
+ "\\(?:\\(?:<infomsg>\\)?No more subgoals\\)\\|"
"\\(No more subgoals but non-instantiated "
"existential variables:\\)\\|"
+ "\\(?:<infomsg>All the remaining goals are on the shelf\\)\\|"
"\\(<infomsg>\\s-*This subproof is complete, but there are "
- "still unfocused goals.\\s-*</infomsg>\\)\\)")
+ "\\(?:still\\|some\\) unfocused goals.\\)\\)")
"Regexp for `proof-tree-branch-finished-regexp'."
:type 'regexp
:group 'coq-proof-tree)
@@ -796,6 +823,16 @@ Return nil if S is nil."
(substring s 0 (- (length s) 1))
s))
+(defun coq-remove-heading-quote (s)
+ "Return the string S without its heading \"\'\" if any.
+Return nil if S is nil."
+ (if (and s (string-match "\\`'" s))
+ (substring s 1 (length s))
+ s))
+
+(defun coq-clean-id-at-point (s)
+ (coq-remove-heading-quote (coq-remove-trailing-dot s)))
+
(defun coq-is-symbol-or-punct (c)
"Return non nil if character C is a punctuation or a symbol constituent.
If C is nil, return nil."
@@ -840,15 +877,15 @@ Support dot.notation.of.modules."
(let* ((symb (cond
((fboundp 'symbol-near-point) (symbol-near-point))
((fboundp 'symbol-at-point) (symbol-at-point))))
- (symbclean (when symb (coq-remove-trailing-dot (symbol-name symb)))))
- (when (and symb (not (zerop (length symbclean)))
- (not (coq-string-starts-with-symbol symbclean)))
+ (symbclean (when symb (coq-clean-id-at-point (symbol-name symb)))))
+ (when (and symb (not (zerop (length symbclean))))
symbclean))))
(defun coq-id-or-notation-at-point ()
- (or (coq-id-at-point) (concat "\"" (coq-notation-at-position (point)) "\"")))
-
+ (or (coq-id-at-point)
+ (let ((notation (coq-notation-at-position (point))))
+ (if notation (concat "\"" notation "\"") ""))))
(defcustom coq-remap-mouse-1 nil
"Wether coq mode should remap mouse button 1 to coq queries.
@@ -1194,6 +1231,7 @@ width is synchronized by coq (?!)."
:group 'coq
:eval (coq-set-auto-adapt-printing-width))
+
;; defpacustom fails to call :eval during inititialization, see trac #456
(coq-set-auto-adapt-printing-width)
@@ -1298,11 +1336,10 @@ goal is redisplayed."
(let* ((id (coq-id-or-notation-at-point))
(re (regexp-quote (or id ""))))
(when coq-highlight-id-last-regexp
- (coq-unhighlight-id-in-goals coq-highlight-id-last-regexp)
- (if (equal id coq-highlight-id-last-regexp)
- (setq coq-highlight-id-last-regexp "")
- (coq-highlight-id-in-goals re)
- (setq coq-highlight-id-last-regexp re)))))
+ (coq-unhighlight-id-in-goals coq-highlight-id-last-regexp))
+ (coq-highlight-id-in-goals re)
+ (setq coq-highlight-id-last-regexp re)))
+
(proof-definvisible coq-PrintHint "Print Hint. ")
@@ -1311,14 +1348,16 @@ goal is redisplayed."
(proof-definvisible coq-show-proof "Show Proof.")
(proof-definvisible coq-show-conjectures "Show Conjectures.")
(proof-definvisible coq-show-intros "Show Intros.") ; see coq-insert-intros below
-(proof-definvisible coq-set-implicit-arguments "Set Implicit Arguments.")
-(proof-definvisible coq-unset-implicit-arguments "Unset Implicit Arguments.")
+(proof-definvisible coq-set-printing-implicit "Set Printing Implicit.")
+(proof-definvisible coq-unset-printing-implicit "Unset Printing Implicit.")
(proof-definvisible coq-set-printing-all "Set Printing All.")
(proof-definvisible coq-unset-printing-all "Unset Printing All.")
(proof-definvisible coq-set-printing-synth "Set Printing Synth.")
(proof-definvisible coq-unset-printing-synth "Unset Printing Synth.")
(proof-definvisible coq-set-printing-coercions "Set Printing Coercions.")
(proof-definvisible coq-unset-printing-coercions "Unset Printing Coercions.")
+(proof-definvisible coq-set-printing-universes "Set Printing Universes.")
+(proof-definvisible coq-unset-printing-universes "Unset Printing Universes.")
(proof-definvisible coq-set-printing-wildcards "Set Printing Wildcard.")
(proof-definvisible coq-unset-printing-wildcards "Unset Printing Wildcard.")
; Takes an argument
@@ -1398,7 +1437,7 @@ Near here means PT is either inside or just aside of a comment."
(cond
((coq-looking-at-comment)
(coq-get-comment-region (point)))
- ((and (looking-back proof-script-comment-end)
+ ((and (looking-back proof-script-comment-end nil)
(save-excursion (forward-char -1) (coq-looking-at-comment)))
(coq-get-comment-region (- (point) 1)))
((and (looking-at proof-script-comment-start)
@@ -1465,8 +1504,7 @@ Near here means PT is either inside or just aside of a comment."
(set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil)
;; do not break lines in code when filling
(set (make-local-variable 'fill-nobreak-predicate)
- (lambda ()
- (not (eq (get-text-property (point) 'face) 'font-lock-comment-face))))
+ (lambda () (not (nth 4 (syntax-ppss)))))
;; coq mode specific indentation function
(set (make-local-variable 'fill-paragraph-function) 'coq-fill-paragraph-function)
@@ -1752,7 +1790,7 @@ Near here means PT is either inside or just aside of a comment."
(defpacustom search-blacklist coq-search-blacklist-string
"Strings to blacklist in requests to coq environment."
:type 'string
- :get coq-search-blacklist-string
+ :get 'coq-get-search-blacklist
:setting coq-set-search-blacklist)
@@ -1810,27 +1848,45 @@ processing, the sequent text is send to prooftree as a sequent
update (see `proof-tree-update-sequent') and the ID of the
sequent is registered as known in `proof-tree-sequent-hash'.
+Searching for new subgoals must only be done when the proof is
+not finished, because Coq 8.5 lists open existential variables
+as (new) open subgoals. For this test we assume that
+`proof-marker' has not yet been moved.
+
+The `proof-tree-urgent-action-hook' is also called for undo
+commands. For those, nothing is done.
+
The not yet delayed output is in the region
\[proof-shell-delayed-output-start, proof-shell-delayed-output-end]."
;; (message "CPTGNS start %s end %s"
;; proof-shell-delayed-output-start
;; proof-shell-delayed-output-end)
- (with-current-buffer proof-shell-buffer
- (let ((start proof-shell-delayed-output-start)
- (end proof-shell-delayed-output-end))
- (goto-char start)
- (while (proof-re-search-forward
- coq-proof-tree-additional-subgoal-ID-regexp end t)
- (let ((subgoal-id (match-string-no-properties 1)))
- (unless (gethash subgoal-id proof-tree-sequent-hash)
- (setq proof-action-list
- (cons (proof-shell-action-list-item
- (coq-show-sequent-command subgoal-id)
- (proof-tree-make-show-goal-callback (car proof-info))
- '(no-goals-display
- no-response-display
- proof-tree-show-subgoal))
- proof-action-list))))))))
+ (let ((start proof-shell-delayed-output-start)
+ (end proof-shell-delayed-output-end)
+ (state (car proof-info)))
+ (when (> state proof-tree-last-state)
+ (with-current-buffer proof-shell-buffer
+ ;; The message "All the remaining goals are on the shelf" is processed as
+ ;; urgent message and is therefore before
+ ;; proof-shell-delayed-output-start. We therefore need to go back to
+ ;; proof-marker.
+ (goto-char proof-marker)
+ (unless (proof-re-search-forward
+ coq-proof-tree-branch-finished-regexp end t)
+ (goto-char start)
+ (while (proof-re-search-forward
+ coq-proof-tree-additional-subgoal-ID-regexp end t)
+ (let ((subgoal-id (match-string-no-properties 1)))
+ (unless (gethash subgoal-id proof-tree-sequent-hash)
+ ;; (message "CPTGNS new sequent %s found" subgoal-id)
+ (setq proof-action-list
+ (cons (proof-shell-action-list-item
+ (coq-show-sequent-command subgoal-id)
+ (proof-tree-make-show-goal-callback (car proof-info))
+ '(no-goals-display
+ no-response-display
+ proof-tree-show-subgoal))
+ proof-action-list))))))))))
(add-hook 'proof-tree-urgent-action-hook 'coq-proof-tree-get-new-subgoals)
@@ -1867,6 +1923,103 @@ This is the Coq incarnation of `proof-tree-find-undo-position'."
(span-start span-res)))
+;; In Coq 8.6 the evar line is disabled by default because on some proofs it
+;; causes a severe performance hit. The disabled evar line causes prooftree to
+;; crash with a parsing error. Proof General must therefore turn on the evar
+;; output with the command "Set Printing Dependent Evars Line". Of course,
+;; after the proof, the evar line must be set back to what it was before the
+;; proof. I therefore look in the urgent action hook if proof display is
+;; switched on or off. When switched on, I test the current evar printing
+;; status with the undodumented command "Test Printing Dependent Evars Line" to
+;; remember if I have to switch evar printing off eventually.
+
+(defvar coq--proof-tree-must-disable-evars nil
+ "Remember if evar printing must be disabled when leaving the current proof.")
+
+(defun coq-proof-tree-enable-evar-callback (span)
+ "Callback for the evar printing status test.
+This is the callback for the command ``Test Printing Dependent
+Evars Line''. It checks whether evar printing was off and
+remembers that fact in `coq--proof-tree-must-disable-evars'."
+ (with-current-buffer proof-shell-buffer
+ (save-excursion
+ ;; When the callback runs, the next item is sent to Coq already and
+ ;; therefore proof-marker points to the end of the next command
+ ;; already. proof-shell-filter-manage-output sets old-proof-marker
+ ;; before calling proof-shell-exec-loop, this therefore points to the
+ ;; end of the command of this callback.
+ (goto-char old-proof-marker)
+ (when (re-search-forward "The Printing Dependent Evars Line mode is "
+ nil t)
+ (if (looking-at "off")
+ (progn
+ ;; (message "CPTEEC evar line mode was off")
+ (setq coq--proof-tree-must-disable-evars t))
+ ;; (message "CPTEEC evar line mode was on")
+ (setq coq--proof-tree-must-disable-evars nil))))))
+
+(defun coq-proof-tree-insert-evar-command (cmd &optional callback)
+ "Insert an evar printing command at the head of `proof-action-list'."
+ (push (proof-shell-action-list-item
+ (concat cmd " Printing Dependent Evars Line.")
+ (if callback callback 'proof-done-invisible)
+ (list 'invisible))
+ proof-action-list))
+
+(defun coq-proof-tree-enable-evars ()
+ "Enable the evar status line for Coq >= 8.6.
+Test the status of evar printing to be able to set it back
+properly after the proof and enable the evar printing."
+ (when (coq--post-v86)
+ ;; We push to proof-action-list --- therefore we need to push in reverse
+ ;; order!
+ (coq-proof-tree-insert-evar-command "Set")
+ (coq-proof-tree-insert-evar-command
+ "Test"
+ 'coq-proof-tree-enable-evar-callback)))
+
+(defun coq-proof-tree-disable-evars ()
+ "Disable evar printing if necessary.
+This function switches off evar printing after the proof, if it
+was off before the proof. For undo commands, we rely on the fact
+that Coq itself undos the effect of the evar printing change that
+we inserted after the goal statement. We also rely on the fact
+that Proof General never backtracks into the middle of a
+proof. (If this would happen, Coq would switch evar printing on
+and the code here would not switch it off after the proof.)
+
+Being called from `proof-tree-urgent-action-hook', this function
+can rely on `proof-info' being dynamically bound to the last
+result of `coq-proof-tree-get-proof-info'."
+ (when coq--proof-tree-must-disable-evars
+ (when (> (car proof-info) proof-tree-last-state)
+ (coq-proof-tree-insert-evar-command "Unset"))
+ (setq coq--proof-tree-must-disable-evars nil)))
+
+(defun coq-proof-tree-evar-display-toggle ()
+ "Urgent action hook function for changing the evar printing status in Coq.
+This function is for `proof-tree-urgent-action-hook' (which is
+called only if external proof disaply is switched on). It checks
+whether a proof was started or stopped and inserts commands for
+enableing and disabling the evar status line for Coq 8.6 or
+later. Without the evar status line being enabled, prooftree
+crashes.
+
+Must only be called via `proof-tree-urgent-action-hook' to ensure
+that the dynamic variable `proof-info' is bound to the current
+result of `coq-proof-tree-get-proof-info'."
+ (let ((current-proof-name (cadr proof-info)))
+ (cond
+ ((and (null proof-tree-current-proof) current-proof-name)
+ ;; started a new proof
+ (coq-proof-tree-enable-evars))
+ ((and proof-tree-current-proof (null current-proof-name))
+ ;; finished the current proof
+ (coq-proof-tree-disable-evars)))))
+
+(add-hook 'proof-tree-urgent-action-hook 'coq-proof-tree-evar-display-toggle)
+
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Pre-processing of input string
@@ -1876,11 +2029,17 @@ This is the Coq incarnation of `proof-tree-find-undo-position'."
(defconst coq--time-prefix "Time "
"Coq command prefix for displaying timing information.")
+(defun coq-bullet-p (s)
+ (string-match coq-bullet-regexp-nospace s))
+
;; Remark: `action' and `string' are known by `proof-shell-insert-hook'
(defun coq-preprocessing ()
- (if coq-time-commands
- (with-no-warnings ;; NB: dynamic scoping of `string'
- (setq string (concat coq--time-prefix string)))))
+ (when coq-time-commands
+ (with-no-warnings ;; NB: dynamic scoping of `string' and `action'
+ ;; Don't add the prefix if this is a command sent internally
+ (unless (or (eq action 'proof-done-invisible)
+ (coq-bullet-p string)) ;; coq does not accept "Time -".
+ (setq string (concat coq--time-prefix string))))))
(add-hook 'proof-shell-insert-hook 'coq-preprocessing)
@@ -2013,20 +2172,28 @@ mouse activation."
(progn (end-of-line) (point)))))))
(insert (concat "End" section)))))
+(defun coq--format-intros (output)
+ "Create an “intros” form from the OUTPUT of “Show Intros”."
+ (let* ((shints (replace-regexp-in-string "[\r\n ]*\\'" "" output)))
+ (if (or (string= "" shints)
+ (string-match coq-error-regexp shints))
+ (error "Don't know what to intro")
+ (format "intros %s" shints))))
+
(defun coq-insert-intros ()
"Insert an intros command with names given by Show Intros.
Based on idea mentioned in Coq reference manual."
(interactive)
- (let* ((shints (proof-shell-invisible-cmd-get-result "Show Intros."))
- ;; insert a dot before the trailing \n and put intros at begining
- (intros (concat "intros " (substring shints 0 (- (length shints) 1)) ".\n")))
- (if (or (< (length shints) 2);; empty response is just NL
- (string-match coq-error-regexp shints))
- (error "Don't know what to intro")
- (let ((pt (point)))
- (insert intros)
- (indent-region pt (point))))))
-
+ (let* ((output (proof-shell-invisible-cmd-get-result "Show Intros.")))
+ (indent-region (point)
+ (progn (insert (coq--format-intros output))
+ (save-excursion
+ (insert (if coq-one-command-per-line "\n" " "))
+ (point))))
+ ;; `proof-electric-terminator' moves the point in all sorts of strange
+ ;; ways, so we run it last
+ (let ((last-command-event ?.)) ;; Insert a dot
+ (proof-electric-terminator))))
(defvar coq-keywords-accepting-as-regex (regexp-opt '("induction" "destruct" "inversion" "injection")))
@@ -2387,6 +2554,7 @@ buffer."
(buffer-substring p (point)))))))
+
(defun coq-show-first-goal ()
"Scroll the goal buffer so that the first goal is visible.
First goal is displayed on the bottom of its window, maximizing the
@@ -2403,12 +2571,21 @@ number of hypothesis displayed, without hiding the goal"
(let ((goal-win (or (get-buffer-window proof-goals-buffer) (get-buffer-window proof-goals-buffer t))))
(if goal-win
(with-selected-window goal-win
- ;; find snd goal or buffer end
+ ;; find snd goal or buffer end, if not found this goes to the
+ ;; end of buffer
(search-forward-regexp "subgoal 2\\|\\'")
(beginning-of-line)
- ;; find something else than a space
+ ;; find something backward else than a space: bottom of concl
(ignore-errors (search-backward-regexp "\\S-"))
- (recenter (- 1)) ; put it at bottom og window
+ (recenter (- 1)) ; put bot of concl at bottom of window
+ (beginning-of-line)
+ ;; if the top of concl is hidden we may want to show it instead
+ ;; of bottom of concl
+ (when (and coq-prefer-top-of-conclusion
+ ;; return nil if === is not visible
+ (not (save-excursion (re-search-backward "========" (window-start) t))))
+ (re-search-backward "========" nil t)
+ (recenter 0))
(beginning-of-line))))))))
(defvar coq-modeline-string2 ")")
@@ -2498,14 +2675,18 @@ Only when three-buffer-mode is enabled."
(goto-char (point-min))
(recenter))))))))))
+;; TODO: remove/add hook instead?
+(defun coq-optimise-resp-windows-if-option ()
+ (when coq-optimise-resp-windows-enable (coq-optimise-resp-windows)))
+
;; TODO: I would rather have a response-insert-hook thant this two hooks
;; Careful: coq-optimise-resp-windows must be called BEFORE proof-show-first-goal,
;; i.e. added in hook AFTER it.
;; Adapt when displaying a normal message
-(add-hook 'proof-shell-handle-delayed-output-hook 'coq-optimise-resp-windows)
+(add-hook 'proof-shell-handle-delayed-output-hook 'coq-optimise-resp-windows-if-option)
;; Adapt when displaying an error or interrupt
-(add-hook 'proof-shell-handle-error-or-interrupt-hook 'coq-optimise-resp-windows)
+(add-hook 'proof-shell-handle-error-or-interrupt-hook 'coq-optimise-resp-windows-if-option)
;;; DOUBLE HIT ELECTRIC TERMINATOR
;; Trying to have double hit on colon behave like electric terminator. The "."
diff --git a/coq/coqtags b/coq/coqtags
index 6d874e9d..6d874e9d 100644..100755
--- a/coq/coqtags
+++ b/coq/coqtags
diff --git a/doc/.cvsignore b/doc/.gitignore
index 1e54881b..1e54881b 100644
--- a/doc/.cvsignore
+++ b/doc/.gitignore
diff --git a/doc/Makefile.doc b/doc/Makefile.doc
index 87e1d1cb..b5eb4d82 100644
--- a/doc/Makefile.doc
+++ b/doc/Makefile.doc
@@ -18,7 +18,7 @@
MAKE = make -f Makefile.doc
MAKEINFO = makeinfo
-TEXI2HTML = texi2html -expandinfo -number -split_chapter --noheader --css-include proofgen.css
+TEXI2HTML = texi2html -expandinfo -number-sections -split_chapter --noheader --css-include proofgen.css
# `texinfo-tex' package contains texi2pdf
TEXI2PDF = texi2pdf
# `dviutils' package contains these useful utilities.
diff --git a/doc/PG-adapting.texi b/doc/PG-adapting.texi
index 078fa93c..cf88d683 100644
--- a/doc/PG-adapting.texi
+++ b/doc/PG-adapting.texi
@@ -21,7 +21,7 @@
@c FIXME: unfortunately, broken in buggy pdftexinfo.
@c so removed for now.
@set URLisamode http://homepages.inf.ed.ac.uk/da/isamode
-@set URLpghome http://proofgeneral.inf.ed.ac.uk
+@set URLpghome https://proofgeneral.github.io
@set URLpglatestrpm http://proofgeneral.inf.ed.ac.uk/releases/ProofGeneral-latest.noarch.rpm
@set URLpglatesttar http://proofgeneral.inf.ed.ac.uk/releases/ProofGeneral-latest.tar.gz
@set URLpglatestdev http://proofgeneral.inf.ed.ac.uk/releases/ProofGeneral-devel-latest.tar.gz
@@ -51,9 +51,9 @@
@c @ref{node} without "see". Careful for info.
-@set version 4.3pre
+@set version 4.4.1~pre
@set emacsversion 24.4
-@set last-update April 2015
+@set last-update September 2016
@set rcsid $Id$
@dircategory Theorem proving
@@ -84,7 +84,7 @@ END-INFO-DIR-ENTRY
@sp 1
@subtitle Adapting Proof General @value{version} to new provers
@subtitle @value{last-update}
-@subtitle @b{proofgeneral.inf.ed.ac.uk}
+@subtitle @b{proofgeneral.github.io}
@iftex
@vskip 1cm
@@ -122,9 +122,9 @@ more details.
@sp 1
-Visit Proof General on the web at @code{http://proofgeneral.inf.ed.ac.uk}
+Visit Proof General on the web at @code{https://proofgeneral.github.io}
-Version control: @code{@value{rcsid}}
+@c (commented; dates from CVS) Version control: @code{@value{rcsid}}
@end titlepage
@page
@@ -200,7 +200,7 @@ 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://proofgeneral.inf.ed.ac.uk}. Visit this page
+@uref{https://proofgeneral.github.io}. Visit this page
for the latest version of the manuals, other documentation, system
downloads, etc.
@@ -1264,7 +1264,7 @@ Completion is activated with M-x complete.
If this table is empty or needs adjusting, please make changes using
@samp{@code{customize-variable}} and post suggestions at
-http://proofgeneral.inf.ed.ac.uk/trac
+https://github.com/ProofGeneral/PG/issues
@end defvar
@c TEXI DOCSTRING MAGIC: proof-add-completions
@@ -1970,6 +1970,9 @@ This setting is used inside the function @samp{@code{proof-format-filename}}.
@defvar proof-shell-process-connection-type
The value of @samp{@code{process-connection-type}} for the proof shell.@*
Set non-nil for ptys, nil for pipes.
+
+@var{note}: In emacs >= 24 (checked for 24 and 25.0.50.1), t is not a
+good choice: input is cut after @var{4095} chars, which hangs pg.
@end defvar
@c TEXI DOCSTRING MAGIC: proof-shell-handle-error-or-interrupt-hook
@@ -2028,7 +2031,7 @@ symbol is @code{'systemspecific}.
The goals buffer settings allow configuration of Proof General for proof
by pointing or similar features.
-See the Proof General @uref{http://proofgeneral.inf.ed.ac.uk/doc, documentation web page}
+See the Proof General @uref{https://proofgeneral.github.io/doc, documentation web page}
for a link to the technical report ECS-LFCS-97-368 which hints
at how to use these settings.
@@ -2138,7 +2141,7 @@ Proof General name used internally and in menu titles.
@defopt proof-general-home-page
Web address for Proof General.
-The default value is @code{"http://proofgeneral.inf.ed.ac.uk"}.
+The default value is @code{"https://proofgeneral.github.io"}.
@end defopt
@c TEXI DOCSTRING MAGIC: proof-universal-keys
@defvar proof-universal-keys
diff --git a/doc/ProofGeneral-image.jpg b/doc/ProofGeneral-image.jpg
index ab45a0d9..85babf1b 100644
--- a/doc/ProofGeneral-image.jpg
+++ b/doc/ProofGeneral-image.jpg
Binary files differ
diff --git a/doc/ProofGeneral.texi b/doc/ProofGeneral.texi
index 20b7bed6..442ce6d5 100644
--- a/doc/ProofGeneral.texi
+++ b/doc/ProofGeneral.texi
@@ -24,7 +24,7 @@
@c so removed for now.
@set URLxsymbol http://x-symbol.sourceforge.net
@set URLisamode http://proofgeneral.inf.ed.ac.uk/~isamode
-@set URLpghome http://proofgeneral.inf.ed.ac.uk
+@set URLpghome https://proofgeneral.github.io
@set URLpglatestrpm http://proofgeneral.inf.ed.ac.uk/ProofGeneral-latest.noarch.rpm
@set URLpglatesttar http://proofgeneral.inf.ed.ac.uk/ProofGeneral-latest.tar.gz
@set URLpglatestdev http://proofgeneral.inf.ed.ac.uk/ProofGeneral-devel-latest.tar.gz
@@ -57,9 +57,9 @@
@c @ref{node} without "see". Careful for info.
@c
-@set version 4.3pre
+@set version 4.4.1~pre
@set emacsversion 24.4
-@set last-update April 2015
+@set last-update September 2016
@set rcsid $Id$
@dircategory Theorem proving
@@ -89,14 +89,14 @@
@sp 1
@subtitle User Manual for Proof General @value{version}
@subtitle @value{last-update}
-@subtitle @b{proofgeneral.inf.ed.ac.uk}
+@subtitle @b{proofgeneral.github.io}
@iftex
@vskip 1cm
@image{ProofGeneral-image}
@end iftex
-@author David Aspinall and Thomas Kleymann
-@author with P. Courtieu, H. Goguen, D. Sequeira, M. Wenzel.
+@author D. Aspinall, P. Courtieu, E. Martin-Dorel, C. Pit--Claudel,
+@author T. Kleymann, H. Goguen, D. Sequeira, M. Wenzel
@page
@vskip 0pt plus 1filll
This manual and the program Proof General are
@@ -126,11 +126,11 @@ please check the accompanying file @file{COPYING} for more details.
@sp 1
-Visit Proof General on the web at @code{http://proofgeneral.inf.ed.ac.uk}
+Visit Proof General on the web at @code{https://proofgeneral.github.io}
@sp 1
-@code{@value{rcsid}}
+@c (commented; dates from CVS) @code{@value{rcsid}}
@end titlepage
@page
@@ -188,12 +188,13 @@ news about previous releases, and notes on the development
of Proof General.
Proof General has a home page at
-@uref{http://proofgeneral.inf.ed.ac.uk}.
+@uref{https://proofgeneral.github.io}.
Visit this page for the latest version of this manual,
other documentation, system downloads, etc.
@menu
+* News for Version 4.4::
* News for Version 4.3::
* News for Version 4.2::
* News for Version 4.1::
@@ -202,6 +203,16 @@ other documentation, system downloads, etc.
* Credits::
@end menu
+@node News for Version 4.4
+@unnumberedsec News for Version 4.4
+@cindex news
+
+Proof General 4.4 is the first release since PG has moved to
+@uref{https://github.com/ProofGeneral/PG, GitHub}.
+
+This release contains several bugfixes and improvements (see the Git
+ChangeLog for more details) and supports both Coq 8.4 and Coq 8.5.
+
@node News for Version 4.3
@unnumberedsec News for Version 4.3
@cindex news
@@ -355,6 +366,13 @@ for patches and suggestions, to Makarius for many bug reports and help
with Isabelle support and to Pierre Courtieu for providing new
features for Coq support.
+Between Proof General 4.3 and 4.4 releases, the PG sources have been
+migrated from CVS to to GitHub; special thanks go to Clement
+Pit--Claudel for help in this migration.
+
+Proof General 4.4's new icons were contributed by Yoshihiro Imai
+(@uref{http://proofcafe.org/wiki/Generaltan}) under CC-BY-SA 3.0
+(@uref{https://creativecommons.org/licenses/by-sa/3.0/})
@c FIXME: watch contributors here!
During the development of Proof General 3.x and 4.x releases,
@@ -389,6 +407,7 @@ Assia Mahboubi,
Adam Megacz,
Stefan Monnier,
Tobias Nipkow,
+Clement Pit--Claudel,
Leonor Prensa Nieto,
David von Oheimb,
Lawrence Paulson,
@@ -448,7 +467,7 @@ Please help us!
Send us comments, suggestsions, or (the best) patches to improve support
for your chosen proof assistant. Contact us at
-@uref{http://proofgeneral.inf.ed.ac.uk/trac}.
+@uref{https://github.com/ProofGeneral/PG/issues}.
If your chosen proof assistant isn't supported, read the accompanying
@i{Adapting Proof General} manual to find out how to configure PG for a
@@ -708,7 +727,7 @@ of a common interface mechanism.
To get more from Proof General and adapt it to your liking, it helps to
know a little bit about how Emacs lisp packages can be customized via
the Customization mechanism. It's really easy to use. For details,
-@pxref{How to customize}. @inforef{Customization, ,(emacs)},
+@pxref{How to customize}. @inforef{Customization, ,emacs},
for documentation in Emacs.
To get the absolute most from Proof General, to improve it or to adapt
@@ -901,7 +920,7 @@ example in Isabelle with semi-colons, but these will not appear in the
final text.
Coq, on the other hand, requires a full-stop terminator at the end of
-each line, so @kbd{C-c C-.} is the key binding used to turn on
+each line, so @kbd{C-c .} is the key binding used to turn on
electric terminator. If you don't know what the terminator character
is, you can find the option anyway on the menu:
@code{Proof-General -> Quick Options -> Processing -> Electric Terminator}
@@ -1545,7 +1564,7 @@ As experienced Emacs users will know, a @i{prefix argument} is a numeric
argument supplied by some key sequence typed before a command key
sequence. You can supply a specific number by typing @key{Meta} with
the digits, or a ``universal'' prefix of @kbd{C-u}. See
-@inforef{Arguments, ,(emacs)} for more details. Several Proof General
+@inforef{Arguments, ,emacs} for more details. Several Proof General
commands, like @code{proof-retract-until-point-interactive}, may accept
a @i{prefix argument} to adjust their behaviour somehow.
@@ -2861,7 +2880,7 @@ This is an inherent problem with outline because it works by modifying
the buffer. If you want to use outline with processed scripts, you
can turn off the @code{Strict Read Only} option.
-See @inforef{Outline Mode, ,(emacs)} for more information about outline mode.
+See @inforef{Outline Mode, ,emacs} for more information about outline mode.
@node Support for completion
@section Support for completion
@@ -2896,7 +2915,7 @@ Completion is activated with M-x complete.
If this table is empty or needs adjusting, please make changes using
@samp{@code{customize-variable}} and post suggestions at
-http://proofgeneral.inf.ed.ac.uk/trac
+https://github.com/ProofGeneral/PG/issues
@end defvar
The completion facility uses a library @file{completion.el} which
@@ -2957,7 +2976,7 @@ General doesn't do this automatically.
Apart from completion, there are several other operations on tags. One
common one is replacing identifiers across all files using
@code{tags-query-replace}. For more information on how to use tags,
-@inforef{Tags, ,(emacs)}.
+@inforef{Tags, ,emacs}.
To use tags for completion at the same time as the completion mechanism
mentioned already, you can use the command @kbd{M-x add-completions-from-tags-table}.
@@ -3313,7 +3332,7 @@ Proof General has been fully loaded. Proof General is fully loaded when
you visit a script file for the first time, or if you type @kbd{M-x
load-library RET proof RET}.
-For more help with customize, see @inforef{Customization, ,(emacs)}.
+For more help with customize, see @inforef{Customization, ,emacs}.
@@ -4025,11 +4044,17 @@ when a file is loaded. File variables and their values
are written as a list at the end of
the file.
-@emph{Remarque 1:} The examples in the following are for Coq but the
+@b{Remark 1:} The examples in the following are for Coq but the
trick is applicable to other provers.
-@emph{Remarque 2:} For Coq specifically there is a recommended other way
-of configuring coq options: project files (@ref{Using the Coq project file}).
+@b{Remark 2:} For Coq specifically, there is a recommended other way
+of configuring Coq options:
+project files (@ref{Using the Coq project file}).
+Actually, project files are intended to be included in the
+distribution of a library (and included in its repository), so the Coq
+options specified in project files are supposed to work for all users.
+In contrast, user-defined options such as @code{coq-prog-name} should
+preferably be specified in a directory-local-variables file (see below).
For example, in Coq projects involving multiple directories, it is necessary
to set the variable @code{coq-load-path}
@@ -4095,13 +4120,26 @@ The value in this file must be an alist that maps mode names to alists,
where these latter alists map variables to values. You can aso put
arbitrary code in this file @inforef{Directory Variables, ,emacs}.
+Regarding the configuration of the @code{coq-prog-name} variable, the
+@code{.dir-locals.el} file should contain something like:
+
+@lisp
+((coq-mode . ((coq-prog-name . ".../path/to/coqtop"))))
+@end lisp
+
+@emph{Note:} if you add such content to the @code{.dir-locals.el} file
+you should restart Emacs to take this change into account (or
+just run @kbd{M-x proof-shell-exit RET yes RET}
+and @kbd{M-x normal-mode RET} in the Coq buffer
+before restarting the Coq process).
+
@node Using abbreviations
@section Using abbreviations
A very useful package of Emacs supports automatic expansions of
-abbreviations as you type, @inforef{Abbrevs, ,(emacs)}.
+abbreviations as you type, @inforef{Abbrevs, ,emacs}.
For example, the proof assistant Coq has many command strings that are
long, such as ``reflexivity,'' ``Inductive,'' ``Definition'' and
@@ -4302,39 +4340,42 @@ Inserts ``End <section-name>.'' (this should work well with nested sections).
@node Using the Coq project file
@section Using the Coq project file
-Before starting the Coq process, one need to set @code{coqtop} options,
-in particular the -I and -R command that set the directories to have in
-the coq load path. You can use file variables (@ref{Using file
-variables}) as it was recommended on previous versions of ProofGeneral
-but there is now a better way. ProofGeneral knows how to extract this
-information from the Coq project file if there is one. The Coq project
-file must be named following variable `coq-project-filename' (default:
-@code{_CoqProject}) and be on the root directory of your development.
+The Coq project file is the recommended way to configure the Coq
+load path and the mapping of logical module names to physical
+file path'. The project file is typically named
+@code{_CoqProject} and must be located at the directory root of
+your Coq project. Proof General searches for the Coq project file
+starting at the current directory and walking the directory
+structure upwards. The Coq project file contains the common
+options (especially @code{-R}) and a list of the files of the
+project, see the Coq reference manual, Section 15.3, ``Creating a
+Makefile for Coq modules''.
-It should contain something like:
+The Coq project file should contain something like:
@verbatim
-R foo bar
-I foo2
-arg -foo3
+file.v
+bar/other_file.v
+...
@end verbatim
-The intial use of this file is to be given to the @code{coq_makefile}
-tool to generate a Makefile (see Coq documentation for details). It is
-parsed by ProofGeneral to guess the command line option. In this example
-the command line built by Proofgeneral will be @code{coqtop -foo3 -R foo
-bar -I foo2}.
+Proof General only extracts the common options from the Coq
+project file and uses them for @code{coqtop} background
+processes as well as for @code{coqdep} and @code{coqc} when you use
+the auto compilation feature, @ref{Automatic Compilation in
+Detail}. For the example above, Proof General will start
+@code{coqtop -foo3 -R foo bar -I foo2}.
@emph{Remarque:} @code{-arg} must be followed by one and only one option
to pass to coqtop/coqc, use several @code{-arg} to issue several
-options. One per line (limitation of proofgeneral).
-
-This is the recommended way of configuring coqtop options for coq
-compilation, CoqIde and Proofgeneral. Its main advantage is that it
-avoids duplicating informations between these three tools.
+options. One per line (limitation of Proof General).
-For specific (and rare) per file configuration one can still use file
-variables (@ref{Using file variables}).
+For backward compatibility, one can also configure the load path
+with the option @code{coq-load-path}, but this is not compatible
+with @code{CoqIde} or @code{coq_makefile}.
@menu
* Changing the name of the coq project file::
@@ -4344,44 +4385,67 @@ variables (@ref{Using file variables}).
@node Changing the name of the coq project file
@subsection Changing the name of the coq project file
-One can change the name of the project file by:
-
-(setq coq-project-filename "myprojectfile")
-
-or:
-
-(setq (make-local-variable 'coq-project-filename) "myprojectfile")
+To change the name of the Coq project file, configure
+@code{coq-project-filename} (select menu @code{Proof-General ->
+Advanced -> Customize -> Coq} and scroll down to ``Coq Project
+Filename''). Customizing @code{coq-project-filename} this way
+will change the Coq project file name permanently and globally.
-If this is for a project, the best is probably to have a .dir-locals.el
-at the root of the project, as explained in @ref{Using file
-variables}. This file should contain something like:
+If you only want to change the name of the Coq project file for
+one project you can set the option as local file variable,
+@ref{Using file variables}. This can be done either directly in
+every file or once for all files of a directory tree with a
+@code{.dir-local.el} file, @inforef{Directory Variables, ,emacs}.
+The file @code{.dir-local.el} should then contain
@lisp
((coq-mode . ((coq-project-filename . "myprojectfile"))))
@end lisp
-or equivalently:
+Note that variables set in @code{.dir-local.el} are automatically
+made buffer local (such that files in different directories can
+have their independent setting of @code{coq-project-filename}).
+If you make complex customizations using @code{eval} in
+@code{.dir-local.el}, you might want to add appropriate calls to
+@code{make-local-variable}.
+
+Documentation of the user option @code{coq-project-filename}:
+
+@c TEXI DOCSTRING MAGIC: coq-project-filename
+@defvar coq-project-filename
+The name of coq project file.@*
+The coq project file of a coq developpement (Cf Coq documentation
+on "makefile generation") should contain the arguments given to
+coq_makefile. In particular it contains the -I and -R
+options (preferably one per line). If @samp{coq-use-coqproject} is
+t (default) the content of this file will be used by proofgeneral
+to infer the @samp{@code{coq-load-path}} and the @samp{@code{coq-prog-args}} variables
+that set the coqtop invocation by proofgeneral. This is now the
+recommended way of configuring the coqtop invocation. Local file
+variables may still be used to override the coq project file's
+configuration. .dir-locals.el files also work and override
+project file settings.
+@end defvar
-@lisp
-((coq-mode
- .
- ((eval
- .
- (progn
- (make-local-variable 'coq-project-filename)
- (setq coq-project-filename "myprojectfile"))))))
-@end lisp
@node Disabling the coq project file mechanism
@subsection Disabling the coq project file mechanism
-If the variable `coq-use-project-file' is nil, then Proofgeneral will
-not look at project file. therefore you can put this in your config file
-(.emacs) to disable the use of project file:
-
-@lisp
-(setq coq-use-project-file nil)
-@end lisp
+To disable the Coq project file feature in Proof General, set
+@code{coq-use-project-file} to nil (select menu
+@code{Proof-General -> Advanced -> Customize -> Coq} and scroll
+down to ``Coq Use Project File'').
+
+@c TEXI DOCSTRING MAGIC: coq-use-project-file
+@defvar coq-use-project-file
+If t, when opening a coq file read the dominating _CoqProject.@*
+If t, when a coq file is opened, Proof General will look for a
+project file (see @samp{@code{coq-project-filename}}) somewhere in the
+current directory or its parent directories. If there is one,
+its contents are read and used to determine the arguments that
+must be given to coqtop. In particular it sets the load
+path (including the -R lib options) (see @samp{@code{coq-load-path}}).
+@end defvar
You can also use the .dir-locals.el as above to configure this setting
on a per project basis.
@@ -4419,15 +4483,17 @@ There are actually two implementations of the Recompilation
feature.
@table @asis
-@item Synchronous single threaded compilation (stable)
-With synchronous compilation, coqdep and coqc are called
-synchronously for each Require command. Proof General is locked
-until the compilation finishes
-@item Parallel asynchronous compilation (experimental)
+@item Parallel asynchronous compilation (stable, default)
With parallel compilation, coqdep and coqc are launched in the
background and Proof General stays responsive during compilation.
Up to `coq-max-background-compilation-jobs' coqdep and coqc
-processes may run in parallel.
+processes may run in parallel. Coq 8.5 quick compilation is
+supported with various modes, @ref{Quick compilation and .vio Files}.
+@item Synchronous single threaded compilation (obsolete)
+With synchronous compilation, coqdep and coqc are called
+synchronously for each Require command. Proof General is locked
+until the compilation finishes. Coq 8.5 quick compilation is not
+supported with synchronously compilation.
@end table
To enable the automatic compilation feature, you have to follow
@@ -4435,40 +4501,39 @@ these points:
@itemize @bullet
@item
-The option @code{coq-compile-before-require} must be
-turned on (menu @code{Coq -> Settings -> Compile Before Require}).
+Set the option @code{coq-compile-before-require} (menu @code{Coq
+-> Auto Compilation -> Compile Before Require}) to enable
+compilation before processing @code{Require} commands and set
+@code{coq-compile-parallel-in-background} (menu @code{Coq
+-> Auto Compilation -> Parallel background compilation}) for
+parallel asynchronous compilation (recommended).
@item
-Nonstandard load path elements @emph{must} be configured in the
-option @code{coq-load-path}. @code{-I} options in
+Nonstandard load path elements @emph{must} be configured via a
+Coq project file (this is the recommended option),
+@ref{Using the Coq project file} or via
+option @code{coq-load-path}. @code{-I} or @code{-R} options in
@code{coq-prog-name} or @code{coq-prog-args} must be deleted.
@item
-In @code{coq-load-path} use strings @code{"dir"} for @code{-I}
-options and lists of two strings @code{("dir" "path")} for
-@code{-R "dir" -as "path"} (for more details see the
-documentation of `coq-load-path' or @ref{Customizing Coq Multiple
-File Support}).
-@item
-For a nonstandard compilation procedure and limited ML module
-support, @code{coq-compile-command} can be set to an external
-compilation command. For standard dependency analysis with
-@code{coqdep} and compilation with @code{coqc} the option
-@code{coq-compile-command} can be left empty. In this case Proof
-General calls @code{coqdep} and @code{coqc} as needed.
-@item
-The default compilation method is synchronous compilation. In
-order to experience parallel background compilation on all your
-CPU cores,
-enable `coq-compile-parallel-in-background' (menu @code{Coq ->
-Settings -> Compile Parallel In Background}). Configure
+Configure
@code{coq-max-background-compilation-jobs} if you want to limit
-the number of parallel background jobs.
+the number of parallel background jobs and set
+@code{coq-compile-keep-going} (menu @code{Coq -> Auto Compilation
+-> Keep going}) to let compilation continue after the first
+error.
@end itemize
+To abort parallel background compilation, use @code{C-c C-c}
+(@code{proof-interrupt-process}), the tool bar interrupt icon,
+the menu entry @code{Abort Background Compilation} (menu
+@code{Coq -> Auto Compilation}) or kill the Coq toplevel via
+@code{C-c C-x} (@code{proof-shell-exit}). To abort synchronous
+single threaded compilation, simply hit @code{C-g}.
@menu
* Automatic Compilation in Detail::
* Locking Ancestors::
+* Quick compilation and .vio Files::
* Customizing Coq Multiple File Support::
* Current Limitations::
@end menu
@@ -4490,53 +4555,35 @@ compilation finished.
Proof General uses @code{coqdep} in order to translate the
qualified identifiers in @code{Require} commands to coq library
-file names. Therefore, in Coq version prior to @code{8.3pl2},
-@code{Require Arith} works, while
-@code{Require Arith.Le} gives an error. The use of @code{coqdep}
-is also the reason
-why nonstandard load path elements must be configured in
-@code{coq-load-path}.
-
-Once the library file name has been determined, its dependencies
-must be checked and out-of-date files must be compiled. This can
-either be done internally, by Proof General itself, or by an
-external command. If @code{coq-compile-command} is the empty
-string, Proof General does dependency checking and compilation
-itself. Otherwise the command in @code{coq-compile-command} is
-started as an external process after substituting certain keys,
-@ref{Customizing Coq Multiple File Support}.
-
-For an external compilation command Proof General uses the
-general compilation facilities of Emacs
-(@inforef{Compilation,,emacs}) with its own customization variables.
-The compilation command must be customized in
-@code{coq-compile-command} and the flag
-@code{coq-confirm-external-compilation} (menu @code{Coq ->
-Settings -> Confirm External Compilation})
-determines
-whether the user must confirm the compilation command. The output
-of the compilation appears then in the @code{*compilation*}
-buffer.
-
-When Proof General compiles itself, output is only shown in case
+file names and to determine library dependencies. Because Proof
+General cannot know whether files are updated outside of Emacs,
+it checks for every @code{Require} command the complete
+dependency tree and recompiles files as necessary.
+
+Output from the compilation is only shown in case
of errors. It then appears in the buffer
-@code{*coq-compile-response*}. With internal as well as with external
-compilation
-one can use @code{C-x `} (bound to @code{next-error},
+@code{*coq-compile-response*}.
+One can use @code{C-x `} (bound to @code{next-error},
@inforef{Compilation Mode,,emacs}) to jump to error locations.
-Note however, that @code{coqdep} does not produce error messages
-with location information, so @code{C-x `} cannot work for errors
-from @code{coqdep}.
-
-Proof General cannot know if some library files have been updated
-outside of Proof General, therefore, it must perform the
-dependency checking for each @code{Require} command. If the
-continuous confirmation of the external compilation commands
-becomes tedious, disable
-@code{coq-confirm-external-compilation} (see menu @code{Coq ->
-Settings}).
-
-When a @code{Require} command causes a compilation of some files
+Sometimes the compilation commands do not produce error messages
+with location information, then @code{C-x `} does only work in a
+limited way.
+
+For Coq version 8.5 or newer, the option @code{coq-compile-quick}
+controls how @code{-quick} and @code{.vio} files are used,
+@ref{Quick compilation and .vio Files}. This can also be
+configured in the menu @code{Coq -> Auto Compilation}.
+
+Similar to @code{make -k}, background compilation can be
+configured to continue as far as possible after the first error,
+see option @code{coq-compile-keep-going} (menu @code{Coq -> Auto
+Compilation -> Keep going}). The keep-going option only applies
+to errors from @code{coqdep} and @code{coqc}. For all other
+errors (for instance when the translation from logical module
+names to physical files fails or when starting @code{coqc} or
+@code{coqdep} fails), the compilation is immediately aborted.
+
+When a @code{Require} command causes a compilation of some files,
one may wish to save some buffers to disk beforehand. The option
@code{coq-compile-auto-save} controls how and which files are
saved. There are two orthogonal choices: One may wish to save all
@@ -4549,19 +4596,27 @@ between two implementations of internal compilation.
@table @asis
@item Synchronous single threaded compilation
-This is the stable version supported since Proof General version
+This is the old, now outdated version supported since Proof General
4.1. This method starts coqdep and coqc processes one after each
other in synchronous subprocesses. Your Emacs session will be
locked until compilation finishes. Use @code{C-g} to interrupt
-compilation.
+compilation. This method supports compilation via an external
+command (such as @code{make}), see option
+@code{coq-compile-command} in @ref{Customizing Coq Multiple File
+Support} below. Synchronous compilation does not support the
+quick compilation of Coq 8.5.
+
@item Parallel asynchronous compilation
-This is the new version added in Proof General version 4.3. It
+This is the newer and default version added in Proof General version 4.3. It
runs up to @code{coq-max-background-compilation-jobs} coqdep and
coqc jobs in parallel in asynchronous subprocesses (or uses all
your CPU cores if @code{coq-max-background-compilation-jobs}
equals @code{'all-cpus}). Your Emacs will stay responsive during
-compilation. Use @code{C-c C-c} or the tool bar icons for
-interrupt or restart to interrupt compilation.
+compilation. To abort the background compilation process, use
+@code{C-c C-c} (@code{proof-interrupt-process}), the tool bar
+interrupt icon, the menu entry @code{Abort Background
+Compilation} (menu @code{Coq -> Auto Compilation}) or kill the
+Coq toplevel via @code{C-c C-x} (@code{proof-shell-exit}).
For the usual case, you have at most
`coq-max-background-compilation-jobs' parallel processes
@@ -4572,6 +4627,14 @@ before the first Require, then you may see Proof General and Coq
running in addition to `coq-max-background-compilation-jobs'
compilation jobs.
+Depending on the setting of @code{coq-compile-quick} (which can
+also be set via menu @code{Coq -> Auto Compilation}) Proof
+General produces @code{.vio} or @code{.vo} files and deletes
+outdated @code{.vio} or @code{.vo} files to ensure Coq does not
+load outdated files. When @code{quick-and-vio2vo} is selected a
+vio2vo compilation starts when the @code{Require} command had
+been processed, @ref{Quick compilation and .vio Files}.
+
Actually, even with this method, not everything runs
asynchronously. To translate module identifiers from the Coq
sources into file names, Proof General runs coqdep on an
@@ -4620,6 +4683,111 @@ benefit, as Require commands are usually on the top of each
file.]
+@node Quick compilation and .vio Files
+@subsection Quick compilation and .vio Files
+
+Proof General supports quick compilation only with the parallel
+asynchronous compilation. There are 4 modes that can be
+configured with @code{coq-compile-quick} or by selecting one of
+the radio buttons in the @code{Coq -> Auto Compilation} menu.
+
+Use the default @code{no-quick}, if you have not yet switched to
+@code{Proof using}. Use @code{quick-no-vio2vo}, if you want quick
+recompilation without producing .vo files. Option
+@code{quick-and-vio2vo} recompiles with @code{-quick} as
+@code{quick-no-vio2vo} does, but schedules a vio2vo compilation
+for missing @code{.vo} files after a certain delay. Finally, use
+@code{ensure-vo} for only importing @code{.vo} files with
+complete universe checks.
+
+Note that with all of @code{no-quick}, @code{quick-no-vio2vo} and
+@code{quick-and-vio2vo} your development might be unsound because
+universe constraints are not fully present in @code{.vio} files.
+
+There are a few peculiarities of quick compilation in Coq 8.5
+that one should be aware of.
+
+@itemize
+@item
+Quick compilation runs noticeably slower when section
+variables are not declared via @code{Proof using}.
+@item
+Even when section variables are declared, quick compilation runs
+slower on very small files, probably because of the
+comparatively big size of the @code{.vio} files. You can speed up
+quick compilation noticeably by running on a RAM disk.
+@item
+If both, the @code{.vo} and the @code{.vio} files are present,
+Coq load the more recent one, regardless of whether
+@code{-quick}, and emits a warning when the @code{.vio} is more
+recent than the @code{.vo}.
+@item
+Under some circumstances, files compiled when only the
+@code{.vio} file of some library was present are not compatible
+with (other) files compiled when also the @code{.vo} file of that
+library was present, see Coq issue #5223 for details. As a rule
+of thumb one should run vio2vo compilation only before or after
+library loading.
+@item
+Apart from the previous point, Coq works fine when libraries are
+present as a mixture of @code{.vio} and @code{.vo} files. While
+@code{make} insists on building all prerequisites as either
+@code{.vio} or @code{.vo} files, Proof General just checks
+whether an up-to-date compiled library file is present.
+@item
+To ensure soundness, all library dependencies must be compiled as
+@code{.vo} files and loaded into one Coq instance.
+@end itemize
+
+Detailed description of the 4 modes:
+
+@table @code
+@item no-quick
+Compile outdated prerequisites without @code{-quick}, producing @code{.vo}
+files, but don't compile prerequisites for which an up-to-date
+@code{.vio} file exists. Delete or overwrite outdated @code{.vo} files.
+
+@item quick-no-vio2vo
+Compile outdated prerequisites with @code{-quick}, producing @code{.vio}
+files, but don't compile prerequisites for which an up-to-date
+@code{.vo} file exists. Delete or overwrite outdated @code{.vio} files.
+
+@item quick-and-vio2vo
+Same as @code{quick-no-vio2vo}, but start vio2vo processes for
+missing @code{.vo} files after a certain delay when library
+compilation for the current queue region has finished. With this
+mode you might see asynchronous errors from vio2vo compilation
+while you are processing stuff far below the last require. vio2vo
+compilation is done on a subset of the available cores controlled
+by option @code{coq-compile-vio2vo-percentage}, @ref{Customizing
+Coq Multiple File Support}. When @code{coq-compile-keep-going} is
+set, vio2vo compilation is scheduled for those files for which
+@code{coqc} compilation was successful.
+
+@emph{Warning}: This mode does only work when you process require
+commands in batches. Slowly single-stepping through require's
+might lead to inconsistency errors when loading some libraries,
+see Coq issue #5223. To mitigate this risk, vio2vo compilation
+only starts after a certain delay after the last require command
+of the current queue region has been processed. This is
+controlled by @code{coq-compile-vio2vo-delay}, @ref{Customizing
+Coq Multiple File Support}.
+
+@item ensure-vo
+Ensure that all library dependencies are present as @code{.vo}
+files and delete outdated @code{.vio} files or @code{.vio} files
+that are more recent than the corresponding @code{.vo} file. This
+setting is the only one that ensures soundness.
+@end table
+
+The options @code{no-quick} and @code{ensure-vo} are compatible
+with Coq 8.4 or older. When Proof General detects such an older
+Coq version, it changes the quick compilation mode automatically.
+For this to work, the option @code{coq-compile-quick} must only
+be set via the customization system or via the menu.
+
+
+
@node Customizing Coq Multiple File Support
@subsection Customizing Coq Multiple File Support
@@ -4639,7 +4807,7 @@ required library module and its dependencies are up-to-date. If not, they
are compiled from the sources before the "Require" command is processed.
This option can be set/reset via menu
-@samp{Coq -> Settings -> Compile Before Require}.
+@samp{Coq -> Auto Compilation -> Compile Before Require}.
@end defvar
@@ -4659,8 +4827,7 @@ confirmation.
@end defvar
-The following two options are for the parallel compilation
-method.
+The following options configure parallel compilation.
@c TEXI DOCSTRING MAGIC: coq-compile-parallel-in-background
@defvar coq-compile-parallel-in-background
@@ -4675,70 +4842,71 @@ the background. The maximal number of parallel compilation jobs
is set with @samp{@code{coq-max-background-compilation-jobs}}.
This option can be set/reset via menu
-@samp{Coq -> Settings -> Compile Parallel In Background}.
+@samp{Coq -> Auto Compilation -> Compile Parallel In Background}.
@end defvar
+
+The option @code{coq-compile-quick} is described in detail above,
+@ref{Quick compilation and .vio Files}
+
+
+@c TEXI DOCSTRING MAGIC: coq-compile-keep-going
+@defvar coq-compile-keep-going
+Continue compilation after the first error as far as possible.@*
+Similar to @samp{`make -k}', with this option enabled, the background
+compilation continues after the first error as far as possible.
+With this option disabled, background compilation is
+immediately stopped after the first error.
+
+This option can be set/reset via menu
+@samp{Coq -> Auto Compilation -> Keep going}.
+@end defvar
+
+
@c TEXI DOCSTRING MAGIC: coq-max-background-compilation-jobs
@defvar coq-max-background-compilation-jobs
Maximal number of parallel jobs, if parallel compilation is enabled.@*
Use the number of available CPU cores if this is set to
@code{'all-cpus}. This variable is the user setting. The value that is
-really used is @samp{@code{coq-internal-max-jobs}}. Use @samp{@code{coq-max-jobs-setter}}
+really used is @samp{@code{coq--internal-max-jobs}}. Use @samp{@code{coq-max-jobs-setter}}
or the customization system to change this variable. Otherwise
-your change will have no effect, because @samp{@code{coq-internal-max-jobs}}
+your change will have no effect, because @samp{@code{coq--internal-max-jobs}}
is not adapted.
@end defvar
-The following two options deal with the load path. Proof General
-divides the load path into the standard load path (which is
-hardwired in the tools and need not be set explicitly), the
-nonstandard load path (which must always be set explicitly), and
-the current directory (which must be set explicitly for
-@code{coqdep}). The option @code{coq-load-path} determines the
-nonstandard load path and @code{coq-load-path-include-current}
-determines whether the current directory is put into the load
-path of @code{coqdep}.
-
-@c TEXI DOCSTRING MAGIC: coq-load-path
-@defvar coq-load-path
-Non-standard coq library load path.@*
-This list specifies the LoadPath extension for coqdep, coqc and
-coqtop. Usually, the elements of this list are strings (for
-"-I") or lists of two strings (for "-R" dir "-as" path).
+@c TEXI DOCSTRING MAGIC: coq-max-background-vio2vo-percentage
+@defvar coq-max-background-vio2vo-percentage
+Percentage of @samp{@code{coq-max-background-vio2vo-percentage}} for vio2vo jobs.@*
+This setting configures the maximal number of vio2vo background
+jobs (if you set @samp{@code{coq-compile-quick}} to @code{'quick-and-vio2vo}) as
+percentage of @samp{@code{coq-max-background-compilation-jobs}}.
+@end defvar
-The possible forms of elements of this list correspond to the 3
-forms of include options ('-I' and @code{'-R'}). An element can be
-@lisp
- - A string, specifying a directory to be mapped to the empty
- logical path ('-I').
- - A list of the form '(rec dir path)' (where dir and path are
- strings) specifying a directory to be recursively mapped to the
- logical path @code{'path'} ('-R dir -as path').
- - A list of the form '(norec dir path)', specifying a directory
- to be mapped to the logical path @code{'path'} ('-I dir -as path').
-@end lisp
-For convenience the symbol @code{'rec'} can be omitted and entries of
-the form '(dir path)' are interpreted as '(rec dir path)'.
-Under normal circumstances this list does not need to
-contain the coq standard library or "." for the current
-directory (see @samp{@code{coq-load-path-include-current}}).
+@c TEXI DOCSTRING MAGIC: coq-compile-vio2vo-delay
+@defvar coq-compile-vio2vo-delay
+Delay in seconds for the vio2vo compilation.@*
+This delay helps to avoid running into a library inconsistency
+with @code{'quick-and-vio2vo}, see Coq issue #@var{5223}.
@end defvar
+Locking ancestors can be disabled with the following option.
-@c TEXI DOCSTRING MAGIC: coq-load-path-include-current
-@defvar coq-load-path-include-current
-If @samp{t} let coqdep search the current directory too.@*
-Should be @samp{t} for normal users. If @samp{t} pass "-I dir" to coqdep when
-processing files in directory "dir" in addition to any entries
-in @samp{@code{coq-load-path}}.
+@c TEXI DOCSTRING MAGIC: coq-lock-ancestors
+@defvar coq-lock-ancestors
+If non-nil, lock ancestor module files.@*
+If external compilation is used (via @samp{@code{coq-compile-command}}) then
+only the direct ancestors are locked. Otherwise all ancestors are
+locked when the "Require" command is processed.
@end defvar
-The following two options configure an external compilation
-process.
-
+The sequential compilation setting supports an external
+compilation command (which could be a parallel running
+@code{make}). For this set
+@code{coq-compile-parallel-in-background} to @code{nil} and
+configure the compilation command in @code{coq-compile-command}.
@c TEXI DOCSTRING MAGIC: coq-compile-command
@defvar coq-compile-command
@@ -4778,39 +4946,65 @@ This option can be set/reset via menu
@end defvar
-Locking ancestors can be disabled with the following option.
+The preferred way to configure the load path and the mapping of
+logical library names to physical file path is the Coq project
+file, @ref{Using the Coq project file}. Alternatively one can
+configure these things with the following options.
-@c TEXI DOCSTRING MAGIC: coq-lock-ancestors
-@defvar coq-lock-ancestors
-If non-nil, lock ancestor module files.@*
-If external compilation is used (via @samp{@code{coq-compile-command}}) then
-only the direct ancestors are locked. Otherwise all ancestors are
-locked when the "Require" command is processed.
-@end defvar
+@c TEXI DOCSTRING MAGIC: coq-load-path
+@defvar coq-load-path
+Non-standard coq library load path.@*
+This list specifies the LoadPath extension for coqdep, coqc and
+coqtop. Usually, the elements of this list are strings (for
+"-I") or lists of two strings (for "-R" dir path and
+"-Q" dir path).
+
+The possible forms of elements of this list correspond to the 4
+forms of include options (@samp{-I} @samp{-Q} and @samp{-R}). An element can be
+@lisp
+ - A list of the form @samp{(}ocamlimport dir)', specifying (in 8.5) a
+ directory to be added to ocaml path (@samp{-I}).
+ - A list of the form @samp{(}rec dir path)' (where dir and path are
+ strings) specifying a directory to be recursively mapped to the
+ logical path @samp{path} (@samp{-R dir path}).
+ - A list of the form @samp{(}recnoimport dir path)' (where dir and
+ path are strings) specifying a directory to be recursively
+ mapped to the logical path @samp{path} (@samp{-Q dir path}), but not
+ imported (modules accessible for import with qualified names
+ only). Note that -Q dir "" has a special, nonrecursive meaning.
+ - A list of the form (8.4 only) @samp{(}nonrec dir path)', specifying a
+ directory to be mapped to the logical path @code{'path'} ('-I dir -as path').
+@end lisp
+For convenience the symbol @samp{rec} can be omitted and entries of
+the form @samp{(dir path)} are interpreted as @samp{(rec dir path)}.
+A plain string maps to -Q ... "" in 8.5, and -I ... in 8.4.
+
+Under normal circumstances this list does not need to
+contain the coq standard library or "." for the current
+directory (see @samp{@code{coq-load-path-include-current}}).
-The following option controls which warnings of @code{coqdep}
-are treated as errors.
-
-@c TEXI DOCSTRING MAGIC: coq-coqdep-error-regexp
-@defvar coq-coqdep-error-regexp
-Regexp to match errors in the output of coqdep.@*
-coqdep indicates errors not always via a non-zero exit status,
-but sometimes only via printing warnings. This regular expression
-is used for recognizing error conditions in the output of
-coqdep (when coqdep terminates with exit status 0). Its default
-value matches the warning that some required library cannot be
-found on the load path and ignores the warning for finding a
-library at multiple places in the load path. If you want to turn
-the latter condition into an error, then set this variable to
-"^\*\*\* Warning".
+@var{warning}: if you use coq <= 8.4, the meaning of these options is
+not the same (-I is for coq path).
@end defvar
-The following two options do only influence the behaviour if
-Proof General does dependency checking and compilation itself.
-These options determine whether Proof General should descend into
-other Coq libraries and into the Coq standard library.
+@c TEXI DOCSTRING MAGIC: coq-load-path-include-current
+@defvar coq-load-path-include-current
+If @samp{t} let coqdep search the current directory too.@*
+Should be @samp{t} for normal users. If @samp{t} pass -Q dir "" to coqdep when
+processing files in directory "dir" in addition to any entries
+in @samp{@code{coq-load-path}}.
+
+This setting is only relevant with Coq < 8.5.
+@end defvar
+
+During library dependency checking Proof General does not dive
+into the Coq standard library or into libraries that are
+installed as user contributions. This stems from @code{coqdep},
+which does not output dependencies to these directories.
+The internal dependency check can also ignore additional
+libraries.
@c TEXI DOCSTRING MAGIC: coq-compile-ignored-directories
@defvar coq-compile-ignored-directories
@@ -4821,84 +5015,25 @@ of the regular expressions in this list then ProofGeneral does
neither compile this file nor check its dependencies for
compilation. It makes sense to include non-standard coq library
directories here if they are not changed and if they are so big
-that dependency checking takes noticeable time.
-@end defvar
-
-
-@c TEXI DOCSTRING MAGIC: coq-compile-ignore-library-directory
-@defvar coq-compile-ignore-library-directory
-If non-nil, ProofGeneral does not compile modules from the coq library.@*
-Should be @samp{t} for normal coq users. If @samp{nil} library modules are
-compiled if their sources are newer.
-
-This option has currently no effect, because Proof General uses
-coqdep to translate qualified identifiers into library file names
-and coqdep does not output dependencies in the standard library.
+that dependency checking takes noticeable time. The regular
+expressions in here are always matched against the .vo file name,
+regardless whether @samp{`-quick}' would be used to compile the file
+or not.
@end defvar
-The last three Emacs constants are internal parameters. They only
-need to be changed under very special, unforeseen circumstances.
-They can only be set in Emacs lisp code because they are no
-customizable user options.
-
-@c TEXI DOCSTRING MAGIC: coq-compile-substitution-list
-@defvar coq-compile-substitution-list
-Substitutions for @samp{@code{coq-compile-command}}.@*
-Value must be a list of substitutions, where each substitution is
-a 2-element list. The first element of a substitution is the
-regexp to substitute, the second the replacement. The replacement
-is evaluated before passing it to @samp{@code{replace-regexp-in-string}}, so
-it might be a string, or one of the symbols @code{'physical-dir},
-@code{'module-object}, @code{'module-source}, @code{'qualified-id} and
-@code{'requiring-file}, which are bound to, respectively, the physical
-directory containing the source file, the Coq object file in
-@code{'physical-dir} that will be loaded, the Coq source file in
-@code{'physical-dir} whose object will be loaded, the qualified module
-identifier that occurs in the "Require" command, and the file
-that contains the "Require".
-@end defvar
-
-
-@c TEXI DOCSTRING MAGIC: coq-require-command-regexp
-@defvar coq-require-command-regexp
-Regular expression matching Require commands in Coq.@*
-Should match "Require" with its import and export variants up to (but not
-including) the first character of the first required module. The required
-modules are matched separately with @samp{@code{coq-require-id-regexp}}
-@end defvar
-
-
-@c TEXI DOCSTRING MAGIC: coq-require-id-regexp
-@defvar coq-require-id-regexp
-Regular expression matching one Coq module identifier.@*
-Should match precisely one complete module identifier and surrounding
-white space. The module identifier must be matched with group number 1.
-Note that the trailing dot in "Require A." is not part of the module
-identifier and should therefore not be matched by this regexp.
-@end defvar
-
-
-
@node Current Limitations
@subsection Current Limitations
-In the current release some aspects of multiple file support have
-not been implemented. The following points will hopefully
-be addressed at some stage.
-
@itemize
@item
-Support @code{Declare ML Module} commands.
+No support @code{Declare ML Module} commands.
@item
-Increase precision when comparing modification times. Because of
-an Emacs limitation, modification time stamps of files have only a
-precision of 1 second. If several compiled Coq object files have
-been created in the same second, Proof General is optimistic and
-does not recompile. (Note that GNU make behaves the same on file
-systems that record time stamps only with a precision of 1
-second.) Emacs version 24.3 implements high precision time stamps
-on files.
+When a compiled library has the same time stamp as the source
+file, it is considered outdated. Some old file systems (for
+instance ext3) or Emacs before version 24.3 support only time
+stamps with one second granularity. On such configurations Proof
+General will perform some unnecessary compilations.
@end itemize
@@ -5401,12 +5536,12 @@ model checking crew).
@appendix Obtaining and Installing
Proof General has its own
-@uref{http://proofgeneral.inf.ed.ac.uk,home page} hosted at
-Edinburgh. Visit this page for the latest news!
+@uref{https://proofgeneral.github.io,home page} hosted at
+GitHub. Visit this page for the latest news!
@menu
* Obtaining Proof General::
-* Installing Proof General from tarball::
+* Installing Proof General from sources::
* Setting the names of binaries::
* Notes for syssies::
@end menu
@@ -5417,55 +5552,46 @@ Edinburgh. Visit this page for the latest news!
You can obtain Proof General from the URL
@example
-@uref{http://proofgeneral.inf.ed.ac.uk}.
+@uref{https://github.com/ProofGeneral/PG}.
@end example
-The distribution is available in as a tarball. It may be
-redistributed by third party packagers in other forms.
+The distribution is available in the master branch of the repository.
+Tagged versions of the sources may be redistributed by third party
+packagers in other forms.
-Two versions are available:
-@itemize @bullet
-@item The current stable version, @*
-@uref{http://proofgeneral.inf.ed.ac.uk/ProofGeneral-stable.tgz}
-@item The latest development version, @*
-@uref{http://proofgeneral.inf.ed.ac.uk/ProofGeneral-latest.tgz}
-@end itemize
-
-The source tarball includes the generic elisp code, and code for LEGO,
-Coq, Isabelle, and other provers. Also included are installation
+The sources includes the generic elisp code, and code for Coq, LEGO,
+Isabelle, and other provers. Also included are installation
instructions (reproduced in brief below) and this documentation.
-For access to the source code repository, please see the
-Proof General web page @uref{http://proofgeneral.inf.ed.ac.uk/devel}.
-
-@node Installing Proof General from tarball
-@section Installing Proof General from tarball
+@node Installing Proof General from sources
+@section Installing Proof General from sources
-Copy the distribution to some directory @var{mydir}.
-Unpack it there. For example:
+Remove old versions of Proof General, then download and install the new
+release from GitHub:
@example
-# cd @var{mydir}
-# tar -xpzf ProofGeneral-@var{version}.tgz
+$ git clone https://github.com/ProofGeneral/PG ~/.emacs.d/lisp/PG
+$ cd ~/.emacs.d/lisp/PG
+$ make
@end example
-If you downloaded the version called @var{latest}, you'll find it
-unpacks to a numeric version number.
-Proof General will now be in some subdirectory of @var{mydir}. The name
-of the subdirectory will depend on the version number of Proof General.
-For example, it might be @file{ProofGeneral-4.0}. It's convenient to
-link it to a fixed name:
-@example
-# ln -sf ProofGeneral-4.0 ProofGeneral
-@end example
-Now put this line in your @file{.emacs} file:
+Then add the following to your @file{.emacs}:
@lisp
- (load-file "@var{mydir}/ProofGeneral/generic/proof-site.el")
+;; Open .v files with Proof General's Coq mode
+(load "~/.emacs.d/lisp/PG/generic/proof-site")
@end lisp
+If Proof General complains about a version mismatch, make sure that the
+shell's @code{emacs} is indeed your usual Emacs. If not, run the Makefile
+again with an explicit path to Emacs. On macOS in particular you'll
+probably need something like
+@example
+make clean; make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
+@end example
+
@node Setting the names of binaries
@section Setting the names of binaries
-The @code{load-file} command you have added will load @file{proof-site}
+The @code{load} command you have added will load @file{proof-site}
which sets the Emacs load path for Proof General and add auto-loads and
modes for the supported assistants.
@@ -5487,7 +5613,8 @@ If you do not want to use customize, simply add a line like this:
(setq coq-prog-name "/usr/bin/coqtop -emacs")
@end lisp
to your @file{.emacs} file.
-
+For more advice on how to customize the @code{coq-prog-name} variable,
+@pxref{Using file variables}, Remark 2.
@node Notes for syssies
diff --git a/etc/ProofGeneral.spec b/etc/ProofGeneral.spec
index 5e812fdb..2a97e19e 100644
--- a/etc/ProofGeneral.spec
+++ b/etc/ProofGeneral.spec
@@ -1,6 +1,6 @@
Summary: Proof General, Emacs interface for Proof Assistants
Name: ProofGeneral
-Version: 4.3pre150313
+Version: 4.4.1~pre
Release: 1
Group: Text Editors/Integrated Development Environments (IDE)
License: GPL
diff --git a/etc/desktop/icons/128x128/proofgeneral.png b/etc/desktop/icons/128x128/proofgeneral.png
new file mode 100644
index 00000000..555e4a87
--- /dev/null
+++ b/etc/desktop/icons/128x128/proofgeneral.png
Binary files differ
diff --git a/etc/desktop/icons/16x16/proofgeneral.png b/etc/desktop/icons/16x16/proofgeneral.png
index 276c5d29..50a4bc5e 100644
--- a/etc/desktop/icons/16x16/proofgeneral.png
+++ b/etc/desktop/icons/16x16/proofgeneral.png
Binary files differ
diff --git a/etc/desktop/icons/32x32/proofgeneral.png b/etc/desktop/icons/32x32/proofgeneral.png
index 576e97cf..9e5cdbfc 100644
--- a/etc/desktop/icons/32x32/proofgeneral.png
+++ b/etc/desktop/icons/32x32/proofgeneral.png
Binary files differ
diff --git a/etc/desktop/icons/48x48/proofgeneral.png b/etc/desktop/icons/48x48/proofgeneral.png
index 984a7f77..148bbe6c 100644
--- a/etc/desktop/icons/48x48/proofgeneral.png
+++ b/etc/desktop/icons/48x48/proofgeneral.png
Binary files differ
diff --git a/etc/desktop/icons/64x64/proofgeneral.png b/etc/desktop/icons/64x64/proofgeneral.png
new file mode 100644
index 00000000..15492240
--- /dev/null
+++ b/etc/desktop/icons/64x64/proofgeneral.png
Binary files differ
diff --git a/generic/pg-custom.el b/generic/pg-custom.el
index efbc8a76..2edf320e 100644
--- a/generic/pg-custom.el
+++ b/generic/pg-custom.el
@@ -150,7 +150,7 @@ Completion is activated with \\[complete].
If this table is empty or needs adjusting, please make changes using
`customize-variable' and post suggestions at
-http://proofgeneral.inf.ed.ac.uk/trac"
+https://github.com/ProofGeneral/PG/issues"
:type '(repeat string)
:group 'prover-config)
diff --git a/generic/pg-response.el b/generic/pg-response.el
index b0cf217d..893d1f6f 100644
--- a/generic/pg-response.el
+++ b/generic/pg-response.el
@@ -22,6 +22,7 @@
(defvar proof-assistant-menu nil))
(require 'pg-assoc)
+(require 'span)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -157,23 +158,29 @@ Following POLICY, which can be one of 'smart, 'horizontal,
(other-window 1)
(switch-to-buffer b2)
(proof-safe-split-window-vertically) ; enlarge vertically if necessary
+ (set-window-dedicated-p (selected-window) proof-three-window-enable)
(other-window 1)
- (switch-to-buffer b3))
+ (switch-to-buffer b3)
+ (set-window-dedicated-p (selected-window) proof-three-window-enable))
((eq pol 'vertical)
(split-window-vertically)
(other-window 1)
(switch-to-buffer b2)
(proof-safe-split-window-vertically) ; enlarge vertically if necessary
+ (set-window-dedicated-p (selected-window) proof-three-window-enable)
(other-window 1)
- (switch-to-buffer b3))
+ (switch-to-buffer b3)
+ (set-window-dedicated-p (selected-window) proof-three-window-enable))
((eq pol 'horizontal)
(split-window-horizontally) ; horizontally again
(other-window 1)
(switch-to-buffer b2)
(enlarge-window (/ (frame-width) 6) t) ; take 2/3 of width before splitting again
(split-window-horizontally) ; horizontally again
+ (set-window-dedicated-p (selected-window) proof-three-window-enable)
(other-window 1)
- (switch-to-buffer b3))))))
+ (switch-to-buffer b3)
+ (set-window-dedicated-p (selected-window) proof-three-window-enable))))))
@@ -270,7 +277,7 @@ dragging the separating bars.
(proof-delete-all-associated-windows)
(set-window-dedicated-p (selected-window) nil)
(proof-display-three-b proof-three-window-mode-policy))
- ;; Two-of-three window mode.
+ ;; Two window mode.
;; Show the response buffer as first in preference order.
(t
;; If we are coming from multiple frame mode, delete associated
@@ -393,23 +400,23 @@ Returns non-nil if response buffer was cleared."
(t
(let (start end)
(with-current-buffer proof-response-buffer
- (setq buffer-read-only nil)
- ;; da: I've moved newline before the string itself, to match
- ;; the other cases when messages are inserted and to cope
- ;; with warnings after delayed output (non newline terminated).
- (goto-char (point-max))
- ;; insert a newline before the new message unless the
- ;; buffer is empty or proof-script-insert-newlines is nil
- (unless (or (not proof-script-insert-newlines)
- (eq (point-min) (point-max)))
- (newline))
- (setq start (point))
- (insert str)
- (unless (bolp) (newline))
- (when face
- (overlay-put
- (make-overlay start (point-max))
- 'face face))
+ (setq buffer-read-only nil)
+ ;; da: I've moved newline before the string itself, to match
+ ;; the other cases when messages are inserted and to cope
+ ;; with warnings after delayed output (non newline terminated).
+ (goto-char (point-max))
+ ;; insert a newline before the new message unless the
+ ;; buffer is empty or proof-script-insert-newlines is nil
+ (unless (or (not proof-script-insert-newlines)
+ (eq (point-min) (point-max)))
+ (newline))
+ (setq start (point))
+ (insert str)
+ (unless (bolp) (newline))
+ (when face
+ (overlay-put
+ (span-make start (point-max))
+ 'face face))
(setq buffer-read-only t)
(set-buffer-modified-p nil))))))
diff --git a/generic/pg-user.el b/generic/pg-user.el
index f0358239..513b477b 100644
--- a/generic/pg-user.el
+++ b/generic/pg-user.el
@@ -1273,7 +1273,11 @@ assuming the undo-in-region behavior will apply if ARG is non-nil."
buffer-undo-list))) ; can be nil
(if (or (null undo-list) (equal undo-list (list nil)))
nil ; there is clearly no undo elt
- (while (eq (car undo-list) nil)
+ (while (and undo-list ; to ensure it will terminate
+ (let ((elt (car undo-list)))
+ (not (and (consp elt)
+ (or (stringp (car elt))
+ (integerp (car elt)))))))
(setq undo-list (cdr undo-list))) ; get the last undo record
(if (and (eq last-command 'undo)
(or (eq pending-undo-list t)
diff --git a/generic/pg-vars.el b/generic/pg-vars.el
index 8dac2f11..3aafa97d 100644
--- a/generic/pg-vars.el
+++ b/generic/pg-vars.el
@@ -247,7 +247,7 @@ Internal variable dynamically bound.")
:group 'proof-general-internals)
(defcustom proof-general-home-page
- "http://proofgeneral.inf.ed.ac.uk"
+ "https://proofgeneral.github.io"
"*Web address for Proof General."
:type 'string
:group 'proof-general-internals)
diff --git a/generic/proof-config.el b/generic/proof-config.el
index b4898a35..8ce53168 100644
--- a/generic/proof-config.el
+++ b/generic/proof-config.el
@@ -1683,7 +1683,12 @@ tries to interrupt the proof process. It is therefore run earlier
than `proof-shell-handle-error-or-interrupt-hook', which runs
when the interrupt is acknowledged inside `proof-shell-exec-loop'.
-This hook also runs when the proof assistent is killed."
+This hook also runs when the proof assistent is killed.
+
+Hook functions should set the dynamic variable `prover-was-busy'
+to t if there might have been a reason to interrupt. Otherwise
+the generic interrupt handler might issue a prover-not-busy
+error."
:type '(repeat function)
:group 'proof-shell)
diff --git a/generic/proof-faces.el b/generic/proof-faces.el
index 86cf7f0d..0eafc075 100644
--- a/generic/proof-faces.el
+++ b/generic/proof-faces.el
@@ -18,7 +18,7 @@
;; But it's difficult to keep track of all that!
;; Please report any bad/failing colour
;; combinations (with suggested improvements) at
-;; http://proofgeneral.inf.ed.ac.uk/trac
+;; https://github.com/ProofGeneral/PG/issues
;;
;; Some of these faces aren't used by default in Proof General,
;; but you can use them in font lock patterns for specific
diff --git a/generic/proof-script.el b/generic/proof-script.el
index 3a24595e..e67a7774 100644
--- a/generic/proof-script.el
+++ b/generic/proof-script.el
@@ -1240,12 +1240,16 @@ activation is considered to have failed and an error is given."
(assert (null proof-script-buffer)
"Bug in proof-activate-scripting: deactivate failed.")
- ;; Set the active scripting buffer, and initialise regions
+ ;; Set the active scripting buffer
(setq proof-script-buffer (current-buffer))
;; Fire up the prover (or check it's going the right way).
- (proof-shell-ready-prover queuemode)
+ (condition-case-unless-debug err
+ (proof-shell-ready-prover queuemode)
+ (error (setq proof-script-buffer nil)
+ (signal (car err) (cdr err))))
+ ;; Initialise regions
(if (proof-locked-region-empty-p) ; leave alone if non-empty
(proof-init-segmentation))
@@ -1985,11 +1989,12 @@ No effect if prover is busy."
(proof-interrupt-process)
(proof-shell-wait))
(save-excursion
- (save-restriction ;; see Trac#403
- (widen)
- (goto-char beg)
- (proof-retract-until-point)
- (proof-shell-wait)))))
+ (save-match-data ;; see PG#41
+ (save-restriction ;; see Trac#403
+ (widen)
+ (goto-char beg)
+ (proof-retract-until-point)
+ (proof-shell-wait))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/generic/proof-shell.el b/generic/proof-shell.el
index 4f89963e..51038fa6 100644
--- a/generic/proof-shell.el
+++ b/generic/proof-shell.el
@@ -21,11 +21,20 @@
(require 'span)
(require 'proof-utils))
+;; declare a few functions and variables from proof-tree - if we
+;; require proof-tree the compiler complains about a recusive
+;; dependency.
+(declare-function proof-tree-urgent-action "proof-tree" (flags))
+(declare-function proof-tree-handle-delayed-output "proof-tree"
+ (old-proof-marker cmd flags span))
+(eval-when (compile)
+ ;; without the nil initialization the compiler still warns about this variable
+ (defvar proof-tree-external-display nil))
+
(require 'scomint)
(require 'pg-response)
(require 'pg-goals)
(require 'pg-user) ; proof-script, new-command-advance
-(require 'proof-tree)
;;
@@ -79,9 +88,11 @@ See the functions `proof-start-queue' and `proof-shell-exec-loop'.")
(defsubst proof-shell-invoke-callback (listitem)
"From `proof-action-list' LISTITEM, invoke the callback on the span."
- (condition-case nil
+ (condition-case err
(funcall (nth 2 listitem) (car listitem))
- (error nil)))
+ (error
+ (message "error escaping proof-shell-invoke-callback: %s" err)
+ nil)))
(defvar proof-second-action-list-active nil
"Signals that some items are waiting outside of `proof-action-list'.
@@ -293,8 +304,10 @@ process command."
(apply proof-guess-command-line (list name)))))
(if proof-prog-name-ask
- (setq proof-prog-name (read-shell-command "Run process: "
- proof-prog-name)))
+ ;; if this option is set, an absolute file name is better to show if possible
+ (let ((prog-name (locate-file proof-prog-name exec-path exec-suffixes 1)))
+ (setq proof-prog-name (read-shell-command "Run process: "
+ prog-name))))
(let
((proc (downcase proof-assistant)))
@@ -379,7 +392,10 @@ process command."
(setq proof-shell-buffer (get-buffer (concat "*" proc "*")))
(unless (proof-shell-live-buffer)
- ;; Give error now if shell buffer isn't live (process exited)
+ ;; Give error now if shell buffer isn't live (process exited). We also
+ ;; set the process filter to nil to avoid processing error messages
+ ;; related to the process exit.
+ (set-process-filter (get-buffer-process proof-shell-buffer) nil)
(setq proof-shell-buffer nil)
(error "Starting process: %s..failed" prog-command-line)))
@@ -448,7 +464,9 @@ shell buffer, called by `proof-shell-bail-out' if process exits."
(proc (get-buffer-process (current-buffer)))
(bufname (buffer-name)))
(message "%s, cleaning up and exiting..." bufname)
- (run-hooks 'proof-shell-signal-interrupt-hook)
+ (let (prover-was-busy)
+ ;; hook functions might set prover-was-busy
+ (run-hooks 'proof-shell-signal-interrupt-hook))
(redisplay t)
(when (and alive proc)
@@ -810,14 +828,18 @@ In the first case, PG will terminate the queue of commands at the first
available point. In the second case, you may need to press enter inside
the prover command buffer (e.g., with Isabelle2009 press RET inside *isabelle*)."
(interactive)
- (unless (proof-shell-live-buffer)
+ (let ((prover-was-busy nil))
+ (unless (proof-shell-live-buffer)
(error "Proof process not started!"))
- (unless proof-shell-busy
- (error "Proof process not active!"))
- (setq proof-shell-interrupt-pending t)
- (with-current-buffer proof-shell-buffer
- (interrupt-process))
- (run-hooks 'proof-shell-signal-interrupt-hook))
+ ;; hook functions might set prover-was-busy
+ (run-hooks 'proof-shell-signal-interrupt-hook)
+ (if proof-shell-busy
+ (progn
+ (setq proof-shell-interrupt-pending t)
+ (with-current-buffer proof-shell-buffer
+ (interrupt-process)))
+ (unless prover-was-busy
+ (error "Proof process not active!")))))
diff --git a/generic/proof-site.el b/generic/proof-site.el
index e4fe9096..48a2bdae 100644
--- a/generic/proof-site.el
+++ b/generic/proof-site.el
@@ -72,8 +72,8 @@
;;
(eval-and-compile
-;; WARNING: do not edit next line (constant is edited in Makefile.devel)
- (defconst proof-general-version "Proof General Version 4.3pre150313. Released by da."
+ ;; WARNING: do not edit next line (constant is edited in Makefile.devel)
+ (defconst proof-general-version "Proof General Version 4.4.1~pre."
"Version string identifying Proof General release."))
(defconst proof-general-short-version
@@ -82,7 +82,7 @@
(string-match "Version \\([^ ]+\\)\\." proof-general-version)
(match-string 1 proof-general-version))))
-(defconst proof-general-version-year "2015")
+(defconst proof-general-version-year "2016")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
diff --git a/generic/proof-splash.el b/generic/proof-splash.el
index 19516af4..25db0946 100644
--- a/generic/proof-splash.el
+++ b/generic/proof-splash.el
@@ -46,38 +46,35 @@ Proof General."
(defcustom proof-splash-contents
'(list
- nil
- (proof-get-image "pg-text" t)
- nil
- (proof-get-image "ProofGeneral-image")
+ (proof-get-image "ProofGeneral-splash.png")
nil
"Welcome to"
(concat proof-assistant " Proof General!")
nil
(concat "Version " proof-general-short-version ".")
nil
- (concat "(C) LFCS, University of Edinburgh " proof-general-version-year)
+ (concat "© LFCS, University of Edinburgh & contributors " proof-general-version-year)
nil
nil
:link '(" Read the "
"Proof General documentation"
- (lambda (button) (info "ProofGeneral")))
- :link '(" Please report problems at "
- "Proof General trac"
- (lambda (button)
- (browse-url "http://proofgeneral.inf.ed.ac.uk/trac"))
- "Report bugs at http://proofgeneral.inf.ed.ac.uk/trac")
- :link '("Visit the " "Proof General wiki"
- (lambda (button)
- (browse-url "http://proofgeneral.inf.ed.ac.uk/wiki"))
- "Write lots of helpful things at http://proofgeneral.inf.ed.ac.uk/wiki")
+ (lambda (button) (info "ProofGeneral")))
+ :link '(" Please report problems on the "
+ "Github issue tracker"
+ (lambda (button)
+ (browse-url "https://github.com/ProofGeneral/PG/issues"))
+ "Report bugs at https://github.com/ProofGeneral/PG")
+ :link '("Visit the " "Proof General Github page"
+ (lambda (button)
+ (browse-url "https://github.com/ProofGeneral/PG"))
+ "PG is on Github at https://github.com/ProofGeneral/PG")
:link '("or the " "homepage"
- (lambda (button)
- (browse-url "http://proofgeneral.inf.ed.ac.uk/"))
- "Browse http://proofgeneral.inf.ed.ac.uk/")
+ (lambda (button)
+ (browse-url "https://proofgeneral.github.io"))
+ "Browse https://proofgeneral.github.io")
nil
- :link '("Find out about Emacs on the Help menu -- start with the "
- "Emacs Tutorial" (lambda (button) (help-with-tutorial)))
+ :link '("Find out about Emacs on the Help menu -- start with the "
+ "Emacs Tutorial" (lambda (button) (help-with-tutorial)))
nil
"See this screen again with Proof-General -> About"
)
@@ -117,27 +114,12 @@ If it is nil, a new line is inserted."
(and (listp img) (eq (car img) 'image)))
-(defun proof-get-image (name &optional nojpeg default)
- "Construct an image instantiator for an image, or string failing that.
-Different formats are chosen from according to what can be displayed.
-Unless NOJPEG is set, try jpeg first. Then try gif, then xpm.
-Gif filename depends on colour depth of display.
-DEFAULT gives return value in case image not valid."
- (let ((jpg (vector 'jpeg :file
- (concat proof-images-directory name ".jpg")))
- (gif (vector 'gif :file
- (concat proof-images-directory ".gif")))
- img)
- (cond
- (window-system
- (find-image
- (list
- (list :type 'jpeg
- :file (concat proof-images-directory name ".jpg"))
- (list :type 'gif
- :file (concat proof-images-directory name ".gif")))))
- (t
- (or default (concat "[ image " name " ]"))))))
+(defun proof-get-image (name)
+ "Load a PNG image NAME, or string on TTYs."
+ (if (display-graphic-p)
+ (find-image
+ `((:type png :file ,(expand-file-name name proof-images-directory))))
+ (concat "[ image " name " ]")))
(defvar proof-splash-timeout-conf nil
"Holds timeout ID and previous window config for proof splash screen.")
diff --git a/generic/proof-tree.el b/generic/proof-tree.el
index 03af645e..f0894656 100644
--- a/generic/proof-tree.el
+++ b/generic/proof-tree.el
@@ -556,7 +556,8 @@ Runs on process status changes and cleans up when prooftree dies."
"Start the external prooftree process.
Does also initialize the communication channel and some internal
variables."
- (let ((old-proof-tree (get-process proof-tree-process-name)))
+ (let ((process-connection-type nil) ; use pipes, see emacs bug #24531
+ (old-proof-tree (get-process proof-tree-process-name)))
;; reset output marker
(when proof-tree-output-marker
(set-marker proof-tree-output-marker nil)
@@ -841,13 +842,14 @@ The not yet delayed output is in the region
(start proof-shell-delayed-output-start)
(end proof-shell-delayed-output-end)
inst-ex-vars)
- (when (and (not (memq 'proof-tree-show-subgoal flags))
- (> state proof-tree-last-state))
- ;; Only deal with existentials if the proof assistant has them
- ;; (i.e., proof-tree-existential-regexp is set) and if there are some
- ;; goals with existentials.
- (when (and proof-tree-existential-regexp
+ (unless (memq 'proof-tree-show-subgoal flags)
+ (when (and (> state proof-tree-last-state)
+ proof-tree-existential-regexp
proof-tree-existentials-alist)
+ ;; Only deal with existentials if this is not and undo
+ ;; command, if the proof assistant actually has existentials
+ ;; (i.e., proof-tree-existential-regexp is set) and if there
+ ;; are some goals with existentials.
(setq inst-ex-vars
(with-current-buffer proof-shell-buffer
(funcall proof-tree-extract-instantiated-existentials
diff --git a/generic/proof-utils.el b/generic/proof-utils.el
index f559eead..75ddbf69 100644
--- a/generic/proof-utils.el
+++ b/generic/proof-utils.el
@@ -220,43 +220,59 @@ Leave point at END."
(unless (and (boundp sym) (symbol-value sym))
(warn "Proof General %s: %s is unset." tag (symbol-name sym))))
+(defvar proof-advertise-layout-freq 30
+ "Frequency for PG messages to be displayed from time to time.")
+(defvar proof-advertise-layout-count proof-advertise-layout-freq
+ "counter used to display PG messages from time to time.")
+
(defun proof-get-window-for-buffer (buffer)
"Find a window for BUFFER, display it there, return the window.
-NB: may change the selected window."
+NB: may change the selected window. This function is a wrapper on
+display-buffer. The idea is that if the user has opened and
+closed some windows we want to preserve the layout by only
+switching buffer in already pg-associate windows. So if the
+buffer is not already displayed, we try to reuse an existing
+associated window, even if in 3-win mode. If no such window
+exists, we fall back to display-buffer while protecting script
+buffer to be hidden or split.
+
+Experimentally we display a message from time to time advertising
+C-c C-l."
;; IF there *isn't* a visible window showing buffer...
(unless (get-buffer-window buffer 0)
- ;; THEN find somewhere nice to display it
- (if (and
- ;; If we're in two-window mode and already displaying a
- ;; script/response/goals, try to just switch the buffer
- ;; instead of calling display-buffer which alters sizes.
- ;; Gives user some stability on display.
- (not proof-three-window-enable)
- (> (count-windows) 1)
- ;; was: (not (eq (next-window) (selected-window)))
- (memq (window-buffer (next-window nil 'ignoreminibuf))
- ;; NB: 3.5: added rest of assoc'd buffers here
- (cons proof-script-buffer (proof-associated-buffers))))
- (if (eq (selected-window) (minibuffer-window))
- ;; 17.8.01: avoid switching the minibuffer's contents
- ;; -- terrrible confusion -- use next-window after
- ;; script buffer instead.
- ;; (another hack which is mostly right)
- (set-window-buffer
- (next-window
- (car-safe (get-buffer-window-list proof-script-buffer))
- 'ignoreminibuf) buffer)
- (if (eq (window-buffer (next-window nil 'ignoreminibuf))
- proof-script-buffer)
- ;; switch this window
- (set-window-buffer (selected-window) buffer)
- ;; switch other window
- (set-window-buffer (next-window nil 'ignoreminibuf) buffer)))
- ;; o/w: call display buffer to configure windows nicely.
- (display-buffer buffer)))
+ (if proof-three-window-enable
+ (if (< proof-advertise-layout-count 30) (incf proof-advertise-layout-count)
+ (message (substitute-command-keys "Hit \\[proof-layout-windows] to reset layout"))
+ (setq proof-advertise-layout-count 0)))
+ ;; THEN either we are in 2 wins mode and we must switch the assoc
+ ;; window to buffer OR we deleted a window by mistake and we
+ ;; behave as if in 2 win mode instead of calling display-buffer
+ ;; (stability for the user). If no assoc win exists then we are in
+ ;; trouble: let display-buffer decide but avoid hiding the script buffer.
+ (if (= (count-windows) 1)
+ ;; only one window: fallback to display-buffer
+ (display-buffer buffer)
+ ;; There is at least 2 windows, let us find some assoc ones.
+ (let* ((assoc-wins (proof-associated-windows))
+ ;; may be nil if no assoc frame
+ (win-to-use (and assoc-wins (car assoc-wins))))
+ ;; let us switch the buffer in this window even if protected (3-win mode)
+ (if win-to-use
+ (let ((prot (window-dedicated-p win-to-use)))
+ (set-window-dedicated-p win-to-use nil)
+ (set-window-buffer win-to-use buffer)
+ (set-window-dedicated-p win-to-use prot))
+ ;; if no assoc win then let display-buffer decide but
+ ;; protect script buffer from disappearing.
+ (let ((win-proof-script (car-safe (get-buffer-window-list proof-script-buffer))))
+ (set-window-dedicated-p win-proof-script t) ; avoid to hide script buffer at all cost
+ (let ((res (display-buffer buffer))) ; return this but revert the dedicated flag first
+ (set-window-dedicated-p win-proof-script nil)
+ res))))))
;; Return the window, hopefully the one we first thought of.
(get-buffer-window buffer 0))
+
(defun proof-display-and-keep-buffer (buffer &optional pos force)
"Display BUFFER and make window according to display mode.
If optional POS is present, will set point to POS.
@@ -330,7 +346,7 @@ If flag `proof-general-debug' is nil, do nothing."
(with-current-buffer (get-buffer-create "*PG Debug*")
(help-mode)
(let ((formatted (apply 'format msg args))
- (log-warning-minimum-level :debug)
+ (warning-minimum-log-level :debug)
(warning-minimum-level :debug)
(buffer-read-only nil))
(display-warning 'proof-general
@@ -431,14 +447,23 @@ or if the window is the only window of its frame."
;; buffers? Probably not an issue for us, but one
;; wonders at the shrink to fit strategy.
;; NB: way to calculate pixel fraction?
- (+ extraline (count-lines (point-min) (point-max)))))
+ (+ extraline (count-lines (point-min) (point-max))))
+ (safe-desired-height
+ ;; Under certain circumstances (involving a non-nil
+ ;; line-spacing), a desired-height of 1 (which happens
+ ;; quite often, eg for an empty response buffer) gives an
+ ;; error inside set-window-text-height. The reason for
+ ;; this is quite complicated, it involves rounding issues
+ ;; and emacs' habbit to sometimes resize a window by 2
+ ;; pixels.
+ (max 2 desired-height)))
;; Let's shrink or expand. Uses new GNU Emacs function.
(let ((window-size-fixed nil))
(set-window-text-height window
;; As explained earlier: use abs-max-height
;; but only if that makes it display all.
- (if (> desired-height absolute-max-height)
- max-height desired-height)))
+ (if (> safe-desired-height absolute-max-height)
+ max-height safe-desired-height)))
(if (window-live-p window)
(progn
(if (>= (window-text-height window) desired-height)
diff --git a/images/ProofGeneral-splash.png b/images/ProofGeneral-splash.png
new file mode 100644
index 00000000..a1006f9f
--- /dev/null
+++ b/images/ProofGeneral-splash.png
Binary files differ
diff --git a/images/ProofGeneral.png b/images/ProofGeneral.png
new file mode 100644
index 00000000..bc372424
--- /dev/null
+++ b/images/ProofGeneral.png
Binary files differ
diff --git a/images/README b/images/README
index 9bba39f7..10fa1403 100644
--- a/images/README
+++ b/images/README
@@ -1,8 +1,10 @@
$Id$
-Icons for Proof General.
+# Image credits
-The images in this directory were made with The Gimp and Inkscape.
+## Icons and button graphics
+
+Most of the images in this directory were made with The Gimp and Inkscape.
They were created in my spare time as a donation to the Proof General
project. The images here are released under the Creative Commons
license, see https://creativecommons.org/licenses/by-sa/3.0/
@@ -12,17 +14,14 @@ Fitzsimon's Etiquette search icon (under CC 2.0).
[ Inkscape-based icons forthcoming ]
-
Note for developers: the sources for images have been moved
to the PG graphics repository.
- David Aspinall <da@inf.ed.ac.uk>
-
-
-
-
-
-
-
+ David Aspinall <da@inf.ed.ac.uk>
+## Proof General logo
+The 2016 “chibi” icons were contributed by Yoshihiro Imai
+(http://proofcafe.org/~yoshihiro503/, http://proofcafe.org/wiki/Generaltan).
+They are available under the CC-BY-SA 3.0 license; for more information, see
+https://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file
diff --git a/isar/interface b/isar/interface
index 16d7d567..16d7d567 100644..100755
--- a/isar/interface
+++ b/isar/interface
diff --git a/isar/isartags b/isar/isartags
index 0d65f8e6..0d65f8e6 100644..100755
--- a/isar/isartags
+++ b/isar/isartags
diff --git a/lego/legotags b/lego/legotags
index 8243287a..8243287a 100644..100755
--- a/lego/legotags
+++ b/lego/legotags
diff --git a/lib/span.el b/lib/span.el
index 2d18f3c8..f1379616 100644
--- a/lib/span.el
+++ b/lib/span.el
@@ -12,8 +12,7 @@
;; Spans are our abstraction of extents/overlays. Nowadays
;; we implement them directly with overlays.
;;
-;; In future this module should be used to implement the abstraction
-;; for script buffers (only) more directly.
+;; FIXME: eliminate aliases and directly use overlays
;;
;;; Code:
@@ -23,29 +22,36 @@
(defalias 'span-end 'overlay-end)
(defalias 'span-set-property 'overlay-put)
(defalias 'span-property 'overlay-get)
-(defalias 'span-make 'make-overlay)
+(defun span-make (&rest args)
+ (let ((span (apply #'make-overlay args)))
+ (span-set-property span 'pg-span t)
+ span))
(defalias 'span-detach 'delete-overlay)
(defalias 'span-set-endpoints 'move-overlay)
(defalias 'span-buffer 'overlay-buffer)
+(defun span-p (ol)
+ "Check if an overlay belongs to PG."
+ (overlay-get ol 'pg-span))
+
(defun span-read-only-hook (overlay after start end &optional len)
(unless inhibit-read-only
(error "Region is read-only")))
(add-to-list 'debug-ignored-errors "Region is read-only")
-(defsubst span-read-only (span)
+(defun span-read-only (span)
"Set SPAN to be read only."
;; Note: using the standard 'read-only property does not work.
;; (overlay-put span 'read-only t))
(span-set-property span 'modification-hooks '(span-read-only-hook))
(span-set-property span 'insert-in-front-hooks '(span-read-only-hook)))
-(defsubst span-read-write (span)
+(defun span-read-write (span)
"Set SPAN to be writeable."
(span-set-property span 'modification-hooks nil)
(span-set-property span 'insert-in-front-hooks nil))
-(defsubst span-write-warning (span fun)
+(defun span-write-warning (span fun)
"Give a warning message when SPAN is changed, unless `inhibit-read-only' is non-nil."
(lexical-let ((fun fun))
(let ((funs (list (lambda (span afterp beg end &rest args)
@@ -56,55 +62,54 @@
;; We use end first because proof-locked-queue is often changed, and
;; its starting point is always 1
-(defsubst span-lt (s u)
+(defun span-lt (s u)
(or (< (span-end s) (span-end u))
(and (eq (span-end s) (span-end u))
(< (span-start s) (span-start u)))))
-(defsubst spans-at-point-prop (pt prop)
+(defun spans-filter (overlays prop &optional val)
+ "Filter OVERLAYS to those with PROP (optionally matching VAL)."
(let (ols)
- (if (null prop)
- (overlays-at pt)
- (dolist (ol (overlays-at pt))
- (if (overlay-get ol prop)
- (push ol ols)))
- ols)))
-
-(defsubst spans-at-region-prop (start end prop)
+ (dolist (ol overlays)
+ (when (span-p ol)
+ (let* ((propval (overlay-get ol prop))
+ (keep (if val (eq propval val) propval)))
+ (when keep
+ (push ol ols)))))
+ ols))
+
+(defun spans-at-point-prop (pt prop)
+ (spans-filter (overlays-at pt) prop))
+
+(defun spans-at-region-prop (start end prop)
"Return a list of the spans in START END with PROP."
- (let (ols)
- (if (null prop)
- (overlays-in start end)
- (dolist (ol (overlays-in start end))
- (if (overlay-get ol prop)
- (push ol ols)))
- ols)))
-
-(defsubst span-at (pt prop)
+ (spans-filter (overlays-in start end) prop))
+
+(defun span-at (pt prop)
"Return some SPAN at point PT with property PROP."
(car-safe (spans-at-point-prop pt prop)))
-(defsubst span-delete (span)
+(defun span-delete (span)
"Run the 'span-delete-actions and delete SPAN."
(mapc (lambda (predelfn) (funcall predelfn))
(span-property span 'span-delete-actions))
(delete-overlay span))
-(defsubst span-add-delete-action (span action)
+(defun span-add-delete-action (span action)
"Add ACTION to the list of functions called when SPAN is deleted."
(span-set-property span 'span-delete-actions
(cons action (span-property span 'span-delete-actions))))
;; The next two change ordering of list of spans:
-(defsubst span-mapcar-spans (fn start end prop)
+(defun span-mapcar-spans (fn start end prop)
"Map function FN over spans between START and END with property PROP."
(mapcar fn (spans-at-region-prop start end prop)))
-(defsubst span-mapc-spans (fn start end prop)
+(defun span-mapc-spans (fn start end prop)
"Apply function FN to spans between START and END with property PROP."
(mapc fn (spans-at-region-prop start end prop)))
-(defsubst span-mapcar-spans-inorder (fn start end prop)
+(defun span-mapcar-spans-inorder (fn start end prop)
"Map function FN over spans between START and END with property PROP."
(mapcar fn
(sort (spans-at-region-prop start end prop)
@@ -114,12 +119,9 @@
"Return the smallest SPAN at before PT with property PROP.
A span is before PT if it begins before the character before PT."
(let ((ols (if (eq (point-min) pt)
- nil ;; (overlays-at pt)
- (overlays-in (1- pt) pt))))
- ;; Check the PROP is set.
- (when prop
- (dolist (ol (prog1 ols (setq ols nil)))
- (if (overlay-get ol prop) (push ol ols))))
+ nil ;; (overlays-at pt)
+ (overlays-in (1- pt) pt))))
+ (setq ols (spans-filter ols prop))
;; Eliminate the case of an empty overlay at (1- pt).
(dolist (ol (prog1 ols (setq ols nil)))
(if (>= (overlay-end ol) pt) (push ol ols)))
@@ -127,25 +129,25 @@ A span is before PT if it begins before the character before PT."
;; something somewhat random but vaguely meaningful. -Stef
(car (last (sort ols 'span-lt)))))
-(defsubst prev-span (span prop)
+(defun prev-span (span prop)
"Return span before SPAN with property PROP."
(span-at-before (span-start span) prop))
; overlays are [start, end)
-(defsubst next-span (span prop)
+(defun next-span (span prop)
"Return span after SPAN with property PROP."
;; Presuming the span-extents.el is the reference, its code does the
;; same as the code below.
(span-at (span-end span) prop))
-(defsubst span-live-p (span)
+(defun span-live-p (span)
"Return non-nil if SPAN is in a live buffer."
(and span
(overlay-buffer span)
(buffer-live-p (overlay-buffer span))))
-(defsubst span-raise (span)
+(defun span-raise (span)
"Set priority of SPAN to make it appear above other spans."
;; FIXME: Emacs already uses a "shorter goes above" which takes care of
;; preventing a span from seeing another. So don't play with
@@ -153,54 +155,43 @@ A span is before PT if it begins before the character before PT."
;; (span-set-property span 'priority 100)
)
-(defsubst span-string (span)
+(defun span-string (span)
(with-current-buffer (overlay-buffer span)
(buffer-substring-no-properties
(overlay-start span) (overlay-end span))))
-(defsubst set-span-properties (span plist)
+(defun set-span-properties (span plist)
"Set SPAN's properties from PLIST which is a plist."
(while plist
(overlay-put span (car plist) (cadr plist))
(setq plist (cddr plist))))
-(defsubst span-find-span (overlay-list &optional prop)
- "Return first overlay of OVERLAY-LIST having property PROP (default 'span).
-Return nil if no such overlay belong to the list."
- (let ((l overlay-list))
- (while (and l (not (overlay-get (car l) (or prop 'span))))
- (setq l (cdr l)))
- (car l)))
-
-(defsubst span-at-event (event &optional prop)
- "Find a span at position of EVENT, optionally with property PROP."
- (span-find-span
- (overlays-at (posn-point (event-start event)))
- prop))
+(defun span-at-event (event &optional prop)
+ "Find a span at position of EVENT, with property PROP (default 'span)."
+ (car (spans-filter
+ (overlays-at (posn-point (event-start event)))
+ (or prop 'span))))
(defun fold-spans (f &optional buffer from to maparg ignored-flags prop val)
(with-current-buffer (or buffer (current-buffer))
(let ((ols (overlays-in (or from (point-min)) (or to (point-max))))
- res)
+ res)
;; Check the PROP.
- (when prop
- (dolist (ol (prog1 ols (setq ols nil)))
- (if (if val (eq val (overlay-get ol prop)) (overlay-get ol prop))
- (push ol ols))))
+ (setq ols (spans-filter ols prop val))
;; Iterate in order.
(setq ols (sort ols 'span-lt))
(while (and ols (not (setq res (funcall f (pop ols) maparg)))))
res)))
-(defsubst span-detached-p (span)
+(defun span-detached-p (span)
"Is this SPAN detached? nil for no, t for yes."
(null (overlay-buffer span)))
-(defsubst set-span-face (span face)
+(defun set-span-face (span face)
"Set the FACE of a SPAN."
(overlay-put span 'face face))
-(defsubst set-span-keymap (span map)
+(defun set-span-keymap (span map)
"Set the keymap of SPAN to MAP."
(overlay-put span 'keymap map))
@@ -208,19 +199,19 @@ Return nil if no such overlay belong to the list."
;; Generic functions built on low-level concrete ones.
;;
-(defsubst span-delete-spans (start end prop)
+(defun span-delete-spans (start end prop)
"Delete all spans between START and END with property PROP set."
(span-mapc-spans 'span-delete start end prop))
-(defsubst span-property-safe (span name)
+(defun span-property-safe (span name)
"Like span-property, but return nil if SPAN is nil."
(and span (span-property span name)))
-(defsubst span-set-start (span value)
+(defun span-set-start (span value)
"Set the start point of SPAN to VALUE."
(span-set-endpoints span value (span-end span)))
-(defsubst span-set-end (span value)
+(defun span-set-end (span value)
"Set the end point of SPAN to VALUE."
(span-set-endpoints span (span-start span) value))
@@ -231,7 +222,7 @@ Return nil if no such overlay belong to the list."
(defun span-make-self-removing-span (beg end &rest props)
"Add a self-removing span from BEG to END with properties PROPS.
The span will remove itself after a timeout of 2 seconds."
- (let ((ol (make-overlay beg end)))
+ (let ((ol (span-make beg end)))
(while props
(overlay-put ol (car props) (cadr props))
(setq props (cddr props)))
@@ -247,12 +238,12 @@ The span will remove itself after a timeout of 2 seconds."
"Add a self-removing span from BEG to END with properties PROPS.
The span will remove itself after any edit within its range.
Return the span."
- (let ((ol (make-overlay beg end)))
+ (let ((ol (span-make beg end)))
(while props
(overlay-put ol (car props) (cadr props))
(setq props (cddr props)))
(span-set-property ol 'modification-hooks
- (list 'span-delete-self-modification-hook))
+ (list 'span-delete-self-modification-hook))
ol))
diff --git a/previous-art/doc/ProofGeneral-image.jpg b/previous-art/doc/ProofGeneral-image.jpg
new file mode 100644
index 00000000..ab45a0d9
--- /dev/null
+++ b/previous-art/doc/ProofGeneral-image.jpg
Binary files differ
diff --git a/previous-art/etc/desktop/icons/16x16/proofgeneral.png b/previous-art/etc/desktop/icons/16x16/proofgeneral.png
new file mode 100644
index 00000000..276c5d29
--- /dev/null
+++ b/previous-art/etc/desktop/icons/16x16/proofgeneral.png
Binary files differ
diff --git a/previous-art/etc/desktop/icons/32x32/proofgeneral.png b/previous-art/etc/desktop/icons/32x32/proofgeneral.png
new file mode 100644
index 00000000..576e97cf
--- /dev/null
+++ b/previous-art/etc/desktop/icons/32x32/proofgeneral.png
Binary files differ
diff --git a/previous-art/etc/desktop/icons/48x48/proofgeneral.png b/previous-art/etc/desktop/icons/48x48/proofgeneral.png
new file mode 100644
index 00000000..984a7f77
--- /dev/null
+++ b/previous-art/etc/desktop/icons/48x48/proofgeneral.png
Binary files differ
diff --git a/images/ProofGeneral-image.gif b/previous-art/images/ProofGeneral-image.gif
index 4f83fb95..4f83fb95 100644
--- a/images/ProofGeneral-image.gif
+++ b/previous-art/images/ProofGeneral-image.gif
Binary files differ
diff --git a/images/ProofGeneral-image.jpg b/previous-art/images/ProofGeneral-image.jpg
index d2c430cd..d2c430cd 100644
--- a/images/ProofGeneral-image.jpg
+++ b/previous-art/images/ProofGeneral-image.jpg
Binary files differ
diff --git a/previous-art/images/ProofGeneral-splash.png b/previous-art/images/ProofGeneral-splash.png
new file mode 100644
index 00000000..9f90884c
--- /dev/null
+++ b/previous-art/images/ProofGeneral-splash.png
Binary files differ