diff options
| author | Simon Marshall | 1997-05-29 07:18:05 +0000 |
|---|---|---|
| committer | Simon Marshall | 1997-05-29 07:18:05 +0000 |
| commit | ac6e572cb99aff9ff489dd1b851e46c64f1bf6c1 (patch) | |
| tree | 46faeda0e923dcc88a3579f71b1df1d6e3b1606f | |
| parent | 38c979d349eb874f66f42f644b736efe541bbc05 (diff) | |
| download | emacs-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.el | 559 |
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. |
| 275 | Each element should be of the form: | 298 | Each 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 | ||
| 298 | Where MATCHER can be either the regexp to search for, or the function name to | 321 | Where MATCHER can be either the regexp to search for, or the function name to |
| 299 | call to make the search (called with one argument, the limit of the search). | 322 | call to make the search (called with one argument, the limit of the search). |
| 300 | MATCH is the subexpression of MATCHER to be highlighted. MATCH can be | 323 | MATCHER regexps can be generated via the function `regexp-opt'. MATCH is the |
| 301 | calculated via the function `font-lock-keyword-depth'. FACENAME is an | 324 | subexpression of MATCHER to be highlighted. MATCH can be calculated via the |
| 302 | expression whose value is the face name to use. FACENAME's default attributes | 325 | function `regexp-opt-depth'. FACENAME is an expression whose value is the face |
| 303 | can be modified via \\[customize]. | 326 | name to use. Face default attributes can be modified via \\[customize]. |
| 304 | 327 | ||
| 305 | OVERRIDE and LAXMATCH are flags. If OVERRIDE is t, existing fontification can | 328 | OVERRIDE and LAXMATCH are flags. If OVERRIDE is t, existing fontification can |
| 306 | be overwritten. If `keep', only parts not already fontified are highlighted. | 329 | be 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. |
| 498 | This is normally set via `font-lock-defaults'.") | 521 | This 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. | ||
| 525 | Can be the list or the name of a function or variable whose value is the list. | ||
| 526 | See `font-lock-keywords' for a description of the form of this list; | ||
| 527 | the differences are listed below. MATCH-HIGHLIGHT should be of the form: | ||
| 528 | |||
| 529 | (MATCH SYNTAX OVERRIDE LAXMATCH) | ||
| 530 | |||
| 531 | where SYNTAX can be of the form (SYNTAX-CODE . MATCHING-CHAR), the name of a | ||
| 532 | syntax table, or an expression whose value is such a form or a syntax table. | ||
| 533 | OVERRIDE cannot be `prepend' or `append'. | ||
| 534 | |||
| 535 | This 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. |
| 502 | If this is nil, the major mode's syntax table is used. | 539 | If 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. | ||
| 1076 | START 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. | ||
| 1198 | HIGHLIGHT should be of the form MATCH-HIGHLIGHT, | ||
| 1199 | see `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. | ||
| 1223 | KEYWORDS should be of the form MATCH-ANCHORED, see `font-lock-keywords', | ||
| 1224 | LIMIT 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. | ||
| 1247 | START 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. | ||
| 1292 | START 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. |
| 1261 | START should be at the beginning of a line." | 1396 | START 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 | |||
| 1682 | Matches after point, but ignores leading whitespace and `*' characters. | 1821 | Matches after point, but ignores leading whitespace and `*' characters. |
| 1683 | Does not move further than LIMIT. | 1822 | Does not move further than LIMIT. |
| 1684 | 1823 | ||
| 1685 | The expected syntax of a declaration/definition item is `word', possibly ending | 1824 | The expected syntax of a declaration/definition item is `word' (preceded by |
| 1686 | with optional whitespace and a `('. Everything following the item (but | 1825 | optional whitespace and `*' characters and proceeded by optional whitespace) |
| 1687 | belonging to it) is expected to by skip-able by `scan-sexps', and items are | 1826 | optionally followed by a `('. Everything following the item (but belonging to |
| 1688 | expected to be separated with a `,' and to be terminated with a `;'. | 1827 | it) is expected to by skip-able by `scan-sexps', and items are expected to be |
| 1828 | separated with a `,' and to be terminated with a `;'. | ||
| 1689 | 1829 | ||
| 1690 | Thus the regexp matches after point: word ( | 1830 | Thus 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. | ||
| 1713 | This 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'.") | |||
| 1976 | See also `c-font-lock-extra-types'.") | 2094 | See 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+\\)?" |