aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Marshall1997-05-29 07:18:05 +0000
committerSimon Marshall1997-05-29 07:18:05 +0000
commitac6e572cb99aff9ff489dd1b851e46c64f1bf6c1 (patch)
tree46faeda0e923dcc88a3579f71b1df1d6e3b1606f
parent38c979d349eb874f66f42f644b736efe541bbc05 (diff)
downloademacs-ac6e572cb99aff9ff489dd1b851e46c64f1bf6c1.tar.gz
emacs-ac6e572cb99aff9ff489dd1b851e46c64f1bf6c1.zip
Update for syntax-table text properties.
font-lock.el now adds them via font-lock-syntactic-keywords.
-rw-r--r--lisp/font-lock.el559
1 files changed, 329 insertions, 230 deletions
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 43a3029625e..f6db74a5384 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -60,16 +60,40 @@
60;; properties appropriately. 60;; properties appropriately.
61;; 61;;
62;; Fontification normally involves syntactic (i.e., strings and comments) and 62;; Fontification normally involves syntactic (i.e., strings and comments) and
63;; regexp (i.e., keywords and everything else) passes. The syntactic pass 63;; regexp (i.e., keywords and everything else) passes. There are actually
64;; involves a syntax table and a syntax parsing function to determine the 64;; three passes; (a) the syntactic keyword pass, (b) the syntactic pass and (c)
65;; context of different parts of a region of text. It is necessary because 65;; the keyword pass. Confused?
66;; generally strings and/or comments can span lines, and so the context of a 66;;
67;; given region is not necessarily apparent from the content of that region. 67;; The syntactic keyword pass places `syntax-table' text properties in the
68;; Because the regexp pass only works within a given region, it is not 68;; buffer according to the variable `font-lock-syntactic-keywords'. It is
69;; generally appropriate for syntactic fontification. The regexp pass involves 69;; necessary because Emacs' syntax table is not powerful enough to describe all
70;; searching for given regexps (or calling given functions) within the given 70;; the different syntactic constructs required by the sort of people who decide
71;; region. For each match of the regexp (or non-nil value of the called 71;; that a single quote can be syntactic or not depending on the time of day.
72;; function), `face' text properties are added appropriately. 72;; (What sort of person could decide to overload the meaning of a quote?)
73;; Obviously the syntactic keyword pass must occur before the syntactic pass.
74;;
75;; The syntactic pass places `face' text properties in the buffer according to
76;; syntactic context, i.e., according to the buffer's syntax table and buffer
77;; text's `syntax-table' text properties. It involves using a syntax parsing
78;; function to determine the context of different parts of a region of text. A
79;; syntax parsing function is necessary because generally strings and/or
80;; comments can span lines, and so the context of a given region is not
81;; necessarily apparent from the content of that region. Because the keyword
82;; pass only works within a given region, it is not generally appropriate for
83;; syntactic fontification. This is the first fontification pass that makes
84;; changes visible to the user; it fontifies strings and comments.
85;;
86;; The keyword pass places `face' text properties in the buffer according to
87;; the variable `font-lock-keywords'. It involves searching for given regexps
88;; (or calling given search functions) within the given region. This is the
89;; second fontification pass that makes changes visible to the user; it
90;; fontifies language reserved words, etc.
91;;
92;; Oh, and the answer is, "Yes, obviously just about everything should be done
93;; in a single syntactic pass, but the only syntactic parser available
94;; understands only strings and comments." Perhaps one day someone will write
95;; some syntactic parsers for common languages and a son-of-font-lock.el could
96;; use them rather then relying so heavily on the keyword (regexp) pass.
73 97
74;;; How Font Lock mode supports modes or is supported by modes: 98;;; How Font Lock mode supports modes or is supported by modes:
75 99
@@ -92,10 +116,9 @@
92 116
93;; See the documentation for the variable `font-lock-keywords'. 117;; See the documentation for the variable `font-lock-keywords'.
94;; 118;;
95;; Nasty regexps of the form "bar\\(\\|lo\\)\\|f\\(oo\\|u\\(\\|bar\\)\\)\\|lo" 119;; Efficient regexps for use as MATCHERs for `font-lock-keywords' and
96;; are made thusly: (make-regexp '("foo" "fu" "fubar" "bar" "barlo" "lo")) for 120;; `font-lock-syntactic-keywords' can be generated via the function
97;; efficiency. See /pub/gnu/emacs/elisp-archive/functions/make-regexp.el.Z on 121;; `regexp-opt', and their depth counted via the function `regexp-opt-depth'.
98;; archive.cis.ohio-state.edu for this and other functions not just by sm.
99 122
100;;; Adding patterns for modes that already support Font Lock: 123;;; Adding patterns for modes that already support Font Lock:
101 124
@@ -198,7 +221,7 @@
198 "Extra mode-specific type names for highlighting declarations." 221 "Extra mode-specific type names for highlighting declarations."
199 :group 'font-lock) 222 :group 'font-lock)
200 223
201;; Define support mode groups here for nicer `font-lock' group order. 224;; Define support mode groups here to impose `font-lock' group order.
202(defgroup fast-lock nil 225(defgroup fast-lock nil
203 "Font Lock support mode to cache fontification." 226 "Font Lock support mode to cache fontification."
204 :link '(custom-manual "(emacs)Support Modes") 227 :link '(custom-manual "(emacs)Support Modes")
@@ -271,7 +294,7 @@ for buffers in Rmail mode, and size is irrelevant otherwise."
271;; Fontification variables: 294;; Fontification variables:
272 295
273(defvar font-lock-keywords nil 296(defvar font-lock-keywords nil
274 "*A list of the keywords to highlight. 297 "A list of the keywords to highlight.
275Each element should be of the form: 298Each element should be of the form:
276 299
277 MATCHER 300 MATCHER
@@ -297,10 +320,10 @@ MATCH-HIGHLIGHT should be of the form:
297 320
298Where MATCHER can be either the regexp to search for, or the function name to 321Where MATCHER can be either the regexp to search for, or the function name to
299call to make the search (called with one argument, the limit of the search). 322call to make the search (called with one argument, the limit of the search).
300MATCH is the subexpression of MATCHER to be highlighted. MATCH can be 323MATCHER regexps can be generated via the function `regexp-opt'. MATCH is the
301calculated via the function `font-lock-keyword-depth'. FACENAME is an 324subexpression of MATCHER to be highlighted. MATCH can be calculated via the
302expression whose value is the face name to use. FACENAME's default attributes 325function `regexp-opt-depth'. FACENAME is an expression whose value is the face
303can be modified via \\[customize]. 326name to use. Face default attributes can be modified via \\[customize].
304 327
305OVERRIDE and LAXMATCH are flags. If OVERRIDE is t, existing fontification can 328OVERRIDE and LAXMATCH are flags. If OVERRIDE is t, existing fontification can
306be overwritten. If `keep', only parts not already fontified are highlighted. 329be overwritten. If `keep', only parts not already fontified are highlighted.
@@ -497,6 +520,20 @@ This is normally set via `font-lock-defaults'.")
497 "*Non-nil means the patterns in `font-lock-keywords' are case-insensitive. 520 "*Non-nil means the patterns in `font-lock-keywords' are case-insensitive.
498This is normally set via `font-lock-defaults'.") 521This is normally set via `font-lock-defaults'.")
499 522
523(defvar font-lock-syntactic-keywords nil
524 "A list of the syntactic keywords to highlight.
525Can be the list or the name of a function or variable whose value is the list.
526See `font-lock-keywords' for a description of the form of this list;
527the differences are listed below. MATCH-HIGHLIGHT should be of the form:
528
529 (MATCH SYNTAX OVERRIDE LAXMATCH)
530
531where SYNTAX can be of the form (SYNTAX-CODE . MATCHING-CHAR), the name of a
532syntax table, or an expression whose value is such a form or a syntax table.
533OVERRIDE cannot be `prepend' or `append'.
534
535This is normally set via `font-lock-defaults'.")
536
500(defvar font-lock-syntax-table nil 537(defvar font-lock-syntax-table nil
501 "Non-nil means use this syntax table for fontifying. 538 "Non-nil means use this syntax table for fontifying.
502If this is nil, the major mode's syntax table is used. 539If this is nil, the major mode's syntax table is used.
@@ -998,7 +1035,9 @@ The value of this variable is used when Font Lock mode is turned on."
998 (setq font-lock-fontified nil))) 1035 (setq font-lock-fontified nil)))
999 1036
1000(defun font-lock-default-fontify-region (beg end loudly) 1037(defun font-lock-default-fontify-region (beg end loudly)
1001 (save-buffer-state ((old-syntax-table (syntax-table))) 1038 (save-buffer-state
1039 ((parse-sexp-lookup-properties font-lock-syntactic-keywords)
1040 (old-syntax-table (syntax-table)))
1002 (unwind-protect 1041 (unwind-protect
1003 (save-restriction 1042 (save-restriction
1004 (widen) 1043 (widen)
@@ -1007,6 +1046,8 @@ The value of this variable is used when Font Lock mode is turned on."
1007 (set-syntax-table font-lock-syntax-table)) 1046 (set-syntax-table font-lock-syntax-table))
1008 ;; Now do the fontification. 1047 ;; Now do the fontification.
1009 (font-lock-unfontify-region beg end) 1048 (font-lock-unfontify-region beg end)
1049 (when font-lock-syntactic-keywords
1050 (font-lock-fontify-syntactic-keywords-region beg end))
1010 (unless font-lock-keywords-only 1051 (unless font-lock-keywords-only
1011 (font-lock-fontify-syntactically-region beg end loudly)) 1052 (font-lock-fontify-syntactically-region beg end loudly))
1012 (font-lock-fontify-keywords-region beg end loudly)) 1053 (font-lock-fontify-keywords-region beg end loudly))
@@ -1023,7 +1064,7 @@ The value of this variable is used when Font Lock mode is turned on."
1023 1064
1024(defun font-lock-default-unfontify-region (beg end) 1065(defun font-lock-default-unfontify-region (beg end)
1025 (save-buffer-state nil 1066 (save-buffer-state nil
1026 (remove-text-properties beg end '(face nil)))) 1067 (remove-text-properties beg end '(face nil syntax-table nil))))
1027 1068
1028;; Called when any modification is made to buffer text. 1069;; Called when any modification is made to buffer text.
1029(defun font-lock-after-change-function (beg end old-len) 1070(defun font-lock-after-change-function (beg end old-len)
@@ -1061,67 +1102,6 @@ delimit the region to fontify."
1061 1102
1062;;; End of Fontification functions. 1103;;; End of Fontification functions.
1063 1104
1064;;; Syntactic fontification functions.
1065
1066;; These record the parse state at a particular position, always the start of a
1067;; line. Used to make `font-lock-fontify-syntactically-region' faster.
1068;; Previously, `font-lock-cache-position' was just a buffer position. However,
1069;; under certain situations, this occasionally resulted in mis-fontification.
1070;; I think the "situations" were deletion with Lazy Lock mode's deferral. sm.
1071(defvar font-lock-cache-state nil)
1072(defvar font-lock-cache-position nil)
1073
1074(defun font-lock-fontify-syntactically-region (start end &optional loudly)
1075 "Put proper face on each string and comment between START and END.
1076START should be at the beginning of a line."
1077 (let ((cache (marker-position font-lock-cache-position))
1078 state string beg)
1079 (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
1080 (goto-char start)
1081 ;;
1082 ;; Find the state at the `beginning-of-line' before `start'.
1083 (if (eq start cache)
1084 ;; Use the cache for the state of `start'.
1085 (setq state font-lock-cache-state)
1086 ;; Find the state of `start'.
1087 (if (null font-lock-beginning-of-syntax-function)
1088 ;; Use the state at the previous cache position, if any, or
1089 ;; otherwise calculate from `point-min'.
1090 (if (or (null cache) (< start cache))
1091 (setq state (parse-partial-sexp (point-min) start))
1092 (setq state (parse-partial-sexp cache start nil nil
1093 font-lock-cache-state)))
1094 ;; Call the function to move outside any syntactic block.
1095 (funcall font-lock-beginning-of-syntax-function)
1096 (setq state (parse-partial-sexp (point) start)))
1097 ;; Cache the state and position of `start'.
1098 (setq font-lock-cache-state state)
1099 (set-marker font-lock-cache-position start))
1100 ;;
1101 ;; If the region starts inside a string or comment, show the extent of it.
1102 (when (or (nth 3 state) (nth 4 state))
1103 (setq string (nth 3 state) beg (point))
1104 (setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
1105 (put-text-property beg (point) 'face
1106 (if string
1107 font-lock-string-face
1108 font-lock-comment-face)))
1109 ;;
1110 ;; Find each interesting place between here and `end'.
1111 (while (and (< (point) end)
1112 (progn
1113 (setq state (parse-partial-sexp (point) end nil nil state
1114 'syntax-table))
1115 (or (nth 3 state) (nth 4 state))))
1116 (setq string (nth 3 state) beg (nth 8 state))
1117 (setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
1118 (put-text-property beg (point) 'face
1119 (if string
1120 font-lock-string-face
1121 font-lock-comment-face)))))
1122
1123;;; End of Syntactic fontification functions.
1124
1125;;; Additional text property functions. 1105;;; Additional text property functions.
1126 1106
1127;; The following text property functions should be builtins. This means they 1107;; The following text property functions should be builtins. This means they
@@ -1203,7 +1183,162 @@ Optional argument OBJECT is the string or buffer containing the text."
1203 1183
1204;;; End of Additional text property functions. 1184;;; End of Additional text property functions.
1205 1185
1206;;; Regexp fontification functions. 1186;;; Syntactic regexp fontification functions.
1187
1188;; These syntactic keyword pass functions are identical to those keyword pass
1189;; functions below, with the following exceptions; (a) they operate on
1190;; `font-lock-syntactic-keywords' of course, (b) they are all `defun' as speed
1191;; is less of an issue, (c) eval of property value does not occur JIT as speed
1192;; is less of an issue, (d) OVERRIDE cannot be `prepend' or `append' as it
1193;; makes no sense for `syntax-table' property values, (e) they do not do it
1194;; LOUDLY as it is not likely to be intensive.
1195
1196(defun font-lock-apply-syntactic-highlight (highlight)
1197 "Apply HIGHLIGHT following a match.
1198HIGHLIGHT should be of the form MATCH-HIGHLIGHT,
1199see `font-lock-syntactic-keywords'."
1200 (let* ((match (nth 0 highlight))
1201 (start (match-beginning match)) (end (match-end match))
1202 (value (nth 1 highlight))
1203 (override (nth 2 highlight)))
1204 (unless (numberp (car value))
1205 (setq value (eval value)))
1206 (cond ((not start)
1207 ;; No match but we might not signal an error.
1208 (or (nth 3 highlight)
1209 (error "No match %d in highlight %S" match highlight)))
1210 ((not override)
1211 ;; Cannot override existing fontification.
1212 (or (text-property-not-all start end 'syntax-table nil)
1213 (put-text-property start end 'syntax-table value)))
1214 ((eq override t)
1215 ;; Override existing fontification.
1216 (put-text-property start end 'syntax-table value))
1217 ((eq override 'keep)
1218 ;; Keep existing fontification.
1219 (font-lock-fillin-text-property start end 'syntax-table value)))))
1220
1221(defun font-lock-fontify-syntactic-anchored-keywords (keywords limit)
1222 "Fontify according to KEYWORDS until LIMIT.
1223KEYWORDS should be of the form MATCH-ANCHORED, see `font-lock-keywords',
1224LIMIT can be modified by the value of its PRE-MATCH-FORM."
1225 (let ((matcher (nth 0 keywords)) (lowdarks (nthcdr 3 keywords)) highlights
1226 ;; Evaluate PRE-MATCH-FORM.
1227 (pre-match-value (eval (nth 1 keywords))))
1228 ;; Set LIMIT to value of PRE-MATCH-FORM or the end of line.
1229 (if (and (numberp pre-match-value) (> pre-match-value (point)))
1230 (setq limit pre-match-value)
1231 (save-excursion (end-of-line) (setq limit (point))))
1232 (save-match-data
1233 ;; Find an occurrence of `matcher' before `limit'.
1234 (while (if (stringp matcher)
1235 (re-search-forward matcher limit t)
1236 (funcall matcher limit))
1237 ;; Apply each highlight to this instance of `matcher'.
1238 (setq highlights lowdarks)
1239 (while highlights
1240 (font-lock-apply-syntactic-highlight (car highlights))
1241 (setq highlights (cdr highlights)))))
1242 ;; Evaluate POST-MATCH-FORM.
1243 (eval (nth 2 keywords))))
1244
1245(defun font-lock-fontify-syntactic-keywords-region (start end)
1246 "Fontify according to `font-lock-syntactic-keywords' between START and END.
1247START should be at the beginning of a line."
1248 ;; If `font-lock-syntactic-keywords' is a symbol, get the real keywords.
1249 (when (symbolp font-lock-syntactic-keywords)
1250 (setq font-lock-syntactic-keywords (font-lock-eval-keywords
1251 font-lock-syntactic-keywords)))
1252 ;; If `font-lock-syntactic-keywords' is not compiled, compile it.
1253 (unless (eq (car font-lock-syntactic-keywords) t)
1254 (setq font-lock-syntactic-keywords (font-lock-compile-keywords
1255 font-lock-syntactic-keywords)))
1256 ;; Get down to business.
1257 (let ((case-fold-search font-lock-keywords-case-fold-search)
1258 (keywords (cdr font-lock-syntactic-keywords))
1259 keyword matcher highlights)
1260 (while keywords
1261 ;; Find an occurrence of `matcher' from `start' to `end'.
1262 (setq keyword (car keywords) matcher (car keyword))
1263 (goto-char start)
1264 (while (if (stringp matcher)
1265 (re-search-forward matcher end t)
1266 (funcall matcher end))
1267 ;; Apply each highlight to this instance of `matcher', which may be
1268 ;; specific highlights or more keywords anchored to `matcher'.
1269 (setq highlights (cdr keyword))
1270 (while highlights
1271 (if (numberp (car (car highlights)))
1272 (font-lock-apply-syntactic-highlight (car highlights))
1273 (font-lock-fontify-syntactic-anchored-keywords (car highlights)
1274 end))
1275 (setq highlights (cdr highlights))))
1276 (setq keywords (cdr keywords)))))
1277
1278;;; End of Syntactic regexp fontification functions.
1279
1280;;; Syntactic fontification functions.
1281
1282;; These record the parse state at a particular position, always the start of a
1283;; line. Used to make `font-lock-fontify-syntactically-region' faster.
1284;; Previously, `font-lock-cache-position' was just a buffer position. However,
1285;; under certain situations, this occasionally resulted in mis-fontification.
1286;; I think the "situations" were deletion with Lazy Lock mode's deferral. sm.
1287(defvar font-lock-cache-state nil)
1288(defvar font-lock-cache-position nil)
1289
1290(defun font-lock-fontify-syntactically-region (start end &optional loudly)
1291 "Put proper face on each string and comment between START and END.
1292START should be at the beginning of a line."
1293 (let ((cache (marker-position font-lock-cache-position))
1294 state string beg)
1295 (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
1296 (goto-char start)
1297 ;;
1298 ;; Find the state at the `beginning-of-line' before `start'.
1299 (if (eq start cache)
1300 ;; Use the cache for the state of `start'.
1301 (setq state font-lock-cache-state)
1302 ;; Find the state of `start'.
1303 (if (null font-lock-beginning-of-syntax-function)
1304 ;; Use the state at the previous cache position, if any, or
1305 ;; otherwise calculate from `point-min'.
1306 (if (or (null cache) (< start cache))
1307 (setq state (parse-partial-sexp (point-min) start))
1308 (setq state (parse-partial-sexp cache start nil nil
1309 font-lock-cache-state)))
1310 ;; Call the function to move outside any syntactic block.
1311 (funcall font-lock-beginning-of-syntax-function)
1312 (setq state (parse-partial-sexp (point) start)))
1313 ;; Cache the state and position of `start'.
1314 (setq font-lock-cache-state state)
1315 (set-marker font-lock-cache-position start))
1316 ;;
1317 ;; If the region starts inside a string or comment, show the extent of it.
1318 (when (or (nth 3 state) (nth 4 state))
1319 (setq string (nth 3 state) beg (point))
1320 (setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
1321 (put-text-property beg (point) 'face
1322 (if string
1323 font-lock-string-face
1324 font-lock-comment-face)))
1325 ;;
1326 ;; Find each interesting place between here and `end'.
1327 (while (and (< (point) end)
1328 (progn
1329 (setq state (parse-partial-sexp (point) end nil nil state
1330 'syntax-table))
1331 (or (nth 3 state) (nth 4 state))))
1332 (setq string (nth 3 state) beg (nth 8 state))
1333 (setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
1334 (put-text-property beg (point) 'face
1335 (if string
1336 font-lock-string-face
1337 font-lock-comment-face)))))
1338
1339;;; End of Syntactic fontification functions.
1340
1341;;; Keyword regexp fontification functions.
1207 1342
1208(defsubst font-lock-apply-highlight (highlight) 1343(defsubst font-lock-apply-highlight (highlight)
1209 "Apply HIGHLIGHT following a match. 1344 "Apply HIGHLIGHT following a match.
@@ -1259,7 +1394,7 @@ LIMIT can be modified by the value of its PRE-MATCH-FORM."
1259(defun font-lock-fontify-keywords-region (start end &optional loudly) 1394(defun font-lock-fontify-keywords-region (start end &optional loudly)
1260 "Fontify according to `font-lock-keywords' between START and END. 1395 "Fontify according to `font-lock-keywords' between START and END.
1261START should be at the beginning of a line." 1396START should be at the beginning of a line."
1262 (unless (eq (car-safe font-lock-keywords) t) 1397 (unless (eq (car font-lock-keywords) t)
1263 (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords))) 1398 (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)))
1264 (let ((case-fold-search font-lock-keywords-case-fold-search) 1399 (let ((case-fold-search font-lock-keywords-case-fold-search)
1265 (keywords (cdr font-lock-keywords)) 1400 (keywords (cdr font-lock-keywords))
@@ -1287,7 +1422,7 @@ START should be at the beginning of a line."
1287 (setq highlights (cdr highlights)))) 1422 (setq highlights (cdr highlights))))
1288 (setq keywords (cdr keywords))))) 1423 (setq keywords (cdr keywords)))))
1289 1424
1290;;; End of Regexp fontification functions. 1425;;; End of Keyword regexp fontification functions.
1291 1426
1292;; Various functions. 1427;; Various functions.
1293 1428
@@ -1317,6 +1452,14 @@ START should be at the beginning of a line."
1317 (t ; (MATCHER HIGHLIGHT ...) 1452 (t ; (MATCHER HIGHLIGHT ...)
1318 keyword))) 1453 keyword)))
1319 1454
1455(defun font-lock-eval-keywords (keywords)
1456 ;; Evalulate KEYWORDS if a function (funcall) or variable (eval) name.
1457 (if (symbolp keywords)
1458 (font-lock-eval-keywords (if (fboundp keywords)
1459 (funcall keywords)
1460 (eval keywords)))
1461 keywords))
1462
1320(defun font-lock-value-in-major-mode (alist) 1463(defun font-lock-value-in-major-mode (alist)
1321 ;; Return value in ALIST for `major-mode', or ALIST if it is not an alist. 1464 ;; Return value in ALIST for `major-mode', or ALIST if it is not an alist.
1322 ;; Structure is ((MAJOR-MODE . VALUE) ...) where MAJOR-MODE may be t. 1465 ;; Structure is ((MAJOR-MODE . VALUE) ...) where MAJOR-MODE may be t.
@@ -1357,7 +1500,7 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
1357 (local (cdr (assq major-mode font-lock-keywords-alist)))) 1500 (local (cdr (assq major-mode font-lock-keywords-alist))))
1358 ;; Regexp fontification? 1501 ;; Regexp fontification?
1359 (set (make-local-variable 'font-lock-keywords) 1502 (set (make-local-variable 'font-lock-keywords)
1360 (if (fboundp keywords) (funcall keywords) (eval keywords))) 1503 (font-lock-compile-keywords (font-lock-eval-keywords keywords)))
1361 ;; Local fontification? 1504 ;; Local fontification?
1362 (while local 1505 (while local
1363 (font-lock-add-keywords nil (car (car local)) (cdr (car local))) 1506 (font-lock-add-keywords nil (car (car local)) (cdr (car local)))
@@ -1393,7 +1536,7 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
1393 (while alist 1536 (while alist
1394 (let ((variable (car (car alist))) (value (cdr (car alist)))) 1537 (let ((variable (car (car alist))) (value (cdr (car alist))))
1395 (unless (boundp variable) 1538 (unless (boundp variable)
1396 (setq variable nil)) 1539 (set variable nil))
1397 (set (make-local-variable variable) value) 1540 (set (make-local-variable variable) value)
1398 (setq alist (cdr alist)))))))) 1541 (setq alist (cdr alist))))))))
1399 1542
@@ -1517,11 +1660,9 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
1517 :group 'font-lock-highlighting-faces) 1660 :group 'font-lock-highlighting-faces)
1518 1661
1519(defface font-lock-function-name-face 1662(defface font-lock-function-name-face
1520 ;; Currently, Emacs/Custom does not support a :reverse or :invert spec.
1521 '((((class color) (background light)) (:foreground "Blue")) 1663 '((((class color) (background light)) (:foreground "Blue"))
1522 (((class color) (background dark)) (:foreground "LightSkyBlue")) 1664 (((class color) (background dark)) (:foreground "LightSkyBlue"))
1523 (t ;(:reverse t :bold t) 1665 (t (:inverse-video t :bold t)))
1524 (:italic t :bold t)))
1525 "Font Lock mode face used to highlight function names." 1666 "Font Lock mode face used to highlight function names."
1526 :group 'font-lock-highlighting-faces) 1667 :group 'font-lock-highlighting-faces)
1527 1668
@@ -1557,11 +1698,9 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
1557 :group 'font-lock-highlighting-faces) 1698 :group 'font-lock-highlighting-faces)
1558 1699
1559(defface font-lock-warning-face 1700(defface font-lock-warning-face
1560 ;; Currently, Emacs/Custom does not support a :reverse or :invert spec.
1561 '((((class color) (background light)) (:foreground "Red" :bold t)) 1701 '((((class color) (background light)) (:foreground "Red" :bold t))
1562 (((class color) (background dark)) (:foreground "Pink" :bold t)) 1702 (((class color) (background dark)) (:foreground "Pink" :bold t))
1563 (t ;(:reverse t :bold t) 1703 (t (:inverse-video t :bold t)))
1564 (:italic t :bold t)))
1565 "Font Lock mode face used to highlight warnings." 1704 "Font Lock mode face used to highlight warnings."
1566 :group 'font-lock-highlighting-faces) 1705 :group 'font-lock-highlighting-faces)
1567 1706
@@ -1682,10 +1821,11 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
1682Matches after point, but ignores leading whitespace and `*' characters. 1821Matches after point, but ignores leading whitespace and `*' characters.
1683Does not move further than LIMIT. 1822Does not move further than LIMIT.
1684 1823
1685The expected syntax of a declaration/definition item is `word', possibly ending 1824The expected syntax of a declaration/definition item is `word' (preceded by
1686with optional whitespace and a `('. Everything following the item (but 1825optional whitespace and `*' characters and proceeded by optional whitespace)
1687belonging to it) is expected to by skip-able by `scan-sexps', and items are 1826optionally followed by a `('. Everything following the item (but belonging to
1688expected to be separated with a `,' and to be terminated with a `;'. 1827it) is expected to by skip-able by `scan-sexps', and items are expected to be
1828separated with a `,' and to be terminated with a `;'.
1689 1829
1690Thus the regexp matches after point: word ( 1830Thus the regexp matches after point: word (
1691 ^^^^ ^ 1831 ^^^^ ^
@@ -1708,14 +1848,6 @@ This function could be MATCHER in a MATCH-ANCHORED `font-lock-keywords' item."
1708 (goto-char (match-end 2))) 1848 (goto-char (match-end 2)))
1709 (error t))))) 1849 (error t)))))
1710 1850
1711(defun font-lock-keyword-depth (keyword)
1712 "Return the depth of KEYWORD regexp.
1713This means the number of parenthesized expressions."
1714 (let ((count 0) start)
1715 (while (string-match "\\\\(" keyword start)
1716 (setq count (1+ count) start (match-end 0)))
1717 count))
1718
1719 1851
1720(defconst lisp-font-lock-keywords-1 1852(defconst lisp-font-lock-keywords-1
1721 (eval-when-compile 1853 (eval-when-compile
@@ -1754,40 +1886,30 @@ This means the number of parenthesized expressions."
1754 (list 1886 (list
1755 ;; 1887 ;;
1756 ;; Control structures. Emacs Lisp forms. 1888 ;; Control structures. Emacs Lisp forms.
1757 (cons (concat "(\\(" 1889 (cons (concat
1758; (make-regexp 1890 "(" (regexp-opt
1759; '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw" 1891 '("cond" "if" "while" "catch" "throw" "let" "let*"
1760; "inline" "save-restriction" "save-excursion" "save-window-excursion" 1892 "prog" "progn" "progv" "prog1" "prog2" "prog*"
1761; "save-selected-window" "save-match-data" "save-current-buffer" 1893 "inline" "save-restriction" "save-excursion"
1762; "unwind-protect" "condition-case" "track-mouse" "dont-compile" 1894 "save-window-excursion" "save-selected-window"
1763; "eval-after-load" "eval-and-compile" "eval-when" "eval-when-compile" 1895 "save-match-data" "save-current-buffer" "unwind-protect"
1764; "with-output-to-temp-buffer" "with-timeout" "with-current-buffer" 1896 "condition-case" "track-mouse" "dont-compile"
1765; "with-temp-buffer" "with-temp-file")) 1897 "eval-after-load" "eval-and-compile" "eval-when-compile"
1766 "c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|dont-compile\\|" 1898 "eval-when" "with-output-to-temp-buffer" "with-timeout"
1767 "eval-\\(a\\(fter-load\\|nd-compile\\)\\|" 1899 "with-current-buffer" "with-temp-buffer"
1768 "when\\(\\|-compile\\)\\)\\|" 1900 "with-temp-file") t)
1769 "i\\(f\\|nline\\)\\|let\\*?\\|prog[nv12*]?\\|" 1901 "\\>")
1770 "save-\\(current-buffer\\|excursion\\|match-data\\|"
1771 "restriction\\|selected-window\\|window-excursion\\)\\|"
1772 "t\\(hrow\\|rack-mouse\\)\\|unwind-protect\\|"
1773 "w\\(hile\\|ith-\\(current-buffer\\|"
1774 "output-to-temp-buffer\\|"
1775 "t\\(emp-\\(buffer\\|file\\)\\|imeout\\)\\)\\)"
1776 "\\)\\>")
1777 1) 1902 1)
1778 ;; 1903 ;;
1779 ;; Control structures. Common Lisp forms. 1904 ;; Control structures. Common Lisp forms.
1780 (cons (concat "(\\(" 1905 (cons (concat
1781; (make-regexp 1906 "(" (regexp-opt
1782; '("when" "unless" "case" "ecase" "typecase" "etypecase" 1907 '("when" "unless" "case" "ecase" "typecase" "etypecase"
1783; "loop" "do\\*?" "dotimes" "dolist" 1908 "loop" "do" "do*" "dotimes" "dolist"
1784; "proclaim" "declaim" "declare" 1909 "proclaim" "declaim" "declare"
1785; "lexical-let\\*?" "flet" "labels" "return" "return-from")) 1910 "lexical-let" "lexical-let*" "flet" "labels"
1786 "case\\|d\\(ecla\\(im\\|re\\)\\|o\\(\\*?\\|" 1911 "return" "return-from") t)
1787 "list\\|times\\)\\)\\|e\\(case\\|typecase\\)\\|flet\\|" 1912 "\\>")
1788 "l\\(abels\\|exical-let\\*?\\|oop\\)\\|proclaim\\|"
1789 "return\\(\\|-from\\)\\|typecase\\|unless\\|when"
1790 "\\)\\>")
1791 1) 1913 1)
1792 ;; 1914 ;;
1793 ;; Feature symbols as references. 1915 ;; Feature symbols as references.
@@ -1837,23 +1959,19 @@ This means the number of parenthesized expressions."
1837 nil t)) 1959 nil t))
1838 ;; 1960 ;;
1839 ;; Control structures. 1961 ;; Control structures.
1840;(make-regexp '("begin" "call-with-current-continuation" "call/cc"
1841; "call-with-input-file" "call-with-output-file" "case" "cond"
1842; "do" "else" "for-each" "if" "lambda"
1843; "let\\*?" "let-syntax" "letrec" "letrec-syntax"
1844; ;; Hannes Haug <hannes.haug@student.uni-tuebingen.de> wants:
1845; "and" "or" "delay"
1846; ;; Stefan Monnier <stefan.monnier@epfl.ch> says don't bother:
1847; ;;"quasiquote" "quote" "unquote" "unquote-splicing"
1848; "map" "syntax" "syntax-rules"))
1849 (cons 1962 (cons
1850 (concat "(\\(" 1963 (concat
1851 "and\\|begin\\|c\\(a\\(ll\\(-with-\\(current-continuation\\|" 1964 "(" (regexp-opt
1852 "input-file\\|output-file\\)\\|/cc\\)\\|se\\)\\|ond\\)\\|" 1965 '("begin" "call-with-current-continuation" "call/cc"
1853 "d\\(elay\\|o\\)\\|else\\|for-each\\|if\\|" 1966 "call-with-input-file" "call-with-output-file" "case" "cond"
1854 "l\\(ambda\\|et\\(-syntax\\|\\*?\\|rec\\(\\|-syntax\\)\\)\\)\\|" 1967 "do" "else" "for-each" "if" "lambda"
1855 "map\\|or\\|syntax\\(\\|-rules\\)" 1968 "let" "let*" "let-syntax" "letrec" "letrec-syntax"
1856 "\\)\\>") 1) 1969 ;; Hannes Haug <hannes.haug@student.uni-tuebingen.de> wants:
1970 "and" "or" "delay"
1971 ;; Stefan Monnier <stefan.monnier@epfl.ch> says don't bother:
1972 ;;"quasiquote" "quote" "unquote" "unquote-splicing"
1973 "map" "syntax" "syntax-rules") t)
1974 "\\>") 1)
1857 ;; 1975 ;;
1858 ;; David Fox <fox@graphics.cs.nyu.edu> for SOS/STklos class specifiers. 1976 ;; David Fox <fox@graphics.cs.nyu.edu> for SOS/STklos class specifiers.
1859 '("\\<<\\sw+>\\>" . font-lock-type-face) 1977 '("\\<<\\sw+>\\>" . font-lock-type-face)
@@ -1976,21 +2094,20 @@ See also `c-font-lock-extra-types'.")
1976See also `c-font-lock-extra-types'.") 2094See also `c-font-lock-extra-types'.")
1977 2095
1978(let* ((c-keywords 2096(let* ((c-keywords
1979; ("break" "continue" "do" "else" "for" "if" "return" "switch" "while") 2097 (eval-when-compile
1980 "break\\|continue\\|do\\|else\\|for\\|if\\|return\\|switch\\|while") 2098 (regexp-opt '("break" "continue" "do" "else" "for" "if" "return"
2099 "switch" "while") t)))
1981 (c-type-types 2100 (c-type-types
1982; ("auto" "extern" "register" "static" "typedef" "struct" "union" "enum"
1983; "signed" "unsigned" "short" "long" "int" "char" "float" "double"
1984; "void" "volatile" "const")
1985 `(mapconcat 'identity 2101 `(mapconcat 'identity
1986 (cons 2102 (cons
1987 (,@ (concat "auto\\|c\\(har\\|onst\\)\\|double\\|" 2103 (,@ (eval-when-compile
1988 "e\\(num\\|xtern\\)\\|float\\|int\\|long\\|register\\|" 2104 (regexp-opt
1989 "s\\(hort\\|igned\\|t\\(atic\\|ruct\\)\\)\\|typedef\\|" 2105 '("auto" "extern" "register" "static" "typedef" "struct"
1990 "un\\(ion\\|signed\\)\\|vo\\(id\\|latile\\)")) 2106 "union" "enum" "signed" "unsigned" "short" "long"
2107 "int" "char" "float" "double" "void" "volatile" "const"))))
1991 c-font-lock-extra-types) 2108 c-font-lock-extra-types)
1992 "\\|")) 2109 "\\|"))
1993 (c-type-depth `(font-lock-keyword-depth (,@ c-type-types))) 2110 (c-type-depth `(regexp-opt-depth (,@ c-type-types)))
1994 ) 2111 )
1995 (setq c-font-lock-keywords-1 2112 (setq c-font-lock-keywords-1
1996 (list 2113 (list
@@ -2032,7 +2149,7 @@ See also `c-font-lock-extra-types'.")
2032 (cons (concat "\\<\\(" (,@ c-type-types) "\\)\\>") 'font-lock-type-face)) 2149 (cons (concat "\\<\\(" (,@ c-type-types) "\\)\\>") 'font-lock-type-face))
2033 ;; 2150 ;;
2034 ;; Fontify all builtin keywords (except case, default and goto; see below). 2151 ;; Fontify all builtin keywords (except case, default and goto; see below).
2035 (concat "\\<\\(" c-keywords "\\)\\>") 2152 (concat "\\<" c-keywords "\\>")
2036 ;; 2153 ;;
2037 ;; Fontify case/goto keywords and targets, and case default/goto tags. 2154 ;; Fontify case/goto keywords and targets, and case default/goto tags.
2038 '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?" 2155 '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"
@@ -2119,7 +2236,7 @@ See also `c++-font-lock-extra-types'.")
2119 "[ \t*&]*" 2236 "[ \t*&]*"
2120 ;; This is `c++-type-spec' from below. (Hint hint!) 2237 ;; This is `c++-type-spec' from below. (Hint hint!)
2121 "\\(\\sw+\\)" ; The instance? 2238 "\\(\\sw+\\)" ; The instance?
2122 "\\(<\\(\\sw+\\)[ \t*&]*>\\)?" ; Or template? 2239 "\\([ \t]*<\\([^>\n]+\\)[ \t*&]*>\\)?" ; Or template?
2123 "\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?" ; Or member? 2240 "\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?" ; Or member?
2124 ;; Match any trailing parenthesis. 2241 ;; Match any trailing parenthesis.
2125 "[ \t]*\\((\\)?"))) 2242 "[ \t]*\\((\\)?")))
@@ -2136,15 +2253,13 @@ See also `c++-font-lock-extra-types'.")
2136 (error t))))) 2253 (error t)))))
2137 2254
2138(let* ((c++-keywords 2255(let* ((c++-keywords
2139; ("break" "continue" "do" "else" "for" "if" "return" "switch" "while" 2256 (eval-when-compile
2140; "asm" "catch" "delete" "new" "operator" "sizeof" "this" "throw" "try" 2257 (regexp-opt
2141; ;; Eric Hopper <hopper@omnifarious.mn.org> says these are new. 2258 '("break" "continue" "do" "else" "for" "if" "return" "switch"
2142; "static_cast" "dynamic_cast" "const_cast" "reinterpret_cast") 2259 "while" "asm" "catch" "delete" "new" "operator" "sizeof" "this"
2143 (concat "asm\\|break\\|c\\(atch\\|on\\(st_cast\\|tinue\\)\\)\\|" 2260 "throw" "try"
2144 "d\\(elete\\|o\\|ynamic_cast\\)\\|else\\|for\\|if\\|new\\|" 2261 ;; Eric Hopper <hopper@omnifarious.mn.org> says these are new.
2145 "operator\\|re\\(interpret_cast\\|turn\\)\\|" 2262 "static_cast" "dynamic_cast" "const_cast" "reinterpret_cast") t)))
2146 "s\\(izeof\\|tatic_cast\\|"
2147 "witch\\)\\|t\\(h\\(is\\|row\\)\\|ry\\)\\|while"))
2148 (c++-operators 2263 (c++-operators
2149 (mapconcat 'identity 2264 (mapconcat 'identity
2150 (mapcar 'regexp-quote 2265 (mapcar 'regexp-quote
@@ -2156,34 +2271,28 @@ See also `c++-font-lock-extra-types'.")
2156 #'(lambda (a b) (> (length a) (length b))))) 2271 #'(lambda (a b) (> (length a) (length b)))))
2157 "\\|")) 2272 "\\|"))
2158 (c++-type-types 2273 (c++-type-types
2159; ("auto" "extern" "register" "static" "typedef" "struct" "union" "enum"
2160; "signed" "unsigned" "short" "long" "int" "char" "float" "double"
2161; "void" "volatile" "const" "inline" "friend" "bool"
2162; "virtual" "complex" "template"
2163; ;; Eric Hopper <hopper@omnifarious.mn.org> says these are new.
2164; "namespace" "using")
2165 `(mapconcat 'identity 2274 `(mapconcat 'identity
2166 (cons 2275 (cons
2167 (,@ (concat "auto\\|bool\\|c\\(har\\|o\\(mplex\\|nst\\)\\)\\|" 2276 (,@ (eval-when-compile
2168 "double\\|e\\(num\\|xtern\\)\\|f\\(loat\\|riend\\)\\|" 2277 (regexp-opt
2169 "in\\(line\\|t\\)\\|long\\|namespace\\|register\\|" 2278 '("auto" "extern" "register" "static" "typedef" "struct"
2170 "s\\(hort\\|igned\\|t\\(atic\\|ruct\\)\\)\\|" 2279 "union" "enum" "signed" "unsigned" "short" "long"
2171 "t\\(emplate\\|ypedef\\)\\|" 2280 "int" "char" "float" "double" "void" "volatile" "const"
2172 "u\\(n\\(ion\\|signed\\)\\|sing\\)\\|" 2281 "inline" "friend" "bool" "virtual" "complex" "template"
2173 "v\\(irtual\\|o\\(id\\|latile\\)\\)")) ; 12 ()s deep. 2282 "namespace" "using"))))
2174 c++-font-lock-extra-types) 2283 c++-font-lock-extra-types)
2175 "\\|")) 2284 "\\|"))
2176 ;; 2285 ;;
2177 ;; A brave attempt to match templates following a type and/or match 2286 ;; A brave attempt to match templates following a type and/or match
2178 ;; class membership. See and sync the above function 2287 ;; class membership. See and sync the above function
2179 ;; `font-lock-match-c++-style-declaration-item-and-skip-to-next'. 2288 ;; `font-lock-match-c++-style-declaration-item-and-skip-to-next'.
2180 (c++-type-suffix (concat "\\(<\\(\\sw+\\)[ \t*&]*>\\)?" 2289 (c++-type-suffix (concat "\\([ \t]*<\\([^>\n]+\\)[ \t*&]*>\\)?"
2181 "\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?")) 2290 "\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?"))
2182 ;; If the string is a type, it may be followed by the cruft above. 2291 ;; If the string is a type, it may be followed by the cruft above.
2183 (c++-type-spec (concat "\\(\\sw+\\)\\>" c++-type-suffix)) 2292 (c++-type-spec (concat "\\(\\sw+\\)\\>" c++-type-suffix))
2184 ;; 2293 ;;
2185 ;; Parenthesis depth of user-defined types not forgetting their cruft. 2294 ;; Parenthesis depth of user-defined types not forgetting their cruft.
2186 (c++-type-depth `(font-lock-keyword-depth 2295 (c++-type-depth `(regexp-opt-depth
2187 (concat (,@ c++-type-types) (,@ c++-type-suffix)))) 2296 (concat (,@ c++-type-types) (,@ c++-type-suffix))))
2188 ) 2297 )
2189 (setq c++-font-lock-keywords-1 2298 (setq c++-font-lock-keywords-1
@@ -2234,7 +2343,7 @@ See also `c++-font-lock-extra-types'.")
2234 (1 font-lock-reference-face))) 2343 (1 font-lock-reference-face)))
2235 ;; 2344 ;;
2236 ;; Fontify other builtin keywords. 2345 ;; Fontify other builtin keywords.
2237 (cons (concat "\\<\\(" c++-keywords "\\)\\>") 'font-lock-keyword-face) 2346 (concat "\\<" c++-keywords "\\>")
2238 ;; 2347 ;;
2239 ;; Eric Hopper <hopper@omnifarious.mn.org> says `true' and `false' are new. 2348 ;; Eric Hopper <hopper@omnifarious.mn.org> says `true' and `false' are new.
2240 '("\\<\\(false\\|true\\)\\>" . font-lock-reference-face) 2349 '("\\<\\(false\\|true\\)\\>" . font-lock-reference-face)
@@ -2312,26 +2421,21 @@ See also `objc-font-lock-extra-types'.")
2312;; Regexps written with help from Stephen Peters <speters@us.oracle.com> and 2421;; Regexps written with help from Stephen Peters <speters@us.oracle.com> and
2313;; Jacques Duthen Prestataire <duthen@cegelec-red.fr>. 2422;; Jacques Duthen Prestataire <duthen@cegelec-red.fr>.
2314(let* ((objc-keywords 2423(let* ((objc-keywords
2315; '("break" "continue" "do" "else" "for" "if" "return" "switch" "while" 2424 (eval-when-compile
2316; "sizeof" "self" "super") 2425 (regexp-opt '("break" "continue" "do" "else" "for" "if" "return"
2317 (concat "break\\|continue\\|do\\|else\\|for\\|if\\|return\\|" 2426 "switch" "while" "sizeof" "self" "super") t)))
2318 "s\\(elf\\|izeof\\|uper\\|witch\\)\\|while"))
2319 (objc-type-types 2427 (objc-type-types
2320 `(mapconcat 'identity 2428 `(mapconcat 'identity
2321 (cons 2429 (cons
2322; '("auto" "extern" "register" "static" "typedef" "struct" "union" 2430 (,@ (eval-when-compile
2323; "enum" "signed" "unsigned" "short" "long" "int" "char" 2431 (regexp-opt
2324; "float" "double" "void" "volatile" "const" 2432 '("auto" "extern" "register" "static" "typedef" "struct"
2325; "id" "oneway" "in" "out" "inout" "bycopy" "byref") 2433 "union" "enum" "signed" "unsigned" "short" "long"
2326 (,@ (concat "auto\\|by\\(copy\\|ref\\)\\|c\\(har\\|onst\\)\\|" 2434 "int" "char" "float" "double" "void" "volatile" "const"
2327 "double\\|e\\(num\\|xtern\\)\\|float\\|" 2435 "id" "oneway" "in" "out" "inout" "bycopy" "byref"))))
2328 "i\\([dn]\\|n\\(out\\|t\\)\\)\\|long\\|"
2329 "o\\(neway\\|ut\\)\\|register\\|s\\(hort\\|igned\\|"
2330 "t\\(atic\\|ruct\\)\\)\\|typedef\\|"
2331 "un\\(ion\\|signed\\)\\|vo\\(id\\|latile\\)"))
2332 objc-font-lock-extra-types) 2436 objc-font-lock-extra-types)
2333 "\\|")) 2437 "\\|"))
2334 (objc-type-depth `(font-lock-keyword-depth (,@ objc-type-types))) 2438 (objc-type-depth `(regexp-opt-depth (,@ objc-type-types)))
2335 ) 2439 )
2336 (setq objc-font-lock-keywords-1 2440 (setq objc-font-lock-keywords-1
2337 (append 2441 (append
@@ -2377,7 +2481,7 @@ See also `objc-font-lock-extra-types'.")
2377 'font-lock-type-face)) 2481 'font-lock-type-face))
2378 ;; 2482 ;;
2379 ;; Fontify all builtin keywords (except case, default and goto; see below). 2483 ;; Fontify all builtin keywords (except case, default and goto; see below).
2380 (concat "\\<\\(" objc-keywords "\\)\\>") 2484 (concat "\\<" objc-keywords "\\>")
2381 ;; 2485 ;;
2382 ;; Fontify case/goto keywords and targets, and case default/goto tags. 2486 ;; Fontify case/goto keywords and targets, and case default/goto tags.
2383 '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?" 2487 '("\\<\\(case\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"
@@ -2454,40 +2558,35 @@ See also `java-font-lock-extra-types'.")
2454;; Regexps written with help from Fred White <fwhite@bbn.com> and 2558;; Regexps written with help from Fred White <fwhite@bbn.com> and
2455;; Anders Lindgren <andersl@csd.uu.se>. 2559;; Anders Lindgren <andersl@csd.uu.se>.
2456(let* ((java-keywords 2560(let* ((java-keywords
2457 (concat "\\<\\(" 2561 (eval-when-compile
2458; '("catch" "do" "else" "super" "this" "finally" "for" "if" 2562 (regexp-opt
2459;; ;; Anders Lindgren <andersl@csd.uu.se> says these have gone. 2563 '("catch" "do" "else" "super" "this" "finally" "for" "if"
2460;; "cast" "byvalue" "future" "generic" "operator" "var" 2564 ;; Anders Lindgren <andersl@csd.uu.se> says these have gone.
2461;; "inner" "outer" "rest" 2565 ;; "cast" "byvalue" "future" "generic" "operator" "var"
2462; "interface" "return" "switch" "throw" "try" "while") 2566 ;; "inner" "outer" "rest"
2463 "catch\\|do\\|else\\|f\\(inally\\|or\\)\\|" 2567 "interface" "return" "switch" "throw" "try" "while") t)))
2464 "i\\(f\\|nterface\\)\\|return\\|s\\(uper\\|witch\\)\\|"
2465 "t\\(h\\(is\\|row\\)\\|ry\\)\\|while"
2466 "\\)\\>"))
2467 ;; 2568 ;;
2468 ;; These are immediately followed by an object name. 2569 ;; These are immediately followed by an object name.
2469 (java-minor-types 2570 (java-minor-types
2470 (mapconcat 'identity 2571 (eval-when-compile
2471 '("boolean" "char" "byte" "short" "int" "long" 2572 (regexp-opt '("boolean" "char" "byte" "short" "int" "long"
2472 "float" "double" "void") 2573 "float" "double" "void"))))
2473 "\\|"))
2474 ;; 2574 ;;
2475 ;; These are eventually followed by an object name. 2575 ;; These are eventually followed by an object name.
2476 (java-major-types 2576 (java-major-types
2477; '("abstract" "const" "final" "synchronized" "transient" "static" 2577 (eval-when-compile
2478;; ;; Anders Lindgren <andersl@csd.uu.se> says this has gone. 2578 (regexp-opt
2479;; "threadsafe" 2579 '("abstract" "const" "final" "synchronized" "transient" "static"
2480; "volatile" "public" "private" "protected" "native") 2580 ;; Anders Lindgren <andersl@csd.uu.se> says this has gone.
2481 (concat "abstract\\|const\\|final\\|native\\|" 2581 ;; "threadsafe"
2482 "p\\(r\\(ivate\\|otected\\)\\|ublic\\)\\|" 2582 "volatile" "public" "private" "protected" "native"))))
2483 "s\\(tatic\\|ynchronized\\)\\|transient\\|volatile"))
2484 ;; 2583 ;;
2485 ;; Random types immediately followed by an object name. 2584 ;; Random types immediately followed by an object name.
2486 (java-other-types 2585 (java-other-types
2487 '(mapconcat 'identity (cons "\\sw+\\.\\sw+" java-font-lock-extra-types) 2586 '(mapconcat 'identity (cons "\\sw+\\.\\sw+" java-font-lock-extra-types)
2488 "\\|")) 2587 "\\|"))
2489 (java-other-depth `(font-lock-keyword-depth (,@ java-other-types))) 2588 (java-other-depth `(regexp-opt-depth (,@ java-other-types)))
2490 ) 2589 )
2491 (setq java-font-lock-keywords-1 2590 (setq java-font-lock-keywords-1
2492 (list 2591 (list
2493 ;; 2592 ;;
@@ -2509,7 +2608,7 @@ See also `java-font-lock-extra-types'.")
2509 'font-lock-type-face) 2608 'font-lock-type-face)
2510 ;; 2609 ;;
2511 ;; Fontify all builtin keywords (except below). 2610 ;; Fontify all builtin keywords (except below).
2512 (concat "\\<\\(" java-keywords "\\)\\>") 2611 (concat "\\<" java-keywords "\\>")
2513 ;; 2612 ;;
2514 ;; Fontify keywords and targets, and case default/goto tags. 2613 ;; Fontify keywords and targets, and case default/goto tags.
2515 (list "\\<\\(break\\|case\\|continue\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?" 2614 (list "\\<\\(break\\|case\\|continue\\|goto\\)\\>[ \t]*\\(-?\\sw+\\)?"