]> git.eshelyaron.com Git - emacs.git/commitdiff
new version
authorMichael Kifer <kifer@cs.stonybrook.edu>
Wed, 18 Jun 1997 01:26:55 +0000 (01:26 +0000)
committerMichael Kifer <kifer@cs.stonybrook.edu>
Wed, 18 Jun 1997 01:26:55 +0000 (01:26 +0000)
lisp/emulation/viper-cmd.el
lisp/emulation/viper-ex.el
lisp/emulation/viper-init.el
lisp/emulation/viper-keym.el
lisp/emulation/viper.el

index 2e25a44a7e5c943d3637d5752e6f9f34b762985c..d8ff9bdaa67b5981e794bb6b9ec561f9fb4f0660 100644 (file)
@@ -12,6 +12,7 @@
 (defvar vip-minibuffer-insert-face)
 (defvar vip-minibuffer-vi-face)
 (defvar vip-minibuffer-emacs-face)
+(defvar viper-always)
 (defvar vip-mode-string        )
 (defvar iso-accents-mode)
 (defvar zmacs-region-stays)
     
   ;; Sets Viper mode string in global-mode-string
   (force-mode-line-update))
-  
-;;;###autoload
-(defun viper-mode ()
-  "Turn on Viper emulation of Vi."
-  (interactive)
-  (if (not noninteractive)
-      (progn
-       (if vip-first-time ; This check is important. Without it, startup and 
-           (progn         ; expert-level msgs mix up when viper-mode recurses
-             (setq vip-first-time nil)
-             (if (not vip-inhibit-startup-message)
-                 (save-window-excursion
-                   (setq vip-inhibit-startup-message t)
-                   (delete-other-windows)
-                   (switch-to-buffer "Viper Startup Message")
-                   (erase-buffer)
-                   (insert
-                    (substitute-command-keys
-                     "Viper Is a Package for Emacs Rebels.
-It is also a VI Plan for Emacs Rescue and a venomous VI PERil.
-
-Technically speaking, Viper is a Vi emulation package for GNU Emacs 19 and
-XEmacs 19.  It supports virtually all of Vi and Ex functionality, extending
-and improving upon much of it.
-
-   1. Viper supports Vi at several levels. Level 1 is the closest to Vi,
-      level 5 provides the most flexibility to depart from many Vi conventions.
-      
-      You will be asked to specify your user level in a following screen.
-   
-      If you select user level 1 then the keys ^X, ^C, ^Z, and ^G will behave
-      as in VI, to smooth transition to Viper for the beginners. However, to
-      use Emacs productively, you are advised to reach user level 3 or higher. 
-      
-      If your user level is 2 or higher, ^X and ^C will invoke Emacs
-      functions,as usual in Emacs; ^Z will toggle vi/emacs modes, and 
-      ^G will be the usual Emacs's keyboard-quit (something like ^C in VI).
-   
-   2. Vi exit functions (e.g., :wq, ZZ) work on INDIVIDUAL files -- they
-      do not cause Emacs to quit, except at user level 1 (a novice).
-   3. ^X^C EXITS EMACS.
-   4. Viper supports multiple undo: `u' will undo. Typing `.' will repeat
-      undo. Another `u' changes direction.
-   
-   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. 
-      
-You can get more information on Viper by:
-
-   a. Typing `:help' in Vi state
-   b. Printing Viper manual, found in ./etc/viper.dvi
-   c. Printing ViperCard, the Quick Reference, found in ./etc/viperCard.dvi
-    
-This startup message appears whenever you load Viper, unless you type `y' now."
-                     ))
-                   (goto-char (point-min))
-                   (if (y-or-n-p "Inhibit Viper startup message? ")
-                       (vip-save-setting
-                        'vip-inhibit-startup-message
-                        "Viper startup message inhibited"
-                        vip-custom-file-name t))
-                   ;;(kill-buffer (current-buffer))
-                   (message
-                    "The last message is in buffer `Viper Startup Message'")
-                   (sit-for 4)
-                   ))
-             (vip-set-expert-level 'dont-change-unless)))
-       (vip-change-state-to-vi))))
        
-;;;###autoload
-(defalias 'vip-mode 'viper-mode)
-
 
 ;; Switch from Insert state to Vi state.
 (defun vip-exit-insert-state ()
@@ -4109,7 +4037,8 @@ One can use `` and '' to temporarily jump 1 step back."
     (if vip-auto-indent
        (progn
          (setq vip-cted t)
-         (if vip-electric-mode
+         (if (and vip-electric-mode
+                  (not (eq major-mode 'fundamental-mode)))
              (indent-according-to-mode)
            (indent-to vip-current-indent))
          ))
@@ -4207,7 +4136,7 @@ One can use `` and '' to temporarily jump 1 step back."
 Can be called interactively to change (temporarily or permanently) the
 current expert level.
 
-The optional argument DONT-CHANGE-UNLESS if not nil, says that
+The optional argument DONT-CHANGE-UNLESS, if not nil, says that
 the level should not be changed, unless its current value is
 meaningless (i.e., not one of 1,2,3,4,5).
 
@@ -4224,7 +4153,7 @@ sensitive for VI-style look-and-feel."
     ;;    & dont-change-unless = t -- use it; else ask
     (vip-ask-level dont-change-unless))
   
-  (setq vip-always                     t
+  (setq viper-always                   t
        vip-ex-style-motion             t
        vip-ex-style-editing-in-insert  t
        vip-want-ctl-h-help nil)
@@ -4237,16 +4166,19 @@ sensitive for VI-style look-and-feel."
               vip-re-search                 t
               vip-vi-style-in-minibuffer    t
               vip-search-wrap-around-t      t
+              vip-electric-mode             nil
               vip-want-emacs-keys-in-vi     nil
               vip-want-emacs-keys-in-insert nil))
        
        ((and (> vip-expert-level 1) (< vip-expert-level 5))
         ;; intermediate to guru
-        (setq vip-no-multiple-ESC     (if (vip-window-display-p) t 'twice)
+        (setq vip-no-multiple-ESC           (if (vip-window-display-p)
+                                                t 'twice)
+              vip-electric-mode             t
               vip-want-emacs-keys-in-vi     t
               vip-want-emacs-keys-in-insert (> vip-expert-level 2))
 
-        (if (eq vip-expert-level 4) ; respect user's ex-style motions
+        (if (eq vip-expert-level 4) ; respect user's ex-style motion
                                     ; and vip-no-multiple-ESC
             (progn
               (setq-default vip-ex-style-editing-in-insert
@@ -4277,8 +4209,8 @@ sensitive for VI-style look-and-feel."
                                     vip-saved-user-settings)))
           (setq  vip-want-ctl-h-help 
                  (cdr (assoc 'vip-want-ctl-h-help vip-saved-user-settings))
-                 vip-always
-                 (cdr (assoc 'vip-always vip-saved-user-settings))
+                 viper-always
+                 (cdr (assoc 'viper-always vip-saved-user-settings))
                  vip-no-multiple-ESC 
                  (cdr (assoc 'vip-no-multiple-ESC vip-saved-user-settings))
                  vip-ex-style-motion 
@@ -4288,6 +4220,9 @@ sensitive for VI-style look-and-feel."
                              vip-saved-user-settings))
                  vip-re-search
                  (cdr (assoc 'vip-re-search vip-saved-user-settings))
+                 vip-electric-mode 
+                 (cdr (assoc 'vip-electric-mode
+                             vip-saved-user-settings))
                  vip-want-emacs-keys-in-vi 
                  (cdr (assoc 'vip-want-emacs-keys-in-vi
                              vip-saved-user-settings))
@@ -4295,7 +4230,7 @@ sensitive for VI-style look-and-feel."
                  (cdr (assoc 'vip-want-emacs-keys-in-insert
                              vip-saved-user-settings)))))
   (vip-set-mode-vars-for vip-current-state)
-  (if (or vip-always
+  (if (or viper-always
          (and (> vip-expert-level 0) (> 5 vip-expert-level)))
       (vip-set-hooks)))
 
@@ -4374,9 +4309,9 @@ You can change it at any time by typing `M-x vip-set-expert-level RET'
  4 -- GURU: Like 3, but user settings are respected for vip-no-multiple-ESC,
          vip-re-search, vip-ex-style-motion, & vip-ex-style-editing-in-insert
          variables. Adjust these settings to your taste.
- 5 -- WIZARD: Like 4, but user settings are also respected for vip-always,
-         vip-want-ctl-h-help, vip-want-emacs-keys-in-vi, and 
-         vip-want-emacs-keys-in-insert. Adjust these to your taste.
+ 5 -- WIZARD: Like 4, but user settings are also respected for viper-always,
+         vip-electric-mode, vip-want-ctl-h-help, vip-want-emacs-keys-in-vi,
+         and vip-want-emacs-keys-in-insert. Adjust these to your taste.
       
 Please, specify your level now: ")
          
@@ -4495,6 +4430,7 @@ Please, specify your level now: ")
                        'vip-want-emacs-keys-in-vi
                        'vip-keep-point-on-undo
                        'vip-no-multiple-ESC
+                       'vip-electric-mode
                        'vip-ESC-key
                        'vip-want-ctl-h-help
                        'vip-ex-style-editing-in-insert
index 4a81df559e05a7851826b68b4911bd55c8e71791..8ef9eccec4a36b9f5a940d56c7abcd2efc4460bc 100644 (file)
@@ -34,6 +34,7 @@
 (defvar vip-expert-level)
 (defvar vip-custom-file-name)
 (defvar vip-case-fold-search)
+(defvar explicit-shell-file-name)
 
 ;; loading happens only in non-interactive compilation
 ;; in order to spare non-viperized emacs from being viperized
 ;; A-list of Ex variables that can be set using the :set command.
 (defconst ex-variable-alist 
   '(("wrapscan") ("ws") ("wrapmargin") ("wm")
-    ("global-tabstop") ("gts") ("tabstop") ("ts")
+    ("tabstop-global") ("ts-g") ("tabstop") ("ts")
     ("showmatch") ("sm") ("shiftwidth") ("sw") ("shell") ("sh")
     ("readonly") ("ro") 
     ("nowrapscan") ("nows") ("noshowmatch") ("nosm")
     ("noreadonly") ("noro") ("nomagic") ("noma")
     ("noignorecase") ("noic")
-    ("global-noautoindent") ("gnoai") ("noautoindent") ("noai")
+    ("noautoindent-global") ("noai-g") ("noautoindent") ("noai")
     ("magic") ("ma") ("ignorecase") ("ic")
-    ("global-autoindent") ("gai") ("autoindent") ("ai")
+    ("autoindent-global") ("ai-g") ("autoindent") ("ai") 
+    ("all") 
     ))
 
   
@@ -1564,7 +1566,7 @@ reversed.")
     (while (string-match "^[ \\t\\n]*$"
                         (setq str
                               (completing-read ":set " ex-variable-alist)))
-      (message ":set <Variable> ")
+      (message ":set <Variable> [= <Value>]")
       ;; if there are unread events, don't wait
       (or (vip-set-unread-command-events "") (sit-for 2))
       ) ; while
@@ -1582,12 +1584,15 @@ reversed.")
        actual-lisp-cmd lisp-cmd-del-pattern
        val2 orig-var)
     (setq orig-var var)
-    (cond ((member var '("ai" "autoindent"))
+    (cond ((string= var "all")
+          (setq ask-if-save nil
+                set-cmd nil))
+         ((member var '("ai" "autoindent"))
           (setq var "vip-auto-indent"
                 set-cmd "setq"
                 ask-if-save nil
                 val "t"))
-         ((member var '("gai" "global-autoindent"))
+         ((member var '("ai-g" "autoindent-global"))
           (kill-local-variable 'vip-auto-indent)
           (setq var "vip-auto-indent"
                 set-cmd "setq-default"
@@ -1596,7 +1601,7 @@ reversed.")
           (setq var "vip-auto-indent"
                 ask-if-save nil
                 val "nil"))
-         ((member var '("gnoai" "global-noautoindent"))
+         ((member var '("noai-g" "noautoindent-global"))
           (kill-local-variable 'vip-auto-indent)
           (setq var "vip-auto-indent"
                 set-cmd "setq-default"
@@ -1610,7 +1615,7 @@ reversed.")
          ((member var '("ma" "magic"))
           (setq var "vip-re-search"
                 val "t"))
-         ((member var '("noma" "nomagic"))
+         ((member var '("noma" "nomagic"))
           (setq var "vip-re-search"
                 val "nil"))
          ((member var '("ro" "readonly"))
@@ -1631,7 +1636,7 @@ reversed.")
          ((member var '("nows" "nowrapscan"))
           (setq var "vip-search-wrap-around-t"
                 val "nil")))
-    (if (eq val 0) ; value must be set by the user
+    (if (and set-cmd (eq val 0)) ; value must be set by the user
        (let ((cursor-in-echo-area t))
          (message ":set %s = <Value>" var)
          ;; if there are unread events, don't wait
@@ -1643,7 +1648,7 @@ reversed.")
          (if (member var
                      '("sw" "shiftwidth"
                        "ts" "tabstop"
-                       "gts" "global-tabstop"
+                       "ts-g" "tabstop-global"
                        "wm" "wrapmargin")) 
              (condition-case nil
                  (or (numberp (setq val2 (car (read-from-string val))))
@@ -1659,7 +1664,7 @@ reversed.")
            (setq var "tab-width"
                  set-cmd "setq"
                  ask-if-save nil))
-          ((member var '("gts" "global-tabstop"))
+          ((member var '("ts-g" "tabstop-global"))
            (kill-local-variable 'tab-width)
            (setq var "tab-width"
                  set-cmd "setq-default"))
@@ -1674,11 +1679,12 @@ reversed.")
                  val (format "\"%s\"" val)))))
       (ex-fixup-history "set" orig-var))
     
-    (setq actual-lisp-cmd (format "\n(%s %s %s) %s"
-                                 set-cmd var val auto-cmd-label))
-    (setq lisp-cmd-del-pattern
-         (format "^\n?[ \t]*([ \t]*%s[ \t]+%s[ \t].*)[ \t]*%s"
-                 set-cmd var auto-cmd-label))
+    (if set-cmd
+       (setq actual-lisp-cmd
+             (format "\n(%s %s %s) %s" set-cmd var val auto-cmd-label)
+             lisp-cmd-del-pattern
+             (format "^\n?[ \t]*([ \t]*%s[ \t]+%s[ \t].*)[ \t]*%s"
+                     set-cmd var auto-cmd-label)))
     
     (if (and ask-if-save
             (y-or-n-p (format "Do you want to save this setting in %s "
@@ -1705,15 +1711,19 @@ reversed.")
                ))
          ))
     
-    (message "%s %s %s" set-cmd var (if (string-match "^[ \t]*$" val)
-                                       (format "%S" val)
-                                     val))
-    (eval (car (read-from-string actual-lisp-cmd)))
-       (if (string= var "fill-column")
-               (if (> val2 0)
-                       (auto-fill-mode 1)
-                 (auto-fill-mode -1)))
-               
+    (if set-cmd
+       (message "%s %s %s"
+                set-cmd var
+                (if (string-match "^[ \t]*$" val)
+                    (format "%S" val)
+                  val)))
+    (if actual-lisp-cmd
+       (eval (car (read-from-string actual-lisp-cmd))))
+    (if (string= var "fill-column")
+       (if (> val2 0)
+           (auto-fill-mode 1)
+         (auto-fill-mode -1)))
+    (if (string= var "all") (ex-show-vars))
     ))
 
 ;; In inline args, skip regex-forw and (optionally) chars-back.
@@ -2077,5 +2087,32 @@ Please contact your system administrator. "
        (kill-buffer " *vip-info*")))
     ))
 
+;; display all variables set through :set
+(defun ex-show-vars ()
+  (with-output-to-temp-buffer " *vip-info*"
+    (princ (if vip-auto-indent
+              "autoindent (local)\n" "noautoindent (local)\n"))
+    (princ (if (default-value 'vip-auto-indent) 
+              "autoindent (global) \n" "noautoindent (global) \n"))
+    (princ (if vip-case-fold-search "ignorecase\n" "noignorecase\n"))
+    (princ (if vip-re-search "magic\n" "nomagic\n"))
+    (princ (if buffer-read-only "readonly\n" "noreadonly\n"))
+    (princ (if blink-matching-paren "showmatch\n" "noshowmatch\n"))
+    (princ (if vip-search-wrap-around-t "wrapscan\n" "nowrapscan\n"))
+    (princ (format "shiftwidth \t\t= %S\n" vip-shift-width))
+    (princ (format "tabstop (local) \t= %S\n" tab-width))
+    (princ (format "tabstop (global) \t= %S\n" (default-value 'tab-width)))
+    (princ (format "wrapmargin (local) \t= %S\n"
+                  (- (window-width) fill-column)))
+    (princ (format "wrapmargin (global) \t= %S\n"
+                  (- (window-width) (default-value 'fill-column))))
+    (princ (format "shell \t\t\t= %S\n" (if (boundp 'explicit-shell-file-name)
+                                           explicit-shell-file-name
+                                         'none)))
+    ))
+
+
+
+
 
 ;;;  viper-ex.el ends here
index 84a40193cb51199a75bef6c8e9a931a6a5456f07..91aa1e98b4be9da05c520e3261ae2ed0f1d9b3d7 100644 (file)
@@ -599,10 +599,7 @@ These buffers can be cycled through via :R and :P commands.")
 (defvar vip-inhibit-startup-message nil
   "Whether Viper startup message should be inhibited.")
 
-(defvar vip-always t
-  "t means, arrange that vi-state will be a default.")
-
-(defvar vip-custom-file-name (vip-convert-standard-file-name "~/.vip")
+(defvar vip-custom-file-name (vip-convert-standard-file-name "~/.viper")
   "Viper customisation file.
 This variable must be set _before_ loading Viper.")
 
index 370ae3de291f5dbaa09b31d24c7cd3af63d19f89..9c1f50158b95f84e663c77d4081321615db7f2c4 100644 (file)
@@ -24,7 +24,7 @@
 (provide 'viper-keym)
 
 ;; compiler pacifier
-(defvar vip-always)
+(defvar viper-always)
 (defvar vip-current-state)
 (defvar vip-mode-string)
 (defvar vip-expert-level)
@@ -586,7 +586,7 @@ Arguments: (major-mode vip-state keymap)"
     
     (princ (format "\nvip-expert-level  %S\n" vip-expert-level))
     (princ (format "vip-no-multiple-ESC  %S\n" vip-no-multiple-ESC))
-    (princ (format "vip-always  %S\n" vip-always))
+    (princ (format "viper-always  %S\n" viper-always))
     (princ (format "vip-ex-style-motion  %S\n"
                   vip-ex-style-motion))
     (princ (format "vip-ex-style-editing-in-insert  %S\n"
index 2e33a428ad85f6c7f63d53ce5dab1fd55cb5790f..ab36617e0f6f3a6b3afa3e01fc210b815ed3b3b0 100644 (file)
@@ -8,7 +8,7 @@
 
 ;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
 
-(defconst viper-version "2.94 of June 9, 1997"
+(defconst viper-version "2.94 of June 12, 1997"
   "The current version of Viper")
 
 ;; This file is part of GNU Emacs.
 
 (require 'viper-cmd)
 
+(defvar vip-always t
+  "See `viper-always'. This variable is for compatibility with older Vipers.")
+(defvar viper-always vip-always
+  "Non-nil means, arrange for vi-state to be a default when appropriate.
+This is different from `viper-mode' variable in that `viper-mode' determines
+whether to use Viper in the first place, while `viper-always', if nil, lets
+user decide when to invoke Viper in a major mode.")
 
-;; The following is provided for compatibility with older VIP's
+(defvar viper-mode (cond (noninteractive nil)
+                        (t 'ask))
+  "Viperize or not Viperize.
+If t, viperize emacs. If nil -- don't. If `ask', ask the user.
+This variable is used primatily when Viper is being loaded.
 
-(defalias 'vip-change-mode-to-vi 'vip-change-state-to-vi)
-(defalias 'vip-change-mode-to-insert 'vip-change-state-to-insert)
-(defalias 'vip-change-mode-to-emacs 'vip-change-state-to-emacs)
-   
-\f
-;;; Here we put things that may affect global emacs behavior.
-;;; This file is not loaded during compilation, so this makes 
-;;; interactive compilation of Viper safe for non-viper users.
-
-
-;; 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)
-
-;; Viper changes the default mode-line-buffer-identification
-(setq-default mode-line-buffer-identification '(" %b"))
-
-;; setup emacs-supported vi-style feel
-(setq next-line-add-newlines nil
-      require-final-newline t)
-
-(make-variable-buffer-local 'require-final-newline)
+Must be set in `~/.emacs' before Viper is loaded.
+DO NOT set this variable interactively.")
 
-;; don't bark when mark is inactive
-(setq mark-even-if-inactive t)
+\f
+;; The following are provided for compatibility with older VIP's
 
-(setq scroll-step 1)
+;;;###autoload
+(defalias 'vip-mode 'viper-mode)
 
-;; Variable displaying the current Viper state in the mode line.
-(vip-deflocalvar vip-mode-string vip-emacs-state-id)
-(or (memq 'vip-mode-string global-mode-string)
-    (setq global-mode-string
-         (append '("" vip-mode-string) (cdr global-mode-string))))
+(defalias 'vip-change-mode-to-vi 'vip-change-state-to-vi)
+(defalias 'vip-change-mode-to-insert 'vip-change-state-to-insert)
+(defalias 'vip-change-mode-to-emacs 'vip-change-state-to-emacs)
 
+\f
 
+;;;###autoload
+(defun viper-mode ()
+  "Turn on Viper emulation of Vi."
+  (interactive)
+  (if (not noninteractive)
+      (progn
+       ;; if the user requested viper-mode explicitly
+       (if viper-mode
+           ()
+         (setq viper-mode 1)
+         (load-library "viper"))
+
+       (if vip-first-time ; This check is important. Without it, startup and 
+           (progn         ; expert-level msgs mix up when viper-mode recurses
+             (setq vip-first-time nil)
+             (if (not vip-inhibit-startup-message)
+                 (save-window-excursion
+                   (setq vip-inhibit-startup-message t)
+                   (delete-other-windows)
+                   (switch-to-buffer "Viper Startup Message")
+                   (erase-buffer)
+                   (insert
+                    (substitute-command-keys
+                     "Viper Is a Package for Emacs Rebels.
+It is also a VI Plan for Emacs Rescue and a venomous VI PERil.
+
+Technically speaking, Viper is a Vi emulation package for GNU Emacs 19 and
+XEmacs 19.  It supports virtually all of Vi and Ex functionality, extending
+and improving upon much of it.
+
+   1. Viper supports Vi at several levels. Level 1 is the closest to Vi,
+      level 5 provides the most flexibility to depart from many Vi conventions.
+      
+      You will be asked to specify your user level in a following screen.
+   
+      If you select user level 1 then the keys ^X, ^C, ^Z, and ^G will behave
+      as in VI, to smooth transition to Viper for the beginners. However, to
+      use Emacs productively, you are advised to reach user level 3 or higher. 
+      
+      If your user level is 2 or higher, ^X and ^C will invoke Emacs
+      functions,as usual in Emacs; ^Z will toggle vi/emacs modes, and 
+      ^G will be the usual Emacs's keyboard-quit (something like ^C in VI).
+   
+   2. Vi exit functions (e.g., :wq, ZZ) work on INDIVIDUAL files -- they
+      do not cause Emacs to quit, except at user level 1 (a novice).
+   3. ^X^C EXITS EMACS.
+   4. Viper supports multiple undo: `u' will undo. Typing `.' will repeat
+      undo. Another `u' changes direction.
+   
+   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. 
+      
+You can get more information on Viper by:
 
+   a. Typing `:help' in Vi state
+   b. Printing Viper manual, found in ./etc/viper.dvi
+   c. Printing ViperCard, the Quick Reference, found in ./etc/viperCard.dvi
+    
+This startup message appears whenever you load Viper, unless you type `y' now."
+                     ))
+                   (goto-char (point-min))
+                   (if (y-or-n-p "Inhibit Viper startup message? ")
+                       (vip-save-setting
+                        'vip-inhibit-startup-message
+                        "Viper startup message inhibited"
+                        vip-custom-file-name t))
+                   ;;(kill-buffer (current-buffer))
+                   (message
+                    "The last message is in buffer `Viper Startup Message'")
+                   (sit-for 4)
+                   ))
+             (vip-set-expert-level 'dont-change-unless)))
+       (vip-change-state-to-vi))))
+   
 \f
-;;; Load set up hooks then load .vip
-
 ;; This hook designed to enable Vi-style editing in comint-based modes."
 (defun vip-comint-mode-hook ()
   (setq require-final-newline nil
   (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)
-
   (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 c++-mode-hook)
   (add-hook 'c++-mode-hook 'viper-mode)
-  
-  (defvar lisp-interaction-mode-hook)
-  (add-hook 'lisp-interaction-mode-hook 'viper-mode)
 
   (defvar fortran-mode-hook)
-  (add-hook 'fortran-mode-hook 'vip-mode)
+  (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 'vip-mode)
+  (add-hook 'basic-mode-hook 'viper-mode)
   (defvar bat-mode-hook)
-  (add-hook 'bat-mode-hook 'vip-mode)
+  (add-hook 'bat-mode-hook 'viper-mode)
       
   (defvar text-mode-hook)
   (add-hook 'text-mode-hook 'viper-mode)
     (vip-change-state-to-emacs))
   ) ; vip-set-hooks
 
+
+;; these are primarily advices and Vi-ish variable settings
+(defun vip-non-hook-settings ()
+
+  ;; This var is not local in Emacs, so we make it local.
+  ;; It 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)
+  
+  ;; Viper changes the default mode-line-buffer-identification
+  (setq-default mode-line-buffer-identification '(" %b"))
+  
+  ;; setup emacs-supported vi-style feel
+  (setq next-line-add-newlines nil
+       require-final-newline t)
+  
+  (make-variable-buffer-local 'require-final-newline)
+  
+  ;; don't bark when mark is inactive
+  (setq mark-even-if-inactive t)
+  
+  (setq scroll-step 1)
+  
+  ;; Variable displaying the current Viper state in the mode line.
+  (vip-deflocalvar vip-mode-string vip-emacs-state-id)
+  (or (memq 'vip-mode-string global-mode-string)
+      (setq global-mode-string
+           (append '("" vip-mode-string) (cdr global-mode-string))))
+
+  (defadvice read-key-sequence (around vip-read-keyseq-ad activate)
+    "Harness to work for Viper. This advice is harmless---don't worry!"
+    (let (inhibit-quit event keyseq)
+      (setq keyseq ad-do-it)
+      (setq event (if vip-xemacs-p
+                     (elt keyseq 0) ; XEmacs returns vector of events
+                   (elt (listify-key-sequence keyseq) 0)))
+      (if (vip-ESC-event-p event)
+         (let (unread-command-events)
+           (vip-set-unread-command-events keyseq)
+           (if (vip-fast-keysequence-p)
+               (let ((vip-vi-global-user-minor-mode  nil)
+                     (vip-vi-local-user-minor-mode  nil)
+                     (vip-replace-minor-mode nil) ; actually unnecessary
+                     (vip-insert-global-user-minor-mode  nil)
+                     (vip-insert-local-user-minor-mode  nil))
+                 (setq keyseq ad-do-it)) 
+             (setq keyseq ad-do-it))))
+      keyseq))
+  
+  (defadvice describe-key (before vip-read-keyseq-ad protect activate)
+    "Force to read key via `read-key-sequence'."
+    (interactive (list (vip-events-to-keys
+                       (read-key-sequence "Describe key: ")))))
+  
+  (defadvice describe-key-briefly (before vip-read-keyseq-ad protect activate)
+    "Force to read key via `read-key-sequence'."
+    (interactive (list (vip-events-to-keys
+                       (read-key-sequence "Describe key briefly: ")))))
+  
+  
+  ;; Advice for use in find-file and read-file-name commands.
+  (defadvice exit-minibuffer (before vip-exit-minibuffer-advice activate)
+    "Run `vip-minibuffer-exit-hook' just before exiting the minibuffer."
+    (run-hooks 'vip-minibuffer-exit-hook))
+  
+  (defadvice find-file (before vip-add-suffix-advice activate)
+    "Use `read-file-name' for reading arguments."
+    (interactive (cons (read-file-name "Find file: " nil default-directory)
+                      ;; if Mule and prefix argument, ask for coding system
+                      (if (or (boundp 'MULE)    ; mule integrated Emacs 19
+                              (featurep 'mule)) ; mule integrated XEmacs 20
+                          (list
+                           (and current-prefix-arg
+                                (read-coding-system "Coding-system: "))))
+                      )))
+  
+  (defadvice find-file-other-window (before vip-add-suffix-advice activate)
+    "Use `read-file-name' for reading arguments."
+    (interactive (cons (read-file-name "Find file in other window: "
+                                      nil default-directory)
+                      ;; if Mule and prefix argument, ask for coding system
+                      (if (or (boundp 'MULE)    ; mule integrated Emacs 19
+                              (featurep 'mule)) ; mule integrated XEmacs 20
+                          (list
+                           (and current-prefix-arg
+                                (read-coding-system "Coding-system: "))))
+                      )))
+  
+  (defadvice find-file-other-frame (before vip-add-suffix-advice activate)
+    "Use `read-file-name' for reading arguments."
+    (interactive (cons (read-file-name "Find file in other frame: "
+                                      nil default-directory)
+                      ;; if Mule and prefix argument, ask for coding system
+                      (if (or (boundp 'MULE)    ; mule integrated Emacs 19
+                              (featurep 'mule)) ; mule integrated XEmacs 20
+                          (list
+                           (and current-prefix-arg
+                                (read-coding-system "Coding-system: "))))
+                      )))
+  
+  (defadvice read-file-name (around vip-suffix-advice activate)
+    "Tell `exit-minibuffer' to run `vip-file-add-suffix' as a hook."
+    (let ((vip-minibuffer-exit-hook 'vip-file-add-suffix))
+      ad-do-it))
+  
+  (defadvice start-kbd-macro (after vip-kbd-advice activate)
+    "Remove Viper's intercepting bindings for C-x ).
+  This may be needed if the previous `:map' command terminated abnormally."
+    (define-key vip-vi-intercept-map "\C-x)" nil)
+    (define-key vip-insert-intercept-map "\C-x)" nil)
+    (define-key vip-emacs-intercept-map "\C-x)" nil))
+  
+  (cond ((vip-window-display-p)
+        (let* ((search-key (if vip-xemacs-p
+                               [(meta shift button1up)] [M-S-mouse-1]))
+               (search-key-catch
+                (if vip-xemacs-p [(meta shift button1)] [M-S-down-mouse-1]))
+               (insert-key (if vip-xemacs-p
+                               [(meta shift button2up)] [M-S-mouse-2]))
+               (insert-key-catch
+                (if vip-xemacs-p [(meta shift button2)] [M-S-down-mouse-2]))
+               (search-key-unbound (and (not (key-binding search-key))
+                                        (not (key-binding search-key-catch))))
+               (insert-key-unbound (and (not (key-binding insert-key))
+                                        (not (key-binding insert-key-catch))))
+               )
+          
+          (if search-key-unbound
+              (global-set-key search-key 'vip-mouse-click-search-word))
+          (if insert-key-unbound
+              (global-set-key insert-key 'vip-mouse-click-insert-word))
+          
+          ;; The following would be needed if you want to use the above two
+          ;; while clicking in another frame. If you only want to use them
+          ;; by clicking in another window, not frame, the bindings below
+          ;; aren't necessary.
+          
+          ;; These must be bound to mouse-down event for the same mouse
+          ;; buttons as 'vip-mouse-click-search-word and
+          ;; 'vip-mouse-click-insert-word
+          (if search-key-unbound
+              (global-set-key search-key-catch 'vip-mouse-catch-frame-switch))
+          (if insert-key-unbound
+              (global-set-key insert-key-catch 'vip-mouse-catch-frame-switch))
+          
+          (if vip-xemacs-p
+              (add-hook 'mouse-leave-frame-hook
+                        'vip-remember-current-frame)
+            (defadvice handle-switch-frame (before vip-frame-advice activate)
+              "Remember the selected frame before the switch-frame event." 
+              (vip-remember-current-frame (selected-frame))))
+          )))
+  ) ; end vip-non-hook-settings
+
 \f
-;; Defadvices
-
-(defadvice read-key-sequence (around vip-read-keyseq-ad activate)
-  "Harness to work for Viper. This advice is harmless---don't worry!"
-  (let (inhibit-quit event keyseq)
-    (setq keyseq ad-do-it)
-    (setq event (if vip-xemacs-p
-                   (elt keyseq 0) ; XEmacs returns vector of events
-                 (elt (listify-key-sequence keyseq) 0)))
-    (if (vip-ESC-event-p event)
-       (let (unread-command-events)
-         (vip-set-unread-command-events keyseq)
-         (if (vip-fast-keysequence-p)
-             (let ((vip-vi-global-user-minor-mode  nil)
-                   (vip-vi-local-user-minor-mode  nil)
-                   (vip-replace-minor-mode nil) ; actually unnecessary
-                   (vip-insert-global-user-minor-mode  nil)
-                   (vip-insert-local-user-minor-mode  nil))
-               (setq keyseq ad-do-it)) 
-           (setq keyseq ad-do-it))))
-    keyseq))
-    
-(defadvice describe-key (before vip-read-keyseq-ad protect activate)
-  "Force to read key via `read-key-sequence'."
-  (interactive (list (vip-events-to-keys
-                     (read-key-sequence "Describe key: ")))))
-
-(defadvice describe-key-briefly (before vip-read-keyseq-ad protect activate)
-  "Force to read key via `read-key-sequence'."
-  (interactive (list (vip-events-to-keys
-                     (read-key-sequence "Describe key briefly: ")))))
-
-
-;; Advice for use in find-file and read-file-name commands.
-(defadvice exit-minibuffer (before vip-exit-minibuffer-advice activate)
-  "Run `vip-minibuffer-exit-hook' just before exiting the minibuffer."
-  (run-hooks 'vip-minibuffer-exit-hook))
-
-(defadvice find-file (before vip-add-suffix-advice activate)
-  "Use `read-file-name' for reading arguments."
-  (interactive (cons (read-file-name "Find file: " nil default-directory)
-                    ;; if Mule and prefix argument, ask for coding system
-                    (if (or (boundp 'MULE)    ; mule integrated Emacs 19
-                            (featurep 'mule)) ; mule integrated XEmacs 20
-                        (list
-                         (and current-prefix-arg
-                              (read-coding-system "Coding-system: "))))
-                    )))
-    
-(defadvice find-file-other-window (before vip-add-suffix-advice activate)
-  "Use `read-file-name' for reading arguments."
-  (interactive (cons (read-file-name "Find file in other window: "
-                                    nil default-directory)
-                    ;; if Mule and prefix argument, ask for coding system
-                    (if (or (boundp 'MULE)    ; mule integrated Emacs 19
-                            (featurep 'mule)) ; mule integrated XEmacs 20
-                        (list
-                         (and current-prefix-arg
-                              (read-coding-system "Coding-system: "))))
-                    )))
-    
-(defadvice find-file-other-frame (before vip-add-suffix-advice activate)
-  "Use `read-file-name' for reading arguments."
-  (interactive (cons (read-file-name "Find file in other frame: "
-                                    nil default-directory)
-                    ;; if Mule and prefix argument, ask for coding system
-                    (if (or (boundp 'MULE)    ; mule integrated Emacs 19
-                            (featurep 'mule)) ; mule integrated XEmacs 20
-                        (list
-                         (and current-prefix-arg
-                              (read-coding-system "Coding-system: "))))
-                    )))
-
-(defadvice read-file-name (around vip-suffix-advice activate)
-  "Tell `exit-minibuffer' to run `vip-file-add-suffix' as a hook."
-  (let ((vip-minibuffer-exit-hook 'vip-file-add-suffix))
-    ad-do-it))
-
-(defadvice start-kbd-macro (after vip-kbd-advice activate)
-  "Remove Viper's intercepting bindings for C-x ).
-This may be needed if the previous `:map' command terminated abnormally."
-  (define-key vip-vi-intercept-map "\C-x)" nil)
-  (define-key vip-insert-intercept-map "\C-x)" nil)
-  (define-key vip-emacs-intercept-map "\C-x)" nil))
-
-(cond ((vip-window-display-p)
-       (let* ((search-key (if vip-xemacs-p
-                             [(meta shift button1up)] [M-S-mouse-1]))
-             (search-key-catch (if vip-xemacs-p
-                                   [(meta shift button1)] [M-S-down-mouse-1]))
-             (insert-key (if vip-xemacs-p
-                             [(meta shift button2up)] [M-S-mouse-2]))
-             (insert-key-catch (if vip-xemacs-p
-                                   [(meta shift button2)] [M-S-down-mouse-2]))
-             (search-key-unbound (and (not (key-binding search-key))
-                                      (not (key-binding search-key-catch))))
-             (insert-key-unbound (and (not (key-binding insert-key))
-                                      (not (key-binding insert-key-catch))))
-             )
-            
-        (if search-key-unbound
-            (global-set-key search-key 'vip-mouse-click-search-word))
-        (if insert-key-unbound
-            (global-set-key insert-key 'vip-mouse-click-insert-word))
-    
-        ;; The following would be needed if you want to use the above two
-        ;; while clicking in another frame. If you only want to use them
-        ;; by clicking in another window, not frame, the bindings below
-        ;; aren't necessary.
-        
-        ;; These must be bound to mouse-down event for the same mouse
-        ;; buttons as 'vip-mouse-click-search-word and
-        ;; 'vip-mouse-click-insert-word
-        (if search-key-unbound
-            (global-set-key search-key-catch   'vip-mouse-catch-frame-switch))
-        (if insert-key-unbound
-            (global-set-key insert-key-catch   'vip-mouse-catch-frame-switch))
-        
-        (if vip-xemacs-p
-            (add-hook 'mouse-leave-frame-hook
-                      'vip-remember-current-frame)
-          (defadvice handle-switch-frame (before vip-frame-advice activate)
-            "Remember the selected frame before the switch-frame event." 
-            (vip-remember-current-frame (selected-frame))))
-       )))
+(if (eq viper-mode 'ask)
+    (progn
+      (save-window-excursion
+       (with-output-to-temp-buffer " *vip-info*"
+         (princ "
+You have loaded Viper, and are about to Viperize your emacs!
+
+Viper is a Package for Emacs Rebels
+and a venomous VI PERil,
+
+It's time to decide: to Viperize or not to Viperize...
+
+If you wish to Viperize AND make this your way of life, please put 
+
+       (setq viper-mode t)
+       (require 'viper)
+
+in your .emacs file (preferably, close to the top).
+These two lines must come in the order given.
+
+Also, the startup file name has changed from .vip to .viper"))
+       (if (y-or-n-p "Viperize? ")
+           (setq viper-mode t)
+         (setq viper-mode nil))
+       (message "")
+       (kill-buffer " *vip-info*"))))
+
 
 
 \f
       
-;; Set some useful macros
-;; These must be before we load .vip, so the user could unrecord them.
-
-;; repeat the 2nd previous command without rotating the command history
-(vip-record-kbd-macro
- (vector vip-repeat-from-history-key '\1) 'vi-state
- [(meta x) v i p - r e p e a t - f r o m - h i s t o r y return] 't)
-;; repeat the 3d previous command without rotating the command history
-(vip-record-kbd-macro
- (vector vip-repeat-from-history-key '\2) 'vi-state
- [(meta x) v i p - r e p e a t - f r o m - h i s t o r y return] 't)
-;; set the toggle case sensitivity and regexp search macros
-(vip-set-vi-search-style-macros nil)
-
-;; Make %%% toggle parsing comments for matching parentheses
-(vip-record-kbd-macro
- "%%%" 'vi-state
- [(meta x) v i p - t o g g l e - p a r s e - s e x p - i g n o r e - c o m m e n t s return]
- 't)
+;; Set some useful macros, advices
+;; These must be BEFORE we ~/.vip is loaded, 
+;; so the user can unrecord them in ~/.vip.
+(if viper-mode
+    (progn
+      ;; set advices and some variables that give emacs Vi look.
+      (vip-non-hook-settings)
+
+      ;; repeat the 2nd previous command without rotating the command history
+      (vip-record-kbd-macro
+       (vector vip-repeat-from-history-key '\1) 'vi-state
+       [(meta x) v i p - r e p e a t - f r o m - h i s t o r y return] 't)
+      ;; repeat the 3d previous command without rotating the command history
+      (vip-record-kbd-macro
+       (vector vip-repeat-from-history-key '\2) 'vi-state
+       [(meta x) v i p - r e p e a t - f r o m - h i s t o r y return] 't)
+      
+      ;; set the toggle case sensitivity and regexp search macros
+      (vip-set-vi-search-style-macros nil)
+      
+      ;; Make %%% toggle parsing comments for matching parentheses
+      (vip-record-kbd-macro
+       "%%%" 'vi-state
+       [(meta x) v i p - t o g g l e - p a r s e - s e x p - i g n o r e - c o m m e n t s return]
+       't)
+      ))
  
 
 ;; ~/.vip is loaded if it exists
 (if (and (file-exists-p vip-custom-file-name)
+        viper-mode
         (not noninteractive))
     (load vip-custom-file-name))
 
@@ -754,35 +881,42 @@ This may be needed if the previous `:map' command terminated abnormally."
 ;; Save user settings or Viper defaults for vars controled by vip-expert-level
 (setq vip-saved-user-settings 
       (list (cons 'vip-want-ctl-h-help vip-want-ctl-h-help)
-           (cons 'vip-always vip-always)
+           (cons 'viper-always viper-always)
            (cons 'vip-no-multiple-ESC vip-no-multiple-ESC)
            (cons 'vip-ex-style-motion vip-ex-style-motion)
            (cons 'vip-ex-style-editing-in-insert
                                            vip-ex-style-editing-in-insert) 
            (cons 'vip-want-emacs-keys-in-vi vip-want-emacs-keys-in-vi)
+           (cons 'vip-electric-mode vip-electric-mode)
            (cons 'vip-want-emacs-keys-in-insert vip-want-emacs-keys-in-insert)
            (cons 'vip-re-search vip-re-search)))
              
 
-(vip-set-minibuffer-style)
-(if vip-buffer-search-char
-    (vip-buffer-search-enable))
-(vip-update-alphanumeric-class)
+(if viper-mode
+    (progn
+      (vip-set-minibuffer-style)
+      (if vip-buffer-search-char
+         (vip-buffer-search-enable))
+      (vip-update-alphanumeric-class)
+      ))
    
 \f
 ;;; Familiarize Viper with some minor modes that have their own keymaps
-(vip-harness-minor-mode "compile")
-(vip-harness-minor-mode "outline")
-(vip-harness-minor-mode "allout")
-(vip-harness-minor-mode "xref")
-(vip-harness-minor-mode "lmenu")
-(vip-harness-minor-mode "vc")
-(vip-harness-minor-mode "ltx-math") ; LaTeX-math-mode in AUC-TeX
-(vip-harness-minor-mode "latex")    ; which is in one of these two files
-(vip-harness-minor-mode "cyrillic")
-(vip-harness-minor-mode "russian")
-(vip-harness-minor-mode "view-less")
-(vip-harness-minor-mode "view")
+(if viper-mode
+    (progn
+      (vip-harness-minor-mode "compile")
+      (vip-harness-minor-mode "outline")
+      (vip-harness-minor-mode "allout")
+      (vip-harness-minor-mode "xref")
+      (vip-harness-minor-mode "lmenu")
+      (vip-harness-minor-mode "vc")
+      (vip-harness-minor-mode "ltx-math") ; LaTeX-math-mode in AUC-TeX
+      (vip-harness-minor-mode "latex")    ; which is in one of these two files
+      (vip-harness-minor-mode "cyrillic")
+      (vip-harness-minor-mode "russian")
+      (vip-harness-minor-mode "view-less")
+      (vip-harness-minor-mode "view")
+      ))
 
 
 ;; Intercept maps could go in viper-keym.el
@@ -801,8 +935,9 @@ This may be needed if the previous `:map' command terminated abnormally."
 (define-key vip-emacs-intercept-map vip-toggle-key 'vip-change-state-to-vi)
 
 
-(if (or vip-always 
-       (and (< vip-expert-level 5) (> vip-expert-level 0)))
+(if (and viper-mode
+        (or viper-always 
+            (and (< vip-expert-level 5) (> vip-expert-level 0))))
     (vip-set-hooks))
     
 ;; Let all minor modes take effect after loading