]> code.delx.au - gnu-emacs/blobdiff - lisp/ediff-init.el
*** empty log message ***
[gnu-emacs] / lisp / ediff-init.el
index 9eadd0b85565112ad1fec965cd65287bc6a760fc..f6aa724ee4469024fc33cffc0331facb80e60a43 100644 (file)
@@ -192,10 +192,6 @@ that Ediff doesn't know about.")
             (error ediff-KILLED-VITAL-BUFFER))
         ))))
         
             (error ediff-KILLED-VITAL-BUFFER))
         ))))
         
-(put 'ediff-eval-in-buffer 'lisp-indent-function 1)
-(put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
-(put 'ediff-eval-in-buffer 'edebug-form-spec '(form body))
-
 
 (defsubst ediff-multiframe-setup-p ()
   (and (ediff-window-display-p) ediff-multiframe))
 
 (defsubst ediff-multiframe-setup-p ()
   (and (ediff-window-display-p) ediff-multiframe))
@@ -286,6 +282,15 @@ that Ediff doesn't know about.")
          ediff-merge-directory-revisions-with-ancestor
          ;; add more here
          )))
          ediff-merge-directory-revisions-with-ancestor
          ;; add more here
          )))
+(defsubst ediff-merge-metajob (&optional metajob)
+  (memq (or metajob ediff-metajob-name)
+       '(ediff-merge-directories
+         ediff-merge-directories-with-ancestor
+         ediff-merge-directory-revisions
+         ediff-merge-directory-revisions-with-ancestor
+         ediff-merge-filegroups-with-ancestor 
+         ;; add more here
+         )))
 
 (defsubst ediff-metajob3 (&optional metajob)
   (memq (or metajob ediff-metajob-name)
 
 (defsubst ediff-metajob3 (&optional metajob)
   (memq (or metajob ediff-metajob-name)
@@ -349,126 +354,11 @@ set local variables that determine how the display looks like.")
   "*Hooks to run on exiting Ediff but before killing the control buffer.
 This is a place to do various cleanups, such as deleting the variant buffers.
 Ediff provides a function, `ediff-janitor', as one such possible hook.")
   "*Hooks to run on exiting Ediff but before killing the control buffer.
 This is a place to do various cleanups, such as deleting the variant buffers.
 Ediff provides a function, `ediff-janitor', as one such possible hook.")
+(defvar ediff-quit-merge-hook 'ediff-maybe-save-and-delete-merge
+  "*Hooks to run before quitting a merge job.
+The most common use is to save and delete the merge buffer.")
 
 
 
 
-;; Help messages
-
-(defconst ediff-long-help-message-head
-  "   Moving around     |     Toggling features     |       Manipulations
-=====================|===========================|============================="
-  "The head of the full help message.")
-(defconst ediff-long-help-message-tail
-  "=====================|===========================|=============================
-    R -show registry |                           |  M   -show session group
-    D -diff output   |     E -browse Ediff manual|  G   -send bug report   
-    i -status info   |     ? -help off           |  z/q -suspend/quit
--------------------------------------------------------------------------------
-X,Y (x,y)  on the left are meta-symbols for the keys  A,B,C (a,b,c).
-X,Y on the right are meta-symbols for buffers A,B,C.
-A,B,C on the right denote the working buffers A,B,C, respectively."
-  "The tail of the full-help message.")
-
-(defconst ediff-long-help-message-compare3
-  "
-p,DEL -previous diff |     | -vert/horiz split   | xy -copy buf X's region to Y
-n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
-    j -jump to diff  |     @ -auto-refinement    |  * -refine current region
-   gx -goto X's point|                           |  ! -update diff regions
-  C-l -recenter      |    ## -ignore whitespace  |
-  v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
-  </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-                     |     m -wide display       |  ~ -rotate buffers
-"
-  "Help message usually used for 3-way comparison.
-Normally, not a user option. See `ediff-help-message' for details.")
-  
-(defconst ediff-long-help-message-compare2
-  "
-p,DEL -previous diff |     | -vert/horiz split   |a/b -copy A/B's region to B/A
-n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
-    j -jump to diff  |     @ -auto-refinement    |  * -refine current region
-   gx -goto X's point|                           |  ! -update diff regions
-  C-l -recenter      |    ## -ignore whitespace  |
-  v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
-  </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-    ~ -swap variants |     m -wide display       |  
-"
-  "Help message usually used for 2-way comparison.
-Normally, not a user option. See `ediff-help-message' for details.")
-  
-(defconst ediff-long-help-message-narrow2
-  "
-p,DEL -previous diff |     | -vert/horiz split   |a/b -copy A/B's region to B/A
-n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
-    j -jump to diff  |     @ -auto-refinement    |  * -refine current region
-   gx -goto X's point|     % -narrow/widen buffs |  ! -update diff regions
-  C-l -recenter      |    ## -ignore whitespace  |
-  v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
-  </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-    ~ -swap variants |     m -wide display       |  
-"
-  "Help message when comparing windows or regions line-by-line.
-Normally, not a user option. See `ediff-help-message' for details.")
-  
-(defconst ediff-long-help-message-word-mode
-  "
-p,DEL -previous diff |     | -vert/horiz split   | xy -copy buf X's region to Y
-n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
-    j -jump to diff  |                           |                   
-   gx -goto X's point|     % -narrow/widen buffs |  ! -recompute diffs
-  C-l -recenter      |                           |
-  v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
-  </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
-    ~ -swap variants |     m -wide display       |  
-"
-  "Help message when comparing windows or regions word-by-word.
-Normally, not a user option. See `ediff-help-message' for details.")
-  
-(defconst ediff-long-help-message-merge
-  "
-p,DEL -previous diff |     | -vert/horiz split   |  x -copy buf X's region to C
-n,SPC -next diff     |     h -hiliting           |  r -restore buf C's old diff
-    j -jump to diff  |     @ -auto-refinement    |  * -refine current region
-   gx -goto X's point|    ## -ignore whitespace  |  ! -update diff regions
-  C-l -recenter      | #f/#h -focus/hide regions |  + -combine diff regions
-  v/V -scroll up/dn  |     X -read-only in buf X | wx -save buf X
-  </> -scroll lt/rt  |     m -wide display       | wd -save diff output
-    ~ -swap variants |     s -shrink window C    |  / -show ancestor buff 
-                     |     $ -show clashes only  |  & -merge w/new default
-"
-  "Help message during merging.
-Normally, not a user option. See `ediff-help-message' for details.")
-
-;; The actual long help message.
-(ediff-defvar-local ediff-long-help-message ""
-  "Normally, not a user option. See `ediff-help-message' for details.")
-  
-(defconst ediff-brief-message-string
-  "  ? - help  "
-  "Contents of the brief help message.")
-;; The actual brief help message
-(ediff-defvar-local ediff-brief-help-message ""
-  "Normally, not a user option. See `ediff-help-message' for details.")
-  
-(ediff-defvar-local ediff-brief-help-message-function nil
-  "The brief help message that the user can customize.
-If the user sets this to a parameter-less function, Ediff will use it to
-produce the brief help message. This function must return a string.")
-(ediff-defvar-local ediff-long-help-message-function nil
-  "The long help message that the user can customize.
-See `ediff-brief-help-message-function' for more.")
-
-(defvar ediff-use-long-help-message nil
-  "*If t, Ediff displays a long help message. Short help message otherwise.")
-
-;; The actual help message.
-(ediff-defvar-local ediff-help-message ""
-  "The actual help message.
-Normally, the user shouldn't touch this. However, if you want Ediff to
-start up with different help messages for different jobs, you can change
-the value of this variable and the variables `ediff-help-message-*' in
-`ediff-startup-hook'.") 
-
 ;; Error messages
 (defconst ediff-KILLED-VITAL-BUFFER
   "You have killed a vital Ediff buffer---you must leave Ediff now!")
 ;; Error messages
 (defconst ediff-KILLED-VITAL-BUFFER
   "You have killed a vital Ediff buffer---you must leave Ediff now!")
@@ -477,6 +367,12 @@ the value of this variable and the variables `ediff-help-message-*' in
 (defconst ediff-BAD-DIFF-NUMBER
   ;; %S stands for this-command, %d - diff number, %d - max diff
   "%S: Bad diff region number, %d. Valid numbers are 1 to %d")
 (defconst ediff-BAD-DIFF-NUMBER
   ;; %S stands for this-command, %d - diff number, %d - max diff
   "%S: Bad diff region number, %d. Valid numbers are 1 to %d")
+(defconst ediff-BAD-INFO (format "
+*** The Info file for Ediff, a part of the standard distribution
+*** of %sEmacs, does not seem to be properly installed.
+*** 
+*** Please contact your system administrator. "
+                                (if ediff-xemacs-p "X" "")))
  
 ;; Selective browsing
 
  
 ;; Selective browsing
 
@@ -517,12 +413,6 @@ See the documentation string of `ediff-focus-on-regexp-matches' for details.")
 (ediff-defvar-local ediff-hide-regexp-connective 'and "")
   
   
 (ediff-defvar-local ediff-hide-regexp-connective 'and "")
   
   
-(defvar ediff-ange-ftp-ftp-name (if ediff-xemacs-p
-                                   'ange-ftp-ftp-path
-                                 'ange-ftp-ftp-name)
-  "Function ange-ftp uses to find out if file is remote.")
-  
-
 ;; Copying difference regions between buffers.    
 (ediff-defvar-local ediff-killed-diffs-alist nil
   "A list of killed diffs. 
 ;; Copying difference regions between buffers.    
 (ediff-defvar-local ediff-killed-diffs-alist nil
   "A list of killed diffs. 
@@ -617,8 +507,8 @@ ediff-toggle-hilit. Use `setq-default' to set it.")
 (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
 ;; Buffer-local variables to be saved then restored during Ediff sessions
 ;; Buffer-local variables to be saved then restored during Ediff sessions
-(defconst ediff-protected-variables '(buffer-read-only 
-;;;                                  synchronize-minibuffers
+(defconst ediff-protected-variables '(
+                                     ;;buffer-read-only 
                                      mode-line-format))
 
 ;; Vector of differences between the variants.  Each difference is
                                      mode-line-format))
 
 ;; Vector of differences between the variants.  Each difference is
@@ -863,6 +753,15 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
               (copy-face 'secondary-selection face))))
     ))
 
               (copy-face 'secondary-selection face))))
     ))
 
+(defun ediff-set-face-pixmap (face pixmap)
+  "Set face pixmap on a monochrome display."
+  (if (and (ediff-window-display-p) (not (ediff-color-display-p)))
+      (condition-case nil
+         (set-face-background-pixmap face pixmap)
+       (error
+        (message "Pixmap not found for %S: %s" (face-name face) pixmap)
+        (sit-for 1)))))
+
 (defun ediff-hide-face (face)
   (if (and (ediff-has-face-support-p) ediff-emacs-p)
       (add-to-list 'facemenu-unlisted-faces face)))
 (defun ediff-hide-face (face)
   (if (and (ediff-has-face-support-p) ediff-emacs-p)
       (add-to-list 'facemenu-unlisted-faces face)))
@@ -935,6 +834,13 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
             'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))))
   "Face for highlighting the selected difference in the ancestor buffer.")
 
             'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))))
   "Face for highlighting the selected difference in the ancestor buffer.")
 
+(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
 (defvar ediff-fine-diff-face-A
   (if (ediff-has-face-support-p)
       (progn
@@ -946,7 +852,11 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
                                   "Navy")
                   (ediff-set-face 'background 'ediff-fine-diff-face-A
                                   "sky blue"))
                                   "Navy")
                   (ediff-set-face 'background 'ediff-fine-diff-face-A
                                   "sky blue"))
-                 (t (set-face-underline-p 'ediff-fine-diff-face-A t))))
+                 (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.")
 
        'ediff-fine-diff-face-A))
   "Face for highlighting the refinement of the selected diff in buffer A.")
 
@@ -959,7 +869,11 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
            (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"))
            (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))))
+                 (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.")
     
        'ediff-fine-diff-face-B))
   "Face for highlighting the refinement of the selected diff in buffer B.")
     
@@ -973,7 +887,11 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
                   (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
                   (ediff-set-face
                    'background 'ediff-fine-diff-face-C "Turquoise"))
                   (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))))
+                 (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.")
 
        'ediff-fine-diff-face-C))
   "Face for highlighting the refinement of the selected diff in buffer C.")
 
@@ -983,8 +901,12 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
        (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)
        (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)
-           (copy-face
-            'ediff-fine-diff-face-C '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.")
   "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.")
@@ -1001,7 +923,10 @@ ancestor buffer.")
                   (ediff-set-face
                    'background 'ediff-even-diff-face-A "light grey"))
                  (t 
                   (ediff-set-face
                    'background 'ediff-even-diff-face-A "light grey"))
                  (t 
-                  (copy-face 'italic 'ediff-even-diff-face-A))))
+                  (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.")
       
        'ediff-even-diff-face-A))
   "Face used to highlight even-numbered differences in buffer A.")
       
@@ -1017,7 +942,10 @@ ancestor buffer.")
                   (ediff-set-face
                    'background 'ediff-even-diff-face-B "Gray"))
                  (t 
                   (ediff-set-face
                    'background 'ediff-even-diff-face-B "Gray"))
                  (t 
-                  (copy-face 'italic 'ediff-even-diff-face-B))))
+                  (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.")
     
        'ediff-even-diff-face-B))
   "Face used to highlight even-numbered differences in buffer B.")
     
@@ -1027,7 +955,10 @@ ancestor buffer.")
        (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)
        (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)
-           (copy-face 'ediff-even-diff-face-A '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.")
 
        'ediff-even-diff-face-C))
   "Face used to highlight even-numbered differences in buffer C.")
 
@@ -1037,7 +968,11 @@ ancestor buffer.")
        (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)
        (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)
-           (copy-face 'ediff-even-diff-face-C '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.")
   
        'ediff-even-diff-face-Ancestor))
   "Face highlighting even-numbered differences in the ancestor buffer.")
   
@@ -1053,7 +988,10 @@ ancestor buffer.")
                   (ediff-set-face
                    'background 'ediff-odd-diff-face-A "Gray"))
                  (t 
                   (ediff-set-face
                    'background 'ediff-odd-diff-face-A "Gray"))
                  (t 
-                  (copy-face 'italic 'ediff-odd-diff-face-A))))
+                  (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.")
       
        'ediff-odd-diff-face-A))
   "Face used to highlight odd-numbered differences in buffer A.")
       
@@ -1069,7 +1007,10 @@ ancestor buffer.")
                   (ediff-set-face
                    'background 'ediff-odd-diff-face-B "light grey"))
                  (t 
                   (ediff-set-face
                    'background 'ediff-odd-diff-face-B "light grey"))
                  (t 
-                  (copy-face 'italic 'ediff-odd-diff-face-B))))
+                  (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.")
     
        'ediff-odd-diff-face-B))
   "Face used to highlight odd-numbered differences in buffer B.")
     
@@ -1079,7 +1020,10 @@ ancestor buffer.")
        (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)
        (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)
-           (copy-face 'ediff-odd-diff-face-A '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.")
 
        'ediff-odd-diff-face-C))
   "Face used to highlight odd-numbered differences in buffer C.")
 
@@ -1089,7 +1033,10 @@ ancestor buffer.")
        (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)
        (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)
-           (copy-face 'ediff-odd-diff-face-C '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.")
 
        'ediff-odd-diff-face-Ancestor))
   "Face used to highlight even-numbered differences in the ancestor buffer.")
 
@@ -1147,6 +1094,15 @@ control is used, it could be `vc-toggle-read-only' or `rcs-toggle-read-only'.")
 
 ;; if nil, this silences some messages
 (defconst ediff-verbose-p t)
 
 ;; if nil, this silences some messages
 (defconst ediff-verbose-p t)
+
+(ediff-defvar-local ediff-autostore-merges  'group-jobs-only
+  "*Save the results of merge jobs automatically.
+Nil means don't save automatically. t means always save. Anything but nil or t
+means save automatically only if the merge job is part of a group of jobs, such
+as `ediff-merge-directory' or `ediff-merge-directory-revisions'.")
+
+;; file where the result of the merge is to be saved. used internally
+(ediff-defvar-local ediff-merge-store-file nil "")
   
 (defvar ediff-no-emacs-help-in-control-buffer nil
   "*Non-nil means C-h should not invoke Emacs help in control buffer.
   
 (defvar ediff-no-emacs-help-in-control-buffer nil
   "*Non-nil means C-h should not invoke Emacs help in control buffer.
@@ -1192,8 +1148,10 @@ More precisely, a regexp to match any one such character.")
 ;;; In-line functions
 
 (defsubst ediff-file-remote-p (file-name)
 ;;; In-line functions
 
 (defsubst ediff-file-remote-p (file-name)
-  (if (fboundp ediff-ange-ftp-ftp-name)
-      (funcall ediff-ange-ftp-ftp-name file-name)))
+  (require 'ange-ftp)
+  (car (if ediff-xemacs-p
+          (ange-ftp-ftp-path file-name)
+        (ange-ftp-ftp-name file-name))))
 
     
 (defsubst ediff-frame-unsplittable-p (frame)
 
     
 (defsubst ediff-frame-unsplittable-p (frame)
@@ -1210,6 +1168,93 @@ More precisely, a regexp to match any one such character.")
   "Kill buffer BUF if it exists."
   (if (ediff-buffer-live-p buf)
       (kill-buffer (get-buffer buf))))
   "Kill buffer BUF if it exists."
   (if (ediff-buffer-live-p buf)
       (kill-buffer (get-buffer buf))))
+
+
+;; 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))))
+       overl diff-num)
+    (mapcar (function
+            (lambda (rec)
+              (setq overl (ediff-get-diff-overlay-from-diff-record rec)
+                    diff-num (ediff-overlay-get overl 'ediff-diff-num))
+              (ediff-set-overlay-face
+               overl
+               (if (not unhighlight)
+                   (ediff-background-face buf-type diff-num))
+               )))
+           diff-vector)))
+
+
+;; activate faces on diff regions in all buffers
+(defun ediff-paint-background-regions (&optional unhighlight)
+  (ediff-paint-background-regions-in-one-buffer
+   'A unhighlight)
+  (ediff-paint-background-regions-in-one-buffer
+   'B unhighlight)
+  (ediff-paint-background-regions-in-one-buffer
+   'C unhighlight)
+  (ediff-paint-background-regions-in-one-buffer
+   'Ancestor unhighlight))
+
+(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)))
+            (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)))))
+       
+       (if ediff-xemacs-p
+           (ediff-move-overlay current-diff-overlay begin end-hilit)
+         (ediff-move-overlay current-diff-overlay begin end-hilit buff))
+       (ediff-overlay-put current-diff-overlay 'priority  
+                          (ediff-highest-priority begin end-hilit buff))
+       (ediff-overlay-put current-diff-overlay 'ediff-diff-num n)
+       
+       ;; unhighlight the background overlay for diff n so it won't
+       ;; interfere with the current diff overlay
+       (ediff-set-overlay-face (ediff-get-diff-overlay n buf-type) nil)
+       )))
+
+
+(defun ediff-unhighlight-diff-in-one-buffer (buf-type)
+  (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))))
+           (overlay
+            (ediff-get-diff-overlay ediff-current-difference buf-type))
+           )
+    
+       (ediff-move-overlay current-diff-overlay 1 1)
+       
+       ;; rehighlight the overlay in the background of the
+       ;; current difference region
+       (ediff-set-overlay-face
+        overlay
+        (if (and (ediff-has-face-support-p)
+                 ediff-use-faces ediff-highlight-all-diffs)
+            (ediff-background-face buf-type ediff-current-difference)))
+       )))
+
+(defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
+  (ediff-unselect-and-select-difference -1)
+  (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)))
+            (current-diff-overlay (symbol-value current-diff-overlay-var)))
+       (ediff-paint-background-regions 'unhighlight)
+       (if (ediff-overlayp current-diff-overlay)
+           (ediff-delete-overlay current-diff-overlay))
+       (set current-diff-overlay-var nil)
+       )))
       
 
 (defsubst ediff-highlight-diff (n)
       
 
 (defsubst ediff-highlight-diff (n)
@@ -1367,6 +1412,7 @@ More precisely, a regexp to match any one such character.")
       (glyph-height ediff-H-glyph (selected-window frame))
     (frame-char-height frame)))
     
       (glyph-height ediff-H-glyph (selected-window frame))
     (frame-char-height frame)))
     
+;; Some overlay functions
 
 (defsubst ediff-empty-overlay-p (overl)
   (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
 
 (defsubst ediff-empty-overlay-p (overl)
   (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
@@ -1384,6 +1430,32 @@ More precisely, a regexp to match any one such character.")
   (if ediff-emacs-p
       (overlay-get overl property)
     (and (extent-live-p overl) (extent-property overl property))))
   (if ediff-emacs-p
       (overlay-get overl property)
     (and (extent-live-p overl) (extent-property overl property))))
+
+
+;; These two functions are here because XEmacs refuses to
+;; handle overlays whose buffers were deleted.
+(defun ediff-move-overlay (overlay beg end &optional buffer)
+  "Calls `move-overlay' in Emacs and `set-extent-endpoints' in Lemacs.
+Checks if overlay's buffer exists before actually doing the move."
+  (let ((buf (and overlay (ediff-overlay-buffer overlay))))
+    (if (ediff-buffer-live-p buf)
+       (if ediff-xemacs-p
+           (set-extent-endpoints overlay beg end)
+         (move-overlay overlay beg end buffer))
+      ;; buffer's dead
+      (if overlay
+         (ediff-delete-overlay overlay)))))
+         
+(defun ediff-overlay-put (overlay prop value)
+  "Calls `overlay-put' or `set-extent-property' depending on Emacs version.
+Checks if overlay's buffer exists."
+  (if (ediff-buffer-live-p (ediff-overlay-buffer overlay))
+      (if ediff-xemacs-p
+         (set-extent-property overlay prop value)
+       (overlay-put overlay prop value))
+    (ediff-delete-overlay overlay)))
+
+;; Some diff region tests
   
 ;; t if diff region is empty.
 ;; In case of buffer C, t also if it is not a 3way
   
 ;; t if diff region is empty.
 ;; In case of buffer C, t also if it is not a 3way
@@ -1516,8 +1588,18 @@ More precisely, a regexp to match any one such character.")
   (ediff-file-attributes filename 5))
 
 
   (ediff-file-attributes filename 5))
 
 
+(defun ediff-convert-standard-filename (fname)
+  (if ediff-emacs-p
+      (convert-standard-filename fname)
+    ;; hopefully, XEmacs adds this functionality
+    fname))
 
 
 
 
+;;; 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))
+;;; End:
      
 (provide 'ediff-init)
 
      
 (provide 'ediff-init)