summaryrefslogtreecommitdiff
path: root/lisp/emulation/viper-cmd.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/emulation/viper-cmd.el')
-rw-r--r--lisp/emulation/viper-cmd.el183
1 files changed, 87 insertions, 96 deletions
diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 9033ac7ce02..d4574779412 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -74,18 +74,15 @@
;; given symbol foo, foo-p is the test function, foos is the set of
;; Viper command keys
;; (macroexpand '(viper-test-com-defun foo))
-;; (defun foo-p (com) (consp (memq (if (< com 0) (- com) com) foos)))
+;; (defun foo-p (com) (consp (memq com foos)))
(defmacro viper-test-com-defun (name)
(let* ((snm (symbol-name name))
(nm-p (intern (concat snm "-p")))
(nms (intern (concat snm "s"))))
`(defun ,nm-p (com)
- (consp (viper-memq-char
- (if (and (viper-characterp com) (< com 0))
- (- com) com)
- ,nms)
- ))))
+ (consp (viper-memq-char com ,nms)
+ ))))
;; Variables for defining VI commands
@@ -725,10 +722,8 @@ Vi's prefix argument will be used. Otherwise, the prefix argument passed to
viper-emacs-kbd-minor-mode)
(unwind-protect
(progn
- (setq com (key-binding (setq key
- (if viper-xemacs-p
- (read-key-sequence nil)
- (read-key-sequence nil t)))))
+ (setq com
+ (key-binding (setq key (viper-read-key-sequence nil))))
;; 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
@@ -797,6 +792,12 @@ Similar to viper-escape-to-emacs, but accepts forms rather than keystrokes."
(viper-set-mode-vars-for viper-current-state)
result))
+;; This executes the last kbd event in emacs mode. Is used when we want to
+;; interpret certain keys directly in emacs (as, for example, in comint mode).
+(defun viper-exec-key-in-emacs (arg)
+ (interactive "P")
+ (viper-escape-to-emacs arg last-command-event))
+
;; This is needed because minor modes sometimes override essential Viper
;; bindings. By letting Viper know which files these modes are in, it will
@@ -878,9 +879,7 @@ as a Meta key and any number of multiple escapes is allowed."
(progn
(let (minor-mode-map-alist)
(viper-set-unread-command-events event)
- (setq keyseq
- (funcall
- (ad-get-orig-definition 'read-key-sequence) nil))
+ (setq keyseq (read-key-sequence nil 'continue-echo))
) ; let
;; If keyseq translates into something that still has ESC
;; at the beginning, separate ESC from the rest of the seq.
@@ -933,8 +932,7 @@ as a Meta key and any number of multiple escapes is allowed."
;; this is escape event with nothing after it
;; put in unread-command-event and then re-read
(viper-set-unread-command-events event)
- (setq keyseq
- (funcall (ad-get-orig-definition 'read-key-sequence) nil))
+ (setq keyseq (read-key-sequence nil))
))
;; not an escape event
(setq keyseq (vector event)))
@@ -1121,7 +1119,8 @@ as a Meta key and any number of multiple escapes is allowed."
;; execute apropriate region command.
(let ((char (car com)) (com (cdr com)))
(setq prefix-arg (cons value com))
- (if (viper= char ?r) (viper-region prefix-arg)
+ (if (viper= char ?r)
+ (viper-region prefix-arg)
(viper-Region prefix-arg))
;; reset prefix-arg
(setq prefix-arg nil))
@@ -1249,9 +1248,10 @@ as a Meta key and any number of multiple escapes is allowed."
(exchange-point-and-mark))
(if (eq (preceding-char) ?\n)
(viper-backward-char-carefully)) ; give back the newline
- (if (viper= com ?c)
- (viper-change (mark t) (point))
- (viper-change-subr (mark t) (point))))
+ (if (eq viper-intermediate-command 'viper-repeat)
+ (viper-change-subr (mark t) (point))
+ (viper-change (mark t) (point))
+ ))
;; this is invoked by viper-substitute-line
(defun viper-exec-Change (m-com com)
@@ -1271,9 +1271,10 @@ as a Meta key and any number of multiple escapes is allowed."
(setq viper-use-register nil)))
(delete-region (mark t) (point)))
(open-line 1)
- (if (viper= com ?C)
- (viper-change-state-to-insert)
- (viper-yank-last-insertion)))
+ (if (eq viper-intermediate-command 'viper-repeat)
+ (viper-yank-last-insertion)
+ (viper-change-state-to-insert)
+ ))
(defun viper-exec-delete (m-com com)
(or (and (markerp viper-com-point) (marker-position viper-com-point))
@@ -1455,15 +1456,13 @@ as a Meta key and any number of multiple escapes is allowed."
;; this is the special command `#'
(if (> com 128)
(viper-special-prefix-com (- com 128))
- (let ((fn (aref viper-exec-array (if (< com 0) (- com) com))))
+ (let ((fn (aref viper-exec-array com)))
(if (null fn)
(error "%c: %s" com viper-InvalidViCommand)
(funcall fn m-com com))))
(if (viper-dotable-command-p com)
(viper-set-destructive-command
- (list m-com val
- (if (viper-memq-char com (list ?c ?C ?!)) (- com) com)
- reg nil nil)))
+ (list m-com val com reg nil nil)))
))
@@ -1889,8 +1888,7 @@ Undo previous insertion and inserts new."
(if (fboundp 'minibuffer-prompt-end)
(delete-region (minibuffer-prompt-end) (point-max))
(erase-buffer))
- (insert initial)))
- (viper-minibuffer-setup-sentinel))
+ (insert initial))))
(defsubst viper-minibuffer-real-start ()
(if (fboundp 'minibuffer-prompt-end)
@@ -1994,7 +1992,16 @@ problems."
;; KEYMAP is used, if given, instead of minibuffer-local-map.
;; INIT-MESSAGE is the message temporarily displayed after entering the
;; minibuffer.
- (let ((minibuffer-setup-hook 'viper-minibuffer-standard-hook)
+ (let ((minibuffer-setup-hook
+ ;; stolen from add-hook
+ (let ((old
+ (if (boundp 'minibuffer-setup-hook)
+ minibuffer-setup-hook
+ nil)))
+ (cons
+ 'viper-minibuffer-standard-hook
+ (if (or (not (listp old)) (eq (car old) 'lambda))
+ (list old) old))))
(val "")
(padding "")
temp-msg)
@@ -2059,7 +2066,7 @@ problems."
(let ((val (viper-p-val arg))
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-insert val ?r nil nil nil))
- (if com
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val (viper-yank-last-insertion))
(viper-change-state-to-insert))))
@@ -2071,7 +2078,7 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-append val ?r nil nil nil))
(if (not (eolp)) (forward-char))
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val (viper-yank-last-insertion))
(viper-change-state-to-insert))))
@@ -2083,7 +2090,7 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-Append val ?r nil nil nil))
(end-of-line)
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val (viper-yank-last-insertion))
(viper-change-state-to-insert))))
@@ -2095,7 +2102,7 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-Insert val ?r nil nil nil))
(back-to-indentation)
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val (viper-yank-last-insertion))
(viper-change-state-to-insert))))
@@ -2107,26 +2114,15 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-open-line val ?r nil nil nil))
(let ((col (current-indentation)))
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val
(end-of-line)
(newline 1)
- (if viper-auto-indent
- (progn
- (setq viper-cted t)
- (if viper-electric-mode
- (indent-according-to-mode)
- (indent-to col))
- ))
+ (viper-indent-line col)
(viper-yank-last-insertion))
(end-of-line)
(newline 1)
- (if viper-auto-indent
- (progn
- (setq viper-cted t)
- (if viper-electric-mode
- (indent-according-to-mode)
- (indent-to col))))
+ (viper-indent-line col)
(viper-change-state-to-insert)))))
(defun viper-Open-line (arg)
@@ -2137,27 +2133,15 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command (list 'viper-Open-line val ?r nil nil nil))
(let ((col (current-indentation)))
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val
(beginning-of-line)
(open-line 1)
- (if viper-auto-indent
- (progn
- (setq viper-cted t)
- (if viper-electric-mode
- (indent-according-to-mode)
- (indent-to col))
- ))
+ (viper-indent-line col)
(viper-yank-last-insertion))
(beginning-of-line)
(open-line 1)
- (if viper-auto-indent
- (progn
- (setq viper-cted t)
- (if viper-electric-mode
- (indent-according-to-mode)
- (indent-to col))
- ))
+ (viper-indent-line col)
(viper-change-state-to-insert)))))
(defun viper-open-line-at-point (arg)
@@ -2168,13 +2152,14 @@ problems."
(com (viper-getcom arg)))
(viper-set-destructive-command
(list 'viper-open-line-at-point val ?r nil nil nil))
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-loop val
(open-line 1)
(viper-yank-last-insertion))
(open-line 1)
(viper-change-state-to-insert))))
+;; bound to s
(defun viper-substitute (arg)
"Substitute characters."
(interactive "P")
@@ -2182,9 +2167,10 @@ problems."
(com (viper-getcom arg)))
(push-mark nil t)
(forward-char val)
- (if (viper= com ?r)
+ (if (eq viper-intermediate-command 'viper-repeat)
(viper-change-subr (mark t) (point))
(viper-change (mark t) (point)))
+ ;; com is set to ?r when we repeat this comand with dot
(viper-set-destructive-command (list 'viper-substitute val ?r nil nil nil))
))
@@ -2356,7 +2342,7 @@ These keys are ESC, RET, and LineFeed"
(if (eq this-command 'viper-intercept-ESC-key)
(setq com 'viper-exit-insert-state)
(viper-set-unread-command-events last-input-char)
- (setq com (key-binding (read-key-sequence nil))))
+ (setq com (key-binding (viper-read-key-sequence nil))))
(condition-case conds
(command-execute com)
@@ -2405,11 +2391,11 @@ These keys are ESC, RET, and LineFeed"
(let ((val (viper-p-val arg))
(com (viper-getcom arg)) (len))
(viper-set-destructive-command (list 'viper-overwrite val ?r nil nil nil))
- (if com
+ (if (eq viper-intermediate-command 'viper-repeat)
(progn
;; Viper saves inserted text in viper-last-insertion
(setq len (length viper-last-insertion))
- (delete-char len)
+ (delete-char (min len (- (point-max) (point) 1)))
(viper-loop val (viper-yank-last-insertion)))
(setq last-command 'viper-overwrite)
(viper-set-complex-command-for-undo)
@@ -2476,7 +2462,7 @@ These keys are ESC, RET, and LineFeed"
(defun viper-replace-char-subr (com arg)
(let (char)
- (setq char (if (viper= com ?r)
+ (setq char (if (eq viper-intermediate-command 'viper-repeat)
viper-d-char
(read-char)))
(let (inhibit-quit) ; preserve consistency of undo-list and iso-accents
@@ -2694,15 +2680,17 @@ On reaching beginning of line, stop and signal error."
(com (viper-getcom arg)))
(if com (viper-move-marker-locally 'viper-com-point (point)))
(viper-forward-word-kernel val)
- (if com (progn
- (cond ((viper-memq-char com (list ?c (- ?c)))
- (viper-separator-skipback-special 'twice viper-com-point))
- ;; Yank words including the whitespace, but not newline
- ((viper-memq-char com (list ?y (- ?y)))
- (viper-separator-skipback-special nil viper-com-point))
- ((viper-dotable-command-p com)
- (viper-separator-skipback-special nil viper-com-point)))
- (viper-execute-com 'viper-forward-word val com)))))
+ (if com
+ (progn
+ (cond ((viper-char-equal com ?c)
+ (viper-separator-skipback-special 'twice viper-com-point))
+ ;; Yank words including the whitespace, but not newline
+ ((viper-char-equal com ?y)
+ (viper-separator-skipback-special nil viper-com-point))
+ ((viper-dotable-command-p com)
+ (viper-separator-skipback-special nil viper-com-point)))
+ (viper-execute-com 'viper-forward-word val com)))
+ ))
(defun viper-forward-Word (arg)
@@ -2716,10 +2704,10 @@ On reaching beginning of line, stop and signal error."
(viper-skip-nonseparators 'forward)
(viper-skip-separators t))
(if com (progn
- (cond ((viper-memq-char com (list ?c (- ?c)))
+ (cond ((viper-char-equal com ?c)
(viper-separator-skipback-special 'twice viper-com-point))
;; Yank words including the whitespace, but not newline
- ((viper-memq-char com (list ?y (- ?y)))
+ ((viper-char-equal com ?y)
(viper-separator-skipback-special nil viper-com-point))
((viper-dotable-command-p com)
(viper-separator-skipback-special nil viper-com-point)))
@@ -4234,7 +4222,7 @@ and regexp replace."
(interactive)
(let ((char (read-char)))
(cond ((and (<= ?a char) (<= char ?z))
- (point-to-register (1+ (- char ?a))))
+ (point-to-register (viper-int-to-char (1+ (- char ?a)))))
((viper= char ?<) (viper-mark-beginning-of-buffer))
((viper= char ?>) (viper-mark-end-of-buffer))
((viper= char ?.) (viper-set-mark-if-necessary))
@@ -4304,7 +4292,7 @@ One can use `` and '' to temporarily jump 1 step back."
(backward-char 1)))
(cond ((viper-valid-register char '(letter))
(let* ((buff (current-buffer))
- (reg (1+ (- char ?a)))
+ (reg (viper-int-to-char (1+ (- char ?a))))
(text-marker (get-register reg)))
;; If marker points to file that had markers set (and those markers
;; were saved (as e.g., in session.el), then restore those markers
@@ -4410,6 +4398,19 @@ One can use `` and '' to temporarily jump 1 step back."
(if (or (bolp) (viper-looking-back "[^ \t]"))
(setq viper-cted nil)))))
+;; do smart indent
+(defun viper-indent-line (col)
+ (if viper-auto-indent
+ (progn
+ (setq viper-cted t)
+ (if (and viper-electric-mode
+ (not (memq major-mode '(fundamental-mode
+ text-mode
+ paragraph-indent-text-mode))))
+ (indent-according-to-mode)
+ (indent-to col)))))
+
+
(defun viper-autoindent ()
"Auto Indentation, Vi-style."
(interactive)
@@ -4427,17 +4428,7 @@ One can use `` and '' to temporarily jump 1 step back."
;; use \n instead of newline, or else <Return> will move the insert point
;;(newline 1)
(insert "\n")
- (if viper-auto-indent
- (progn
- (setq viper-cted t)
- (if (and viper-electric-mode
- (not
- (memq major-mode '(fundamental-mode
- text-mode
- paragraph-indent-text-mode ))))
- (indent-according-to-mode)
- (indent-to viper-current-indent))
- ))
+ (viper-indent-line viper-current-indent)
))
@@ -4469,7 +4460,7 @@ One can use `` and '' to temporarily jump 1 step back."
((viper= ?\] reg)
(viper-heading-end arg))
((viper-valid-register reg '(letter))
- (let* ((val (get-register (1+ (- reg ?a))))
+ (let* ((val (get-register (viper-int-to-char (1+ (- reg ?a)))))
(buf (if (not (markerp val))
(error viper-EmptyTextmarker reg)
(marker-buffer val)))
@@ -4699,17 +4690,17 @@ Please, specify your level now: ")
(if (and enforce-buffer
(not (equal (current-buffer) (marker-buffer val))))
(error (concat viper-EmptyTextmarker " in this buffer")
- (1- (+ char ?a))))
+ (viper-int-to-char (1- (+ char ?a)))))
(pop-to-buffer (marker-buffer val))
(goto-char val))
((and (consp val) (eq (car val) 'file))
(find-file (cdr val)))
(t
- (error viper-EmptyTextmarker (1- (+ char ?a)))))))
+ (error viper-EmptyTextmarker (viper-int-to-char (1- (+ char ?a))))))))
(defun viper-save-kill-buffer ()
- "Save then kill current buffer. "
+ "Save then kill current buffer."
(interactive)
(if (< viper-expert-level 2)
(save-buffers-kill-emacs)