更快的Emacs目录walker

时间:2014-09-13 12:06:58

标签: emacs elisp

使用cookbook配方(http://www.emacswiki.org/emacs/ElispCookbook#toc59)在Emacs中行走目录树,或Walk up the directory tree处的解决方案非常慢。

是否可以通过findshell-command使用Unix的call-process,并在返回的列表中执行funcall

这个想法是否有任何缺点(对于大树可能有太多的内存消耗?),以及在elisp中这样做的惯用方法是什么,即用一些给定的参数调用find并映射一个函数返回值?

我可以看到的一个可能的好处是shell进程可以异步启动,而进程启动时Emacs根本就不会停止。

1 个答案:

答案 0 :(得分:1)

是的,您当然可以通过find致电call-process,然后逐行分割结果。请注意,使用walk-path代替file-name-all-completionsdirectory-files可以显着提高file-directory-p效率:

(defun my-walk-directory (dir action)
  "walk DIR executing ACTION with (dir file).
DIR needs to end with /."
  (dolist (file (let ((completion-ignored-extensions nil)
                      (completion-regexp-list nil))
                  (file-name-all-completions "" dir)))
    (cond
     ((member file '("./" "../")) nil)
     ((eq ?/ (aref file (1- (length file)))) (my-walk-directory (concat dir file) action))
     (t (funcall action dir file)))))

当然,它仍然没有find那么快,但根据我的经验,这比使用目录文件和文件目录-p快10倍。