# HG changeset patch # User Simon Marshall # Date 805296401 0 # Node ID 997e250dfe12aeb8fecd261f15af172699069a84 # Parent 93a7cb2eefccecc2af7b6e056fe36b5b8852e550 Do all cleanups in font-lock-fontify-region and font-lock-hack-keywords inside their unwind-protect UNWINDFORMS. Also eval inside font-lock-set-defaults, not font-lock-choose-keywords. diff -r 93a7cb2eefcc -r 997e250dfe12 lisp/font-lock.el --- a/lisp/font-lock.el Sun Jul 09 13:01:31 1995 +0000 +++ b/lisp/font-lock.el Sun Jul 09 13:26:41 1995 +0000 @@ -85,8 +85,6 @@ (defvar font-lock-no-comments nil "Non-nil means Font Lock should not fontify comments or strings.") -(make-obsolete-variable 'font-lock-doc-string-face 'font-lock-string-face) - (make-variable-buffer-local 'font-lock-keywords) (defvar font-lock-keywords nil "*The keywords to highlight. @@ -462,12 +460,12 @@ ;; Make sure PREV is non-nil after the loop ;; only if it was set on the very last iteration. (setq prev nil))) - (set-syntax-table old-syntax)) - (and prev - (remove-text-properties prev end '(face nil))) - (and (buffer-modified-p) - (not modified) - (set-buffer-modified-p nil)))))) + (set-syntax-table old-syntax) + (and prev + (remove-text-properties prev end '(face nil))) + (and (buffer-modified-p) + (not modified) + (set-buffer-modified-p nil))))))) (defun font-lock-unfontify-region (beg end) @@ -582,10 +580,10 @@ (mapcar 'font-lock-apply-highlight highlights)) (if loudly (message "Fontifying %s... (regexps...%s)" bufname (make-string (setq count (1+ count)) ?.))))) - (set-syntax-table old-syntax)) - (and (buffer-modified-p) - (not modified) - (set-buffer-modified-p nil)))) + (set-syntax-table old-syntax) + (and (buffer-modified-p) + (not modified) + (set-buffer-modified-p nil))))) ;; The user level functions @@ -666,10 +664,10 @@ "Unconditionally turn on Font Lock mode." (font-lock-mode 1)) -;; Turn off other related packages if they're on. I prefer a hook. +;; Turn off other related packages if they're on. I prefer a hook. --sm. ;; These explicit calls are easier to understand ;; because people know what they will do. -;; A hook is a mystery because it might do anything whatever. -- rms. +;; A hook is a mystery because it might do anything whatever. --rms. (defun font-lock-thing-lock-cleanup () (cond ((and (boundp 'fast-lock-mode) fast-lock-mode) (fast-lock-mode -1)) @@ -743,27 +741,21 @@ (let ((word-char "[-+a-zA-Z0-9_:*]")) (list ;; - ;; Control structures. - ;; ELisp: + ;; Control structures. ELisp and CLisp combined. ; ("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw" ; "save-restriction" "save-excursion" "save-window-excursion" ; "save-selected-window" "save-match-data" "unwind-protect" -; "condition-case" "track-mouse") +; "condition-case" "track-mouse" +; "when" "unless" "do" "flet" "labels" "return" "return-from") (cons (concat "(\\(" - "c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|if\\|let\\*?\\|prog[nv12*]?\\|" + "c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|do\\|flet\\|if\\|" + "l\\(abels\\|et\\*?\\)\\|prog[nv12*]?\\|return\\(\\|-from\\)\\|" "save-\\(excursion\\|match-data\\|restriction\\|" - "selected-window\\|window-excursion\\)\\|" - "t\\(hrow\\|rack-mouse\\)\\|unwind-protect\\|while" + "selected-window\\|window-excursion\\)\\|t\\(hrow\\|rack-mouse\\)\\|" + "un\\(less\\|wind-protect\\)\\|wh\\(en\\|ile\\)" "\\)\\>") 1) - ;; CLisp: -; ("when" "unless" "do" "flet" "labels" "return" "return-from") - '("(\\(do\\|flet\\|labels\\|return\\(\\|-from\\)\\|unless\\|when\\)\\>" - . 1) - ;; - ;; Fontify CLisp keywords. - (concat "\\<:" word-char "+\\>") ;; ;; Function names in emacs-lisp docstrings (in the syntax that ;; `substitute-command-keys' understands). @@ -774,7 +766,10 @@ (list (concat "`\\(" word-char word-char "+\\)'") 1 'font-lock-reference-face t) ;; - ;; & keywords as types + ;; CLisp `:' keywords as references. + (list (concat "\\<:" word-char "+\\>") 0 font-lock-reference-face t) + ;; + ;; ELisp and CLisp `&' keywords as types. '("\\&\\(optional\\|rest\\|whole\\)\\>" . font-lock-type-face) ))) "Gaudy level highlighting for Lisp modes.") @@ -933,14 +928,14 @@ (defun font-lock-choose-keywords (keywords level) ;; Return evaled LEVELth element of KEYWORDS. A LEVEL of nil is equal to a ;; LEVEL of 0, a LEVEL of t is equal to (1- (length KEYWORDS)). - (eval (cond ((symbolp keywords) - keywords) - ((numberp level) - (or (nth level keywords) (car (reverse keywords)))) - ((eq level t) - (car (reverse keywords))) - (t - (car keywords))))) + (cond ((symbolp keywords) + keywords) + ((numberp level) + (or (nth level keywords) (car (reverse keywords)))) + ((eq level t) + (car (reverse keywords))) + (t + (car keywords)))) (defun font-lock-set-defaults () "Set fontification defaults appropriately for this mode. @@ -954,8 +949,10 @@ (let ((defaults (or font-lock-defaults (cdr (assq major-mode font-lock-defaults-alist))))) ;; Keywords? - (setq font-lock-keywords (font-lock-choose-keywords (nth 0 defaults) - font-lock-maximum-decoration)) + (setq font-lock-keywords + (font-lock-compile-keywords + (eval (font-lock-choose-keywords (nth 0 defaults) + font-lock-maximum-decoration)))) ;; Syntactic? (if (nth 1 defaults) (set (make-local-variable 'font-lock-no-comments) t))