]> git.eshelyaron.com Git - emacs.git/commitdiff
*** empty log message ***
authorMichael Kifer <kifer@cs.stonybrook.edu>
Fri, 6 Sep 1996 01:17:30 +0000 (01:17 +0000)
committerMichael Kifer <kifer@cs.stonybrook.edu>
Fri, 6 Sep 1996 01:17:30 +0000 (01:17 +0000)
lisp/emulation/viper.el

index d017e4c7c4f6e96c804b8535fc91d75b13b6cb6a..34e23efc644f4c5dd5e0789881678dfd90a937a0 100644 (file)
@@ -8,7 +8,7 @@
 
 ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
 
-(defconst viper-version "2.90 of June 19, 1996"
+(defconst viper-version "2.91 of August 5, 1996"
   "The current version of Viper")
 
 ;; This file is part of GNU Emacs.
@@ -338,6 +338,12 @@ Use `M-x vip-set-expert-level' to change this.")
 ;;; Viper minor modes
 
 ;; This is not local in Emacs, so we make it local.
+;; This must be local because although the stack of minor modes can be the same
+;; for all buffers, the associated *keymaps* can be different. In Viper,
+;; vip-vi-local-user-map, vip-insert-local-user-map, and others can have
+;; different keymaps for different buffers.
+;; Also, the keymaps associated with vip-vi/insert-state-modifier-minor-mode
+;; can be different.
 (make-variable-buffer-local 'minor-mode-map-alist)
 
 ;; Mode for vital things like \e, C-z.
@@ -478,22 +484,31 @@ it better fits your working style.")
 (vip-deflocalvar vip-replace-overlay nil "")
 (put 'vip-replace-overlay 'permanent-local t)
 
-(if (vip-has-face-support-p)
-    (progn
-      (make-face 'vip-replace-overlay-face)
-      (vip-hide-face 'vip-replace-overlay-face)
-      (or (face-differs-from-default-p 'vip-replace-overlay-face)
-         (progn
-           (if (vip-can-use-colors "darkseagreen2" "Black")
-               (progn
-                 (set-face-background
-                  'vip-replace-overlay-face "darkseagreen2")
-                 (set-face-foreground 'vip-replace-overlay-face "Black")))
-           (set-face-underline-p 'vip-replace-overlay-face t))
-         )))
-           
-(defvar vip-replace-overlay-face 'vip-replace-overlay-face
-  "*Face for highlighting replace regions on a window display.")
+(defvar vip-replace-overlay-pixmap "gray3"
+  "Pixmap to use for search face on non-color displays.")
+(defvar vip-search-face-pixmap "gray3"
+  "Pixmap to use for search face on non-color displays.")
+
+
+(defun vip-set-replace-overlay-face ()
+  (if (vip-has-face-support-p)
+      (defvar vip-replace-overlay-face
+       (progn
+         (make-face 'vip-replace-overlay-face)
+         (vip-hide-face 'vip-replace-overlay-face)
+       (or (face-differs-from-default-p 'vip-replace-overlay-face)
+           (progn
+             (if (vip-can-use-colors "darkseagreen2" "Black")
+                 (progn
+                   (set-face-background
+                    'vip-replace-overlay-face "darkseagreen2")
+                   (set-face-foreground 'vip-replace-overlay-face "Black")))
+             (set-face-underline-p 'vip-replace-overlay-face t)
+             (vip-set-face-pixmap
+              'vip-replace-overlay-face vip-replace-overlay-pixmap)))
+       'vip-replace-overlay-face)
+       "*Face for highlighting replace regions on a window display.")
+    ))
   
 (defvar vip-replace-region-end-delimiter "$"
   "A string marking the end of replacement regions.
@@ -503,12 +518,10 @@ is non-nil.")
   "A string marking the beginning of replacement regions.
 It is used only with TTYs or if `vip-use-replace-region-delimiters'
 is non-nil.")
-(defvar vip-use-replace-region-delimiters 
-  (or (not (vip-has-face-support-p)) (not (vip-color-display-p)))
+(defvar vip-use-replace-region-delimiters (not (vip-has-face-support-p))
   "*If non-nil, Viper will always use `vip-replace-region-end-delimiter' and
 `vip-replace-region-start-delimiter' to delimit replacement regions, even on
-color displays. By default, the delimiters are used only on TTYs or
-monochrome displays.")
+color displays. By default, the delimiters are used only on TTYs.")
   
 ;; XEmacs requires glyphs
 (if vip-xemacs-p
@@ -563,21 +576,8 @@ monochrome displays.")
 ;; Current mode.  One of: `emacs-state', `vi-state', `insert-state'
 (vip-deflocalvar vip-current-state 'emacs-state)
 
-
-(defvar vip-toggle-key "\C-z"
-  "The key used to change states from emacs to Vi and back.
-In insert mode, this key also functions as Meta. 
-Must be set in .vip file or prior to loading Viper.
-This setting cannot be changed interactively.")
-
-(defvar vip-ESC-key "\e" 
-  "Key used to ESC. 
-Must be set in .vip file or prior to loading Viper.
-This setting cannot be changed interactively.")
-
 (defvar vip-no-multiple-ESC  t
   "*If true, multiple ESC in Vi mode will cause bell to ring.
-\_ is then mapped to Meta.
 This is set to t on a windowing terminal and to 'twice on a dumb
 terminal (unless the user level is 1, 2, or 5). On a dumb terminal, this
 enables cursor keys and is generally more convenient, as terminals usually
@@ -821,8 +821,13 @@ These buffers can be cycled through via :R and :P commands.")
 (defvar vip-always t
   "t means, arrange that vi-state will be a default.")
 
-(defvar vip-custom-file-name
-  (convert-standard-filename "~/.vip")
+(defvar vip-custom-file-name (cond (vip-vms-os-p "sys$login:.vip")
+                                  ((memq system-type '(emx ms-dos))
+                                   "/_vip")
+                                  ((memq system-type '(windows-nt windows-95))
+                                   "~/_vip")
+                                  (t ; Unix
+                                   "~/.vip"))
   "Viper customisation file.
 This variable must be set _before_ loading Viper.")
 
@@ -927,7 +932,7 @@ Should be set in `~/.vip' file.")
                                     "Movement commands")
 (vip-test-com-defun vip-movement-command)
 
-;; Commands that can be repeated by .(dotted)
+;; Commands that can be repeated by . (dotted)
 (defconst vip-dotable-commands '(?c ?d ?C ?D ?> ?<))
 (vip-test-com-defun vip-dotable-command)
 
@@ -939,6 +944,14 @@ Should be set in `~/.vip' file.")
 (defconst vip-regsuffix-commands '(?d ?y ?Y ?D ?p ?P ?x ?X))
 (vip-test-com-defun vip-regsuffix-command)
 
+(defconst vip-vi-commands (append vip-movement-commands
+                                 vip-dotable-commands
+                                 vip-charpair-commands
+                                 vip-hash-cmds
+                                 vip-prefix-commands
+                                 vip-regsuffix-commands)
+  "The list of all commands in Vi-state.")
+(vip-test-com-defun vip-vi-command)
 
 \f
 ;;; Arrange the keymaps
@@ -1272,7 +1285,7 @@ and improving upon much of it.
    4. Viper supports multiple undo: `u' will undo. Typing `.' will repeat
       undo. Another `u' changes direction.
    
-   6. Emacs Meta functions are invoked by typing `_' or `\\ ESC'.
+   6. Emacs Meta functions are invoked by typing `C-\\' or `\\ ESC'.
       On a window system, the best way is to use the Meta-key.
    7. Try \\[keyboard-quit] and \\[abort-recursive-edit] repeatedly,if
       something funny happens. This would abort the current editing command. 
@@ -1487,20 +1500,24 @@ This startup message appears whenever you load Viper, unless you type `y' now."
 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 ?\\)
+      (message "Switched to EMACS state for the next command..."))
   (vip-escape-to-state arg events 'emacs-state))
   
 ;; escape to Vi mode termporarily
-(defun vip-escape-to-vi ()
+(defun vip-escape-to-vi (arg)
   "Escape from Emacs state to Vi state for one Vi 1-character command.
-This doesn't work with prefix arguments or most complex commands like
-cw, dw,  etc. But it does work with some 2-character commands,
-like dd or dr."
-  (interactive)
-  (vip-escape-to-state nil nil 'vi-state))  
+If the Vi command that the user types has a prefix argument, e.g., `d2w', then
+Vi's prefix argument will be used. Otherwise, the prefix argument passed to
+`vip-escape-to-vi' is used."
+  (interactive "P")
+  (message "Switched to VI state for the next command...")
+  (vip-escape-to-state arg nil 'vi-state))
   
 ;; Escape to STATE mode for one Emacs command.
 (defun vip-escape-to-state (arg events state)
-  (let (com key prefix-arg)
+  ;;(let (com key prefix-arg)
+  (let (com key)
     ;; this temporarily turns off Viper's minor mode keymaps
     (vip-set-mode-vars-for state)
     (vip-normalize-minor-mode-map-alist)
@@ -1508,23 +1525,26 @@ like dd or dr."
     
     ;; protect against keyboard quit and other errors
     (condition-case nil
-       (progn
+       (let (vip-vi-kbd-minor-mode 
+             vip-insert-kbd-minor-mode
+             vip-emacs-kbd-minor-mode)
          (unwind-protect
              (progn
                (setq com (key-binding (setq key 
                                             (if vip-xemacs-p
                                                 (read-key-sequence nil)
                                               (read-key-sequence nil t)))))
-               ;; In case of indirection--chase definitions.
+               ;; In case of binding indirection--chase definitions.
                ;; Have to do it here because we execute this command under
                ;; different keymaps, so command-execute may not do the
                ;; right thing there
                (while (vectorp com) (setq com (key-binding com))))
            nil)
-         ;; exec command in the right Viper state
-         ;; otherwise, if we switch buffers in the escaped command,
-         ;; Viper's mode vars will remain those of `state'. When we return
-         ;; to the orig buffer, the bindings will be screwed up.
+         ;; Execute command com in the original Viper state, not in state
+         ;; `state'. Otherwise, if we switch buffers while executing the
+         ;; escaped to command, Viper's mode vars will remain those of
+         ;; `state'. When we return to the orig buffer, the bindings will be
+         ;; screwed up.
          (vip-set-mode-vars-for vip-current-state)
          
          ;; this-command, last-command-char, last-command-event
@@ -1538,13 +1558,27 @@ like dd or dr."
            
          (if (commandp com)
              (progn
-               (setq prefix-arg arg)
+               (setq prefix-arg (or prefix-arg arg))
                (command-execute com)))
          )
       (quit (ding))
       (error (beep 1))))
-  (vip-set-mode-vars-for vip-current-state)) ; set state in new buffer
+  ;; set state in the new buffer
+  (vip-set-mode-vars-for vip-current-state))
       
+(defun vip-exec-form-in-vi  (form)
+  "Execute FORM in Vi state, regardless of the Ccurrent Vi state."
+  (let ((buff (current-buffer))
+       result)
+    (vip-set-mode-vars-for 'vi-state)
+    (setq result (eval form))
+    (if (not (equal buff (current-buffer))) ; cmd switched buffer
+       (save-excursion
+         (set-buffer buff)
+         (vip-set-mode-vars-for vip-current-state)))
+    (vip-set-mode-vars-for vip-current-state)
+    result))
+
 (defun vip-exec-form-in-emacs  (form)
   "Execute FORM in Emacs, temporarily disabling Viper's minor modes.
 Similar to vip-escape-to-emacs, but accepts forms rather than keystrokes."
@@ -1587,13 +1621,13 @@ Suffixes such as .el or .elc should be stripped."
 
 (defun vip-ESC (arg)
   "Emulate ESC key in Emacs.
-Prevents multiple escape keystrokes if vip-no-multiple-ESC is true. In that
-case \@ will be bound to ESC. If vip-no-multiple-ESC is 'twice double ESC
-would dings in vi-state. Other ESC sequences are emulated via the current
-Emacs's major mode keymap. This is more convenient on dumb terminals and in
-Emacs -nw, since this won't block functional keys such as up,down,
-etc. Meta key also will work. When vip-no-multiple-ESC is nil, ESC key
-behaves as in Emacs, any number of multiple escapes is allowed."
+Prevents multiple escape keystrokes if vip-no-multiple-ESC is true.
+If vip-no-multiple-ESC is 'twice double ESC would ding in vi-state.
+Other ESC sequences are emulated via the current Emacs's major mode
+keymap. This is more convenient on TTYs, since this won't block
+function keys such as up,down, etc. ESC will also will also work as
+a Meta key in this case. When vip-no-multiple-ESC is nil, ESC functions
+as a Meta key and any number of multiple escapes is allowed."
   (interactive "P")
   (let (char)
     (cond ((and (not vip-no-multiple-ESC) (eq vip-current-state 'vi-state))
@@ -1608,11 +1642,21 @@ behaves as in Emacs, any number of multiple escapes is allowed."
          (t (ding)))
     ))
 
-(defun vip-alternate-ESC (arg)
-  "ESC key without checking for multiple keystrokes."
+(defun vip-alternate-Meta-key (arg)
+  "Simulate Emacs Meta key."
   (interactive "P")
+  (sit-for 1) (message "ESC-")
   (vip-escape-to-emacs arg '(?\e)))
-  
+
+(defun vip-toggle-key-action ()
+  "Action bound to `vip-toggle-key'."
+  (interactive)
+  (if (and (< vip-expert-level 2) (equal vip-toggle-key "\C-z"))
+      (if (vip-window-display-p)
+         (vip-iconify)
+       (suspend-emacs))
+    (vip-change-state-to-emacs)))
+
 \f
 ;; Intercept ESC sequences on dumb terminals.
 ;; Based on the idea contributed by Marcelino Veiga Tuimil <mveiga@dit.upm.es>
@@ -1783,9 +1827,9 @@ behaves as in Emacs, any number of multiple escapes is allowed."
 
 
 ;; Compute numeric prefix arg value. 
-;; Invoked by CHAR. COM is the command part obtained so far.
+;; Invoked by EVENT. COM is the command part obtained so far.
 (defun vip-prefix-arg-value (event com)
-  (let (value)
+  (let (value func)
     ;; read while number
     (while (and (vip-characterp event) (>= event ?0) (<= event ?9))
       (setq value (+ (* (if (vip-characterp value) value 0) 10) (- event ?0)))
@@ -1796,11 +1840,39 @@ behaves as in Emacs, any number of multiple escapes is allowed."
     (while (eq event ?U)
       (vip-describe-arg prefix-arg)
       (setq event (vip-read-event-convert-to-char)))
-    (vip-set-unread-command-events event)))
+    
+    (if (or com (and (not (eq vip-current-state 'vi-state))
+                    ;; make sure it is a Vi command
+                    (vip-characterp event) (vip-vi-command-p event)
+                    ))
+       ;; If appears to be one of the vi commands,
+       ;; then execute it with funcall and clear prefix-arg in order to not
+       ;; confuse subsequent commands
+       (progn
+         ;; last-command-char is the char we want emacs to think was typed
+         ;; last. If com is not nil, the vip-digit-argument command was called
+         ;; from within vip-prefix-arg command, such as `d', `w', etc., i.e., 
+         ;; the user typed, say, d2. In this case, `com' would be `d', `w',
+         ;; etc.
+         ;; If vip-digit-argument was invoked by vip-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, last-command-char must make emacs believe that
+         ;; this is the command we typed.
+         (setq last-command-char (or com event))
+         (setq func (vip-exec-form-in-vi 
+                     (` (key-binding (char-to-string (, event))))))
+         (funcall func prefix-arg)
+         (setq prefix-arg nil))
+      ;; some other command -- let emacs do it in its own way
+      (vip-set-unread-command-events event))
+    ))
+                    
 
 ;; Vi operator as prefix argument."
 (defun vip-prefix-arg-com (char value com)
-  (let ((cont t))
+  (let ((cont t)
+       cmd-info mv-or-digit-cmd)
     (while (and cont
                (memq char
                      (list ?c ?d ?y ?! ?< ?> ?= ?# ?r ?R ?\"
@@ -1834,20 +1906,23 @@ behaves as in Emacs, any number of multiple escapes is allowed."
                 (setq char (read-char))))
              (t
               (setq com char)
-              (setq char (vip-read-char-exclusive)))))))
+              (setq char (vip-read-char-exclusive))))))
+
   (if (atom com)
-      ;; com is a single char, so we construct prefix-arg 
-      ;; and if char is ?, describe prefix arg, otherwise exit by
-      ;; pushing the char back into vip-set-unread-command-events
-      ;; Since char is a command, the command will execute with the prefix
-      ;; argument that we just constructed.
+      ;; `com' is a single char, so we construct the command argument
+      ;; and if `char' is `?', we describe the arg; otherwise 
+      ;; we prepare the command that will be executed at the end.
       (progn
-       (setq prefix-arg (cons value com))
+       (setq cmd-info (cons value com))
        (while (= char ?U)
-         (vip-describe-arg prefix-arg)
+         (vip-describe-arg cmd-info)
          (setq char (read-char)))
-       (vip-set-unread-command-events char)
-       )
+       ;; `char' is a movement command or a digit arg command---so we execute
+       ;; it at the very end 
+       (setq mv-or-digit-cmd
+             (vip-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))
        ;; execute apropriate region command.
@@ -1868,7 +1943,13 @@ behaves as in Emacs, any number of multiple escapes is allowed."
            ((equal com '(?> . ?>)) (vip-line (cons value ?>)))
            ((equal com '(?! . ?!)) (vip-line (cons value ?!)))
            ((equal com '(?= . ?=)) (vip-line (cons value ?=)))
-           (t (error ""))))))
+           (t (error "")))))
+  
+  (if mv-or-digit-cmd
+      (progn
+       (setq last-command-char char)
+       (funcall mv-or-digit-cmd cmd-info)))
+  ))
 
 (defun vip-describe-arg (arg)
   (let (val com)
@@ -1886,8 +1967,8 @@ behaves as in Emacs, any number of multiple escapes is allowed."
   "Begin numeric argument for the next command."
   (interactive "P")
   (vip-leave-region-active)
-  (vip-prefix-arg-value last-command-char
-                       (if (consp arg) (cdr arg) nil)))
+  (vip-prefix-arg-value
+   last-command-char (if (consp arg) (cdr arg) nil)))
 
 (defun vip-command-argument (arg)
   "Accept a motion command as an argument."
@@ -2537,8 +2618,8 @@ Undo previous insertion and inserts new."
                  (progn
                    (set-face-background 'vip-search-face "khaki")
                    (set-face-foreground 'vip-search-face "Black"))
-               (copy-face 'italic 'vip-search-face)
-               (set-face-underline-p 'vip-search-face t)))
+               (set-face-underline-p 'vip-search-face t)
+               (vip-set-face-pixmap 'vip-search-face vip-search-face-pixmap)))
          'vip-search-face)
         "*Face used to flash out the search pattern.")
     ))
@@ -3905,21 +3986,30 @@ controlled by the sign of prefix numeric value."
 
 (setq scroll-step 1)
 
-(defun vip-scroll (arg)
+(defun vip-scroll-screen (arg)
   "Scroll to next screen."
   (interactive "p")
-  (if (> arg 0)
-      (while (> arg 0)
-       (scroll-up)
-       (setq arg (1- arg)))
-    (while (> 0 arg)
-      (scroll-down)
-      (setq arg (1+ arg)))))
-
-(defun vip-scroll-back (arg)
+  (condition-case nil
+      (if (> arg 0)
+         (while (> arg 0)
+           (scroll-up)
+           (setq arg (1- arg)))
+       (while (> 0 arg)
+         (scroll-down)
+         (setq arg (1+ arg))))
+    (error (beep 1)
+          (if (> arg 0)
+              (progn
+                (message "End of buffer")
+                (goto-char (point-max)))
+            (message "Beginning of buffer")
+            (goto-char (point-min))))
+    ))
+
+(defun vip-scroll-screen-back (arg)
   "Scroll to previous screen."
   (interactive "p")
-  (vip-scroll (- arg)))
+  (vip-scroll-screen (- arg)))
 
 (defun vip-scroll-down (arg)
   "Pull down half screen."
@@ -4084,7 +4174,7 @@ Null string will repeat previous search."
            (search-failed
             (if (and (not fail-if-not-found) vip-search-wrap-around-t)
                 (progn
-                  (message "Search wrapped around end of buffer")
+                  (message "Search wrapped around BOTTOM of buffer")
                   (goto-char (point-min))
                   (vip-search string forward (cons 1 com) t start-point 'fail)
                   ;; don't wait in macros
@@ -4111,7 +4201,7 @@ Null string will repeat previous search."
          (search-failed
           (if (and (not fail-if-not-found) vip-search-wrap-around-t)
               (progn
-                (message "Search wrapped around beginning of buffer")
+                (message "Search wrapped around TOP of buffer")
                 (goto-char (point-max))
                 (vip-search string forward (cons 1 com) t start-point 'fail)
                 ;; don't wait in macros
@@ -4743,6 +4833,7 @@ One can use `` and '' to temporarily jump 1 step back."
         (if (and (vip-same-line (point) vip-last-jump)
                  (= (point) vip-last-jump-ignore))
             (goto-char vip-last-jump))
+        (if (null (mark t)) (error "Mark is not set in this buffer"))
         (if (= (point) (mark t)) (pop-mark))
         (exchange-point-and-mark)
         (setq vip-last-jump (point-marker)
@@ -4943,13 +5034,10 @@ sensitive for VI-style look-and-feel."
        vip-ex-style-editing-in-insert  t
        vip-want-ctl-h-help nil)
 
-  (cond
-       ;; a novice or a beginner
-       ((eq vip-expert-level 1)
-        (global-set-key vip-toggle-key   ;; in emacs-state
-                        (if (vip-window-display-p)
-                            'vip-iconify
-                          'suspend-emacs))
+  (cond ((eq vip-expert-level 1) ; novice or beginner
+        (global-set-key   ; in emacs-state 
+         vip-toggle-key
+         (if (vip-window-display-p) 'vip-iconify 'suspend-emacs))
         (setq vip-no-multiple-ESC           t
               vip-re-search                 t
               vip-vi-style-in-minibuffer    t
@@ -4957,8 +5045,8 @@ sensitive for VI-style look-and-feel."
               vip-want-emacs-keys-in-vi     nil
               vip-want-emacs-keys-in-insert nil))
        
-       ;; an intermediate to guru
        ((and (> vip-expert-level 1) (< vip-expert-level 5))
+        ;; intermediate to guru
         (setq vip-no-multiple-ESC     (if (vip-window-display-p) t 'twice)
               vip-want-emacs-keys-in-vi     t
               vip-want-emacs-keys-in-insert (> vip-expert-level 2))
@@ -4983,9 +5071,9 @@ sensitive for VI-style look-and-feel."
                     (cdr (assoc 'vip-no-multiple-ESC
                                 vip-saved-user-settings))))))
               
-       ;; A wizard
+       ;; A wizard!!
        ;; Ideally, if 5 is selected, a buffer should pop up to let the
-       ;; user toggle variable values.
+       ;; user toggle the values of variables.
        (t (setq-default vip-ex-style-editing-in-insert
                         (cdr (assoc 'vip-ex-style-editing-in-insert
                                     vip-saved-user-settings))
@@ -5365,17 +5453,11 @@ Mail anyway (y or n)? ")
 
 ;; This hook designed to enable Vi-style editing in comint-based modes."
 (defun vip-comint-mode-hook ()
-  (setq require-final-newline nil)
-  (setq vip-ex-style-editing-in-insert nil
+  (setq require-final-newline nil
+       vip-ex-style-editing-in-insert nil
        vip-ex-style-motion nil)
-  (vip-add-local-keys 'vi-state
-                     '(("\C-m" . comint-send-input) ; return
-                       ("\C-d" . comint-delchar-or-maybe-eof))) ; \C-d
-  (vip-add-local-keys 'insert-state
-                     '(("\C-m" . comint-send-input) ; return
-                       ("\C-d" . comint-delchar-or-maybe-eof))) ; \C-d
-  )
-  
+  (vip-change-state-to-insert))
+
 
 ;; This sets major mode hooks to make them come up in vi-state.
 (defun vip-set-hooks ()
@@ -5404,6 +5486,8 @@ Mail anyway (y or n)? ")
   (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 emacs-lisp-mode-hook)
   (add-hook 'emacs-lisp-mode-hook 'viper-mode)
@@ -5440,7 +5524,18 @@ Mail anyway (y or n)? ")
   
   (defvar emerge-startup-hook)
   (add-hook 'emerge-startup-hook 'vip-change-state-to-emacs)
-  ;; Run vip-change-state-to-vi after quitting emerge.
+
+  ;; Tell vc-diff to put *vc* in Vi mode
+  (if (featurep 'vc)
+      (defadvice vc-diff (after vip-vc-ad activate)
+       "Force Vi state in VC diff buffer."
+       (vip-change-state-to-vi))
+    (vip-eval-after-load
+     "vc"
+     '(defadvice vc-diff (after vip-vc-ad activate)
+       "Force Vi state in VC diff buffer."
+       (vip-change-state-to-vi))))
+    
   (vip-eval-after-load
    "emerge"
    '(defadvice emerge-quit (after vip-emerge-advice activate)
@@ -5473,7 +5568,10 @@ Mail anyway (y or n)? ")
   
   ;; Emacs shell, ange-ftp, and comint-based modes
   (defvar comint-mode-hook)
-  (add-hook 'comint-mode-hook 'vip-change-state-to-insert)
+  (vip-modify-major-mode 
+   'comint-mode 'insert-state vip-comint-mode-modifier-map)
+  (vip-modify-major-mode 
+   'comint-mode 'vi-state vip-comint-mode-modifier-map)
   (add-hook 'comint-mode-hook 'vip-comint-mode-hook)
   
   ;; Shell scripts
@@ -5483,9 +5581,40 @@ Mail anyway (y or n)? ")
   (add-hook 'ksh-mode-hook 'viper-mode)
   
   ;; Dired
-  ;; This is only necessary when the user uses vip-modify-major-mode
+  (vip-modify-major-mode 'dired-mode 'emacs-state vip-dired-modifier-map)
   (add-hook 'dired-mode-hook 'vip-change-state-to-emacs)
 
+  ;; MH-E
+  (vip-modify-major-mode 'mh-folder-mode 'emacs-state vip-slash-and-colon-map)
+  ;; changing state to emacs is needed so the preceding will take hold
+  (add-hook 'mh-folder-mode-hook 'vip-change-state-to-emacs)
+  (add-hook 'mh-show-mode-hook 'viper-mode)
+
+  ;; Gnus
+  (vip-modify-major-mode 'gnus-group-mode 'emacs-state vip-slash-and-colon-map)
+  (vip-modify-major-mode 
+   'gnus-summary-mode 'emacs-state vip-slash-and-colon-map)
+  ;; changing state to emacs is needed so the preceding will take hold
+  (add-hook 'gnus-group-mode-hook 'vip-change-state-to-emacs)
+  (add-hook 'gnus-summary-mode-hook 'vip-change-state-to-emacs)
+  (add-hook 'gnus-article-mode-hook 'viper-mode)
+
+  ;; Info
+  (vip-modify-major-mode 'Info-mode 'emacs-state vip-slash-and-colon-map)
+  ;; Switching to emacs is needed  so the above will take hold
+  (defadvice Info-mode (after vip-Info-ad activate)
+    "Switch to emacs mode."
+    (vip-change-state-to-emacs))
+
+  ;; Buffer menu
+  (vip-modify-major-mode 
+   'Buffer-menu-mode 'emacs-state vip-slash-and-colon-map)
+  ;; Switching to emacs is needed  so the above will take hold
+  (defadvice Buffer-menu-mode (after vip-Buffer-menu-ad activate)
+    "Switch to emacs mode."
+    (vip-change-state-to-emacs))
+
+  ;; View mode
   (if vip-emacs-p
       (progn
        (defvar view-mode-hook)
@@ -5566,6 +5695,7 @@ Mail anyway (y or n)? ")
 (vip-set-minibuffer-style)
 (vip-set-minibuffer-faces)
 (vip-set-search-face)
+(vip-set-replace-overlay-face)
 (if vip-buffer-search-char
     (vip-buffer-search-enable))
 (vip-update-alphanumeric-class)
@@ -5594,15 +5724,10 @@ Mail anyway (y or n)? ")
 ;; This is taken care of by vip-insert-global-user-map.
 ;;(define-key vip-replace-map vip-ESC-key 'vip-intercept-ESC-key)
 
-(define-key vip-insert-intercept-map vip-toggle-key 'vip-alternate-ESC)
+
 ;; The default vip-toggle-key is \C-z; for the novice, it suspends or
 ;; iconifies Emacs
-(define-key vip-vi-intercept-map vip-toggle-key
-  '(lambda () (interactive)
-     (if (and (< vip-expert-level 2) (equal vip-toggle-key "\C-z"))
-        (if (vip-window-display-p) (vip-iconify) (suspend-emacs))
-       (vip-change-state-to-emacs))))
-
+(define-key vip-vi-intercept-map vip-toggle-key 'vip-toggle-key-action)
 (define-key vip-emacs-intercept-map vip-toggle-key 'vip-change-state-to-vi)