From df4991093b94ccc48255a0387a98c536962fd0a7 Mon Sep 17 00:00:00 2001 From: Arnold Noronha Date: Fri, 29 May 2020 02:35:58 +0300 Subject: Create a buffer-local binding to improve performance * lisp/ido.el (ido-make-buffer-list-1): Create a buffer-local binding to improve performance when a lot of buffers are open (bug#41029). Copyright-paperwork-exempt: yes --- lisp/ido.el | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lisp/ido.el b/lisp/ido.el index 4fb01c68dfa..e834916a6da 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -3410,13 +3410,18 @@ instead removed from the current item list." (defun ido-make-buffer-list-1 (&optional frame visible) "Return list of non-ignored buffer names." - (delq nil - (mapcar - (lambda (x) - (let ((name (buffer-name x))) - (if (not (or (ido-ignore-item-p name ido-ignore-buffers) (member name visible))) - name))) - (buffer-list frame)))) + (with-temp-buffer + ;; Each call to ido-ignore-item-p LET-binds case-fold-search. + ;; That is slow if there's no buffer-local binding available, + ;; roughly O(number of buffers). This hack avoids it. + (setq-local case-fold-search nil) + (delq nil + (mapcar + (lambda (x) + (let ((name (buffer-name x))) + (if (not (or (ido-ignore-item-p name ido-ignore-buffers) (member name visible))) + name))) + (buffer-list frame))))) (defun ido-make-buffer-list (default) "Return the current list of buffers. -- cgit v1.2.1