1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-26 07:33:47 +00:00

Added font-lock-maximum-decoration; use it to set lisp-font-lock-keywords, and

C and C++ ones.
Added font-lock-after-fontify-buffer-hook; font-lock-fontify-buffer runs it.
Added font-lock-thing-lock-cleanup; font-lock-mode runs it when turning off.
Fixed font-lock-fontify-region so it uses forward-comment from comment-start,
rather than searching for comment-end.
Mods to lisp-font-lock-keywords-1 and 2.
This commit is contained in:
Simon Marshall 1995-03-02 10:57:07 +00:00
parent b7e97ed504
commit 799761f0c1

View File

@ -1,7 +1,7 @@
;; Electric Font Lock Mode
;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
;; Author: jwz, then rms and sm (simon.marshall@mail.esrin.esa.it)
;; Author: jwz, then rms and sm <simon@gnu.ai.mit.edu>
;; Maintainer: FSF
;; Keywords: languages, faces
@ -118,17 +118,20 @@ the wrong pattern can dramatically slow things down!")
The value should look like the `cdr' of an item in `font-lock-defaults-alist'.")
(defvar font-lock-defaults-alist
'((bibtex-mode . (tex-font-lock-keywords))
(c++-c-mode . (c-font-lock-keywords nil nil ((?\_ . "w"))))
(c++-mode . (c++-font-lock-keywords nil nil ((?\_ . "w"))))
(c-mode . (c-font-lock-keywords nil nil ((?\_ . "w"))))
(emacs-lisp-mode . (lisp-font-lock-keywords))
(latex-mode . (tex-font-lock-keywords))
(lisp-mode . (lisp-font-lock-keywords))
(plain-tex-mode . (tex-font-lock-keywords))
(scheme-mode . (lisp-font-lock-keywords))
(slitex-mode . (tex-font-lock-keywords))
(tex-mode . (tex-font-lock-keywords)))
'((bibtex-mode . (tex-font-lock-keywords))
(c++-c-mode . (c-font-lock-keywords nil nil ((?_ . "w"))))
(c++-mode . (c++-font-lock-keywords nil nil ((?_ . "w"))))
(c-mode . (c-font-lock-keywords nil nil ((?_ . "w"))))
(emacs-lisp-mode . (lisp-font-lock-keywords
nil nil ((?: . "w") (?- . "w") (?* . "w"))))
(latex-mode . (tex-font-lock-keywords))
(lisp-mode . (lisp-font-lock-keywords
nil nil ((?: . "w") (?- . "w") (?* . "w"))))
(plain-tex-mode . (tex-font-lock-keywords))
(scheme-mode . (lisp-font-lock-keywords
nil nil ((?: . "w") (?- . "w") (?* . "w"))))
(slitex-mode . (tex-font-lock-keywords))
(tex-mode . (tex-font-lock-keywords)))
"*Alist of default major mode and Font Lock defaults.
Each item should be a list of the form:
(MAJOR-MODE . (FONT-LOCK-KEYWORDS KEYWORDS-ONLY CASE-FOLD FONT-LOCK-SYNTAX))
@ -140,22 +143,29 @@ is used to set the local Font Lock syntax table for keyword fontification.")
(defvar font-lock-maximum-size (* 100 1024)
"*If non-nil, the maximum size for buffers.
Only buffers less than are fontified when Font Lock mode is turned on.
Only buffers less than this can be fontified when Font Lock mode is turned on.
If nil, means size is irrelevant.")
(defvar font-lock-keywords-case-fold-search nil
"*Non-nil means the patterns in `font-lock-keywords' are case-insensitive.")
(defvar font-lock-syntax-table nil
"*Non-nil means use this syntax table for fontifying.
"Non-nil means use this syntax table for fontifying.
If this is nil, the major mode's syntax table is used.")
(defvar font-lock-verbose t
"*Non-nil means `font-lock-fontify-buffer' should print status messages.")
;;;###autoload
(defvar font-lock-maximum-decoration nil
"Non-nil means use the maximum decoration for fontifying.")
;;;###autoload
(defvar font-lock-mode-hook nil
"Function or functions to run on entry to Font Lock mode.")
(defvar font-lock-after-fontify-buffer-hook nil
"Function or functions to run after `font-lock-fontify-buffer'.")
;; Colour etc. support.
@ -334,27 +344,14 @@ the face is also set; its value is the face name."
(goto-char start)
(beginning-of-line)
(if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
(let ((inhibit-read-only t)
;; Prevent warnings if the disk file has been altered.
(buffer-file-name)
;; Suppress all undo activity.
(buffer-undo-list t)
(let ((inhibit-read-only t) (buffer-undo-list t) (buffer-file-name)
(modified (buffer-modified-p))
(cstart (if comment-start-skip
(concat "\\s\"\\|" comment-start-skip)
"\\s\""))
(cend (if comment-end
(concat "\\s>\\|"
(regexp-quote
;; Discard leading spaces from comment-end.
;; In C mode, it is " */"
;; and we don't want to fail to notice a */
;; just because there's no space there.
(save-match-data
(if (string-match "^ +" comment-end)
(substring comment-end (match-end 0))
comment-end))))
"\\s>"))
(synstart (if comment-start-skip
(concat "\\s\"\\|" comment-start-skip)
"\\s\""))
(comstart (if comment-start-skip
(concat "\\s<\\|" comment-start-skip)
"\\s<"))
(startline (point))
state prev prevstate)
;; Find the state at the line-beginning before START.
@ -380,15 +377,22 @@ the face is also set; its value is the face name."
;; Likewise for a comment.
(if (or (nth 4 state) (nth 7 state))
(let ((beg (point)))
(while (and (re-search-forward cend end 'move)
(nth 3 (parse-partial-sexp beg (point) nil nil
state))))
(save-restriction
(narrow-to-region (point-min) end)
(condition-case nil
(progn
(re-search-backward comstart (point-min) 'move)
(forward-comment 1)
;; forward-comment skips all whitespace,
;; so go back to the real end of the comment.
(skip-chars-backward " \t"))
(error (goto-char end))))
(put-text-property beg (point) 'face font-lock-comment-face)
(setq state (parse-partial-sexp beg (point) nil nil state))))
;; Find each interesting place between here and END.
(while (and (< (point) end)
(setq prev (point) prevstate state)
(re-search-forward cstart end t)
(re-search-forward synstart end t)
(progn
;; Clear out the fonts of what we skip over.
(remove-text-properties prev (point) '(face nil))
@ -429,34 +433,9 @@ the face is also set; its value is the face name."
(not modified)
(set-buffer-modified-p nil))))))
;; This code used to be used to show a string on reaching the end of it.
;; It is probably not needed due to later changes to handle strings
;; starting before the region in question.
;; (if (and (null (nth 3 state))
;; (eq (char-syntax (preceding-char)) ?\")
;; (save-excursion
;; (nth 3 (parse-partial-sexp prev (1- (point))
;; nil nil prevstate))))
;; ;; We found the end of a string.
;; (save-excursion
;; (setq foo2 (point))
;; (let ((ept (point)))
;; (forward-sexp -1)
;; ;; Highlight the string when we see the end.
;; ;; Doing it at the start leads to trouble:
;; ;; either it fails to handle multiline strings
;; ;; or it can run away when an unmatched " is inserted.
;; (put-text-property (point) ept 'face
;; (if (= (car state) 1)
;; font-lock-doc-string-face
;; font-lock-string-face)))))
(defun font-lock-unfontify-region (beg end)
(let ((modified (buffer-modified-p))
(buffer-undo-list t)
(inhibit-read-only t)
;; Prevent warnings if the disk file has been altered.
(buffer-file-name))
(buffer-undo-list t) (inhibit-read-only t) (buffer-file-name))
(remove-text-properties beg end '(face nil))
(set-buffer-modified-p modified)))
@ -481,6 +460,7 @@ the face is also set; its value is the face name."
(if font-lock-no-comments
(remove-text-properties beg end '(face nil))
(font-lock-fontify-region beg end))
;; Now scan for keywords.
(font-lock-hack-keywords beg end))))
; ;; Now scan for keywords, but not if we are inside a comment now.
@ -497,10 +477,7 @@ the face is also set; its value is the face name."
(let ((case-fold-search font-lock-keywords-case-fold-search)
(keywords font-lock-keywords)
(count 0)
;; Prevent warnings if the disk file has been altered.
(buffer-file-name)
(inhibit-read-only t)
(buffer-undo-list t)
(inhibit-read-only t) (buffer-undo-list t) (buffer-file-name)
(modified (buffer-modified-p))
(old-syntax (syntax-table))
(bufname (buffer-name)))
@ -633,7 +610,10 @@ size, you can use \\[font-lock-fontify-buffer]."
(setq font-lock-fontified nil)
(remove-hook 'before-revert-hook 'font-lock-revert-setup)
(remove-hook 'after-revert-hook 'font-lock-revert-cleanup)
(font-lock-unfontify-region (point-min) (point-max))))
(font-lock-unfontify-region (point-min) (point-max))
(font-lock-thing-lock-cleanup))
(t
(font-lock-thing-lock-cleanup)))
(force-mode-line-update)))
;;;###autoload
@ -641,6 +621,13 @@ size, you can use \\[font-lock-fontify-buffer]."
"Unconditionally turn on Font Lock mode."
(font-lock-mode 1))
;; Turn off other related packages if they're on.
(defun font-lock-thing-lock-cleanup ()
(cond ((and (boundp 'fast-lock-mode) fast-lock-mode)
(fast-lock-mode -1))
((and (boundp 'lazy-lock-mode) lazy-lock-mode)
(lazy-lock-mode -1))))
;; If the buffer is about to be reverted, it won't be fontified.
(defun font-lock-revert-setup ()
(setq font-lock-fontified nil))
@ -666,9 +653,9 @@ size, you can use \\[font-lock-fontify-buffer]."
(or was-on (font-lock-set-defaults))
(condition-case nil
(save-excursion
(font-lock-unfontify-region (point-min) (point-max))
(if (not font-lock-no-comments)
(font-lock-fontify-region (point-min) (point-max) verbose))
(if font-lock-no-comments
(font-lock-unfontify-region (point-min) (point-max))
(font-lock-fontify-region (point-min) (point-max) verbose))
(font-lock-hack-keywords (point-min) (point-max) verbose)
(setq font-lock-fontified t))
;; We don't restore the old fontification, so it's best to unfontify.
@ -677,8 +664,8 @@ size, you can use \\[font-lock-fontify-buffer]."
(if font-lock-fontified "done" "aborted")))
(and (buffer-modified-p)
(not modified)
(set-buffer-modified-p nil))))
(set-buffer-modified-p nil))
(run-hooks 'font-lock-after-fontify-buffer-hook)))
;;; Various information shared by several modes.
;;; Information specific to a single mode should go in its load library.
@ -691,9 +678,9 @@ size, you can use \\[font-lock-fontify-buffer]."
(list (concat "^(\\(def\\(const\\|ine-key\\(\\|-after\\)\\|var\\)\\)\\>"
"\\s *\\([^ \t\n\)]+\\)?")
'(1 font-lock-keyword-face) '(4 font-lock-variable-name-face nil t))
(list (concat "^(\\(def\\(a\\(dvice\\|lias\\)\\|macro\\|subst\\|un\\)\\)\\>"
(list (concat "^(\\(def[^ \t\n\)]+\\)\\>"
"\\s *\\([^ \t\n\)]+\\)?")
'(1 font-lock-keyword-face) '(4 font-lock-function-name-face nil t))
'(1 font-lock-keyword-face) '(2 font-lock-function-name-face nil t))
;;
;; this is highlights things like (def* (setf foo) (bar baz)), but may
;; be slower (I haven't really thought about it)
@ -704,49 +691,48 @@ size, you can use \\[font-lock-fontify-buffer]."
This does fairly subdued highlighting.")
(defconst lisp-font-lock-keywords-2
(append
lisp-font-lock-keywords-1
(list
;;
;; Control structures.
;; ELisp:
(append lisp-font-lock-keywords-1
(let ((word-char "[-+a-zA-Z0-9_:*]"))
(list
;;
;; Control structures.
;; ELisp:
; ("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw"
; "save-restriction" "save-excursion"
; "save-window-excursion" "save-match-data" "unwind-protect"
; "condition-case" "track-mouse")
(cons
(concat "(\\("
"c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|if\\|let\\*?\\|prog[nv12*]?\\|"
"save-\\(excursion\\|match-data\\|restriction\\|window-excursion\\)\\|"
"t\\(hrow\\|rack-mouse\\)\\|unwind-protect\\|while"
"\\)[ \t\n]") 1)
;; CLisp:
(cons
(concat
"(\\("
"c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|if\\|let\\*?\\|prog[nv12*]?\\|"
"save-\\(excursion\\|match-data\\|restriction\\|window-excursion\\)\\|"
"t\\(hrow\\|rack-mouse\\)\\|unwind-protect\\|while"
"\\)\\>") 1)
;; CLisp:
; ("when" "unless" "do" "flet" "labels" "return" "return-from")
'("(\\(do\\|flet\\|labels\\|return\\(\\|-from\\)\\|unless\\|when\\)[ \t\n]"
. 1)
;;
;; Fontify CLisp keywords.
'("\\s :\\([-a-zA-Z0-9]+\\)\\>" . 1)
;;
;; Function names in emacs-lisp docstrings (in the syntax that
;; substitute-command-keys understands.)
'("\\\\\\\\\\[\\([^]\\\n]+\\)]" 1 font-lock-reference-face t)
;;
;; Words inside `' which tend to be function names
(let ((word-char "[-+a-zA-Z0-9_:*]"))
'("(\\(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).
'("\\\\\\\\\\[\\([^]\\\n]+\\)]" 1 font-lock-reference-face t)
;;
;; Words inside `' which tend to be symbol names.
(list (concat "`\\(" word-char word-char "+\\)'")
1 'font-lock-reference-face t))
;;
;; & keywords as types
'("\\&\\(optional\\|rest\\)\\>" . font-lock-type-face)
))
"For consideration as a value of `lisp-font-lock-keywords'.
1 'font-lock-reference-face t)
;;
;; & keywords as types
'("\\&\\(optional\\|rest\\|whole\\)\\>" . font-lock-type-face)
)))
"For consideration as a value of `lisp-font-lock-keywords'.
This does a lot more highlighting.")
;; default to the gaudier variety?
;(defvar lisp-font-lock-keywords lisp-font-lock-keywords-2
; "Additional expressions to highlight in Lisp modes.")
(defvar lisp-font-lock-keywords lisp-font-lock-keywords-1
(defvar lisp-font-lock-keywords (if font-lock-maximum-decoration
lisp-font-lock-keywords-2
lisp-font-lock-keywords-1)
"Additional expressions to highlight in Lisp modes.")
@ -881,11 +867,14 @@ This does a lot more highlighting.")
'("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-reference-face))))
)
; default to the gaudier variety?
(defvar c-font-lock-keywords c-font-lock-keywords-1
(defvar c-font-lock-keywords (if font-lock-maximum-decoration
c-font-lock-keywords-2
c-font-lock-keywords-1)
"Additional expressions to highlight in C mode.")
(defvar c++-font-lock-keywords c++-font-lock-keywords-1
(defvar c++-font-lock-keywords (if font-lock-maximum-decoration
c++-font-lock-keywords-2
c++-font-lock-keywords-1)
"Additional expressions to highlight in C++ mode.")
(defvar tex-font-lock-keywords
@ -901,8 +890,8 @@ This does a lot more highlighting.")
)
"Additional expressions to highlight in TeX mode.")
;; There is no html-mode.el shipped with Emacs; `font-lock-defaults' entry
; would be: (html-font-lock-keywords nil t)
;; There is no html-mode.el shipped with Emacs; its `font-lock-defaults' entry
;; could be: (html-font-lock-keywords nil t)
;(defconst html-font-lock-keywords
; '(("<!--[^>]*>" 0 font-lock-comment-face t) ; Comment.
; ("</?\\sw+" . font-lock-type-face) ; Normal tag start.