52 |
|
|
53 |
(defvar viper-toggle-key "\C-z" |
(defvar viper-toggle-key "\C-z" |
54 |
"The key used to change states from emacs to Vi and back. |
"The key used to change states from emacs to Vi and back. |
55 |
In insert mode, this key also functions as Meta. |
In insert mode, this key also functions as Meta. |
56 |
Must be set in .viper file or prior to loading Viper. |
Must be set in .viper file or prior to loading Viper. |
57 |
This setting cannot be changed interactively.") |
This setting cannot be changed interactively.") |
58 |
|
|
59 |
(defvar viper-ESC-key "\e" |
(defvar viper-ESC-key "\e" |
60 |
"Key used to ESC. |
"Key used to ESC. |
61 |
Must be set in .viper file or prior to loading Viper. |
Must be set in .viper file or prior to loading Viper. |
62 |
This setting cannot be changed interactively.") |
This setting cannot be changed interactively.") |
63 |
|
|
64 |
;;; Emacs keys in other states. |
;;; Emacs keys in other states. |
65 |
|
|
66 |
(defcustom viper-want-emacs-keys-in-insert t |
(defcustom viper-want-emacs-keys-in-insert t |
67 |
"*Set to nil if you want complete Vi compatibility in insert mode. |
"*Set to nil if you want complete Vi compatibility in insert mode. |
84 |
Setting viper-no-multiple-ESC to nil will allow as many multiple ESC, |
Setting viper-no-multiple-ESC to nil will allow as many multiple ESC, |
85 |
as is allowed by the major mode in effect." |
as is allowed by the major mode in effect." |
86 |
:type 'boolean |
:type 'boolean |
87 |
:group 'viper) |
:group 'viper) |
88 |
|
|
89 |
(defcustom viper-want-ctl-h-help nil |
(defcustom viper-want-ctl-h-help nil |
90 |
"*If non-nil, C-h gets bound to help-command; otherwise, C-h gets the usual Vi bindings." |
"*If non-nil, C-h gets bound to help-command; otherwise, C-h gets the usual Vi bindings." |
103 |
;; keymap used to zap all keymaps other than function-key-map, |
;; keymap used to zap all keymaps other than function-key-map, |
104 |
;; device-function-key-map, etc. |
;; device-function-key-map, etc. |
105 |
(defvar viper-overriding-map (make-sparse-keymap)) |
(defvar viper-overriding-map (make-sparse-keymap)) |
106 |
|
|
107 |
(viper-deflocalvar viper-vi-local-user-map (make-sparse-keymap) |
(viper-deflocalvar viper-vi-local-user-map (make-sparse-keymap) |
108 |
"Keymap for user-defined local bindings. |
"Keymap for user-defined local bindings. |
109 |
Useful for changing bindings such as ZZ in certain major modes. |
Useful for changing bindings such as ZZ in certain major modes. |
110 |
For instance, in letter-mode, one may want to bind ZZ to |
For instance, in letter-mode, one may want to bind ZZ to |
111 |
mh-send-letter. In a newsreader such as gnus, tin, or rn, ZZ could be bound |
mh-send-letter. In a newsreader such as gnus, tin, or rn, ZZ could be bound |
112 |
to save-buffers-kill-emacs then post article, etc.") |
to save-buffers-kill-emacs then post article, etc.") |
113 |
(put 'viper-vi-local-user-map 'permanent-local t) |
(put 'viper-vi-local-user-map 'permanent-local t) |
114 |
|
|
115 |
(defvar viper-vi-global-user-map (make-sparse-keymap) |
(defvar viper-vi-global-user-map (make-sparse-keymap) |
116 |
"Keymap for user-defined global bindings. |
"Keymap for user-defined global bindings. |
126 |
(defvar viper-vi-diehard-map (make-sparse-keymap) |
(defvar viper-vi-diehard-map (make-sparse-keymap) |
127 |
"This keymap is in use when the user asks Viper to simulate Vi very closely. |
"This keymap is in use when the user asks Viper to simulate Vi very closely. |
128 |
This happens when viper-expert-level is 1 or 2. See viper-set-expert-level.") |
This happens when viper-expert-level is 1 or 2. See viper-set-expert-level.") |
129 |
|
|
130 |
|
|
131 |
(viper-deflocalvar viper-insert-local-user-map (make-sparse-keymap) |
(viper-deflocalvar viper-insert-local-user-map (make-sparse-keymap) |
132 |
"Auxiliary map for per-buffer user-defined keybindings in Insert state.") |
"Auxiliary map for per-buffer user-defined keybindings in Insert state.") |
133 |
(put 'viper-insert-local-user-map 'permanent-local t) |
(put 'viper-insert-local-user-map 'permanent-local t) |
134 |
|
|
135 |
(defvar viper-insert-global-user-map (make-sparse-keymap) |
(defvar viper-insert-global-user-map (make-sparse-keymap) |
136 |
"Auxiliary map for global user-defined bindings in Insert state.") |
"Auxiliary map for global user-defined bindings in Insert state.") |
148 |
|
|
149 |
(defvar viper-replace-map (make-sparse-keymap) |
(defvar viper-replace-map (make-sparse-keymap) |
150 |
"Map used in Viper's replace state.") |
"Map used in Viper's replace state.") |
151 |
|
|
152 |
(defvar viper-emacs-global-user-map (make-sparse-keymap) |
(defvar viper-emacs-global-user-map (make-sparse-keymap) |
153 |
"Auxiliary map for global user-defined bindings in Emacs state.") |
"Auxiliary map for global user-defined bindings in Emacs state.") |
154 |
|
|
155 |
(defvar viper-emacs-kbd-map (make-sparse-keymap) |
(defvar viper-emacs-kbd-map (make-sparse-keymap) |
156 |
"This keymap keeps Vi-style kbd macros for emacs mode.") |
"This keymap keeps Vi-style kbd macros for emacs mode.") |
157 |
|
|
158 |
(viper-deflocalvar viper-emacs-local-user-map (make-sparse-keymap) |
(viper-deflocalvar viper-emacs-local-user-map (make-sparse-keymap) |
159 |
"Auxiliary map for local user-defined bindings in Emacs state.") |
"Auxiliary map for local user-defined bindings in Emacs state.") |
160 |
(put 'viper-emacs-local-user-map 'permanent-local t) |
(put 'viper-emacs-local-user-map 'permanent-local t) |
161 |
|
|
162 |
;; This keymap should stay empty |
;; This keymap should stay empty |
163 |
(defvar viper-empty-keymap (make-sparse-keymap)) |
(defvar viper-empty-keymap (make-sparse-keymap)) |
170 |
|
|
171 |
;;; Variables used by minor modes |
;;; Variables used by minor modes |
172 |
|
|
173 |
;; Association list of the form |
;; Association list of the form |
174 |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
175 |
;; Viper uses these keymaps to make user-requested adjustments |
;; Viper uses these keymaps to make user-requested adjustments |
176 |
;; to its Vi state in various major modes.") |
;; to its Vi state in various major modes.") |
177 |
(defvar viper-vi-state-modifier-alist nil) |
(defvar viper-vi-state-modifier-alist nil) |
178 |
|
|
179 |
;; Association list of the form |
;; Association list of the form |
180 |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
181 |
;; Viper uses these keymaps to make user-requested adjustments |
;; Viper uses these keymaps to make user-requested adjustments |
182 |
;; to its Insert state in various major modes.") |
;; to its Insert state in various major modes.") |
183 |
(defvar viper-insert-state-modifier-alist nil) |
(defvar viper-insert-state-modifier-alist nil) |
184 |
|
|
185 |
;; Association list of the form |
;; Association list of the form |
186 |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
;; ((major-mode . keymap) (major-mode . keymap) ...) |
187 |
;; Viper uses these keymaps to make user-requested adjustments |
;; Viper uses these keymaps to make user-requested adjustments |
188 |
;; to its Emacs state in various major modes. |
;; to its Emacs state in various major modes. |
240 |
(define-key viper-insert-basic-map "\C-d" 'viper-backward-indent) |
(define-key viper-insert-basic-map "\C-d" 'viper-backward-indent) |
241 |
(define-key viper-insert-basic-map "\C-w" 'viper-delete-backward-word) |
(define-key viper-insert-basic-map "\C-w" 'viper-delete-backward-word) |
242 |
(define-key viper-insert-basic-map "\C-t" 'viper-forward-indent) |
(define-key viper-insert-basic-map "\C-t" 'viper-forward-indent) |
243 |
(define-key viper-insert-basic-map |
(define-key viper-insert-basic-map |
244 |
(if viper-xemacs-p [(shift tab)] [S-tab]) 'viper-insert-tab) |
(if viper-xemacs-p [(shift tab)] [S-tab]) 'viper-insert-tab) |
245 |
(define-key viper-insert-basic-map "\C-v" 'quoted-insert) |
(define-key viper-insert-basic-map "\C-v" 'quoted-insert) |
246 |
(define-key viper-insert-basic-map "\C-?" 'viper-del-backward-char-in-insert) |
(define-key viper-insert-basic-map "\C-?" 'viper-del-backward-char-in-insert) |
420 |
|
|
421 |
|
|
422 |
;;; Minibuffer keymap |
;;; Minibuffer keymap |
423 |
|
|
424 |
|
|
425 |
(defvar viper-minibuffer-map (make-sparse-keymap) |
(defvar viper-minibuffer-map (make-sparse-keymap) |
426 |
"Keymap used to modify keys when Minibuffer is in Insert state.") |
"Keymap used to modify keys when Minibuffer is in Insert state.") |
427 |
|
|
428 |
(define-key viper-minibuffer-map "\C-m" 'viper-exit-minibuffer) |
(define-key viper-minibuffer-map "\C-m" 'viper-exit-minibuffer) |
429 |
(define-key viper-minibuffer-map "\C-j" 'viper-exit-minibuffer) |
(define-key viper-minibuffer-map "\C-j" 'viper-exit-minibuffer) |
430 |
|
|
469 |
on a per buffer basis. |
on a per buffer basis. |
470 |
Usage: |
Usage: |
471 |
(viper-add-local-keys state '((key-str . func) (key-str . func)...)) " |
(viper-add-local-keys state '((key-str . func) (key-str . func)...)) " |
472 |
|
|
473 |
(let (map) |
(let (map) |
474 |
(cond ((eq state 'vi-state) |
(cond ((eq state 'vi-state) |
475 |
(if viper-need-new-vi-local-map |
(if viper-need-new-vi-local-map |
486 |
(setq viper-emacs-local-user-map (make-sparse-keymap))) |
(setq viper-emacs-local-user-map (make-sparse-keymap))) |
487 |
(setq viper-need-new-emacs-local-map nil |
(setq viper-need-new-emacs-local-map nil |
488 |
map viper-emacs-local-user-map)) |
map viper-emacs-local-user-map)) |
489 |
(t |
(t |
490 |
(error |
(error |
491 |
"Invalid state in viper-add-local-keys: %S. Valid states: vi-state, insert-state or emacs-state" state))) |
"Invalid state in viper-add-local-keys: %S. Valid states: vi-state, insert-state or emacs-state" state))) |
492 |
|
|
507 |
viper-emacs-local-user-map (make-sparse-keymap) |
viper-emacs-local-user-map (make-sparse-keymap) |
508 |
viper-need-new-emacs-local-map nil) |
viper-need-new-emacs-local-map nil) |
509 |
(viper-normalize-minor-mode-map-alist)) |
(viper-normalize-minor-mode-map-alist)) |
510 |
|
|
511 |
|
|
512 |
(defun viper-modify-major-mode (mode state keymap) |
(defun viper-modify-major-mode (mode state keymap) |
513 |
"Modify key bindings in a major-mode in a Viper state using a keymap. |
"Modify key bindings in a major-mode in a Viper state using a keymap. |
530 |
(if (setq elt (assoc mode (eval alist))) |
(if (setq elt (assoc mode (eval alist))) |
531 |
(set alist (delq elt (eval alist)))) |
(set alist (delq elt (eval alist)))) |
532 |
(set alist (cons (cons mode keymap) (eval alist))) |
(set alist (cons (cons mode keymap) (eval alist))) |
533 |
|
|
534 |
;; Normalization usually doesn't help here, since one needs to |
;; Normalization usually doesn't help here, since one needs to |
535 |
;; normalize in the actual buffer where changes to the keymap are |
;; normalize in the actual buffer where changes to the keymap are |
536 |
;; to take place. However, it doesn't hurt, and it helps whenever this |
;; to take place. However, it doesn't hurt, and it helps whenever this |
537 |
;; function is actually called from within the affected buffer. |
;; function is actually called from within the affected buffer. |
538 |
(viper-normalize-minor-mode-map-alist) |
(viper-normalize-minor-mode-map-alist) |
539 |
|
|
540 |
(viper-set-mode-vars-for viper-current-state))) |
(viper-set-mode-vars-for viper-current-state))) |
541 |
|
|
542 |
|
|
543 |
;; Displays variables that control Viper's keymaps |
;; Displays variables that control Viper's keymaps |
544 |
(defun viper-debug-keymaps () |
(defun viper-debug-keymaps () |
545 |
(interactive) |
(interactive) |
575 |
(princ (format "viper-insert-global-user-minor-mode: %S\n" |
(princ (format "viper-insert-global-user-minor-mode: %S\n" |
576 |
viper-insert-global-user-minor-mode)) |
viper-insert-global-user-minor-mode)) |
577 |
(princ (format "viper-insert-kbd-minor-mode: %S\n" |
(princ (format "viper-insert-kbd-minor-mode: %S\n" |
578 |
viper-insert-kbd-minor-mode)) |
viper-insert-kbd-minor-mode)) |
579 |
(princ (format "viper-insert-state-modifier-minor-mode: %S\n" |
(princ (format "viper-insert-state-modifier-minor-mode: %S\n" |
580 |
viper-insert-state-modifier-minor-mode)) |
viper-insert-state-modifier-minor-mode)) |
581 |
(princ (format "viper-insert-diehard-minor-mode: %S\n" |
(princ (format "viper-insert-diehard-minor-mode: %S\n" |
590 |
viper-emacs-global-user-minor-mode)) |
viper-emacs-global-user-minor-mode)) |
591 |
(princ (format "viper-emacs-state-modifier-minor-mode: %S\n" |
(princ (format "viper-emacs-state-modifier-minor-mode: %S\n" |
592 |
viper-emacs-state-modifier-minor-mode)) |
viper-emacs-state-modifier-minor-mode)) |
593 |
|
|
594 |
(princ (format "\nviper-expert-level %S\n" viper-expert-level)) |
(princ (format "\nviper-expert-level %S\n" viper-expert-level)) |
595 |
(princ (format "viper-no-multiple-ESC %S\n" viper-no-multiple-ESC)) |
(princ (format "viper-no-multiple-ESC %S\n" viper-no-multiple-ESC)) |
596 |
(princ (format "viper-always %S\n" viper-always)) |
(princ (format "viper-always %S\n" viper-always)) |
599 |
(princ (format "viper-ex-style-editing %S\n" |
(princ (format "viper-ex-style-editing %S\n" |
600 |
viper-ex-style-editing)) |
viper-ex-style-editing)) |
601 |
(princ (format "viper-want-emacs-keys-in-vi %S\n" |
(princ (format "viper-want-emacs-keys-in-vi %S\n" |
602 |
viper-want-emacs-keys-in-vi)) |
viper-want-emacs-keys-in-vi)) |
603 |
(princ (format "viper-want-emacs-keys-in-insert %S\n" |
(princ (format "viper-want-emacs-keys-in-insert %S\n" |
604 |
viper-want-emacs-keys-in-insert)) |
viper-want-emacs-keys-in-insert)) |
605 |
(princ (format "viper-want-ctl-h-help %S\n" viper-want-ctl-h-help)) |
(princ (format "viper-want-ctl-h-help %S\n" viper-want-ctl-h-help)) |
606 |
|
|
607 |
(princ "\n\n\n") |
(princ "\n\n\n") |
608 |
(princ (format "Default value for minor-mode-map-alist: \n%S\n\n" |
(princ (format "Default value for minor-mode-map-alist: \n%S\n\n" |
609 |
(default-value 'minor-mode-map-alist))) |
(default-value 'minor-mode-map-alist))) |
610 |
(princ (format "Actual value for minor-mode-map-alist: \n%S\n" |
(princ (format "Actual value for minor-mode-map-alist: \n%S\n" |
611 |
minor-mode-map-alist)) |
minor-mode-map-alist)) |
612 |
)) |
)) |
613 |
|
|
614 |
|
|
615 |
;;; Keymap utils |
;;; Keymap utils |
616 |
|
|
617 |
(defun viper-add-keymap (mapsrc mapdst) |
(defun viper-add-keymap (mapsrc mapdst) |
618 |
"Add contents of mapsrc to mapdst. It is assumed that mapsrc is sparse." |
"Add contents of mapsrc to mapdst. It is assumed that mapsrc is sparse." |
619 |
(viper-cond-compile-for-xemacs-or-emacs |
(viper-cond-compile-for-xemacs-or-emacs |
620 |
;; xemacs |
;; xemacs |
624 |
(mapcar (lambda (p) (define-key mapdst (vector (car p)) (cdr p))) |
(mapcar (lambda (p) (define-key mapdst (vector (car p)) (cdr p))) |
625 |
(cdr mapsrc)) |
(cdr mapsrc)) |
626 |
)) |
)) |
627 |
|
|
628 |
(defun viper-modify-keymap (map alist) |
(defun viper-modify-keymap (map alist) |
629 |
"Modifies MAP with bindings specified in the ALIST. The alist has the |
"Modifies MAP with bindings specified in the ALIST. The alist has the |
630 |
form ((key . function) (key . function) ... )." |
form ((key . function) (key . function) ... )." |
631 |
(mapcar (lambda (p) (define-key map (eval (car p)) (cdr p))) |
(mapcar (lambda (p) (define-key map (eval (car p)) (cdr p))) |
632 |
alist)) |
alist)) |
633 |
|
|
634 |
|
|