diff lisp/ediff/ediff-init.el @ 181:bfd6434d15b3 r20-3b17

Import from CVS: tag r20-3b17
author cvs
date Mon, 13 Aug 2007 09:53:19 +0200
parents 2d532a89d707
children acd284d43ca1
line wrap: on
line diff
--- a/lisp/ediff/ediff-init.el	Mon Aug 13 09:52:21 2007 +0200
+++ b/lisp/ediff/ediff-init.el	Mon Aug 13 09:53:19 2007 +0200
@@ -97,6 +97,13 @@
 ;; The Ediff control buffer
 (ediff-defvar-local ediff-control-buffer nil "")
 
+
+;; Association between buff-type and ediff-buffer-*
+(defconst ediff-buffer-alist
+  '((?A . ediff-buffer-A)
+    (?B . ediff-buffer-B)
+    (?C . ediff-buffer-C)))
+
 ;;; Macros
 (defmacro ediff-odd-p (arg)
   (` (eq (logand (, arg) 1) 1)))
@@ -123,11 +130,27 @@
 	   ((memq (, arg) '(?c ?C)) 'C)
 	   )
   ))
+
+
+;; A-list is supposed to be of the form (A . symb) (B . symb)...)
+;; where the first part of any association is a buffer type and the second is
+;; an appropriate symbol. Given buffer-type, this function returns the
+;; symbol. This is used to avoid using `intern'
+(defsubst ediff-get-symbol-from-alist (buf-type alist)
+  (cdr (assoc buf-type alist)))
   
+(defconst ediff-difference-vector-alist
+  '((A . ediff-difference-vector-A)
+    (B . ediff-difference-vector-B)
+    (C . ediff-difference-vector-C)
+    (Ancestor . ediff-difference-vector-Ancestor)))
+
 (defmacro ediff-get-difference (n buf-type)
   (` (aref
       (symbol-value
-       (intern (format "ediff-difference-vector-%S" (, buf-type)))) (, n))))
+       (ediff-get-symbol-from-alist
+	(, buf-type) ediff-difference-vector-alist))
+      (, n))))
   
 ;; Tell if it has been previously determined that the region has
 ;; no diffs other than the white space and newlines
@@ -189,21 +212,18 @@
   (` (ediff-get-fine-diff-vector-from-diff-record
       (ediff-get-difference (, n) (, buf-type)))))
   
-;; Macro to switch to BUFFER, evaluate FORMS, returns to original buffer.
-;; Differs from `save-excursion' in that it doesn't save the point and mark.
-;; This is essentially `emerge-eval-in-buffer' with the test for live buffers."
-(defmacro ediff-eval-in-buffer (buffer &rest forms)
-  (` (let ((StartBuffer (current-buffer)))
-       (if (ediff-buffer-live-p (, buffer))
-	   (unwind-protect
-	       (progn
-		 (set-buffer (, buffer))
-		 (,@ forms))
-	     (set-buffer StartBuffer))
-	 (or (eq this-command 'ediff-quit)
-	     (error ediff-KILLED-VITAL-BUFFER))
-	 ))))
-	 
+;; Macro to switch to BUFFER, evaluate BODY, returns to original buffer.
+;; Doesn't save the point and mark.
+;; This is `with-current-buffer' with the added test for live buffers."
+(defmacro ediff-with-current-buffer (buffer &rest body)
+  (` (if (ediff-buffer-live-p (, buffer))
+       (save-current-buffer
+	 (set-buffer (, buffer))
+	 (,@ body))
+     (or (eq this-command 'ediff-quit)
+	 (error ediff-KILLED-VITAL-BUFFER))
+     )))
+     
 
 (defsubst ediff-multiframe-setup-p ()
   (and (ediff-window-display-p) ediff-multiframe))
@@ -561,6 +581,13 @@
 ;; The original values of ediff-protected-variables for buffer Ancestor
 (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
 
+;; association between buff-type and ediff-buffer-values-orig-*
+(defconst ediff-buffer-values-orig-alist
+  '((A . ediff-buffer-values-orig-A)
+    (B . ediff-buffer-values-orig-B)
+    (C . ediff-buffer-values-orig-C)
+    (Ancestor . ediff-buffer-values-orig-Ancestor)))
+
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 (defconst ediff-protected-variables '(
 				      ;;buffer-read-only 
@@ -585,6 +612,12 @@
 (ediff-defvar-local ediff-difference-vector-B nil "")
 (ediff-defvar-local ediff-difference-vector-C nil "")
 (ediff-defvar-local ediff-difference-vector-Ancestor nil "")
+;; A-list of diff vector types associated with buffer types
+(defconst ediff-difference-vector-alist
+  '((A . ediff-difference-vector-A)
+    (B . ediff-difference-vector-B)
+    (C . ediff-difference-vector-C)
+    (Ancestor . ediff-difference-vector-Ancestor)))
 
 ;; [ status status status ...]
 ;; Each status: [state-of-merge state-of-ancestor]
@@ -676,30 +709,6 @@
 	  ((memq op '(< <=)) t))))
   
   
-;;;; warn if it is a wrong version of emacs
-;;(if (or (ediff-check-version '< 19 35 'emacs)
-;;	(ediff-check-version '< 19 15 'xemacs))
-;;    (progn
-;;      (with-output-to-temp-buffer ediff-msg-buffer
-;;	(switch-to-buffer ediff-msg-buffer)
-;;	(insert
-;;	 (format "
-;;
-;;This version of Ediff requires 
-;;
-;;\t Emacs 19.35 and higher
-;;\t OR
-;;\t XEmacs 19.15 and higher
-;;
-;;It is unlikely to work under Emacs version %s
-;;that you are using... " emacs-version))
-;;	(if noninteractive
-;;	    ()
-;;	  (beep 1)
-;;	  (beep 1)
-;;	  (insert "\n\nType any key to continue...")
-;;	  (ediff-read-event)))
-;;      (kill-buffer ediff-msg-buffer)))
 
 ;; A fix for NeXT Step
 ;; Should probably be eliminated in later versions.
@@ -743,14 +752,30 @@
       (fset 'ediff-display-pixel-height
 	    (symbol-function 'x-display-pixel-height))))
       
+;; A-list of current-diff-overlay symbols asssociated with buf types
+(defconst ediff-current-diff-overlay-alist
+  '((A . ediff-current-diff-overlay-A)
+    (B . ediff-current-diff-overlay-B)
+    (C . ediff-current-diff-overlay-C)
+    (Ancestor . ediff-current-diff-overlay-Ancestor)))
+  
+;; A-list of current-diff-face-* symbols asssociated with buf types
+(defconst ediff-current-diff-face-alist
+  '((A . ediff-current-diff-face-A)
+    (B . ediff-current-diff-face-B)
+    (C . ediff-current-diff-face-C)
+    (Ancestor . ediff-current-diff-face-Ancestor)))
+  
 
 (defun ediff-make-current-diff-overlay (type)
   (if (ediff-has-face-support-p)
-      (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
+      (let ((overlay (ediff-get-symbol-from-alist
+		      type ediff-current-diff-overlay-alist))
 	    (buffer (ediff-get-buffer type))
 	    (face (face-name
 		   (symbol-value
-		    (intern (format "ediff-current-diff-face-%S" type))))))
+		    (ediff-get-symbol-from-alist
+		     type ediff-current-diff-face-alist)))))
 	(set overlay
 	     (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
 	(ediff-set-overlay-face (symbol-value overlay) face)
@@ -779,35 +804,35 @@
 	  (t ""))   ; none
     ))
 
-(defun ediff-set-face (ground face color)
-  "Set face foreground/background."
-  (if (ediff-has-face-support-p)
-      (if (ediff-valid-color-p color)
-	  (if (eq ground 'foreground)
-	      (set-face-foreground face color)
-	    (set-face-background face color))
-	(cond ((memq face
-		     '(ediff-current-diff-face-A
-		       ediff-current-diff-face-B
-		       ediff-current-diff-face-C
-		       ediff-current-diff-face-Ancestor))
-	       (copy-face 'highlight face))
-	      ((memq face
-		     '(ediff-fine-diff-face-A
-		       ediff-fine-diff-face-B
-		       ediff-fine-diff-face-C
-		       ediff-fine-diff-face-Ancestor))
-	       (copy-face 'secondary-selection face)
-	       (set-face-underline-p face t))
-	      ((memq face
-		     '(ediff-even-diff-face-A
-		       ediff-odd-diff-face-A 
-		       ediff-even-diff-face-B ediff-odd-diff-face-B
-		       ediff-even-diff-face-C ediff-odd-diff-face-C
-		       ediff-even-diff-face-Ancestor
-		       ediff-odd-diff-face-Ancestor))
-	       (copy-face 'secondary-selection face))))
-    ))
+;;(defun ediff-set-face (ground face color)
+;;  "Set face foreground/background."
+;;  (if (ediff-has-face-support-p)
+;;      (if (ediff-valid-color-p color)
+;;	  (if (eq ground 'foreground)
+;;	      (set-face-foreground face color)
+;;	    (set-face-background face color))
+;;	(cond ((memq face
+;;		     '(ediff-current-diff-face-A
+;;		       ediff-current-diff-face-B
+;;		       ediff-current-diff-face-C
+;;		       ediff-current-diff-face-Ancestor))
+;;	       (copy-face 'highlight face))
+;;	      ((memq face
+;;		     '(ediff-fine-diff-face-A
+;;		       ediff-fine-diff-face-B
+;;		       ediff-fine-diff-face-C
+;;		       ediff-fine-diff-face-Ancestor))
+;;	       (copy-face 'secondary-selection face)
+;;	       (set-face-underline-p face t))
+;;	      ((memq face
+;;		     '(ediff-even-diff-face-A
+;;		       ediff-odd-diff-face-A 
+;;		       ediff-even-diff-face-B ediff-odd-diff-face-B
+;;		       ediff-even-diff-face-C ediff-odd-diff-face-C
+;;		       ediff-even-diff-face-Ancestor
+;;		       ediff-odd-diff-face-Ancestor))
+;;	       (copy-face 'secondary-selection face))))
+;;    ))
 
 (defun ediff-set-face-pixmap (face pixmap)
   "Set face pixmap on a monochrome display."
@@ -822,280 +847,556 @@
   (if (and (ediff-has-face-support-p) ediff-emacs-p)
       (add-to-list 'facemenu-unlisted-faces face)))
       
-(defvar ediff-current-diff-face-A
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-current-diff-face-A)
-	(ediff-hide-face 'ediff-current-diff-face-A)
-	(or (face-differs-from-default-p 'ediff-current-diff-face-A)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-current-diff-face-A "firebrick")
-		   (ediff-set-face
-		    'background 'ediff-current-diff-face-A "pale green"))
-		  (t
-		   (if ediff-xemacs-p
-		       (copy-face 'modeline 'ediff-current-diff-face-A)
-		     (copy-face 'highlight 'ediff-current-diff-face-A))
-		   )))
-	'ediff-current-diff-face-A))
-  "Face for highlighting the selected difference in buffer A.")
+(defgroup ediff-highlighting nil
+  "Hilighting of difference regions in Ediff"
+  :prefix "ediff-"
+  :group 'ediff)
+
+;;(defvar ediff-current-diff-face-A
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-current-diff-face-A)
+;;	(or (face-differs-from-default-p 'ediff-current-diff-face-A)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-current-diff-face-A "firebrick")
+;;		   (ediff-set-face
+;;		    'background 'ediff-current-diff-face-A "pale green"))
+;;		  (t
+;;		   (if ediff-xemacs-p
+;;		       (copy-face 'modeline 'ediff-current-diff-face-A)
+;;		     (copy-face 'highlight 'ediff-current-diff-face-A))
+;;		   )))
+;;	'ediff-current-diff-face-A))
+;;  "Face for highlighting the selected difference in buffer A.")
+
+(defface ediff-current-diff-face-A
+  '((((class color)) (:foreground "firebrick" :background "pale green"))
+    (t (:inverse-video t)))
+  "Face for highlighting the selected difference in buffer A."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-current-diff-face-A 'ediff-current-diff-face-A)
+(ediff-hide-face 'ediff-current-diff-face-A)
+;; Until custom.el for XEmacs starts supporting :inverse-video we do this.
+;; This means that some user customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (copy-face 'modeline 'ediff-current-diff-face-A))
+
+
 
-(defvar ediff-current-diff-face-B
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-current-diff-face-B)
-	(ediff-hide-face 'ediff-current-diff-face-B)
-	(or (face-differs-from-default-p 'ediff-current-diff-face-B)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-current-diff-face-B "DarkOrchid")
-		   (ediff-set-face
-		    'background 'ediff-current-diff-face-B "Yellow"))
-		  (t 
-		   (if ediff-xemacs-p
-		       (copy-face 'modeline 'ediff-current-diff-face-B)
-		     (copy-face 'highlight 'ediff-current-diff-face-B))
-		   )))
-	'ediff-current-diff-face-B))
-  "Face for highlighting the selected difference in buffer B.")
+;;(defvar ediff-current-diff-face-B
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-current-diff-face-B)
+;;	(or (face-differs-from-default-p 'ediff-current-diff-face-B)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-current-diff-face-B "DarkOrchid")
+;;		   (ediff-set-face
+;;		    'background 'ediff-current-diff-face-B "Yellow"))
+;;		  (t 
+;;		   (if ediff-xemacs-p
+;;		       (copy-face 'modeline 'ediff-current-diff-face-B)
+;;		     (copy-face 'highlight 'ediff-current-diff-face-B))
+;;		   )))
+;;	'ediff-current-diff-face-B))
+;;  "Face for highlighting the selected difference in buffer B.")
     
+(defface ediff-current-diff-face-B
+  '((((class color)) (:foreground "DarkOrchid" :background "Yellow"))
+    (t (:inverse-video t)))
+  "Face for highlighting the selected difference in buffer B."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-current-diff-face-B 'ediff-current-diff-face-B)
+(ediff-hide-face 'ediff-current-diff-face-B)
+;; Until custom.el for XEmacs starts supporting :inverse-video we do this.
+;; This means that some user customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (copy-face 'modeline 'ediff-current-diff-face-B))
 
-(defvar ediff-current-diff-face-C
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-current-diff-face-C)
-	(ediff-hide-face 'ediff-current-diff-face-C)
-	(or (face-differs-from-default-p 'ediff-current-diff-face-C)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-current-diff-face-C "Navy")
-		   (ediff-set-face
-		    'background 'ediff-current-diff-face-C "Pink"))
-		  (t 
-		   (if ediff-xemacs-p
-		       (copy-face 'modeline 'ediff-current-diff-face-C)
-		     (copy-face 'highlight 'ediff-current-diff-face-C))
-		   )))
-	'ediff-current-diff-face-C))
-  "Face for highlighting the selected difference in buffer C.")
+;;(defvar ediff-current-diff-face-C
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-current-diff-face-C)
+;;	(or (face-differs-from-default-p 'ediff-current-diff-face-C)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-current-diff-face-C "Navy")
+;;		   (ediff-set-face
+;;		    'background 'ediff-current-diff-face-C "Pink"))
+;;		  (t 
+;;		   (if ediff-xemacs-p
+;;		       (copy-face 'modeline 'ediff-current-diff-face-C)
+;;		     (copy-face 'highlight 'ediff-current-diff-face-C))
+;;		   )))
+;;	'ediff-current-diff-face-C))
+;;  "Face for highlighting the selected difference in buffer C.")
+
+(defface ediff-current-diff-face-C
+  '((((class color)) (:foreground "Navy" :background "Pink"))
+    (t (:inverse-video t)))
+  "Face for highlighting the selected difference in buffer C."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-current-diff-face-C 'ediff-current-diff-face-C)
+(ediff-hide-face 'ediff-current-diff-face-C)
+;; Until custom.el for XEmacs starts supporting :inverse-video we do this.
+;; This means that some user customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (copy-face 'modeline 'ediff-current-diff-face-C))
+
+;;(defvar ediff-current-diff-face-Ancestor
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-current-diff-face-Ancestor)
+;;	(or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
+;;	    (copy-face 
+;;	     'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))
+;;	'ediff-current-diff-face-Ancestor))
+;;  "Face for highlighting the selected difference in the ancestor buffer.")
 
-(defvar ediff-current-diff-face-Ancestor
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-current-diff-face-Ancestor)
-	(ediff-hide-face 'ediff-current-diff-face-Ancestor)
-	(or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
-	    (copy-face 
-	     'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))
-	'ediff-current-diff-face-Ancestor))
-  "Face for highlighting the selected difference in the ancestor buffer.")
+(defface ediff-current-diff-face-Ancestor
+  '((((class color)) (:foreground "Black" :background "VioletRed"))
+    (t (:inverse-video t)))
+  "Face for highlighting the selected difference in buffer Ancestor."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-current-diff-face-Ancestor 'ediff-current-diff-face-Ancestor)
+(ediff-hide-face 'ediff-current-diff-face-Ancestor)
+;; Until custom.el for XEmacs starts supporting :inverse-video we do this.
+;; This means that some user customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (copy-face 'modeline 'ediff-current-diff-face-Ancestor))
+
+;;(defvar ediff-fine-diff-pixmap "gray3"
+;;  "Pixmap to use for highlighting fine differences.")
+;;(defvar ediff-odd-diff-pixmap "gray1"
+;;  "Pixmap to use for highlighting odd differences.")
+;;(defvar ediff-even-diff-pixmap "Stipple"
+;;  "Pixmap to use for highlighting even differences.")
 
-(defvar ediff-fine-diff-pixmap "gray3"
-  "Pixmap to use for highlighting fine differences.")
-(defvar ediff-odd-diff-pixmap "gray1"
-  "Pixmap to use for highlighting odd differences.")
-(defvar ediff-even-diff-pixmap "Stipple"
-  "Pixmap to use for highlighting even differences.")
+;;(defvar ediff-fine-diff-face-A
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-fine-diff-face-A)
+;;	(or (face-differs-from-default-p 'ediff-fine-diff-face-A)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face 'foreground 'ediff-fine-diff-face-A
+;;				   "Navy")
+;;		   (ediff-set-face 'background 'ediff-fine-diff-face-A
+;;				   "sky blue"))
+;;		  (t
+;;		   (set-face-underline-p 'ediff-fine-diff-face-A t)
+;;		   (ediff-set-face-pixmap 'ediff-fine-diff-face-A
+;;					  ediff-fine-diff-pixmap)
+;;		   )))
+;;	'ediff-fine-diff-face-A))
+;;  "Face for highlighting the refinement of the selected diff in buffer A.")
+
+
+(defface ediff-fine-diff-face-A
+  '((((class color)) (:foreground "Navy" :background "sky blue"))
+    (t (:underline t :stipple "gray3")))
+  "Face for highlighting the refinement of the selected diff in buffer A."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-fine-diff-face-A 'ediff-fine-diff-face-A)
+(ediff-hide-face 'ediff-fine-diff-face-A)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-fine-diff-face-A "gray3"))
 
-(defvar ediff-fine-diff-face-A
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-fine-diff-face-A)
-	(ediff-hide-face 'ediff-fine-diff-face-A)
-	(or (face-differs-from-default-p 'ediff-fine-diff-face-A)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face 'foreground 'ediff-fine-diff-face-A
-				   "Navy")
-		   (ediff-set-face 'background 'ediff-fine-diff-face-A
-				   "sky blue"))
-		  (t
-		   (set-face-underline-p 'ediff-fine-diff-face-A t)
-		   (ediff-set-face-pixmap 'ediff-fine-diff-face-A
-					  ediff-fine-diff-pixmap)
-		   )))
-	'ediff-fine-diff-face-A))
-  "Face for highlighting the refinement of the selected diff in buffer A.")
+;;(defvar ediff-fine-diff-face-B
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-fine-diff-face-B)
+;;	(or (face-differs-from-default-p 'ediff-fine-diff-face-B)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black")
+;;		   (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan"))
+;;		  (t
+;;		   (set-face-underline-p 'ediff-fine-diff-face-B t)
+;;		   (ediff-set-face-pixmap 'ediff-fine-diff-face-B
+;;					  ediff-fine-diff-pixmap)
+;;		   )))
+;;	'ediff-fine-diff-face-B))
+;;  "Face for highlighting the refinement of the selected diff in buffer B.")
 
-(defvar ediff-fine-diff-face-B
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-fine-diff-face-B)
-	(ediff-hide-face 'ediff-fine-diff-face-B)
-	(or (face-differs-from-default-p 'ediff-fine-diff-face-B)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black")
-		   (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan"))
-		  (t
-		   (set-face-underline-p 'ediff-fine-diff-face-B t)
-		   (ediff-set-face-pixmap 'ediff-fine-diff-face-B
-					  ediff-fine-diff-pixmap)
-		   )))
-	'ediff-fine-diff-face-B))
-  "Face for highlighting the refinement of the selected diff in buffer B.")
+(defface ediff-fine-diff-face-B
+  '((((class color)) (:foreground "Black" :background "cyan"))
+    (t (:underline t :stipple "gray3")))
+  "Face for highlighting the refinement of the selected diff in buffer B."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-fine-diff-face-B 'ediff-fine-diff-face-B)
+(ediff-hide-face 'ediff-fine-diff-face-B)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-fine-diff-face-B "gray3"))
     
-(defvar ediff-fine-diff-face-C
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-fine-diff-face-C)
-	(ediff-hide-face 'ediff-fine-diff-face-C)
-	(or (face-differs-from-default-p 'ediff-fine-diff-face-C)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
-		   (ediff-set-face
-		    'background 'ediff-fine-diff-face-C "Turquoise"))
-		  (t
-		   (set-face-underline-p 'ediff-fine-diff-face-C t)
-		   (ediff-set-face-pixmap 'ediff-fine-diff-face-C
-					  ediff-fine-diff-pixmap)
-		   )))
-	'ediff-fine-diff-face-C))
-  "Face for highlighting the refinement of the selected diff in buffer C.")
+;;(defvar ediff-fine-diff-face-C
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-fine-diff-face-C)
+;;	(or (face-differs-from-default-p 'ediff-fine-diff-face-C)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
+;;		   (ediff-set-face
+;;		    'background 'ediff-fine-diff-face-C "Turquoise"))
+;;		  (t
+;;		   (set-face-underline-p 'ediff-fine-diff-face-C t)
+;;		   (ediff-set-face-pixmap 'ediff-fine-diff-face-C
+;;					  ediff-fine-diff-pixmap)
+;;		   )))
+;;	'ediff-fine-diff-face-C))
+;;  "Face for highlighting the refinement of the selected diff in buffer C.")
+
+(defface ediff-fine-diff-face-C
+  '((((class color)) (:foreground "Black" :background "Turquoise"))
+    (t (:underline t :stipple "gray3")))
+  "Face for highlighting the refinement of the selected diff in buffer C."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-fine-diff-face-C 'ediff-fine-diff-face-C)
+(ediff-hide-face 'ediff-fine-diff-face-C)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-fine-diff-face-C "gray3"))
+
+;;(defvar ediff-fine-diff-face-Ancestor
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-fine-diff-face-Ancestor)
+;;	(ediff-hide-face 'ediff-fine-diff-face-Ancestor)
+;;	(or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
+;;	    (progn
+;;	      (copy-face
+;;	       'ediff-fine-diff-face-C 'ediff-fine-diff-face-Ancestor)
+;;	      (ediff-set-face-pixmap 'ediff-fine-diff-face-Ancestor
+;;				     ediff-fine-diff-pixmap))
+;;	    )))
+;;  "Face highlighting refinements of the selected diff in ancestor buffer.
+;;Presently, this is not used, as difference regions are not refined in the
+;;ancestor buffer.")
 
-(defvar ediff-fine-diff-face-Ancestor
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-fine-diff-face-Ancestor)
-	(ediff-hide-face 'ediff-fine-diff-face-Ancestor)
-	(or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
-	    (progn
-	      (copy-face
-	       'ediff-fine-diff-face-C 'ediff-fine-diff-face-Ancestor)
-	      (ediff-set-face-pixmap 'ediff-fine-diff-face-Ancestor
-				     ediff-fine-diff-pixmap))
-	    )))
-  "Face highlighting refinements of the selected diff in ancestor buffer.
-Presently, this is not used, as difference regions are not refined in the
-ancestor buffer.")
+(defface ediff-fine-diff-face-Ancestor
+  '((((class color)) (:foreground "Black" :background "Green"))
+    (t (:underline t :stipple "gray3")))
+  "Face for highlighting the refinement of the selected diff in the ancestor buffer.
+At present, this face is not used and no fine differences are computed for the
+ancestor buffer."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-fine-diff-face-Ancestor 'ediff-fine-diff-face-Ancestor)
+(ediff-hide-face 'ediff-fine-diff-face-Ancestor)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap
+     'ediff-fine-diff-face-Ancestor "gray3"))
     
-(defvar ediff-even-diff-face-A
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-even-diff-face-A)
-	(ediff-hide-face 'ediff-even-diff-face-A)
-	(or (face-differs-from-default-p 'ediff-even-diff-face-A)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-even-diff-face-A "black")
-		   (ediff-set-face
-		    'background 'ediff-even-diff-face-A "light grey"))
-		  (t 
-		   (copy-face 'italic 'ediff-even-diff-face-A)
-		   (ediff-set-face-pixmap 'ediff-even-diff-face-A
-					  ediff-even-diff-pixmap)
-		   )))
-	'ediff-even-diff-face-A))
-  "Face used to highlight even-numbered differences in buffer A.")
+;;(defvar ediff-even-diff-face-A
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-even-diff-face-A)
+;;	(or (face-differs-from-default-p 'ediff-even-diff-face-A)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-even-diff-face-A "black")
+;;		   (ediff-set-face
+;;		    'background 'ediff-even-diff-face-A "light grey"))
+;;		  (t 
+;;		   (copy-face 'italic 'ediff-even-diff-face-A)
+;;		   (ediff-set-face-pixmap 'ediff-even-diff-face-A
+;;					  ediff-even-diff-pixmap)
+;;		   )))
+;;	'ediff-even-diff-face-A))
+;;  "Face used for highlighting even-numbered differences in buffer A.")
+
+(defface ediff-even-diff-face-A
+  '((((class color)) (:foreground "Black" :background "light grey"))
+    (t (:italic t :stipple "Stipple")))
+  "Face for highlighting even-numbered non-current differences in buffer A."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-even-diff-face-A 'ediff-even-diff-face-A)
+(ediff-hide-face 'ediff-even-diff-face-A)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-even-diff-face-A "Stipple"))
       
-(defvar ediff-even-diff-face-B
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-even-diff-face-B)
-	(ediff-hide-face 'ediff-even-diff-face-B)
-	(or (face-differs-from-default-p 'ediff-even-diff-face-B)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-even-diff-face-B "White")
-		   (ediff-set-face
-		    'background 'ediff-even-diff-face-B "Gray"))
-		  (t 
-		   (copy-face 'italic 'ediff-even-diff-face-B)
-		   (ediff-set-face-pixmap 'ediff-even-diff-face-B
-					  ediff-even-diff-pixmap)
-		   )))
-	'ediff-even-diff-face-B))
-  "Face used to highlight even-numbered differences in buffer B.")
+;;(defvar ediff-even-diff-face-B
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-even-diff-face-B)
+;;	(or (face-differs-from-default-p 'ediff-even-diff-face-B)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-even-diff-face-B "White")
+;;		   (ediff-set-face
+;;		    'background 'ediff-even-diff-face-B "Gray"))
+;;		  (t 
+;;		   (copy-face 'italic 'ediff-even-diff-face-B)
+;;		   (ediff-set-face-pixmap 'ediff-even-diff-face-B
+;;					  ediff-even-diff-pixmap)
+;;		   )))
+;;	'ediff-even-diff-face-B))
+;;  "Face used for highlighting even-numbered differences in buffer B.")
+
+(defface ediff-even-diff-face-B
+  '((((class color)) (:foreground "White" :background "Grey"))
+    (t (:italic t :stipple "Stipple")))
+  "Face for highlighting even-numbered non-current differences in buffer B."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-even-diff-face-B 'ediff-even-diff-face-B)
+(ediff-hide-face 'ediff-even-diff-face-B)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-even-diff-face-B "Stipple"))
     
-(defvar ediff-even-diff-face-C
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-even-diff-face-C)
-	(ediff-hide-face 'ediff-even-diff-face-C)
-	(or (face-differs-from-default-p 'ediff-even-diff-face-C)
-	    (progn
-	      (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C)
-	      (ediff-set-face-pixmap 'ediff-even-diff-face-C
-				     ediff-even-diff-pixmap)))
-	'ediff-even-diff-face-C))
-  "Face used to highlight even-numbered differences in buffer C.")
+;;(defvar ediff-even-diff-face-C
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-even-diff-face-C)
+;;	(ediff-hide-face 'ediff-even-diff-face-C)
+;;	(or (face-differs-from-default-p 'ediff-even-diff-face-C)
+;;	    (progn
+;;	      (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C)
+;;	      (ediff-set-face-pixmap 'ediff-even-diff-face-C
+;;				     ediff-even-diff-pixmap)))
+;;	'ediff-even-diff-face-C))
+;;  "Face used for highlighting even-numbered differences in buffer C.")
+
+(defface ediff-even-diff-face-C
+  '((((class color)) (:foreground "Black" :background "light grey"))
+    (t (:italic t :stipple "Stipple")))
+  "Face for highlighting even-numbered non-current differences in buffer C."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-even-diff-face-C 'ediff-even-diff-face-C)
+(ediff-hide-face 'ediff-even-diff-face-C)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-even-diff-face-C "Stipple"))
+
+;;(defvar ediff-even-diff-face-Ancestor
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-even-diff-face-Ancestor)
+;;	(ediff-hide-face 'ediff-even-diff-face-Ancestor)
+;;	(or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
+;;	    (progn
+;;	      (copy-face
+;;	       'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor)
+;;	      (ediff-set-face-pixmap 'ediff-even-diff-face-Ancestor
+;;				     ediff-even-diff-pixmap)))
+;;	'ediff-even-diff-face-Ancestor))
+;;  "Face highlighting even-numbered differences in the ancestor buffer.")
 
-(defvar ediff-even-diff-face-Ancestor
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-even-diff-face-Ancestor)
-	(ediff-hide-face 'ediff-even-diff-face-Ancestor)
-	(or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
-	    (progn
-	      (copy-face
-	       'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor)
-	      (ediff-set-face-pixmap 'ediff-even-diff-face-Ancestor
-				     ediff-even-diff-pixmap)))
-	'ediff-even-diff-face-Ancestor))
-  "Face highlighting even-numbered differences in the ancestor buffer.")
-  
-(defvar ediff-odd-diff-face-A
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-odd-diff-face-A)
-	(ediff-hide-face 'ediff-odd-diff-face-A)
-	(or (face-differs-from-default-p 'ediff-odd-diff-face-A)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-odd-diff-face-A "White")
-		   (ediff-set-face
-		    'background 'ediff-odd-diff-face-A "Gray"))
-		  (t 
-		   (copy-face 'italic 'ediff-odd-diff-face-A)
-		   (ediff-set-face-pixmap 'ediff-odd-diff-face-A
-					  ediff-odd-diff-pixmap)
-		   )))
-	'ediff-odd-diff-face-A))
-  "Face used to highlight odd-numbered differences in buffer A.")
+(defface ediff-even-diff-face-Ancestor
+  '((((class color)) (:foreground "White" :background "Grey"))
+    (t (:italic t :stipple "Stipple")))
+  "Face for highlighting even-numbered non-current differences in the ancestor buffer."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-even-diff-face-Ancestor 'ediff-even-diff-face-Ancestor)
+(ediff-hide-face 'ediff-even-diff-face-Ancestor)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap
+     'ediff-even-diff-face-Ancestor "Stipple"))
+
+;; Association between buffer types and even-diff-face symbols
+(defconst ediff-even-diff-face-alist
+  '((A . ediff-even-diff-face-A)
+    (B . ediff-even-diff-face-B)
+    (C . ediff-even-diff-face-C)
+    (Ancestor . ediff-even-diff-face-Ancestor)))
+
+;;(defvar ediff-odd-diff-face-A
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-odd-diff-face-A)
+;;	(or (face-differs-from-default-p 'ediff-odd-diff-face-A)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-odd-diff-face-A "White")
+;;		   (ediff-set-face
+;;		    'background 'ediff-odd-diff-face-A "Gray"))
+;;		  (t 
+;;		   (copy-face 'italic 'ediff-odd-diff-face-A)
+;;		   (ediff-set-face-pixmap 'ediff-odd-diff-face-A
+;;					  ediff-odd-diff-pixmap)
+;;		   )))
+;;	'ediff-odd-diff-face-A))
+;;  "Face used for highlighting odd-numbered differences in buffer A.")
+
+(defface ediff-odd-diff-face-A
+  '((((class color)) (:foreground "White" :background "Grey"))
+    (t (:italic t :stipple "gray1")))
+  "Face for highlighting odd-numbered non-current differences in buffer A."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-odd-diff-face-A 'ediff-odd-diff-face-A)
+(ediff-hide-face 'ediff-odd-diff-face-A)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-odd-diff-face-A "gray1"))
       
-(defvar ediff-odd-diff-face-B
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-odd-diff-face-B)
-	(ediff-hide-face 'ediff-odd-diff-face-B)
-	(or (face-differs-from-default-p 'ediff-odd-diff-face-B)
-	    (cond ((ediff-color-display-p)
-		   (ediff-set-face
-		    'foreground 'ediff-odd-diff-face-B "Black")
-		   (ediff-set-face
-		    'background 'ediff-odd-diff-face-B "light grey"))
-		  (t 
-		   (copy-face 'italic 'ediff-odd-diff-face-B)
-		   (ediff-set-face-pixmap 'ediff-odd-diff-face-B
-					  ediff-odd-diff-pixmap)
-		   )))
-	'ediff-odd-diff-face-B))
-  "Face used to highlight odd-numbered differences in buffer B.")
+;;(defvar ediff-odd-diff-face-B
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-odd-diff-face-B)
+;;	(ediff-hide-face 'ediff-odd-diff-face-B)
+;;	(or (face-differs-from-default-p 'ediff-odd-diff-face-B)
+;;	    (cond ((ediff-color-display-p)
+;;		   (ediff-set-face
+;;		    'foreground 'ediff-odd-diff-face-B "Black")
+;;		   (ediff-set-face
+;;		    'background 'ediff-odd-diff-face-B "light grey"))
+;;		  (t 
+;;		   (copy-face 'italic 'ediff-odd-diff-face-B)
+;;		   (ediff-set-face-pixmap 'ediff-odd-diff-face-B
+;;					  ediff-odd-diff-pixmap)
+;;		   )))
+;;	'ediff-odd-diff-face-B))
+;;  "Face used for highlighting odd-numbered differences in buffer B.")
+
+(defface ediff-odd-diff-face-B
+  '((((class color)) (:foreground "Black" :background "light grey"))
+    (t (:italic t :stipple "gray1")))
+  "Face for highlighting odd-numbered non-current differences in buffer B."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-odd-diff-face-B 'ediff-odd-diff-face-B)
+(ediff-hide-face 'ediff-odd-diff-face-B)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-odd-diff-face-B "gray1"))
     
-(defvar ediff-odd-diff-face-C
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-odd-diff-face-C)
-	(ediff-hide-face 'ediff-odd-diff-face-C)
-	(or (face-differs-from-default-p 'ediff-odd-diff-face-C)
-	    (progn
-	      (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C)
-	      (ediff-set-face-pixmap 'ediff-odd-diff-face-C
-				     ediff-odd-diff-pixmap)))
-	'ediff-odd-diff-face-C))
-  "Face used to highlight odd-numbered differences in buffer C.")
+;;(defvar ediff-odd-diff-face-C
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-odd-diff-face-C)
+;;	(or (face-differs-from-default-p 'ediff-odd-diff-face-C)
+;;	    (progn
+;;	      (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C)
+;;	      (ediff-set-face-pixmap 'ediff-odd-diff-face-C
+;;				     ediff-odd-diff-pixmap)))
+;;	'ediff-odd-diff-face-C))
+;;  "Face used for highlighting odd-numbered differences in buffer C.")
+
+(defface ediff-odd-diff-face-C
+  '((((class color)) (:foreground "White" :background "Grey"))
+    (t (:italic t :stipple "gray1")))
+  "Face for highlighting odd-numbered non-current differences in buffer C."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-odd-diff-face-C 'ediff-odd-diff-face-C)
+(ediff-hide-face 'ediff-odd-diff-face-C)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-odd-diff-face-C "gray1"))
 
-(defvar ediff-odd-diff-face-Ancestor 
-  (if (ediff-has-face-support-p)
-      (progn
-	(make-face 'ediff-odd-diff-face-Ancestor)
-	(ediff-hide-face 'ediff-odd-diff-face-Ancestor)
-	(or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
-	    (progn
-	      (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor)
-	      (ediff-set-face-pixmap 'ediff-odd-diff-face-Ancestor
-				     ediff-odd-diff-pixmap)))
-	'ediff-odd-diff-face-Ancestor))
-  "Face used to highlight even-numbered differences in the ancestor buffer.")
+;;(defvar ediff-odd-diff-face-Ancestor 
+;;  (if (ediff-has-face-support-p)
+;;      (progn
+;;	(make-face 'ediff-odd-diff-face-Ancestor)
+;;	(or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
+;;	    (progn
+;;	      (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor)
+;;	      (ediff-set-face-pixmap 'ediff-odd-diff-face-Ancestor
+;;				     ediff-odd-diff-pixmap)))
+;;	'ediff-odd-diff-face-Ancestor))
+;;  "Face used for highlighting even-numbered differences in the ancestor buffer.")
+
+(defface ediff-odd-diff-face-Ancestor
+  '((((class color)) (:foreground "Black" :background "light grey"))
+    (t (:italic t :stipple "gray1")))
+  "Face for highlighting odd-numbered non-current differences in the ancestor buffer."
+  :group 'ediff-highlighting)
+;; An internal variable. Ediff takes the face from here. When unhighlighting,
+;; this variable is set to nil, then again to the appropriate face.
+(defvar ediff-odd-diff-face-Ancestor 'ediff-odd-diff-face-Ancestor)
+(ediff-hide-face 'ediff-odd-diff-face-Ancestor)
+;; Until custom.el for XEmacs starts supporting :stipple we do this.
+;; This means that some use customization may be trashed.
+(if (and ediff-xemacs-p
+	 (ediff-has-face-support-p)
+	 (not (ediff-color-display-p))) 
+    (ediff-set-face-pixmap 'ediff-odd-diff-face-Ancestor "gray1"))
+
+;; Association between buffer types and odd-diff-face symbols
+(defconst ediff-odd-diff-face-alist
+  '((A . ediff-odd-diff-face-A)
+    (B . ediff-odd-diff-face-B)
+    (C . ediff-odd-diff-face-C)
+    (Ancestor . ediff-odd-diff-face-Ancestor)))
+  
+;; A-list of fine-diff face symbols associated with buffer types
+(defconst ediff-fine-diff-face-alist
+  '((A . ediff-fine-diff-face-A)
+    (B . ediff-fine-diff-face-B)
+    (C . ediff-fine-diff-face-C)
+    (Ancestor . ediff-fine-diff-face-Ancestor)))
 
 ;; Help echo
 (put 'ediff-fine-diff-face-A 'ediff-help-echo
@@ -1118,14 +1419,14 @@
   "Overlay for the current difference region in buffer C.")
 (ediff-defvar-local ediff-current-diff-overlay-Ancestor nil
   "Overlay for the current difference region in the ancestor buffer.")
-  
+
 ;; Compute priority of ediff overlay.
 (defun ediff-highest-priority (start end buffer)
   (let ((pos (max 1 (1- start)))
 	ovr-list)
     (if ediff-xemacs-p
 	(1+ ediff-shadow-overlay-priority)
-      (ediff-eval-in-buffer buffer
+      (ediff-with-current-buffer buffer
 	(while (< pos (min (point-max) (1+ end)))
 	  (setq ovr-list (append (overlays-at pos) ovr-list))
 	  (setq pos (next-overlay-change pos)))
@@ -1240,16 +1541,18 @@
 (defsubst ediff-background-face (buf-type dif-num)
   ;; The value of dif-num is always 1- the one that user sees.
   ;; This is why even face is used when dif-num is odd.
-  (intern (format (if (ediff-odd-p dif-num)
-		      "ediff-even-diff-face-%S"
-		    "ediff-odd-diff-face-%S")
-		  buf-type)))
+  (ediff-get-symbol-from-alist
+   buf-type (if (ediff-odd-p dif-num)
+		ediff-even-diff-face-alist
+	      ediff-odd-diff-face-alist)
+   ))
 
 
 ;; activate faces on diff regions in buffer
 (defun ediff-paint-background-regions-in-one-buffer (buf-type unhighlight)
   (let ((diff-vector 
-	 (eval (intern (format "ediff-difference-vector-%S" buf-type))))
+	 (eval (ediff-get-symbol-from-alist
+		buf-type ediff-difference-vector-alist)))
 	overl diff-num)
     (mapcar (function
 	     (lambda (rec)
@@ -1279,14 +1582,15 @@
 (defun ediff-highlight-diff-in-one-buffer (n buf-type)
   (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
       (let* ((buff (ediff-get-buffer buf-type))
-	     (last (ediff-eval-in-buffer buff (point-max)))
+	     (last (ediff-with-current-buffer buff (point-max)))
 	     (begin (ediff-get-diff-posn buf-type 'beg n))
 	     (end (ediff-get-diff-posn buf-type 'end n))
 	     (xtra (if (equal begin end) 1 0))
 	     (end-hilit (min last (+ end xtra)))
 	     (current-diff-overlay 
 	      (symbol-value
-	       (intern (format "ediff-current-diff-overlay-%S" buf-type)))))
+	       (ediff-get-symbol-from-alist
+		buf-type ediff-current-diff-overlay-alist))))
 	
 	(if ediff-xemacs-p
 	    (ediff-move-overlay current-diff-overlay begin end-hilit)
@@ -1305,7 +1609,8 @@
   (if (ediff-buffer-live-p (ediff-get-buffer buf-type))
       (let ((current-diff-overlay 
 	     (symbol-value
-	      (intern (format "ediff-current-diff-overlay-%S" buf-type))))
+	      (ediff-get-symbol-from-alist
+	       buf-type ediff-current-diff-overlay-alist)))
 	    (overlay
 	     (ediff-get-diff-overlay ediff-current-difference buf-type))
 	    )
@@ -1326,7 +1631,8 @@
   (if (and (ediff-has-face-support-p) ediff-use-faces)
       (let* ((inhibit-quit t)
 	     (current-diff-overlay-var
-	      (intern (format "ediff-current-diff-overlay-%S" buf-type)))
+	      (ediff-get-symbol-from-alist
+	       buf-type ediff-current-diff-overlay-alist))
 	     (current-diff-overlay (symbol-value current-diff-overlay-var)))
 	(ediff-paint-background-regions 'unhighlight)
 	(if (ediff-overlayp current-diff-overlay)
@@ -1557,7 +1863,7 @@
       (ediff-empty-diff-region-p n buf-type)
       (let ((beg (ediff-get-diff-posn buf-type 'beg n))
 	    (end (ediff-get-diff-posn buf-type 'end n)))
-	(ediff-eval-in-buffer (ediff-get-buffer buf-type)
+	(ediff-with-current-buffer (ediff-get-buffer buf-type)
 	  (save-excursion
 	    (goto-char beg)
 	    (skip-chars-forward ediff-whitespace)
@@ -1632,8 +1938,8 @@
 
     
 (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end)
-  (ediff-eval-in-buffer 
-      (ediff-eval-in-buffer ctrl-buf (ediff-get-buffer buf-type))
+  (ediff-with-current-buffer 
+      (ediff-with-current-buffer ctrl-buf (ediff-get-buffer buf-type))
     (buffer-substring
      (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf))
      (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf)))))
@@ -1678,8 +1984,8 @@
 
 ;;; Local Variables:
 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
-;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
-;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body))
+;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
+;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
 ;;; End:
      
 (provide 'ediff-init)