-
-
Notifications
You must be signed in to change notification settings - Fork 339
Sort files by mtime
Wilfred Hughes edited this page Jul 11, 2016
·
3 revisions
This version can't sort directories, because when a file changes, its directory's mtime will not change.
(defun eh-ivy-sort-file-by-mtime (x y)
(let* ((x (concat ivy--directory x))
(y (concat ivy--directory y))
(x-mtime (nth 5 (file-attributes x)))
(y-mtime (nth 5 (file-attributes y))))
(if (file-directory-p x)
(if (file-directory-p y)
(time-less-p y-mtime x-mtime)
t)
(if (file-directory-p y)
nil
(time-less-p y-mtime x-mtime)))))
(add-to-list 'ivy-sort-functions-alist
'(read-file-name-internal . eh-ivy-sort-file-by-mtime))
This version use "recentf-list" to sort directory, if you view a file, the directory of this file will show first.
(recentf-mode 1)
(defun eh-ivy-return-recentf-index (dir)
(when (and (boundp 'recentf-list)
recentf-list)
(let ((files-list
(cl-subseq recentf-list
0 (min (- (length recentf-list) 1) 20)))
(index 0))
(while files-list
(if (string-match-p dir (car files-list))
(setq files-list nil)
(setq index (+ index 1))
(setq files-list (cdr files-list))))
index)))
(defun eh-ivy-sort-file-function (x y)
(let* ((x (concat ivy--directory x))
(y (concat ivy--directory y))
(x-mtime (nth 5 (file-attributes x)))
(y-mtime (nth 5 (file-attributes y))))
(if (file-directory-p x)
(if (file-directory-p y)
(let ((x-recentf-index (eh-ivy-return-recentf-index x))
(y-recentf-index (eh-ivy-return-recentf-index y)))
(if (and x-recentf-index y-recentf-index)
;; Directories is sorted by `recentf-list' index
(< x-recentf-index y-recentf-index)
(string< x y)))
t)
(if (file-directory-p y)
nil
;; Files is sorted by mtime
(time-less-p y-mtime x-mtime)))))
(add-to-list 'ivy-sort-functions-alist
'(read-file-name-internal . eh-ivy-sort-file-function))