# HG changeset patch # User Simon Marshall # Date 818526957 0 # Node ID 1dab6f0d92397291dfc0a92e1acfd854afbb55d5 # Parent 7cbb1453aefd6e69970f422a61f3cc0984aabb4a Don't turn on in any buffer with a leading space in its name. When (un)fontifying, make sure we're doing it in the whole buffer. Make a command to refontify the window. diff -r 7cbb1453aefd -r 1dab6f0d9239 lisp/font-lock.el --- a/lisp/font-lock.el Sat Dec 09 08:52:17 1995 +0000 +++ b/lisp/font-lock.el Sat Dec 09 16:35:57 1995 +0000 @@ -67,11 +67,14 @@ ;; ;; So, here are my opinions/advice/guidelines: ;; +;; - Highlight conceptual objects, such as function and variable names, and +;; different objects types differently, i.e., (a) and (b) above, highlight +;; function names differently to variable names. +;; - Keep the faces distinct from each other as far as possible. +;; i.e., (a) above. ;; - Use the same face for the same conceptual object, across all modes. ;; i.e., (b) above, all modes that have items that can be thought of as, say, ;; keywords, should be highlighted with the same face, etc. -;; - Keep the faces distinct from each other as far as possible. -;; i.e., (a) above. ;; - Make the face attributes fit the concept as far as possible. ;; i.e., function names might be a bold colour such as blue, comments might ;; be a bright colour such as red, character strings might be brown, because, @@ -354,15 +357,20 @@ `font-lock-maximum-decoration' to specify which level you generally prefer. When you turn Font Lock mode on/off the buffer is fontified/defontified, though fontification occurs only if the buffer is less than `font-lock-maximum-size'. -To fontify a buffer without turning on Font Lock mode, and regardless of buffer -size, you can use \\[font-lock-fontify-buffer]." + +To fontify a buffer, without turning on Font Lock mode and regardless of buffer +size, you can use \\[font-lock-fontify-buffer]. +To fontify a window, perhaps because modification on the current line caused +syntactic change on other lines, you can use \\[font-lock-fontify-window]." (interactive "P") (let ((on-p (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)))))) - (if (equal (buffer-name) " *Compiler Input*") ; hack for bytecomp... + ;; 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). + (if (or noninteractive (eq (aref (buffer-name) 0) ?\ )) (setq on-p nil)) (if (not on-p) (remove-hook 'after-change-functions 'font-lock-after-change-function @@ -389,8 +397,11 @@ (setq font-lock-fontified nil) (remove-hook 'before-revert-hook 'font-lock-revert-setup t) (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t) - (font-lock-unfontify-region (point-min) (point-max)) - (font-lock-thing-lock-cleanup)) + ;; Make sure we unfontify etc. in the whole buffer. + (save-restriction + (widen) + (font-lock-unfontify-region (point-min) (point-max)) + (font-lock-thing-lock-cleanup))) (t (remove-hook 'before-revert-hook 'font-lock-revert-setup t) (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t) @@ -410,18 +421,31 @@ (not (zerop (buffer-size)))))) (set (make-local-variable 'font-lock-fontified) nil) (if verbose (message "Fontifying %s..." (buffer-name))) - ;; Turn it on to run hooks and get the right `font-lock-keywords' etc. - (or font-lock-mode (font-lock-set-defaults)) - (condition-case nil - (save-excursion - (save-match-data - (font-lock-fontify-region (point-min) (point-max) verbose) - (setq font-lock-fontified t))) - ;; We don't restore the old fontification, so it's best to unfontify. - (quit (font-lock-unfontify-region (point-min) (point-max)))) - (if verbose (message "Fontifying %s... %s." (buffer-name) - (if font-lock-fontified "done" "aborted"))) - (font-lock-after-fontify-buffer))) + ;; Make sure we have the right `font-lock-keywords' etc. + (if (not font-lock-mode) (font-lock-set-defaults)) + ;; Make sure we fontify etc. in the whole buffer. + (save-restriction + (widen) + (condition-case nil + (save-excursion + (save-match-data + (font-lock-fontify-region (point-min) (point-max) verbose) + (setq font-lock-fontified t))) + ;; We don't restore the old fontification, so it's best to unfontify. + (quit (font-lock-unfontify-region (point-min) (point-max)))) + (if verbose (message "Fontifying %s... %s." (buffer-name) + (if font-lock-fontified "done" "aborted"))) + (font-lock-after-fontify-buffer)))) + +(defun font-lock-fontify-window () + "Fontify the current window the way `font-lock-mode' would." + (interactive) + (let ((font-lock-beginning-of-syntax-function nil)) + (save-excursion + (save-match-data + (font-lock-fontify-region (window-start) (window-end)))))) + +(define-key global-map [?\C-\S-l] 'font-lock-fontify-window) ;; Fontification functions. @@ -432,6 +456,7 @@ (let ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (old-syntax-table (syntax-table)) + before-change-functions after-change-functions buffer-file-name buffer-file-truename) (unwind-protect (progn @@ -457,6 +482,7 @@ (defun font-lock-unfontify-region (beg end) (let ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) + before-change-functions after-change-functions buffer-file-name buffer-file-truename) (remove-text-properties beg end '(face nil)) (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil)))) @@ -764,7 +790,8 @@ ;; If the buffer has just been reverted, normally that turns off ;; Font Lock mode. So turn the mode back on if necessary. -(defalias 'font-lock-revert-cleanup 'turn-on-font-lock) +(defalias 'font-lock-revert-cleanup + 'turn-on-font-lock) (defun font-lock-compile-keywords (&optional keywords) ;; Compile `font-lock-keywords' into the form (t KEYWORD ...) where KEYWORD @@ -817,17 +844,17 @@ (cdr (assq major-mode font-lock-defaults-alist)))) (keywords (font-lock-choose-keywords (nth 0 defaults) font-lock-maximum-decoration))) - ;; Keywords? + ;; Regexp fontification? (setq font-lock-keywords (if (fboundp keywords) (funcall keywords) (eval keywords))) - ;; Syntactic? + ;; Syntactic fontification? (if (nth 1 defaults) (set (make-local-variable 'font-lock-keywords-only) t)) - ;; Case fold? + ;; Case fold during regexp fontification? (if (nth 2 defaults) (set (make-local-variable 'font-lock-keywords-case-fold-search) t)) - ;; Syntax table? + ;; Syntax table for regexp and syntactic fontification? (if (nth 3 defaults) (let ((slist (nth 3 defaults))) (set (make-local-variable 'font-lock-syntax-table) @@ -836,7 +863,7 @@ (modify-syntax-entry (car (car slist)) (cdr (car slist)) font-lock-syntax-table) (setq slist (cdr slist))))) - ;; Syntax function? + ;; Syntax function for syntactic fontification? (if (nth 4 defaults) (set (make-local-variable 'font-lock-beginning-of-syntax-function) (nth 4 defaults)))))) @@ -1040,14 +1067,14 @@ "\\)\\)\\>" ;; Any whitespace and declared object. "[ \t'\(]*" - "\\([^ \t\n\)]+\\)?") + "\\(\\sw+\\)?") '(1 font-lock-keyword-face) '(8 (cond ((match-beginning 3) font-lock-variable-name-face) ((match-beginning 6) font-lock-type-face) (t font-lock-function-name-face)) nil t)) ) - "Subdued level highlighting Lisp modes.") + "Subdued level highlighting for Lisp modes.") (defconst lisp-font-lock-keywords-2 (append lisp-font-lock-keywords-1 @@ -1055,7 +1082,7 @@ ;; ;; Control structures. ELisp and CLisp combined. ; (make-regexp -; '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw" +; '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "inline" "catch" "throw" ; "save-restriction" "save-excursion" "save-window-excursion" ; "save-selected-window" "save-match-data" "unwind-protect" ; "condition-case" "track-mouse" @@ -1066,12 +1093,17 @@ "(\\(" "\\(c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|do\\|" "eval-\\(a\\(fter-load\\|nd-compile\\)\\|when-compile\\)\\|flet\\|" - "if\\|l\\(abels\\|et\\*?\\)\\|prog[nv12*]?\\|return\\(\\|-from\\)\\|" + "i\\(f\\|nline\\)\\|l\\(abels\\|et\\*?\\)\\|prog[nv12*]?\\|" + "return\\(\\|-from\\)\\|" "save-\\(excursion\\|match-data\\|restriction\\|selected-window\\|" "window-excursion\\)\\|t\\(hrow\\|rack-mouse\\)\\|" "un\\(less\\|wind-protect\\)\\|wh\\(en\\|ile\\)\\)" "\\)\\>") 1) ;; + ;; Feature symbols as references. + '("(\\(featurep\\|provide\\|require\\)\\>[ \t']*\\(\\sw+\\)?" + (1 font-lock-keyword-face) (2 font-lock-reference-face nil t)) + ;; ;; Words inside \\[] tend to be for `substitute-command-keys'. '("\\\\\\\\\\[\\(\\sw+\\)]" 1 font-lock-reference-face prepend) ;; @@ -1221,7 +1253,7 @@ '("^#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)" 1 font-lock-string-face) ;; ;; Fontify function macro names. - '("^#[ \t]*define[ \t]+\\(\\(\\sw+\\)(\\)" 2 font-lock-function-name-face) + '("^#[ \t]*define[ \t]+\\(\\sw+\\)(" 1 font-lock-function-name-face) ;; ;; Fontify symbol names in #if ... defined preprocessor directives. '("^#[ \t]*if\\>" @@ -1229,7 +1261,7 @@ (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t))) ;; ;; Fontify otherwise as symbol names, and the preprocessor directive names. - '("^\\(#[ \t]*[a-z]+\\)\\>[ \t]*\\(\\sw+\\)?" + '("^#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?" (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t)) )) @@ -1246,7 +1278,7 @@ (cons (concat "\\<\\(" c-keywords "\\)\\>") 'font-lock-keyword-face) ;; ;; Fontify case/goto keywords and targets, and case default/goto tags. - '("\\<\\(case\\|goto\\)\\>[ \t]*\\([^ \t\n:;]+\\)?" + '("\\<\\(case\\|goto\\)\\>[ \t]*\\(\\sw+\\)?" (1 font-lock-keyword-face) (2 font-lock-reference-face nil t)) '("^[ \t]*\\(\\sw+\\)[ \t]*:" 1 font-lock-reference-face) ))) @@ -1317,7 +1349,7 @@ (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t)) ;; ;; Fontify case/goto keywords and targets, and case default/goto tags. - '("\\<\\(case\\|goto\\)\\>[ \t]*\\([^ \t\n:;]+\\)?" + '("\\<\\(case\\|goto\\)\\>[ \t]*\\(\\sw+\\)?" (1 font-lock-keyword-face) (2 font-lock-reference-face nil t)) '("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-reference-face) ;;