Hello Scott, [...] > I'd like to find the cause of the problem, though, rather than > finding a workaround. Setting `font-lock-maximum-decoration' is not really a workaround ;-) > Is there something wrong with my code? Am I not understanding the > configuration correctly? Is this a bug in JDE? > > I'll repost my code below: > > (defun my-jde-mode-hook () > (message "my-jde-mode-hook function executed") > (custom-set-variables > '(jde-use-font-lock nil)) > (custom-set-faces) > ) > (add-hook 'jde-mode-hook 'my-jde-mode-hook) I think it suffice to customize the variable `jde-use-font-lock' to set its default value to nil. There is no need of a `jde-mode-hook' for that. > And here's the message that I get: > jde-java-font-lock: building names cache...empty [...] This is a normal message and you can safely ignore it. It just tells you that you have not installed the file to highlight Java API class names. But I agree with you just setting `jde-use-font-lock' to nil should suffice to use standard `java-mode' rules for syntax hilighting. And this does not work with current implementation :-( Attached you will find a new version of jde-java-font-lock.el including a fixed implementation of the `java-mode-hook': `jde-setup-syntax-coloring' . I tested it with GNU Emacs 20.7 and 21, and XEmacs 21.1 and 21.4. I think the new behavior is cleaner: - If `jde-use-font-lock' is non-nil the JDE completely handles font lock setup and installs the extra level of fontification in `java-font-lock-keywords-4'. - If `jde-use-font-lock' is nil the JDE does nothing by itself and just delegates syntax coloring setup to standard `java-mode'. Also you must comment out the following unneeded lines in `jde-mode-internal' (in jde.el): ;; Run via a `java-mode-hook' (see jde-java-font-lock.el). ;; (if jde-use-font-lock ;; (jde-setup-syntax-coloring)) Thank you for your advice. Sincerely, David
;;; jde-java-font-lock.el -- Extra level font locking for java ;; Copyright (C) 1998, 1999, 2000, 2001 by David Ponce ;; Author: David Ponce <[EMAIL PROTECTED]> ;; Maintainer: David Ponce <[EMAIL PROTECTED]> ;; Paul Kinnucan <[EMAIL PROTECTED]> ;; Created: September 28 1998 ;; Keywords: java, tools ;; VC: $Id: jde-java-font-lock.el,v 1.6 2001/06/05 04:54:49 paulk Exp $ ;; This file is not part of Emacs ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; ;; Adds some extra level font locking for java in `jde-mode'. ;; ;; - Numbers are fontified with `jde-java-font-lock-number-face'. ;; ;; - Packages in package and import statements are fontified with ;; `jde-java-font-lock-package-face'. Last '*' of imported packages ;; are fontified with `jde-java-font-lock-number-face'. Last type ;; identifiers of imported packages are fontified with ;; `font-lock-type-face'. ;; ;; - Modifiers are fontified with `jde-java-font-lock-modifier-face'. ;; ;; - Keywords const and goto are fontified with ;; `font-lock-warning-face'. These keywords are reserved, even ;; though they are not currently used. ;; ;; - Keywords super, this and default are fontified with ;; `font-lock-keyword-face'. ;; ;; - User's defined identifiers (see variable ;; `jde-java-font-lock-api-file') are fontified with ;; `jde-java-font-lock-api-face'. ;; ;; - Capitalized identifiers and special constants null, true and ;; false are fontified with `jde-java-font-lock-constant-face'. ;; ;; - Text between `' in comments and javadoc tags (including non ;; official javadoc tags) are fontified with ;; `jde-java-font-lock-doc-tag-face'. ;; ;; - Javadoc links (following @link tags or enclosed in HTML <a> tags) ;; are fontified with `jde-java-font-lock-link-face' ;; ;; - Javadoc code samples (enclosed in HTML <code> tags or following ;; @see tags) are fontified with `jde-java-font-lock-code-face'. ;; ;; - Javadoc HTML bold and strong styles are fontified with ;; `jde-java-font-lock-bold-face'. ;; ;; - Javadoc HTML italic and emphasized styles are fontified with ;; `jde-java-font-lock-italic-face'. ;; ;; - Javadoc HTML underlined style is fontified with ;; `jde-java-font-lock-underline-face'. ;; ;; - Javadoc HTML preformatted style is fontified with ;; `jde-java-font-lock-pre-face'. ;; ;; All font-lock and jde-java-font-lock faces are individually ;; customizable. jde-java-font-lock faces are in the customization ;; group `jde-java-font-lock-faces' which is a sub group of ;; `font-lock-highlighting-faces' (Emacs) or `font-lock-faces' ;; (XEmacs). ;; This code has been tested with FSF Emacs 20.7, 21.0 and XEmacs ;; 21.1. Any comments, suggestions, bug reports or upgrade requests ;; are welcome. Please send them to the maintainers. ;; WARNING: It seems there is byte-code compatibility issues between ;; Emacs and XEmacs. When using Emacs byte-code on XEmacs font ;; locking don't work correctly for some complex matchers like those ;; used to highlight imported package name :-) ;;; History: ;; ;; See at end of this file. ;;; Code: (require 'font-lock) (defcustom jde-use-font-lock t "*Turn on font-locking if non-nil. Set to nil to disable the use of font-locking." :group 'jde-project :type 'boolean) (defcustom jde-java-font-lock-max-names-by-regexp (if (featurep 'xemacs) 200 0) "*Maximum number of user defined names that one regexp can match. No limit if less than 1. WARNING: It seems XEmacs search fails with a very long regexp. So the XEmacs default limits is 200. No limit for Emacs." :group 'jde-project :type 'integer) ;;;; ;;;; Define the faces ;;;; (defgroup jde-java-font-lock-faces nil "Specific JDE faces for highlighting Java sources." :prefix "jde-java-font-lock-" :group (if (featurep 'xemacs) 'font-lock-faces 'font-lock-highlighting-faces)) (defface jde-java-font-lock-number-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 numbers." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-constant-face '((((type tty) (class color)) (:foreground "magenta")) (((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 constants." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-api-face '((((class grayscale) (background light)) (:foreground "DimGray")) (((class grayscale) (background dark)) (:foreground "LightGray")) (((class color) (background light)) (:foreground "dark goldenrod")) (((class color) (background dark)) (:foreground "light goldenrod"))) "Font Lock mode face used to highlight user's defined names." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-link-face '((t (:foreground "blue" :italic nil :underline t))) "Font Lock mode face used to highlight links." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-package-face '((((class color) (background dark)) (:foreground "steelblue1")) (((class color) (background light)) (:foreground "blue3")) (t (:underline t))) "Font Lock Mode face used to highlight packages." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-doc-tag-face '((((class color) (background dark)) (:foreground "light coral")) (((class color) (background light)) (:foreground "green4")) (t (:bold t))) "Font Lock Mode face used to highlight doc tags." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-modifier-face '((((type tty) (class color)) (:foreground "blue" :weight light)) (((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 modifiers." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-bold-face '((t (:bold t))) "Font Lock Mode face used to highlight HTML bold text style." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-italic-face '((t (:italic t))) "Font Lock Mode face used to highlight HTML italic text style." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-underline-face '((t (:underline t))) "Font Lock Mode face used to highlight HTML underlined text style." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-pre-face '((t nil)) "Font Lock Mode face used to highlight HTML preformatted text style." :group 'jde-java-font-lock-faces) (defface jde-java-font-lock-code-face '((t nil)) "Font Lock Mode face used to highlight HTML program code style." :group 'jde-java-font-lock-faces) ;; Define the extra font lock faces (defvar jde-java-font-lock-number-face 'jde-java-font-lock-number-face "Face name to use for numbers.") (defvar jde-java-font-lock-constant-face 'jde-java-font-lock-constant-face "Face name to use for constants.") (defvar jde-java-font-lock-package-face 'jde-java-font-lock-package-face "Face name to use for packages.") (defvar jde-java-font-lock-modifier-face 'jde-java-font-lock-modifier-face "Face name to use for modifiers.") (defvar jde-java-font-lock-api-face 'jde-java-font-lock-api-face "Face name to use for user's defined names.") (defvar jde-java-font-lock-doc-tag-face 'jde-java-font-lock-doc-tag-face "Face name to use for doc tags.") (defvar jde-java-font-lock-link-face 'jde-java-font-lock-link-face "Face name to use for links.") (defvar jde-java-font-lock-bold-face 'jde-java-font-lock-bold-face "Face name to use for HTML bold text style.") (defvar jde-java-font-lock-italic-face 'jde-java-font-lock-italic-face "Face name to use for HTML italic text style.") (defvar jde-java-font-lock-underline-face 'jde-java-font-lock-underline-face "Face name to use for HTML underlined text style.") (defvar jde-java-font-lock-pre-face 'jde-java-font-lock-pre-face "Face name to use for HTML preformatted text style.") (defvar jde-java-font-lock-code-face 'jde-java-font-lock-code-face "Face name to use for HTML program code style.") ;;;; ;;;; Useful constants ;;;; (defconst jde-java-font-lock-capital-letter "A-Z\300-\326\330-\337_$" "Java identifier capital letter.") (defconst jde-java-font-lock-letter (concat jde-java-font-lock-capital-letter "a-z") "Java identifier letter.") (defconst jde-java-font-lock-capital-letter-or-digit (concat jde-java-font-lock-capital-letter "0-9") "Java identifier capital letter or digit.") (defconst jde-java-font-lock-letter-or-digit (concat jde-java-font-lock-letter "0-9") "Java identifier letter or digit.") ;;;; ;;;; Support for fontification inside javadocs and comments. ;;;; ;; Define font lock keywords for comments and javadocs only (defun jde-java-font-lock-remove-javadoc-keywords (keywords) "Remove existing javadoc font lock keywords from KEYWORDS. That is those with \"@\" in their matcher regexp." (let (kw matcher) (while keywords (setq matcher (car keywords) keywords (cdr keywords)) (if (not (and (consp matcher) (stringp (car matcher)) (string-match "@" (car matcher)))) (setq kw (cons matcher kw)))) (nreverse kw))) (defun jde-java-font-lock-in-javadoc-p () "Return non-nil if point is in a javadoc comment." (let* ((p (point)) (in-javadoc-p (save-match-data (and (re-search-backward "^[ \t]*/\\*\\*" nil t) (skip-chars-forward " \t" p) (eq (get-text-property (point) 'face) 'font-lock-comment-face) (forward-comment 1) (< p (point)))))) (goto-char p) in-javadoc-p)) (defun jde-java-font-lock-search-in-comment (regexp end) "Search forward from point for regular expression REGEXP. Ensure matching occurs in a java comment. Buffer position END bounds the search. The match found must not extend after that position." (let (in-comment-p) (while (and (not in-comment-p) (re-search-forward regexp end t)) (setq in-comment-p (eq (get-text-property (match-beginning 0) 'face) 'font-lock-comment-face))) in-comment-p)) (defun jde-java-font-lock-search-in-javadoc (regexp end) "Search forward from point for regular expression REGEXP. Ensure matching occurs in a javadoc comment. Buffer position END bounds the search. The match found must not extend after that position." (let (in-javadoc-p) (while (and (not in-javadoc-p) (re-search-forward regexp end t)) (setq in-javadoc-p (jde-java-font-lock-in-javadoc-p))) in-javadoc-p)) (defun jde-java-font-lock-quote-keyword () "Return a font lock keyword for comment enclosed in \`\'." `((lambda (end) (jde-java-font-lock-search-in-comment "`\\([^']*\\)'" end)) 1 jde-java-font-lock-doc-tag-face t)) (defun jde-java-font-lock-html-ahref-keyword () "Return a font lock keyword for HTML A HREF anchor. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "<[Aa]\\s-+[Hh][Rr][Ee][Ff][^>]*>\\([^>]+\\)</[Aa]>" end)) 1 jde-java-font-lock-link-face t)) (defun jde-java-font-lock-html-bold-keyword () "Return a font lock keyword for HTML B and STRONG style. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc , (concat "<\\([Bb]\\|[Ss][Tt][Rr][Oo][Nn][Gg]\\)>" "\\([^<]*\\)" "</\\([Bb]\\|[Ss][Tt][Rr][Oo][Nn][Gg]\\)>") end)) 2 jde-java-font-lock-bold-face t)) (defun jde-java-font-lock-html-italic-keyword () "Return a font lock keyword for HTML I and EM style. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "<\\([Ii]\\|[Ee][Mm]\\)>\\([^<]*\\)</\\([Ii]\\|[Ee][Mm]\\)>" end)) 2 jde-java-font-lock-italic-face t)) (defun jde-java-font-lock-html-underline-keyword () "Return a font lock keyword for HTML U style. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "<[Uu]>\\([^<]*\\)</[Uu]>" end)) 1 jde-java-font-lock-underline-face t)) (defun jde-java-font-lock-html-code-keyword () "Return a font lock keyword for HTML CODE style. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "<[Cc][Oo][Dd][Ee]>\\([^<]*\\)</[Cc][Oo][Dd][Ee]>" end)) 1 jde-java-font-lock-code-face t)) (defun jde-java-font-lock-html-pre-keyword () "Return a font lock keyword for HTML PRE style. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "<[Pp][Rr][Ee]>\\([^<]*\\)</[Pp][Rr][Ee]>" end)) 1 jde-java-font-lock-pre-face t)) (defun jde-java-font-lock-javadoc-tag-keyword () "Return a font lock keyword for javadoc tags. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc ,(concat "^[ \t]*\\(/\\*\\*\\|\\*?\\)[ \t]*" "\\(@[" jde-java-font-lock-letter-or-digit "]+\\)") end)) 2 jde-java-font-lock-doc-tag-face t)) (defun jde-java-font-lock-javadoc-docroot-keyword () "Return a font lock keyword for javadoc @docRoot tags. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "{\\(@docRoot\\)}" end)) 1 jde-java-font-lock-doc-tag-face t)) (defun jde-java-font-lock-javadoc-link-keyword () "Return a font lock keyword for javadoc @link tags. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc "{\\(@link\\)\\>[ \t]+\\([^}]*\\)}" end)) (1 jde-java-font-lock-doc-tag-face t) (2 jde-java-font-lock-link-face t))) (defun jde-java-font-lock-javadoc-see-ref-keyword () "Return a font lock keyword for javadoc @see references. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc ,(concat "^[ \t]*\\(/\\*\\*\\|\\*?\\)[ \t]*" "@see\\>[ \t]*" "\\([.#" jde-java-font-lock-letter-or-digit "]+\\)") end)) 2 jde-java-font-lock-code-face t)) (defun jde-java-font-lock-javadoc-param-name-keyword () "Return a font lock keyword for javadoc @param names. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc ,(concat "^[ \t]*\\(/\\*\\*\\|\\*?\\)[ \t]*" "@param\\>[ \t]*\\(\\sw+\\)?") end)) 2 font-lock-variable-name-face prepend t)) (defun jde-java-font-lock-javadoc-exception-type-keyword () "Return a font lock keyword for javadoc exception types. Only fontify javadoc comments." `((lambda (end) (jde-java-font-lock-search-in-javadoc ,(concat "^[ \t]*\\(/\\*\\*\\|\\*?\\)[ \t]*" "@\\(exception\\|throws\\)\\>[ \t]*\\(\\S-+\\)?") end)) 3 font-lock-type-face prepend t)) ;;;; ;;;; Support for fontification of user's defined names. ;;;; (defcustom jde-java-font-lock-api-file (expand-file-name "~/jde-java-font-lock.api") "*File which contains a list of user's defined names to fontify. If nil no name fontification occurs. Otherwise the specified file must contain one name by line. Lines not beginning with a letter are ignored. When you change this file or modify its content a new cache of font lock regular expressions will be rebuilt when restarting Emacs. Also, you can manually rebuild the cache and update font lock keywords by entering the command: \\[universal-argument] \\[jde-java-font-lock-setup-keywords]." :group 'jde-project :type '(choice :tag "Names" (const :tag "No" nil) (file :tag "In file" :format "%t\n%v"))) (defcustom jde-java-font-lock-api-name-filter nil "*Function used to filter a name." :group 'jde-project :type 'function) (defconst jde-java-font-lock-api-entry-regexp (concat "^[" jde-java-font-lock-letter "]" "[" jde-java-font-lock-letter-or-digit "]+$") "Regexp to match a valid entry in `jde-java-font-lock-api-file'.") (defconst jde-java-font-lock-api-entry-match 0 "Index of the match data in `jde-java-font-lock-api-entry-regexp'.") (defun jde-java-font-lock-api-names (&optional filter) "Return the list of names in `jde-java-font-lock-api-file'. If optional FILTER function is non-nil it is called for each name found and must return non-nil to include it in the result list." (let (k kl) (if (and jde-java-font-lock-api-file (file-readable-p jde-java-font-lock-api-file)) (with-temp-buffer (erase-buffer) (insert-file-contents jde-java-font-lock-api-file) (goto-char (point-min)) (while (re-search-forward jde-java-font-lock-api-entry-regexp nil t) (setq k (match-string jde-java-font-lock-api-entry-match)) ;; Allow filtering of names (if (or (null filter) (funcall filter k)) (setq kl (cons k kl)))))) kl)) (defun jde-java-font-lock-api-split-list (l n) "Split list L in sub listes of N elements. If L is nil return nil. If N is less than 1 all elements will be in one sub list." (if l (if (<= n 0) (list l) (let (split-list sub-list i) (while l (setq i 0 sub-list nil) (while (and l (< i n)) (setq sub-list (cons (car l) sub-list) i (1+ i) l (cdr l))) (if sub-list (setq split-list (cons sub-list split-list)))) split-list)))) (defun jde-java-font-lock-api-build-regexps (max-matches) "Build regular expressions matching names to fontify. MAX-MATCHES is the maximum number of names that one regular expression will match. If MAX-MATCHES is less than 1 one regular expression will match all the names." (let ((max-specpdl-size 2000)) ;; Prevent errors in `regexp-opt' ;; when processing long string listes (mapcar (function (lambda (k) (concat "\\<" (regexp-opt k t) "\\>"))) (jde-java-font-lock-api-split-list (jde-java-font-lock-api-names jde-java-font-lock-api-name-filter) max-matches)))) (defvar jde-java-font-lock-api-cache nil "Cache of regular expressions matching names to fontify..") (defun jde-java-font-lock-api-cache-file () "Return the filename of the regular expressions cache. There is a different cache file for each major version of (X)Emacs because of incompatible regular expressions returned by `regexp-opt'." (and jde-java-font-lock-api-file (format "%s.%semacs-%d.apicache" jde-java-font-lock-api-file (if (featurep 'xemacs) "x" "") emacs-major-version))) (defconst jde-java-font-lock-api-cache-file-header ";;; Regular expressions matching names to fontify. ;;; Automatically generated by `jde-java-font-lock' on %s. " "Header to be written into the cache file.") (defun jde-java-font-lock-api-regexps (&optional rebuild) "Return regular expressions matching names to fontify. The list is cached in variable `jde-java-font-lock-api-cache'. If it is nil try to initialize it from the cache file (see function `jde-java-font-lock-api-cache-file'). If optional REBUILD flag is non-nil or there is no cache file or the cache file is older than the names file (see variable `jde-java-font-lock-api-file'), a new cache is created." (let ((cache (jde-java-font-lock-api-cache-file))) (cond ;; Inconditionnal rebuild (rebuild ;; Clear the cache to rebuild (setq jde-java-font-lock-api-cache nil)) ;; No names file exists ((null cache) ;; Clear the cache (no fontification) (setq jde-java-font-lock-api-cache nil)) ;; A cache file exists ((file-readable-p cache) (if (file-newer-than-file-p jde-java-font-lock-api-file cache) (progn (message "jde-java-font-lock: names file %s newer than cache file %s" jde-java-font-lock-api-file cache) ;; The api file has been modified since the cache was ;; created, so clear the cache to rebuild (setq jde-java-font-lock-api-cache nil)) ;; Try to load the existing cache if needed (or jde-java-font-lock-api-cache (condition-case nil (load-file cache) ;; If load fails clear the cache to rebuild (error (setq jde-java-font-lock-api-cache nil))))))) (or jde-java-font-lock-api-cache (not cache) ;; Build a new cache if it is empty and available (progn (message "jde-java-font-lock: building names cache...") (when (setq jde-java-font-lock-api-cache (jde-java-font-lock-api-build-regexps jde-java-font-lock-max-names-by-regexp)) ;; Save regexps in cache (with-current-buffer (find-file-noselect cache) (erase-buffer) (insert (format jde-java-font-lock-api-cache-file-header (current-time-string)) (format "(setq jde-java-font-lock-api-cache '%S)" jde-java-font-lock-api-cache)) (save-buffer) (kill-buffer (current-buffer)))) (message "jde-java-font-lock: building names cache...%s" (if jde-java-font-lock-api-cache "done" "empty")))) jde-java-font-lock-api-cache)) (defun jde-java-font-lock-api-keywords (&optional rebuild) "Return a list of font lock keywords for user's defined names. If optional REBUILD flag is non-nil create a new cache of regular expressions." (mapcar (function (lambda (k) (cons k 'jde-java-font-lock-api-face))) (jde-java-font-lock-api-regexps rebuild))) ;;;; ;;;; Font lock setup. ;;;; (defvar java-font-lock-keywords-4 nil "Extra level fontification keywords for JDE mode.") (defun jde-java-font-lock-refontify () "Update fontification of buffers in `java-mode' and `jde-mode'." (let ((l (buffer-list)) b) (while l (setq b (car l) l (cdr l)) (if (buffer-live-p b) (with-current-buffer b (if (and font-lock-mode (memq major-mode '(java-mode jde-mode))) (progn (message "jde-java-font-lock: updating fontification of buffer %s..." (buffer-name)) (font-lock-mode nil) (font-lock-mode 1) (message "jde-java-font-lock: updating fontification of buffer %s...done" (buffer-name))))))))) ;;;###autoload (defun jde-java-font-lock-setup-keywords (&optional rebuild) "Setup font lock keywords in `java-font-lock-keywords-4'. If optional REBUILD flag is non-nil create a new cache of regular expressions." (interactive "P") (and (interactive-p) (consp current-prefix-arg) (setq rebuild t)) (setq java-font-lock-keywords-4 (append ;; Feature scoping: These must come first or the Special ;; constants, Modifiers and Packages from keywords-1 will catch ;; them. ;;; Compatibility (if (featurep 'xemacs) (list ;; Special keywords and constants '("\\<\\(this\\|super\\)\\>" (1 font-lock-keyword-face)) '("\\<\\(false\\|null\\|true\\)\\>" (1 jde-java-font-lock-constant-face)) )) (list ;; Fontify default as keyword '("\\<\\(default\\)\\>" (1 font-lock-keyword-face)) ;; Fontify const and goto with warning face. These keywords are ;; reserved, even though they are not currently used. '("\\<\\(const\\|goto\\)\\>" (1 font-lock-warning-face)) ;; Fontify modifiers. (cons (concat "\\<\\(" (eval-when-compile (regexp-opt '( "abstract" "const" "final" "native" "private" "protected" "public" "static" "strictfp" "synchronized" "transient" "volatile" ))) "\\)\\>") 'jde-java-font-lock-modifier-face) ;; Fontify package directives '("\\<\\(package\\)\\>\\s-+\\(\\sw+\\)" (1 font-lock-keyword-face) (2 jde-java-font-lock-package-face nil t) ("\\=\\.\\(\\sw+\\)" nil nil (1 jde-java-font-lock-package-face nil t))) ;; Fontify import directives '("\\<\\(import\\)\\>\\s-+\\(\\sw+\\)" (1 font-lock-keyword-face) (2 (if (equal (char-after (match-end 0)) ?\.) 'jde-java-font-lock-package-face 'font-lock-type-face)) ("\\=\\.\\(\\*\\|\\sw+\\)" nil nil (1 (if (equal (char-after (match-end 0)) ?\.) 'jde-java-font-lock-package-face (if (equal (char-before (match-end 0)) ?\*) 'jde-java-font-lock-number-face 'font-lock-type-face))))) ) ;; Fontify user's defined names (jde-java-font-lock-api-keywords rebuild) ;;; Compatibility (if (featurep 'xemacs) java-font-lock-keywords-2 ;; Remove existing javadoc font lock keywords from FSF Emacs ;; `java-font-lock-keywords-3' (jde-java-font-lock-remove-javadoc-keywords java-font-lock-keywords-3)) ;;; Compatibility (if (featurep 'xemacs) nil ;; FSF Emacs don't fontify capitalized types so do it (list `(eval . (list (concat "\\<\\([" jde-java-font-lock-capital-letter "]\\sw*\\)\\>" "\\([ \t]*\\[[ \t]*\\]\\)*" "\\([ \t]*\\sw\\)") '(font-lock-match-c-style-declaration-item-and-skip-to-next (goto-char (match-beginning 3)) (goto-char (match-beginning 3)) (1 (if (match-beginning 2) font-lock-function-name-face font-lock-variable-name-face))))) (cons (concat "\\<\\([" jde-java-font-lock-capital-letter "]\\sw*\\)\\>" "\\([ \t]*\\[[ \t]*\\]\\)*" "\\([ \t]*\\sw\\)") '(1 font-lock-type-face)) '("\\<\\(new\\|instanceof\\)\\>[ \t]+\\(\\sw+\\)" 2 font-lock-type-face))) ;; Some extra fontification (list ;; Fontify numbers '("\\<[0-9]+[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>" . jde-java-font-lock-number-face) '("\\<[0-9]+[.][eE][-+]?[0-9]+[fFdD]?\\>" . jde-java-font-lock-number-face) '("\\<[0-9]+[.][fFdD]\\>" . jde-java-font-lock-number-face) '("\\<[0-9]+[.]" . jde-java-font-lock-number-face) '("[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>" . jde-java-font-lock-number-face) '("\\<[0-9]+[eE][-+]?[0-9]+[fFdD]?\\>" . jde-java-font-lock-number-face) '("\\<0[xX][0-9a-fA-F]+[lL]?\\>" . jde-java-font-lock-number-face) '("\\<[0-9]+[lLfFdD]?\\>" . jde-java-font-lock-number-face) ;; Fontify capitalised identifiers as constant (cons (concat "\\(\\b[" jde-java-font-lock-capital-letter "]+[" jde-java-font-lock-capital-letter-or-digit "]*\\b\\)") '(1 jde-java-font-lock-constant-face)) ;; Fontify text between `' in comments (jde-java-font-lock-quote-keyword)) ;; Fontify javadoc comments (list ;; Fontify javadoc tags (including non official ones) (jde-java-font-lock-javadoc-tag-keyword) ;; Fontify @param variable name (jde-java-font-lock-javadoc-param-name-keyword) ;; Fontify @exception or @throws exception type (jde-java-font-lock-javadoc-exception-type-keyword) ;; Fontify @docRoot (jde-java-font-lock-javadoc-docroot-keyword) ;; Fontify @link (jde-java-font-lock-javadoc-link-keyword) ;; Fontify @see reference (jde-java-font-lock-javadoc-see-ref-keyword) ;; Fontify the text of a HREF anchor (jde-java-font-lock-html-ahref-keyword) ;; Fontify <b> and <strong> style text (jde-java-font-lock-html-bold-keyword) ;; Fontify <i> and <em> style text (jde-java-font-lock-html-italic-keyword) ;; Fontify <u> style text (jde-java-font-lock-html-underline-keyword) ;; Fontify <code> style text (jde-java-font-lock-html-code-keyword) ;; Fontify <pre> style text (jde-java-font-lock-html-pre-keyword)) )) ;; Update fontification of buffers in `java-mode' and `jde-mode' (and (interactive-p) (jde-java-font-lock-refontify))) ;; Setup `java-font-lock-keywords-4' (jde-java-font-lock-setup-keywords) ;; Define new defaults for Font Lock mode (defconst jde-java-font-lock-defaults (let ((java-defaults (if (featurep 'xemacs) (get 'java-mode 'font-lock-defaults) (cdr (assq 'java-mode font-lock-defaults-alist))))) (cons (append (car java-defaults) '(java-font-lock-keywords-4)) (cdr java-defaults))) "Defaults for Font Lock mode specified by the major mode. Add `java-font-lock-keywords-4' level to Java `font-lock-defaults'.") ;;;; ;;;; `java-mode' hook to setup syntax coloring. ;;;; Tested on GNU Emacs 20.7 and 21.1, and XEmacs 21.1 and 21.4. ;;;; (defun jde-setup-syntax-coloring() "Mode hook to setup syntax coloring in `java-mode' and `jde-mode'. When `jde-use-font-lock' is non-nil syntax coloring is always turned on and uses `java-font-lock-keywords-4' extra level of fontification. If `jde-use-font-lock' is nil syntax coloring rules are those of standard `java-mode'." (when (or (featurep 'xemacs) ; Xemacs and Emacs 21 support (> emacs-major-version 20) ; colors on ordinary terminal. window-system) ; Others only on `window-system'. ;; If `jde-use-font-lock' is non-nil setup ;; `java-font-lock-keywords-4' extra level of fontification. (when jde-use-font-lock ;; Setup `font-lock-defaults' (set (make-local-variable 'font-lock-defaults) jde-java-font-lock-defaults) ;; Use the maximum decoration available (set (make-local-variable 'font-lock-maximum-decoration) t)) ;; Turn on Font Lock Mode as needed (based on parent `java-mode'). (let ((major-mode 'java-mode)) (if (featurep 'xemacs) (font-lock-set-defaults t) (if global-font-lock-mode (turn-on-font-lock-if-enabled)))) ;; Always turn on font locking if `jde-use-font-lock' is non-nil. (if jde-use-font-lock (turn-on-font-lock)))) (add-hook 'java-mode-hook #'jde-setup-syntax-coloring) (provide 'jde-java-font-lock) ;;; Change History: ;; ;; $Log: jde-java-font-lock.el,v $ ;; Revision 1.6 2001/06/05 04:54:49 paulk ;; Minor updates. ;; ;; Revision 1.5 2001/04/14 05:28:11 paulk ;; - All extra fontification added by jde-java-font-lock have a specific ;; face. So there is less font-lock implementation dependencies, ;; greater flexibility to setup a color theme, and fontification can be ;; kept consistent accross Emacs flavors :-) Notice that this change ;; may require to redo some face customization :( ;; ;; ;; - For convenience all specific jde-java-font-lock faces are in the ;; customization group `jde-java-font-lock-faces' which is a sub group ;; of `font-lock-highlighting-faces' (Emacs) or `font-lock-faces' ;; (XEmacs). ;; ;; ;; - Better fontification of numbers and imported package names. ;; ;; ;; - When used interactively the command ;; `jde-java-font-lock-setup-keywords' automatically update ;; fontification of all Java buffers. This is very useful when you ;; change your API file for example! ;; ;; ;; - The `jde-setup-syntax-coloring' is greatly enhanced. On Emacs, it ;; takes care of the current `global-font-lock-mode' setting. Also, it ;; no more use `font-lock-defaults-alist' (which is an obsolete ;; variable on Emacs 21) but the preferred `font-lock-defaults' way to ;; setup fontification. ;; ;; - Finally, jde-java-font-lock works in java-mode too and it can be ;; used standalone if needed. ;; ;; Contributed by David Ponce. ;; ;; Revision 1.4 2001/01/17 18:59:03 paulk ;; Font-locking improvements from David Ponce ;; ;; - You can now fontify user-defined identifiers with the new ;; jde-java-font-lock-api-face. These identifiers are read in the ;; file specified by the `jde-java-font-lock-api-file' option. ;; ;; The JDE provides a default file "jde-java-font-lock.api" to fontify class ;; names of the core 'java' and 'javax' packages (JDK 1.3) and servlet ;; API (JSDK 2.0). To enable this fontification just put this file on ;; your home directory, maybe modify it to suit your needs and execute ;; the command: ;; ;; M-x jde-java-font-lock-setup-keywords (or restart Emacs). ;; ;; To improve reloading a cache file of regular expressions matching ;; these names is created in the same directory (see the source for ;; more details). ;; ;; - Because the 'const' and 'goto' keywords are reserved, but not ;; currently used they are now fontified with `font-lock-warning-face'. ;; ;; - The 'default' keyword is now fontified with ;; `font-lock-keyword-face'. This was suggested by Stephane Nicolas ;; [EMAIL PROTECTED]>. ;; ;; Revision 1.3 2000/12/18 05:22:45 paulk ;; *** empty log message *** ;; ;; Revision 1.2 2000/10/10 06:41:47 paulk ;; Fixed some XEmacs compatibility problems. ;; ;; Revision 1.1 2000/10/08 12:53:22 paulk ;; Initial revision. ;; ;;; jde-java-font-lock.el ends here