aboutsummaryrefslogtreecommitdiffhomepage
path: root/generic/proof-x-symbol.el
blob: e4e3df33d2a89a20a86e6d556d67fed33af4bcb3 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
;; proof-x-symbol.el  Support for x-symbol package
;;
;; Copyright (C) 1998 LFCS Edinburgh. 
;; Author: David Aspinall <da@dcs.ed.ac.uk>
;;
;; With thanks to David von Oheimb for providing original 
;; patches for using x-symbol with Isabelle Proof General.
;;
;; Maintainer:  Proof General maintainer <proofgen@dcs.ed.ac.uk>
;;
;; $Id$
;;

;; TODO: Move proof-x-symbol-support to proof-config.
;;       Add autoloads for this file.

(defcustom proof-x-symbol-support nil
  "*Whether to use x-symbol in Proof General buffers.
If you activate this variable, whether or not you get x-symbol support
depends on if your proof assistant supports it and it is enabled
inside your Emacs."
  :type 'boolean
  :group 'proof-general)

;; Idea is that Proof General will only let this next variable
;; become t if all the necessary infrastructure is in place.
(defvar proof-x-symbol-support-on nil
  "Non-nil if x-symbol support is currently switched on.")

(defun proof-x-symbol-toggle (&optional arg)
  "Toggle support for x-symbol.  With optional ARG, force on if ARG<>0"
  (interactive "p")
  (let ((enable  (or (and arg (> arg 0))
		     (if arg
			 (and (not (= arg 0))
			      (not proof-x-symbol-support-on))
		       (not proof-x-symbol-support-on)))))
    (if enable
	;; Check that support is correctly set up: exit if
	;; some condition is not satisfied.
	(cond
	 ((not (featurep 'x-symbol))
	  (error "Proof General: x-symbol package must be loaded into Emacs."))
	 ;; Check proof assistant specific settings here
	 ))
    ;; 
    (if enable
	;; Turn it on
	(progn
	  (add-hook 'proof-shell-insert-hook
		    'proof-x-symbol-encode-shell-input))
      ;; Turn it off
      (remove-hook  'proof-shell-insert-hook
		    'proof-x-symbol-encode-shell-input))

    (setq proof-x-symbol-support-on enable)))

;; Initialize x-symbol-support.
;; (proof-x-symbol-toggle (if proof-x-symbol-support 1 0))

;(defun proof-x-symbol-mode 
;  (if proof-x-symbol-support-on
;      (setq x-symbol-language 

(defun proof-x-symbol-decode-region (start end)
  "Decode region START to END using x-symbol-decode-all.
No action if proof-x-symbol-support-on is nil."
  (if proof-x-symbol-support-on
      (save-restriction
	(narrow-to-region start end)
	(x-symbol-decode-all)
	(unless (featurep 'mule) (x-symbol-nomule-fontify-cstrings)))))


(defun proof-x-symbol-encode-shell-input ()
  "Encode shell input in the variable STRING.
A value for proof-shell-insert-hook."
  (and x-symbol-mode x-symbol-language
       (setq string
             (save-excursion
               (let ((language x-symbol-language)
                     (coding x-symbol-coding)
                     (selective selective-display))
                 (set-buffer (get-buffer-create "x-symbol comint"))
                 (erase-buffer)
                 (insert string)
                 (setq x-symbol-language language)
                 (x-symbol-encode-all nil coding))
               (prog1 (buffer-substring)
                 (kill-buffer (current-buffer)))))))

(defun proof-x-symbol-mode ()
  (if proof-x-symbol-support-on
      (progn
	(setq x-symbol-language proof-assistant-symbol)
	(if (not x-symbol-mode)
	    (x-symbol-mode))
	;; Needed ?  Should let users do this in the 
	;; usual way, if it works.
	(if (not font-lock-mode) 
	    (font-lock-mode)))))
 ;; 
 ;;(setq comint-input-sender 'x-symbol-comint-send)


;; FIXME: where do we need the next function?
(defun proof-x-symbol-comint-send (proc string)
  (and x-symbol-mode x-symbol-language
       (setq string
             (save-excursion
               (let ((language x-symbol-language)
                     (coding x-symbol-coding)
                     (selective selective-display))
                 (set-buffer (get-buffer-create "x-symbol comint"))
                 (erase-buffer)
                 (insert string)
                 (setq x-symbol-language language)
                 (x-symbol-encode-all nil coding))
               (prog1 (buffer-substring)
                 (kill-buffer (current-buffer))))))
  (funcall x-symbol-orig-compint-input-sender proc string))




(provide 'proof-x-symbol)
;; End of proof-x-symbol.el