自动将当前文件夹的 org file 加到 agenda 中

各位,我现在使用 org mode 作为笔记工具,我的笔记保存在一个 github repo 中,会在不同的电脑上使用。我希望能将这个 repo 所有的 org file 自动加入 agenda 中。 0. org mode 的 repo 可能会 clone 到不同的文件夹中;

  1. 我的 emacs 配置也是在一个 github repo 中,希望所有的配置保持一致;

我现在的思路是通过配置 .dir-locals.el 来实现。

(("." . ((org-agenda-files . '("~/repos/passenger")))))

但是这行配置没有生效,~/repos/passenger 下的 org file 并没有加到 agenda 中。请问这是什么原因?有什么方案可以解决我的需求?

.dir-locals.el 文件是当这个目录下的文件被访问时才会被执行的,你的需求更适合的可能是写在 custom.el 文件里。

custom.el 在不同的电脑上使用不同的配置。

我的目录结构如下:

$ tree -L 1 -a
.
├── .dir-locals.el
├── .git
├── .gitignore
├── README.md
└── notes

其中 notes 包含了所有的 org file。访问 notes/xxx/yyy.org 不会执行 .dir-locals.el?

PS: custom.el 的方案我会去尝试,谢谢指教。

我现在用的方法是在org文件中加个tag,有这个tag的文件自动加入到org-agenda中。你看看你能用不?论坛中搜dynamic agenda,有个人写了个配置,或者google搜也有个。 手机回,不方便找,你自己搜下。要是符合你的要求,明天给你找下链接。

这个是会执行的。

但是 .dir-locals.el 里的设置是仅对当前目录生效的,也就是在访问这个目录或子目录下的文件时,针对此文件的 buffer 生效的。

可以理解为

(setq-local org-agenda-files '("~/repo/passenger"))

你可以用 C-h v 查看、对比一下在访问 yyy.org 时的 org-agenda-files 的值和在 *scratch* buffer 时是否一样。

因为 M-x org-agenda 时读取的 org-agenda-files 是全局的那个,而非 yyy.org 里的 org-agenda-files, 所以就无法生效。

如果一定要使用 .dir-locals.el 的方式来实现的话,相当于在 .dir-locals.el 里要放一个

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

当然这种格式是不合法的, .dir-locals.el 在加载时会报错。

应该是这个吧:集成org-roam和任务管理

有点奇怪,它在访问 yyy.org 和在 *scratch* 下都是 nil

Btw, 我的 .dir-locals.eladd-dir-local-variable 生成的,格式是正确的。

试一下这个格式

((nil . ((org-agenda-files . '("~/repos/passenger")))))

这个方案也行不通:当它访问目录的文件时, org-agenda-files 的值是我设置的值。但是在 agenda buffer 里面,这个值是空的。

这个是肯定的,.dir-locals.el 就是这个功能。

其实你完全可以把笔记保存在一个相对 .emacs.d 的目录,然后在 emacs 里操作,比如:

(defvar my-notes-dir (expand-file-name "notes" user-emacs-directory))

(defun my/clone-notes()
  (interactive)
  (magit-clone-internal "repo url" my-notes-dir ))

1 个赞

其实 集成org-roam和任务管理 这个方案也听到的(记得把里面的 union 改成 cl-union 的),但是一个 thread 只能设置一个解决方案。

https://d12frosted.io/posts/2021-01-16-task-management-with-roam-vol5.html

我现在用的是这个。org-gtd管理几个固定的org-agenda-files,其他的动态的加入到这个list里面。