org-roam 附件管理遇到的问题

本人使用 org-roam 的过程中遇到了一个问题:在对某一个 headline 使用 org-store-link 后,这个 headline 下面的附件链接会失效。

示例:

某个文件原本长这样:

:PROPERTIES:
:ID:       E4EBB61D-1A0D-4118-AF0B-334E0211B04B
:END:
#+title: Foo

* Bar
[[attachment:filename]]

在对 Bar 这个 headline 使用 org-store-link 后,这个文件变成:

:PROPERTIES:
:ID:       E4EBB61D-1A0D-4118-AF0B-334E0211B04B
:END:
#+title: Foo

* Bar
:PROPERTIES:
:ID:       9979ee12-5f9d-467a-90f0-01ad3c4ba410
:END:
[[attachment:filename]]

[[attachment:filename]] 这个链接是根据 PROPERTIES 中的 ID 来解析的,但由于使用了 org-store-link 而使 Bar 这个 headline 有了 ID 这个属性,现在 [[attachment:filename]] 是根据 BarID 而不是这个文件的 ID 进行解析,就导致原来的这个附件链接失效了,大家有什么解决的办法吗?

通过在文件的 PROPERTIES 中添加 Dir 属性,可以使整个文件中的附件链接全部根据 Dir 这个属性进行解析 。我想要通过 templates 将文件的 Dir 设置为根据文件的 ID 解析得到的文件夹位置(即 .attach/E4/EBB61D-1A0D-4118-AF0B-334E0211B04B 这样的目录),但是我目前不清楚 org-roam 的 templates 要如何设定文件的 PROPERTIES(不是某个 headline 的) 以及如何在里面放入根据 ID 解析得到的文件夹位置。

可以设置 org-store-link 不创建新的 ID?

ID这个问题我最近从org-roam迁移到org-super-link的时候也发现了,org-roam虽然用了单个文件全局ID(直接写在文件最前面的ID),但是org-mode文档里面确明确写着ID必须在heading里面,而且org自带的ID创建相关函数里面看源码似乎确实都要求在heading里面,感觉org-roam是自己造了什么轮子。。

目前 org-roam 直接用 org-id-get-create 创建 ID 啊。

是的,不过我怀疑的是org-mode自己使用ID的时候只会检查heading下面的内容,考虑heading之外的ID似乎是org-roam的特性,不过我也不是非常确定。。。

顺便问一下,org-super-link 相比 org-roam 有何优点?

轻量化,没外部依赖,代价是功能很简单,就是创建link的时候自动插入一个反向的link,不过我就是因为用不到org-roam的全部功能才换的。

1 个赞

没用过附件操作,不过我感觉理论上org-roam只识别带id的heading (title肯定带),所以现在这样的表现可能是合理的,或者说之前你这个附件是被认为属于整个文档的,现在是属于这个heading的。解决办法感觉就是新建一个不带PROPERTY的heading,比如”* Attachment",或者把附件引用挪到*Bar上面

本人使用的是 doom-emacs,在 config.el 文件中添加入以下代码,即可在使用 org-roam-capture 创建新文件的时候自动在文件的 PROPERTIES 中添加 DIR 属性,格式为 :DIR: .attach/E4/EBB61D-1A0D-4118-AF0B-334E0211B04B。这样整个文件中所有的附件都会放在这个由文件 ID 生成的目录当中。

(use-package! org-attach
  :after org
  :config
  (add-hook! 'org-roam-capture-new-node-hook (org-entry-put (point) "DIR" (concat ".attach/" (org-attach-id-uuid-folder-format (org-id-get)))))
  )

创建的新文件长这样:

:PROPERTIES:
:ID:       E4EBB61D-1A0D-4118-AF0B-334E0211B04B
:DIR:      .attach/E4/EBB61D-1A0D-4118-AF0B-334E0211B04B
:END:
#+title: Foo

帮你 emacs -Q 了一下, org 原生可创建无 headline 文件的 id property, 并可以 follow 这个 id 的 id link

突然给我启发,对于每个roam文件插入的图片似乎也能这么管理。