Commit 3708dfe9 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

(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.
parent 707ad060
......@@ -753,12 +753,24 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;; 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)
(setq font-lock-keywords (if append
(append old keywords)
(append keywords old))))))))
(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)
;;; Global Font Lock mode.
......@@ -1096,8 +1108,15 @@ The value of this variable is used when Font Lock mode is turned on."
;; 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)
(setq end (or (text-property-any end (point-max)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment