这么多年了,Org-mode 的 Tag 一直不进化,让人用不下去。而且,用 Agenda 来过滤标签,很快就陷进性能瓶颈。
这两天看了 Tana 的介绍视频,以及详细地了解了 Tana 的 SuperTag 机制。
觉得可以基于 Org-mode 基础特性,实现类似 Tana 的 SuperTag 机制。
该包暂时命名为 org-supertag。我会在这里记录关于该包的思考。
这么多年了,Org-mode 的 Tag 一直不进化,让人用不下去。而且,用 Agenda 来过滤标签,很快就陷进性能瓶颈。
这两天看了 Tana 的介绍视频,以及详细地了解了 Tana 的 SuperTag 机制。
觉得可以基于 Org-mode 基础特性,实现类似 Tana 的 SuperTag 机制。
该包暂时命名为 org-supertag。我会在这里记录关于该包的思考。
SuperTag 的机制:
Node。是 Tana 的基本信息单位,基本上一个圆点+一段字符,就是一个 Node。每个 Node 都可以单独展开为独立的页面。
SuperTag。Node 因 SuperTag 而变得不同。没有了 SuperTag 的 Node 就是一个圆点+一个字符。
Field。是 SuperTag 机制的核心,扮演 3 个角色:记录属性,命令触发器,AI 启动器。
纵览以上,可以发现,Org-mode 已经实现大部分 Tana 的基础特性:
目前,我已经简单的实现了 Field 的 “记录属性” 的特性:
AI 命令 是啥?
一个触发机制,一个 Node 和一个记录了 AI Prompt 的 SuperTag 组合。
此时,可以将 SuperTag 当作按钮,点击后,AI 会自动将 Node 当作输入,然后自动输出内容。
跟你在聊天窗口里的效果差不多。
换言之,此时的 Node 变成了一个可执行的对象。
org-supertag 的第一个应用场景,就是阅读 org-mode 的更新说明。
每一次读起来都非常头痛,完全不结构化。
同一个 org-store-link 的更新说明,散落在不同的地方…
非常需要用 org-supertag 标记好,然后再汇总输出
org-supertag 的数据结构
有点头痛,到底是 哈希表 只用于储存映射关系,还是用 哈希表 储存所有相关的数据?
最终决定,使用 中间表 + 分表 的方式。以适应 org-supertag 多数据实体(file、tag、field、node),多种关系(一对多,多对一),以及未来可能针对新的功能,所预留的拓展性。
简单验证 org-element-cache 机制,可以完整读取 org-headline 以及它下方的内容,以及分辨出不同 org-headline 下方内容的不同
Org Element Cache Test Results
==========================
=== Version Info ===
(:org-version "9.7.11" :cache-implementation avl-tree- :features
(:has-cache-reset t :has-cache-reset-all nil :has-cache-statistics
nil))
=== Node Content ===
(:element
(headline
(:standard-properties
[1 1 24 140 140 0 (:title) first-section element t nil 60 138 1 #<buffer *Org
Element Cache Test*> nil nil
(org-data
(:standard-properties
[1 1 1 262 262 0 nil org-data nil t nil 3 262 nil #<buffer *Org Element
Cache Test*> nil nil nil]
:path nil :CATEGORY nil))]
:pre-blank 0 :raw-value "Test Headline" :title
[org-element-deferred org-element-property-2 (:raw-value) nil] :level 1
:priority nil :tags ("test") :todo-keyword nil :todo-type nil
:footnote-section-p
[org-element-deferred org-element--headline-footnote-section-p nil nil]
:archivedp [org-element-deferred org-element--headline-archivedp nil nil]
:commentedp nil :CUSTOM_ID "test1"))
:headline "Test Headline" :tags ("test") :properties
(("CATEGORY" . "???") ("CUSTOM_ID" . "test1") ("BLOCKED" . "")
("ALLTAGS" . ":test:") ("TAGS" . ":test:") ("FILE") ("PRIORITY" . "B")
("ITEM" . "Test Headline"))
:content
":PROPERTIES:\n:custom_id: test1\n:END:\nSome content here.\n\n** Subheading\n- List item 1\n- List item 2\n - Subitem 2.1\n\n"
:full-text
"* Test Headline :test:\n:PROPERTIES:\n:custom_id: test1\n:END:\nSome content here.\n\n** Subheading\n- List item 1\n- List item 2\n - Subitem 2.1\n\n")
=== Subtree Parse ===
((:type headline :raw-value "Test Headline" :tags ("test") :level 1)
(:type property-drawer :properties nil)
(:type headline :raw-value "Subheading" :tags nil :level 2)
(:type plain-list :items nil) (:type item :bullet "- " :paragraph nil)
(:type item :bullet "- " :paragraph nil) (:type plain-list :items nil)
(:type item :bullet "- " :paragraph nil))
=== Field Value ===
(:field "custom_id" :value "test1" :begin 37 :end 54)
=== Cache Status ===
(:enabled t :cache-info (:type avl-tree :size 11) :statistics
"Statistics not available")
=== Cache Invalidation ===
(:invalidated-region (1 . 140) :cache-status
(:enabled t :cache-info (:type avl-tree :size 11)
:statistics "Statistics not available"))
期待,大佬预计什么时候发布一个beta版本
重构中…zsbd
支持多级标签么
多级标签是指?父子标签?
也就是层级标签,例如
一篇笔记可以同时属于 #emacs/elisp
和 #emacs/elisp
,也可以只属于 #emacs
哦,这种,父子标签是可以同时添加到一个笔记(或者一个 org-headline)
我看了一下现在的实现,可能和你的想法有出入:
可以多标签筛选就可以了,标签多层级个人认为是一种负担。
你提到的标签命名也是一种变相的实现方法。
这个功能在计划内