Mercurial > emacs
changeset 3519:093c4dc7e884
(vip-ctl-key-equivalent): Use vip-escape-to-emacs.
(vip-escape-to-emacs): Use read-key-sequence and key-binding.
Arg EVENTS replaces arg CHAR.
(vip-ESC, vip-ctl-c, vip-ctl-x, vip-ctl-h): These callers changed.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 06 Jun 1993 07:16:19 +0000 |
parents | 2a9fb3c334ab |
children | dcc5e8a8417c |
files | lisp/emulation/vip.el |
diffstat | 1 files changed, 17 insertions(+), 78 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emulation/vip.el Sun Jun 06 06:47:47 1993 +0000 +++ b/lisp/emulation/vip.el Sun Jun 06 07:16:19 1993 +0000 @@ -169,8 +169,7 @@ ;; changing mode (defun vip-change-mode (new-mode) - "Change mode to NEW-MODE. NEW-MODE is either emacs-mode, vi-mode, -or insert-mode." + "Change mode to NEW-MODE---either emacs-mode, vi-mode, or insert-mode." (or (eq new-mode vip-current-mode) (progn (cond ((eq new-mode 'vi-mode) @@ -278,74 +277,19 @@ ;; escape to emacs mode temporarily -(defun vip-get-editor-command (l-map g-map &optional str) - "Read characters from keyboard until an editor command is formed, using -local keymap L-MAP and global keymap G-MAP. If the command is a -self-insert-command, the character just read is returned instead. Optional -string STR is used as initial input string." - (let (char l-bind g-bind) - (setq char - (if (or (null str) (string= str "")) - (read-char) - (string-to-char str))) - (setq last-command-char char) - (setq l-bind (vip-binding-of char l-map)) - (if (null l-bind) - ;; since local binding is empty, we concentrate on global one. - (progn - (setq g-bind (vip-binding-of char g-map)) - (if (null g-bind) - nil ;; return nil, since both bindings are void. - (if (keymapp g-bind) - (vip-get-editor-command nil g-bind (vip-string-tail str)) - (if (eq g-bind 'self-insert-command) char g-bind)))) - ;; local binding is nonvoid - (if (keymapp l-bind) - ;; since l-bind is a keymap, we consider g-bind as well. - (progn - (setq g-bind (vip-binding-of char g-map)) - (if (null g-bind) - (vip-get-editor-command l-bind nil (vip-string-tail str)) - (if (keymapp g-bind) - ;; both bindings are keymap - (vip-get-editor-command l-bind g-bind (vip-string-tail str)) - ;; l-bind is a keymap, so we neglect g-bind - (vip-get-editor-command l-bind nil (vip-string-tail str))))) - ;; l-bind is a command - (if (eq l-bind 'self-insert-command) char l-bind))))) - -(defun vip-binding-of (char map) - "Return key-binding of CHAR under keymap MAP. It is nil if the binding -is void, or a command, or a keymap" - (let ((val (if (listp map) - (cdr (assq char map)) - (aref map char)))) - (cond ((null val) nil) - ((keymapp val) - (if (symbolp val) (symbol-function val) val)) - (t - ;; otherwise, it is a function which is either a real function or - ;; a keymap fset to val. - (let ((fun (symbol-function val))) - (if (or (null fun) (keymapp fun)) fun val)))))) - -(defun vip-escape-to-emacs (arg &optional char) - "Escape to emacs mode and execute one emacs command and then return to -vi mode. ARG is used as the prefix value for the executed command. If -CHAR is given it becomes the first character of the command." +(defun vip-escape-to-emacs (arg &optional events) + "Escape to Emacs mode for one Emacs 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") - (let (com (buff (current-buffer)) (first t)) - (if char (setq unread-command-events (list char))) + (let (com key (old-map (current-local-map))) + (if events (setq unread-command-events events)) (setq prefix-arg arg) - (while (or first unread-command-events) - ;; this while loop is executed until unread command char will be - ;; exhausted. - (setq first nil) - (setq com (vip-get-editor-command vip-emacs-local-map global-map)) - (if (numberp com) - (vip-loop (vip-p-val prefix-arg) - (insert (char-to-string com))) - (command-execute com prefix-arg))) + (use-local-map vip-emacs-local-map) + (unwind-protect + (setq com (key-binding (setq key (read-key-sequence nil)))) + (use-local-map old-map)) + (command-execute com prefix-arg) (setq prefix-arg nil) ;; reset prefix arg )) @@ -360,22 +304,22 @@ (defun vip-ESC (arg) "Emulate ESC key in Emacs mode." (interactive "P") - (vip-escape-to-emacs arg ?\e)) + (vip-escape-to-emacs arg '(?\e))) (defun vip-ctl-c (arg) "Emulate C-c key in Emacs mode." (interactive "P") - (vip-escape-to-emacs arg ?\C-c)) + (vip-escape-to-emacs arg '(?\C-c))) (defun vip-ctl-x (arg) "Emulate C-x key in Emacs mode." (interactive "P") - (vip-escape-to-emacs arg ?\C-x)) + (vip-escape-to-emacs arg '(?\C-x))) (defun vip-ctl-h (arg) "Emulate C-h key in Emacs mode." (interactive "P") - (vip-escape-to-emacs arg ?\C-h)) + (vip-escape-to-emacs arg '(?\C-h))) ;; prefix argmument for vi mode @@ -1881,12 +1825,7 @@ (let ((char (read-char))) (if (and (<= ?A char) (<= char ?Z)) (setq char (- char (- ?A ?\C-a)))) - (setq prefix-arg arg) - (command-execute - (vip-get-editor-command - vip-emacs-local-map global-map - (format "%s%s" key (char-to-string char)))))) - + (vip-escape-to-emacs arg (list (aref key 0) char)))) ;; commands in insertion mode