1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-26 07:33:47 +00:00

Customise. And a few code cleanups.

This commit is contained in:
Simon Marshall 1997-04-17 07:29:13 +00:00
parent e7b153ff23
commit 55015061f5

View File

@ -183,14 +183,28 @@
;;; Code:
(defgroup font-lock nil
"Font Lock mode text highlighting package."
:link '(custom-manual "(emacs)Font Lock")
:group 'faces)
(defgroup font-lock-faces nil
"Font Lock mode faces."
:prefix "font-lock-"
:link '(custom-manual "(emacs)Font Lock")
:group 'font-lock)
;; User variables.
(defvar font-lock-verbose (* 0 1024)
(defcustom font-lock-verbose (* 0 1024)
"*If non-nil, means show status messages for buffer fontification.
If a number, only buffers greater than this size have fontification messages.")
If a number, only buffers greater than this size have fontification messages."
:type '(radio (const :tag "Never" nil)
(const :tag "Always" t)
(integer :tag "Size"))
:group 'font-lock)
;;;###autoload
(defvar font-lock-maximum-decoration t
(defcustom font-lock-maximum-decoration t
"*Maximum decoration level for fontification.
If nil, use the default decoration (typically the minimum available).
If t, use the maximum decoration available.
@ -199,10 +213,16 @@ If a list, each element should be a cons pair of the form (MAJOR-MODE . LEVEL),
where MAJOR-MODE is a symbol or t (meaning the default). For example:
((c-mode . t) (c++-mode . 2) (t . 1))
means use the maximum decoration available for buffers in C mode, level 2
decoration for buffers in C++ mode, and level 1 decoration otherwise.")
decoration for buffers in C++ mode, and level 1 decoration otherwise."
:type '(radio (const :tag "Default" nil)
(const :tag "Maximum" t)
(integer :tag "Level")
(repeat (cons (symbol :tag "Major Mode")
(radio (const :tag "Maximum" t)
(integer :tag "Level")))))
:group 'font-lock)
;;;###autoload
(defvar font-lock-maximum-size (* 250 1024)
(defcustom font-lock-maximum-size (* 250 1024)
"*Maximum size of a buffer for buffer fontification.
Only buffers less than this can be fontified when Font Lock mode is turned on.
If nil, means size is irrelevant.
@ -210,43 +230,15 @@ If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
where MAJOR-MODE is a symbol or t (meaning the default). For example:
((c-mode . 256000) (c++-mode . 256000) (rmail-mode . 1048576))
means that the maximum size is 250K for buffers in C or C++ modes, one megabyte
for buffers in Rmail mode, and size is irrelevant otherwise.")
for buffers in Rmail mode, and size is irrelevant otherwise."
:type '(radio (const :tag "None" nil)
(integer :tag "Size")
(repeat (cons (symbol :tag "Major Mode")
(integer :tag "Size"))))
:group 'font-lock)
;; Fontification variables:
;; Originally these variable values were face names such as `bold' etc.
;; Now we create our own faces, but we keep these variables for compatibility
;; and they give users another mechanism for changing face appearance.
;; We now allow a FACENAME in `font-lock-keywords' to be any expression that
;; returns a face. So the easiest thing is to continue using these variables,
;; rather than sometimes evaling FACENAME and sometimes not. sm.
(defvar font-lock-comment-face 'font-lock-comment-face
"Face to use for comments.")
(defvar font-lock-string-face 'font-lock-string-face
"Face to use for strings.")
(defvar font-lock-keyword-face 'font-lock-keyword-face
"Face to use for keywords.")
(defvar font-lock-builtin-face 'font-lock-builtin-face
"Face to use for builtins.")
(defvar font-lock-function-name-face 'font-lock-function-name-face
"Face to use for function names.")
(defvar font-lock-variable-name-face 'font-lock-variable-name-face
"Face to use for variable names.")
(defvar font-lock-type-face 'font-lock-type-face
"Face to use for type names.")
(defvar font-lock-reference-face 'font-lock-reference-face
"Face to use for reference names.")
(defvar font-lock-warning-face 'font-lock-warning-face
"Face to use for things that should stand out.")
(defvar font-lock-keywords nil
"*A list of the keywords to highlight.
Each element should be of the form:
@ -380,8 +372,7 @@ around a text block relevant to that mode).
Other variables include those for buffer-specialised fontification functions,
`font-lock-fontify-buffer-function', `font-lock-unfontify-buffer-function',
`font-lock-fontify-region-function', `font-lock-unfontify-region-function',
`font-lock-comment-start-regexp', `font-lock-inhibit-thing-lock' and
`font-lock-maximum-size'.")
`font-lock-inhibit-thing-lock' and `font-lock-maximum-size'.")
;; This variable is used where font-lock.el itself supplies the keywords.
(defvar font-lock-defaults-alist
@ -392,36 +383,42 @@ Other variables include those for buffer-specialised fontification functions,
'((c-font-lock-keywords c-font-lock-keywords-1
c-font-lock-keywords-2 c-font-lock-keywords-3)
nil nil ((?_ . "w")) beginning-of-defun
(font-lock-comment-start-regexp . "/[*/]")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . "/[*/]")
(font-lock-mark-block-function . mark-defun)))
(c++-mode-defaults
'((c++-font-lock-keywords c++-font-lock-keywords-1
c++-font-lock-keywords-2 c++-font-lock-keywords-3)
nil nil ((?_ . "w") (?~ . "w")) beginning-of-defun
(font-lock-comment-start-regexp . "/[*/]")
nil nil ((?_ . "w")) beginning-of-defun
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . "/[*/]")
(font-lock-mark-block-function . mark-defun)))
(objc-mode-defaults
'((objc-font-lock-keywords objc-font-lock-keywords-1
objc-font-lock-keywords-2 objc-font-lock-keywords-3)
nil nil ((?_ . "w") (?$ . "w")) nil
(font-lock-comment-start-regexp . "/[*/]")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . "/[*/]")
(font-lock-mark-block-function . mark-defun)))
(java-mode-defaults
'((java-font-lock-keywords java-font-lock-keywords-1
java-font-lock-keywords-2 java-font-lock-keywords-3)
nil nil ((?_ . "w") (?$ . "w") (?. . "w")) nil
(font-lock-comment-start-regexp . "/[*/]")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . "/[*/]")
(font-lock-mark-block-function . mark-defun)))
(lisp-mode-defaults
'((lisp-font-lock-keywords
lisp-font-lock-keywords-1 lisp-font-lock-keywords-2)
nil nil (("+-*/.<>=!?$%_&~^:" . "w")) beginning-of-defun
(font-lock-comment-start-regexp . ";")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . ";")
(font-lock-mark-block-function . mark-defun)))
(scheme-mode-defaults
'(scheme-font-lock-keywords
nil t (("+-*/.<>=!?$%_&~^:" . "w")) beginning-of-defun
(font-lock-comment-start-regexp . ";")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . ";")
(font-lock-mark-block-function . mark-defun)))
;; For TeX modes we could use `backward-paragraph' for the same reason.
;; But we don't, because paragraph breaks are arguably likely enough to
@ -430,7 +427,8 @@ Other variables include those for buffer-specialised fontification functions,
;; in a mis-fontification even if it might not fontify enough. --sm.
(tex-mode-defaults
'(tex-font-lock-keywords nil nil ((?$ . "\"")) nil
(font-lock-comment-start-regexp . "%")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(font-lock-comment-start-regexp . "%")
(font-lock-mark-block-function . mark-paragraph)))
)
(list
@ -488,12 +486,13 @@ When called with no args it should leave point at the beginning of any
enclosing textual block and mark at the end.
This is normally set via `font-lock-defaults'.")
(defvar font-lock-comment-start-regexp nil
"*Regexp to match the start of a comment.
This need not discriminate between genuine comments and quoted comment
characters or comment characters within strings.
If nil, `comment-start-skip' is used instead; see that variable for more info.
This is normally set via `font-lock-defaults'.")
;; Obsoleted by Emacs 19.35 parse-partial-sexp's COMMENTSTOP.
;(defvar font-lock-comment-start-regexp nil
; "*Regexp to match the start of a comment.
;This need not discriminate between genuine comments and quoted comment
;characters or comment characters within strings.
;If nil, `comment-start-skip' is used instead; see that variable for more info.
;This is normally set via `font-lock-defaults'.")
(defvar font-lock-fontify-buffer-function 'font-lock-default-fontify-buffer
"Function to use for fontifying the buffer.
@ -539,8 +538,8 @@ This is normally set via `font-lock-defaults'.")
(defmacro save-buffer-state (varlist &rest body)
"Bind variables according to VARLIST and eval BODY restoring buffer state."
(` (let* ((,@ (append varlist
'((modified (buffer-modified-p))
(inhibit-read-only t) (buffer-undo-list t)
'((modified (buffer-modified-p)) (buffer-undo-list t)
(inhibit-read-only t) (inhibit-point-motion-hooks t)
before-change-functions after-change-functions
deactivate-mark buffer-file-name buffer-file-truename))))
(,@ body)
@ -736,8 +735,7 @@ see the variables `c-font-lock-extra-types', `c++-font-lock-extra-types',
(defvar font-lock-buffers nil) ; For remembering buffers.
(defvar global-font-lock-mode nil)
;;;###autoload
(defvar font-lock-global-modes t
(defcustom font-lock-global-modes t
"*Modes for which Font Lock mode is automagically turned on.
Global Font Lock mode is controlled by the `global-font-lock-mode' command.
If nil, means no modes have Font Lock mode automatically turned on.
@ -746,7 +744,11 @@ If a list, it should be a list of `major-mode' symbol names for which Font Lock
mode should be automatically turned on. The sense of the list is negated if it
begins with `not'. For example:
(c-mode c++-mode)
means that Font Lock mode is turned on for buffers in C and C++ modes only.")
means that Font Lock mode is turned on for buffers in C and C++ modes only."
:type '(radio (const :tag "None" nil)
(const :tag "All" t)
(repeat (symbol :tag "Major Mode")))
:group 'font-lock)
;;;###autoload
(defun global-font-lock-mode (&optional arg message)
@ -813,8 +815,7 @@ turned on in a buffer if its major mode is one of `font-lock-global-modes'."
;; `font-lock-after-fontify-buffer' and/or `font-lock-after-unfontify-buffer'
;; themselves.
;;;###autoload
(defvar font-lock-support-mode nil
(defcustom font-lock-support-mode nil
"*Support mode for Font Lock mode.
Support modes speed up Font Lock mode by being choosy about when fontification
occurs. Known support modes are Fast Lock mode (symbol `fast-lock-mode') and
@ -827,7 +828,14 @@ where MAJOR-MODE is a symbol or t (meaning the default). For example:
means that Fast Lock mode is used to support Font Lock mode for buffers in C or
C++ modes, and Lazy Lock mode is used to support Font Lock mode otherwise.
The value of this variable is used when Font Lock mode is turned on.")
The value of this variable is used when Font Lock mode is turned on."
:type '(radio (const :tag "None" nil)
(const :tag "Fast Lock" fast-lock-mode)
(const :tag "Lazy Lock" lazy-lock-mode)
(repeat (cons (symbol :tag "Major Mode")
(radio (const :tag "Fast Lock" fast-lock-mode)
(const :tag "Lazy Lock" lazy-lock-mode)))))
:group 'font-lock)
(defvar fast-lock-mode nil)
(defvar lazy-lock-mode nil)
@ -889,14 +897,14 @@ The value of this variable is used when Font Lock mode is turned on.")
;; A further reason to use the fontification indirection feature is when the
;; default syntactual fontification, or the default fontification in general,
;; is not flexible enough for a particular major mode. For example, perhaps
;; comments are just too hairy for `font-lock-fontify-syntactically-region' and
;; `font-lock-comment-start-regexp' to cope with. You need to write your own
;; version of that function, e.g., `hairy-fontify-syntactically-region', and
;; make your own version of `hairy-fontify-region' call it before calling
;; comments are just too hairy for `font-lock-fontify-syntactically-region' to
;; cope with. You need to write your own version of that function, e.g.,
;; `hairy-fontify-syntactically-region', and make your own version of
;; `hairy-fontify-region' call that function before calling
;; `font-lock-fontify-keywords-region' for the normal regexp fontification
;; pass. And Hairy mode would set `font-lock-defaults' so that font-lock.el
;; would call your region fontification function instead of its own. For
;; example, TeX modes could fontify {\foo ...} and \bar{...} etc. multi-line
;; example, TeX modes could fontify {\foo ...} and \bar{...} etc. multi-line
;; directives correctly and cleanly. (It is the same problem as fontifying
;; multi-line strings and comments; regexps are not appropriate for the job.)
@ -1027,8 +1035,8 @@ delimit the region to fontify."
(defun font-lock-fontify-syntactically-region (start end &optional loudly)
"Put proper face on each string and comment between START and END.
START should be at the beginning of a line."
(let (state prev here comment
(cache (marker-position font-lock-cache-position)))
(let ((cache (marker-position font-lock-cache-position))
state string beg)
(if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
(goto-char start)
;;
@ -1051,34 +1059,27 @@ START should be at the beginning of a line."
(setq font-lock-cache-state state)
(set-marker font-lock-cache-position start))
;;
;; If the region starts inside a string, show the extent of it.
(when (or (nth 4 state) (nth 3 state))
(setq comment (nth 4 state) here (point))
(setq state (parse-partial-sexp (point) end
nil nil state 'syntax-table))
(put-text-property here (point) 'face
(if comment
font-lock-comment-face
font-lock-string-face)))
;; If the region starts inside a string or comment, show the extent of it.
(when (or (nth 3 state) (nth 4 state))
(setq string (nth 3 state) beg (point))
(setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
(put-text-property beg (point) 'face
(if string
font-lock-string-face
font-lock-comment-face)))
;;
;; Find each interesting place between here and `end'.
(while (and (< (point) end)
(progn
(setq prev (point)
state (parse-partial-sexp (point) end
nil nil state 'syntax-table))
(setq state (parse-partial-sexp (point) end nil nil state
'syntax-table))
(or (nth 3 state) (nth 4 state))))
(setq here (nth 8 state) comment (nth 4 state))
(setq state (parse-partial-sexp (point) end
nil nil state 'syntax-table))
(put-text-property here (point) 'face
(if comment
font-lock-comment-face
font-lock-string-face))
;;
;; Make sure `prev' is non-nil after the loop
;; only if it was set on the very last iteration.
(setq prev nil))))
(setq string (nth 3 state) beg (nth 8 state))
(setq state (parse-partial-sexp (point) end nil nil state 'syntax-table))
(put-text-property beg (point) 'face
(if string
font-lock-string-face
font-lock-comment-face)))))
;;; End of Syntactic fontification functions.
@ -1219,10 +1220,10 @@ LIMIT can be modified by the value of its PRE-MATCH-FORM."
(defun font-lock-fontify-keywords-region (start end &optional loudly)
"Fontify according to `font-lock-keywords' between START and END.
START should be at the beginning of a line."
(unless (eq (car-safe font-lock-keywords) t)
(setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)))
(let ((case-fold-search font-lock-keywords-case-fold-search)
(keywords (cdr (if (eq (car-safe font-lock-keywords) t)
font-lock-keywords
(font-lock-compile-keywords))))
(keywords (cdr font-lock-keywords))
(bufname (buffer-name)) (count 0)
keyword matcher highlights)
;;
@ -1251,14 +1252,12 @@ START should be at the beginning of a line."
;; Various functions.
(defun font-lock-compile-keywords (&optional keywords)
;; Compile `font-lock-keywords' into the form (t KEYWORD ...) where KEYWORD
;; is the (MATCHER HIGHLIGHT ...) shown in the variable's doc string.
(let ((keywords (or keywords font-lock-keywords)))
(setq font-lock-keywords
(if (eq (car-safe keywords) t)
keywords
(cons t (mapcar 'font-lock-compile-keyword keywords))))))
(defun font-lock-compile-keywords (keywords)
;; Compile KEYWORDS into the form (t KEYWORD ...) where KEYWORD is of the
;; form (MATCHER HIGHLIGHT ...) as shown in `font-lock-keywords' doc string.
(if (eq (car-safe keywords) t)
keywords
(cons t (mapcar 'font-lock-compile-keyword keywords))))
(defun font-lock-compile-keyword (keyword)
(cond ((nlistp keyword) ; MATCHER
@ -1304,8 +1303,6 @@ START should be at the beginning of a line."
"Set fontification defaults appropriately for this mode.
Sets various variables using `font-lock-defaults' (or, if nil, using
`font-lock-defaults-alist') and `font-lock-maximum-decoration'."
;; Set face defaults.
(font-lock-make-faces)
;; Set fontification defaults.
(make-local-variable 'font-lock-fontified)
;; Set iff not previously set.
@ -1355,8 +1352,11 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
;; Variable alist?
(let ((alist (nthcdr 5 defaults)))
(while alist
(set (make-local-variable (car (car alist))) (cdr (car alist)))
(setq alist (cdr alist)))))))
(let ((variable (car (car alist))) (value (cdr (car alist))))
(unless (boundp variable)
(setq variable nil))
(set (make-local-variable variable) value)
(setq alist (cdr alist))))))))
(defun font-lock-unset-defaults ()
"Unset fontification defaults. See `font-lock-set-defaults'."
@ -1375,213 +1375,125 @@ Sets various variables using `font-lock-defaults' (or, if nil, using
;;; Colour etc. support.
;; This section of code is crying out for revision. Come on down, custom.el?
;; Originally these variable values were face names such as `bold' etc.
;; Now we create our own faces, but we keep these variables for compatibility
;; and they give users another mechanism for changing face appearance.
;; We now allow a FACENAME in `font-lock-keywords' to be any expression that
;; returns a face. So the easiest thing is to continue using these variables,
;; rather than sometimes evaling FACENAME and sometimes not. sm.
(defvar font-lock-comment-face 'font-lock-comment-face
"Face name to use for comments.")
;; To begin with, `display-type' and `background-mode' are `frame-parameters'
;; so we don't have to calculate them here anymore. But all the face stuff
;; should be frame-local (and thus display-local) anyway. Because we're not
;; sure what support Emacs is going to have for general frame-local face
;; attributes, we leave this section of code as it is. For now. sm.
(defvar font-lock-string-face 'font-lock-string-face
"Face name to use for strings.")
(defvar font-lock-display-type nil
"A symbol indicating the display Emacs is running under.
The symbol should be one of `color', `grayscale' or `mono'.
If Emacs guesses this display attribute wrongly, either set this variable in
your `~/.emacs' or set the resource `Emacs.displayType' in your `~/.Xdefaults'.
See also `font-lock-background-mode' and `font-lock-face-attributes'.")
(defvar font-lock-keyword-face 'font-lock-keyword-face
"Face name to use for keywords.")
(defvar font-lock-background-mode nil
"A symbol indicating the Emacs background brightness.
The symbol should be one of `light' or `dark'.
If Emacs guesses this frame attribute wrongly, either set this variable in
your `~/.emacs' or set the resource `Emacs.backgroundMode' in your
`~/.Xdefaults'.
See also `font-lock-display-type' and `font-lock-face-attributes'.")
(defvar font-lock-builtin-face 'font-lock-builtin-face
"Face name to use for builtins.")
(defvar font-lock-face-attributes nil
"A list of default attributes to use for face attributes.
Each element of the list should be of the form
(defvar font-lock-function-name-face 'font-lock-function-name-face
"Face name to use for function names.")
(FACE FOREGROUND BACKGROUND BOLD-P ITALIC-P UNDERLINE-P)
(defvar font-lock-variable-name-face 'font-lock-variable-name-face
"Face name to use for variable names.")
where FACE could be one of the face symbols `font-lock-comment-face',
`font-lock-string-face', `font-lock-keyword-face', `font-lock-builtin-face',
`font-lock-type-face', `font-lock-function-name-face',
`font-lock-variable-name-face', `font-lock-reference-face' and
`font-lock-warning-face', or any other face symbols and attributes may be
specified here and used in `font-lock-keywords'.
(defvar font-lock-type-face 'font-lock-type-face
"Face name to use for type names.")
Subsequent element items should be the attributes for the corresponding
Font Lock mode faces. Attributes FOREGROUND and BACKGROUND should be strings
\(default if nil), while BOLD-P, ITALIC-P, and UNDERLINE-P should specify the
corresponding face attributes (yes if non-nil). For example:
(defvar font-lock-reference-face 'font-lock-reference-face
"Face name to use for reference names.")
(setq font-lock-face-attributes '((font-lock-warning-face \"HotPink\" nil t t)
(font-lock-comment-face \"Red\")))
(defvar font-lock-warning-face 'font-lock-warning-face
"Face name to use for things that should stand out.")
in your ~/.emacs makes a garish bold-italic warning face and red comment face.
(defface font-lock-comment-face
'((((class grayscale) (background light))
(:foreground "DimGray" :bold t :italic t))
(((class grayscale) (background dark))
(:foreground "LightGray" :bold t :italic t))
(((class color) (background light)) (:foreground "Firebrick"))
(((class color) (background dark)) (:foreground "OrangeRed"))
(t (:bold t :italic t)))
"Font Lock mode face used to highlight comments."
:group 'font-lock-faces)
Emacs uses default attributes based on display type and background brightness.
See variables `font-lock-display-type' and `font-lock-background-mode'.
(defface font-lock-string-face
'((((class grayscale) (background light)) (:foreground "DimGray" :italic t))
(((class grayscale) (background dark)) (:foreground "LightGray" :italic t))
(((class color) (background light)) (:foreground "RosyBrown"))
(((class color) (background dark)) (:foreground "LightSalmon"))
(t (:italic t)))
"Font Lock mode face used to highlight strings."
:group 'font-lock-faces)
Resources can be used to over-ride these face attributes. For example, the
resource `Emacs.font-lock-comment-face.attributeUnderline' can be used to
specify the UNDERLINE-P attribute for face `font-lock-comment-face'.")
(defface font-lock-keyword-face
'((((class grayscale) (background light)) (:foreground "LightGray" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "Purple"))
(((class color) (background dark)) (:foreground "Cyan"))
(t (:bold t)))
"Font Lock mode face used to highlight keywords."
:group 'font-lock-faces)
(defun font-lock-make-faces (&optional override)
"Make faces from `font-lock-face-attributes'.
A default list is used if this is nil.
If optional OVERRIDE is non-nil, faces that already exist are reset.
See `font-lock-make-face' and `list-faces-display'."
;; We don't need to `setq' any of these variables, but the user can see what
;; is being used if we do.
(unless font-lock-display-type
(setq font-lock-display-type
(let ((display-resource (x-get-resource ".displayType" "DisplayType")))
(cond (display-resource (intern (downcase display-resource)))
((x-display-color-p) 'color)
((x-display-grayscale-p) 'grayscale)
(t 'mono)))))
(unless font-lock-background-mode
(setq font-lock-background-mode
(let ((bg-resource (x-get-resource ".backgroundMode" "BackgroundMode"))
(params (frame-parameters)))
(cond (bg-resource (intern (downcase bg-resource)))
((eq system-type 'ms-dos)
(if (string-match "light" (cdr (assq 'background-color params)))
'light
'dark))
((< (apply '+ (x-color-values
(cdr (assq 'background-color params))))
(* (apply '+ (x-color-values "white")) .6))
'dark)
(t 'light)))))
(let ((face-attributes
(let ((light-bg (eq font-lock-background-mode 'light)))
(cond ((memq font-lock-display-type '(mono monochrome))
;; Emacs 19.25's font-lock defaults:
;;'((font-lock-comment-face nil nil nil t nil)
;; (font-lock-string-face nil nil nil nil t)
;; (font-lock-keyword-face nil nil t nil nil)
;; (font-lock-function-name-face nil nil t t nil)
;; (font-lock-type-face nil nil nil t nil))
(list '(font-lock-comment-face nil nil t t nil)
'(font-lock-string-face nil nil nil t nil)
'(font-lock-keyword-face nil nil t nil nil)
'(font-lock-builtin-face nil nil t nil nil)
(list
'font-lock-function-name-face
(cdr (assq 'background-color (frame-parameters)))
(cdr (assq 'foreground-color (frame-parameters)))
t nil nil)
'(font-lock-variable-name-face nil nil t t nil)
'(font-lock-type-face nil nil t nil t)
'(font-lock-reference-face nil nil t nil t)
(list
'font-lock-warning-face
(cdr (assq 'background-color (frame-parameters)))
(cdr (assq 'foreground-color (frame-parameters)))
t nil nil)))
((memq font-lock-display-type '(grayscale greyscale
grayshade greyshade))
(list
(list 'font-lock-comment-face
(if light-bg "DimGray" "LightGray") nil t t nil)
(list 'font-lock-string-face
(if light-bg "DimGray" "LightGray") nil nil t nil)
(list 'font-lock-keyword-face
nil (if light-bg "LightGray" "DimGray") t nil nil)
(list 'font-lock-builtin-face
nil (if light-bg "LightGray" "DimGray") t nil nil)
(list 'font-lock-function-name-face
(cdr (assq 'background-color (frame-parameters)))
(cdr (assq 'foreground-color (frame-parameters)))
t nil nil)
(list 'font-lock-variable-name-face
nil (if light-bg "Gray90" "DimGray") t t nil)
(list 'font-lock-type-face
nil (if light-bg "Gray80" "DimGray") t nil nil)
(list 'font-lock-reference-face
nil (if light-bg "LightGray" "Gray50") t nil t)
(list 'font-lock-warning-face
(cdr (assq 'background-color (frame-parameters)))
(cdr (assq 'foreground-color (frame-parameters)))
t nil nil)))
(light-bg ; light colour background
'((font-lock-comment-face "Firebrick")
(font-lock-string-face "RosyBrown")
(font-lock-keyword-face "Purple")
(font-lock-builtin-face "Orchid")
(font-lock-function-name-face "Blue")
(font-lock-variable-name-face "DarkGoldenrod")
(font-lock-type-face "DarkOliveGreen")
(font-lock-reference-face "CadetBlue")
(font-lock-warning-face "Red" nil t nil nil)))
(t ; dark colour background
'((font-lock-comment-face "OrangeRed")
(font-lock-string-face "LightSalmon")
(font-lock-keyword-face "Cyan")
(font-lock-builtin-face "LightSteelBlue")
(font-lock-function-name-face "LightSkyBlue")
(font-lock-variable-name-face "LightGoldenrod")
(font-lock-type-face "PaleGreen")
(font-lock-reference-face "Aquamarine")
(font-lock-warning-face "Pink" nil t nil nil)))))))
(while face-attributes
(unless (assq (car (car face-attributes)) font-lock-face-attributes)
(push (car face-attributes) font-lock-face-attributes))
(setq face-attributes (cdr face-attributes))))
;; Now make the faces if we have to.
(mapcar (function
(lambda (face-attributes)
(let ((face (nth 0 face-attributes)))
(cond (override
;; We can stomp all over it anyway. Get outta my face!
(font-lock-make-face face-attributes))
((and (boundp face) (facep (symbol-value face)))
;; The variable exists and is already bound to a face.
nil)
((facep face)
;; We already have a face so we bind the variable to it.
(set face face))
(t
;; No variable or no face.
(font-lock-make-face face-attributes))))))
font-lock-face-attributes))
(defface font-lock-builtin-face
'((((class grayscale) (background light)) (:foreground "LightGray" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "Orchid"))
(((class color) (background dark)) (:foreground "LightSteelBlue"))
(t (:bold t)))
"Font Lock mode face used to highlight builtins."
:group 'font-lock-faces)
(defun font-lock-make-face (face-attributes)
"Make a face from FACE-ATTRIBUTES.
FACE-ATTRIBUTES should be like an element `font-lock-face-attributes', so that
the face name is the first item in the list. A variable with the same name as
the face is also set; its value is the face name."
(let* ((face (nth 0 face-attributes))
(face-name (symbol-name face))
(set-p (function (lambda (face-name resource)
(x-get-resource (concat face-name ".attribute" resource)
(concat "Face.Attribute" resource)))))
(on-p (function (lambda (face-name resource)
(let ((set (funcall set-p face-name resource)))
(and set (member (downcase set) '("on" "true"))))))))
(make-face face)
(add-to-list 'facemenu-unlisted-faces face)
;; Set attributes not set from X resources (and therefore `make-face').
(or (funcall set-p face-name "Foreground")
(condition-case nil
(set-face-foreground face (nth 1 face-attributes))
(error nil)))
(or (funcall set-p face-name "Background")
(condition-case nil
(set-face-background face (nth 2 face-attributes))
(error nil)))
(if (funcall set-p face-name "Bold")
(and (funcall on-p face-name "Bold") (make-face-bold face nil t))
(and (nth 3 face-attributes) (make-face-bold face nil t)))
(if (funcall set-p face-name "Italic")
(and (funcall on-p face-name "Italic") (make-face-italic face nil t))
(and (nth 4 face-attributes) (make-face-italic face nil t)))
(or (funcall set-p face-name "Underline")
(set-face-underline-p face (nth 5 face-attributes)))
(set face face)))
(defface font-lock-function-name-face
;; Currently, Emacs/Custom does not support a :reverse or :invert spec.
'((((class color) (background light)) (:foreground "Blue"))
(((class color) (background dark)) (:foreground "LightSkyBlue"))
(t ;(:reverse t :bold t)
(:italic t :bold t)))
"Font Lock mode face used to highlight function names."
:group 'font-lock-faces)
(defface font-lock-variable-name-face
'((((class grayscale) (background light))
(:foreground "Gray90" :bold t :italic t))
(((class grayscale) (background dark))
(:foreground "DimGray" :bold t :italic t))
(((class color) (background light)) (:foreground "DarkGoldenrod"))
(((class color) (background dark)) (:foreground "LightGoldenrod"))
(t (:bold t :italic t)))
"Font Lock mode face used to highlight variable names."
:group 'font-lock-faces)
(defface font-lock-type-face
'((((class grayscale) (background light)) (:foreground "Gray90" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "DarkOliveGreen"))
(((class color) (background dark)) (:foreground "PaleGreen"))
(t (:bold t :underline t)))
"Font Lock mode face used to highlight types."
:group 'font-lock-faces)
(defface font-lock-reference-face
'((((class grayscale) (background light))
(:foreground "LightGray" :bold t :underline t))
(((class grayscale) (background dark))
(:foreground "Gray50" :bold t :underline t))
(((class color) (background light)) (:foreground "CadetBlue"))
(((class color) (background dark)) (:foreground "Aquamarine"))
(t (:bold t :underline t)))
"Font Lock mode face used to highlight references."
:group 'font-lock-faces)
(defface font-lock-warning-face
;; Currently, Emacs/Custom does not support a :reverse or :invert spec.
'((((class color) (background light)) (:foreground "Red" :bold t))
(((class color) (background dark)) (:foreground "Pink" :bold t))
(t ;(:reverse t :bold t)
(:italic t :bold t)))
"Font Lock mode face used to highlight warnings."
:group 'font-lock-faces)
;;; End of Colour etc. support.
@ -1731,7 +1643,7 @@ This function could be MATCHER in a MATCH-ANCHORED `font-lock-keywords' item."
This means the number of parenthesized expressions."
(let ((count 0) start)
(while (string-match "\\\\(" keyword start)
(setq start (match-end 0) count (1+ count)))
(setq count (1+ count) start (match-end 0)))
count))
@ -1739,24 +1651,24 @@ This means the number of parenthesized expressions."
(eval-when-compile
(list
;;
;; Anything not a variable or type declaration is fontified as a function.
;; It would be cleaner to allow preceding whitespace, but it would also be
;; about five times slower.
(list (concat "^(\\(def\\("
;; Definitions.
(list (concat "(\\(def\\("
;; Function declarations.
"\\(advice\\|alias\\|"
"ine-\\(derived-mode\\|function\\|skeleton\\)\\|"
"macro\\|subst\\|un\\)\\|"
;; Variable declarations.
"\\(const\\|custom\\|face\\|var\\)\\|"
;; Structure declarations.
"\\(class\\|group\\|struct\\|type\\)\\|"
;; Everything else is a function declaration.
"\\sw+"
"\\(class\\|group\\|struct\\|type\\)"
"\\)\\)\\>"
;; Any whitespace and declared object.
;; Any whitespace and defined object.
"[ \t'\(]*"
"\\(\\sw+\\)?")
'(1 font-lock-keyword-face)
'(5 (cond ((match-beginning 3) font-lock-variable-name-face)
((match-beginning 4) font-lock-type-face)
(t font-lock-function-name-face))
'(7 (cond ((match-beginning 3) font-lock-function-name-face)
((match-beginning 5) font-lock-variable-name-face)
(t font-lock-type-face))
nil t))
;;
;; Emacs Lisp autoload cookies.
@ -1773,13 +1685,14 @@ This means the number of parenthesized expressions."
;;
;; Control structures. Emacs Lisp forms.
(cons (concat "(\\("
; '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "inline" "catch" "throw"
; "save-restriction" "save-excursion" "save-window-excursion"
; "save-selected-window" "save-match-data" "save-current-buffer"
; "unwind-protect" "condition-case" "track-mouse" "dont-compile"
; "eval-after-load" "eval-and-compile" "eval-when" "eval-when-compile"
; "with-output-to-temp-buffer" "with-timeout" "with-current-buffer"
; "with-temp-buffer" "with-temp-file")
; (make-regexp
; '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw"
; "inline" "save-restriction" "save-excursion" "save-window-excursion"
; "save-selected-window" "save-match-data" "save-current-buffer"
; "unwind-protect" "condition-case" "track-mouse" "dont-compile"
; "eval-after-load" "eval-and-compile" "eval-when" "eval-when-compile"
; "with-output-to-temp-buffer" "with-timeout" "with-current-buffer"
; "with-temp-buffer" "with-temp-file"))
"c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|dont-compile\\|"
"eval-\\(a\\(fter-load\\|nd-compile\\)\\|"
"when\\(\\|-compile\\)\\)\\|"
@ -1795,11 +1708,11 @@ This means the number of parenthesized expressions."
;;
;; Control structures. Common Lisp forms.
(cons (concat "(\\("
; '(make-regexp
; '("when" "unless" "case" "ecase" "typecase" "etypecase"
; "loop" "do\\*?" "dotimes" "dolist"
; "proclaim" "declaim" "declare"
; "lexical-let\\*?" "flet" "labels" "return" "return-from"))
; (make-regexp
; '("when" "unless" "case" "ecase" "typecase" "etypecase"
; "loop" "do\\*?" "dotimes" "dolist"
; "proclaim" "declaim" "declare"
; "lexical-let\\*?" "flet" "labels" "return" "return-from"))
"case\\|d\\(ecla\\(im\\|re\\)\\|o\\(\\*?\\|"
"list\\|times\\)\\)\\|e\\(case\\|typecase\\)\\|flet\\|"
"l\\(abels\\|exical-let\\*?\\|oop\\)\\|proclaim\\|"
@ -1916,31 +1829,39 @@ This means the number of parenthesized expressions."
;; These provide a means to fontify types not defined by the language. Those
;; types might be the user's own or they might be generally accepted and used.
;; Generally excepted types are used to provide default variable values.
;; Generally accepted types are used to provide default variable values.
(defvar c-font-lock-extra-types '("FILE" "\\sw+_t")
"*List of extra types to fontify in C mode.
Each list item should be a regexp without word-delimiters.
Each list item should be a regexp not containing word-delimiters.
For example, a value of (\"FILE\" \"\\\\sw+_t\") means the word FILE and words
ending in _t are treated as type names.")
ending in _t are treated as type names.
(defvar c++-font-lock-extra-types nil
The value of this variable is used when Font Lock mode is turned on.")
(defvar c++-font-lock-extra-types '("string")
"*List of extra types to fontify in C++ mode.
Each list item should be a regexp without word-delimiters.
For example, a value of (\"String\") means the word String is treated as a type
name.")
Each list item should be a regexp not containing word-delimiters.
For example, a value of (\"string\") means the word string is treated as a type
name.
The value of this variable is used when Font Lock mode is turned on.")
(defvar objc-font-lock-extra-types '("Class" "BOOL" "IMP" "SEL")
"*List of extra types to fontify in Objective-C mode.
Each list item should be a regexp without word-delimiters.
Each list item should be a regexp not containing word-delimiters.
For example, a value of (\"Class\" \"BOOL\" \"IMP\" \"SEL\") means the words
Class, BOOL, IMP and SEL are treated as type names.")
Class, BOOL, IMP and SEL are treated as type names.
The value of this variable is used when Font Lock mode is turned on.")
(defvar java-font-lock-extra-types '("[A-Z\300-\326\330-\337]\\sw+")
"*List of extra types to fontify in Java mode.
Each list item should be a regexp without word-delimiters.
Each list item should be a regexp not containing word-delimiters.
For example, a value of (\"[A-Z\300-\326\330-\337]\\\\sw+\") means capitalised
words (and words conforming to the Java id spec) are treated as type names.")
words (and words conforming to the Java id spec) are treated as type names.
The value of this variable is used when Font Lock mode is turned on.")
;;; C.
@ -2108,10 +2029,15 @@ See also `c++-font-lock-extra-types'.")
;; If (match-beginning 5) is non-nil, that part of the item follows a `::'.
;; If (match-beginning 6) is non-nil, the item is followed by a `('.
(when (looking-at (eval-when-compile
(concat "[ \t*&]*\\(\\sw+\\)"
"\\(<\\(\\sw+\\)[ \t*&]*>\\)?"
"\\([ \t]*::[ \t*]*\\(\\sw+\\)\\)?"
"[ \t]*\\((\\)?")))
(concat
;; Skip any leading whitespace.
"[ \t*&]*"
;; This is `c++-type-spec' from below. (Hint hint!)
"\\(\\sw+\\)" ; The instance?
"\\(<\\(\\sw+\\)[ \t*&]*>\\)?" ; Or template?
"\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?" ; Or member?
;; Match any trailing parenthesis.
"[ \t]*\\((\\)?")))
(save-match-data
(condition-case nil
(save-restriction
@ -2162,11 +2088,18 @@ See also `c++-font-lock-extra-types'.")
"v\\(irtual\\|o\\(id\\|latile\\)\\)")) ; 12 ()s deep.
c++-font-lock-extra-types)
"\\|"))
;;
;; A brave attempt to match templates following a type and/or match
;; class membership. See and sync the above function
;; `font-lock-match-c++-style-declaration-item-and-skip-to-next'.
(c++-type-suffix (concat "\\(<\\(\\sw+\\)[ \t*&]*>\\)?"
"\\([ \t]*::[ \t*]*\\(\\sw+\\)\\)?"))
"\\([ \t]*::[ \t*~]*\\(\\sw+\\)\\)?"))
;; If the string is a type, it may be followed by the cruft above.
(c++-type-spec (concat "\\(\\sw+\\)\\>" c++-type-suffix))
;;
;; Parenthesis depth of user-defined types not forgetting their cruft.
(c++-type-depth `(font-lock-keyword-depth
(concat (,@ c++-type-types) (,@ c++-type-suffix))))
(c++-type-spec (concat "\\(\\sw+\\)\\>" c++-type-suffix))
)
(setq c++-font-lock-keywords-1
(append