使用cookbook配方(http://www.emacswiki.org/emacs/ElispCookbook#toc59)在Emacs中行走目录树,或Walk up the directory tree处的解决方案非常慢。
是否可以通过find
或shell-command
使用Unix的call-process
,并在返回的列表中执行funcall
?
这个想法是否有任何缺点(对于大树可能有太多的内存消耗?),以及在elisp中这样做的惯用方法是什么,即用一些给定的参数调用find
并映射一个函数返回值?
我可以看到的一个可能的好处是shell进程可以异步启动,而进程启动时Emacs根本就不会停止。
答案 0 :(得分:1)
是的,您当然可以通过find
致电call-process
,然后逐行分割结果。请注意,使用walk-path
代替file-name-all-completions
和directory-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倍。