;;;###autoload
(defvar font-lock-maximum-decoration nil
- "*If non-nil, the maximum decoration level for fontifying.
+ "*Maximum decoration level for fontification.
If nil, use the default decoration (typically the minimum available).
If t, use the maximum decoration available.
If a number, use that level of decoration (or if not available the maximum).
;;;###autoload
(defvar font-lock-maximum-size (* 250 1024)
- "*If non-nil, the maximum size for buffers for fontifying.
+ "*Maximum size of a buffer for buffer fontification.
Only buffers less than this can be fontified when Font Lock mode is turned on.
If nil, means size is irrelevant.
If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
(interactive "P")
;; Don't turn on Font Lock mode if we don't have a display (we're running a
;; batch job) or if the buffer is invisible (the name starts with a space).
- (let ((on-p (and (not noninteractive)
+ (let ((maximum-size (font-lock-value-in-major-mode font-lock-maximum-size))
+ (on-p (and (not noninteractive)
(not (eq (aref (buffer-name) 0) ?\ ))
(if arg
(> (prefix-numeric-value arg) 0)
- (not font-lock-mode))))
- (maximum-size (if (not (consp font-lock-maximum-size))
- font-lock-maximum-size
- (cdr (or (assq major-mode font-lock-maximum-size)
- (assq t font-lock-maximum-size))))))
+ (not font-lock-mode)))))
(if (not on-p)
(remove-hook 'after-change-functions 'font-lock-after-change-function
t)
;; `major-mode-hook' is simpler), but maybe someone can come up with another
;; solution? --sm.
-(defvar font-lock-cache-buffers nil) ; For remembering buffers.
-(defvar change-major-mode-hook nil) ; Make sure it's not void.
+(defvar font-lock-buffers nil) ; For remembering buffers.
+(defvar change-major-mode-hook nil) ; Make sure it's not void.
;;;###autoload
(defvar font-lock-global-modes t
- "*List of modes for which Font Lock mode is automatically turned on.
+ "*Modes for which Font Lock mode is automatically turned on.
Global Font Lock mode is controlled by the `global-font-lock-mode' command.
If nil, means no modes have Font Lock mode automatically turned on.
If t, all modes that support Font Lock mode have it automatically turned on.
is in this list. The sense of the list is negated if it begins with `not'.")
;;;###autoload
-(defun global-font-lock-mode (&optional arg)
+(defun global-font-lock-mode (&optional arg message)
"Toggle Global Font Lock mode.
-With arg, turn Global Font Lock mode on if and only if arg is positive.
+With prefix ARG, turn Global Font Lock mode on if and only if ARG is positive.
+Displays a message saying whether the mode is on or off if MESSAGE is non-nil.
+Returns the new status of Global Font Lock mode (non-nil means on).
When Global Font Lock mode is enabled, Font Lock mode is automagically
turned on in a buffer if its major mode is one of `font-lock-global-modes'."
- (interactive "P")
- (if (if arg
- (<= (prefix-numeric-value arg) 0)
- (memq 'font-lock-change-major-mode change-major-mode-hook))
- (remove-hook 'change-major-mode-hook 'font-lock-change-major-mode)
- (add-hook 'change-major-mode-hook 'font-lock-change-major-mode)
- (add-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
- (setq font-lock-cache-buffers (buffer-list))))
+ (interactive "P\np")
+ (let ((off-p (if arg
+ (<= (prefix-numeric-value arg) 0)
+ (memq 'font-lock-change-major-mode change-major-mode-hook))))
+ (if off-p
+ (remove-hook 'change-major-mode-hook 'font-lock-change-major-mode)
+ (add-hook 'change-major-mode-hook 'font-lock-change-major-mode)
+ (add-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
+ (setq font-lock-buffers (buffer-list)))
+ (if message
+ (message "Global Font Lock mode is now %s." (if off-p "OFF" "ON")))
+ (not off-p)))
(defun font-lock-change-major-mode ()
;; Gross hack warning: Delicate readers should avert eyes now.
- ;; Something is running `kill-all-local-variables', which generally means
- ;; the major mode is being changed. Run `turn-on-font-lock-if-enabled' after
- ;; the current command has finished.
+ ;; Something is running `kill-all-local-variables', which generally means the
+ ;; major mode is being changed. Run `turn-on-font-lock-if-enabled' after the
+ ;; current command has finished.
(add-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
- (add-to-list 'font-lock-cache-buffers (current-buffer)))
+ (add-to-list 'font-lock-buffers (current-buffer)))
(defun turn-on-font-lock-if-enabled ()
;; Gross hack warning: Delicate readers should avert eyes now.
;; Turn on Font Lock mode if it's one of `font-lock-global-modes'.
(remove-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
- (while font-lock-cache-buffers
- (if (buffer-live-p (car font-lock-cache-buffers))
+ (while font-lock-buffers
+ (if (buffer-live-p (car font-lock-buffers))
(save-excursion
- (set-buffer (car font-lock-cache-buffers))
+ (set-buffer (car font-lock-buffers))
(if (or (eq font-lock-global-modes t)
(if (eq (car-safe font-lock-global-modes) 'not)
(not (memq major-mode (cdr font-lock-global-modes)))
(memq major-mode font-lock-global-modes)))
- (turn-on-font-lock))))
- (setq font-lock-cache-buffers (cdr font-lock-cache-buffers))))
+ (let (inhibit-quit)
+ (turn-on-font-lock)))))
+ (setq font-lock-buffers (cdr font-lock-buffers))))
;; End of Global Font Lock mode.
\f
(font-lock-fontify-region (point) (mark)))
((error quit) (message "Fontifying block... %s" error-data)))))))
-(define-key esc-map "\C-g" 'font-lock-fontify-block)
+(define-key facemenu-keymap "\M-g" 'font-lock-fontify-block)
\f
;; Syntactic fontification functions.
(t ; Hopefully (MATCHER HIGHLIGHT ...)
keyword)))
+(defun font-lock-value-in-major-mode (alist)
+ ;; Return value in ALIST for `major-mode', or ALIST if it is not an alist.
+ ;; Alist structure is ((MAJOR-MODE . VALUE)) where MAJOR-MODE may be t.
+ (if (consp alist)
+ (cdr (or (assq major-mode alist) (assq t alist)))
+ alist))
+
(defun font-lock-choose-keywords (keywords level)
;; Return 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)).
- (let ((level (if (not (consp level))
- level
- (cdr (or (assq major-mode level) (assq t level))))))
- (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.
(font-lock-make-faces)
;; Set fontification defaults.
(make-local-variable 'font-lock-fontified)
- (if font-lock-keywords
- nil
- (let* ((defaults (or font-lock-defaults
- (cdr (assq major-mode font-lock-defaults-alist))))
- (keywords (font-lock-choose-keywords
- (nth 0 defaults) font-lock-maximum-decoration)))
- ;; Regexp fontification?
- (setq font-lock-keywords (if (fboundp keywords)
- (funcall keywords)
- (eval keywords)))
- ;; Syntactic fontification?
- (if (nth 1 defaults)
- (set (make-local-variable 'font-lock-keywords-only) t))
- ;; Case fold during regexp fontification?
- (if (nth 2 defaults)
- (set (make-local-variable 'font-lock-keywords-case-fold-search) t))
- ;; Syntax table for regexp and syntactic fontification?
- (if (nth 3 defaults)
- (let ((slist (nth 3 defaults)))
- (set (make-local-variable 'font-lock-syntax-table)
- (copy-syntax-table (syntax-table)))
- (while slist
- (modify-syntax-entry (car (car slist)) (cdr (car slist))
- font-lock-syntax-table)
- (setq slist (cdr slist)))))
- ;; Syntax function for syntactic fontification?
- (if (nth 4 defaults)
- (set (make-local-variable 'font-lock-beginning-of-syntax-function)
- (nth 4 defaults)))
- ;; Variable alist?
- (let ((alist (nthcdr 5 defaults)))
- (while alist
- (set (make-local-variable (car (car alist))) (cdr (car alist)))
- (setq alist (cdr alist)))))))
+ (if (member font-lock-keywords '(nil (t)))
+ (let* ((defaults (or font-lock-defaults
+ (cdr (assq major-mode font-lock-defaults-alist))))
+ (keywords
+ (font-lock-choose-keywords (nth 0 defaults)
+ (font-lock-value-in-major-mode font-lock-maximum-decoration))))
+ ;; Regexp fontification?
+ (setq font-lock-keywords (if (fboundp keywords)
+ (funcall keywords)
+ (eval keywords)))
+ ;; Syntactic fontification?
+ (if (nth 1 defaults)
+ (set (make-local-variable 'font-lock-keywords-only) t))
+ ;; Case fold during regexp fontification?
+ (if (nth 2 defaults)
+ (set (make-local-variable 'font-lock-keywords-case-fold-search) t))
+ ;; Syntax table for regexp and syntactic fontification?
+ (if (nth 3 defaults)
+ (let ((slist (nth 3 defaults)))
+ (set (make-local-variable 'font-lock-syntax-table)
+ (copy-syntax-table (syntax-table)))
+ (while slist
+ (modify-syntax-entry (car (car slist)) (cdr (car slist))
+ font-lock-syntax-table)
+ (setq slist (cdr slist)))))
+ ;; Syntax function for syntactic fontification?
+ (if (nth 4 defaults)
+ (set (make-local-variable 'font-lock-beginning-of-syntax-function)
+ (nth 4 defaults)))
+ ;; Variable alist?
+ (let ((alist (nthcdr 5 defaults)))
+ (while alist
+ (set (make-local-variable (car (car alist))) (cdr (car alist)))
+ (setq alist (cdr alist)))))))
(defun font-lock-unset-defaults ()
"Unset fontification defaults. See `font-lock-set-defaults'."
'("\\<:\\sw+\\>" 0 font-lock-reference-face prepend)
;;
;; ELisp and CLisp `&' keywords as types.
- '("\\<\\&\\(optional\\|rest\\|whole\\)\\>" . font-lock-type-face)
+ '("\\<\\&\\sw+\\>" . font-lock-type-face)
))
"Gaudy level highlighting for Lisp modes.")