Sat Jan 20 01:41:56 1996 Michael Kifer <kifer@sbkifer>

* viper.el (vip-auto-indent,vip-electric-mode): are now local
	variables.
	(vip-open-line,vip-Open-line,vip-autoindent):
	are now electrified functions.
	(vip-set-hooks): viperized awk, ksh, makefile, and html-helper modes.
	(vip-custom-file-name): adapted to non-Unix systems.
	(vip-move-minibuffer-overlay): removed.
	(vip-read-string-with-history):
	now accepts correct defaults when called to
	read a shell command.
This commit is contained in:
Michael Kifer 1996-01-20 03:10:57 +00:00
parent 717e06e505
commit 151496c02b

View file

@ -1,16 +1,16 @@
;;; viper.el --- A full-featured Vi emulator.
;;; viper.el --- A full-featured Vi emulator for GNU Emacs 19 and XEmacs 19,
;; a VI Plan for Emacs Rescue,
;; and a venomous VI PERil.
;; Viper Is also a Package for Emacs Rebels.
;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
;;
;; Keywords: emulations
;; Author: Michael Kifer <kifer@cs.sunysb.edu>
(defconst viper-version "2.82 of October 12, 1995"
(defconst viper-version "2.85 of January 15, 1996"
"The current version of Viper")
;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
@ -24,9 +24,8 @@
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;;; Commentary:
@ -372,7 +371,7 @@ designated buffers.")
(vip-deflocalvar vip-insert-diehard-minor-mode nil
"Minor mode that simulates Vi very closely.
Not recommended, except for the novice user.")
Not recommened, except for the novice user.")
(vip-deflocalvar vip-insert-kbd-minor-mode nil
"Minor mode for Ex command macros Insert state.
@ -470,8 +469,8 @@ it better fits your working style.")
(if (vip-window-display-p)
(progn
(add-to-list 'facemenu-unlisted-faces 'vip-replace-overlay-face)
(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")
@ -591,8 +590,11 @@ bound to delete-backward-char.")
;; Whether to preserve the indent, used by C-d in insert mode.
(vip-deflocalvar vip-preserve-indent nil)
(defconst vip-auto-indent nil
(vip-deflocalvar vip-auto-indent nil
"*Autoindent if t.")
(vip-deflocalvar vip-electric-mode t
"*If t, enable electric behavior.
Currently only enables auto-indentation `according to mode'.")
(defconst vip-shift-width 8
"*The shiftwidth variable.")
@ -616,7 +618,7 @@ to a new place after repeating previous Vi command.")
;; The reason this is needed is because dabbrev-expand (and possibly
;; others) may jump to before the insertion point, delete something and
;; then reinsert a bigger piece. For instance: bla^blo
;; If dabbrev-expand is called after `blo' and ^ indicates vip-insert-point,
;; If dabbrev-expand is called after `blo' and ^ undicates vip-insert-point,
;; then point jumps to the beginning of `blo'. If expansion is found, `blablo'
;; is deleted, and we have |^, where | denotes point. Next, dabbrev-expand
;; will insert the expansion, and we get: blablo^
@ -808,7 +810,14 @@ 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 ((memq system-type '(vax-vms axp-vms))
"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.")
@ -938,7 +947,7 @@ Should be set in `~/.vip' file.")
(defun vip-change-state (new-state)
;; Keep vip-post/pre-command-hooks fresh.
;; We remove then add vip-post/pre-command-sentinel since it is very
;; desirable that no one gets in-between
;; desirable that noone gets in-between
(remove-hook 'post-command-hook 'vip-post-command-sentinel)
(add-hook 'post-command-hook 'vip-post-command-sentinel)
(remove-hook 'pre-command-hook 'vip-pre-command-sentinel)
@ -1362,7 +1371,7 @@ This startup message appears whenever you load Viper, unless you type `y' now."
(error
(vip-message-conditions conds))))
;; escape to emacs mode temporarily
;; escape to emacs mode termporarily
(defun vip-escape-to-emacs (arg &optional events)
"Escape to Emacs state from Vi state for one Emacs command.
ARG is used as the prefix value for the executed command. If
@ -1370,7 +1379,7 @@ EVENTS is a list of events, which become the beginning of the command."
(interactive "P")
(vip-escape-to-state arg events 'emacs-state))
;; escape to Vi mode temporarily
;; escape to Vi mode termporarily
(defun vip-escape-to-vi ()
"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
@ -1464,7 +1473,7 @@ Suffixes such as .el or .elc should be stripped."
(vip-eval-after-load
load-file '(setq-default minor-mode-map-alist minor-mode-map-alist))
)
(defun vip-ESC (arg)
"Emulate ESC key in Emacs.
@ -1701,7 +1710,7 @@ behaves as in Emacs, any number of multiple escapes is allowed."
)
;; as com is non-nil, this means that we have a command to execute
(if (memq (car com) '(?r ?R))
;; execute appropriate region command.
;; execute apropriate region command.
(let ((char (car com)) (com (cdr com)))
(setq prefix-arg (cons value com))
(if (= char ?r) (vip-region prefix-arg)
@ -2067,10 +2076,11 @@ invokes the command before that, etc."
(vip-d-com vip-d-com))
(or (and (numberp num) (<= 0 num) (<= num 9))
(setq idx 0
num 0)
(message
"`vip-repeat-from-history' must be invoked as a Vi macro bound to `<key><digit>'"))
(progn
(setq idx 0
num 0)
(message
"`vip-repeat-from-history' must be invoked as a Vi macro bound to `<key><digit>'")))
(while (< 0 num)
(setq vip-d-com (vip-special-ring-rotate1 vip-command-ring -1))
(setq num (1- num)))
@ -2369,10 +2379,6 @@ Undo previous insertion and inserts new."
'vip-change-state-to-insert
'vip-change-state-to-emacs)))
(funcall hook)
;; Make sure the minibuffer overlay is kept up-to-date. In XEmacs also
;; guards against the possibility of detaching this overlay.
(vip-add-hook 'vip-post-command-hooks 'vip-move-minibuffer-overlay)
))
;; Interpret last event in the local map
@ -2390,8 +2396,8 @@ Undo previous insertion and inserts new."
()
(defvar vip-search-face
(progn
(add-to-list 'facemenu-unlisted-faces 'vip-search-face)
(make-face 'vip-search-face)
(vip-hide-face 'vip-search-face)
(or (face-differs-from-default-p 'vip-search-face)
;; face wasn't set in .vip or .Xdefaults
(if (vip-can-use-colors "Black" "khaki")
@ -2410,8 +2416,8 @@ Undo previous insertion and inserts new."
()
(defvar vip-minibuffer-emacs-face
(progn
(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-emacs-face)
(make-face 'vip-minibuffer-emacs-face)
(vip-hide-face 'vip-minibuffer-emacs-face)
(or (face-differs-from-default-p 'vip-minibuffer-emacs-face)
;; face wasn't set in .vip or .Xdefaults
(if vip-vi-style-in-minibuffer
@ -2436,8 +2442,8 @@ Undo previous insertion and inserts new."
(defvar vip-minibuffer-insert-face
(progn
(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-insert-face)
(make-face 'vip-minibuffer-insert-face)
(vip-hide-face 'vip-minibuffer-insert-face)
(or (face-differs-from-default-p 'vip-minibuffer-insert-face)
(if vip-vi-style-in-minibuffer
(if (vip-can-use-colors "Black" "pink")
@ -2460,8 +2466,8 @@ Undo previous insertion and inserts new."
(defvar vip-minibuffer-vi-face
(progn
(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-vi-face)
(make-face 'vip-minibuffer-vi-face)
(vip-hide-face 'vip-minibuffer-vi-face)
(or (face-differs-from-default-p 'vip-minibuffer-vi-face)
(if vip-vi-style-in-minibuffer
(if (vip-can-use-colors "Black" "grey")
@ -2484,9 +2490,9 @@ Undo previous insertion and inserts new."
(defun vip-read-string-with-history (prompt &optional initial
history-var default keymap)
;; Reads string, prompting with PROMPT and inserting the INITIAL
;; Read string, prompting with PROMPT and inserting the INITIAL
;; value. Uses HISTORY-VAR. DEFAULT is the default value to accept if the
;; input is an empty string. Uses KEYMAP, if given, or the
;; input is an empty string. Use KEYMAP, if given, or the
;; minibuffer-local-map.
;; Default value is displayed until the user types something in the
;; minibuffer.
@ -2524,13 +2530,17 @@ Undo previous insertion and inserts new."
(if (or (string= (nth 0 (eval history-var)) (nth 1 (eval history-var)))
(string= (nth 0 (eval history-var)) ""))
(set history-var (cdr (eval history-var))))
;; if the user enters nothing but the prev cmd wasn't vip-ex or
;; vip-command-argument, this means that the user typed something then
;; erased. Return "" in this case, not the default---default is too
;; confusing in this case
;; If the user enters nothing but the prev cmd wasn't vip-ex,
;; vip-command-argument, or `! shell-command', this probably means
;; that the user typed something then erased. Return "" in this case, not
;; the default---the default is too confusing in this case.
(cond ((and (string= val "")
(not (string= prompt "!")) ; was a `! shell-command'
(not (memq last-command
(list 'vip-ex 'vip-command-argument t))))
'(vip-ex
vip-command-argument
t)
)))
"")
((string= val "") (or default ""))
(t val))
@ -2615,11 +2625,22 @@ Undo previous insertion and inserts new."
(end-of-line)
(newline 1)
(if vip-auto-indent
(progn (setq vip-cted t) (indent-to col)))
(progn
(setq vip-cted t)
(if vip-electric-mode
(indent-according-to-mode)
(indent-to col))
))
(vip-yank-last-insertion)))
(end-of-line)
(newline 1)
(if vip-auto-indent (progn (setq vip-cted t) (indent-to col)))
(if vip-auto-indent
(progn
(setq vip-cted t)
(if vip-electric-mode
(indent-according-to-mode)
(indent-to col))
))
(vip-change-state-to-insert)
))))
@ -2637,11 +2658,22 @@ Undo previous insertion and inserts new."
(beginning-of-line)
(open-line 1)
(if vip-auto-indent
(progn (setq vip-cted t) (indent-to col)))
(progn
(setq vip-cted t)
(if vip-electric-mode
(indent-according-to-mode)
(indent-to col))
))
(vip-yank-last-insertion)))
(beginning-of-line)
(open-line 1)
(if vip-auto-indent (progn (setq vip-cted t) (indent-to col)))
(if vip-auto-indent
(progn
(setq vip-cted t)
(if vip-electric-mode
(indent-according-to-mode)
(indent-to col))
))
(vip-change-state-to-insert)))))
(defun vip-open-line-at-point (arg)
@ -2832,8 +2864,8 @@ Undo previous insertion and inserts new."
;; deleting an equal amount of characters.
;;
;; The reason why new-dabbrev.el causes this are this:
;; if one dynamically completes a partial word that starts before the
;; replacement region (but ends inside)then new-dabbrev.el first
;; if one dinamically completes a partial word that starts before the
;; replacement region (but ends inside) then new-dabbrev.el first
;; moves cursor backwards, to the beginning of the word to be
;; completed (say, pt A). Then it inserts the
;; completed word and then deletes the old, incomplete part.
@ -2842,9 +2874,7 @@ Undo previous insertion and inserts new."
;; unless we check for the current command, which must be
;; dabbrev-expand.
;;
;; We should be able deal with these problems in a better way
;; when emacs will have overlays with sticky back ends.
;; In fact, it would be also useful to add overlays for insert
;; In fact, it might be also useful to have overlays for insert
;; regions as well, since this will let us capture the situation when
;; dabbrev-expand goes back past the insertion point to find the
;; beginning of the word to be expanded.
@ -3887,7 +3917,7 @@ Although this function is bound to \\[vip-toggle-search-style], the most
convenient way to use it is to bind `//' to the macro
`1 M-x vip-toggle-search-style' and `///' to
`2 M-x vip-toggle-search-style'. In this way, hitting `//' quickly will
toggle case-fold-search and hitting `/' three times with toggle regexp
toggle case-fold-search and hitting `/' three times witth toggle regexp
search. Macros are more convenient in this case because they don't affect
the Emacs binding of `/'."
(interactive "P")
@ -4073,7 +4103,7 @@ Null string will repeat previous search."
(aset vip-exec-array vip-buffer-search-char 'vip-exec-buffer-search)
(setq vip-prefix-commands (cons vip-buffer-search-char vip-prefix-commands)))
;; This is a Viper wrapper for isearch-forward.
;; This is a Viper wraper for isearch-forward.
(defun vip-isearch-forward (arg)
"Do incremental search forward."
(interactive "P")
@ -4081,7 +4111,7 @@ Null string will repeat previous search."
(if (listp arg) (setq arg (car arg)))
(vip-exec-form-in-emacs (list 'isearch-forward arg)))
;; This is a Viper wrapper for isearch-backward."
;; This is a Viper wraper for isearch-backward."
(defun vip-isearch-backward (arg)
"Do incremental search backward."
(interactive "P")
@ -4389,7 +4419,7 @@ To turn this feature off, set this variable to nil.")
(defun vip-del-backward-char-in-replace ()
"Delete one character in replace mode.
If `vip-delete-backwards-in-replace' is t, then DEL key actually deletes
characters. If it is nil, then the cursor just moves backwards, similarly
charecters. If it is nil, then the cursor just moves backwards, similarly
to Vi. The variable `vip-ex-style-editing-in-insert', if t, doesn't let the
cursor move past the beginning of line."
(interactive)
@ -4517,7 +4547,7 @@ cursor move past the beginning of line."
(defun vip-query-replace ()
"Query replace.
If a null string is supplied as the string to be replaced,
If a null string is suplied as the string to be replaced,
the query replace mode will toggle between string replace
and regexp replace."
(interactive)
@ -4717,7 +4747,8 @@ One can use `` and '' to temporarily jump 1 step back."
(let ((p (point)) (c (current-column)) bol (indent t))
(if (vip-looking-back "[0^]")
(progn
(if (= ?^ (preceding-char)) (setq vip-preserve-indent t))
(if (eq ?^ (preceding-char))
(setq vip-preserve-indent t))
(delete-backward-char 1)
(setq p (point))
(setq indent nil)))
@ -4735,9 +4766,9 @@ One can use `` and '' to temporarily jump 1 step back."
"Auto Indentation, Vi-style."
(interactive)
(let ((col (current-indentation)))
(if (not vip-preserve-indent)
(setq vip-current-indent col)
(setq vip-preserve-indent nil))
(if vip-preserve-indent
(setq vip-preserve-indent nil)
(setq vip-current-indent col))
;; don't leave whitespace lines around
(if (memq last-command
'(vip-autoindent
@ -4748,7 +4779,11 @@ One can use `` and '' to temporarily jump 1 step back."
(if vip-auto-indent
(progn
(setq vip-cted t)
(indent-to vip-current-indent)))))
(if vip-electric-mode
(indent-according-to-mode)
(indent-to vip-current-indent))
))
))
;; Viewing registers
@ -4884,7 +4919,7 @@ sensitive for VI-style look-and-feel."
(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))
(if (eq vip-expert-level 4) ; respect user's ex-style motions
; and vip-no-multiple-ESC
(progn
@ -5320,14 +5355,22 @@ Mail anyway (y or n)? ")
"Run `vip-change-state-to-vi' on entry."
(vip-change-state-to-vi))
(defvar makefile-mode-hook nil)
(add-hook 'makefile-mode-hook 'viper-mode)
(defvar help-mode-hook nil)
(add-hook 'help-mode-hook 'viper-mode)
(defvar emacs-lisp-mode-hook nil)
(add-hook 'emacs-lisp-mode-hook 'viper-mode)
(defvar awk-mode-hook nil)
(add-hook 'awk-mode-hook 'viper-mode)
(defvar html-mode-hook nil)
(add-hook 'html-mode-hook 'viper-mode)
(defvar html-helper-mode-hook nil)
(add-hook 'html-helper-mode-hook 'viper-mode)
(defvar emacs-lisp-mode-hook nil)
(add-hook 'emacs-lisp-mode-hook 'viper-mode)
(defvar lisp-mode-hook nil)
(add-hook 'lisp-mode-hook 'viper-mode)
@ -5352,6 +5395,8 @@ Mail anyway (y or n)? ")
(add-hook 'completion-list-mode-hook 'viper-mode)
(add-hook 'compilation-mode-hook 'viper-mode)
(add-hook 'perl-mode-hook 'viper-mode)
(defvar emerge-startup-hook nil)
(add-hook 'emerge-startup-hook 'vip-change-state-to-emacs)
@ -5379,6 +5424,12 @@ Mail anyway (y or n)? ")
'(defadvice read-passwd-1 (before vip-passwd-ad activate)
"Switch to emacs state while reading password."
(vip-change-state-to-emacs)))
(vip-eval-after-load
"prolog"
'(defadvice prolog-mode (after vip-prolog-ad activate)
"Switch to Vi state in Prolog mode."
(vip-change-state-to-vi)))
;; Emacs shell, ange-ftp, and comint-based modes
(defvar comint-mode-hook nil)
@ -5388,6 +5439,8 @@ Mail anyway (y or n)? ")
;; Shell scripts
(defvar sh-mode-hook nil)
(add-hook 'sh-mode-hook 'viper-mode)
(defvar ksh-mode-hook nil)
(add-hook 'ksh-mode-hook 'viper-mode)
;; Dired
;; This is only necessary when the user uses vip-modify-major-mode
@ -5443,7 +5496,7 @@ Mail anyway (y or n)? ")
(vip-record-kbd-macro
"//" 'vi-state
[1 (meta x) v i p - t o g g l e - s e a r c h - s t y l e return] 't)
;; toggle regexp/vanilla search
;; toggle regexp/vanila search
(vip-record-kbd-macro
"///" 'vi-state
[2 (meta x) v i p - t o g g l e - s e a r c h - s t y l e return] 't)
@ -5461,7 +5514,7 @@ Mail anyway (y or n)? ")
;; Applying Viper customization -- runs after (load .vip)
;; Save user settings or Viper defaults for vars controlled by vip-expert-level
;; 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)
@ -5493,6 +5546,7 @@ Mail anyway (y or n)? ")
(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