changeset 33019:6306740f6938

2000-10-29 Michael Kifer <kifer@cs.sunysb.edu> * viper-cmd.el (viper-preserve-cursor-color): new test that avoids rewrawing the screen when changing cursor color. (viper-insert-state-pre-command-sentinel, viper-replace-state-pre-command-sentinel, viper-replace-state-post-command-sentinel): use viper-preserve-cursor-color. Many functions changed to use viper= instead of = when comparing characters. * viper-util.el (viper-memq-char,viper=): new functions for working with characters. (viper-change-cursor-color): fixed buglet. Many functions changed to use viper= instead of = when comparing characters. * viper.el (viper-insert-state-mode-list): added eshell. * ediff-init.el (ediff-before-setup-hook): new hook. Several typos fixed in various docstrings. * ediff-merg.el (ediff-show-clashes-only): docstring typo fixed. * ediff-nult.el (ediff-before-session-group-setup-hooks): new hook. (ediff-show-meta-buffer): run ediff-before-session-group-setup-hooks. * ediff-util.el (ediff-setup): run ediff-before-setup-hook. (ediff-other-buffer): use selected buffers if in Buffer-menu buffer. (ediff-get-selected-buffers): new function. * ediff-vers.el (ediff-vc-internal,ediff-rcs-internal, ediff-vc-merge-internal,ediff-rcs-merge-internal): use save-window-excursion. * ediff-wind.el (ediff-skip-unsuitable-frames): more robust termination check in while loop. * ediff.el (ediff-get-default-file-name): better defaults when in dired buffer. (ediff-files,ediff-merge-files,ediff-files3, ediff-merge-files-with-ancestor): use ediff-get-default-file-name.
author Michael Kifer <kifer@cs.stonybrook.edu>
date Sun, 29 Oct 2000 04:56:45 +0000
parents d9abb0441663
children e21feeab77fb
files lisp/ChangeLog lisp/ediff-init.el lisp/ediff-merg.el lisp/ediff-mult.el lisp/ediff-util.el lisp/ediff-vers.el lisp/ediff-wind.el lisp/ediff.el lisp/emulation/viper-cmd.el lisp/emulation/viper-util.el lisp/emulation/viper.el man/ediff.texi man/viper.texi
diffstat 13 files changed, 357 insertions(+), 203 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ChangeLog	Sun Oct 29 04:56:45 2000 +0000
@@ -1,3 +1,39 @@
+2000-10-29  Michael Kifer  <kifer@cs.sunysb.edu>
+	
+	* viper-cmd.el (viper-preserve-cursor-color): new test that avoids
+	rewrawing the screen when changing cursor color.
+	(viper-insert-state-pre-command-sentinel,
+	viper-replace-state-pre-command-sentinel,
+	viper-replace-state-post-command-sentinel): use
+	viper-preserve-cursor-color.
+	Many functions changed to use viper= instead of = when comparing
+	characters.
+	* viper-util.el (viper-memq-char,viper=): new functions for
+	working with characters.
+	(viper-change-cursor-color): fixed buglet.
+	Many functions changed to use viper= instead of = when comparing
+	characters.
+	* viper.el (viper-insert-state-mode-list): added eshell.
+	
+	* ediff-init.el (ediff-before-setup-hook): new hook.
+	Several typos fixed in various docstrings.
+	* ediff-merg.el (ediff-show-clashes-only): docstring typo fixed.
+	* ediff-nult.el (ediff-before-session-group-setup-hooks): new
+	hook.
+	(ediff-show-meta-buffer): run ediff-before-session-group-setup-hooks.
+	* ediff-util.el (ediff-setup): run ediff-before-setup-hook.
+	(ediff-other-buffer): use selected buffers if in Buffer-menu buffer.
+	(ediff-get-selected-buffers): new function.
+	* ediff-vers.el (ediff-vc-internal,ediff-rcs-internal,
+	ediff-vc-merge-internal,ediff-rcs-merge-internal): use
+	save-window-excursion.
+	* ediff-wind.el (ediff-skip-unsuitable-frames): more robust
+	termination check in while loop.
+	* ediff.el (ediff-get-default-file-name): better defaults when in
+	dired buffer.
+	(ediff-files,ediff-merge-files,ediff-files3,
+	ediff-merge-files-with-ancestor): use ediff-get-default-file-name.
+	
 2000-10-28  Dave Love  <fx@gnu.org>
 
 	* info.el (Info-fontify-node): Add help-echo for menu items.
--- a/lisp/ediff-init.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-init.el	Sun Oct 29 04:56:45 2000 +0000
@@ -376,10 +376,17 @@
 
 ;; Hook variables
 
+(defcustom ediff-before-setup-hook nil
+  "*Hooks to run before Ediff begins to set up windows and buffers.
+This hook can be used to save the previous window config, which can be restored
+on ediff-quit or ediff-suspend."
+  :type 'hook
+  :group 'ediff-hook) 
 (defcustom ediff-before-setup-windows-hook nil
   "*Hooks to run before Ediff sets its window configuration. 
-This can be used to save the previous window config, which can be restored
-on ediff-quit or ediff-suspend."
+This hook is called every time when Ediff arranges its windows.
+This happens each time Ediff detects that the windows were messed up by the
+user."
   :type 'hook
   :group 'ediff-hook) 
 (defcustom ediff-after-setup-windows-hook nil
@@ -399,7 +406,7 @@
   :type 'hook
   :group 'ediff-hook)
 (defcustom ediff-startup-hook nil
-  "*Hooks to run in the control buffer after Ediff has been set up."
+  "*Hooks to run in the control buffer after Ediff has been set up and is ready for the job."
   :type 'hook
   :group 'ediff-hook)
 (defcustom ediff-select-hook nil
@@ -777,14 +784,14 @@
 					     'display-pixel-height
 					   'x-display-pixel-height)))))
       
-;; A-list of current-diff-overlay symbols asssociated with buf types
+;; A-list of current-diff-overlay symbols associated 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
+;; A-list of current-diff-face-* symbols associated with buf types
 (defconst ediff-current-diff-face-alist
   '((A . ediff-current-diff-face-A)
     (B . ediff-current-diff-face-B)
--- a/lisp/ediff-merg.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-merg.el	Sun Oct 29 04:56:45 2000 +0000
@@ -80,7 +80,7 @@
 (defcustom ediff-show-clashes-only nil
   "*If t, show only those diff regions where both buffers disagree with the ancestor.
 This means that regions that have status prefer-A or prefer-B will be
-skiped over.  Nil means show all regions."
+skipped over.  Nil means show all regions."
   :type 'boolean
   :group 'ediff-merge
   )
--- a/lisp/ediff-mult.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-mult.el	Sun Oct 29 04:56:45 2000 +0000
@@ -187,7 +187,15 @@
   "*Hooks run just after the registry control panel is set up."
   :type 'hook
   :group 'ediff-mult)
-(defcustom ediff-session-group-setup-hook nil
+
+(defcustom ediff-before-session-group-setup-hooks nil
+  "*Hooks to run before Ediff arranges the window for group-level operations.
+It is used by commands such as ediff-directories.
+This hook can be used to save the previous window config, which can be restored
+on ediff-quit, ediff-suspend, or ediff-quit-session-group-hook."
+  :type 'hook
+  :group 'ediff-hook) 
+(defcustom ediff-after-session-group-setup-hook nil
   "*Hooks run just after a meta-buffer controlling a session group, such as
 ediff-directories, is run."
   :type 'hook
@@ -706,7 +714,7 @@
 
       (if (eq ediff-metajob-name 'ediff-registry)
 	  (run-hooks 'ediff-registry-setup-hook)
-	(run-hooks 'ediff-session-group-setup-hook))
+	(run-hooks 'ediff-after-session-group-setup-hook))
       ) ; eval in meta-buffer
     meta-buffer))
 
@@ -1719,6 +1727,7 @@
 (defun ediff-show-meta-buffer (&optional meta-buf session-number)
   "Show the session group buffer."
   (interactive)
+  (run-hooks 'ediff-before-directory-setup-hooks)
   (let (wind frame silent)
     (if meta-buf (setq silent t))
 
--- a/lisp/ediff-util.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-util.el	Sun Oct 29 04:56:45 2000 +0000
@@ -254,6 +254,7 @@
 (defun ediff-setup (buffer-A file-A buffer-B file-B buffer-C file-C
 			     startup-hooks setup-parameters
 			     &optional merge-buffer-file)
+  (run-hooks 'ediff-before-setup-hook)
   ;; ediff-convert-standard-filename puts file names in the form appropriate
   ;; for the OS at hand.
   (setq file-A (ediff-convert-standard-filename (expand-file-name file-A)))
@@ -955,7 +956,7 @@
 	
 (defun ediff-make-or-kill-fine-diffs (arg)
   "Compute fine diffs.  With negative prefix arg, kill fine diffs.
-In both cases, operates on the currrent difference region." 
+In both cases, operates on the current difference region." 
   (interactive "P")
   (ediff-barf-if-not-control-buffer)
   (cond ((eq arg '-)
@@ -3459,7 +3460,11 @@
 ;; EXCL-BUFF-LIST is an exclusion list. 
 (defun ediff-other-buffer (excl-buff-lst)
   (or (listp excl-buff-lst) (setq excl-buff-lst (list excl-buff-lst)))
-  (let* ((all-buffers (buffer-list))
+  (let* ((all-buffers (nconc (ediff-get-selected-buffers) (buffer-list)))
+	 ;; we compute this the second time because we need to do memq on it
+	 ;; later, and nconc above will break it. Either this or use slow
+	 ;; append instead of nconc
+	 (selected-buffers (ediff-get-selected-buffers))
 	 (prefered-buffer (car all-buffers))
 	 visible-dired-buffers
 	 (excl-buff-name-list 
@@ -3488,33 +3493,34 @@
 	  (mapcar
 	   (lambda (x)
 	     (cond ((member (buffer-name x) excl-buff-name-list) nil)
-			     ((not (ediff-get-visible-buffer-window x)) nil)
-			     ((eq x prefered-buffer) x)
-			     ;; if prev selected buffer is dired, look only at
-			     ;; dired.
-			     ((eq use-dired-major-mode 'yes)
-			      (if (eq (ediff-with-current-buffer x major-mode)
-				      'dired-mode)
-				  x nil))
-			     ((eq (ediff-with-current-buffer x major-mode)
-				  'dired-mode)
-			      (if (null use-dired-major-mode)
-				  ;; don't know if we must enforce dired.
-				  ;; Remember this buffer in case
-				  ;; dired buffs are the only ones visible.
-				  (setq visible-dired-buffers
-					(cons x visible-dired-buffers)))
-			      ;; skip, if dired is not forced
-			      nil)
-			     ((memq (ediff-with-current-buffer x major-mode)
-				    '(rmail-mode
-				      vm-mode
-				      gnus-article-mode
-				      mh-show-mode))
-			      x)
-			     ((string-match "^[ *]" (buffer-name x)) nil)
-			     ((string= "*scratch*" (buffer-name x)) nil)
-			     (t x)))
+		   ((memq x selected-buffers) x)
+		   ((not (ediff-get-visible-buffer-window x)) nil)
+		   ((eq x prefered-buffer) x)
+		   ;; if prev selected buffer is dired, look only at
+		   ;; dired.
+		   ((eq use-dired-major-mode 'yes)
+		    (if (eq (ediff-with-current-buffer x major-mode)
+			    'dired-mode)
+			x nil))
+		   ((eq (ediff-with-current-buffer x major-mode)
+			'dired-mode)
+		    (if (null use-dired-major-mode)
+			;; don't know if we must enforce dired.
+			;; Remember this buffer in case
+			;; dired buffs are the only ones visible.
+			(setq visible-dired-buffers
+			      (cons x visible-dired-buffers)))
+		    ;; skip, if dired is not forced
+		    nil)
+		   ((memq (ediff-with-current-buffer x major-mode)
+			  '(rmail-mode
+			    vm-mode
+			    gnus-article-mode
+			    mh-show-mode))
+		    x)
+		   ((string-match "^[ *]" (buffer-name x)) nil)
+		   ((string= "*scratch*" (buffer-name x)) nil)
+		   (t x)))
 	   all-buffers))
 	 (clean-significant-buffers (delq nil significant-buffers))
 	 less-significant-buffers)
@@ -3547,6 +3553,23 @@
 	  (t "*scratch*"))
     ))
       
+
+;; If current buffer is a Buffer-menu buffer, then take the selected buffers
+;; and append the buffer at the cursor to the end.
+;; This list would be the preferred list.
+(defun ediff-get-selected-buffers ()
+  (if (eq major-mode 'Buffer-menu-mode)
+      (let ((lis (condition-case nil
+		     (list (Buffer-menu-buffer t))
+		   (error))
+		 ))
+	(save-excursion
+	  (goto-char (point-max))
+	  (while (search-backward "\n>" nil t)
+	    (forward-char 1)
+	    (setq lis (cons (Buffer-menu-buffer t) lis)))
+	  lis))
+    ))
       
 ;; Construct a unique buffer name.
 ;; The first one tried is prefixsuffix, then prefix<2>suffix, 
--- a/lisp/ediff-vers.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-vers.el	Sun Oct 29 04:56:45 2000 +0000
@@ -47,20 +47,21 @@
 ;; If the current buffer is named `F', the version is named `F.~REV~'.
 ;; If `F.~REV~' already exists, it is used instead of being re-created.
   (let (file1 file2 rev1buf rev2buf)
-    (save-excursion
-      (vc-version-other-window rev1)
-      (setq rev1buf (current-buffer)
-	    file1 (buffer-file-name)))
-    (save-excursion
-      (or (string= rev2 "") 		; use current buffer
-	  (vc-version-other-window rev2))
-      (setq rev2buf (current-buffer)
-	    file2 (buffer-file-name)))
-    (setq startup-hooks
-	  (cons `(lambda ()
-		   (delete-file ,file1)
-		   (or ,(string= rev2 "") (delete-file ,file2)))
-		startup-hooks))
+    (save-window-excursion
+      (save-excursion
+	(vc-version-other-window rev1)
+	(setq rev1buf (current-buffer)
+	      file1 (buffer-file-name)))
+      (save-excursion
+	(or (string= rev2 "") 		; use current buffer
+	    (vc-version-other-window rev2))
+	(setq rev2buf (current-buffer)
+	      file2 (buffer-file-name)))
+      (setq startup-hooks
+	    (cons `(lambda ()
+		     (delete-file ,file1)
+		     (or ,(string= rev2 "") (delete-file ,file2)))
+		  startup-hooks)))
     (ediff-buffers
      rev1buf rev2buf
      startup-hooks
@@ -107,10 +108,12 @@
 (defun ediff-rcs-internal (rev1 rev2 &optional startup-hooks)
 ;; Run Ediff on versions of the current buffer.
 ;; If REV2 is "" then use current buffer.
-  (let ((rev2buf (if (string= rev2 "")
-		     (current-buffer)
-		   (rcs-ediff-view-revision rev2)))
-	(rev1buf (rcs-ediff-view-revision rev1)))
+  (let (rev2buf rev1buf)
+    (save-window-excursion
+      (setq rev2buf (if (string= rev2 "")
+			(current-buffer)
+		      (rcs-ediff-view-revision rev2))
+	    rev1buf (rcs-ediff-view-revision rev1)))
 	
     ;; rcs.el doesn't create temp version files, so we don't have to delete
     ;; anything in startup hooks to ediff-buffers
@@ -149,30 +152,31 @@
 				     &optional startup-hooks merge-buffer-file)
 ;; If ANCESTOR-REV non-nil, merge with ancestor
   (let (buf1 buf2 ancestor-buf)
-    (save-excursion
-      (vc-version-other-window rev1)
-      (setq buf1 (current-buffer)))
-    (save-excursion
-      (or (string= rev2 "")
-	  (vc-version-other-window rev2))
-      (setq buf2 (current-buffer)))
-    (if ancestor-rev
-	(save-excursion
-	  (if (string= ancestor-rev "")
-	      (setq ancestor-rev (vc-workfile-version buffer-file-name)))
-	  (vc-version-other-window ancestor-rev)
-	  (setq ancestor-buf (current-buffer))))
-    (setq startup-hooks 
-	  (cons 
-	   `(lambda () 
-	      (delete-file ,(buffer-file-name buf1))
-	      (or ,(string= rev2 "")
-		  (delete-file ,(buffer-file-name buf2)))
-	      (or ,(string= ancestor-rev "")
-		  ,(not ancestor-rev)
-		  (delete-file ,(buffer-file-name ancestor-buf)))
-	      )
-	   startup-hooks))
+    (save-window-excursion
+      (save-excursion
+	(vc-version-other-window rev1)
+	(setq buf1 (current-buffer)))
+      (save-excursion
+	(or (string= rev2 "")
+	    (vc-version-other-window rev2))
+	(setq buf2 (current-buffer)))
+      (if ancestor-rev
+	  (save-excursion
+	    (if (string= ancestor-rev "")
+		(setq ancestor-rev (vc-workfile-version buffer-file-name)))
+	    (vc-version-other-window ancestor-rev)
+	    (setq ancestor-buf (current-buffer))))
+      (setq startup-hooks 
+	    (cons 
+	     `(lambda () 
+		(delete-file ,(buffer-file-name buf1))
+		(or ,(string= rev2 "")
+		    (delete-file ,(buffer-file-name buf2)))
+		(or ,(string= ancestor-rev "")
+		    ,(not ancestor-rev)
+		    (delete-file ,(buffer-file-name ancestor-buf)))
+		)
+	     startup-hooks)))
     (if ancestor-rev
 	(ediff-merge-buffers-with-ancestor
 	 buf1 buf2 ancestor-buf
@@ -186,14 +190,15 @@
 				      startup-hooks merge-buffer-file)
   ;; If ANCESTOR-REV non-nil, merge with ancestor
   (let (buf1 buf2 ancestor-buf)
-    (setq buf1 (rcs-ediff-view-revision rev1)
-	  buf2 (if (string= rev2 "")
-		   (current-buffer)
-		 (rcs-ediff-view-revision rev2))
-	  ancestor-buf (if ancestor-rev
-			   (if (string= ancestor-rev "")
-			       (current-buffer)
-			     (rcs-ediff-view-revision ancestor-rev))))
+    (save-window-excursion
+      (setq buf1 (rcs-ediff-view-revision rev1)
+	    buf2 (if (string= rev2 "")
+		     (current-buffer)
+		   (rcs-ediff-view-revision rev2))
+	    ancestor-buf (if ancestor-rev
+			     (if (string= ancestor-rev "")
+				 (current-buffer)
+			       (rcs-ediff-view-revision ancestor-rev)))))
     ;; rcs.el doesn't create temp version files, so we don't have to delete
     ;; anything in startup hooks to ediff-buffers
     (if ancestor-rev
--- a/lisp/ediff-wind.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff-wind.el	Sun Oct 29 04:56:45 2000 +0000
@@ -151,7 +151,6 @@
    '(vertical-scroll-bars . nil)  ; Emacs only
    '(scrollbar-width . 0)         ; XEmacs only
    '(menu-bar-lines . 0)          ; Emacs only
-   '(tool-bar-lines . 0)          ; Emacs only
    ;; don't lower and auto-raise
    '(auto-lower . nil)
    '(auto-raise . t)
@@ -831,8 +830,14 @@
 ;; create a new splittable frame if none is found
 (defun ediff-skip-unsuitable-frames (&optional ok-unsplittable)
   (if (ediff-window-display-p)
-      (let (last-window)
-	(while (and (not (eq (selected-window) last-window))
+      ;;(let (last-window)
+      (let (seen-windows)
+	;; (memq ... seen-windows) has quadratic behavior,
+	;; but (eq ... last-window) runs into an emacs bug where next-window
+	;; gets stuck in a loop if the only frame is the minibuffer.
+	;;
+	;;(while (and (not (eq (selected-window) last-window))
+	(while (and (not (memq (selected-window) seen-windows))
 		    (or
 		     (ediff-frame-has-dedicated-windows (selected-frame))
 		     (ediff-frame-iconified-p (selected-frame))
@@ -846,10 +851,12 @@
 			 nil
 		       (ediff-frame-unsplittable-p (selected-frame)))))
 	  ;; remember where started
-	  (or last-window (setq last-window (selected-window)))
+	  ;;(or last-window (setq last-window (selected-window)))
+	  (setq seen-windows (cons (selected-window) seen-windows))
 	  ;; try new window
 	  (other-window 1 t))
-	(if (eq (selected-window) last-window)
+	;;(if (eq (selected-window) last-window)
+	(if (memq (selected-window) seen-windows)
 	    ;; fed up, no appropriate frame
 	    (progn
 	      (select-frame (make-frame '((unsplittable)))))))))
--- a/lisp/ediff.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/ediff.el	Sun Oct 29 04:56:45 2000 +0000
@@ -6,8 +6,8 @@
 ;; Created: February 2, 1994
 ;; Keywords: comparing, merging, patching, version control.
 
-(defconst ediff-version "2.74" "The current version of Ediff")
-(defconst ediff-date "October 31, 1999" "Date of last update")  
+(defconst ediff-version "2.75" "The current version of Ediff")
+(defconst ediff-date "October 29, 2000" "Date of last update")  
 
 
 ;; This file is part of GNU Emacs.
@@ -163,13 +163,27 @@
     (toggle-read-only 1)))
 
 ;; Return a plausible default for ediff's first file:
-;; In dired, return the file name under the point, unless it is a directory
-;; If the buffer has a file name, return that file name.
-(defun ediff-get-default-file-name ()
+;; In dired, return the file number FILENO (or 0) in the list
+;; (all-selected-files, filename under the cursor), where directories are
+;; ignored. Otherwise, return DEFAULT file name, if non-nil. Else,
+;; if the buffer is visiting a file, return that file name.
+(defun ediff-get-default-file-name (&optional default fileno)
   (cond ((eq major-mode 'dired-mode)
-	 (let ((f (dired-get-filename nil 'no-error)))
-	   (if (and (stringp f) (not (file-directory-p f)))
-	       f)))
+	 (let ((current (dired-get-filename nil 'no-error))
+	       (marked (condition-case nil
+			   (dired-get-marked-files 'no-dir)
+			 (error)))
+	       aux-list choices result)
+	   (or (integerp fileno) (setq fileno 0))
+	   (if (stringp default)
+	       (setq aux-list (cons default aux-list)))
+	   (if (and (stringp current) (not (file-directory-p current)))
+	       (setq aux-list (cons current aux-list)))
+	   (setq choices (nconc  marked aux-list))
+	   (setq result (elt choices fileno))
+	   (or result
+	       default)))
+	((stringp default) default)
 	((buffer-file-name (current-buffer))
 	 (file-name-nondirectory (buffer-file-name (current-buffer))))
 	))
@@ -199,7 +213,7 @@
 						 (file-name-nondirectory f)
 						 dir-B))
 					       file-name-history))
-				   f))
+				   (ediff-get-default-file-name f 1)))
 	   )))
   (ediff-files-internal file-A 
 			(if (file-directory-p file-B)
@@ -234,7 +248,7 @@
 						     (file-name-nondirectory f)
 						     dir-B))
 						   file-name-history))
-					    f)))
+					    (ediff-get-default-file-name f 1))))
 	   (ediff-read-file-name "File C to compare" 
 				 (setq dir-C (if ediff-use-last-dir
 						 ediff-last-dir-C
@@ -246,7 +260,7 @@
 						 (file-name-nondirectory ff)
 						 dir-C))
 					       file-name-history))
-				   ff))
+				   (ediff-get-default-file-name ff 2)))
 	   )))
   (ediff-files-internal file-A 
 			(if (file-directory-p file-B)
@@ -1009,7 +1023,7 @@
 						 (file-name-nondirectory f)
 						 dir-B))
 					       file-name-history))
-				   f))
+				   (ediff-get-default-file-name f 1)))
 	   )))
   (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
   (ediff-files-internal file-A 
@@ -1052,7 +1066,7 @@
 						     (file-name-nondirectory f)
 						     dir-B))
 						   file-name-history))
-					    f)))
+					    (ediff-get-default-file-name f 1))))
 	   (ediff-read-file-name "Ancestor file" 
 				 (setq dir-ancestor
 				       (if ediff-use-last-dir
@@ -1065,7 +1079,7 @@
 						 (file-name-nondirectory ff)
 						 dir-ancestor))
 					       file-name-history))
-				   ff))
+				   (ediff-get-default-file-name ff 2)))
 	   )))
   (setq startup-hooks (cons 'ediff-merge-on-startup startup-hooks))
   (ediff-files-internal file-A 
--- a/lisp/emulation/viper-cmd.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/emulation/viper-cmd.el	Sun Oct 29 04:56:45 2000 +0000
@@ -79,8 +79,11 @@
 	 (nm-p (intern (concat snm "-p")))
 	 (nms (intern (concat snm "s"))))
     `(defun ,nm-p (com)
-      (consp (memq (if (and (viper-characterp com) (< com 0))
-                       (- com) com) ,nms)))))
+      (consp (viper-memq-char
+	      (if (and (viper-characterp com) (< com 0))
+		  (- com) com)
+	      ,nms)
+	     ))))
 
 ;; Variables for defining VI commands
 
@@ -191,11 +194,19 @@
       (viper-move-marker-locally viper-insert-point viper-pre-command-point))
   )
 
-(defsubst viper-insert-state-pre-command-sentinel ()
-  (or (memq this-command '(self-insert-command))
+(defsubst viper-preserve-cursor-color ()
+  (or (memq this-command '(self-insert-command
+			   viper-del-backward-char-in-insert
+			   viper-del-backward-char-in-replace
+			   viper-delete-backward-char
+			   viper-join-lines
+			   viper-delete-char))
       (memq (viper-event-key last-command-event)
 	    '(up down left right (meta f) (meta b)
-		 (control n) (control p) (control f) (control b)))
+		 (control n) (control p) (control f) (control b)))))
+
+(defsubst viper-insert-state-pre-command-sentinel ()
+  (or (viper-preserve-cursor-color)
       (viper-restore-cursor-color 'after-insert-mode))
   (if (and (memq this-command '(dabbrev-expand hippie-expand))
 	   (markerp viper-insert-point)
@@ -218,10 +229,7 @@
 ;; to speed up, don't change cursor color before self-insert
 ;; and common move commands
 (defsubst viper-replace-state-pre-command-sentinel ()
-  (or (memq this-command '(self-insert-command))
-      (memq (viper-event-key last-command-event)
-	    '(up down left right (meta f) (meta b)
-		 (control n) (control p) (control f) (control b)))
+  (or (viper-preserve-cursor-color)
       (viper-restore-cursor-color 'after-replace-mode)))
 
 
@@ -248,10 +256,11 @@
   ;; we set the point outside the replacement region, then the cursor color
   ;; will remain red.  Restoring the default, below, fixes this problem.
   ;;
-  ;; We optimize for self-insert-command's here, since they either don't change
+  ;; We optimize for some commands, like self-insert-command,
+  ;; viper-delete-backward-char, etc., since they either don't change
   ;; cursor color or, if they terminate replace mode, the color will be changed
   ;; in viper-finish-change
-  (or (memq this-command '(self-insert-command))
+  (or (viper-preserve-cursor-color)
       (viper-restore-cursor-color 'after-replace-mode))
   (cond
    ((eq viper-current-state 'replace-state)
@@ -679,7 +688,7 @@
 ARG is used as the prefix value for the executed command.  If
 EVENTS is a list of events, which become the beginning of the command."
   (interactive "P")
-  (if (= last-command-char ?\\)
+  (if (viper= last-command-char ?\\)
       (message "Switched to EMACS state for the next command..."))
   (viper-escape-to-state arg events 'emacs-state))
 
@@ -981,17 +990,17 @@
 ;; Get com part of prefix-argument ARG and modify it.
 (defun viper-getCom (arg)
   (let ((com (viper-getcom arg)))
-    (cond ((equal com ?c) ?c)
+    (cond ((viper= com ?c) ?c)
 	  ;; Previously, ?c was being converted to ?C, but this prevented
 	  ;; multiline replace regions.
-	  ;;((equal com ?c) ?C)
-	  ((equal com ?d) ?D)
-	  ((equal com ?y) ?Y)
+	  ;;((viper= com ?c) ?C)
+	  ((viper= com ?d) ?D)
+	  ((viper= com ?y) ?Y)
 	  (t com))))
 
 
 ;; Compute numeric prefix arg value.
-;; Invoked by EVENT.  COM is the command part obtained so far.
+;; Invoked by EVENT-CHAR.  COM is the command part obtained so far.
 (defun viper-prefix-arg-value (event-char com)
   (let ((viper-intermediate-command 'viper-digit-argument)
 	value func)
@@ -1046,31 +1055,31 @@
 	cmd-info
 	cmd-to-exec-at-end)
     (while (and cont
-		(memq char
-		      (list ?c ?d ?y ?! ?< ?> ?= ?# ?r ?R ?\"
-			    viper-buffer-search-char)))
+		(viper-memq-char char
+				 (list ?c ?d ?y ?! ?< ?> ?= ?# ?r ?R ?\"
+				       viper-buffer-search-char)))
       (if com
 	  ;; this means that we already have a command character, so we
 	  ;; construct a com list and exit while.  however, if char is "
 	  ;; it is an error.
 	  (progn
 	    ;; new com is (CHAR . OLDCOM)
-	    (if (memq char '(?# ?\")) (error ""))
+	    (if (viper-memq-char char '(?# ?\")) (error ""))
 	    (setq com (cons char com))
 	    (setq cont nil))
 	;; If com is nil we set com as char, and read more.  Again, if char is
 	;; ", we read the name of register and store it in viper-use-register.
 	;; if char is !, =, or #, a complete com is formed so we exit the while
 	;; loop.
-	(cond ((memq char '(?! ?=))
+	(cond ((viper-memq-char char '(?! ?=))
 	       (setq com char)
 	       (setq char (read-char))
 	       (setq cont nil))
-	      ((= char ?#)
+	      ((viper= char ?#)
 	       ;; read a char and encode it as com
 	       (setq com (+ 128 (read-char)))
 	       (setq char (read-char)))
-	      ((= char ?\")
+	      ((viper= char ?\")
 	       (let ((reg (read-char)))
 		 (if (viper-valid-register reg)
 		     (setq viper-use-register reg)
@@ -1086,7 +1095,7 @@
       ;; we prepare the command that will be executed at the end.
       (progn
 	(setq cmd-info (cons value com))
-	(while (= char ?U)
+	(while (viper= char ?U)
 	  (viper-describe-arg cmd-info)
 	  (setq char (read-char)))
 	;; `char' is a movement cmd, a digit arg cmd, or a register cmd---so we
@@ -1094,18 +1103,18 @@
 	(or (viper-movement-command-p char)
 	    (viper-digit-command-p char)
 	    (viper-regsuffix-command-p char)
-	    (= char ?!) ; bang command
+	    (viper= char ?!) ; bang command
 	    (error ""))
 	(setq cmd-to-exec-at-end
 	      (viper-exec-form-in-vi 
 	       `(key-binding (char-to-string ,char)))))
     
     ;; as com is non-nil, this means that we have a command to execute
-    (if (memq (car com) '(?r ?R))
+    (if (viper-memq-char (car com) '(?r ?R))
 	;; execute apropriate region command.
 	(let ((char (car com)) (com (cdr com)))
 	  (setq prefix-arg (cons value com))
-	  (if (= char ?r) (viper-region prefix-arg)
+	  (if (viper= char ?r) (viper-region prefix-arg)
 	    (viper-Region prefix-arg))
 	  ;; reset prefix-arg
 	  (setq prefix-arg nil))
@@ -1233,7 +1242,7 @@
       (exchange-point-and-mark))
   (if (eq (preceding-char) ?\n)
       (viper-backward-char-carefully)) ; give back the newline
-  (if (= com ?c)
+  (if (viper= com ?c)
       (viper-change (mark t) (point))
     (viper-change-subr (mark t) (point))))
 
@@ -1255,7 +1264,7 @@
 	  (setq viper-use-register nil)))
     (delete-region (mark t) (point)))
   (open-line 1)
-  (if (= com ?C)
+  (if (viper= com ?C)
       (viper-change-state-to-insert)
     (viper-yank-last-insertion)))
 
@@ -1364,7 +1373,7 @@
     (exchange-point-and-mark)
     (shell-command-on-region
      (mark t) (point)
-     (if (= com ?!)
+     (if (viper= com ?!)
 	 (setq viper-last-shell-com
 	       (viper-read-string-with-history
 		"!"
@@ -1388,7 +1397,7 @@
     (viper-enlarge-region (mark t) (point))
     (if (> (mark t) (point)) (exchange-point-and-mark))
     (indent-rigidly (mark t) (point)
-		    (if (= com ?>)
+		    (if (viper= com ?>)
 			viper-shift-width
 		      (- viper-shift-width))))
   ;; return point to where it was before shift
@@ -1446,7 +1455,7 @@
     (if (viper-dotable-command-p com)
 	(viper-set-destructive-command
 	 (list m-com val
-	       (if (memq com (list ?c ?C ?!)) (- com) com)
+	       (if (viper-memq-char com (list ?c ?C ?!)) (- com) com)
 	       reg nil nil)))
     ))
 
@@ -1536,19 +1545,20 @@
 ;; The hash-command.  It is invoked interactively by the key sequence #<char>.
 ;; The chars that can follow `#' are determined by viper-hash-command-p
 (defun viper-special-prefix-com (char)
-  (cond ((= char ?c)
+  (cond ((viper= char ?c)
 	 (downcase-region (min viper-com-point (point))
 			  (max viper-com-point (point))))
-	((= char ?C)
+	((viper= char ?C)
 	 (upcase-region (min viper-com-point (point))
 			(max viper-com-point (point))))
-	((= char ?g)
+	((viper= char ?g)
 	 (push-mark viper-com-point t)
 	 (viper-global-execute))
-	((= char ?q)
+	((viper= char ?q)
 	 (push-mark viper-com-point t)
 	 (viper-quote-region))
-	((= char ?s) (funcall viper-spell-function viper-com-point (point)))
+	((viper= char ?s)
+	 (funcall viper-spell-function viper-com-point (point)))
 	(t (error "#%c: %s" char viper-InvalidViCommand))))
 
 
@@ -1858,7 +1868,7 @@
 
 ;; Thie is a temp hook that uses free variables init-message and initial.
 ;; A dirty feature, but it is the simplest way to have it do the right thing.
-;; The init-message and initial vars come from the scope set by 
+;; The INIT-MESSAGE and INITIAL vars come from the scope set by 
 ;; viper-read-string-with-history
 (defun viper-minibuffer-standard-hook ()
   (if (stringp init-message)
@@ -2054,7 +2064,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command (list 'viper-append val ?r nil nil nil))
     (if (not (eolp)) (forward-char))
-    (if (equal com ?r)
+    (if (viper= com ?r)
 	(viper-loop val (viper-yank-last-insertion))
       (viper-change-state-to-insert))))
 
@@ -2066,7 +2076,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command (list 'viper-Append val ?r nil nil nil))
     (end-of-line)
-    (if (equal com ?r)
+    (if (viper= com ?r)
 	(viper-loop val (viper-yank-last-insertion))
       (viper-change-state-to-insert))))
 
@@ -2078,7 +2088,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command (list 'viper-Insert val ?r nil nil nil))
     (back-to-indentation)
-    (if (equal com ?r)
+    (if (viper= com ?r)
 	(viper-loop val (viper-yank-last-insertion))
       (viper-change-state-to-insert))))
 
@@ -2090,7 +2100,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command (list 'viper-open-line val ?r nil nil nil))
     (let ((col (current-indentation)))
-      (if (equal com ?r)
+      (if (viper= com ?r)
 	  (viper-loop val
 		      (end-of-line)
 		      (newline 1)
@@ -2120,7 +2130,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command (list 'viper-Open-line val ?r nil nil nil))
     (let ((col (current-indentation)))
-      (if (equal com ?r)
+      (if (viper= com ?r)
 	  (viper-loop val
 		      (beginning-of-line)
 		      (open-line 1)
@@ -2151,7 +2161,7 @@
 	(com (viper-getcom arg)))
     (viper-set-destructive-command
      (list 'viper-open-line-at-point val ?r nil nil nil))
-    (if (equal com ?r)
+    (if (viper= com ?r)
 	(viper-loop val
 		    (open-line 1)
 		    (viper-yank-last-insertion))
@@ -2165,7 +2175,7 @@
 	(com (viper-getcom arg)))
     (push-mark nil t)
     (forward-char val)
-    (if (equal com ?r)
+    (if (viper= com ?r)
 	(viper-change-subr (mark t) (point))
       (viper-change (mark t) (point)))
     (viper-set-destructive-command (list 'viper-substitute val ?r nil nil nil))
@@ -2459,11 +2469,12 @@
 
 (defun viper-replace-char-subr (com arg)
   (let (char)
-    (setq char (if (equal com ?r)
+    (setq char (if (viper= com ?r)
 		   viper-d-char
 		 (read-char)))
     (let (inhibit-quit) ; preserve consistency of undo-list and iso-accents
-      (if (and  viper-automatic-iso-accents (memq char '(?' ?\" ?^ ?~)))
+      (if (and  viper-automatic-iso-accents
+		(viper-memq-char char '(?' ?\" ?^ ?~)))
 	  ;; get European characters
 	  (progn
 	    (viper-set-iso-accents-mode t)
@@ -2635,12 +2646,12 @@
   (let ((prev-char (viper-char-at-pos 'backward))
 	(saved-point (point)))
     ;; skip non-newline separators backward
-    (while (and (not (memq prev-char '(nil \n)))
+    (while (and (not (viper-memq-char prev-char '(nil \n)))
 		(< lim (point))
 		;; must be non-newline separator
 		(if (eq viper-syntax-preference 'strict-vi)
-		    (memq prev-char '(?\  ?\t))
-		  (memq (char-syntax prev-char) '(?\  ?-))))
+		    (viper-memq-char prev-char '(?\  ?\t))
+		  (viper-memq-char (char-syntax prev-char) '(?\  ?-))))
       (viper-backward-char-carefully)
       (setq prev-char (viper-char-at-pos 'backward)))
 
@@ -2654,12 +2665,12 @@
 
     ;; skip again, but make sure we don't overshoot the limit
     (if twice
-	(while (and (not (memq prev-char '(nil \n)))
+	(while (and (not (viper-memq-char prev-char '(nil \n)))
 		    (< lim (point))
 		    ;; must be non-newline separator
 		    (if (eq viper-syntax-preference 'strict-vi)
-			(memq prev-char '(?\  ?\t))
-		      (memq (char-syntax prev-char) '(?\  ?-))))
+			(viper-memq-char prev-char '(?\  ?\t))
+		      (viper-memq-char (char-syntax prev-char) '(?\  ?-))))
 	  (viper-backward-char-carefully)
 	  (setq prev-char (viper-char-at-pos 'backward))))
 
@@ -2677,10 +2688,10 @@
     (if com (viper-move-marker-locally 'viper-com-point (point)))
     (viper-forward-word-kernel val)
     (if com (progn
-	      (cond ((memq com (list ?c (- ?c)))
+	      (cond ((viper-memq-char com (list ?c (- ?c)))
 		     (viper-separator-skipback-special 'twice viper-com-point))
 		    ;; Yank words including the whitespace, but not newline
-		    ((memq com (list ?y (- ?y)))
+		    ((viper-memq-char com (list ?y (- ?y)))
 		     (viper-separator-skipback-special nil viper-com-point))
 		    ((viper-dotable-command-p com)
 		     (viper-separator-skipback-special nil viper-com-point)))
@@ -2698,10 +2709,10 @@
 		(viper-skip-nonseparators 'forward)
 		(viper-skip-separators t))
     (if com (progn
-	      (cond ((memq com (list ?c (- ?c)))
+	      (cond ((viper-memq-char com (list ?c (- ?c)))
 		     (viper-separator-skipback-special 'twice viper-com-point))
 		    ;; Yank words including the whitespace, but not newline
-		    ((memq com (list ?y (- ?y)))
+		    ((viper-memq-char com (list ?y (- ?y)))
 		     (viper-separator-skipback-special nil viper-com-point))
 		    ((viper-dotable-command-p com)
 		     (viper-separator-skipback-special nil viper-com-point)))
@@ -4217,12 +4228,12 @@
   (let ((char (read-char)))
     (cond ((and (<= ?a char) (<= char ?z))
 	   (point-to-register (1+ (- char ?a))))
-	  ((= char ?<) (viper-mark-beginning-of-buffer))
-	  ((= char ?>) (viper-mark-end-of-buffer))
-	  ((= char ?.) (viper-set-mark-if-necessary))
-	  ((= char ?,) (viper-cycle-through-mark-ring))
-	  ((= char ?^) (push-mark viper-saved-mark t t))
-	  ((= char ?D) (mark-defun))
+	  ((viper= char ?<) (viper-mark-beginning-of-buffer))
+	  ((viper= char ?>) (viper-mark-end-of-buffer))
+	  ((viper= char ?.) (viper-set-mark-if-necessary))
+	  ((viper= char ?,) (viper-cycle-through-mark-ring))
+	  ((viper= char ?^) (push-mark viper-saved-mark t t))
+	  ((viper= char ?D) (mark-defun))
 	  (t (error ""))
 	  )))
 
@@ -4323,7 +4334,7 @@
 		 (goto-char viper-com-point)
 		 (viper-change-state-to-vi)
 		 (error "")))))
-	((and (not skip-white) (= char ?`))
+	((and (not skip-white) (viper= char ?`))
 	 (if com (viper-move-marker-locally 'viper-com-point (point)))
 	 (if (and (viper-same-line (point) viper-last-jump)
 		  (= (point) viper-last-jump-ignore))
@@ -4334,7 +4345,7 @@
 	 (setq viper-last-jump (point-marker)
 	       viper-last-jump-ignore 0)
 	 (if com (viper-execute-com 'viper-goto-mark nil com)))
-	((and skip-white (= char ?'))
+	((and skip-white (viper= char ?'))
 	 (if com (viper-move-marker-locally 'viper-com-point (point)))
 	 (if (and (viper-same-line (point) viper-last-jump)
 		  (= (point) viper-last-jump-ignore))
@@ -4437,7 +4448,7 @@
 	       (princ (format "Register %c contains the string:\n" reg))
 	       (princ text))
 	     ))
-	  ((= ?\] reg)
+	  ((viper= ?\] reg)
 	   (viper-next-heading arg))
 	  (t (error
 	      viper-InvalidRegister reg)))))
@@ -4446,9 +4457,9 @@
   "Function called by \[, the brac.  View textmarkers and call \[\["
   (interactive "P")
   (let ((reg (read-char)))
-    (cond ((= ?\[ reg)
+    (cond ((viper= ?\[ reg)
 	   (viper-prev-heading arg))
-	  ((= ?\] reg)
+	  ((viper= ?\] reg)
 	   (viper-heading-end arg))
 	  ((viper-valid-register reg '(letter))
 	   (let* ((val (get-register (1+ (- reg ?a))))
--- a/lisp/emulation/viper-util.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/emulation/viper-util.el	Sun Oct 29 04:56:45 2000 +0000
@@ -102,6 +102,25 @@
       (symbol-function
        (if viper-xemacs-p 'characterp 'integerp)))
 
+; CHAR is supposed to be a char or an integer; LIST is a list of chars, nil,
+; and negative numbers
+; Check if CHAR is a member by trying to convert into integers, if necessary.
+; Introduced for compatibility with XEmacs, where integers are not the same as
+; chars.
+(defun viper-memq-char (char list)
+  (cond (viper-emacs-p (memq char list))
+	((null char) (memq char list))
+	((characterp char) (memq char list))
+	((integerp char) (memq (int-to-char char) list))
+	(t nil)))
+
+;; Like =, but accommodates null and also is t for eq-objects
+(defun viper= (char char1)
+  (cond ((eq char char1) t)
+	((and (viper-characterp char) (viper-characterp char1))
+	 (= char char1))
+	(t nil)))
+
 (defsubst viper-color-display-p ()
   (if viper-emacs-p
       (x-display-color-p)
@@ -124,8 +143,12 @@
   (if (and (viper-window-display-p)  (viper-color-display-p)
 	   (stringp new-color) (viper-color-defined-p new-color)
 	   (not (string= new-color (viper-get-cursor-color))))
-      (modify-frame-parameters
-       (selected-frame) (list (cons 'cursor-color new-color)))))
+      (if viper-emacs-p
+	  (modify-frame-parameters
+	   (selected-frame) (list (cons 'cursor-color new-color)))
+	(set-frame-property
+	 (selected-frame) 'cursor-color (make-color-instance new-color)))
+    ))
 	 
 ;; By default, saves current frame cursor color in the
 ;; viper-saved-cursor-color-in-replace-mode property of viper-replace-overlay
@@ -701,7 +724,7 @@
   (if (not (viper-overlay-p viper-search-overlay))
       (progn
 	(setq viper-search-overlay
-	      (viper-make-overlay beg end (current-buffer)))
+	      (viper-make-overlay (point-min) (point-min) (current-buffer)))
 	(viper-overlay-put
 	 viper-search-overlay 'priority viper-search-overlay-priority)))
   (viper-overlay-put viper-search-overlay 'face nil))
@@ -954,7 +977,7 @@
 	      )))
       (if (viper-characterp basis)
 	  (setq basis
-		(if (= basis ?\C-?)
+		(if (viper= basis ?\C-?)
 		    (list 'control '\?) ; taking care of an emacs bug
 		  (intern (char-to-string basis)))))
       (if mod
@@ -1199,23 +1222,24 @@
 	    (looking-at (concat "[" viper-strict-ALPHA-chars addl-chars "]"))
 	  (or
 	   ;; or one of the additional chars being asked to include
-	   (memq char (viper-string-to-list addl-chars))
+	   (viper-memq-char char (viper-string-to-list addl-chars))
 	   (and
-	    ;; not one of the excluded word chars
-	    (not (memq char viper-non-word-characters))
+	    ;; not one of the excluded word chars (note:
+	    ;; viper-non-word-characters is a list)
+	    (not (viper-memq-char char viper-non-word-characters))
 	    ;; char of the Viper-word syntax class
-	    (memq (char-syntax char)
-		  (viper-string-to-list viper-ALPHA-char-class))))))
+	    (viper-memq-char (char-syntax char)
+			     (viper-string-to-list viper-ALPHA-char-class))))))
     ))
 
 (defun viper-looking-at-separator ()
   (let ((char (char-after (point))))
     (if char
 	(if (eq viper-syntax-preference 'strict-vi)
-	    (memq char (viper-string-to-list viper-strict-SEP-chars))
+	    (viper-memq-char char (viper-string-to-list viper-strict-SEP-chars))
 	  (or (eq char ?\n) ; RET is always a separator in Vi
-	      (memq (char-syntax char)
-		    (viper-string-to-list viper-SEP-char-class)))))
+	      (viper-memq-char (char-syntax char)
+			       (viper-string-to-list viper-SEP-char-class)))))
     ))
 
 (defsubst viper-looking-at-alphasep (&optional addl-chars)
@@ -1340,7 +1364,8 @@
 		    ;; of the excluded characters
 		    (if (and (eq syntax-of-char-looked-at ?w)
 			     (not negated-syntax))
-			(not (memq char-looked-at viper-non-word-characters))
+			(not (viper-memq-char
+			      char-looked-at viper-non-word-characters))
 		      t))
 		   (funcall skip-syntax-func 1)
 		 0)
--- a/lisp/emulation/viper.el	Sat Oct 28 21:30:03 2000 +0000
+++ b/lisp/emulation/viper.el	Sun Oct 29 04:56:45 2000 +0000
@@ -8,7 +8,7 @@
 
 ;; Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
 
-(defconst viper-version "3.08 of October 31, 1999"
+(defconst viper-version "3.09 of October 29, 2000"
   "The current version of Viper")
 
 ;; This file is part of GNU Emacs.
@@ -443,7 +443,10 @@
   :group 'viper-misc)
 
 (defcustom viper-insert-state-mode-list
-  '(internal-ange-ftp-mode comint-mode shell-mode)
+  '(internal-ange-ftp-mode
+    comint-mode
+    eshell-mode
+    shell-mode)
   "*A list of major modes that should come up in Vi Insert state."
   :type '(repeat symbol)
   :group 'viper-misc)
--- a/man/ediff.texi	Sat Oct 28 21:30:03 2000 +0000
+++ b/man/ediff.texi	Sun Oct 29 04:56:45 2000 +0000
@@ -14,7 +14,7 @@
 @synindex fn cp
 @synindex pg cp
 
-@dircategory Emacs
+@dircategory Editors
 @direntry
 * Ediff: (ediff).       A visual interface for comparing and merging programs.
 @end direntry
@@ -55,7 +55,7 @@
 
 @vskip 0pt plus 1filll
 @noindent
-Copyright @copyright{} 1995, 1996, 1997 Free Software Foundation, Inc.
+Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
 
 Permission is granted to make and distribute verbatim copies of
 this manual provided the copyright notice and this permission notice
@@ -1077,6 +1077,11 @@
 @vindex ediff-load-hook
 This hook can be used to change defaults after Ediff is loaded.
 
+@item ediff-before-setup-hook
+@vindex ediff-before-setup-hook
+Hook that is run just before Ediff rearranges windows to its liking.
+Can be used to save windows configuration.
+
 @item ediff-keymap-setup-hook
 @vindex ediff-keymap-setup-hook
 @vindex ediff-mode-map
@@ -1092,8 +1097,9 @@
 @vindex ediff-before-setup-windows-hook
 @vindex ediff-after-setup-windows-hook
 These two hooks are called before and after Ediff sets up its window
-configuration.  Can be used to save the configuration that existed
-before Ediff starts or for whatever other purposes.
+configuration.  These hooks are run each time Ediff rearranges windows to
+its liking. This happens whenever it detects that the user changed the
+windows setup.
 
 @item ediff-suspend-hook
 @itemx ediff-quit-hook
@@ -1186,8 +1192,13 @@
 @vindex ediff-registry-setup-hook
 Hooks run after setting up the registry for all active Ediff session.
 @xref{Session Groups}, for details.
-@item ediff-session-group-setup-hook
-@vindex ediff-session-group-setup-hook
+@item ediff-before-session-group-setup-hook
+@vindex ediff-before-session-group-setup-hook
+Hooks run before setting up a control panel for a group of related Ediff
+sessions. Can be used, for example, to save window configuration to restore
+later.
+@item ediff-after-session-group-setup-hook
+@vindex ediff-after-session-group-setup-hook
 Hooks run after setting up a control panel for a group of related Ediff
 sessions.  @xref{Session Groups}, for details.
 @item ediff-quit-session-group-hook
@@ -2009,10 +2020,9 @@
 @end example
 
 Apart from the standard @file{vc.el}, Ediff supports three other interfaces
-to version control:
-@file{rcs.el}, @file{pcl-cvs.el}, and @file{generic-sc.el}.
-The package @file{rcs.el} is written by Sebastian Kremer
-<sk@@thp.Uni-Koeln.DE> and is available as
+to version control: @file{rcs.el}, @file{pcl-cvs.el} (recently renamed
+pcvs.el), and @file{generic-sc.el}.  The package @file{rcs.el} is written
+by Sebastian Kremer <sk@@thp.Uni-Koeln.DE> and is available as
 @example
 @file{ftp.cs.buffalo.edu:pub/Emacs/rcs.tar.Z}
 @file{ftp.uni-koeln.de:/pub/gnu/emacs/rcs.tar.Z}
@@ -2293,6 +2303,7 @@
 Martin Maechler (maechler@@stat.math.ethz.ch),
 Simon Marshall (simon@@gnu.org),
 Richard Mlynarik (mly@@adoc.xerox.com),
+Stefan Monnier (monnier@@cs.yale.edu),
 Chris Murphy (murphycm@@sun.aston.ac.uk),
 Erik Naggum (erik@@naggum.no),
 Eyvind Ness (Eyvind.Ness@@hrp.no),
@@ -2323,6 +2334,7 @@
 Philippe Waroquiers (philippe.waroquiers@@eurocontrol.be),
 Klaus Weber (gizmo@@zork.north.de),
 Ben Wing (ben@@xemacs.org),
+Tom Wurgler (twurgler@@goodyear.com),
 Ilya Zakharevich (ilya@@math.ohio-state.edu),
 Eli Zaretskii (eliz@@is.elta.co.il)
 @end example
--- a/man/viper.texi	Sat Oct 28 21:30:03 2000 +0000
+++ b/man/viper.texi	Sun Oct 29 04:56:45 2000 +0000
@@ -6,7 +6,7 @@
 @comment @setfilename viper.info
 @setfilename ../info/viper
 
-@dircategory Emacs
+@dircategory Editors
 @direntry
 * VIPER: (viper).       The newest Emacs VI-emulation mode.
                           (also, A VI Plan for Emacs Rescue
@@ -20,7 +20,7 @@
 @titlepage
 @title Viper Is a Package for Emacs Rebels
 @subtitle a Vi emulator for Emacs
-@subtitle March 1998, Viper Version 3.02 (Polyglot)
+@subtitle October 2000, Viper Version 3.09
 
 @author Michael Kifer (Viper)
 @author Aamod Sane (VIP 4.4)
@@ -97,7 +97,7 @@
 be visited as needed.
 
 Comments and bug reports are welcome.
-@code{kifer@@cs.emacs.edu} is the current address for Viper bug reports.
+@code{kifer@@cs.sunysb.edu} is the current address for Viper bug reports.
 Please use the Ex command @kbd{:submitReport} for this purpose.@refill
 
 @end ifinfo
@@ -4419,6 +4419,7 @@
 useful features.  Here is a (hopefully) complete list of contributors:
 
 @example
+aaronl@@vitelus.com (Aaron Lehmann),
 ahg@@panix.com (Al Gelders),
 amade@@diagram.fr (Paul-Bernard Amade),
 ascott@@fws214.intel.com (Andy Scott),
@@ -4428,6 +4429,7 @@
 dominik@@strw.LeidenUniv.nl (Carsten Dominik),
 dwallach@@cs.princeton.edu (Dan Wallach),
 dwight@@toolucky.llnl.gov (Dwight Shih),
+dxc@@xprt.net (David X. Callaway),
 edmonds@@edmonds.home.cs.ubc.ca (Brian Edmonds),
 gviswana@@cs.wisc.edu (Guhan Viswanathan),
 gvr@@halcyon.com (George V.@: Reilly),