;; 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.
;;; 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.
(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.
"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
;; 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
(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.")
"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)
(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
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.
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)
;; 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
(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."
(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))
(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>
;; 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)))
(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 ?\"
(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.
((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)
"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."
(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.")
))
(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."
(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
(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
(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)
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
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))
(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))
;; 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 ()
(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 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)
;; 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
(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)
(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)
;; 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)