branch: master
commit e71e4d21f5f9b5387667c1697cab3b87b2e14a76
Author: Oleh Krehel <[email protected]>
Commit: Oleh Krehel <[email protected]>
Speed up the default file sorting
* ivy.el (ivy-sort-file-function-default): Update.
(ivy--sorted-files): Update.
Turns out that calling `file-directory-p' in `cl-sort' is too expensive.
So when `ivy-sort-file-function' is `ivy-sort-file-function-default',
propertize all strings with whether they are directories or not.
When `ivy-sort-file-function' is something different,
e.g. `string-lessp', don't do propertizing since it also can be slow.
---
ivy.el | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/ivy.el b/ivy.el
index d52b4b9..3fa5d24 100644
--- a/ivy.el
+++ b/ivy.el
@@ -282,11 +282,11 @@ On error (read-only), call `ivy-on-del-error-function'."
(defun ivy-sort-file-function-default (x y)
"Compare two files X and Y.
Prioritize directories."
- (if (file-directory-p x)
- (if (file-directory-p y)
+ (if (get-text-property 0 'dirp x)
+ (if (get-text-property 0 'dirp y)
(string< x y)
t)
- (if (file-directory-p y)
+ (if (get-text-property 0 'dirp y)
nil
(string< x y))))
@@ -301,9 +301,12 @@ Directories come first."
(seq (all-completions "" 'read-file-name-internal)))
(if (equal dir "/")
seq
- (setq seq (cl-sort
- (delete "./" (delete "../" seq))
- ivy-sort-file-function))
+ (setq seq (delete "./" (delete "../" seq)))
+ (when (eq ivy-sort-file-function 'ivy-sort-file-function-default)
+ (setq seq (mapcar (lambda (x)
+ (propertize x 'dirp (file-directory-p x)))
+ (delete "./" (delete "../" seq)))))
+ (setq seq (cl-sort seq ivy-sort-file-function))
(dolist (dir ivy-extra-directories)
(push dir seq))
seq)))