branch: elpa/bind-map
commit 19713f11598728010c6ecbaa0a3857d2abd53bcb
Author: Aaron Jensen <[email protected]>
Commit: Aaron Jensen <[email protected]>
Alternative technique for Evil binding
---
bind-map.el | 78 ++++++++++++++++++++++++++++++-------------------------------
1 file changed, 38 insertions(+), 40 deletions(-)
diff --git a/bind-map.el b/bind-map.el
index 41e6e5b5f03..f4e6d501007 100644
--- a/bind-map.el
+++ b/bind-map.el
@@ -170,23 +170,6 @@ be activated.")
(put map-sym (pop properties)
(when properties (pop properties)))))
-(defun bind-map-evil-local-mode-hook ()
- "Called to activate local state maps in a buffer."
- ;; format is (OVERRIDE-MODE STATE KEY DEF)
- (dolist (entry bind-map-evil-local-bindings)
- (let* ((map (intern (format "evil-%s-state-local-map" (nth 1 entry))))
- (mode (nth 0 entry))
- (global-mode (intern (format "global-%s" (nth 0 entry))))
- (set-explicitly (intern (format "%s-set-explicitly" mode))))
- (when (and (boundp global-mode) (boundp mode)
- (boundp set-explicitly) (boundp map)
- (keymapp (symbol-value map))
- (symbol-value global-mode)
- (not (and (symbol-value set-explicitly)
- (null (symbol-value mode)))))
- (define-key (symbol-value map) (nth 2 entry) (nth 3 entry))))))
-(add-hook 'evil-local-mode-hook 'bind-map-evil-local-mode-hook)
-
(defvar bind-map-major-modes-alist '()
"Each element takes the form (MAP-ACTIVE (MAJOR-MODE1
MAJOR-MODE2 ...)). The car is the variable used to activate a map
@@ -395,7 +378,13 @@ mode maps. Set up by bind-map.el." map))
,override-mode-doc)
(,global-override-mode 1))
(add-to-list 'emulation-mode-map-alists
- (list (cons ',override-mode ,root-map)))))
+ (list (cons ',override-mode ,root-map)))
+ ;; Ensure Evil includes this map by also adding to minor-mode maps
+ (add-to-list 'minor-mode-map-alist (cons ',override-mode ,root-map))
+ ;; Normalize Evil keymaps when the override mode toggles
+ (with-eval-after-load 'evil
+ (add-hook ',(intern (format "%s-hook" override-mode))
+ #'evil-normalize-keymaps))))
(if (or minor-modes major-modes)
;; only bind keys in root-map
@@ -409,28 +398,37 @@ mode maps. Set up by bind-map.el." map))
(when evil-keys
(if (or minor-modes major-modes)
- `((eval-after-load 'evil
- '(progn
- (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
- (dolist (state ',evil-states)
- (when ',major-modes
- (define-key
- (evil-get-auxiliary-keymap ,root-map state t)
- key ',prefix-cmd))
- (dolist (mode ',minor-modes)
- (when (fboundp 'evil-define-minor-mode-key)
- (evil-define-minor-mode-key
- state mode key ',prefix-cmd)))))
- (evil-normalize-keymaps))))
- `((eval-after-load 'evil
- '(progn
- (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
- (dolist (state ',evil-states)
- (when ,override-minor-modes
- (push (list ',override-mode state key ',prefix-cmd)
- bind-map-evil-local-bindings))
- (evil-global-set-key state key ',prefix-cmd)))
- (evil-normalize-keymaps))))))
+ `((eval-after-load 'evil
+ '(progn
+ ;; Bind per-state leaders in the auxiliary keymaps of
root-map
+ (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
+ (dolist (state ',evil-states)
+ (when ',major-modes
+ (define-key (evil-get-auxiliary-keymap ,root-map state
t)
+ key ',prefix-cmd))
+ (dolist (mode ',minor-modes)
+ (evil-define-minor-mode-key ',evil-states mode key
',prefix-cmd))))
+ (evil-normalize-keymaps))))
+ `((eval-after-load 'evil
+ '(progn
+ (dolist (state ',evil-states)
+ ;; Mark the root-map overriding for precedence
+ (evil-make-overriding-map ,root-map state)
+ ;; Bind keys in the per-state auxiliary keymaps
+ (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
+ (define-key (evil-get-auxiliary-keymap ,root-map state t)
+ key ',prefix-cmd)))
+ ;; Also associate bindings with the override minor mode so they
+ ;; are scoped to buffers where it is enabled
+ (when ,override-minor-modes
+ (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
+ (evil-define-minor-mode-key ',evil-states ',override-mode
key ',prefix-cmd)))
+ ;; Fall back to global bindings when not overriding minor modes
+ (unless ,override-minor-modes
+ (dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
+ (dolist (state ',evil-states)
+ (evil-global-set-key state key ',prefix-cmd))))
+ (evil-normalize-keymaps))))))
(when bindings
`((bind-map-set-keys ,map