aboutsummaryrefslogtreecommitdiffhomepage
path: root/generic/proof-easy-config.el
blob: 696e6a34c4b5913e7b1fea065d6e2d0ad8d4d9f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
;; proof-easy-config.el    Easy configuration for Proof General
;;
;; Copyright (C) 1999  David Aspinall / LFCS.
;; Author:     David Aspinall <da@dcs.ed.ac.uk>
;; Maintainer: Proof General maintainer <proofgen@dcs.ed.ac.uk>
;;
;; $Id$
;;
;; Work in progress.
;; 
;; XEmacs only at the moment (uses defvaralias)
;;
;; Future version might copy settings instead.  Consider how best to
;; interface with customization mechanism so a new prover can be
;; configured by editing inside custom buffers.
;;

(require 'proof)

(unless (fboundp 'defvaralias)
  (error "proof-easy-config only works for XEmacs, sorry!"))

(autoload 'custom-group-members "cus-edit")


(defun proof-easy-config-make-var-aliases (sym group)
  "Make variable aliases for custom GROUP, with new prefix SYM."
  (let ((vars	  (custom-group-members group nil))
	(prefix  (length
		  (or (get 'custom-prefix group) ; fails sometimes, why?
		      "proof-")))	; common prefix
	(newpref (concat (symbol-name sym) "-")))
    (dolist (cusmem vars)
      (cond ((member 'custom-group cusmem)
	     ;; recurse on subgroups
	     (proof-easy-config-make-var-aliases sym (car cusmem)))
	    ((member 'custom-variable cusmem)
	     (let* ((thisone   (car cusmem))
		    (base	(substring (symbol-name thisone) prefix))
		    (alias	(intern (concat newpref base))))
	       (defvaralias alias thisone)))))))

(defvar proof-easy-config-derived-modes-table
  '((""         "script" proof-mode (proof-config-done))
    ("shell"    "shell"  proof-shell-mode (proof-shell-config-done))
    ("response" "resp"   proof-response-mode (proof-response-config-done))
    ("goals"	"goals"   pbp-mode (proof-goals-config-done)))
  "A list of (PREFIXSYM SUFFIXNAME PARENT MODEBODY) for derived modes.")

;; FIXME: Non-uniformity in current code
(defvaralias 'proof-mode-for-goals 'proof-mode-for-pbp)

(defun proof-easy-config-define-derived-modes ()
  (dolist (modedef proof-easy-config-derived-modes-table)
    (let* ((prefixsym (nth 0 modedef))
	   (suffixnm  (nth 1 modedef))
	   (parent    (nth 2 modedef))
	   (body      (nthcdr 3 modedef))
	   (modert    (concat (symbol-name proof-assistant-symbol)
			      "-" prefixsym))
	   ; config function for mode -- don't need it with global settings.
	   ; (modecfgfn (intern (concat modert "-config")))
	   (hyphen    (if (string-equal prefixsym "") "" "-"))
	   (mode      (intern (concat modert hyphen "mode")))
	   (modename  (concat proof-assistant " " suffixnm))
	   (varname   (intern (concat "proof-mode-for-" suffixnm))))

      (eval
       `(define-derived-mode ,mode ,parent ,modename nil ,@body))

      ;; Set proof-mode-for-script, etc.  NB: at top-level rather
      ;; than in function body.  Then we don't need to set
      ;; proof-pre-shell-start-hook.
      (set varname mode))))

(defun proof-easy-config-define-customs ()
  "Define a -prog-name customization setting."
  (let* ((pn-def  (symbol-name proof-assistant-symbol))
	 (pn	 (intern (concat pn-def "-prog-name"))))
    `(defcustom ,pn ,pn-def
       ,(concat "*Name of program to run " proof-assistant)
       :type 'string
       :group ,proof-assistant-symbol)))

(defun proof-easy-config-check-setup (sym name)
  "A number of simple checks."
  (cond
   ((or 
     (and (boundp 'proof-assistant) proof-assistant 
	  (not (equal proof-assistant ""))
	  (not (equal proof-assistant name)))
     (and (boundp 'proof-assistant-symbol) proof-assistant-symbol
	  (not (eq proof-assistant-symbol sym))))
    (error "proof-easy-config: Proof General is already in use for a different prover!"))
   (t
    ;; Setting these here is nice for testing: no need to get
    ;; proof-assistants-table right first.
    (customize-set-variable 'proof-assistant name)
    (customize-set-variable 'proof-assistant-symbol sym))))

(defmacro proof-easy-config (sym name &rest body)
  "Configure Proof General for proof-assistant using BODY as a setq body."
  `(progn
     (proof-easy-config-check-setup ,sym ,name)
     (proof-easy-config-make-var-aliases ,sym 'prover-config)
     (proof-easy-config-define-customs)
     (setq
      ,@body)
     (proof-easy-config-define-derived-modes)))
  
;; 
(provide 'proof-easy-config)