summaryrefslogtreecommitdiff
path: root/tools/coq-font-lock.el
diff options
context:
space:
mode:
Diffstat (limited to 'tools/coq-font-lock.el')
-rw-r--r--tools/coq-font-lock.el137
1 files changed, 137 insertions, 0 deletions
diff --git a/tools/coq-font-lock.el b/tools/coq-font-lock.el
new file mode 100644
index 00000000..05618a04
--- /dev/null
+++ b/tools/coq-font-lock.el
@@ -0,0 +1,137 @@
+;; coq-font-lock.el --- Coq syntax highlighting for Emacs - compatibilty code
+;; Pierre Courtieu, may 2009
+;;
+;; Authors: Pierre Courtieu
+;; License: GPL (GNU GENERAL PUBLIC LICENSE)
+;; Maintainer: Pierre Courtieu <Pierre.Courtieu@cnam.fr>
+
+;; This is copy paste from ProofGeneral by David Aspinall
+;; <David.Aspinall@ed.ac.uk>. ProofGeneral is under GPL and Copyright
+;; (C) LFCS Edinburgh.
+
+
+;;; Commentary:
+;; This file contains the code necessary to coq-syntax.el and
+;; coq-db.el from ProofGeneral. It is also pocked from ProofGeneral.
+
+
+;;; History:
+;; First created from ProofGeneral may 28th 2009
+
+
+;;; Code:
+
+(setq coq-version-is-V8-1 t)
+(defun coq-build-regexp-list-from-db (db &optional filter)
+ "Take a keyword database DB and return the list of regexps for font-lock.
+If non-nil Optional argument FILTER is a function applying to each line of DB.
+For each line if FILTER returns nil, then the keyword is not added to the
+regexp. See `coq-syntax-db' for DB structure."
+ (let ((l db) (res ()))
+ (while l
+ (let* ((hd (car l)) (tl (cdr l)) ; hd is the first infos list
+ (e1 (car hd)) (tl1 (cdr hd)) ; e1 = menu entry
+ (e2 (car tl1)) (tl2 (cdr tl1)) ; e2 = abbreviation
+ (e3 (car tl2)) (tl3 (cdr tl2)) ; e3 = completion
+ (e4 (car-safe tl3)) (tl4 (cdr-safe tl3)) ; e4 = state changing
+ (e5 (car-safe tl4)) (tl5 (cdr-safe tl4)) ; e5 = colorization string
+ )
+ ;; TODO delete doublons
+ (when (and e5 (or (not filter) (funcall filter hd)))
+ (setq res (nconc res (list e5)))) ; careful: nconc destructive!
+ (setq l tl)))
+ res
+ ))
+(defun filter-state-preserving (l)
+ ; checkdoc-params: (l)
+ "Not documented."
+ (not (nth 3 l))) ; fourth argument is nil --> state preserving command
+
+(defun filter-state-changing (l)
+ ; checkdoc-params: (l)
+ "Not documented."
+ (nth 3 l)) ; fourth argument is nil --> state preserving command
+
+;; Generic font-lock
+
+(defvar proof-id "\\(\\w\\(\\w\\|\\s_\\)*\\)"
+ "A regular expression for parsing identifiers.")
+
+;; For font-lock, we treat ,-separated identifiers as one identifier
+;; and refontify commata using \{proof-zap-commas}.
+
+(defun proof-anchor-regexp (e)
+ "Anchor (\\`) and group the regexp E."
+ (concat "\\`\\(" e "\\)"))
+
+(defun proof-ids (proof-id &optional sepregexp)
+ "Generate a regular expression for separated lists of identifiers PROOF-ID.
+Default is comma separated, or SEPREGEXP if set."
+ (concat proof-id "\\(\\s-*" (or sepregexp ",") "\\s-*"
+ proof-id "\\)*"))
+
+(defun proof-ids-to-regexp (l)
+ "Maps a non-empty list of tokens `L' to a regexp matching any element."
+ (if (featurep 'xemacs)
+ (mapconcat (lambda (s) (concat "\\_<" s "\\_>")) l "\\|") ;; old version
+ (concat "\\_<\\(?:" (mapconcat 'identity l "\\|") "\\)\\_>")))
+
+;; TODO: get rid of this list. Does 'default work widely enough
+;; by now?
+(defconst pg-defface-window-systems
+ '(x ;; bog standard
+ mswindows ;; Windows
+ w32 ;; Windows
+ gtk ;; gtk emacs (obsolete?)
+ mac ;; used by Aquamacs
+ carbon ;; used by Carbon XEmacs
+ ns ;; NeXTstep Emacs (Emacs.app)
+ x-toolkit) ;; possible catch all (but probably not)
+ "A list of possible values for variable `window-system'.
+If you are on a window system and your value of variable
+`window-system' is not listed here, you may not get the correct
+syntax colouring behaviour.")
+
+(defmacro proof-face-specs (bl bd ow)
+ "Return a spec for `defface' with BL for light bg, BD for dark, OW o/w."
+ `(append
+ (apply 'append
+ (mapcar
+ (lambda (ty) (list
+ (list (list (list 'type ty) '(class color)
+ (list 'background 'light))
+ (quote ,bl))
+ (list (list (list 'type ty) '(class color)
+ (list 'background 'dark))
+ (quote ,bd))))
+ pg-defface-window-systems))
+ (list (list t (quote ,ow)))))
+
+;;A new face for tactics
+(defface coq-solve-tactics-face
+ (proof-face-specs
+ (:foreground "forestgreen" t) ; pour les fonds clairs
+ (:foreground "forestgreen" t) ; pour les fond foncés
+ ()) ; pour le noir et blanc
+ "Face for names of closing tactics in proof scripts."
+ :group 'proof-faces)
+
+;;A new face for tactics which fail when they don't kill the current goal
+(defface coq-solve-tactics-face
+ (proof-face-specs
+ (:foreground "red" t) ; pour les fonds clairs
+ (:foreground "red" t) ; pour les fond foncés
+ ()) ; pour le noir et blanc
+ "Face for names of closing tactics in proof scripts."
+ :group 'proof-faces)
+
+
+(defconst coq-solve-tactics-face 'coq-solve-tactics-face
+ "Expression that evaluates to a face.
+Required so that 'proof-solve-tactics-face is a proper facename")
+
+(defconst proof-tactics-name-face 'coq-solve-tactics-face)
+(defconst proof-tacticals-name-face 'coq-solve-tactics-face)
+
+(provide 'coq-font-lock)
+;;; coq-font-lock.el ends here