不要将 org-roam-db-location 设置为 org-roam-directory / roam / org-roam.db

为了表示方便,假设将 org-roam-directory 设置为 “~/org/” 。

org-roam 默认会将数据库文件保存为 “~/org/org-roam.db”,但我偶然发现 “~/org/roam/org-roam.db” 也生成了结构相同的数据库,于是为了避免重复,就将 org-roam-db-location 设置为它了。

然后,我就发现每次重启 emacs,所有的 org-roam 文件索引都会完全丢失,表现为 C-c n r f 时,弹出的列表中没有任何文件。就算运行 org-roam-db-build-cache 指令,也无法找到。在使用过程中,当前编辑的 org 文件有可能会被添加到索引中。

后来发现,无论是否设置变量 org-roam-db-location,"~/org/roam/org-roam.db" 总是会生成,而且总是空的数据库,不知道 org-roam 生成这个东西是干什么的。猜测这个数据库是 org-roam 初始化时生成的垃圾文件,在生成数据库结构后会将这个文件复制到工作位置。而每次启动都会进行初始化导致该文件内容丢失。

最终,取消了 org-roam-db-location 配置,让其自然创建在 “~/org/” 目录之下,一切正常。

刚开始不知道这个原因,浪费许多时间去搜索,然而没有任何资料,难受。

1 个赞

我遇到过这个问题,配置是基于doom的。问题的根源是org-mode的loading的问题。默认org-roam会随org的load一起load。然后org-roam在load的时候会直接读org-directory的值来设置org-roam-db-location,然后roam发现指定的位置没有数据库,就建了一个空的。你的org的配置一般是用with-eval-after-load之类的东西确保load之后得以运行。此时org-directory被设置成了你自己设置的值,然后org-roam-db-location也被同时更新(更新到(concat org-directory "/org-roam.db"))。但因为之前建过空的数据库了,所以roam认为现在的org-roam-db-location应该能找到数据库,结果发现没有,所以导致了这个问题。

我的解决方案是二分了一下自己的配置,发现出问题的配置是一行use-package。涉及的具体package我记不得了,但肯定是跟org有关的。最后在use-package里加了一行:defer t,解决问题。核心原因就是不要让org-roam被提前load。

1 个赞

我用的也是 doom emacs,可能就是你所说的原因。 不过我的配置是在 ~/.doom.d/init.el 中启用

(doom!
;; ...
   (org +roam)
;; ...
)

有什么办法配置它吗?在哪里找 use-package?

不是说doom本身的配置,而是你自己的配置文件里,有没有正确设置org-directory,有没有正确设置org-roam-db-location。最重要的是有没有load/require/use-package任何可能load org的包,如果有,需要把它改成lazy-loading。

既然是基于doom,那么最简单的就是在packages.el 里加一句(unpin! org-roam)

因为是org-roam出问题,就该在org-roam这里解决嘛,不应该影响到其他包的加载,万一因为这个:defer t出现别的问题呢

EDIT: 以上是一派胡言

config.el里写use-package

这个和unpin!有什么关系……unpin!只能保证装org-roam的时候能装到最新版(我没用过unpin!,如果文档理解错了请指正)。问题不是org-roam,而是org-roam的配置的一些代码在doom的关于org的配置运行之前被执行了

是我没读文档想当然了…抱歉!

我遇到了类似的问题, 怎么改都不work…

正在用笨方法 直接抄Jethro Kuan的配置, 打算一点点改看什么地方出的问题

Jethro是org-roam的作者, 他也是用的doom emacs dots/.doom.d at master · jethrokuan/dots · GitHub

然后我发现Jethro 没有在init.el里用doom! (org+roam)的方式, 而是在package.el用 package! org-roam 来声明org-roam的

读取的应该是org-roam-directory吧,不是org-directory,如果真是这个逻辑,使用的是use-package加载的话,那么应该不用:defer t,而应该是用:init (setq org-roam-directory "~/org" org-roam-db-location "~/org/roam/org-roam.db")保证在org-roam加载之前org-roam-directoryorg-roam-db-location已经正确设置了。