58

我使用 org-mode 来写笔记和 org-agenda 来组织所有笔记,尤其是搜索一些信息。通过关键字或标签。

抄送我可以通过输入的标签搜索一些文件,抄送作为关键字,来自org-agenda的那些功能很好用,但是,我需要手动将org-file添加到议程列表中。

我在.emacs中添加了一些代码,例如

(setq org-agenda-files (list "path/folder/*.org"))

或者

(setq org-agenda-files (file-expand-wildcards "path/folder/*.org"))

但是,两者都未能自动将指定文件夹下的文件添加到议程列表中,因此我无法在这些组织文件中搜索关键字或标签,除非我打开一个组织文件并键入Cc [将其添加到议程中-列表。

如何使文件夹下的所有组织文件自动添加到议程中?

4

2 回答 2

86

只需命名目录就足够了。例如,这对我很有用:

(setq org-agenda-files '("~/org"))

也看看org-agenda-text-search-extra-files; 它允许您添加仅包含在文本搜索中的额外文件。一个典型的值可能是,

(setq org-agenda-text-search-extra-files
      '(agenda-archives
        "~/org/subdir/textfile1.txt"
        "~/org/subdir/textfile1.txt"))

警告:如果您在启动 Emacs 后将文件添加到目录中,则不会包含该文件。

编辑:(2018)要将具有特定扩展名的所有文件包含在额外文件列表中,您可以尝试以下我写过的函数(此处可能提供更新的版本)。

;; recursively find .org files in provided directory
;; modified from an Emacs Lisp Intro example
(defun sa-find-org-file-recursively (&optional directory filext)
  "Return .org and .org_archive files recursively from DIRECTORY.
If FILEXT is provided, return files with extension FILEXT instead."
  (interactive "DDirectory: ")
  (let* (org-file-list
         (case-fold-search t)         ; filesystems are case sensitive
         (file-name-regex "^[^.#].*") ; exclude dot, autosave, and backupfiles
         (filext (or filext "org$\\\|org_archive"))
         (fileregex (format "%s\\.\\(%s$\\)" file-name-regex filext))
         (cur-dir-list (directory-files directory t file-name-regex)))
    ;; loop over directory listing
    (dolist (file-or-dir cur-dir-list org-file-list) ; returns org-file-list
      (cond
       ((file-regular-p file-or-dir)             ; regular files
        (if (string-match fileregex file-or-dir) ; org files
            (add-to-list 'org-file-list file-or-dir)))
       ((file-directory-p file-or-dir)
        (dolist (org-file (sa-find-org-file-recursively file-or-dir filext)
                          org-file-list) ; add files found to result
          (add-to-list 'org-file-list org-file)))))))

你可以像这样使用它:

(setq org-agenda-text-search-extra-files
      (append (sa-find-org-file-recursively "~/org/dir1/" "txt")
              (sa-find-org-file-recursively "~/org/dir2/" "tex")))

编辑:(2019)正如@mingwei-zhang 的回答和@xiaobing 的评论中提到的,find-lisp-find-files来自find-lisp并且directory-files-recursively也提供了这个功能。但是,请注意在这些情况下,文件名参数是(贪婪的)正则表达式。所以类似的东西(directory-files-recursively "~/my-dir" "org")会给你所有的组织文件,包括备份文件(*.org~)。要仅包含*.org文件,您可以使用(directory-files-recursively "~/my-dir" "org$").

于 2012-07-08T16:54:18.047 回答
36

递归搜索 org 文件有一种更简单的方法(由@xiaobing提供):

(setq org-agenda-files (directory-files-recursively "~/org/" "\\.org$"))

编辑:您还可以通过添加数组过滤器从查找中过滤掉某些目录。例如,过滤掉xxxx/xxx/daily/目录中的所有 org 文件:

(setq org-agenda-files 
      (seq-filter (lambda(x) (not (string-match "/daily/"(file-name-directory x)))) 
       (directory-files-recursively "~/Notes/roam" "\\.org$")
       ))

对于 Emacs <25,您可以使用find-lisp-find-files

(load-library "find-lisp")
(setq org-agenda-files
   (find-lisp-find-files "FOLDERNAME" "\.org$"))
于 2017-01-31T23:40:02.230 回答