Hello All,
Attached is an improved version of jde-java-font-lock.el. I
successfully use it with GNU Emacs 20.7, 21.0 and XEmacs 21.1.
The major change is that you can get now the same level of font
locking in both GNU Emacs and XEmacs (at least with the version 21.1 I
installed on my NT box).
Please try it :-)
Any feedback will be appreciated.
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.3 2000/12/18 05:22:45 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'.
;; This code has been tested with GNU 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.
;;; History:
;;
;; See at end of this file.
;;; Code:
(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)
;; Create a specific face for numbers
(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 'font-lock-highlighting-faces)
;; creates a specific face for links
(defface jde-java-font-lock-link-face
'((t (:foreground "blue" :italic nil :underline t)))
"Font Lock mode face used to highlight links."
:group 'font-lock-highlighting-faces)
;;; Compatibility
(if jde-xemacsp
(progn
(defvar font-lock-builtin-face 'font-lock-builtin-face
"Face name to use for builtins.")
(defface font-lock-builtin-face
'((t (:foreground "blue" :italic nil :underline t)))
"Font Lock mode face used to highlight builtins."
:group 'font-lock-highlighting-faces)
(defvar font-lock-constant-face 'font-lock-constant-face
"Face name to use for constant and label names.")
(defface font-lock-constant-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 constants and labels."
:group 'font-lock-highlighting-faces)
))
;; Make new faces based on existing ones
(copy-face 'bold 'jde-java-font-lock-bold-face)
(copy-face 'italic 'jde-java-font-lock-italic-face)
(copy-face 'underline 'jde-java-font-lock-underline-face)
(copy-face 'default 'jde-java-font-lock-pre-face)
(copy-face 'font-lock-builtin-face 'jde-java-font-lock-code-face)
;; 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-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.")
;; Setup extra java font lock keywords
(defconst java-font-lock-keywords-4 nil
"Extra level highlighting for JDE mode.")
(setq java-font-lock-keywords-4
(append
;; XEmacs feature scoping: These must come first or the
;; Modifiers and Packages from keywords-1 will catch them.
(list
;; Fontify modifiers.
(cons
(concat "\\<\\("
(eval-when-compile
(regexp-opt '("abstract" "const" "final" "synchronized"
"transient" "static" "volatile" "public"
"private" "protected" "native")))
"\\)\\>")
'font-lock-builtin-face)
;; Fontify capitalised identifiers as constant
'("\\b[A-Z_]+[A-Z0-9_]*\\b" . font-lock-constant-face)
;; Fontify package names in import and package directives.
'("\\<\\(import\\|package\\)\\>[ \t]*\\(\\sw+\\)?"
(1 font-lock-keyword-face)
(2 font-lock-constant-face nil t)
("\\=\\.\\(\\*\\|\\sw+\\)" nil nil
(1 font-lock-constant-face nil t)))
)
java-font-lock-keywords-3
(list
;; Fontify numbers
(cons
(concat "\\b\\(0[xX][0-9a-fA-F]+[lL]?\\|[0-9]+\\.?[0-9]*"
"\\([eE][-+]?[0-9]+\\)?\\([lL]\\|[fF]\\|[dD]\\)?\\)\\b")
'jde-java-font-lock-number-face)
(cons
(concat "\\b\\(\\.[0-9]+"
"\\([eE][-+]?[0-9]+\\)?\\([lL]\\|[fF]\\|[dD]\\)?\\)\\b")
'jde-java-font-lock-number-face)
;; Fontify text between `' in comments
'("`\\(.*\\)'"
1 font-lock-constant-face prepend)
;; Fontify javadoc tags within comments
(list
(concat "@\\("
"author\\|deprecated\\|exception"
"\\|link\\|return\\|see\\|serial\\|serialData\\|serialField"
"\\|since\\|throws"
"\\|version"
"\\)\\>")
'(1 font-lock-constant-face t))
'("{@\\(docRoot\\)}"
1 font-lock-constant-face t)
'("{@\\(link\\)\\>\\s-+\\(.*\\)\\s-*}"
(1 font-lock-constant-face t)
(2 jde-java-font-lock-link-face t))
;; Basic HTML highlighting in javadoc comments
;; Fontify the text of a HREF anchor
'("<[Aa]\\s-+[Hh][Rr][Ee][Ff][^>]*>\\([^>]+\\)</[Aa]>"
1 jde-java-font-lock-link-face t)
;; Fontify <b>, <strong>, <i>, <u>, <code> and <pre> tags when
;; no tags inside
'("<[Ss][Tt][Rr][Oo][Nn][Gg]>\\([^<]*\\)</[Ss][Tt][Rr][Oo][Nn][Gg]>"
1 jde-java-font-lock-bold-face t)
'("<[Bb]>\\([^<]*\\)</[Bb]>"
1 jde-java-font-lock-bold-face t)
'("<[Ii]>\\([^<]*\\)</[Ii]>"
1 jde-java-font-lock-italic-face t)
'("<[Uu]>\\([^<]*\\)</[Uu]>"
1 jde-java-font-lock-underline-face t)
'("<[Cc][Oo][Dd][Ee]>\\([^<]*\\)</[Cc][Oo][Dd][Ee]>"
1 jde-java-font-lock-code-face t)
'("<[Pp][Rr][Ee]>\\([^<]*\\)</[Pp][Rr][Ee]>"
1 jde-java-font-lock-pre-face t))
))
;; Setup JDE mode for font locking
(if jde-xemacsp
(progn
(put 'jde-mode 'font-lock-defaults
'((java-font-lock-keywords
java-font-lock-keywords-1
java-font-lock-keywords-2
java-font-lock-keywords-3
java-font-lock-keywords-4)
nil nil ((?_ . "w")) beginning-of-defun
(font-lock-mark-block-function . mark-defun))))
(progn
(font-lock-add-keywords 'jde-mode java-font-lock-keywords)
(font-lock-add-keywords 'jde-mode java-font-lock-keywords-1)
(font-lock-add-keywords 'jde-mode java-font-lock-keywords-2)
(font-lock-add-keywords 'jde-mode java-font-lock-keywords-3)
(font-lock-add-keywords 'jde-mode java-font-lock-keywords-4)))
(defun jde-setup-syntax-coloring()
"Set up JDE mode syntax coloring."
(cond (window-system
;; If not XEmacs 20.1 turn on font lock.
;; (XEmacs 21 has font-lock on by default.)
(if (or
(not jde-xemacsp)
(not
(and
(eq emacs-major-version 21)
(eq emacs-minor-version 0))))
(turn-on-font-lock))
(setq font-lock-maximum-decoration t)
(if (not jde-xemacsp)
(global-font-lock-mode 1 t))
)))
(provide 'jde-java-font-lock)
;;; Change History:
;;
;; $Log: jde-java-font-lock.el,v $
;; 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