aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2000-02-07 01:49:33 +0000
committerStefan Monnier <[email protected]>2000-02-07 01:49:33 +0000
commit6e1d0d151dbcb24c71654345358be05f797a7841 (patch)
tree1c9cca60feff8d0b11ffb04a161d747844472236
parent66e4690ffa2438bc74a082d614206a877f4a97e2 (diff)
(font-lock-keywords): Fix doc for multiline matches.
(font-lock-add-keywords): Make it work even if font-lock-mode is nil, so that it can be used more easily in <foo>-mode-hook. Also make sure to avoid duplicate entries. (font-lock-update-removed-keyword-alist): Renamed `major-mode'->`mode'. (font-lock-remove-keywords): Just as was done for `add', allow it to work even if font-lock-mode is nil. Also make sure we don't modify any pre-existing list by forcing a copy-sequence. Finally rename `major-mode' to `mode'. (font-lock-fontify-syntactic-anchored-keywords) (font-lock-fontify-anchored-keywords) (font-lock-fontify-keywords-region): Use line-end-position. Don't make `font-lock-multiline' local (it's now done in font-lock-set-defaults). (font-lock-set-defaults): Make `font-lock-multiline' local. Also move the `font-lock-fontified' creation to inside the `unless'.
-rw-r--r--lisp/ChangeLog19
-rw-r--r--lisp/font-lock.el77
2 files changed, 60 insertions, 36 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 5948451a08..121ea011e4 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,22 @@
+2000-02-06 Stefan Monnier <[email protected]>
+
+ * font-lock.el (font-lock-keywords): Fix doc for multiline matches.
+ (font-lock-add-keywords): Make it work even if font-lock-mode is nil,
+ so that it can be used more easily in <foo>-mode-hook. Also make sure
+ to avoid duplicate entries.
+ (font-lock-update-removed-keyword-alist): Renamed `major-mode'->`mode'.
+ (font-lock-remove-keywords): Just as was done for `add', allow it to
+ work even if font-lock-mode is nil. Also make sure we don't modify
+ any pre-existing list by forcing a copy-sequence. Finally rename
+ `major-mode' to `mode'.
+ (font-lock-fontify-syntactic-anchored-keywords)
+ (font-lock-fontify-anchored-keywords)
+ (font-lock-fontify-keywords-region): Use line-end-position.
+ Don't make `font-lock-multiline' local (it's now done in
+ font-lock-set-defaults).
+ (font-lock-set-defaults): Make `font-lock-multiline' local. Also
+ move the `font-lock-fontified' creation to inside the `unless'.
+
2000-02-06 Andrew Innes <[email protected]>
* term/w32-win.el (x-handle-args): Comment out call to message,
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index cecc933b62..f264805f3d 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -389,9 +389,10 @@ PRE-MATCH-FORM is evaluated, that position is used as the limit of the search.
It is generally a bad idea to return a position greater than the end of the
line, i.e., cause the MATCHER search to span lines.
-These regular expressions should not match text which spans lines. While
-\\[font-lock-fontify-buffer] handles multi-line patterns correctly, updating
-when you edit the buffer does not, since it considers text one line at a time.
+These regular expressions can match text which spans lines, although
+it is better to avoid it if possible since updating them while editing
+text is slower, and it is not guaranteed to be always correct when using
+support modes like jit-lock or lazy-lock.
This variable is set by major modes via the variable `font-lock-defaults'.
Be careful when composing regexps for this list; a poorly written pattern can
@@ -768,11 +769,12 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;; Make sure that `font-lock-removed-keywords-alist' does not
;; contain the new keywords.
(font-lock-update-removed-keyword-alist mode keywords append))
- (font-lock-mode
- ;; 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 mode keywords)
+ (t
+ ;; Otherwise set or add the keywords now.
+ (font-lock-set-defaults)
+ (if (eq append 'set)
+ (setq font-lock-keywords keywords)
+ (font-lock-remove-keywords nil keywords) ;to avoid duplicates
(let ((old (if (eq (car-safe font-lock-keywords) t)
(cdr font-lock-keywords)
font-lock-keywords)))
@@ -780,9 +782,9 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
(append old keywords)
(append keywords old))))))))
-(defun font-lock-update-removed-keyword-alist (major-mode keywords append)
+(defun font-lock-update-removed-keyword-alist (mode keywords append)
;; Update `font-lock-removed-keywords-alist' when adding new
- ;; KEYWORDS to MAJOR-MODE.
+ ;; KEYWORDS to MODE.
;;
;; When font-lock is enabled first all keywords in the list
;; `font-lock-keywords-alist' are added, then all keywords in the
@@ -790,7 +792,7 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;; keyword was once added, removed, and then added again it must be
;; removed from the removed-keywords list. Otherwise the second add
;; will not take effect.
- (let ((cell (assq major-mode font-lock-removed-keywords-alist)))
+ (let ((cell (assq mode font-lock-removed-keywords-alist)))
(if cell
(if (eq append 'set)
;; A new set of keywords is defined. Forget all about
@@ -800,7 +802,7 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;; Delete all previously removed keywords.
(dolist (kword keywords)
(setcdr cell (delete kword (cdr cell))))
- ;; Delete the major-mode cell if empty.
+ ;; Delete the mode cell if empty.
(if (null (cdr cell))
(setq font-lock-removed-keywords-alist
(delq cell font-lock-removed-keywords-alist)))))))
@@ -825,16 +827,16 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
;;
;; (II) The keywords are removed from the current buffer.
;;;###autoload
-(defun font-lock-remove-keywords (major-mode keywords)
- "Remove highlighting KEYWORDS for MAJOR-MODE.
+(defun font-lock-remove-keywords (mode keywords)
+ "Remove highlighting KEYWORDS for MODE.
-MAJOR-MODE should be a symbol, the major mode command name, such as `c-mode'
+MODE should be a symbol, the major mode command name, such as `c-mode'
or nil. If nil, highlighting keywords are removed for the current buffer."
- (dolist (keyword keywords)
- ;; Remove one keyword at the time.
- (cond (major-mode
- (let ((top-cell (assq major-mode font-lock-keywords-alist)))
- ;; If MAJOR-MODE is non-nil, remove the KEYWORD from
+ (cond (mode
+ ;; Remove one keyword at the time.
+ (dolist (keyword keywords)
+ (let ((top-cell (assq mode font-lock-keywords-alist)))
+ ;; If MODE is non-nil, remove the KEYWORD from
;; `font-lock-keywords-alist'.
(when top-cell
(dolist (keyword-list-append-pair (cdr top-cell))
@@ -859,19 +861,22 @@ or nil. If nil, highlighting keywords are removed for the current buffer."
(setq font-lock-keywords-alist
(delq top-cell font-lock-keywords-alist))))
;; Remember the keyword in case it is not local.
- (let ((cell (assq major-mode font-lock-removed-keywords-alist)))
+ (let ((cell (assq mode font-lock-removed-keywords-alist)))
(if cell
(unless (member keyword (cdr cell))
(nconc cell (list keyword)))
- (push (cons major-mode (list keyword))
- font-lock-removed-keywords-alist)))))
- (font-lock-mode
- ;; Otherwise if Font Lock mode is on, remove it immediately.
- (setq font-lock-keywords (delete keyword font-lock-keywords))
- ;; The keywords might be compiled.
+ (push (cons mode (list keyword))
+ font-lock-removed-keywords-alist))))))
+ (t
+ ;; Otherwise remove it immediately.
+ (font-lock-set-defaults)
+ (setq font-lock-keywords (copy-sequence font-lock-keywords))
+ (dolist (keyword keywords)
(setq font-lock-keywords
- (delete (font-lock-compile-keyword keyword)
- font-lock-keywords))))))
+ (delete keyword
+ ;; The keywords might be compiled.
+ (delete (font-lock-compile-keyword keyword)
+ font-lock-keywords)))))))
;;; Global Font Lock mode.
@@ -1412,7 +1417,7 @@ LIMIT can be modified by the value of its PRE-MATCH-FORM."
;; Set LIMIT to value of PRE-MATCH-FORM or the end of line.
(if (and (numberp pre-match-value) (> pre-match-value (point)))
(setq limit pre-match-value)
- (save-excursion (end-of-line) (setq limit (point))))
+ (setq limit (line-end-position)))
(save-match-data
;; Find an occurrence of `matcher' before `limit'.
(while (if (stringp matcher)
@@ -1561,14 +1566,14 @@ LIMIT can be modified by the value of its PRE-MATCH-FORM."
(pre-match-value (eval (nth 1 keywords))))
;; Set LIMIT to value of PRE-MATCH-FORM or the end of line.
(if (not (and (numberp pre-match-value) (> pre-match-value (point))))
- (save-excursion (end-of-line) (setq limit (point)))
+ (setq limit (line-end-position))
(setq limit pre-match-value)
(when (and font-lock-multiline
(funcall (if (eq font-lock-multiline t) '>= '>)
pre-match-value
(save-excursion (forward-line 1) (point))))
;; this is a multiline anchored match
- (set (make-local-variable 'font-lock-multiline) t)
+ (setq font-lock-multiline t)
(put-text-property (point) limit 'font-lock-multiline t)))
(save-match-data
;; Find an occurrence of `matcher' before `limit'.
@@ -1612,7 +1617,7 @@ START should be at the beginning of a line."
(save-excursion (goto-char (match-beginning 0))
(forward-line 1) (point))))
;; this is a multiline regexp match
- (set (make-local-variable 'font-lock-multiline) t)
+ (setq font-lock-multiline t)
(put-text-property (match-beginning 0) (point)
'font-lock-multiline t))
;; Apply each highlight to this instance of `matcher', which may be
@@ -1690,13 +1695,13 @@ A LEVEL of nil is equal to a LEVEL of 0, a LEVEL of t is equal to
"Set fontification defaults appropriately for this mode.
Sets various variables using `font-lock-defaults' (or, if nil, using
`font-lock-defaults-alist') and `font-lock-maximum-decoration'."
- ;; Set fontification defaults.
- (make-local-variable 'font-lock-fontified)
- ;; Set iff not previously set.
+ ;; Set fontification defaults iff not previously set.
(unless font-lock-set-defaults
(set (make-local-variable 'font-lock-set-defaults) t)
(set (make-local-variable 'font-lock-cache-state) nil)
(set (make-local-variable 'font-lock-cache-position) (make-marker))
+ (make-local-variable 'font-lock-fontified)
+ (make-local-variable 'font-lock-multiline)
(let* ((defaults (or font-lock-defaults
(cdr (assq major-mode font-lock-defaults-alist))))
(keywords