]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed up completion-in-mode-p in the common case
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 15 Feb 2021 03:22:29 +0000 (04:22 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 15 Feb 2021 03:22:29 +0000 (04:22 +0100)
* lisp/simple.el (completion-in-mode-p): Make predicate more
efficient in the common one-mode case.

lisp/simple.el

index 44a9c4dc985c98f068b236472e6770a47df80211..ed0e753ee06697f816e51f69e5e8e7b12d6217b2 100644 (file)
@@ -1978,15 +1978,20 @@ This function uses the `read-extended-command-predicate' user option."
   "Say whether SYMBOL should be offered as a completion.
 This is true if the command is applicable to the major mode in
 BUFFER, or any of the active minor modes in BUFFER."
-  (or (null (command-modes symbol))
-      ;; It's derived from a major mode.
-      (apply #'provided-mode-derived-p
-             (buffer-local-value 'major-mode buffer)
-             (command-modes symbol))
-      ;; It's a minor mode.
-      (seq-intersection (command-modes symbol)
-                        (buffer-local-value 'minor-modes buffer)
-                        #'eq)))
+  (let ((modes (command-modes symbol)))
+    (or (null modes)
+        ;; Common case: Just a single mode.
+        (if (null (cdr modes))
+            (or (provided-mode-derived-p
+                 (buffer-local-value 'major-mode buffer) (car modes))
+                (memq (car modes) (buffer-local-value 'minor-modes buffer)))
+          ;; Uncommon case: Multiple modes.
+          (apply #'provided-mode-derived-p
+                 (buffer-local-value 'major-mode buffer)
+                 modes)
+          (seq-intersection modes
+                            (buffer-local-value 'minor-modes buffer)
+                            #'eq)))))
 
 (defun completion-with-modes-p (modes buffer)
   "Say whether MODES are in action in BUFFER.