# HG changeset patch # User Stefan Monnier # Date 944548317 0 # Node ID d22cd599a91a4472779fb91f54d2890724e6811b # Parent 91304e25926bbc84a3624fe70a2f2a6ec2d16425 (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. diff -r 91304e25926b -r d22cd599a91a lisp/font-lock.el --- 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)