[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/with-simulated-input 5713495a1c 067/134: Refactor: `with-s
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/with-simulated-input 5713495a1c 067/134: Refactor: `with-simulated-input' function |
Date: |
Mon, 10 Jan 2022 23:00:06 -0500 (EST) |
branch: elpa/with-simulated-input
commit 5713495a1c193c18609aa78e4f97aeca4777c0a8
Author: Nikita Bloshchanevich <nikblos@outlook.com>
Commit: Nikita Bloshchanevich <nikblos@outlook.com>
Refactor: `with-simulated-input' function
Macros are harder to understand than functions, so refactor the common
parts of
`with-simulated-input' into a new function, `with-simulated-input--1'.
---
with-simulated-input.el | 69 +++++++++++++++++++++++++------------------------
1 file changed, 35 insertions(+), 34 deletions(-)
diff --git a/with-simulated-input.el b/with-simulated-input.el
index 5c3484c1cb..8a9724e330 100644
--- a/with-simulated-input.el
+++ b/with-simulated-input.el
@@ -99,6 +99,37 @@ to check.
do (cl-return-from findkey bind))
finally do (error "Could not find an unbound key with the specified
modifiers")))
+(defun with-simulated-input--1 (main &rest keys)
+ "Internal `with-simulated-input' helper.
+KEYS is a keylist as can be passed to that function (except that
+only a list is allowed, and forms must be functions) and MAIN is
+the body form as a function."
+ (let* ((unbound-key (wsi-get-unbound-key))
+ ;; Ensure we don't interfere with any outside catching.
+ (result-sym (make-symbol "result"))
+ (error-sym (make-symbol "error"))
+ (actions (cons (lambda ()
+ (throw result-sym (funcall main)))
+ (cl-remove-if-not #'functionp keys)))
+ (overriding-terminal-local-map
+ (if overriding-terminal-local-map
+ (copy-keymap overriding-terminal-local-map)
+ (make-sparse-keymap))))
+ (define-key overriding-terminal-local-map (kbd unbound-key)
+ (lambda ()
+ (interactive)
+ (unless actions
+ (throw result-sym "Reached end of simulated input while simulating
body"))
+ (funcall (pop actions))))
+ (catch result-sym
+ (error
+ (catch error-sym
+ (execute-kbd-macro
+ (kbd (string-join (cons unbound-key
+ (cl-loop for key in keys collect
+ (if (stringp key) key unbound-key)))
+ " "))))))))
+
;;;###autoload
(defmacro with-simulated-input (keys &rest body)
"Eval BODY forms with KEYS as simulated input.
@@ -141,40 +172,10 @@ in `progn'."
(pcase keys
(`(quote ,x) (setq keys x))
((guard (not (listp keys))) (cl-callf list keys)))
- (let ((key-sym (make-symbol "unbound-key"))
- (actions-sym (make-symbol "actions"))
- (result-sym (make-symbol "result"))
- (error-sym (make-symbol "wsi-error")))
- `(let ((,key-sym (wsi-get-unbound-key))
- (overriding-terminal-local-map
- (if overriding-terminal-local-map
- (copy-keymap overriding-terminal-local-map)
- (make-sparse-keymap)))
- (,actions-sym
- ;; The lambdas must be evaluated at run-time for the closures to be
- ;; built correctly, so we must use `list' instead of something like
- ;; '.
- (list (lambda ()
- (throw ',result-sym ,(macroexp-progn body)))
- ,@(cl-loop for key in keys unless (stringp key)
- collect `(lambda () ,key)))))
- (define-key overriding-terminal-local-map (kbd ,key-sym)
- (lambda ()
- (interactive)
- (unless ,actions-sym
- (throw ',error-sym "Reached end of simulated input while
simulating body"))
- (funcall (pop ,actions-sym))))
- ;; If there is a result, `error' won't be called. Otherwise, there must
- ;; be an error (Reached end of simulated input).
- (catch ',result-sym
- (error
- (catch ',error-sym
- (execute-kbd-macro
- ;; We can't compute this at compile-time because we don't know
what key
- ;; will be free.
- (kbd (string-join (list ,key-sym ,@(cl-loop for key in keys
collect
- (if (stringp key) key
key-sym)))
- " ")))))))))
+ `(with-simulated-input--1
+ (lambda ()
+ ,@body)
+ ,@(cl-loop for key in keys collect (if (consp key) `(lambda () ,key)
key))))
(defvar wsi-simulated-idle-time nil
"The current simulated idle time.
- [nongnu] elpa/with-simulated-input 8f335ad321 108/134: Implement warnings for inputs that have no effect, (continued)
- [nongnu] elpa/with-simulated-input 8f335ad321 108/134: Implement warnings for inputs that have no effect, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 8b4d44c3aa 104/134: Clean up wording in tests, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input ee4d2b75fd 133/134: Version 3.0, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 4e918757ae 111/134: Implement warnings for no-op KEYS inside a variable value, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input addb2a0711 122/134: Improve KEYS validation logic and error messages, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 0f43fe46d4 134/134: Add CI status badge to README, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 235a93f0fc 060/134: Add test for run-time evaluation of KEYS, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 5f0bc054b5 069/134: Better error propagation, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input abe9c855a8 075/134: `with-simulated-input' support `list' KEYS, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 1f48107e92 081/134: Add nbfalcon as Author, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 5713495a1c 067/134: Refactor: `with-simulated-input' function,
ELPA Syncer <=
- [nongnu] elpa/with-simulated-input 2a4866984a 080/134: No longer handle variables specially in KEYS, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 6c2e0ece2d 084/134: Use #' for advice-add/-remove, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 582844da4c 085/134: Add a failing test for byte-compiled closures, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input dca9d87d50 091/134: Move issue-specific tests to their own block, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input c5b3f7ac70 097/134: Add tests for nil input, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 0a1b0dea0a 101/134: Clean up with-simulated-input-1, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 138106c256 116/134: Skip coverage calculation on older Emacsen, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 1b9123c708 112/134: Cache the return value of wsi-get-unbound-key, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input 4abf2f0e6b 103/134: Replace def-form with form in debug declaration, ELPA Syncer, 2022/01/10
- [nongnu] elpa/with-simulated-input c0b765c7fb 115/134: Add debug declarations to macros in test file, ELPA Syncer, 2022/01/10