aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2006-08-03 07:14:39 +0000
committerStefan Monnier2006-08-03 07:14:39 +0000
commit05a1066ff0521af95b3761376c853d96312ca2f3 (patch)
tree93703b07c93c44847892aba80432bcbf59140834
parentab0dd59ce73e9b13b44ffe52d9937a7a7221e000 (diff)
downloademacs-05a1066ff0521af95b3761376c853d96312ca2f3.tar.gz
emacs-05a1066ff0521af95b3761376c853d96312ca2f3.zip
(font-lock-beg, font-lock-end, font-lock-extend-region-functions): New vars.
(font-lock-extend-region-multiline) (font-lock-extend-region-wholelines): New functions. (font-lock-default-fontify-region): Use them. (font-lock-extend-jit-lock-region-after-change): Only round up if font-lock-default-fontify-region will do it as well.
-rw-r--r--etc/NEWS5
-rw-r--r--lisp/ChangeLog8
-rw-r--r--lisp/font-lock.el94
-rw-r--r--lispref/modes.texi6
4 files changed, 88 insertions, 25 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 52fcc1eea2a..3f986846f17 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -5363,6 +5363,11 @@ text to being a piece of code, so you'd put a `jit-lock-defer-multiline'
5363property over the second half of the command to force (deferred) 5363property over the second half of the command to force (deferred)
5364refontification of `bar' whenever the `e' is added/removed. 5364refontification of `bar' whenever the `e' is added/removed.
5365 5365
5366*** `font-lock-extend-region-functions' makes it possible to alter the way
5367the fontification region is chosen. This can be used to prevent rounding
5368up to whole lines, or to extend the region to include all related lines
5369of multiline constructs so that such constructs get properly recognized.
5370
5366** Major mode mechanism changes: 5371** Major mode mechanism changes:
5367 5372
5368+++ 5373+++
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index dd1b63ba4ee..6329e0e699d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,13 @@
12006-08-03 Stefan Monnier <monnier@iro.umontreal.ca> 12006-08-03 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * font-lock.el (font-lock-beg, font-lock-end)
4 (font-lock-extend-region-functions): New vars.
5 (font-lock-extend-region-multiline)
6 (font-lock-extend-region-wholelines): New functions.
7 (font-lock-default-fontify-region): Use them.
8 (font-lock-extend-jit-lock-region-after-change): Only round up
9 if font-lock-default-fontify-region will do it as well.
10
3 * font-lock.el (font-lock-extend-after-change-region-function): 11 * font-lock.el (font-lock-extend-after-change-region-function):
4 Rename from font-lock-extend-region-function. 12 Rename from font-lock-extend-region-function.
5 (font-lock-extend-region): Remove by inlining at call sites. 13 (font-lock-extend-region): Remove by inlining at call sites.
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index a7cc1a09022..0cad924f201 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -1040,6 +1040,53 @@ The region it returns may start or end in the middle of a line.")
1040Useful for things like RMAIL and Info where the whole buffer is not 1040Useful for things like RMAIL and Info where the whole buffer is not
1041a very meaningful entity to highlight.") 1041a very meaningful entity to highlight.")
1042 1042
1043
1044(defvar font-lock-beg) (defvar font-lock-end)
1045(defvar font-lock-extend-region-functions
1046 '(font-lock-extend-region-wholelines
1047 font-lock-extend-region-multiline)
1048 "Special hook run just before proceeding to fontify a region.
1049This is used to allow major modes to help font-lock find safe buffer positions
1050as beginning and end of the fontified region. Its most common use is to solve
1051the problem of /identification/ of multiline elements by providing a function
1052that tries to find such elements and move the boundaries such that they do
1053not fall in the middle of one.
1054Each function is called with no argument; it is expected to adjust the
1055dynamically bound variables `font-lock-beg' and `font-lock-end'; and return
1056non-nil iff it did make such an adjustment.
1057These functions are run in turn repeatedly until they all return nil.
1058Put first the functions more likely to cause a change and cheaper to compute.")
1059;; Mark it as a special hook which doesn't use any global setting
1060;; (i.e. doesn't obey the element t in the buffer-local value).
1061(make-variable-buffer-local 'font-lock-extend-region-functions)
1062
1063(defun font-lock-extend-region-multiline ()
1064 "Move fontification boundaries away from any `font-lock-multiline' property."
1065 (let ((changed nil))
1066 (when (and (> font-lock-beg (point-min))
1067 (get-text-property (1- font-lock-beg) 'font-lock-multiline))
1068 (setq changed t)
1069 (setq font-lock-beg (or (previous-single-property-change
1070 font-lock-beg 'font-lock-multiline)
1071 (point-min))))
1072 ;;
1073 (when (get-text-property font-lock-end 'font-lock-multiline)
1074 (setq changed t)
1075 (setq font-lock-end (or (text-property-any font-lock-end (point-max)
1076 'font-lock-multiline nil)
1077 (point-max))))
1078 changed))
1079
1080
1081(defun font-lock-extend-region-wholelines ()
1082 "Move fontification boundaries to beginning of lines."
1083 (let ((changed nil))
1084 (goto-char font-lock-beg)
1085 (unless (bobp) (setq changed t font-lock-beg (line-beginning-position)))
1086 (goto-char font-lock-end)
1087 (unless (bobp) (setq changed t font-lock-end (line-beginning-position 2)))
1088 changed))
1089
1043(defun font-lock-default-fontify-region (beg end loudly) 1090(defun font-lock-default-fontify-region (beg end loudly)
1044 (save-buffer-state 1091 (save-buffer-state
1045 ((parse-sexp-lookup-properties 1092 ((parse-sexp-lookup-properties
@@ -1051,24 +1098,21 @@ a very meaningful entity to highlight.")
1051 ;; Use the fontification syntax table, if any. 1098 ;; Use the fontification syntax table, if any.
1052 (when font-lock-syntax-table 1099 (when font-lock-syntax-table
1053 (set-syntax-table font-lock-syntax-table)) 1100 (set-syntax-table font-lock-syntax-table))
1054 (goto-char beg) 1101 ;; Extend the region to fontify so that it starts and ends at
1055 (setq beg (line-beginning-position)) 1102 ;; safe places.
1056 ;; check to see if we should expand the beg/end area for 1103 (let ((funs font-lock-extend-region-functions)
1057 ;; proper multiline matches 1104 (font-lock-beg beg)
1058 (when (and (> beg (point-min)) 1105 (font-lock-end end))
1059 (get-text-property (1- beg) 'font-lock-multiline)) 1106 (while funs
1060 ;; We are just after or in a multiline match. 1107 (setq funs (if (or (not (funcall (car funs)))
1061 (setq beg (or (previous-single-property-change 1108 (eq funs font-lock-extend-region-functions))
1062 beg 'font-lock-multiline) 1109 (cdr funs)
1063 (point-min))) 1110 ;; If there's been a change, we should go through
1064 (goto-char beg) 1111 ;; the list again since this new position may
1065 (setq beg (line-beginning-position))) 1112 ;; warrant a different answer from one of the fun
1066 (setq end (or (text-property-any end (point-max) 1113 ;; we've already seen.
1067 'font-lock-multiline nil) 1114 font-lock-extend-region-functions)))
1068 (point-max))) 1115 (setq beg font-lock-beg end font-lock-end))
1069 (goto-char end)
1070 ;; Round up to a whole line.
1071 (unless (bolp) (setq end (line-beginning-position 2)))
1072 ;; Now do the fontification. 1116 ;; Now do the fontification.
1073 (font-lock-unfontify-region beg end) 1117 (font-lock-unfontify-region beg end)
1074 (when font-lock-syntactic-keywords 1118 (when font-lock-syntactic-keywords
@@ -1144,12 +1188,14 @@ what properties to clear before refontifying a region.")
1144 ;; Finally, pre-enlarge the region to a whole number of lines, to try 1188 ;; Finally, pre-enlarge the region to a whole number of lines, to try
1145 ;; and predict what font-lock-default-fontify-region will do, so as to 1189 ;; and predict what font-lock-default-fontify-region will do, so as to
1146 ;; avoid double-redisplay. 1190 ;; avoid double-redisplay.
1147 (goto-char beg) 1191 (when (memq 'font-lock-extend-region-wholelines
1148 (forward-line 0) 1192 font-lock-extend-region-functions)
1149 (setq jit-lock-start (min jit-lock-start (point))) 1193 (goto-char beg)
1150 (goto-char end) 1194 (forward-line 0)
1151 (forward-line 1) 1195 (setq jit-lock-start (min jit-lock-start (point)))
1152 (setq jit-lock-end (max jit-lock-end (point)))))) 1196 (goto-char end)
1197 (forward-line 1)
1198 (setq jit-lock-end (max jit-lock-end (point)))))))
1153 1199
1154(defun font-lock-fontify-block (&optional arg) 1200(defun font-lock-fontify-block (&optional arg)
1155 "Fontify some lines the way `font-lock-fontify-buffer' would. 1201 "Fontify some lines the way `font-lock-fontify-buffer' would.
diff --git a/lispref/modes.texi b/lispref/modes.texi
index 7ca8764a0a8..38227633c6b 100644
--- a/lispref/modes.texi
+++ b/lispref/modes.texi
@@ -3044,7 +3044,7 @@ closely related, and often getting one of them to work will appear to
3044make the other also work. However, for reliable results you must 3044make the other also work. However, for reliable results you must
3045attend explicitly to both aspects. 3045attend explicitly to both aspects.
3046 3046
3047 There are two ways to ensure correct identification of multiline 3047 There are three ways to ensure correct identification of multiline
3048constructs: 3048constructs:
3049 3049
3050@itemize 3050@itemize
@@ -3055,6 +3055,10 @@ property on the construct when it is added to the buffer.
3055Use @code{font-lock-fontify-region-function} hook to extend the scan 3055Use @code{font-lock-fontify-region-function} hook to extend the scan
3056so that the scanned text never starts or ends in the middle of a 3056so that the scanned text never starts or ends in the middle of a
3057multiline construct. 3057multiline construct.
3058@item
3059Add a function to @code{font-lock-extend-region-functions} that does
3060the \emph{identification} and extends the scan so that the scanned
3061text never starts or ends in the middle of a multiline construct.
3058@end itemize 3062@end itemize
3059 3063
3060 There are three ways to do rehighlighting of multiline constructs: 3064 There are three ways to do rehighlighting of multiline constructs: