我试图找到一种快速递归搜索org文件的每个子目录的方法。我找到了几个解决方案(Elisp Cookbook,以及solutions上的几个github),但它们无法处理我的实际使用情况(数百个目录(和子目录))和数百个组织文件)。它们似乎永远在我的系统上运行(Windows 7,max-lisp-eval-depth = 10000)。我的工作是手动将每个目录添加到我的org-agenda-list,但它很烦人,我知道我可能已经忘记了一些。任何建议将不胜感激。
答案 0 :(得分:3)
以下代码适用于emacs 24.3 +:
;; Collect all .org from my Org directory and subdirs
(setq org-agenda-file-regexp "\\`[^.].*\\.org\\'") ; default value
(defun load-org-agenda-files-recursively (dir) "Find all directories in DIR."
(unless (file-directory-p dir) (error "Not a directory `%s'" dir))
(unless (equal (directory-files dir nil org-agenda-file-regexp t) nil)
(add-to-list 'org-agenda-files dir)
)
(dolist (file (directory-files dir nil nil t))
(unless (member file '("." ".."))
(let ((file (concat dir file "/")))
(when (file-directory-p file)
(load-org-agenda-files-recursively file)
)
)
)
)
)
(load-org-agenda-files-recursively "/path/to/your/org/dir/" ) ; trailing slash required
它不需要创建中间文件,也可以将它放在快捷方式上。
为了能够重新发现任何找到的文件,请添加:
(setq org-refile-targets
'((nil :maxlevel . 3)
(org-agenda-files :maxlevel . 1)))
答案 1 :(得分:3)
Haven没有看到其他人发布这个,所以我会这样做。 你试过加载" find-list"库并使用它的" find-lisp-find-files"功能? 我在我的org配置中添加了这些行并且它可以工作,但它可能不符合您的性能要求:
(load-library "find-lisp")
(setq org-agenda-files
(find-lisp-find-files "FOLDERNAME" "\.org$"))
来源:http://emacs-orgmode.gnu.narkive.com/n5bQRs5t/o-multiple-recursive-directories-with-org-agenda-files
答案 2 :(得分:1)
如果知道direcory结构已经改变并且你有一些时间,那么将org-agenda目录列表存储在你每隔一段时间(自动)更新的文件中怎么样呢。
例如,您可以使用以下内容:
;; From http://www.emacswiki.org/emacs/ElispCookbook#toc58
(defun directory-dirs (dir)
"Find all directories in DIR."
(unless (file-directory-p dir)
(error "Not a directory `%s'" dir))
(let ((dir (directory-file-name dir))
(dirs '())
(files (directory-files dir nil nil t)))
(dolist (file files)
(unless (member file '("." ".."))
(let ((file (concat dir "/" file)))
(when (file-directory-p file)
(setq dirs (append (cons file
(directory-dirs file))
dirs))))))
dirs))
(setq my-org-agenda-root "~/org")
(setq my-org-agenda-files-list "~/.emacs.d/org-agenda-list.el")
(defun my-update-org-agenda-files ()
"Create or update the `my-org-agenda-files-list' file.
This file contains elisp code to set `org-agenda-files' to a
recursive list of all children under `my-org-agenda-root'. "
(interactive)
(with-temp-buffer
(insert
";; Warning: this file has been automatically generated\n"
";; by `my-update-org-agenda-files'\n")
(let ((dir-list (directory-dirs my-org-agenda-root))
(print-level nil)
(print-length nil))
(cl-prettyprint `(setq org-agenda-files (quote ,dir-list))))
(write-file my-org-agenda-files-list)))
(load my-org-agenda-files-list)
每隔一段时间,运行 M-x my-update-org-agenda-files
来更新列表。
答案 3 :(得分:0)
我还在Emacs启动时尝试了“递归目录列表”。它只是让loooong可用的方式。因此,尝试坚持使用有限数量的“根”目录放置您的议程文件。
更好的是坚持使用“〜/ org”,可能还有一些像“工作”和“个人”这样的子目标,就是这样。您可以将您的议程文件放在那里,并将它们内部链接到您真实的项目根目录。
我知道,这不是最佳选择,但我现在没有更好的东西。
答案 4 :(得分:0)
从Emacs 25开始,您可以使用directory-files-recursively
从根目录返回所有与正则表达式匹配的文件。
(defun org-get-agenda-files-recursively (dir)
"Get org agenda files from root DIR."
(directory-files-recursively dir "\.org$"))
(defun org-set-agenda-files-recursively (dir)
"Set org-agenda files from root DIR."
(setq org-agenda-files
(org-get-agenda-files-recursively dir)))
(defun org-add-agenda-files-recursively (dir)
"Add org-agenda files from root DIR."
(nconc org-agenda-files
(org-get-agenda-files-recursively dir)))
(setq org-agenda-files nil) ; zero out for testing
(org-set-agenda-files-recursively "~/Github") ; test set
(org-add-agenda-files-recursively "~/Dropbox") ; test add
您可以通过键入org-agenda-files
来查看C-hv org-agenda-files
的内容。