From f5e3c2cc9820a4f7f536a29836cdde6f65230bd3 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Fri, 12 Apr 2019 14:23:01 +0200 Subject: [PATCH] Add a new user option 'ido-big-directories'. This provides an alternative to 'ido-max-directory-size', for directories that are statically known to be too big for Ido completion. * lisp/ido.el (ido-big-directories): New user option. (ido-directory-too-big-p): Use it. * test/lisp/ido-tests.el (ido-directory-too-big-p): New unit test. --- etc/NEWS | 5 +++++ lisp/ido.el | 25 ++++++++++++++++++------- test/lisp/ido-tests.el | 7 +++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 5e5d942d89a..3e3454bd939 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -410,6 +410,11 @@ current and the previous or the next line, as before. *** New commands doc-view-presentation and doc-view-fit-window-to-page *** Added support for password-protected PDF files +** Ido +*** New user option 'ido-big-directories' to mark directories whose +names match certain regular expressions as big. Ido won't attempt to +list the contents of such directories when completing file names. + ** map.el *** Now also understands plists. *** Now defined via generic functions that can be extended via 'cl-defmethod'. diff --git a/lisp/ido.el b/lisp/ido.el index 08540145815..1a3a384ae6b 100644 --- a/lisp/ido.el +++ b/lisp/ido.el @@ -735,6 +735,14 @@ not provide the normal completion. To show the completions, use \\[ido-toggle-i (integer :tag "Size in bytes" 30000)) :group 'ido) +(defcustom ido-big-directories nil + "List of directory pattern strings that should be considered big. +Ido won't attempt to list the contents of directories matching +any of these regular expressions when completing file names." + :type '(repeat regexp) + :group 'ido + :version "27.1") + (defcustom ido-rotate-file-list-default nil "Non-nil means that Ido will always rotate file list to get default in front." :type 'boolean @@ -1743,13 +1751,16 @@ is enabled then some keybindings are changed in the keymap." ;; Return t if dir is a directory, but too big to show ;; Do not check for non-readable directories via tramp, as this causes a premature ;; connect on incomplete tramp paths (after entering just method:). - (let ((ido-enable-tramp-completion nil)) - (and (numberp ido-max-directory-size) - (ido-final-slash dir) - (not (ido-is-unc-host dir)) - (file-directory-p dir) - (> (file-attribute-size (file-attributes (file-truename dir))) - ido-max-directory-size)))) + (let ((ido-enable-tramp-completion nil) + (case-fold-search nil)) + (or (seq-some (lambda (regexp) (string-match-p regexp dir)) + ido-big-directories) + (and (numberp ido-max-directory-size) + (ido-final-slash dir) + (not (ido-is-unc-host dir)) + (file-directory-p dir) + (> (file-attribute-size (file-attributes (file-truename dir))) + ido-max-directory-size))))) (defun ido-set-current-directory (dir &optional subdir no-merge) ;; Set ido's current directory to DIR or DIR/SUBDIR diff --git a/test/lisp/ido-tests.el b/test/lisp/ido-tests.el index cb8f1d63069..c9736eb3ecf 100644 --- a/test/lisp/ido-tests.el +++ b/test/lisp/ido-tests.el @@ -25,6 +25,8 @@ ;;; Code: +(require 'ido) + (ert-deftest ido-tests--other-window-frame () "Verifies that Bug#26360 is fixed." (should-not ido-mode) @@ -44,4 +46,9 @@ (should (commandp #'ido-display-buffer-other-frame))) (ido-mode 0))) +(ert-deftest ido-directory-too-big-p () + (should-not (ido-directory-too-big-p "/some/dir/")) + (let ((ido-big-directories (cons (rx "me/di") ido-big-directories))) + (should (ido-directory-too-big-p "/some/dir/")))) + ;;; ido-tests.el ends here -- 2.39.5