diff options
| author | Stefan Monnier <monnier@iro.umontreal.ca> | 2023-07-01 16:05:34 -0400 |
|---|---|---|
| committer | Tom Dalziel <tom_dl@hotmail.com> | 2023-08-20 23:46:23 +0100 |
| commit | 44add36e972ed22ded6cb89654986e80d1d8989e (patch) | |
| tree | 888d946d2dffc9e91ea568ff6e65c17dc8f88a11 /evil-core.el | |
| parent | 46ab271a524c9eda90fa2ddd272e0f2232fa1c87 (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.el | 38 |
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)) |
