自从知晓了 Org-roam 后, 我就一直都在使用 org-roam 来管理个人笔记.

然而, org-roam 有一个痛点, 那就是 sync 同步数据性能, 每次 Emacs 启动都要等待 Processing modified files... 同步, 如果笔记一旦多的时候, 那么就要等待 几秒 了…

所以, 我尝试了 Denote (denote.el) | Protesilaos Stavrou ….

denote 特点就是以 文件命名 来进行归类, 并且支持 OrgMarkdowntxt 格式, 看到文件名就大概知道这个文件的内容了.

然而, denote 虽然搜索 文件名 方式来快速查找, 但缺点是 无法搜索标题 , 所以 denote 大概率不适合碎片化笔记.

而且 denote 笔记之间 引用 或者 反引用 会自创方式, 比如:

[[denote:标识][描述]]

其中, 标识就是 文件名日期+时间, 这就与 org-roamID 有异曲同工之妙.

org-roamID 方式是 Org 本身自带的, 可以查看 :id: Hyperlinks (Org Mode Compact Guide)

所以, 竟然 denoteorg-roam 都有各自个缺点, 那么不妨将两者结合, 所以我得出结论是:

denote文件名标题 TagsOrg-roam :id: 三种方式结合, 然后使用 grep 这类搜索文本内容, 这样后期无论使用什么工具管理, 都离不开 标题 Tags 搜索.

三者作用:

  1. denote文件名 这样可以了解到大概文件的信息, 并且好归类

  2. org-roam :id:标题/文件 提供 引用/反引用 功能, 具体可见: Hyperlinks (Org Mode Compact Guide)

  3. 标题 Tags 为后期无论什么工具都能准确查找, 支持多种格式.

具体介绍(模板)

文件名方式可以参考 denote: Denote (denote.el) | Protesilaos Stavrou

文件 A 名称 20251008T110808--国庆总结__记录.org 文件内容大概如下:

 * 搜索的标题 A 并带有 Tags                                             :记录:
:PROPERTIES:
:ID:       d610e15a-270d-4d1a-81fe-57ffb9082c51
:END:

 * 不需要搜索的标题B
xxxxxx

[[id:d610e15a-270d-4d1a-81fe-57ffb9082c51][引用标题 A]]

其余文件大体相同, 然而 :id: 方式 引用/反引用 跳转只支持 Org 格式…

以后无论什么文件类型, 你都可以在标题处添加 :Tags: 方式, 这样就可以区别搜索了, 可以使用 consult-ripgrep 这类的工具搜索.

;; Org
(consult-ripgrep "/path/to/Dir" "^*.*?:.*?:$ ")
;; Markdown
(consult-ripgrep "/path/to/Dir" "^#.*?:.*?:$ ")

需要搜索的 标题 带有 :Tags: 是为了能准确搜索.

Markdown 格式:

# 标题A  :Tags1:

Txt 格式:

采用 Org 格式:

 * 标题 A                                                              :Tags1:

关于 Tags

如何正确使用 Tags 说明: How to Use Tags

关于 Org Tags 使用方式:

;; 添加一个总列表, 以后就可以使用 org-set-tags-command 选择了
(setq org-tag-alist '(("记录" . ?n) ("运动" . ?s) ("健康" . ?h) ("reference" . ?r) ("项目" . ?p) ("家庭" . ?f) ("个人" . ?y) ("写作" . ?w)))

Org-roam 配合使用

最终我还是选择了: org-roam 和 上面所述 三者 一起使用, 因为 org-roam 搜索 标题Tags+id 好用.

这里提供一些 org-roam 模板, 方便构建 文件名+标题+id 文件

(setq org-roam-capture-templates
        '(("d" "denote" plain"%?"
           :if-new (file+head "%^{目录|main|reference|articles}/%<%Y%m%dT%H%M%S>--${title}__%^{FileTags|记录|运动|健康|reference|项目|家庭|个人|写作}.org" "# -*- coding: utf-8-unix; -*-\n#+title: ${title}\n#+date: %T\n* ${title} :YourTags:\n记得剪切文件开头:ID:")
           :immediate-finish t
           :unnarrowed t)
          ("h" "home" plain"%?"
           :if-new (file+head "%<%Y%m%dT%H%M%S>--${title}__%^{FileTags|记录|运动|健康|reference|项目|家庭|个人|写作}.org" "# -*- coding: utf-8-unix; -*-\n#+title: ${title}\n#+date: %T\n* ${title} :YourTags:\n记得剪切文件开头:ID:")
           :immediate-finish t
           :unnarrowed t)
          ("b" "blog" plain"%?"
           :if-new (file+head "blog/%<%Y%m%dT%H%M%S>--${title}__%^{FileTags|记录|运动|健康|reference|项目|家庭|个人|写作}.zh-cn.org" "# -*- coding: utf-8-unix; -*-\n#+title: ${title}\n#+date: %T\n* ${title} :YourTags:\n记得剪切文件开头:ID:")
           :immediate-finish t
           :unnarrowed t)
          ))

总结

一句话总结就是: 标题Tags

这样既可以带有 Tags 区分归类, 又可以支持 区分搜索文本