Skip to content

Commit

Permalink
evil-evilified-state.el: Do not set pre-bindings during macro-expansion
Browse files Browse the repository at this point in the history
Pre-bindings should be set before evilification of the map, but not
during macro-expansion itself, as the macro may be expanded before the
map is defined.

Fix syl20bnr#16514.
  • Loading branch information
bcc32 committed Aug 2, 2024
1 parent fb26935 commit 8a358c9
Showing 1 changed file with 25 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -258,36 +258,37 @@ Each pair KEYn FUNCTIONn is defined in MAP after the evilification of it."
(bindings (evilified-state--mplist-get props :bindings))
(defkey (when bindings `(evil-define-key 'evilified ,map ,@bindings)))
(body
(progn
(evilified-state--define-pre-bindings map pre-bindings)
`(
;; we need to work on a local copy of the evilified keymap to
;; prevent the original keymap from being mutated.
(setq evil-evilified-state-map (copy-keymap ,evilified-map))
(let* ((sorted-map (evilified-state--sort-keymap
evil-evilified-state-map))
processed)
(mapc (lambda (map-entry)
(unless (member (car map-entry) processed)
(setq processed (evilified-state--evilify-event
,map ',map evil-evilified-state-map
(car map-entry) (cdr map-entry)))))
sorted-map)
(unless ,(null defkey)
(,@defkey)))
(unless ,(null mode)
(evilified-state--configure-default-state ',mode))))))
`(,@(evilified-state--define-pre-bindings map pre-bindings)
;; we need to work on a local copy of the evilified keymap to
;; prevent the original keymap from being mutated.
(setq evil-evilified-state-map (copy-keymap ,evilified-map))
(let* ((sorted-map (evilified-state--sort-keymap
evil-evilified-state-map))
processed)
(mapc (lambda (map-entry)
(unless (member (car map-entry) processed)
(setq processed (evilified-state--evilify-event
,map ',map evil-evilified-state-map
(car map-entry) (cdr map-entry)))))
sorted-map)
(unless ,(null defkey)
(,@defkey)))
(unless ,(null mode)
(evilified-state--configure-default-state ',mode)))))
(if (null eval-after-load)
`(progn ,@body)
`(with-eval-after-load ',eval-after-load (progn ,@body)))))
(put 'evilified-state-evilify-map 'lisp-indent-function 'defun)

(defun evilified-state--define-pre-bindings (map pre-bindings)
"Define PRE-BINDINGS in MAP."
(while pre-bindings
(let ((key (pop pre-bindings))
(func (pop pre-bindings)))
(eval `(define-key ,map ,key ,func)))))
"Return a list of forms to define PRE-BINDINGS in MAP."
(let ((pre-binding-forms))
(while pre-bindings
(let ((key (pop pre-bindings))
(func (pop pre-bindings)))
(push `(define-key ,map ,key ,func)
pre-binding-forms)))
(nreverse pre-binding-forms)))

(defun evilified-state--configure-default-state (mode)
"Configure default state for the passed mode."
Expand Down

0 comments on commit 8a358c9

Please sign in to comment.