changeset 4390:faf739d1d572

Version 2.7 from stig.
author Richard M. Stallman <rms@gnu.org>
date Sun, 01 Aug 1993 06:26:18 +0000
parents 102019d30432
children 2f181ad12c41
files lisp/hilit19.el
diffstat 1 files changed, 266 insertions(+), 419 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/hilit19.el	Sun Aug 01 06:04:06 1993 +0000
+++ b/lisp/hilit19.el	Sun Aug 01 06:26:18 1993 +0000
@@ -1,7 +1,7 @@
-;; hilit19.el, Beta 1.9 -- customizable highlighting for Emacs19.
+;; hilit19.el (Release 2.7) -- customizable highlighting for Emacs19.
 ;; Copyright (c) 1993 Free Software Foundation, Inc.
 ;;
-;; Author:  Jonathan Stigelman <Stig@netcom.com>
+;; Author:   Jonathan Stigelman <Stig@netcom.com>
 ;; Keywords: faces
 ;; 
 ;; This program is free software; you can redistribute it and/or modify
@@ -21,13 +21,15 @@
 
 ;;; Commentary:
 
-;; hilit19.el, Beta 1.9 -- customizable highlighting for Emacs19.
-;; Supports not only source code highlighting, but also rmail, VM, and gnus.
-
-;; WHERE TO GET THE LATEST VERSION OF HILIT19.EL (possibly beta), 
+;; Hilit19.el is a customizable highlighting package for Emacs19.  It supports
+;; not only source code highlighting, but also Info, RMAIL, VM, gnus...
+;; Hilit19 knows (or thinks it knows) how to highlight emacs buffers in
+;; about 25 different modes.
+;; 
+;; WHERE TO GET THE LATEST VERSIONS OF HILIT19.EL (beta and release), 
 ;; PLUS LOTS OF OTHER *WAY COOL* STUFF VIA ANONYMOUS FTP:
 ;;
-;;      netcom.com:/pub/stig/src/hilit19.el.gz
+;;      netcom.com:/pub/stig/src/{Beta,Release}/hilit19.el.gz
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
@@ -37,15 +39,12 @@
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; $Id: hilit19.el,v 1.34 1993/07/23 05:18:37 stig Exp stig $
+;; hilit19.el,v 2.7 1993/07/30 02:43:01 stig Release
 ;;
 ;; LCD Archive Entry:
-;; emacs19/hilit19.el|Jonathan Stigelman|Stig@netcom.com
-;; |Comprehensive (and comparatively fast) regex-based highlighting for Emacs 19
-;; Thu Jul 22 21:03:46 1993|Beta 1.9||
+;; hilit19|Jonathan Stigelman|Stig@netcom.com|
+;; Comprehensive (and comparatively fast) regex-based highlighting for Emacs 19|
+;; 1993/07/30 02:43:01|Release 2.7|~/packages/hilit19.el.Z|
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
@@ -73,10 +72,20 @@
 ;;
 ;; SETUP -- In your .emacs:
 ;;
-;;      (require 'hilit19)		; not intended to be autoloaded
-;;
-;;      (setq hilit-mode-enable-list '(not text-mode))
-;;
+;; 
+;; (cond (window-system
+;;        (setq hilit-mode-enable-list  '(not text-mode)
+;;              hilit-background-mode   'light
+;;              hilit-inhibit-hooks     nil
+;;              hilit-inhibit-rebinding nil)
+;; 
+;;        (require 'hilit19)
+;;        ))
+;; 
+;; If you like font-lock-mode and want to use both packages, then you can
+;; disable hilit for the modes in which you want to use font-lock by listing
+;; said modes in hilit-mode-enable-list.
+;; 
 ;;      (hilit-translate type     'RoyalBlue   ; enable highlighting in C/C++
 ;;			 string	  nil)         ; disable string highlighting
 ;;
@@ -121,15 +130,25 @@
 ;;
 ;; KNOWN BUGS/TO DO LIST/HELP WANTED/APPLY WITHIN
 ;;
-;; * unbalanced double quote characters can confuse hilit19.  This will be
-;;   fixed, so don't bug me about it.
+;; * When more than one size of font is used in different frames, only one
+;;   font size can have bold & italic properties.
+;;
+;; * When identifiers such as remove_switch_entry, ar highlighted in C/C++,
+;;   imbedded keywords--"switch" in this case--are highlighted.  I don't
+;;   personally see this problem because I modify the syntax for C/C++ so that
+;;   ?_ is a word character "w".  This also means that forward-word skips over
+;;   entire variables.  This will be fixed when I generalize the highlighting
+;;   patterns.
 ;;
-;; * ALTHOUGH HILIT19 IS FASTER THAN FONT-LOCK-MODE, for various reasons,
-;;   the speed of the package could still stand to be improved.  If you care
-;;   to do a little profiling and make things tighter...
+;; * unbalanced, unescaped double quote characters can confuse hilit19.
+;;   This will be fixed, so don't bug me about it.
 ;;
-;; * hilit-toggle-highlight is flaky in large buffers where auto-rehighlight
-;;   is numeric after toggling twice, it loses it's numeric value
+;; * ALTHOUGH HILIT19 IS FASTER THAN FONT-LOCK-MODE...
+;;   For various reasons, the speed of the package could still stand to be
+;;   improved.  If you care to do a little profiling and make things tighter...
+;;
+;; * hilit-toggle-highlight is flaky when auto-rehighlight is neither t nor nil.
+;;   Does anyone actually USE this?  I think I might just remove it.
 ;;
 ;; PROJECTS THAT YOU CAN TAKE OVER BECAUSE I DON'T MUCH CARE ABOUT THEM...
 ;;
@@ -140,135 +159,66 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;; Thanks to the following people for their input:
-;;	ebert@enpc.enpc.fr (Rolf EBERT), ada, LaTeX & bibtex highlights
-;;	Vivek Khera <khera@cs.duke.edu>, gnus hooks + random advice & patches
-;;	brian@athe.WUstl.EDU (Brian Dunford-Shore), prolog highlights
-;;	John Ladwig <jladwig@soils.umn.edu>, 1st pass nroff highlights
-;;	campo@sunthpi3.difi.unipi.it (Massimo Campostrini), fortran highlights
-;;	jayb@laplace.MATH.ColoState.EDU (Jay Bourland), 1st pass dired
-;;	Yoshio Turner <yoshio@CS.UCLA.EDU>, modula 2 highlights
-;;	Fritz Knabe <knabe@ecrc.de>, advice & patches
-;;	Alon Albert <alon@milcse.rtsg.mot.com>, advice & patches
-;;	dana@thumper.bellcore.com (Dana A. Chee), for breaking it...
-;;      derway@ndc.com (Don Erway), for breaking it...
+;;    ebert@enpc.enpc.fr (Rolf EBERT), ada, LaTeX & bibtex highlights
+;;    Vivek Khera <khera@cs.duke.edu>, gnus hooks + random advice & patches
+;;    brian@athe.WUstl.EDU (Brian Dunford-Shore), prolog highlights
+;;    John Ladwig <jladwig@soils.umn.edu>, 1st pass nroff highlights
+;;    campo@sunthpi3.difi.unipi.it (Massimo Campostrini), fortran highlights
+;;    jayb@laplace.MATH.ColoState.EDU (Jay Bourland), 1st pass dired
+;;    Yoshio Turner <yoshio@CS.UCLA.EDU>, modula 2 highlights
+;;    Fritz Knabe <knabe@ecrc.de>, advice & patches
+;;    Alon Albert <alon@milcse.rtsg.mot.com>, advice & patches
+;;    dana@thumper.bellcore.com (Dana A. Chee), working on the multi-frame bug
+;;    derway@ndc.com (Don Erway), for breaking it...
 ;;
 ;; With suggestions and minor regex patches from numerous others...
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
-;; HISTORY 
+;; hilit19.el,v
+;; Revision 2.7  1993/07/30  02:43:01  stig
+;; added const to the list of modifiers for C/C++ types
+;;
+;; Revision 2.6  1993/07/30  00:30:54  stig
+;; now permit selection of arbitrary subexpressions for highlighting...
+;; fixed keyword patterns for C/C++ using this technique.
+;;
+;; Revision 2.5  1993/07/28  05:02:56  stig
+;; improvements to makefile regular expressions
+;; removed about 130 lines just by compacting the big defconst for
+;;   hilit-face-translation-table into a mapcar and defining a separate table
+;;   of default faces.
+;;
+;; Revision 2.4  1993/07/27  14:09:05  stig
+;; documented another "known problem" to "head off gripe mail at the pass."
+;;
+;; Revision 2.3  1993/07/27  02:15:49  stig
+;; (hilit-lookup-face-create) incorporated patch which improves it's behavior
+;; with more than one frame...  Still can't have bold on the same face in two
+;; differrent fonts sizes at the same time...
 ;;
-;; V1.9  21-July-1993		Stig@netcom.com
-;;   better documentation and added the function hilit-submit-feedback.
-;;   no longer rebind ^L, now C-S-l (control shift l) repaints the buffer
-;;   multi-line highlights no longer cause problems when
-;;      hilit-auto-rehighlight is 'visible
-;;   added hilit-predefined-face-list...
-;;   changed name of hilit-mode-alist to hilit-patterns-alist
-;;   added hilit-message-quietly to mail-setup-hook
-;;   added hilit-parser-alist which can be used to apply different patterns to
-;;      different parts of a buffer.  This could be integrated in a far more
-;;      elegant manner, but it presently serves the purpose of not applying
-;;      message header patterns to message bodies in mail-mode and it's kin.
-;;   hilit-set-mode-patterns now takes a list of modes and an optional parse-fn
-;; V1.8  19-July-1993		Stig@netcom.com
-;;   changed hilit-translate to be a macro so that now it mirrors setq
-;;   now permit multiple layers of face-translation...
-;;   hilit-lookup-face-create now parses background colors
-;;   added code to check for face changes and recopy the fonts from 'default
-;;      when necessary.  this can be disabled if you never change fonts.
-;;      you should be able to change fonts, redraw, and have all of your
-;;      bold & italic faces back to normal.  Should work in new frames as well.
-;;   fixed typo for one of the vm hooks and included the magic patch to
-;;      vm5.33 that keeps the summary window up to date.
-;;   got rid of the annoying dings and delays when colors aren't available
-;;   set case-fold-search to nil in highlighting-region function
-;;   fixed minor bug in hilit-rehighlight-message-quietly
-;;   patches to Info, LaTeX, fortran, nroff, & c++ patterns
-;;   modula-2-mode support
-;;   improved gnus-mark-article-hook
-;;   moved timecard-mode highlights to timecard-mode itself
-;; V1.7  12-July-1993		Stig@netcom.com
-;;   fix to dired patterns
-;;   punted on the dual functionality in hilit-auto-highlight and added
-;;     hilit-mode-enable-list, which permits users to specifically lock out
-;;     modes by preventing them from being added into the hilit-mode-list
-;;   incorporated defaults for dark backgrounds (see hilit-background-mode)
-;;   incorporated fortran highlighting patterns
-;;   patches to ada-mode and msg-header regexes
-;;   added msg-separator pattern
-;;   changed dired-backup to dired ignored which (which is derived from the
-;;     variable completion-ignored-extensions)
-;; V1.6  5-July-1993		Stig@netcom.com
-;;   added dired patterns
-;;   fixed minor typo bug in mail patterns
-;;   added profiling hook
-;; V1.5  5-July-1993		Stig@netcom.com
-;;   changed behavior of hilit-recenter to more closely match that of recenter
-;;   hilit-auto-highlight can now be a list of major-modes to highlight on find
-;;   reverted to using overlays...the cost of text-properties is too high, IMHO
-;;   added 'visible option to hilit-auto-rehighlight variable
-;;   now highlighting support for info pages (see patch below)
-;;   added hilit-yank and hilit-yank-pop which replace their analogues
-;;   wrote special parsing function for strings...bug squished...faster too
-;;   tuned the texinfo patterns for better performance
-;;   nroff support
-;; V1.4  2-July-1993		Stig@netcom.com
-;;   more efficient highlighting for news and mail
-;;   switched to text properties (this may be temporary)
-;;   changed regular expressions for c*mode to accomodate syntax tables
-;;   minor mod to Ada parameter regexp
-;;   now catch regex stack overflows and print an error
-;;   string matching now uses start and end expressions to prevent overflows
-;; V1.3 28-June-1993		Stig@netcom.com
-;;   added support for hexadecimal color specification under X
-;;   added hilit-translate for simple color translations
-;;   changed coverage of hilit-quietly...when it's quiet, it's always quiet.
-;;   removed extra call to unhighlight-region in rehighlight-buffer
-;;   automatically installs hooks, unless hilit-inhibit-hooks set before load
-;;   installed fixes for latex
-;; V1.2 28-June-1993		Stig@netcom.com
-;;   partially fixed bug in hilit-toggle-highlight
-;;   added string highlighting
-;;   fixed bug in hilit-lookup-face-create
-;;   additions for Ada, Tex, LaTeX, and Texinfo (is scribe next? =)
-;;   now highlight template decls in C++
-;;   added reverse-* intelligence to hilit-lookup-face-create
-;;   imported wysiwyg (overstrike replacement) stuff from my hacks to man.el
-;;   sketched out a stub of a wysiwyg write file hook, care to finish it?
-;; V1.1	25-June-1993		Stig@netcom.com
-;;   replaced last vestiges of original hilit.el
-;;   now map default modes to major-mode values
-;;   reworked face allocation so that colors don't get tied up
-;;   rewrote some comments that I'd put in earlier but somehow managed to nuke
-;; V1.0 22-June-1993		Stig@netcom.com
-;;   incrementally replaced just about everything...simpler, cleaner, & faster
-;;   extended highlight coverage for C/C++ modes (highlight more things)
-;;   added layer of indirection to face selection
+;; Revision 2.2  1993/07/27  02:02:59  stig
+;; vastly improved the makefile patterns
+;; added hook for mh-show-mode
+;;
+;; Revision 2.1  1993/07/24  17:46:21  stig
+;; Phasing out Info-select-hook...  Version 19.18 will use Info-selection-hook.
+;;
+;; Revision 2.0  1993/07/24  13:50:10  stig
+;; better documentation and added the function hilit-submit-feedback.
+;; C-S-l (control shift l) repaints the buffer.  Other bindings are optional.
+;; multi-line highlights no longer cause problems when
+;;   hilit-auto-rehighlight is 'visible
+;; added hilit-predefined-face-list...
+;; changed name of hilit-mode-alist to hilit-patterns-alist
+;; added hilit-message-quietly to mail-setup-hook
+;; added hilit-parser-alist which can be used to apply different patterns to
+;;   different parts of a buffer.  This could be integrated in a far more
+;;   elegant manner, but it presently serves the purpose of not applying
+;;   message header patterns to message bodies in mail-mode and it's kin.
+;; hilit-set-mode-patterns now takes a list of modes and an optional parse-fn
+;;
 
-;;;;;; THIS WILL ALLOW INFO PAGES TO BE HILIGHTED:
-;;
-;; *** 19.15/info.el       Sat Jun 19 14:47:06 1993
-;; --- 19/info.el  Sun Jul  4 03:33:12 1993
-;; ***************
-;; *** 475,481 ****
-;;                                   (setq active-expression
-;;                                         (read (current-buffer))))))
-;;                          (point-max)))
-;; !      (if Info-enable-active-nodes (eval active-expression)))))
-;;   
-;;   (defun Info-set-mode-line ()
-;;     (setq mode-line-buffer-identification
-;; --- 475,482 ----
-;;                                   (setq active-expression
-;;                                         (read (current-buffer))))))
-;;                          (point-max)))
-;; !      (if Info-enable-active-nodes (eval active-expression)))
-;; !    (run-hooks 'Info-select-hook)))
-;;   
-;;   (defun Info-set-mode-line ()
-;;     (setq mode-line-buffer-identification
-;;
 ;;;;;; AND THIS CAN BE APPLIED TO VM 5.33L_19
 ;; 
 ;; *** ../site/vm5.33L_19/vm-summary.el    Fri Jun  4 22:17:11 1993
@@ -301,20 +251,6 @@
 (defvar hilit-quietly nil
   "* If non-nil, this inhibits progress indicators during highlighting")
 
-(defvar hilit-inhibit-hooks nil
-  "* If non-nil, this inhibits installation of hooks for Info, gnus, & vm.")
-
-(defvar hilit-background-mode 'light
-  "* 'mono inhibits color, 'dark or 'light indicate the background brightness.")
-
-(defvar hilit-mode-enable-list nil
-  "* If a list of modes to exclusively enable or specifically disable.
-The sense of the list is negated if it begins with the symbol 'not'.
-Set this variable before you load hilit19.
-
-Ex:  (perl-mode jargon-mode c-mode)	; just perl, C, and jargon modes
-     (not text-mode)			; all modes except text mode")
-
 (defvar hilit-auto-highlight t
   "* T if we should highlight all buffers as we find 'em, nil to disable
   automatic highlighting by the find-file hook.")
@@ -324,24 +260,42 @@
 
 (defvar hilit-auto-rehighlight t
   "* If this is non-nil, then hilit-redraw and hilit-recenter will also
-  rehighlight part or all of the current buffer.  T will rehighlights the
-  whole buffer, a NUMBER will rehighlight that many lines before and
-  after the cursor, or the symbol 'visible' will rehighlight only the visible
-  portion of the current buffer.")
+  rehighlight part or all of the current buffer.  T will rehighlight the
+  whole buffer, a NUMBER will rehighlight that many lines before and after
+  the cursor, and the symbol 'visible' will rehighlight only the visible
+  portion of the current buffer.  This variable is buffer-local.")
 
 (make-variable-buffer-local 'hilit-auto-rehighlight)
-(setq-default hilit-auto-rehighlight t)
 
 (defvar hilit-auto-rehighlight-fallback '(20000 . 100)
   "* Cons of the form (THRESHOLD . FALLBACK), where FALLBACK is assigned to
-hilit-auto-rehighlight if the size of a newly opened buffer is larger than
-THRESHOLD.")
+  hilit-auto-rehighlight if the size of a newly opened buffer is larger than
+  THRESHOLD.")
 
 (defvar hilit-face-check t
   "* T slows down highlighting but permits the user to change fonts without
-losing bold and italic faces...  T causes hilit-lookup-face-create to dig
-through the frame parameters for the current window every time it's called.
-If you never change fonts in emacs, set this to NIL.")
+  losing bold and italic faces...  T causes hilit-lookup-face-create to dig
+  through the frame parameters for the current window every time it's called.
+  If you never change fonts in emacs, set this to NIL.")
+
+;; Variables which must be set before loading hilit19.
+
+(defvar hilit-inhibit-rebinding nil
+  "If non-nil, this inhibits replacement of recenter, yank, and yank-pop.")
+
+(defvar hilit-inhibit-hooks nil
+  "If non-nil, this inhibits installation of hooks for Info, gnus, & vm.")
+
+(defvar hilit-background-mode 'light
+  "'mono inhibits color, 'dark or 'light indicate the background brightness.")
+
+(defvar hilit-mode-enable-list nil
+  "If a list of modes to exclusively enable or specifically disable.
+The sense of the list is negated if it begins with the symbol 'not'.
+Set this variable before you load hilit19.
+
+Ex:  (perl-mode jargon-mode c-mode)	; just perl, C, and jargon modes
+     (not text-mode)			; all modes except text mode")
 
 ;; Variables that are not generally modified directly
 
@@ -362,7 +316,7 @@
 See the hilit-lookup-face-create documentation for valid face names.")
 
 (defvar hilit-predefined-face-list (face-list)
-  "List of faces which with hilit-lookup-face-create will NOT tamper.
+  "List of faces with which hilit-lookup-face-create will NOT tamper.
 
 If hilit19 is dumped into emacs at your site, you may have to set this in
 your init file.")
@@ -370,14 +324,16 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Use this to report bugs:
 
+(eval-when-compile (require 'reporter))	; no compilation gripes
+
 (defun hilit-submit-feeback ()
-  "Submit via mail a bug report on stig-paren"
+  "Submit feedback on hilit19 to the author: Stig@netcom.com"
   (interactive)
   (require 'reporter)
   (and (y-or-n-p "Do you really want to submit a report on hilit19? ")
        (reporter-submit-bug-report
 	"Jonathan Stigelman <Stig@netcom.com>"
-	"hilit19.el Beta 1.9 ($Revision: 1.34 $)"
+	"hilit19.el (Release 2.7)"
 	(and (y-or-n-p "Do you need to include a dump hilit variables? ")
 	     (append
 	      '(
@@ -395,14 +351,16 @@
 		     ))))
 	 (function
 	  (lambda ()
-	    (insert "\nFrame Configuration:\n====================\n"
-		    (prin1-to-string (frame-configuration-to-register ?F))
-		    "\n"
-		    )))
+	    (and (y-or-n-p "Is this a problem with font display? ")
+		 (insert "\nFrame Configuration:\n====================\n"
+			 (prin1-to-string (frame-configuration-to-register ?F))
+			 "\n"
+			 ))))
 	 nil
 	 (concat
-	  "This is (check all that apply, or delete those that don't):\n"
+	  "This is (check all that apply, and delete what's irrelevant):\n"
 	  "  [ ] a _MASSIVE_THANK_YOU_ for writing hilit19.el\n"
+	  "  [ ] An invitation to attend the next Hackers Conference\n"
 	  "  [ ] my DONATION to your vacation fund (prototype digital cash)\n"
 	  "  [ ] You're a RIGHTEOUS HACKER, what are your rates?\n"
 	  "  [ ] I've used the force and read the source, but I'M CONFUSED\n"
@@ -413,211 +371,83 @@
 	  "       for a newer release that fixes the problem.\n"
 	  "  [ ] ADVICE -- or an unfulfilled desire that I suspect you share\n"
 	  "\n"
-	  "Hey Stig, do you do anything besides hack emacs?\n"))))
+	  "Hey Stig, I *know* you're busy but...\n"))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;; These faces are either a valid face name, or nil
 ;; if you want to change them, you must do so AFTER hilit19 is loaded
 
-(defconst hilit-face-translation-table
-  (cond ((and (eq hilit-background-mode 'light) (x-display-color-p))
-	 ;; COLOR DEFAULTS for LIGHT backgrounds
-	 '(
-	   ;; used for C/C++ and elisp and perl
-	   (comment	. firebrick-italic)
-	   (include	. purple)
-	   (define	. ForestGreen-bold)
-	   (defun	. blue-bold)
-	   (decl	. RoyalBlue)
-	   (type	. nil)
-	   (keyword	. RoyalBlue)
-	   (label	. red-bold)
-	   (string	. grey40)
-
-	   ;; some further faces for Ada
-	   (struct	. black-bold)
-	   (glob-struct	. magenta)
-	   (named-param	. DarkGoldenrod)
-	
-	   ;; and anotherone for LaTeX
-	   (crossref	. DarkGoldenrod)
- 
-	   (wysiwyg-bold   . bold)
-	   (wysiwyg-underline . underline)
-
-	   ;; compilation buffers
-	   (error	. red-bold)
-	   (warning	. firebrick)
-
-	   ;; Makefiles (some faces borrowed from C/C++ too)
-	   (rule	. blue-bold)
-
-	   ;; VM, GNUS and Text mode
-	   (msg-subject	. blue-bold)
-	   (msg-from	. purple-bold) 
-	   (msg-header	. firebrick-bold)
-	   (msg-separator  . black/tan-bold)
-	   (msg-quote	. ForestGreen)
-
-	   (summary-seen	. grey40)
-	   (summary-killed	. grey50)
-	   (summary-Xed		. OliveDrab2)
-	   (summary-current	. default/skyblue-bold)
-	   (summary-deleted	. firebrick)
-	   (summary-unread	. RoyalBlue)
-	   (summary-new		. blue-bold)
-
-	   (gnus-group-unsubscribed . grey50)
-	   (gnus-group-empty	. nil)
-	   (gnus-group-full	. ForestGreen)
-	   (gnus-group-overflowing	. firebrick)
-
-	   ;; dired mode
-	   (dired-directory 	. blue-bold)
-	   (dired-link		. firebrick-italic)
-	   (dired-ignored	. ForestGreen)
-	   (dired-deleted	. red-bold-italic)
-	   (dired-marked	. purple)
-	
-	   ;; see jargon-mode.el and prep.ai.mit.edu:/pub/gnu/jargon*.txt
-	   (jargon-entry	. blue-bold)
-	   (jargon-xref		. purple-bold)
-	   ;; really used for Info-mode
-	   (jargon-keyword	. firebrick-underline)
-	   ))
-	((and (eq hilit-background-mode 'dark) (x-display-color-p))
-	 ;; COLOR DEFAULTS for DARK backgrounds
-	 '(
-	   ;; used for C/C++ and elisp and perl
-	   (comment	. moccasin)
-	   (include	. Plum1)
-	   (define	. green)
-	   (defun	. cyan-bold)
-	   (decl	. cyan)
-	   (type	. yellow)
-	   (keyword	. cyan)
-	   (label	. orange-underlined)
-	   (string	. orange)
-	
-	   ;; some further faces for Ada
-	   (struct	. white-bold)
-	   (glob-struct	. Plum1)
-	   (named-param	. Goldenrod)
-	
-	   ;; and anotherone for LaTeX
-	   (crossref	. Goldenrod)
-	
-	   (wysiwyg-bold   . bold)
-	   (wysiwyg-underline . underline)
-	
-	   ;; compilation buffers
-	   (error	. yellow)
-	   (warning	. green)
-	
-	   ;; Makefiles (some faces borrowed from C/C++ too)
-	   (rule		. cyan)
+(defconst hilit-default-face-table
+  '(
+    ;; used for C/C++ and elisp and perl
+    (comment	firebrick-italic    moccasin           italic)
+    (include	purple		    Plum1	       default-bold-italic)
+    (define	ForestGreen-bold    green	       bold)
+    (defun	blue-bold	    cyan-bold	       default-bold-italic)
+    (decl	RoyalBlue	    cyan	       bold)
+    (type	nil		    yellow	       nil)
+    (keyword	RoyalBlue	    cyan	       default-bold-italic)
+    (label	red-bold	    orange-underlined  underline)
+    (string	grey40		    orange	       underline)
+    
+    ;; some further faces for Ada
+    (struct	  black-bold        white-bold	       bold)
+    (glob-struct  magenta	    Plum1	       default-bold-underline)
+    (named-param  DarkGoldenrod	    Goldenrod	       underline)
 	
-	   ;; VM, GNUS and Text mode
-	   (msg-subject		. yellow)
-	   (msg-from		. SeaGreen2)
-	   (msg-header		. cyan)
-	   (msg-separator	. lightblue)
-	   (msg-quote		. green)
-	
-	   (summary-seen	. white)
-	   (summary-killed	. white)
-	   (summary-Xed		. green)
-	   (summary-current	. green-bold)
-	   (summary-deleted	. white)
-	   (summary-unread	. yellow)
-	   (summary-new		. yellow-bold)
-	
-	   (gnus-group-unsubscribed . white)
-	   (gnus-group-empty	. yellow)
-	   (gnus-group-full	. green)
-	   (gnus-group-overflowing . orange)
+    ;; and anotherone for LaTeX
+    (crossref	  DarkGoldenrod	    Goldenrod	       underline)
+ 
+    ;; compilation buffers
+    (active-error default/pink-bold  default/DeepPink-bold  bold-underline)
+    (error	  red-bold           yellow		    bold)
+    (warning	  blue-italic	     green		    italic)
 
-	   ;; dired mode
-	   (dired-directory	. cyan)
-	   (dired-link		. green)
-	   (dired-ignored	. moccasin)
-	   (dired-deleted	. orange)
-	   (dired-marked	. Plum1)
+    ;; Makefiles (some faces borrowed from C/C++ too)
+    (rule	  blue-bold-underline cyan-underline   bold-underline)
+    
+    ;; VM, GNUS and Text mode
+    (msg-subject    blue-bold       yellow             bold)
+    (msg-from	    purple-bold	    SeaGreen	       bold)
+    (msg-header	    firebrick-bold  cyan	       italic)
+    (msg-separator  black/tan-bold  lightblue	       nil)
+    (msg-quote	    ForestGreen	    green	       italic)
 
-	   ;; see jargon-mode.el and prep.ai.mit.edu:/pub/gnu/jargon*.txt
-	   (jargon-entry	. cyan)
-	   (jargon-xref		. Plum1)
-	   ;; really used for Info-mode
-	   (jargon-keyword	. yellow)
-	   ))
-	(t
-	 ;; MONO DEFAULTS -- you lose
-	 '(
-	   ;; used for C/C++ and elisp and perl
-	   (comment       . italic)
-	   (include       . default-bold-italic)
-	   (define        . bold)
-	   (defun         . default-bold-italic)
-	   (decl          . bold)
-	   (type          . nil)
-	   (keyword       . default-bold-italic)
-	   (label         . underline)
-	   (string        . underline)
+    (summary-seen     grey40	    white	       nil)
+    (summary-killed   grey50	    white	       nil)
+    (summary-Xed      OliveDrab2    green	       nil)
+    (summary-deleted  firebrick	    white	       italic)
+    (summary-unread   RoyalBlue	    yellow	       bold)
+    (summary-new      blue-bold	    yellow-bold	       default-bold-italic)
+    (summary-current  default/skyblue-bold green/LightGrey-bold reverse-default)
 
-	   ;; some further faces for Ada
-	   (struct	  . bold)
-	   (named-param   . underline)
-	   (glob-struct   . default-bold-underline)
-      
-	   ;; and another one for LaTeX
-	   (crossref	  . underline)
-
-	   (wysiwyg-bold  . bold)
-	   (wysiwyg-underline . underline)
-
-	   ;; compilation buffers
-	   (error         . bold)
-	   (warning       . italic)
-
-	   ;; Makefiles (some faces borrowed from C/C++ too)
-	   (rule          . bold)
-
-	   ;; VM, GNUS and Text mode
-	   (msg-subject   . bold)
-	   (msg-from	  . bold)
-	   (msg-header    . italic)
-	   (msg-separator . nil)
-	   (msg-quote     . italic)
+    (gnus-group-unsubscribed grey50		white	    nil)
+    (gnus-group-empty	     nil		yellow	    nil)
+    (gnus-group-full	     ForestGreen	green	    italic)
+    (gnus-group-overflowing  firebrick		orange	    default-bold-italic)
 
-	   (summary-seen	. nil)
-	   (summary-killed	. nil)
-	   (summary-Xed		. nil)
-	   (summary-current	. reverse-default)
-	   (summary-unread	. bold)
-	   (summary-deleted	. italic)
-	   (summary-new		. default-bold-italic)
-
-	   (gnus-group-unsubscribed	. nil)
-	   (gnus-group-empty		. nil)
-	   (gnus-group-full		. italic)
-	   (gnus-group-overflowing	. default-bold-italic)
+    ;; dired mode
+    (dired-directory blue-bold         cyan            bold)
+    (dired-link	     firebrick-italic  green	       italic)
+    (dired-ignored   ForestGreen       moccasin	       nil)
+    (dired-deleted   red-bold-italic   orange	       default-bold-italic)
+    (dired-marked    purple	       Plum1	       nil)
+	
+    ;; Info-mode, and jargon-mode.el and prep.ai.mit.edu:/pub/gnu/jargon*
+    (jargon-entry    blue-bold	       cyan            bold)
+    (jargon-xref     purple-bold       Plum1	       italic)
+    (jargon-keyword  firebrick-underline yellow	       underline)
+    )
+  "alist of default faces (face . (light-default dark-default mono-default))")
 
-	   ;; dired mode
-	   (dired-directory 	. bold)
-	   (dired-link		. italic)
-	   (dired-ignored	. nil)
-	   (dired-marked	. nil)
-	   (dired-deleted	. default-bold-italic)
-	
-	   ;; see jargon-mode.el and prep.ai.mit.edu:/pub/gnu/jargon*.txt
-	   (jargon-entry	. bold)
-	   (jargon-xref		. italic)
-	   ;; really used for Info-mode
-	   (jargon-keyword	. underline)
-	   ))
-	)
-    "alist that maps symbolic face-names to real face names")
+(defconst hilit-face-translation-table
+  (let ((index (or (cdr (assq hilit-background-mode
+			      '((light . 1) (dark . 2))))
+		   3)))
+    (mapcar (function (lambda (x) (cons (car x) (nth index x))))
+	    hilit-default-face-table))
+  "alist that maps symbolic face-names to real face names")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; To translate one face to another...
@@ -630,20 +460,14 @@
 The function hilit-lookup-face-create will repeatedly translate until no more
 translations for the face exist in the translation table.
 
-See the documentation for hilit-lookup-face-create for names of valid faces.
-"
-;; can't have an interactive macro
-;;  (interactive "SFace translate from: \nSFace translate to: ")
+See the documentation for hilit-lookup-face-create for names of valid faces."
   (or (zerop (% (length args) 2))
       (error "wrong number of args"))
   (let (cmdl from to)
     (while args
       (setq from (car args) to (nth 1 args) args (nthcdr 2 args)
 	    cmdl (cons (list 'hilit-associate ''hilit-face-translation-table
-			     ;; this is for reverse compatibility...
-			     (if (and (consp from) (eq 'quote (car from)))
-				 from
-			       (list 'quote from)) to)
+			     (list 'quote from) to)
 		       cmdl)))
     (cons 'progn cmdl)))
 
@@ -728,9 +552,17 @@
 	    (set-face-font face nil frame)
 	    (set-face-underline-p face (string-match "underline" fn))
 	    (if (string-match ".*bold" fn)
-		(make-face-bold face frame  'noerr))
+		(progn
+		  ;; first, fix up this frame's face
+		  (make-face-bold face frame  'noerr)
+		  ;; now, fix up the face from the global list
+		  (set-face-font face (face-font face frame) t)))
 	    (if (string-match ".*italic" fn)
-		(make-face-italic face frame 'noerr))
+		(progn
+		  ;; first, fix up this frame's face
+		  (make-face-italic face frame 'noerr)
+		  ;; now, fix up the face from the global list
+		  (set-face-font face (face-font face frame) t)))
 	    ))
       )))
   face)
@@ -821,7 +653,7 @@
 			 (while (setq region (funcall pstart pend))
 			   (hilit-region-set-face (car region) (cdr region)
 						  face prio))))
-		      (pend
+		      ((stringp pend)
 		       ;; inner loop -- regex-start ... regex-end
 		       (while (re-search-forward pstart nil t nil)
 			 (goto-char (setq mstart (match-beginning 0)))
@@ -830,10 +662,11 @@
 						    face prio)
 			   (forward-char 1))))
 		      (t
+		       (or (numberp pend) (setq pend 0))
 		       ;; inner loop -- just one regex to match whole pattern
 		       (while (re-search-forward pstart nil t nil)
-			 (hilit-region-set-face  (match-beginning 0)
-						 (match-end 0) face prio))))
+			 (hilit-region-set-face  (match-beginning pend)
+						 (match-end pend) face prio))))
 	      (error (message "Unbalanced delimiters?  Barfed on '%s'"
 			      pstart)
 		     (ding) (sit-for 4))))
@@ -956,7 +789,8 @@
   (interactive "*P")
   (let ((transient-mark-mode nil))
     (yank arg)
-    (hilit-rehighlight-region (region-beginning) (region-end) t)
+    (and hilit-auto-rehighlight
+	 (hilit-rehighlight-region (region-beginning) (region-end) t))
     (setq this-command 'yank)))
 
 (defun hilit-yank-pop (arg)
@@ -964,7 +798,8 @@
   (interactive "*p")
   (let ((transient-mark-mode nil))
     (yank-pop arg)
-    (hilit-rehighlight-region (region-beginning) (region-end) t)
+    (and hilit-auto-rehighlight
+	 (hilit-rehighlight-region (region-beginning) (region-end) t))
     (setq this-command 'yank)))
 
 ;;; this line highlighting stuff is untested.  play with it only if you feel
@@ -1036,18 +871,23 @@
 ;; Initialization.  
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(substitute-key-definition 'yank     'hilit-yank     (current-global-map))
-(substitute-key-definition 'yank-pop 'hilit-yank-pop (current-global-map))
-
-;; (substitute-key-definition 'recenter 'hilit-recenter (current-global-map))
-;; (substitute-key-definition 'redraw-display 'hilit-redraw-display
-;;			      (current-global-map))
+(and (not hilit-inhibit-rebinding)
+     window-system
+     (progn 
+       (substitute-key-definition 'yank     'hilit-yank
+				  (current-global-map))
+       (substitute-key-definition 'yank-pop 'hilit-yank-pop
+				  (current-global-map))
+       (substitute-key-definition 'recenter 'hilit-recenter
+				  (current-global-map))))
 
 (global-set-key [?\C-\S-l] 'hilit-repaint-command)
 
 (and window-system
      (add-hook 'find-file-hooks 'hilit-find-file-hook t))
 
+(eval-when-compile (require 'gnus))	; no compilation gripes
+
 (and (not hilit-inhibit-hooks)
      window-system
      (condition-case c
@@ -1058,17 +898,23 @@
 		    (lambda (hook)
 		      (add-hook hook 'hilit-rehighlight-buffer-quietly)))
 		   '(
-		     Info-select-hook
+		     compilation-parse-hook
+
+		     Info-select-hook	; FIXME -- phase this out later
+		     Info-selection-hook
+
 		     vm-summary-mode-hooks
 		     vm-summary-pointer-hook
+		     vm-preview-message-hook
+		     vm-show-message-hook
+
+		     gnus-article-prepare-hook
 		     gnus-summary-prepare-hook
 		     gnus-group-prepare-hook
 
-		     vm-preview-message-hook
-		     vm-show-message-hook
-		     gnus-article-prepare-hook
 		     rmail-show-message-hook
 		     mail-setup-hook 
+		     mh-show-mode-hook
 		     ))
 
 	   ;; rehilight only the visible part of the summary buffer for speed.
@@ -1111,7 +957,7 @@
       (set alist (cons (cons key val) (eval alist))))))
   
 (defun hilit-set-mode-patterns (modelist patterns &optional parse-fn)
-  "Sets the default hilighting patterns for MODE to PATTERNS.
+  "Sets the default highlighting patterns for MODE to PATTERNS.
 See the variable hilit-mode-enable-list."
   (or (consp modelist) (setq modelist (list modelist)))
   (let (ok (flip (eq (car hilit-mode-enable-list) 'not)))
@@ -1150,9 +996,9 @@
    ("^\\(\\w\\|[$_]\\)+\\s *\\(\\(\\w\\|[$_]\\)+\\s *((\\|(\\)[^)]*)+" nil defun)
    ("^\\(typedef\\|struct\\|union\\|enum\\).*$" nil decl)
    ;; datatype -- black magic regular expression
-   ("[ \n\t({]\\(\\(register\\|volatile\\|unsigned\\|extern\\|static\\)\\s +\\)*\\(\\(\\w\\|[$_]\\)+_t\\|float\\|double\\|void\\|char\\|short\\|int\\|long\\|FILE\\|\\(\\(struct\\|union\\|enum\\)\\([ \t]+\\(\\w\\|[$_]\\)*\\)\\)\\)\\(\\s +\\*+)?\\|[ \n\t;()]\\)" nil type)
+   ("[ \n\t({]\\(\\(const\\|register\\|volatile\\|unsigned\\|extern\\|static\\)\\s +\\)*\\(\\(\\w\\|[$_]\\)+_t\\|float\\|double\\|void\\|char\\|short\\|int\\|long\\|FILE\\|\\(\\(struct\\|union\\|enum\\)\\([ \t]+\\(\\w\\|[$_]\\)*\\)\\)\\)\\(\\s +\\*+)?\\|[ \n\t;()]\\)" nil type)
    ;; key words
-   ("\\<\\(return\\|goto\\|if\\|else\\|case\\|default\\|switch\\|break\\|continue\\|while\\|do\\|for\\)\\>" nil keyword)
+   ("[^_]\\<\\(return\\|goto\\|if\\|else\\|case\\|default\\|switch\\|break\\|continue\\|while\\|do\\|for\\)\\>[^_]" 1 keyword)
    ))
 
 (hilit-set-mode-patterns
@@ -1170,10 +1016,10 @@
    ("^\\(\\(\\w\\|[$_]\\)+[ \t]*::[ \t]*\\)?\\(\\(\\w\\|[$_]\\)+\\|operator.*\\)\\s *\\(\\(\\w\\|[$_]\\)+\\s *((\\|(\\)[^)]*)+" nil defun)
    ("^\\(template\\|typedef\\|struct\\|union\\|class\\|enum\\|public\\|private\\|protected\\).*$" nil decl)
    ;; datatype -- black magic regular expression
-   ("[ \n\t({]\\(\\(register\\|volatile\\|unsigned\\|extern\\|static\\)\\s +\\)*\\(\\(\\w\\|[$_]\\)+_t\\|float\\|double\\|void\\|char\\|short\\|int\\|long\\|FILE\\|\\(\\(struct\\|union\\|enum\\|class\\)\\([ \t]+\\(\\w\\|[$_]\\)*\\)\\)\\)\\(\\s +\\*+)?\\|[ \n\t;()]\\)" nil type)
+   ("[ \n\t({]\\(\\(const\\|register\\|volatile\\|unsigned\\|extern\\|static\\)\\s +\\)*\\(\\(\\w\\|[$_]\\)+_t\\|float\\|double\\|void\\|char\\|short\\|int\\|long\\|FILE\\|\\(\\(struct\\|union\\|enum\\|class\\)\\([ \t]+\\(\\w\\|[$_]\\)*\\)\\)\\)\\(\\s +\\*+)?\\|[ \n\t;()]\\)" nil type)
    ;; key words
-   ("\\<\\(return\\|goto\\|if\\|else\\|case\\|default\\|switch\\|break\\|continue\\|while\\|do\\|for\\|public\\|protected\\|private\\|delete\\|new\\)\\>"
-    nil keyword)))
+   ("[^_]\\<\\(return\\|goto\\|if\\|else\\|case\\|default\\|switch\\|break\\|continue\\|while\\|do\\|for\\|public\\|protected\\|private\\|delete\\|new\\)\\>[^_]"
+    1 keyword)))
 
 (hilit-set-mode-patterns
  'perl-mode
@@ -1289,9 +1135,9 @@
    ;; things that bring in external files
    ("\\\\\\(include\\|input\\|bibliography\\){" "}" include)
 
-   ;; "wysiwyg" emphasis
-   ("{\\\\\\(em\\|it\\|sl\\)" "}" italic)
-   ("{\\\\bf" "}" bold)
+   ;; "wysiwyg" emphasis -- these don't work with nested expressions
+   ;; ("{\\\\\\(em\\|it\\|sl\\)" "}" italic)
+   ;; ("{\\\\bf" "}" bold)
 
    ("``" "''" string)
 
@@ -1309,38 +1155,39 @@
 
 (hilit-set-mode-patterns
  'compilation-mode
- '(("^[^ \t]*:[0-9]+:.*$" nil error)
-   ("^[^ \t]*:[0-9]+: warning:.*$" nil warning)))
+ '(
+   ("^[-_.\"A-Za-z0-9]+\\(:\\|, line \\)[0-9]+: warning:.*$" nil warning)
+   ("^[-_.\"A-Za-z0-9]+\\(:\\|, line \\)[0-9]+:.*$" nil error)
+   ))
 
 (hilit-set-mode-patterns
  'makefile-mode
  '(("^#.*$" nil comment)
    ("[^$]#.*$" nil comment)
    ;; rules
-   ("^%.*$" nil rule)
+   ("^[^ \t\n]*%[^ \t\n]*[ \t]*::?[ \t]*[^ \t\n]*[ \t]*\\(#.*\\)?$" nil rule)
    ("^[.][A-Za-z][A-Za-z]?\..*$" nil rule)
    ;; variable definition
-   ("^[_A-Za-z0-9]+ *\+?=" nil define)
-   ("\\( \\|:=\\)[_A-Za-z0-9]+ *\\+=" nil define)
+   ("^[_A-Za-z0-9]+[ \t]*\+?=" nil define)
+   ("\\( \\|:=\\)[_A-Za-z0-9]+[ \t]*\\+=" nil define)
    ;; variable references
-   ("\$[_A-Za-z0-9]" nil type)
-   ("\${[_A-Za-z0-9]+}" nil type)
-   ("\$\([_A-Za-z0-9]+\)" nil type)
+   ("\\$\\([^ \t\n{(]\\|[{(]@?[_A-Za-z0-9:.,%/=]+[)}]\\)" nil keyword)
+   ("^[A-Za-z0-9.,/_-]+[ \t]*:.*$" nil defun)
    ("^include " nil include)))
 
 (let* ((header-patterns '(("^Subject:.*$" nil msg-subject)
 			  ("^From:.*$" nil msg-from)
 			  ("^--text follows this line--$" nil msg-separator)
 			  ("^[A-Za-z][A-Za-z0-9-]+:" nil msg-header)))
-       (body-patterns '(("^\\(In article\\|[ \t]*\\w*[]>}|]\\).*$"
+       (body-patterns '(("^\\(In article\\|[ \t]*\\w*[]<>}|]\\).*$"
 			 nil msg-quote)))
        (message-patterns (append header-patterns body-patterns)))
   (hilit-set-mode-patterns 'msg-header header-patterns)
   (hilit-set-mode-patterns 'msg-body body-patterns)
-  (hilit-set-mode-patterns
-   '(vm-mode text-mode mail-mode rmail-mode gnus-article-mode news-reply-mode)
-   message-patterns
-   'hilit-rehighlight-message))
+  (hilit-set-mode-patterns '(vm-mode text-mode mail-mode rmail-mode
+			     gnus-article-mode news-reply-mode mh-show-mode)
+			   message-patterns
+			   'hilit-rehighlight-message))
 
 (hilit-set-mode-patterns
  'gnus-group-mode