From ad895d2df5c69e015c2c7eba5116ab2d440e1fbc Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Wed, 27 Sep 2023 03:32:37 +0200 Subject: [PATCH] WIP: Bug#66187 --- lisp/minibuffer.el | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 2120e31775e..79a8786fbac 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -3061,13 +3061,23 @@ completion-file-name-table (funcall (or pred 'file-exists-p) string))) (t - (let* ((name (file-name-nondirectory string)) + (let* ((test-directory (lambda (s) + (let ((len (length s))) + (and (> len 0) (eq (aref s (1- len)) ?/))))) + (should-complete + (and pred + (if (eq pred 'file-directory-p) + test-directory + (lambda (f) + (or (funcall test-directory f) + (funcall pred f)))))) + (name (file-name-nondirectory string)) (specdir (file-name-directory string)) (realdir (or specdir default-directory))) (cond ((null action) - (let ((comp (file-name-completion name realdir pred))) + (let ((comp (file-name-completion name realdir should-complete))) (if (stringp comp) (concat specdir comp) comp))) @@ -3078,18 +3088,9 @@ completion-file-name-table ;; Check the predicate, if necessary. (unless (memq pred '(nil file-exists-p)) (let ((comp ()) - (pred - (if (eq pred 'file-directory-p) - ;; Brute-force speed up for directory checking: - ;; Discard strings which don't end in a slash. - (lambda (s) - (let ((len (length s))) - (and (> len 0) (eq (aref s (1- len)) ?/)))) - ;; Must do it the hard (and slow) way. - pred))) - (let ((default-directory (expand-file-name realdir))) - (dolist (tem all) - (if (funcall pred tem) (push tem comp)))) + (default-directory (expand-file-name realdir))) + (dolist (tem all) + (if (funcall should-complete tem) (push tem comp))) (setq all (nreverse comp)))) all)))))) -- 2.39.2