]> git.eshelyaron.com Git - emacs.git/commitdiff
Try to speed up extended command shorthand computation
authorMichael Heerdegen <michael_heerdegen@web.de>
Sun, 18 Sep 2022 10:26:53 +0000 (12:26 +0200)
committerMichael Heerdegen <michael_heerdegen@web.de>
Sun, 9 Oct 2022 18:42:44 +0000 (20:42 +0200)
Discussed in Bug#51143.

* lisp/simple.el (execute-extended-command--shorter): Compute a
complete list of `commandp' symbols once.  This significantly speeds
up complicated cases while the slowdown of simple cases is still
accetable.

lisp/simple.el

index d2dcbe27a0773efd294ddb555a36adf04a521f48..e804f717b01fedd45b47a051b1af28d8b33b5b93 100644 (file)
@@ -2465,9 +2465,13 @@ Also see `suggest-key-bindings'."
 
 (defun execute-extended-command--shorter (name typed)
   (let ((candidates '())
+        commands
         (max (length typed))
         (len 1)
         binding)
+    ;; Precompute a list of commands once to avoid repeated `commandp' testing
+    ;; of symbols in the `completion-try-completion' call inside the loop below
+    (mapatoms (lambda (s) (when (commandp s) (push s commands))))
     (while (and (not binding)
                 (progn
                   (unless candidates
@@ -2480,8 +2484,8 @@ Also see `suggest-key-bindings'."
       (input-pending-p)    ;Dummy call to trigger input-processing, bug#23002.
       (let ((candidate (pop candidates)))
         (when (equal name
-                       (car-safe (completion-try-completion
-                                  candidate obarray 'commandp len)))
+                     (car-safe (completion-try-completion
+                                candidate commands nil len)))
           (setq binding candidate))))
     binding))