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

Emacs 如何将文件夹下的所有组织文件自动添加到议程列表中?,emacs,org-mode,Emacs,Org Mode,我使用组织模式写笔记,组织议程来组织所有笔记,特别是搜索一些信息。按关键字或标记 C-C a m可以通过输入的标签搜索一些文件,C-C a s通过关键字,这些来自组织议程的功能可以很好地利用,但是,我需要手动将组织文件添加到议程列表中 我在.emacs中添加了一些代码,例如 (setq org-agenda-files (list "path/folder/*.org")) 或 但是,两者都未能自动将指定文件夹下的文件添加到议程列表中,因此我无法在这些组织文件中搜索关键字或标记,除非我打开一个

我使用组织模式写笔记,组织议程来组织所有笔记,特别是搜索一些信息。按关键字或标记

C-C a m可以通过输入的标签搜索一些文件,C-C a s通过关键字,这些来自组织议程的功能可以很好地利用,但是,我需要手动将组织文件添加到议程列表中

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

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

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


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

仅命名目录就足够了。例如,这对我来说非常有效:

(setq组织议程文件(“~/org”))
还可以查看
组织议程文本搜索额外文件
;它让您 添加仅包含在文本搜索中的额外文件。典型值可能为 是,

(setq组织议程文本搜索额外文件
"(议程档案)
“~/org/subdir/textfile1.txt”
“~/org/subdir/textfile1.txt”))
注意事项:如果在启动后将文件添加到目录中 Emacs,将不包括在内

编辑:(2018)要在额外文件列表中包含具有特定扩展名的所有文件,您可以尝试我以前编写的以下函数()

在提供的目录中递归查找.org文件 ;根据Emacs Lisp介绍示例修改 (以递归方式定义sa查找组织文件(&可选目录filext) “从目录中递归返回.org和.org_存档文件。 如果提供了FILEXT,则返回扩展名为FILEXT的文件。“ (交互式“D目录:”) (let*(组织文件列表) (大小写折叠搜索);文件系统区分大小写 (文件名regex“^[^.#].*)排除点、自动保存和备份文件 (filext(或filext“org$\\\\\\ org\u存档”)) (fileregex(格式为“%s\\.\\(%s$\\)”文件名regex filext)) (cur dir list(directory files directory t file name regex))) ;循环目录列表 (dolist(文件或目录cur dir list org file list);返回组织文件列表 (续) ((file-regular-p file或dir);常规文件 (如果(字符串匹配fileregex文件或目录);组织文件 (添加到列表“组织文件列表文件或目录”)) ((file-directory-p file或dir) (dolist(org file(sa递归查找org file file或dir filext) 组织文件列表);将找到的文件添加到结果 (添加到列表“组织文件列表组织文件(()()()))”) 您可以这样使用它:

(setq组织议程文本搜索额外文件
(追加(sa递归查找组织文件“~/org/dir1/”txt”)
(sa递归查找组织文件“~/org/dir2/”tex”))

编辑:(2019)正如@mingwei zhang的回答和@xiaobing的评论中提到的,
find lisp find files
,from
find lisp
directory files recursive
也提供了此功能。但是,请注意,在这些情况下,文件名参数是(贪婪的)类似于
(目录文件递归“~/mydir”“org”)
的东西会给你所有的组织文件,包括备份文件(
*.org~
)。要只包括
*.org
文件,你可以使用
(目录文件递归“~/mydir”“org$”
,有一种简单的方法可以递归搜索组织文件(礼貌):

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

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

对于Emacs来说,看起来你做的是正确的——这只是一个相对路径问题吗?你能试着用完整路径做同样的事情吗?或者,你正在运行服务器而没有重新评估适当的命令吗?我已经用完整路径和相对路径试过了。现在,我知道了导致这个问题的原因,因为希望多个文件夹包含议程文件。我制作了两个case=setq org agenda file(…)=,导致函数无效。非常感谢您的话。哇~eaxtly!指定目录就足够了。目前,我知道我犯了什么错误导致了问题。正确地说,emacs允许一个案例(setq org agenda files…),如果要在议程文件中添加多个文件夹,则应在第一个文件夹旁边添加目录,所有目录都放在唯一代码上,如下所示(setq org agenda files“=directory1=”“=directory2=“…)非常感谢。此外,我真的很喜欢用emacs组织所有类型的文本文件,你的代码也很有用,似乎除了.org以外的文本文件只有在我们将它们逐个分配到.emacs后才能添加到议程文件中。有没有方便的方法将文件夹下的所有tex-files、.txt;.doc;.tex指向议程文件?比如我们上面提到的组织文件案例?再次感谢您的指导。我尝试了您的代码,但emacs显示了错误消息,Symbol的函数定义无效:递归查找组织文件我在
(append
)之前添加了一个
(setq组织议程文本搜索额外文件)(append(递归查找组织文件…
错误消息消失,我用C-C/搜索关键字,emacs回答:错误的类型参数:arrayp,append有什么重要的东西我遗漏了吗?我在设置中多次检查它,它工作得很好。你一定是做错了什么。你没有给我足够的信息也可以做一个有根据的猜测。@XiangJi谢谢。事实上应该是
sa-*
。我更改了几次函数。我想我没有升级
(setq org-agenda-files (directory-files-recursively "~/org/" "\\.org$"))
(setq org-agenda-files 
      (seq-filter (lambda(x) (not (string-match "/daily/"(file-name-directory x)))) 
       (directory-files-recursively "~/Notes/roam" "\\.org$")
       ))
(load-library "find-lisp")
(setq org-agenda-files
   (find-lisp-find-files "FOLDERNAME" "\.org$"))