changeset 21940:f7e788ea680b

new version
author Michael Kifer <kifer@cs.stonybrook.edu>
date Mon, 04 May 1998 22:42:59 +0000
parents e9014d2166a4
children 1baa3e876ad0
files lisp/ediff-diff.el lisp/ediff-init.el lisp/ediff-util.el lisp/ediff-vers.el lisp/ediff-wind.el lisp/ediff.el lisp/emulation/viper-cmd.el lisp/emulation/viper-ex.el lisp/emulation/viper-init.el lisp/emulation/viper-keym.el lisp/emulation/viper-util.el lisp/emulation/viper.el
diffstat 12 files changed, 559 insertions(+), 975 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ediff-diff.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff-diff.el	Mon May 04 22:42:59 1998 +0000
@@ -1110,7 +1110,7 @@
 	      (set-process-sentinel proc 'ediff-process-sentinel)
 	      (set-process-filter proc 'ediff-process-filter)
 	      )))
-      (set-match-data data))))
+      (store-match-data data))))
       
 ;; This is shell-command-filter from simple.el in FSF Emacs.
 ;; Copied here because XEmacs doesn't have it.
--- a/lisp/ediff-init.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff-init.el	Mon May 04 22:42:59 1998 +0000
@@ -32,6 +32,7 @@
 (defvar ediff-mouse-pixel-threshold)
 (defvar ediff-whitespace)
 (defvar ediff-multiframe)
+(defvar ediff-use-toolbar-p)
 
 (and noninteractive
      (eval-when-compile
@@ -59,15 +60,22 @@
   (and (ediff-device-type) (not (memq (ediff-device-type) '(tty pc stream)))))
 
 ;; test if supports faces
-;; ediff-force-faces is for those devices that support faces, but we don't know
-;; this yet
 (defun ediff-has-face-support-p ()
   (cond ((ediff-window-display-p))
 	(ediff-force-faces)
 	(ediff-emacs-p (memq (ediff-device-type) '(pc)))
 	(ediff-xemacs-p (memq (ediff-device-type) '(tty pc)))))
 
-  
+(defun ediff-has-toolbar-support-p ()
+  (and ediff-xemacs-p
+       (featurep 'toolbar)
+       (console-on-window-system-p)))
+
+(defun ediff-use-toolbar-p ()
+  (and (ediff-has-toolbar-support-p)	;Can it do it ?
+       (boundp 'ediff-use-toolbar-p)
+       ediff-use-toolbar-p))		;Does the user want it ?
+
 ;; Defines SYMBOL as an advertised local variable.  
 ;; Performs a defvar, then executes `make-variable-buffer-local' on
 ;; the variable.  Also sets the `permanent-local' property,
@@ -526,13 +534,14 @@
   :group 'ediff)
 
   
-(ediff-defvar-local ediff-use-faces t 
+(ediff-defvar-local ediff-use-faces nil "") 
+(defcustom ediff-use-faces t 
   "If t, differences are highlighted using faces, if device supports faces.
 If nil, differences are highlighted using ASCII flags, ediff-before-flag
 and ediff-after-flag.  On a non-window system, differences are always
-highlighted using ASCII flags.
-This variable can be set either in .emacs or toggled interactively.
-Use `setq-default' if setting it in .emacs")
+highlighted using ASCII flags."
+  :type 'boolean
+  :group 'ediff-highlighting)
 
 ;; this indicates that diff regions are word-size, so fine diffs are
 ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise
@@ -569,10 +578,13 @@
   :type 'boolean
   :group 'ediff)
 
-(ediff-defvar-local ediff-highlight-all-diffs t
+(ediff-defvar-local ediff-highlight-all-diffs nil "")
+(defcustom ediff-highlight-all-diffs t
   "If nil, only the selected differences are highlighted.
-This variable can be set either in .emacs or toggled interactively, using
-ediff-toggle-hilit. Use `setq-default' to set it.") 
+Otherwise, all difference regions are highlighted, but the selected region is
+shown in brighter colors."
+  :type 'boolean
+  :group 'ediff-highlighting)
 
 ;; A var local to each control panel buffer.  Indicates highlighting style
 ;; in effect for this buffer: `face', `ascii', nil -- temporarily
@@ -819,35 +831,6 @@
 	  (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-pixmap (face pixmap)
   "Set face pixmap on a monochrome display."
@@ -863,23 +846,6 @@
       (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)
-;;	(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"))
@@ -903,24 +869,6 @@
 
 
 
-;;(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)))
@@ -941,23 +889,6 @@
 	 (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)
-;;	(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"))
@@ -979,15 +910,6 @@
 	 (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.")
 
 (defface ediff-current-diff-face-Ancestor
   '((((class color)) (:foreground "Black" :background "VioletRed"))
@@ -1009,31 +931,6 @@
 	 (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-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"))
@@ -1049,29 +946,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-fine-diff-face-A)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (ediff-set-face-pixmap 'ediff-fine-diff-face-A "gray3"))
-
-;;(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.")
-
 (defface ediff-fine-diff-face-B
   '((((class color)) (:foreground "Black" :background "cyan"))
     (t (:underline t :stipple "gray3")))
@@ -1086,30 +960,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-fine-diff-face-B)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
-;;	(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")))
@@ -1124,29 +974,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-fine-diff-face-C)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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.")
-
 (defface ediff-fine-diff-face-Ancestor
   '((((class color)) (:foreground "Black" :background "Green"))
     (t (:underline t :stipple "gray3")))
@@ -1163,31 +990,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-fine-diff-face-Ancestor)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
-;;	(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")))
@@ -1202,31 +1004,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-even-diff-face-A)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
-;;	(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")))
@@ -1241,26 +1018,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-even-diff-face-B)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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 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")))
@@ -1275,27 +1032,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-even-diff-face-C)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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.")
-
 (defface ediff-even-diff-face-Ancestor
   '((((class color)) (:foreground "White" :background "Grey"))
     (t (:italic t :stipple "Stipple")))
@@ -1310,13 +1046,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-even-diff-face-Ancestor)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
@@ -1324,24 +1053,6 @@
     (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")))
@@ -1356,31 +1067,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-odd-diff-face-A)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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 for highlighting odd-numbered differences in buffer B.")
 
 (defface ediff-odd-diff-face-B
   '((((class color)) (:foreground "Black" :background "light grey"))
@@ -1396,25 +1082,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-odd-diff-face-B)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
-;;	(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")))
@@ -1429,25 +1096,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-odd-diff-face-C)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
-;;	(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")))
@@ -1462,13 +1110,6 @@
 this variable represents.")
 (ediff-hide-face 'ediff-odd-diff-face-Ancestor)
 
-;;;; Until custom.el for XEmacs starts supporting :stipple 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))) 
-;;    (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)
@@ -1548,7 +1189,7 @@
   "*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-directories' or `ediff-merge-directory-revisions'."
+as `ediff-merge-directory' or `ediff-merge-directory-revisions'."
   :type '(choice (const nil) (const t) (const group-jobs-only))
   :group 'ediff-merge)
 (make-variable-buffer-local 'ediff-autostore-merges)
--- a/lisp/ediff-util.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff-util.el	Mon May 04 22:42:59 1998 +0000
@@ -52,10 +52,12 @@
     (or (featurep 'ediff)
 	(load "ediff.el" nil nil 'nosuffix))
     (or (featurep 'ediff-tbar)
+	ediff-emacs-p
 	(load "ediff-tbar.el" 'noerror nil 'nosuffix))
     ))
 ;; end pacifier
 
+
 (require 'ediff-init)
 (require 'ediff-help)
 (require 'ediff-mult)
@@ -63,14 +65,8 @@
 (require 'ediff-diff)
 (require 'ediff-merg)
 
-
-;; be careful with ediff-tbar
 (if ediff-xemacs-p
-    (condition-case nil
-	(require 'ediff-tbar)
-      (error
-       (defun ediff-use-toolbar-p () nil)))
-  (defun ediff-use-toolbar-p () nil))
+    (require 'ediff-tbar))
 
 
 ;;; Functions
@@ -1053,7 +1049,7 @@
 
 ;; checkout if visited file is checked in
 (defun ediff-maybe-checkout (buf)
-  (let ((file (buffer-file-name buf))
+  (let ((file (expand-file-name (buffer-file-name buf)))
 	(checkout-function (key-binding "\C-x\C-q")))
     (if (and (ediff-file-checked-in-p file)
 	     (or (beep 1) t)
@@ -1070,31 +1066,42 @@
 ;; in and not checked out for the purpose of patching (since patch won't be
 ;; able to read such a file anyway).
 ;; FILE is a string representing file name
-(defun ediff-file-under-version-control (file)
-  (let* ((filedir (file-name-directory file))
-	 (file-nondir (file-name-nondirectory file))
-	 (trial (concat file-nondir ",v"))
-	 (full-trial (concat filedir trial))
-	 (full-rcs-trial (concat filedir "RCS/" trial)))
-    (and (stringp file)
-	 (file-exists-p file)
-	 (or
-	  (and
-	   (file-exists-p full-trial)
-	   ;; in FAT FS, `file,v' and `file' may turn out to be the same!
-	   ;; don't be fooled by this!
-	   (not (equal (file-attributes file)
-		       (file-attributes full-trial))))
-	  ;; check if a version is in RCS/ directory
-	  (file-exists-p full-rcs-trial)))
-       ))
+;;(defun ediff-file-under-version-control (file)
+;;  (let* ((filedir (file-name-directory file))
+;;	 (file-nondir (file-name-nondirectory file))
+;;	 (trial (concat file-nondir ",v"))
+;;	 (full-trial (concat filedir trial))
+;;	 (full-rcs-trial (concat filedir "RCS/" trial)))
+;;    (and (stringp file)
+;;	 (file-exists-p file)
+;;	 (or
+;;	  (and
+;;	   (file-exists-p full-trial)
+;;	   ;; in FAT FS, `file,v' and `file' may turn out to be the same!
+;;	   ;; don't be fooled by this!
+;;	   (not (equal (file-attributes file)
+;;		       (file-attributes full-trial))))
+;;	  ;; check if a version is in RCS/ directory
+;;	  (file-exists-p full-rcs-trial)))
+;;       ))
 
-(defun ediff-file-checked-out-p (file)
-  (and (ediff-file-under-version-control file)
-       (file-writable-p file)))
-(defun ediff-file-checked-in-p (file)
-  (and (ediff-file-under-version-control file)
-       (not (file-writable-p file))))
+
+(defsubst ediff-file-checked-out-p (file)
+  (or (not (featurep 'vc-hooks))
+      (and (vc-backend file)
+	   (vc-locking-user file))))
+(defsubst ediff-file-checked-in-p (file)
+  (and (featurep 'vc-hooks)
+       (vc-backend file)
+       (not (vc-locking-user file))))
+
+(defun ediff-file-compressed-p (file)
+  (condition-case nil
+      (require 'jka-compr)
+    (error))
+  (if (featurep 'jka-compr)
+      (string-match (jka-compr-build-file-regexp) file)))
+
       
 (defun ediff-swap-buffers ()
   "Rotate the display of buffers A, B, and C."
@@ -1312,7 +1319,7 @@
 	       (set-specifier bottom-toolbar-visible-p (list frame t)) 
 	       (set-specifier bottom-toolbar-height
 			      (list frame ediff-toolbar-height)))
-	      (ediff-xemacs-p
+	      ((ediff-has-toolbar-support-p)
 	       (set-specifier bottom-toolbar-height (list frame 0)))
 	      ))
     ))
@@ -1572,18 +1579,19 @@
 	lines
 	))))
 
-;; get number of lines from window end to region start
-(defun ediff-get-lines-to-region-start (buf-type &optional n ctl-buf)
-  (or n (setq n ediff-current-difference))
+;; Calculate the number of lines from window end to the start of diff region
+(defun ediff-get-lines-to-region-start (buf-type &optional diff-num ctl-buf)
+  (or diff-num (setq diff-num ediff-current-difference))
   (or ctl-buf (setq ctl-buf ediff-control-buffer))
   (ediff-with-current-buffer ctl-buf
     (let* ((buf (ediff-get-buffer buf-type))
 	   (wind (eval (ediff-get-symbol-from-alist
 			buf-type ediff-window-alist)))
-	   (end (window-end wind))
-	   (beg (ediff-get-diff-posn buf-type 'beg)))
+	   (end (or (window-end wind) (window-end wind t)))
+	   (beg (ediff-get-diff-posn buf-type 'beg diff-num)))
       (ediff-with-current-buffer buf
-	(if (< beg end) (count-lines beg end) 0))
+	(if (< beg end)
+	    (count-lines (max beg (point-min)) (min end (point-max))) 0))
       )))
 
 
@@ -2974,10 +2982,6 @@
       (error "Buffer out of sync for file %s" buffer-file-name))))
 
 
-(defun ediff-file-compressed-p (file)
-  (require 'jka-compr)
-  (string-match (jka-compr-build-file-regexp) file))
-
 (defun ediff-filename-magic-p (file)
   (or (ediff-file-compressed-p file)
       (ediff-file-remote-p file)))
--- a/lisp/ediff-vers.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff-vers.el	Mon May 04 22:42:59 1998 +0000
@@ -338,7 +338,7 @@
 	 (tmp-file
 	  (cvs-retrieve-revision-to-tmpfile fileinfo))
 	 (default-directory
- 	   (file-name-as-directory (cvs-fileinfo->dir fileinfo)))
+	   (file-name-as-directory (cvs-fileinfo->dir fileinfo)))
 	 ancestor-file)
     
     (or (memq type '(MERGED CONFLICT MODIFIED))
--- a/lisp/ediff-wind.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff-wind.el	Mon May 04 22:42:59 1998 +0000
@@ -46,6 +46,7 @@
     (or (featurep 'ediff-help)
 	(load "ediff-help.el" nil nil 'nosuffix))
     (or (featurep 'ediff-tbar)
+	ediff-emacs-p
 	(load "ediff-tbar.el" 'noerror nil 'nosuffix))
     ))
 ;; end pacifier
@@ -932,7 +933,7 @@
     
     ;; In XEmacs, buffer menubar needs to be killed before frame parameters
     ;; are changed. 
-    (if ediff-xemacs-p
+    (if (ediff-has-toolbar-support-p)
 	(progn
 	  (set-specifier top-toolbar-height (list ctl-frame 2))
 	  (sit-for 0)
--- a/lisp/ediff.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/ediff.el	Mon May 04 22:42:59 1998 +0000
@@ -6,8 +6,8 @@
 ;; Created: February 2, 1994
 ;; Keywords: comparing, merging, patching, version control.
 
-(defconst ediff-version "2.69" "The current version of Ediff")
-(defconst ediff-date "October 10, 1997" "Date of last update")  
+(defconst ediff-version "2.70.1" "The current version of Ediff")
+(defconst ediff-date "March 7, 1998" "Date of last update")  
 
 
 ;; This file is part of GNU Emacs.
--- a/lisp/emulation/viper-cmd.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper-cmd.el	Mon May 04 22:42:59 1998 +0000
@@ -144,17 +144,11 @@
 
 ;; Runs viper-after-change-functions inside after-change-functions
 (defun viper-after-change-sentinel (beg end len)
-  (let ((list viper-after-change-functions))
-    (while list
-      (funcall (car list) beg end len)
-      (setq list (cdr list)))))
+  (run-hook-with-args 'viper-after-change-functions beg end len))
       
 ;; Runs viper-before-change-functions inside before-change-functions
 (defun viper-before-change-sentinel (beg end)
-  (let ((list viper-before-change-functions))
-    (while list
-      (funcall (car list) beg end)
-      (setq list (cdr list)))))
+  (run-hook-with-args 'viper-before-change-functions beg end))
 
 (defsubst viper-post-command-sentinel ()
   (run-hooks 'viper-post-command-hooks))
@@ -264,15 +258,21 @@
   ;; We remove then add viper-post/pre-command-sentinel since it is very
   ;; desirable that viper-pre-command-sentinel is the last hook and
   ;; viper-post-command-sentinel is the first hook.
+
+  (make-local-hook 'viper-after-change-functions)
+  (make-local-hook 'viper-before-change-functions)
+  (make-local-hook 'viper-post-command-hooks)
+  (make-local-hook 'viper-pre-command-hooks)
+
   (remove-hook 'post-command-hook 'viper-post-command-sentinel)
   (add-hook 'post-command-hook 'viper-post-command-sentinel)
   (remove-hook 'pre-command-hook 'viper-pre-command-sentinel)
   (add-hook 'pre-command-hook 'viper-pre-command-sentinel t)
   ;; These hooks will be added back if switching to insert/replace mode
-  (viper-remove-hook 'viper-post-command-hooks
-		     'viper-insert-state-post-command-sentinel)
-  (viper-remove-hook 'viper-pre-command-hooks
-		     'viper-insert-state-pre-command-sentinel)
+  (remove-hook 'viper-post-command-hooks
+	       'viper-insert-state-post-command-sentinel 'local)
+  (remove-hook 'viper-pre-command-hooks
+	       'viper-insert-state-pre-command-sentinel 'local)
   (setq viper-intermediate-command nil)
   (cond ((eq new-state 'vi-state)
 	 (cond ((member viper-current-state '(insert-state replace-state))
@@ -314,10 +314,10 @@
 	     (viper-move-marker-locally 'viper-insert-point (point)))
 	 (viper-move-marker-locally
 	  'viper-last-posn-while-in-insert-state (point))
-	 (viper-add-hook 'viper-post-command-hooks
-			 'viper-insert-state-post-command-sentinel t)
-	 (viper-add-hook 'viper-pre-command-hooks
-			 'viper-insert-state-pre-command-sentinel t))
+	 (add-hook 'viper-post-command-hooks
+		   'viper-insert-state-post-command-sentinel t 'local)
+	 (add-hook 'viper-pre-command-hooks
+		   'viper-insert-state-pre-command-sentinel t 'local))
 	) ; outermost cond
   
   ;; Nothing needs to be done to switch to emacs mode! Just set some
@@ -958,23 +958,25 @@
 
 ;; Compute numeric prefix arg value. 
 ;; Invoked by EVENT. COM is the command part obtained so far.
-(defun viper-prefix-arg-value (event com)
+(defun viper-prefix-arg-value (event-char com)
   (let ((viper-intermediate-command 'viper-digit-argument)
 	value func)
     ;; read while number
-    (while (and (viper-characterp event) (>= event ?0) (<= event ?9))
-      (setq value (+ (* (if (integerp value) value 0) 10) (- event ?0)))
-      (setq event (viper-read-event-convert-to-char)))
+    (while (and (viper-characterp event-char)
+		(>= event-char ?0) (<= event-char ?9))
+      (setq value (+ (* (if (integerp value) value 0) 10) (- event-char ?0)))
+      (setq event-char (viper-read-event-convert-to-char)))
     
     (setq prefix-arg value)
     (if com (setq prefix-arg (cons prefix-arg com)))
-    (while (eq event ?U)
+    (while (eq event-char ?U)
       (viper-describe-arg prefix-arg)
-      (setq event (viper-read-event-convert-to-char)))
+      (setq event-char (viper-read-event-convert-to-char)))
     
     (if (or com (and (not (eq viper-current-state 'vi-state))
 		     ;; make sure it is a Vi command
-		     (viper-characterp event) (viper-vi-command-p event)
+		     (viper-characterp event-char)
+		     (viper-vi-command-p event-char)
 		     ))
 	;; If appears to be one of the vi commands,
 	;; then execute it with funcall and clear prefix-arg in order to not
@@ -986,21 +988,21 @@
 	  ;; etc., i.e., the user typed, say, d2. In this case, `com' would be
 	  ;; `d', `w', etc.  If viper-digit-argument was invoked by
 	  ;; viper-escape-to-vi (which is indicated by the fact that the
-	  ;; current state is not vi-state), then `event' represents the vi
-	  ;; command to be executed (e.g., `d', `w', etc). Again,
+	  ;; current state is not vi-state), then `event-char' represents the
+	  ;; vi command to be executed (e.g., `d', `w', etc). Again,
 	  ;; last-command-char must make emacs believe that this is the command
 	  ;; we typed.
-	  (cond ((eq event 'return) (setq event ?\C-m))
-		((eq event 'delete) (setq event ?\C-?))
-		((eq event 'backspace) (setq event ?\C-h))
-		((eq event 'space) (setq event ?\ )))
-	  (setq last-command-char (or com event))
+	  (cond ((eq event-char 'return) (setq event-char ?\C-m))
+		((eq event-char 'delete) (setq event-char ?\C-?))
+		((eq event-char 'backspace) (setq event-char ?\C-h))
+		((eq event-char 'space) (setq event-char ?\ )))
+	  (setq last-command-char (or com event-char))
 	  (setq func (viper-exec-form-in-vi 
-		      (` (key-binding (char-to-string (, event))))))
+		      (` (key-binding (char-to-string (, event-char))))))
 	  (funcall func prefix-arg)
 	  (setq prefix-arg nil))
       ;; some other command -- let emacs do it in its own way
-      (viper-set-unread-command-events event))
+      (viper-set-unread-command-events event-char))
     ))
 		     
 
@@ -1239,6 +1241,7 @@
 	(setq viper-use-register nil)))
   (setq last-command
 	(if (eq last-command 'd-command) 'kill-region nil))
+  (message "Deleted %d characters" (abs (- (point) viper-com-point)))
   (kill-region viper-com-point (point))
   (setq this-command 'd-command)
   (if viper-ex-style-motion
@@ -1261,10 +1264,12 @@
 	  (setq viper-use-register nil)))
     (setq last-command
 	  (if (eq last-command 'D-command) 'kill-region nil))
+    (message "Deleted %d lines" (count-lines (point) viper-com-point))
     (kill-region (mark t) (point))
     (if (eq m-com 'viper-line) (setq this-command 'D-command)))
   (back-to-indentation))
 
+;; save region
 (defun viper-exec-yank (m-com com)
   (or (and (markerp viper-com-point) (marker-position viper-com-point))
       (set-marker viper-com-point (point) (current-buffer)))
@@ -1281,8 +1286,10 @@
 	(setq viper-use-register nil)))
   (setq last-command nil)
   (copy-region-as-kill viper-com-point (point))
+  (message "Saved %d characters" (abs (- (point) viper-com-point)))
   (goto-char viper-com-point))
 
+;; save lines
 (defun viper-exec-Yank (m-com com)
   (save-excursion
     (set-mark viper-com-point)
@@ -1299,7 +1306,8 @@
 		   (error viper-InvalidRegister  viper-use-register)))
 	  (setq viper-use-register nil)))
     (setq last-command nil)
-    (copy-region-as-kill (mark t) (point)))
+    (copy-region-as-kill (mark t) (point))
+    (message "Saved %d lines" (count-lines (mark t) (point))))
   (viper-deactivate-mark)
   (goto-char viper-com-point))
 
@@ -2110,22 +2118,23 @@
   (setq viper-began-as-replace t
 	viper-sitting-in-replace t
 	viper-replace-chars-to-delete 0)
-  (viper-add-hook
-   'viper-after-change-functions 'viper-replace-mode-spy-after t)
-  (viper-add-hook
-   'viper-before-change-functions 'viper-replace-mode-spy-before t)
+  (add-hook
+   'viper-after-change-functions 'viper-replace-mode-spy-after t 'local)
+  (add-hook
+   'viper-before-change-functions 'viper-replace-mode-spy-before t 'local)
   ;; this will get added repeatedly, but no harm
   (add-hook 'after-change-functions 'viper-after-change-sentinel t)
   (add-hook 'before-change-functions 'viper-before-change-sentinel t)
-  (viper-move-marker-locally 'viper-last-posn-in-replace-region
-			     (viper-replace-start))
-  (viper-add-hook
-   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel t)
-  (viper-add-hook
-   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel t)
+  (viper-move-marker-locally
+   'viper-last-posn-in-replace-region (viper-replace-start))
+  (add-hook
+   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel
+   t 'local)
+  (add-hook
+   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel t 'local)
   ;; guard against a smartie who switched from R-replace to normal replace
-  (viper-remove-hook
-   'viper-post-command-hooks 'viper-R-state-post-command-sentinel)
+  (remove-hook
+   'viper-post-command-hooks 'viper-R-state-post-command-sentinel 'local)
   (if overwrite-mode (overwrite-mode nil))
   )
   
@@ -2210,14 +2219,14 @@
 ;; the overlay and current point is before the end of the overlay.
 ;; Don't delete anything if current point is past the end of the overlay.
 (defun viper-finish-change ()
-  (viper-remove-hook
-   'viper-after-change-functions 'viper-replace-mode-spy-after)
-  (viper-remove-hook
-   'viper-before-change-functions 'viper-replace-mode-spy-before)
-  (viper-remove-hook
-   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel) 
-  (viper-remove-hook
-   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel) 
+  (remove-hook
+   'viper-after-change-functions 'viper-replace-mode-spy-after 'local)
+  (remove-hook
+   'viper-before-change-functions 'viper-replace-mode-spy-before 'local)
+  (remove-hook
+   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel 'local) 
+  (remove-hook
+   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel 'local) 
   (viper-restore-cursor-color-after-replace)
   (setq viper-sitting-in-replace nil) ; just in case we'll need to know it
   (save-excursion
@@ -2246,22 +2255,22 @@
   (setq kill-ring-yank-pointer kill-ring))
 
 (defun viper-finish-R-mode ()
-  (viper-remove-hook
-   'viper-post-command-hooks 'viper-R-state-post-command-sentinel)
-  (viper-remove-hook
-   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel)
+  (remove-hook
+   'viper-post-command-hooks 'viper-R-state-post-command-sentinel 'local)
+  (remove-hook
+   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel 'local)
   (viper-downgrade-to-insert))
   
 (defun viper-start-R-mode ()
   ;; Leave arg as 1, not t: XEmacs insists that it must be a pos number
   (overwrite-mode 1)
-  (viper-add-hook
-   'viper-post-command-hooks 'viper-R-state-post-command-sentinel t)
-  (viper-add-hook
-   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel t)
+  (add-hook
+   'viper-post-command-hooks 'viper-R-state-post-command-sentinel t 'local)
+  (add-hook
+   'viper-pre-command-hooks 'viper-replace-state-pre-command-sentinel t 'local)
   ;; guard against a smartie who switched from R-replace to normal replace
-  (viper-remove-hook
-   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel)
+  (remove-hook
+   'viper-post-command-hooks 'viper-replace-state-post-command-sentinel 'local)
   )
 
 
@@ -2907,21 +2916,37 @@
 	(cmd (if (eq viper-intermediate-command 'viper-repeat)
 		 (nth 5 viper-d-com)
 	       (viper-array-to-string (this-command-keys))))
-	point)
+	point region-beg region-end)
     (save-excursion
       (save-restriction
-	(if (> arg 0)
-	    (narrow-to-region
-	     ;; forward search begins here
-	     (if (eolp) (error "Command `%s':  At end of line" cmd) (point))
-	     ;; forward search ends here
-	     (progn (end-of-line) (point)))
-	  (narrow-to-region
-	   ;; backward search begins from here
-	   (if (bolp)
-	       (error "Command `%s':  At beginning of line" cmd) (point))
-	   ;; backward search ends here
-	   (progn (beginning-of-line) (point))))
+	(if (> arg 0) ; forward
+	    (progn
+	      (setq region-beg (point))
+	      (if viper-allow-multiline-replace-regions
+		  (viper-forward-paragraph 1)
+		(end-of-line))
+	      (setq region-end (point)))
+	  (setq region-end (point))
+	      (if viper-allow-multiline-replace-regions
+		  (viper-backward-paragraph 1)
+		(beginning-of-line))
+	      (setq region-beg (point)))
+	(if (or (and (< arg 0)
+		     (< (- region-end region-beg)
+			(if viper-allow-multiline-replace-regions
+			    2 1))
+		     (bolp))
+		(and (> arg 0)
+		     (< (- region-end region-beg)
+			(if viper-allow-multiline-replace-regions
+			    3 2))
+		     (eolp)))
+	    (error "Command `%s':  At %s of %s"
+		   cmd
+		   (if (> arg 0) "end" "beginning")
+		   (if viper-allow-multiline-replace-regions
+		       "paragraph" "line")))
+	(narrow-to-region region-beg region-end)
 	;; if arg > 0, point is forwarded before search.
 	(if (> arg 0) (goto-char (1+ (point-min)))
 	  (goto-char (point-max)))
@@ -3242,7 +3267,7 @@
 	  (if viper-parse-sexp-ignore-comments "" "NOT "))))
 
 
-;; sentence ,paragraph and heading
+;; sentence, paragraph and heading
 
 (defun viper-forward-sentence (arg)
   "Forward sentence."
@@ -3272,7 +3297,9 @@
   (or (eq last-command this-command)
       (push-mark nil t))
   (let ((val (viper-p-val arg))
-	(com (viper-getCom arg)))
+	;; if you want d} operate on whole lines, change viper-getcom to
+	;; viper-getCom below
+	(com (viper-getcom arg)))
     (if com (viper-move-marker-locally 'viper-com-point (point)))
     (forward-paragraph val)
     (if com
@@ -3286,7 +3313,9 @@
   (or (eq last-command this-command)
       (push-mark nil t))
   (let ((val (viper-p-val arg))
-	(com (viper-getCom arg)))
+	;; if you want d{ operate on whole lines, change viper-getcom to
+	;; viper-getCom below
+	(com (viper-getcom arg)))
     (if com (viper-move-marker-locally 'viper-com-point (point)))
     (backward-paragraph val)
     (if com
@@ -3768,7 +3797,8 @@
 			((viper-valid-register viper-use-register)
 			 (get-register (downcase viper-use-register)))
 			(t (error viper-InvalidRegister viper-use-register)))
-		(current-kill 0))))
+		(current-kill 0)))
+	sv-point)
     (if (null text)
 	(if viper-use-register
 	    (let ((reg viper-use-register))
@@ -3787,7 +3817,11 @@
     (set-marker (viper-mark-marker) (point) (current-buffer))
     (viper-set-destructive-command
      (list 'viper-put-back val nil viper-use-register nil nil))
-    (viper-loop val (viper-yank text)))
+    (setq sv-point (point))
+    (viper-loop val (viper-yank text))
+    (message "Inserted %d character(s), %d line(s)"
+	     (abs (- (point) sv-point)) 
+	     (abs (count-lines (point) sv-point))))
   ;; Vi puts cursor on the last char when the yanked text doesn't contain a
   ;; newline; it leaves the cursor at the beginning when the text contains 
   ;; a newline
--- a/lisp/emulation/viper-ex.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper-ex.el	Mon May 04 22:42:59 1998 +0000
@@ -1,6 +1,6 @@
 ;;; viper-ex.el --- functions implementing the Ex commands for Viper
 
-;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
 
 ;; This file is part of GNU Emacs.
 
@@ -457,7 +457,9 @@
 		     "\\|" "jo.*"
 		     "\\|" "^[ \t]*ta.*"
 		     "\\|" "^[ \t]*una.*"
-		     "\\|" "^[ \t]*su.*"
+		     ;; don't jump up in :s command
+		     "\\|" "^[ \t]*\\([`'][a-z]\\|[.,%]\\)*[ \t]*su.*"
+		     "\\|" "^[ \t]*\\([`'][a-z]\\|[.,%]\\)*[ \t]*s[^a-z].*"
 		     "\\|" "['`][a-z][ \t]*"
 		     ;; r! assumes that the next one is a shell command
 		     "\\|" "\\(r\\|re\\|rea\\|read\\)[ \t]*!"
@@ -631,40 +633,53 @@
     (set-buffer viper-ex-work-buf)
     (skip-chars-forward " \t")
     (if (looking-at "!")
+	;; this is probably a variant command r!
 	(progn
 	  (setq ex-g-variant (not ex-g-variant)
 		ex-g-flag (not ex-g-flag))
 	  (forward-char 1)
 	  (skip-chars-forward " \t")))
     (let ((c (following-char)))
-      (if (string-match "[0-9A-Za-z]" (format "%c" c))
-	  (error
-	   "Global regexp must be inside matching non-alphanumeric chars"))
+      (cond ((string-match "[0-9A-Za-z]" (format "%c" c))
+	     (error
+	      "Global regexp must be inside matching non-alphanumeric chars"))
+	    ((= c ??) (error "`?' is not an allowed pattern delimiter here")))
       (if (looking-at "[^\\\\\n]")
 	  (progn
 	    (forward-char 1)
 	    (set-mark (point))
 	    (let ((cont t))
-	      (while (and (not (eolp)) cont)
+	      ;; the use of eobp instead of eolp permits the use of newlines in
+	      ;; pat2 in s/pat1/pat2/
+	      (while (and (not (eobp)) cont)
 		(if (not (re-search-forward (format "[^%c]*%c" c c) nil t))
 		    (if (member ex-token '("global" "vglobal"))
-			(error
-			 "Missing closing delimiter for global regexp")
+			(error "Missing closing delimiter for global regexp")
 		      (goto-char (point-max))))
 		(if (not (viper-looking-back
 			  (format "[^\\\\]\\(\\\\\\\\\\)*\\\\%c" c)))
-		    (setq cont nil))))
+		    (setq cont nil)
+		  ;; we are at an escaped delimiter: unescape it and continue
+		  (delete-backward-char 2)
+		  (insert c)
+		  (if (eolp)
+		      ;; if at eol, exit loop and go to next line
+		      ;; later, delim will be inserted at the end
+		      (progn
+			(setq cont nil)
+			(forward-char))))
+		))
 	    (setq ex-token
 		  (if (= (mark t) (point)) ""
 		    (buffer-substring (1- (point)) (mark t))))
 	    (backward-char 1)
-	    ;; if the user doesn't specify the final pattern delimiter, we're
+	    ;; if the user didn't insert the final pattern delimiter, we're
 	    ;; at newline now. In this case, insert the initial delimiter
 	    ;; specified in variable c
-	    (if (looking-at "\n")
+	    (if (eolp)
 		(progn
-		    (insert c)
-		      (backward-char 1)))
+		  (insert c)
+		  (backward-char 1)))
 	    )
 	(setq ex-token nil))
       c)))
@@ -707,8 +722,8 @@
   (cond ((null ex-addresses)
 	 (setq ex-addresses
 	       (if whole-flag
-		   (cons (point-max) (cons (point-min) nil))
-		 (cons (point) (cons (point) nil)))))
+		   (list (point-max) (point-min))
+		 (list (point) (point)))))
 	((null (cdr ex-addresses))
 	 (setq ex-addresses
 	       (cons (car ex-addresses) ex-addresses)))))
@@ -871,7 +886,7 @@
 	      (char (buffer-substring (match-beginning 0) (match-end 0))))
 	  (if (viper-looking-back (concat "\\\\" char))
 	      (replace-match char)
-	    (set-match-data data)
+	    (store-match-data data)
 	    (if (string= char "%")
 		(replace-match cf)
 	      (replace-match pf)))))
@@ -1009,8 +1024,10 @@
     (while cont
       (setq viper-keep-reading-filename nil
 	    val (read-file-name (concat prompt str) nil default-directory))
-      (if (string-match " " val)
-	  (setq val (concat "\\\"" val "\\\"")))
+      (setq val (expand-file-name val))
+      (if (and (string-match " " val)
+	       (ex-cmd-accepts-multiple-files-p ex-token))
+	  (setq val (concat "\"" val "\"")))
       (setq str  (concat str (if (equal val "") "" " ")
 			 val (if (equal val "") "" " ")))
 			 
@@ -1237,27 +1254,27 @@
 	((string= ex-file "")
 	 (error viper-NoFileSpecified)))
       
-  (let (msg do-edit)
-    (if buffer-file-name
-	(cond ((buffer-modified-p)
-	       (setq msg
-		     (format "Buffer %s is modified. Discard changes? "
-			     (buffer-name))
-		     do-edit t))
-	      ((not (verify-visited-file-modtime (current-buffer)))
-	       (setq msg
-		     (format "File %s changed on disk.  Reread from disk? "
-			     buffer-file-name)
-		     do-edit t))
-	      (t (setq do-edit nil))))
-      
-    (if do-edit
-	(if (yes-or-no-p msg)
-	    (progn
-	      (set-buffer-modified-p nil)
-	      (kill-buffer (current-buffer)))
-	  (message "Buffer %s was left intact" (buffer-name))))
-    ) ; let
+;;;  (let (msg do-edit)
+;;;    (if buffer-file-name
+;;;	(cond ((buffer-modified-p)
+;;;	       (setq msg
+;;;		     (format "Buffer %s is modified. Discard changes? "
+;;;			     (buffer-name))
+;;;		     do-edit t))
+;;;	      ((not (verify-visited-file-modtime (current-buffer)))
+;;;	       (setq msg
+;;;		     (format "File %s changed on disk.  Reread from disk? "
+;;;			     buffer-file-name)
+;;;		     do-edit t))
+;;;	      (t (setq do-edit nil))))
+;;;      
+;;;    (if do-edit
+;;;	(if (yes-or-no-p msg)
+;;;	    (progn
+;;;	      (set-buffer-modified-p nil)
+;;;	      (kill-buffer (current-buffer)))
+;;;	  (message "Buffer %s was left intact" (buffer-name))))
+;;;    ) ; let
   
   (if (null (setq file (get-file-buffer ex-file)))
       (progn 
@@ -1279,7 +1296,7 @@
   (ex-fixup-history viper-last-ex-prompt ex-file))
 
 ;; Find-file FILESPEC if it appears to specify a single file.
-;; Otherwise, assume that FILES{EC is a wildcard.
+;; Otherwise, assume that FILESPEC is a wildcard.
 ;; In this case, split it into substrings separated by newlines.
 ;; Each line is assumed to be a file name. find-file's each file thus obtained.
 (defun ex-find-file (filespec)
@@ -1652,7 +1669,7 @@
 	(ask-if-save t)
 	(auto-cmd-label "; don't touch or else...")
 	(delete-turn-on-auto-fill-pattern
-	 "([ \t]*add-hook[ \t]+'viper-insert-state-hooks[ \t]+'turn-on-auto-fill.*)")
+	 "([ \t]*add-hook[ \t]+'viper-insert-state-hook[ \t]+'turn-on-auto-fill.*)")
 	actual-lisp-cmd lisp-cmd-del-pattern
 	val2 orig-var)
     (setq orig-var var)
@@ -1770,7 +1787,7 @@
 	      (if (> val2 0)
 		  (viper-save-string-in-file
 		   (concat
-		    "(add-hook 'viper-insert-state-hooks 'turn-on-auto-fill) "
+		    "(add-hook 'viper-insert-state-hook 'turn-on-auto-fill) "
 		    auto-cmd-label)
 		   viper-custom-file-name
 		   delete-turn-on-auto-fill-pattern)
@@ -1902,8 +1919,12 @@
 		       (point-marker))))
 	  (goto-char (min (point) (mark t)))
 	  (while (< (point) limit)
-	    (end-of-line)
-	    (setq eol-mark (point-marker))
+	    (save-excursion
+	      (end-of-line)
+	      ;; This move allows the use of newline as the last character in
+	      ;; the substitution pattern
+	      (viper-forward-char-carefully)
+	      (setq eol-mark (point-marker)))
 	    (beginning-of-line)
 	    (if opt-g
 		(progn
@@ -1927,8 +1948,10 @@
 		    (if (not (stringp repl))
 			(error "Can't perform Ex substitution: No previous replacement pattern"))
 		    (replace-match repl t)))
-	      (end-of-line)
-	      (viper-forward-char-carefully))))))
+	      ;;(end-of-line)
+	      ;;(viper-forward-char-carefully)
+	      (goto-char eol-mark)
+	      )))))
     (if matched-pos (goto-char matched-pos))
     (beginning-of-line)
     (if opt-c (message "done"))))
@@ -1994,68 +2017,59 @@
       (setq file-exists (file-exists-p ex-file)
 	    writing-same-file (string= ex-file (buffer-file-name)))
 
+      ;; do actual writing
       (if (and writing-whole-file writing-same-file)
+	  ;; saving whole buffer in visited file
 	  (if (not (buffer-modified-p))
 	      (message "(No changes need to be saved)")
+	    (viper-maybe-checkout (current-buffer))
 	    (save-buffer)
 	    (save-restriction
 		 (widen)
 		 (ex-write-info file-exists ex-file (point-min) (point-max))
 		 ))
-	;; writing some other file or portion of the current file
-	(cond ((and file-exists
-		    (not writing-same-file)
-		    (not (yes-or-no-p
-			  (format "File %s exists. Overwrite? " ex-file))))
-	       (error "Quit"))
-	      ((and writing-whole-file (not ex-append))
-	       (unwind-protect
-		   (progn
-		     (set-visited-file-name ex-file)
-		     (set-buffer-modified-p t)
-		     (save-buffer))
-		 ;; restore the buffer file name
-		 (set-visited-file-name orig-buf-file-name)
-		 (set-buffer-modified-p buff-changed-p)
-		 ;; If the buffer wasn't visiting a file, restore buffer name.
-		 ;; Name could've been changed by packages such as uniquify.
-		 (or orig-buf-file-name
-		     (progn
-		       (unlock-buffer)
-		       (rename-buffer orig-buf-name))))
-	       (save-restriction
-		 (widen)
-		 (ex-write-info
-		  file-exists ex-file (point-min) (point-max))))
-	      (t ; writing a region
-	       (unwind-protect 
-		   (save-excursion
-		     (viper-enlarge-region beg end)
-		     (setq region (buffer-substring (point) (mark t)))
-		     ;; create temp buffer for the region
-		     (setq temp-buf (get-buffer-create " *ex-write*"))
-		     (set-buffer temp-buf)
-		     (set-visited-file-name ex-file 'noquerry)
-		     (erase-buffer)
-		     (if (and file-exists ex-append)
-			 (insert-file-contents ex-file))
-		     (goto-char (point-max))
-		     (insert region)
-		     (save-buffer)
-		     (ex-write-info
-		      file-exists ex-file (point-min) (point-max))
-		     ))
-	       (set-buffer temp-buf)
-	       (set-buffer-modified-p nil)
-	       (kill-buffer temp-buf))
-	      ))
-      (set-buffer orig-buf)
-      ;; this prevents the loss of data if writing part of the buffer
+	;; writing to non-visited file and it already exists
+	(if (and file-exists (not writing-same-file)
+		 (not (yes-or-no-p
+		       (format "File %s exists. Overwrite? " ex-file))))
+	    (error "Quit"))
+	;; writing a region or whole buffer to non-visited file
+	(unwind-protect 
+	    (save-excursion
+	      (viper-enlarge-region beg end)
+	      (setq region (buffer-substring (point) (mark t)))
+	      ;; create temp buffer for the region
+	      (setq temp-buf (get-buffer-create " *ex-write*"))
+	      (set-buffer temp-buf)
+	      (set-visited-file-name ex-file 'noquerry)
+	      (erase-buffer)
+	      (if (and file-exists ex-append)
+		  (insert-file-contents ex-file))
+	      (goto-char (point-max))
+	      (insert region)
+	      ;; ask user
+	      (viper-maybe-checkout (current-buffer))
+	      (save-buffer)
+	      (ex-write-info
+	       file-exists ex-file (point-min) (point-max))
+	      )
+	  ;; this must be under unwind-protect so that
+	  ;; temp-buf will be deleted in case of an error
+	  (set-buffer temp-buf)
+	  (set-buffer-modified-p nil)
+	  (kill-buffer temp-buf)
+	  ;; buffer/region has been written, now take care of details
+	  (set-buffer orig-buf)))
+      ;; set the right file modification time
       (if (and (buffer-file-name) writing-same-file)
 	  (set-visited-file-modtime))
+      ;; prevent loss of data if saving part of the buffer in visited file
       (or writing-whole-file 
 	  (not writing-same-file)
-	  (set-buffer-modified-p t))
+	  (progn
+	    (sit-for 2)
+	    (message "Warning: you have saved only part of the buffer!")
+	    (set-buffer-modified-p t)))
       (if q-flag
 	  (if (< viper-expert-level 2)
 	      (save-buffers-kill-emacs)
--- a/lisp/emulation/viper-init.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper-init.el	Mon May 04 22:42:59 1998 +0000
@@ -30,6 +30,9 @@
 (defvar viper-current-state)
 (defvar viper-version)
 (defvar viper-expert-level)
+(defvar current-input-method)
+(defvar default-input-method)
+(defvar describe-current-input-method-function)
 ;; end pacifier
 
 
@@ -302,6 +305,7 @@
 			     (or current-input-method default-input-method))
 		   "")))
     ))
+
 ;; viper hook to run on input-method deactivation
 (defun viper-inactivate-input-method-action ()
   (if (null viper-mule-hook-flag)
@@ -367,14 +371,7 @@
 
 ;; Replace mode and changing text
 
-;; Viper's own after/before change functions, which get viper-add-hook'ed to
-;; Emacs's
-(viper-deflocalvar viper-after-change-functions nil "")
-(viper-deflocalvar viper-before-change-functions nil "")
-(viper-deflocalvar viper-post-command-hooks nil "")
-(viper-deflocalvar viper-pre-command-hooks nil "")
-
-;; Can be used to pass global states around for short period of time
+;; Hack used to pass global states around for short period of time
 (viper-deflocalvar viper-intermediate-command nil "")
 
 ;; This is used to pass the right Vi command key sequence to
@@ -542,7 +539,9 @@
   :group 'viper)
 
 (defcustom viper-shift-width 8
-  "*The shiftwidth variable."
+  "*The value of the shiftwidth.
+This determines the number of columns by which the Ctl-t moves the cursor in
+the Insert state."
   :type 'integer
   :group 'viper)
 
@@ -791,15 +790,6 @@
 
 ;;; Face-saving tricks
 
-;;(defcustom viper-replace-overlay-pixmap "gray3"
-;;  "Pixmap to use for search face on non-color displays."
-;;  :type 'string
-;;  :group 'viper)
-;;(defcustom viper-search-face-pixmap "gray3"
-;;  "Pixmap to use for search face on non-color displays."
-;;  :type 'string
-;;  :group 'viper)
-
 (defun viper-hide-face (face)
   (if (and (viper-has-face-support-p) viper-emacs-p)
       (add-to-list 'facemenu-unlisted-faces face)))
@@ -810,21 +800,6 @@
   :prefix "viper-"
   :group 'viper)
 
-;;(defvar viper-search-face
-;;  (if (viper-has-face-support-p)
-;;      (progn
-;;	(make-face 'viper-search-face)
-;;	(or (face-differs-from-default-p 'viper-search-face)
-;;	    ;; face wasn't set in .viper or .Xdefaults
-;;	    (if (viper-can-use-colors "Black" "khaki")
-;;		(progn
-;;		  (set-face-background 'viper-search-face "khaki")
-;;		  (set-face-foreground 'viper-search-face "Black"))
-;;	      (set-face-underline-p 'viper-search-face t)
-;;	      (viper-set-face-pixmap 'viper-search-face
-;;				     viper-search-face-pixmap))) 
-;;	'viper-search-face))
-;;  "*Face used to flash out the search pattern.")
 
 (defface viper-search-face
   '((((class color)) (:foreground "Black" :background "khaki"))
@@ -839,22 +814,6 @@
 this variable represents.")
 (viper-hide-face 'viper-search-face)
   
-;;(defvar viper-replace-overlay-face
-;;  (if (viper-has-face-support-p)
-;;      (progn
-;;	(make-face 'viper-replace-overlay-face)
-;;	(or (face-differs-from-default-p 'viper-replace-overlay-face)
-;;	    (progn
-;;	      (if (viper-can-use-colors "darkseagreen2" "Black")
-;;		  (progn
-;;		    (set-face-background
-;;		     'viper-replace-overlay-face "darkseagreen2")
-;;		    (set-face-foreground 'viper-replace-overlay-face "Black")))
-;;	      (set-face-underline-p 'viper-replace-overlay-face t)
-;;	      (viper-set-face-pixmap
-;;	       'viper-replace-overlay-face viper-replace-overlay-pixmap)))
-;;	'viper-replace-overlay-face))
-;;  "*Face for highlighting replace regions on a window display.")
 
 (defface viper-replace-overlay-face
   '((((class color)) (:foreground "Black" :background "darkseagreen2"))
@@ -869,31 +828,6 @@
 this variable represents.")
 (viper-hide-face 'viper-replace-overlay-face)
 
-;;(defvar viper-minibuffer-emacs-face
-;;  (if (viper-has-face-support-p)
-;;      (progn
-;;	(make-face 'viper-minibuffer-emacs-face)
-;;	(or (face-differs-from-default-p 'viper-minibuffer-emacs-face)
-;;	    ;; face wasn't set in .viper or .Xdefaults
-;;	    (if viper-vi-style-in-minibuffer
-;;		;; emacs state is an exception in the minibuffer
-;;		(if (viper-can-use-colors "darkseagreen2" "Black")
-;;		    (progn
-;;		      (set-face-background
-;;		       'viper-minibuffer-emacs-face "darkseagreen2")
-;;		      (set-face-foreground
-;;		       'viper-minibuffer-emacs-face "Black"))
-;;		  (copy-face 'modeline 'viper-minibuffer-emacs-face))
-;;	      ;; emacs state is the main state in the minibuffer
-;;	      (if (viper-can-use-colors "Black" "pink")
-;;		  (progn
-;;		    (set-face-background 'viper-minibuffer-emacs-face "pink") 
-;;		    (set-face-foreground
-;;		     'viper-minibuffer-emacs-face "Black"))
-;;		(copy-face 'italic 'viper-minibuffer-emacs-face))
-;;	      ))
-;;	'viper-minibuffer-emacs-face))
-;;  "Face used in the Minibuffer when it is in Emacs state.")
 
 (defface viper-minibuffer-emacs-face
   '((((class color)) (:foreground "Black" :background "darkseagreen2"))
@@ -908,29 +842,6 @@
 this variable represents.")
 (viper-hide-face 'viper-minibuffer-emacs-face)
     
-;;(defvar viper-minibuffer-insert-face
-;;  (if (viper-has-face-support-p)
-;;      (progn
-;;	(make-face 'viper-minibuffer-insert-face)
-;;	(or (face-differs-from-default-p 'viper-minibuffer-insert-face)
-;;	    (if viper-vi-style-in-minibuffer
-;;		(if (viper-can-use-colors "Black" "pink")
-;;		    (progn
-;;		      (set-face-background 'viper-minibuffer-insert-face "pink") 
-;;		      (set-face-foreground
-;;		       'viper-minibuffer-insert-face "Black"))
-;;		  (copy-face 'italic 'viper-minibuffer-insert-face))
-;;	      ;; If Insert state is an exception
-;;	      (if (viper-can-use-colors "darkseagreen2" "Black")
-;;		  (progn
-;;		    (set-face-background
-;;		     'viper-minibuffer-insert-face "darkseagreen2")
-;;		    (set-face-foreground
-;;		     'viper-minibuffer-insert-face "Black"))
-;;		(copy-face 'modeline 'viper-minibuffer-insert-face))
-;;	      (viper-italicize-face 'viper-minibuffer-insert-face)))
-;;	'viper-minibuffer-insert-face))
-;;  "Face used in the Minibuffer when it is in Insert state.")
 
 (defface viper-minibuffer-insert-face
   '((((class color)) (:foreground "Black" :background "pink"))
@@ -945,21 +856,6 @@
 this variable represents.")
 (viper-hide-face 'viper-minibuffer-insert-face)
     
-;;(defvar viper-minibuffer-vi-face
-;;  (if (viper-has-face-support-p)
-;;      (progn
-;;	(make-face 'viper-minibuffer-vi-face)
-;;	(or (face-differs-from-default-p 'viper-minibuffer-vi-face)
-;;	    (if viper-vi-style-in-minibuffer
-;;		(if (viper-can-use-colors "Black" "grey")
-;;		    (progn
-;;		      (set-face-background 'viper-minibuffer-vi-face "grey")
-;;		      (set-face-foreground 'viper-minibuffer-vi-face "Black"))
-;;		  (copy-face 'bold 'viper-minibuffer-vi-face))
-;;	      (copy-face 'bold 'viper-minibuffer-vi-face)
-;;	      (invert-face 'viper-minibuffer-vi-face)))
-;;	'viper-minibuffer-vi-face))
-;;  "Face used in the Minibuffer when it is in Vi state.")
 
 (defface viper-minibuffer-vi-face
   '((((class color)) (:foreground "DarkGreen" :background "grey"))
@@ -1006,9 +902,9 @@
 (viper-deflocalvar viper-minibuffer-overlay nil)
 
 ;; Hook, specific to Viper, which is run just *before* exiting the minibuffer.
-;; Beginning with Emacs 19.26, the standard `minibuffer-exit-hook' is run
-;; *after* exiting the minibuffer
-(defvar viper-minibuffer-exit-hook '(viper-minibuffer-trim-tail))
+;; This is needed because beginning with Emacs 19.26, the standard
+;; `minibuffer-exit-hook' is run *after* exiting the minibuffer
+(defvar viper-minibuffer-exit-hook nil)
        
 
 ;; Mode line
--- a/lisp/emulation/viper-keym.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper-keym.el	Mon May 04 22:42:59 1998 +0000
@@ -530,7 +530,7 @@
     ;; Normalization usually doesn't help here, since one needs to
     ;; normalize in the actual buffer where changes to the keymap are
     ;; to take place. However, it doesn't hurt, and it helps whenever this
-    ;; function is actually called from within the right buffer.
+    ;; function is actually called from within the affected buffer.
     (viper-normalize-minor-mode-map-alist)
     
     (viper-set-mode-vars-for viper-current-state)))
--- a/lisp/emulation/viper-util.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper-util.el	Mon May 04 22:42:59 1998 +0000
@@ -110,32 +110,12 @@
       (cdr (assoc 'cursor-color (frame-parameters)))
     (color-instance-name (frame-property (selected-frame) 'cursor-color))))
   
-;;(defun viper-set-face-pixmap (face pixmap)
-;;  "Set face pixmap on a monochrome display."
-;;  (if (and (viper-window-display-p) (not (viper-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)))))
 
-  
 ;; OS/2
 (cond ((eq (viper-device-type) 'pm)
        (fset 'viper-color-defined-p
 	     (function (lambda (color) (assoc color pm-color-alist))))))
     
-;; needed to smooth out the difference between Emacs and XEmacs
-;;(defsubst viper-italicize-face (face)
-;;  (if viper-xemacs-p
-;;      (make-face-italic face)
-;;    (make-face-italic face nil 'noerror)))
-    
-;; test if display is color and the colors are defined
-;;(defsubst viper-can-use-colors (&rest colors)
-;;  (if (viper-color-display-p)
-;;      (not (memq nil (mapcar 'viper-color-defined-p colors)))
-;;    ))
 
 ;; cursor colors
 (defun viper-change-cursor-color (new-color)
@@ -620,13 +600,69 @@
   (let ((buf (find-file-noselect (substitute-in-file-name custom-file))))
     (save-excursion
       (set-buffer buf)
-      (goto-char (point-min))
-      (if pattern (delete-matching-lines pattern))
-      (goto-char (point-max))
-      (if string (insert string))
-      (save-buffer))
+      (let (buffer-read-only)
+	(goto-char (point-min))
+	(if pattern (delete-matching-lines pattern))
+	(goto-char (point-max))
+	(if string (insert string))
+	(save-buffer)))
     (kill-buffer buf)
     ))
+
+
+;; define remote file test
+(or (fboundp 'viper-file-remote-p) ; user supplied his own function: use it
+    (defun viper-file-remote-p (file-name)
+      (car (cond ((featurep 'efs-auto) (efs-ftp-path file-name))
+		 ((fboundp 'file-remote-p) (file-remote-p file-name))
+		 (t (require 'ange-ftp)
+		    ;; Can happen only in Emacs, since XEmacs has file-remote-p
+		    (ange-ftp-ftp-name file-name))))))
+
+    
+
+;; This is a simple-minded check for whether a file is under version control.
+;; If file,v exists but file doesn't, this file is considered to be not checked
+;; in and not checked out for the purpose of patching (since patch won't be
+;; able to read such a file anyway).
+;; FILE is a string representing file name
+;;(defun viper-file-under-version-control (file)
+;;  (let* ((filedir (file-name-directory file))
+;;	 (file-nondir (file-name-nondirectory file))
+;;	 (trial (concat file-nondir ",v"))
+;;	 (full-trial (concat filedir trial))
+;;	 (full-rcs-trial (concat filedir "RCS/" trial)))
+;;    (and (stringp file)
+;;	 (file-exists-p file)
+;;	 (or
+;;	  (and
+;;	   (file-exists-p full-trial)
+;;	   ;; in FAT FS, `file,v' and `file' may turn out to be the same!
+;;	   ;; don't be fooled by this!
+;;	   (not (equal (file-attributes file)
+;;		       (file-attributes full-trial))))
+;;	  ;; check if a version is in RCS/ directory
+;;	  (file-exists-p full-rcs-trial)))
+;;       ))
+
+
+(defsubst viper-file-checked-in-p (file)
+  (and (vc-backend file)
+       (not (vc-locking-user file))))
+;; checkout if visited file is checked in
+(defun viper-maybe-checkout (buf)
+  (let ((file (expand-file-name (buffer-file-name buf)))
+	(checkout-function (key-binding "\C-x\C-q")))
+    (if (and (viper-file-checked-in-p file)
+	     (or (beep 1) t)
+	     (y-or-n-p
+	      (format
+	       "File %s is checked in. Check it out? "
+	       (viper-abbreviate-file-name file))))
+	(with-current-buffer buf
+	  (command-execute checkout-function)))))
+	 
+
     
 
 ;;; Overlays
@@ -737,7 +773,8 @@
 
 
 (defsubst viper-is-in-minibuffer ()
-  (string-match "\*Minibuf-" (buffer-name)))
+  (save-match-data
+    (string-match "\*Minibuf-" (buffer-name))))
   
 
 
@@ -814,50 +851,6 @@
   (cond (viper-xemacs-p (events-to-keys events))
 	(t events)))
 		  
-	
-;; This is here because Emacs changed the way local hooks work.
-;;
-;;Add to the value of HOOK the function FUNCTION.
-;;FUNCTION is not added if already present.
-;;FUNCTION is added (if necessary) at the beginning of the hook list
-;;unless the optional argument APPEND is non-nil, in which case
-;;FUNCTION is added at the end.
-;;
-;;HOOK should be a symbol, and FUNCTION may be any valid function.  If
-;;HOOK is void, it is first set to nil.  If HOOK's value is a single
-;;function, it is changed to a list of functions."
-(defun viper-add-hook (hook function &optional append)
-  (if (not (boundp hook)) (set hook nil))
-  ;; If the hook value is a single function, turn it into a list.
-  (let ((old (symbol-value hook)))
-    (if (or (not (listp old)) (eq (car old) 'lambda))
-	(setq old (list old)))
-    (if (member function old)
-	nil
-      (set hook (if append
-		    (append old (list function)) ; don't nconc
-		  (cons function old))))))
-
-;; This is here because of Emacs's changes in the semantics of add/remove-hooks
-;; and due to the bugs they introduced.
-;;
-;; Remove from the value of HOOK the function FUNCTION.
-;; HOOK should be a symbol, and FUNCTION may be any valid function.  If
-;; FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
-;; list of hooks to run in HOOK, then nothing is done.  See `viper-add-hook'."
-(defun viper-remove-hook (hook function)
-  (if (or (not (boundp hook))		;unbound symbol, or
-	  (null (symbol-value hook))	;value is nil, or
-	  (null function))		;function is nil, then
-      nil				;Do nothing.
-    (let ((hook-value (symbol-value hook)))
-      (if (consp hook-value)
-	  ;; don't side-effect the list
-	  (setq hook-value (delete function (copy-sequence hook-value)))
-	(if (equal hook-value function)
-	    (setq hook-value nil)))
-      (set hook hook-value))))
-
     
 ;; it is suggested that an event must be copied before it is assigned to
 ;; last-command-event in XEmacs
--- a/lisp/emulation/viper.el	Mon May 04 22:33:38 1998 +0000
+++ b/lisp/emulation/viper.el	Mon May 04 22:42:59 1998 +0000
@@ -6,9 +6,9 @@
 ;;  Keywords: emulations
 ;;  Author: Michael Kifer <kifer@cs.sunysb.edu>
 
-;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
 
-(defconst viper-version "3.004 (Polyglot) of November 11, 1997"
+(defconst viper-version "3.02 (Polyglot) of March 7, 1998"
   "The current version of Viper")
 
 ;; This file is part of GNU Emacs.
@@ -304,7 +304,8 @@
 (defvar mark-even-if-inactive)
 (defvar quail-mode)
 (defvar viper-expert-level)
-(defvar viper-expert-level)
+(defvar viper-mode-string)
+(defvar viper-major-mode-modifier-list)
 
 ;; loading happens only in non-interactive compilation
 ;; in order to spare non-viperized emacs from being viperized
@@ -369,17 +370,123 @@
   :tag "Set Viper Mode on Loading"
   :group 'viper-misc)
 
-(defcustom viper-non-vi-major-modes
-  '(custom-mode dired-mode efs-mode internal-ange-ftp-mode tar-mode
-		mh-folder-mode gnus-group-mode gnus-summary-mode Info-mode
-		Buffer-menu-mode view-mode vm-mode vm-summary-mode)
-  "*A list of major modes that should never come up in Vi command mode.
-Viper automatically augments this list with some obvious modes, such as
-`dired-mode', `tar-mode', etc.  So, don't put a mode on this list, unless 
-it comes up in a wrong Viper state."
+(defcustom viper-vi-state-mode-list
+  '(fundamental-mode
+    makefile-mode
+    help-mode
+    
+    awk-mode
+    m4-mode
+    
+    html-mode html-helper-mode
+    emacs-lisp-mode lisp-mode lisp-interaction-mode
+				  
+    java-mode cc-mode c-mode c++-mode
+    fortran-mode f90-mode
+    basic-mode
+    bat-mode
+    asm-mode
+    prolog-mode
+
+    text-mode indented-text-mode
+    tex-mode latex-mode bibtex-mode
+				  
+    completion-list-mode
+    compilation-mode
+    
+    perl-mode
+    javascript-mode
+    tcl-mode
+    python-mode
+				  
+    sh-mode ksh-mode csh-mode
+				  
+    gnus-article-mode
+    mh-show-mode
+    )
+  "Major modes that require Vi command state."
   :type '(repeat symbol)
   :group 'viper-misc)
 
+(defcustom viper-emacs-state-mode-list
+  '(custom-mode
+
+    dired-mode
+    efs-mode
+    tar-mode
+
+    mh-folder-mode
+    gnus-group-mode
+    gnus-summary-mode
+    
+    Info-mode
+    Buffer-menu-mode
+    
+    view-mode
+    vm-mode
+    vm-summary-mode)
+  "*A list of major modes that should come up in Emacs state.
+Normally, Viper would bring buffers up in Emacs state, unless the corresponding
+major mode has been placed on `viper-vi-state-mode-list' or
+`viper-insert-state-mode-list'. So, don't place a new mode on this list, unless
+it is coming up in a wrong Viper state."
+  :type '(repeat symbol)
+  :group 'viper-misc)
+
+(defcustom viper-insert-state-mode-list
+  '(internal-ange-ftp-mode comint-mode shell-mode)
+  "*A list of major modes that should come up in Vi Insert state."
+  :type '(repeat symbol)
+  :group 'viper-misc)
+
+
+;; used to set viper-major-mode-modifier-list in defcustom
+(defun viper-apply-major-mode-modifiers (&optional symbol value)
+  (if symbol
+      (set symbol value))
+  (mapcar (function
+	   (lambda (triple)
+	     (viper-modify-major-mode
+	      (nth 0 triple) (nth 1 triple) (eval (nth 2 triple)))))
+	  viper-major-mode-modifier-list))
+
+(defcustom viper-major-mode-modifier-list
+  '((help-mode emacs-state viper-slash-and-colon-map)
+    (comint-mode insert-state viper-comint-mode-modifier-map)
+    (comint-mode vi-state viper-comint-mode-modifier-map)
+    (shell-mode insert-state viper-comint-mode-modifier-map)
+    (shell-mode vi-state viper-comint-mode-modifier-map)
+    (ange-ftp-shell-mode insert-state viper-comint-mode-modifier-map)
+    (ange-ftp-shell-mode vi-state viper-comint-mode-modifier-map)
+    (internal-ange-ftp-mode insert-state viper-comint-mode-modifier-map)
+    (internal-ange-ftp-mode vi-state viper-comint-mode-modifier-map)
+    (dired-mode emacs-state viper-dired-modifier-map)
+    (tar-mode emacs-state viper-slash-and-colon-map)
+    (mh-folder-mode emacs-state viper-slash-and-colon-map)
+    (gnus-group-mode emacs-state viper-slash-and-colon-map)
+    (gnus-summary-mode emacs-state viper-slash-and-colon-map)
+    (Info-mode emacs-state viper-slash-and-colon-map)
+    (Buffer-menu-mode emacs-state viper-slash-and-colon-map)
+    )
+  "List specifying how to modify the various major modes to enable some Viperisms.
+The list has the structure: ((mode viper-state keymap) (mode viper-state
+keymap) ...). If `mode' is on the list, the `kemap' will be made active (on the
+minor-mode-map-alist) in the specified viper state.
+If you change this list, have to restart emacs for the change to take effect.
+However, if you did the change through the customization widget, then emacs
+needs to be restarted only if you deleted a triple mode-state-keymap from the
+list. No need to restart emacs in case of insertion or modification of an
+existing triple."
+  :type '(repeat
+	  (list symbol
+		(choice (const emacs-state)
+			(const vi-state)
+			(const insert-state))
+		symbol))
+  :set 'viper-apply-major-mode-modifiers
+  :group 'viper-misc)
+
+
 
 
 
@@ -472,7 +579,8 @@
 		    ))
 	      (viper-set-expert-level 'dont-change-unless)))
 
-	(or (memq major-mode viper-non-vi-major-modes) ; don't switch to Vi
+	(or (memq major-mode viper-emacs-state-mode-list) ; don't switch to Vi
+	    (memq major-mode viper-insert-state-mode-list) ; don't switch
 	    (viper-change-state-to-vi)))))
    
 
@@ -517,8 +625,6 @@
 
   ;; restore non-viper vars
   (setq-default
-   default-major-mode
-   (viper-standard-value 'default-major-mode viper-saved-non-viper-variables) 
    next-line-add-newlines
    (viper-standard-value 
     'next-line-add-newlines viper-saved-non-viper-variables) 
@@ -614,6 +720,7 @@
   (mapatoms 'viper-remove-hooks)
   (remove-hook 'comint-mode-hook 'viper-comint-mode-hook)
   (remove-hook 'minibuffer-setup-hook 'viper-minibuffer-setup-sentinel)
+  (remove-hook 'change-major-mode-hook 'viper-major-mode-change-sentinel)
 
   ;; unbind Viper mouse bindings
   (viper-unbind-mouse-search-key)
@@ -626,94 +733,65 @@
   ) ; end viper-go-away
 
 
+;; list of buffers that just changed their major mode
+;; used in a hack that triggers vi command mode whenever needed
+(defvar viper-new-major-mode-buffer-list nil)
+
+;; set appropriate Viper state in buffers that changed major mode
+(defun set-viper-state-in-major-mode ()
+  (mapcar
+   (function
+    (lambda (buf)
+      (if (viper-buffer-live-p buf)
+	  (with-current-buffer buf
+	    (cond ((and (memq major-mode viper-vi-state-mode-list)
+			(eq viper-current-state 'emacs-state))
+		   (viper-mode))
+		  ((memq major-mode viper-emacs-state-mode-list)
+		   ;; not checking (eq viper-current-state 'emacs-state)
+		   ;; because viper-current-state could have gotten it by
+		   ;; default. we need viper-change-state-to-emacs here to have
+		   ;; the keymaps take effect.
+		   (viper-change-state-to-emacs))
+		  ((and (memq major-mode viper-insert-state-mode-list)
+			(not (eq viper-current-state 'insert-state)))
+		   (viper-change-state-to-insert))
+		  )) ; with-current-buffer
+	))) ; function
+   viper-new-major-mode-buffer-list)
+  ;; clear the list of bufs that changed major mode
+  (setq viper-new-major-mode-buffer-list nil)
+  ;; change the global value of hook
+  (remove-hook 'viper-post-command-hooks 'set-viper-state-in-major-mode))
+
+;; sets up post-command-hook to turn viper-mode, if the current mode is
+;; fundamental
+(defun viper-major-mode-change-sentinel ()
+  (save-match-data
+    (or (string-match "\*Minibuf-" (buffer-name))
+	(setq viper-new-major-mode-buffer-list 
+	      (cons (current-buffer) viper-new-major-mode-buffer-list))))
+  ;; change the global value of hook
+  (add-hook 'viper-post-command-hooks 'set-viper-state-in-major-mode t))
+
 
 
 ;; This sets major mode hooks to make them come up in vi-state.
 (defun viper-set-hooks ()
-  
   ;; It is of course a misnomer to call viper-mode a `major mode'.
   ;; However, this has the effect that if the user didn't specify the
   ;; default mode, new buffers that fall back on the default will come up
   ;; in Fundamental Mode and Vi state.
-  (setq default-major-mode 'viper-mode)
-  
-  ;; The following major modes should come up in vi-state
-  (defadvice fundamental-mode (after viper-fundamental-mode-ad activate)
-    "Run `viper-change-state-to-vi' on entry."
-    (viper-change-state-to-vi))
-
-  (defvar makefile-mode-hook)
-  (add-hook 'makefile-mode-hook 'viper-mode)
-
-  ;; Help mode is now for viewing only
-  (defvar help-mode-hook)
-  (add-hook 'help-mode-hook 'viper-change-state-to-emacs)
-  (viper-modify-major-mode 'help-mode 'emacs-state viper-slash-and-colon-map)
-
-  (defvar awk-mode-hook)
-  (add-hook 'awk-mode-hook 'viper-mode)
-  
-  (defvar html-mode-hook)
-  (add-hook 'html-mode-hook 'viper-mode)
-  (defvar html-helper-mode-hook)
-  (add-hook 'html-helper-mode-hook 'viper-mode)
-
-  (defvar java-mode-hook)
-  (add-hook 'java-mode-hook 'viper-mode)
-  
-  (defvar javascript-mode-hook)
-  (add-hook 'javascript-mode-hook 'viper-mode)
+  (if (eq default-major-mode 'fundamental-mode)
+      (setq default-major-mode 'viper-mode))
   
-  (defvar emacs-lisp-mode-hook)
-  (add-hook 'emacs-lisp-mode-hook 'viper-mode)
-  (defvar lisp-mode-hook)
-  (add-hook 'lisp-mode-hook 'viper-mode)
-  (defvar lisp-interaction-mode-hook)
-  (add-hook 'lisp-interaction-mode-hook 'viper-mode)
-  
-  (defvar bibtex-mode-hook)
-  (add-hook 'bibtex-mode-hook 'viper-mode) 	  
-      
-  (defvar cc-mode-hook)
-  (add-hook 'cc-mode-hook 'viper-mode)
-      
-  (defvar c-mode-hook)
-  (add-hook 'c-mode-hook 'viper-mode)
-      
-  (defvar c++-mode-hook)
-  (add-hook 'c++-mode-hook 'viper-mode)
+  (add-hook 'change-major-mode-hook 'viper-major-mode-change-sentinel)
+  (add-hook 'find-file-hooks 'set-viper-state-in-major-mode)
 
-  (defvar fortran-mode-hook)
-  (add-hook 'fortran-mode-hook 'viper-mode)
-  (defvar f90-mode-hook)
-  (add-hook 'f90-mode-hook 'viper-mode)
-
-  (defvar basic-mode-hook)
-  (add-hook 'basic-mode-hook 'viper-mode)
-  (defvar bat-mode-hook)
-  (add-hook 'bat-mode-hook 'viper-mode)
-  
-  (defvar asm-mode-hook)
-  (add-hook 'asm-mode-hook 'viper-mode)
-
-  (defvar prolog-mode-hook)
-  (add-hook 'prolog-mode-hook 'viper-mode)
-      
+  ;; keep this because many modes we don't know about use this hook
   (defvar text-mode-hook)
   (add-hook 'text-mode-hook 'viper-mode)
       
-  (add-hook 'completion-list-mode-hook 'viper-mode)  
-  (add-hook 'compilation-mode-hook     'viper-mode)  
-
-  (defvar perl-mode-hook)
-  (add-hook 'perl-mode-hook 'viper-mode)  
-
-  (defvar tcl-mode-hook)
-  (add-hook 'tcl-mode-hook 'viper-mode)  
-  
-  (defvar python-mode-hook)
-  (add-hook 'python-mode-hook 'viper-mode)  
-  
   (defvar emerge-startup-hook)
   (add-hook 'emerge-startup-hook 'viper-change-state-to-emacs)
 
@@ -747,92 +825,18 @@
       (viper-change-state-to-emacs)))
   
   ;; Emacs shell, ange-ftp, and comint-based modes
-  (defvar comint-mode-hook)
-  (viper-modify-major-mode 
-   'comint-mode 'insert-state viper-comint-mode-modifier-map)
-  (viper-modify-major-mode 
-   'comint-mode 'vi-state viper-comint-mode-modifier-map)
-  (viper-modify-major-mode 
-   'shell-mode 'insert-state viper-comint-mode-modifier-map)
-  (viper-modify-major-mode 
-   'shell-mode 'vi-state viper-comint-mode-modifier-map)
-  ;; ange-ftp in XEmacs
-  (viper-modify-major-mode 
-   'ange-ftp-shell-mode 'insert-state viper-comint-mode-modifier-map)
-  (viper-modify-major-mode 
-   'ange-ftp-shell-mode 'vi-state viper-comint-mode-modifier-map)
-  ;; ange-ftp in Emacs
-  (viper-modify-major-mode 
-   'internal-ange-ftp-mode 'insert-state viper-comint-mode-modifier-map)
-  (viper-modify-major-mode 
-   'internal-ange-ftp-mode 'vi-state viper-comint-mode-modifier-map)
-  ;; set hook
-  (add-hook 'comint-mode-hook 'viper-comint-mode-hook)
-  
-  ;; Shell scripts
-  (defvar sh-mode-hook)
-  (add-hook 'sh-mode-hook 'viper-mode)
-  (defvar ksh-mode-hook)
-  (add-hook 'ksh-mode-hook 'viper-mode)
-  
-  ;; Dired
-  (viper-modify-major-mode 'dired-mode 'emacs-state viper-dired-modifier-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'dired-mode)
-  (add-hook 'dired-mode-hook 'viper-change-state-to-emacs)
-
-  ;; Tar
-  (viper-modify-major-mode 'tar-mode 'emacs-state viper-slash-and-colon-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'tar-mode)
+  (add-hook 'comint-mode-hook 'viper-comint-mode-hook) ; comint
 
-  ;; MH-E
-  (viper-modify-major-mode 
-   'mh-folder-mode 'emacs-state viper-slash-and-colon-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'mh-folder-mode)
-  ;; changing state to emacs is needed so the preceding will take hold
-  (add-hook 'mh-folder-mode-hook 'viper-change-state-to-emacs)
-  (add-hook 'mh-show-mode-hook 'viper-mode)
-
-  ;; Gnus
-  (viper-modify-major-mode
-   'gnus-group-mode 'emacs-state viper-slash-and-colon-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'gnus-group-mode)
-  (viper-modify-major-mode 
-   'gnus-summary-mode 'emacs-state viper-slash-and-colon-map)
+  (viper-set-emacs-state-searchstyle-macros nil 'dired-mode) ; dired
+  (viper-set-emacs-state-searchstyle-macros nil 'tar-mode) ; tar
+  (viper-set-emacs-state-searchstyle-macros nil 'mh-folder-mode) ; mhe
+  (viper-set-emacs-state-searchstyle-macros nil 'gnus-group-mode) ; gnus
   (viper-set-emacs-state-searchstyle-macros nil 'gnus-summary-mode)
-  ;; changing state to emacs is needed so the preceding will take hold
-  (add-hook 'gnus-group-mode-hook 'viper-change-state-to-emacs)
-  (add-hook 'gnus-summary-mode-hook 'viper-change-state-to-emacs)
-  (add-hook 'gnus-article-mode-hook 'viper-mode)
+  (viper-set-emacs-state-searchstyle-macros nil 'Info-mode) ; info
+  (viper-set-emacs-state-searchstyle-macros nil 'Buffer-menu-mode) ;buffer-menu
 
-  ;; Info
-  (viper-modify-major-mode 'Info-mode 'emacs-state viper-slash-and-colon-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'Info-mode)
-  ;; Switching to emacs is needed  so the above will take hold
-  (defadvice Info-mode (after viper-Info-ad activate)
-    "Switch to emacs mode."
-    (viper-change-state-to-emacs))
-
-  ;; Buffer menu
-  (viper-modify-major-mode 
-   'Buffer-menu-mode 'emacs-state viper-slash-and-colon-map)
-  (viper-set-emacs-state-searchstyle-macros nil 'Buffer-menu-mode)
-  ;; Switching to emacs is needed  so the above will take hold
-  (defadvice Buffer-menu-mode (after viper-Buffer-menu-ad activate)
-    "Switch to emacs mode."
-    (viper-change-state-to-emacs))
-
-  ;; View mode
-  (defvar view-mode-hook)
-  (defvar view-hook)
-  (add-hook 'view-hook 'viper-change-state-to-emacs)
-  (add-hook 'view-mode-hook 'viper-change-state-to-emacs)
-  
-  ;; For VM users.
-  ;; Put summary and other VM buffers in Emacs state.
-  (defvar vm-mode-hooks)
-  (defvar vm-summary-mode-hooks)
-  (add-hook 'vm-mode-hooks   'viper-change-state-to-emacs)
-  (add-hook 'vm-summary-mode-hooks   'viper-change-state-to-emacs)
+  ;; Modify major modes according to viper-major-mode-modifier-list
+  (viper-apply-major-mode-modifiers)
   
   ;; For RMAIL users.
   ;; Put buf in Emacs state after edit.
@@ -968,12 +972,6 @@
 			(read-key-sequence "Describe key briefly: ")))))
   
   
-  ;; This is now done in viper-minibuffer-exit-hook
-  ;;;; Advice for use in find-file and read-file-name commands.
-  ;;(defadvice exit-minibuffer (before viper-exit-minibuffer-advice activate)
-  ;;  "Run `viper-minibuffer-exit-hook' just before exiting the minibuffer."
-  ;;  (run-hooks 'viper-minibuffer-exit-hook))
-  
   (defadvice find-file (before viper-add-suffix-advice activate)
     "Use `read-file-name' for reading arguments."
     (interactive (cons (read-file-name "Find file: " nil default-directory)
@@ -1029,7 +1027,8 @@
   (defadvice read-file-name (around viper-suffix-advice activate)
     "Tell `exit-minibuffer' to run `viper-file-add-suffix' as a hook."
     (let ((viper-minibuffer-exit-hook
-	   (append viper-minibuffer-exit-hook '(viper-file-add-suffix))))
+	   (append viper-minibuffer-exit-hook
+		   '(viper-minibuffer-trim-tail viper-file-add-suffix))))
       ad-do-it))
   
   (defadvice start-kbd-macro (after viper-kbd-advice activate)
@@ -1081,7 +1080,7 @@
 
       ;; If viper-mode is t, then just continue. Viper will kick in.
       ((eq viper-mode t))
-      ;; Otherwise, it was asking mode and Viper was not loaded through .emacs
+      ;; Otherwise, it was asking Viper was not loaded through .emacs
       ;; In this case, it was either through M-x viper-mode or via something
       ;; else, like the custom widget. If Viper was loaded through 
       ;; M-x viper-mode, then viper will kick in anyway.
@@ -1109,7 +1108,6 @@
 (if (null viper-saved-non-viper-variables)
     (setq viper-saved-non-viper-variables
 	  (list
-	   (cons 'default-major-mode (list default-major-mode))
 	   (cons 'next-line-add-newlines (list next-line-add-newlines))
 	   (cons 'require-final-newline (list require-final-newline))
 	   (cons 'scroll-step (list scroll-step))
@@ -1198,6 +1196,7 @@
       (viper-harness-minor-mode "russian")
       (viper-harness-minor-mode "view-less")
       (viper-harness-minor-mode "view")
+      (viper-harness-minor-mode "reftex")
       ))
 
 
@@ -1251,7 +1250,9 @@
       (viper-change-state-to-emacs)
       (setq-default minor-mode-map-alist minor-mode-map-alist)
       ))
-    
+
+(if (and viper-mode (memq major-mode viper-vi-state-mode-list))
+    (viper-mode))
 
 
 (run-hooks 'viper-load-hook) ; the last chance to change something