递归地在org-agenda-files的顶级目录中添加.org文件需要很长时间



我正试图找到一种方法来快速递归通过每个子目录搜索org文件。我找到了几个解决方案(Elisp Cookbook和github上的几个解决方案),但它们不能处理我的现实世界的使用(数百个目录(和子目录)和数百个org文件)。它们似乎在我的系统上永远运行(Windows 7, max-lisp-eval-depth = 10000)。我的解决方法是手动将每个目录添加到我的组织议程列表中,但这很烦人,我知道我可能忘记了一些。如有任何建议,我将不胜感激。

还没有看到其他人发这个,所以我会发的。你试过加载"查找列表"库并使用它的"查找-lisp-查找-文件"函数吗?我在我的组织配置中添加了这些行,它可以工作,但它可能不适合您的性能要求:

(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

以下代码在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)))

如何将组织议程目录列表存储在一个文件中,当您知道目录结构已经更改并且您有一些时间时,您(自动)每隔一段时间更新一次。

例如,你可以这样写:

;; 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 generatedn"
     ";; 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来更新列表

从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 

输入C-hv org-agenda-files可以查看org-agenda-files的内容

有点晚了,可能不是你想要的答案,但我发现加快议程加载时间的唯一方法是不包括一些有数千个org文件的目录。

(setq org-directory "~/org/"
      my-agenda-dirs '("personal" "projects" "todos" "work")
      org-agenda-files (mapcan (lambda (x) (directory-files-recursively
                                             (expand-file-name x org-directory)
                                             ".org$"))
                               my-agenda-dirs))

本质上,我不是递归遍历整个org目录,而是递归遍历它的几个子目录。

我还在Emacs启动时尝试了"递归目录列表"。这只是一种期待被使用的方式。因此,尽量坚持使用有限数量的"根"目录来放置议程文件。

更好的是坚持"~/org",可能还有一些子目录,如"工作"one_answers"个人",就是这样。你可以把你的议程文件放在那里,并在里面有链接到你真正的项目根目录。

我知道,这不是最理想的,但我现在没有更好的。

相关内容

最新更新