自从知晓了 Org-roam 后, 我就一直都在使用 org-roam 来管理个人笔记.
然而, org-roam 有一个痛点, 那就是 sync 同步数据性能, 每次 Emacs 启动都要等待 Processing modified files... 同步, 如果笔记一旦多的时候, 那么就要等待 几秒 了…
所以, 我尝试了 Denote (denote.el) | Protesilaos Stavrou ….
denote 特点就是以 文件命名 来进行归类, 并且支持 Org 和 Markdown 和 txt 格式, 看到文件名就大概知道这个文件的内容了.
然而, denote 虽然搜索 文件名 方式来快速查找, 但缺点是 无法搜索标题 , 所以 denote 大概率不适合碎片化笔记.
而且 denote 笔记之间 引用 或者 反引用 会自创方式, 比如:
[[denote:标识][描述]]
其中, 标识就是 文件名 的 日期+时间, 这就与 org-roam 的 ID 有异曲同工之妙.
org-roam 的 ID 方式是 Org 本身自带的, 可以查看 :id: Hyperlinks (Org Mode Compact Guide)
所以, 竟然 denote 和 org-roam 都有各自个缺点, 那么不妨将两者结合, 所以我得出结论是:
denote文件名 和 标题 Tags 和 Org-roam :id: 三种方式结合, 然后使用 grep 这类搜索文本内容, 这样后期无论使用什么工具管理, 都离不开 标题 Tags 搜索.
三者作用:
denote文件名这样可以了解到大概文件的信息, 并且好归类org-roam :id:为标题/文件提供引用/反引用功能, 具体可见: Hyperlinks (Org Mode Compact Guide)标题 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 区分归类, 又可以支持 区分搜索文本