aboutsummaryrefslogtreecommitdiff
path: root/evil-core.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2023-07-01 16:05:34 -0400
committerTom Dalziel <tom_dl@hotmail.com>2023-08-20 23:46:23 +0100
commit44add36e972ed22ded6cb89654986e80d1d8989e (patch)
tree888d946d2dffc9e91ea568ff6e65c17dc8f88a11 /evil-core.el
parent46ab271a524c9eda90fa2ddd272e0f2232fa1c87 (diff)
(evil-with-delay): New macro, extracted from `evil-delay`
Save some kittens by using a macro instead of using `eval`. This also exposes more code to the compiler, so should result in more efficient code and potentially better compiler warnings. * evil-common.el (evil-unquote): Delete unused function. (evil--with-delay): New function, extracted from `evil-delay`. (evil-with-delay): New macro, extracted from `evil-delay`. (evil-delay): Redefine using `evil-with-delay` and declare obsolete. * evil-states.el (evil-visual-activate-hook): * evil-core.el (evil-define-key): * evil-commands.el (evil-execute-in-normal-state): Use `evil-with-delay`.
Diffstat (limited to 'evil-core.el')
-rw-r--r--evil-core.el38
1 files changed, 22 insertions, 16 deletions
diff --git a/evil-core.el b/evil-core.el
index bb170ae..1b0dcc7 100644
--- a/evil-core.el
+++ b/evil-core.el
@@ -971,21 +971,27 @@ The symbol `local' may also be used, which corresponds to using
`global' or `local', it is assumed to be the name of a minor
mode, in which case `evil-define-minor-mode-key' is used."
(declare (indent defun))
- (cond ((member keymap '('global 'local))
- `(evil-define-key* ,state ,keymap ,key ,def ,@bindings))
- ((eq (car-safe keymap) 'quote)
- `(evil-define-minor-mode-key ,state ,keymap ,key ,def ,@bindings))
- (t
- `(evil-delay ',(if (symbolp keymap)
- `(and (boundp ',keymap) (keymapp ,keymap))
- `(keymapp ,keymap))
- '(condition-case-unless-debug err
- (evil-define-key* ,state ,keymap ,key ,def ,@bindings)
- (error (message "error in evil-define-key: %s"
- (error-message-string err))))
- 'after-load-functions t nil
- (format "evil-define-key-in-%s"
- ',(if (symbolp keymap) keymap 'keymap))))))
+ (cond
+ ((member keymap '('global 'local))
+ `(evil-define-key* ,state ,keymap ,key ,def ,@bindings))
+ ((eq (car-safe keymap) 'quote)
+ `(evil-define-minor-mode-key ,state ,keymap ,key ,def ,@bindings))
+ (t `(evil-with-delay ,(if (symbolp keymap)
+ ;; BEWARE: Can't work for lexically scoped vars
+ `(and (boundp ',keymap) (keymapp ,keymap))
+ `(keymapp ,keymap))
+ (after-load-functions t nil
+ ,(format "evil-define-key-in-%s"
+ (if (symbolp keymap) keymap
+ 'keymap)))
+ ;; Sadly, the compiler doesn't understand `evil-with-delay's
+ ;; code well enough to figure out that the keymap var is
+ ;; necessarily bound since we just tested `boundp'.
+ ,(when (symbolp keymap) `(defvar ,keymap))
+ (condition-case-unless-debug err
+ (evil-define-key* ,state ,keymap ,key ,def ,@bindings)
+ (error (message "error in evil-define-key: %s"
+ (error-message-string err))))))))
(defalias 'evil-declare-key #'evil-define-key)
(defun evil-define-key* (state keymap key def &rest bindings)
@@ -1028,7 +1034,7 @@ The use is nearly identical to `evil-define-key' with the
exception that this is a function and not a macro (and so will
not be expanded when compiled which can have unintended
consequences). `evil-define-key*' also does not defer any
-bindings like `evil-define-key' does using `evil-delay'. This
+bindings like `evil-define-key' does using `evil-with-delay'. This
allows errors in the bindings to be caught immediately, and makes
its behavior more predictable."
(declare (indent defun))