From 26e44b1d5584a61da564b725396cbba0a0e919f7 Mon Sep 17 00:00:00 2001 From: Daniel Borchmann Date: Fri, 27 Oct 2017 20:47:34 +0200 Subject: [PATCH] [Helm] Speed up recursive directory traversal in helm shortcut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By copying and adapting the code of ‘directory-files-recursively’ --- site-lisp/db-utils.el | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/site-lisp/db-utils.el b/site-lisp/db-utils.el index 657973e..f1146e8 100644 --- a/site-lisp/db-utils.el +++ b/site-lisp/db-utils.el @@ -291,15 +291,32 @@ If FILE is not given, prompt for one." :type 'string) (defun db/important-documents () - "Recursively return paths of all important documents found in `db/important-documents-path’." - (when (file-directory-p db/important-documents-path) - (delete-if ; FIXME: dump, make better - (lambda (spec) - (eq ?. (elt (car spec) 0))) - (mapcar (lambda (path) - (cons (string-remove-prefix db/important-documents-path path) - path)) - (directory-files-recursively db/important-documents-path ""))))) + "Recursively return paths of all files found in `db/important-documents-path’. +The result will be a list of cons cells, where the car is the +path relative to `db/important-documents’ and the cdr is the full +path." + ;; code adapted from `directory-files-recursively’ + (cl-labels ((all-files-in-dir (dir) + (let ((result nil) + (files nil)) + (dolist (file (sort (file-name-all-completions "" dir) + 'string<)) + (unless (eq ?. (aref file 0)) ; omit hidden files + (if (directory-name-p file) + (let* ((leaf (substring file 0 (1- (length file)))) + (full-file (expand-file-name leaf dir))) + ;; Don't follow symlinks to other directories. + (unless (file-symlink-p full-file) + (setq result + (nconc result (all-files-in-dir full-file))))) + (push (cons + (string-remove-prefix db/important-documents-path + (expand-file-name file dir)) + (expand-file-name file dir)) + files)))) + (nconc result (nreverse files))))) + (when (file-directory-p db/important-documents-path) + (all-files-in-dir db/important-documents-path)))) (defun db/system-open (path) "Open PATH with default program as defined by the underlying system."