changeset 26746:d22cd599a91a

(font-lock-default-fontify-region): Fix subtle off-by-one problem that could force re-fontifying the whole buffer. (font-lock-remove-keywords): New function. (font-lock-add-keywords): Use the new function to ensure idempotence.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 07 Dec 1999 06:31:57 +0000
parents 91304e25926b
children a65919d40cd0
files lisp/font-lock.el
diffstat 1 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/font-lock.el	Tue Dec 07 06:31:32 1999 +0000
+++ b/lisp/font-lock.el	Tue Dec 07 06:31:57 1999 +0000
@@ -753,12 +753,24 @@
 	 ;; Otherwise if Font Lock mode is on, set or add the keywords now.
 	 (if (eq append 'set)
 	     (setq font-lock-keywords keywords)
+	   (font-lock-remove-keywords keywords)
 	   (let ((old (if (eq (car-safe font-lock-keywords) t)
 			  (cdr font-lock-keywords)
 			font-lock-keywords)))
 	     (setq font-lock-keywords (if append
 					  (append old keywords)
 					(append keywords old))))))))
+
+;;;###autoload
+(defun font-lock-remove-keywords (keywords)
+  "Remove highlighting KEYWORDS from the current buffer."
+  (setq font-lock-keywords (copy-list font-lock-keywords))
+  (dolist (keyword keywords)
+    (setq font-lock-keywords
+	  (delete keyword
+		  (delete (font-lock-compile-keyword keyword)
+			  font-lock-keywords)))))
+
 
 ;;; Global Font Lock mode.
 
@@ -1096,8 +1108,15 @@
 	  ;; check to see if we should expand the beg/end area for
 	  ;; proper multiline matches
 	  (setq beg (if (get-text-property beg 'font-lock-multiline)
+			;; if the text-property is non-nil, (1+ beg)
+			;; is valid.  We need to use (1+ beg) for the
+			;; case where (get-text-property (1- beg)) is nil
+			;; in which case we want to keep BEG but
+			;; previous-single-property-change will return
+			;; the previous change (if any) rather than
+			;; the one at BEG.
 			(or (previous-single-property-change
-			     beg 'font-lock-multiline)
+			     (1+ beg) 'font-lock-multiline)
 			    (point-min))
 		      beg))
 	  (setq end (or (text-property-any end (point-max)