Skip to content

Commit 4c5fa39

Browse files
committed
More appropriate Evil techniques are used to bind the leader keys
1 parent f23cfc1 commit 4c5fa39

File tree

1 file changed

+39
-40
lines changed

1 file changed

+39
-40
lines changed

bind-map.el

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -170,23 +170,6 @@ be activated.")
170170
(put map-sym (pop properties)
171171
(when properties (pop properties)))))
172172

173-
(defun bind-map-evil-local-mode-hook ()
174-
"Called to activate local state maps in a buffer."
175-
;; format is (OVERRIDE-MODE STATE KEY DEF)
176-
(dolist (entry bind-map-evil-local-bindings)
177-
(let* ((map (intern (format "evil-%s-state-local-map" (nth 1 entry))))
178-
(mode (nth 0 entry))
179-
(global-mode (intern (format "global-%s" (nth 0 entry))))
180-
(set-explicitly (intern (format "%s-set-explicitly" mode))))
181-
(when (and (boundp global-mode) (boundp mode)
182-
(boundp set-explicitly) (boundp map)
183-
(keymapp (symbol-value map))
184-
(symbol-value global-mode)
185-
(not (and (symbol-value set-explicitly)
186-
(null (symbol-value mode)))))
187-
(define-key (symbol-value map) (nth 2 entry) (nth 3 entry))))))
188-
(add-hook 'evil-local-mode-hook 'bind-map-evil-local-mode-hook)
189-
190173
(defvar bind-map-major-modes-alist '()
191174
"Each element takes the form (MAP-ACTIVE (MAJOR-MODE1
192175
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))
395378
,override-mode-doc)
396379
(,global-override-mode 1))
397380
(add-to-list 'emulation-mode-map-alists
398-
(list (cons ',override-mode ,root-map)))))
381+
(list (cons ',override-mode ,root-map)))
382+
;; Ensure Evil includes this map by also adding to minor-mode maps
383+
(add-to-list 'minor-mode-map-alist (cons ',override-mode ,root-map))
384+
;; Normalize Evil keymaps when the override mode toggles
385+
(with-eval-after-load 'evil
386+
(add-hook ',(intern (format "%s-hook" override-mode))
387+
#'evil-normalize-keymaps))))
399388

400389
(if (or minor-modes major-modes)
401390
;; only bind keys in root-map
@@ -409,28 +398,38 @@ mode maps. Set up by bind-map.el." map))
409398

410399
(when evil-keys
411400
(if (or minor-modes major-modes)
412-
`((eval-after-load 'evil
413-
'(progn
414-
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
415-
(dolist (state ',evil-states)
416-
(when ',major-modes
417-
(define-key
418-
(evil-get-auxiliary-keymap ,root-map state t)
419-
key ',prefix-cmd))
420-
(dolist (mode ',minor-modes)
421-
(when (fboundp 'evil-define-minor-mode-key)
422-
(evil-define-minor-mode-key
423-
state mode key ',prefix-cmd)))))
424-
(evil-normalize-keymaps))))
425-
`((eval-after-load 'evil
426-
'(progn
427-
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
428-
(dolist (state ',evil-states)
429-
(when ,override-minor-modes
430-
(push (list ',override-mode state key ',prefix-cmd)
431-
bind-map-evil-local-bindings))
432-
(evil-global-set-key state key ',prefix-cmd)))
433-
(evil-normalize-keymaps))))))
401+
`((eval-after-load 'evil
402+
'(progn
403+
;; Bind per-state leaders in the auxiliary keymaps of root-map
404+
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
405+
(dolist (state ',evil-states)
406+
(when ',major-modes
407+
(define-key (evil-get-auxiliary-keymap ,root-map state t)
408+
key ',prefix-cmd))
409+
(dolist (mode ',minor-modes)
410+
(when (fboundp 'evil-define-minor-mode-key)
411+
(evil-define-minor-mode-key ',evil-states mode key ',prefix-cmd)))))
412+
(evil-normalize-keymaps))))
413+
`((eval-after-load 'evil
414+
'(progn
415+
(dolist (state ',evil-states)
416+
;; Mark the root-map overriding for precedence
417+
(evil-make-overriding-map ,root-map state)
418+
;; Bind keys in the per-state auxiliary keymaps
419+
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
420+
(define-key (evil-get-auxiliary-keymap ,root-map state t)
421+
key ',prefix-cmd)))
422+
;; Also associate bindings with the override minor mode so they
423+
;; are scoped to buffers where it is enabled
424+
(when ,override-minor-modes
425+
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
426+
(evil-define-minor-mode-key ',evil-states ',override-mode key ',prefix-cmd)))
427+
;; Fall back to global bindings when not overriding minor modes
428+
(unless ,override-minor-modes
429+
(dolist (key (bind-map-kbd-keys (list ,@evil-keys)))
430+
(dolist (state ',evil-states)
431+
(evil-global-set-key state key ',prefix-cmd))))
432+
(evil-normalize-keymaps))))))
434433

435434
(when bindings
436435
`((bind-map-set-keys ,map

0 commit comments

Comments
 (0)