From: Lars Ingebrigtsen Date: Mon, 15 Feb 2021 03:22:29 +0000 (+0100) Subject: Speed up completion-in-mode-p in the common case X-Git-Tag: emacs-28.0.90~3724 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=df99b17e4fe7f6ee0c09ac990117ffea6ee3b695;p=emacs.git Speed up completion-in-mode-p in the common case * lisp/simple.el (completion-in-mode-p): Make predicate more efficient in the common one-mode case. --- diff --git a/lisp/simple.el b/lisp/simple.el index 44a9c4dc985..ed0e753ee06 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -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.