如何自动在议程列表中添加文件夹下的所有组织文件?

Zoe*_*owa 35 emacs org-mode

我正在使用org-mode来编写笔记和组织议程来组织所有笔记,特别是搜索一些信息.按关键字或标签.

Cc am可以通过标签inputed搜索一些文件,Cc按关键字搜索,org-agenda中的那些功能很好用,但是,我需要手动将org-file添加到议程列表中.

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

(setq org-agenda-files (list "path/folder/*.org"))
Run Code Online (Sandbox Code Playgroud)

要么

(setq org-agenda-files (file-expand-wildcards "path/folder/*.org"))
Run Code Online (Sandbox Code Playgroud)

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

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

suv*_*ayu 64

只需命名目录即可.例如,这对我很有用:

(setq org-agenda-files '("~/org"))
Run Code Online (Sandbox Code Playgroud)

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

(setq org-agenda-text-search-extra-files
      '(agenda-archives
        "~/org/subdir/textfile1.txt"
        "~/org/subdir/textfile1.txt"))
Run Code Online (Sandbox Code Playgroud)

编辑:(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)))))))
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

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

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

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

  • 哇〜非常好!指定目录就足够了.目前,我知道我犯了什么错误导致问题.正确的.emacs允许**(setq org-agenda-files ..)**的一个案例,如果想要在议程文件中添加多个文件夹,它应该添加第一个目录旁边的目录,所有目录放一起在唯一的代码上,像这样**(setq org-agenda-files"**= directory1 =**""**= directory2 =**"..)**非常感谢你. (2认同)
  • 我已经在我的设置中多次检查过它,它运行良好。你一定是做错了什么。你也没有提供足够的信息让我做出有根据的猜测。 (2认同)

Min*_*ang 12

有一种更简单的方法可以对org文件进行递归搜索:

(load-library "find-lisp")
(setq org-agenda-files
   (find-lisp-find-files "FOLDERNAME" "\.org$"))
Run Code Online (Sandbox Code Playgroud)

我在我的org配置中添加了这些行,它只是起作用.

(我不是ELisp或emacs的专家,只是刚刚从Vim转换为Spacemacs的普通用户)

  • 发现了类似的方式:`(setq org-agenda-files(directory-files-recursively"〜/ org /""​​\.org $"))`,不需要`load-library` (9认同)
  • +1为@xiaobing的答案,使用emacs 25时,目录文件以递归方式很好地工作。但是请注意:组织文件的正则表达式有错别字,因此请勿仅复制粘贴!当然,它应该是“ \\。org $” ... (4认同)