]> code.delx.au - gnu-emacs-elpa/commitdiff
Speed up the default file sorting
authorOleh Krehel <ohwoeowho@gmail.com>
Mon, 20 Apr 2015 09:37:44 +0000 (11:37 +0200)
committerOleh Krehel <ohwoeowho@gmail.com>
Mon, 20 Apr 2015 09:37:44 +0000 (11:37 +0200)
* 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

diff --git a/ivy.el b/ivy.el
index d52b4b9cc88807f69547ea07b262bf2dba70eb70..3fa5d2421d6a93e448324b7c635f3e05cf8ea2e9 100644 (file)
--- 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)))