;; proof.el Proof General loader. All files require this one. ;; ;; Copyright (C) 1994 - 1998 LFCS Edinburgh. ;; Authors: David Aspinall, Yves Bertot, Healfdene Goguen, ;; Thomas Kleymann and Dilip Sequeira ;; ;; Maintainer: Proof General maintainer ;; ;; $Id$ ;; (defmacro deflocal (var value &optional docstring) "Define a buffer local variable VAR with default value VALUE." `(progn (defvar ,var nil ,docstring) (make-variable-buffer-local (quote ,var)) (setq-default ,var ,value))) (require 'proof-site) ; site config ;; cl is dumped with my XEmacs 20.4, but not FSF Emacs 20.2. (require 'cl) (require 'proof-config) ; configuration variables (require 'proof-splash) ; splash screen (require 'proof-x-symbol) ; support for x-symbol ;;; ;;; Emacs libraries ;;; ;; browse-url function doesn't seem to be autoloaded in ;; XEmacs 20.4, but it is in FSF Emacs 20.2. (or (fboundp 'browse-url) (autoload 'browse-url "browse-url" "Ask a WWW browser to load URL." t)) (autoload 'font-lock-fontify-region "font-lock") (autoload 'font-lock-append-text-property "font-lock") ;;; ;;; Autoloads for main code ;;; (autoload 'proof-mode "proof-script" "Proof General major mode class for proof scripts.") (autoload 'proof-shell-mode "proof-shell" "Proof General shell mode class for proof assistant processes") ;; FIXME: toolbar defines scripting menu as well as toolbar, ;; so FSF *does* need to load it. Could consider separating ;; menu code from proof-toolbar. ;;(if (featurep 'toolbar) ;; toolbar code is only loaded for XEmacs (autoload 'proof-toolbar-setup "proof-toolbar" "Initialize Proof General toolbar and enable it for the current buffer" t) ;;; (defun proof-toolbar-setup ())) ;;; ;;; More autoloads to help define interface between files ;;; (autoload 'proof-shell-available-p "proof-shell" "Returns non-nil if there is a proof shell active and available.") (autoload 'proof-shell-invisible-command "proof-shell" "Send CMD to the proof process without revealing it to the user.") ;;; ;;; Global variables ;;; (deflocal proof-buffer-type nil "Symbol indicating the type of this buffer: 'script, 'shell, or 'pbp.") (defvar proof-shell-busy nil "A lock indicating that the proof shell is processing. When this is non-nil, proof-shell-ready-prover will give an error.") (defvar proof-included-files-list nil "List of files currently included in proof process. This list contains files in canonical truename format (see `file-truename'). Whenever a new file is being processed, it gets added to this list via the proof-shell-process-file configuration settings. When the prover retracts across file boundaries, this list is resynchronised via the proof-shell-retract-files-regexp and proof-shell-compute-new-files-list configuration settings. Only files which have been *fully* processed should be included here. Proof General itself will automatically add the filenames of script buffers which are completely read, when scripting is deactivated or switched to another buffer. NB: Currently there is no generic provision for removing files which are only partly read-in due to an error, so ideally the proof assistant should only output a processed message when a file has been successfully read.") (defvar proof-script-buffer nil "The currently active scripting buffer or nil if none.") (defvar proof-shell-buffer nil "Process buffer where the proof assistant is run.") (defvar proof-goals-buffer nil "The goals buffer (also known as the pbp buffer).") (defvar proof-response-buffer nil "The response buffer.") (defvar proof-shell-proof-completed nil "Flag indicating that a completed proof has just been observed.") ;; FIXME da: remove proof-terminal-string. At the moment some ;; commands need to have the terminal string, some don't. ;; It's used variously in proof-script and proof-shell. ;; We should assume commands are terminated at the specific level. (defvar proof-terminal-string nil "End-of-line string for proof process.") ;;; ;;; Utilities/macros used in several files (proof-utils) ;;; (defun proof-define-keys (map kbl) "Adds keybindings KBL in MAP. The argument KBL is a list of tuples (k . f) where `k' is a keybinding (vector) and `f' the designated function." (mapcar (lambda (kbl) (let ((k (car kbl)) (f (cdr kbl))) (define-key map k f))) kbl)) ;; FIXME: this function should be combined with ;; proof-shell-maybe-erase-response-buffer. Should allow ;; face of nil for unfontified output. (defun proof-response-buffer-display (str &optional face) "Display STR with FACE in response buffer and return fontified STR." (let (start end) (with-current-buffer proof-response-buffer ;; 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)) (newline) (setq start (point)) (insert str) (setq end (point)) (save-excursion (font-lock-set-defaults) ;required for FSF Emacs 20.2 (font-lock-fontify-region start end) (if face (font-lock-append-text-property start end 'face face))) (buffer-substring start end)))) ;; FIXME da: this window dedicated stuff is a real pain and I've ;; spent ages inserting workarounds. Why do we want it?? ;; The latest problem is that with ;; (setq special-display-regexps ;; (cons "\\*Inferior .*-\\(goals\\|response\\)\\*" ;; special-display-regexps)) ;; I get the script buffer made into a dedicated buffer, ;; presumably because the wrong window is selected below? (defun proof-display-and-keep-buffer (buffer &optional pos) "Display BUFFER and mark window according to `proof-window-dedicated'. If optional POS is present, will set point to POS. Otherwise move point to the end of the buffer. Ensure that point is visible in window." (let (window) (save-excursion (set-buffer buffer) (display-buffer buffer) (setq window (get-buffer-window buffer 'visible)) (set-window-dedicated-p window proof-window-dedicated) (and window (save-selected-window (select-window window) ;; tms: I don't understand why the point in ;; proof-response-buffer is not at the end anyway. ;; Is there a superfluous save-excursion somewhere? ;; da replies: I think it's because of a *missing* ;; save-excursion above around the font-lock stuff. ;; Adding one has maybe fixed this problem. ;; 10.12.98 Experiment removing this so that point ;; doesn't always go to end of goals buffer ;; RESULT: point doesn't go to end of response ;; buffer. Hypothesis above was wrong, so this ;; is re-added and optional POS argument added ;; for this function. (goto-char (or pos (point-max))) (if pos (beginning-of-line)) ; Normalization ;; Ensure point visible (or (pos-visible-in-window-p (point) window) (recenter -1))))))) (defun proof-clean-buffer (buffer) "Erase buffer and hide from display if proof-auto-delete-windows set. Auto deletion only affects selected frame. (We assume that the selected frame is the one showing the script buffer.)" (with-current-buffer buffer ;; NB: useful optional arg to erase buffer is XEmacs specific, 8-(. (erase-buffer) (if proof-auto-delete-windows (delete-windows-on buffer t)))) ;; utility function ;; FIXME da: maybe not used. Put into spare parts file. (defun proof-buffers-in-mode (mode &optional buflist) "Return a list of the buffers in the buffer list in major-mode MODE. Restrict to BUFLIST if it's set." (let ((bufs-left (or buflist (buffer-list))) bufs-got) (dolist (buf bufs-left bufs-got) (if (with-current-buffer buf (eq mode major-mode)) (setq bufs-got (cons buf bufs-got)))))) (defun proof-message (str) "Issue the message STR in the response buffer and display it." (proof-response-buffer-display str) (proof-display-and-keep-buffer proof-response-buffer)) (defun proof-warning (str) "Issue the warning STR in the response buffer and display it. The warning is coloured with proof-warning-face." (proof-response-buffer-display str 'proof-warning-face) (proof-display-and-keep-buffer proof-response-buffer)) (defmacro proof-debug (str) "Issue the debugging message STR in the response buffer, display it. If proof-show-debug-messages is nil, do nothing." (if proof-show-debug-messages `(proof-warning ,str))) ;; Function for submitting bug reports. (defun proof-submit-bug-report () "Submit an bug report or other report for Proof General." (interactive) (require 'reporter) (let ((reporter-prompt-for-summary-p "(Very) brief summary of problem or suggestion: ")) (reporter-submit-bug-report "proofgen@dcs.ed.ac.uk" "Proof General" (list 'proof-general-version 'proof-assistant) nil nil "[When reporting a bug, please include a small test case for us to repeat it.]"))) (provide 'proof) ;; proof.el ends here