orgmode tag 的含义,和用途

在使用了一段时间orgmode,对于他的各种使用都算是比较惊艳,capture捕获临时的想法,agenda 进行gtd 管理,等等,但是这个tag 我就说实话有点看不懂了

我能理解的部分是,他可以给文本内容进行分类我可以直观的看到某个类的各个headline,但是对于他的继承系统,和文件级别的tag就搞不懂了,不知道在什么场景会使用,并引用查看tag

请各位指导一下

1 个赞

tag 的继承其实就是如果你用大类去查找,是能找到子 tag 里的内容的。比如说,你有一个标题叫 acg,你有了一些子标签叫 anime, game, comic。那么你查 acg 就能全查到了。至于文件级别就是你有多个文件,每个文件是按不同的 topic 来分类的。用 org agenda 时,它并不会区分具体在哪个文件,这里你用文件 tag,就等于这个文件里所有的内容都被标记成这个分类了。也是方便查找用的。

1 个赞

感觉 tag 更接近于传统的笔记管理方法.

出现了全文检索之后, tag 不是那么重要了.

特别是现在的反向链接概念, 让笔记管理完全不同了.

tag做分类的目的应该是为了搜索内容更方便吗?当org文件数量达到一定量级后感觉应该并不可行,我现在 用的是sql语句模糊搜索

我觉得还是蛮方便的。一个条目可能有多个 tag,同时拥有这多个 tag 的数量有时就下去了,然后再加一点点关键词就很容易快速定义。还有主要目的并不一定是快速定位到某一个 item,有可能是某一些 item。想看看有哪些东西。

另外,关于 sql 那个,有个 org-ql 的包,用起来很方便。当然,和加进数据库后再查找速度肯定是没办法比的。

有意思的是,作为双链的代表,org roam也有两个函数,

image

用来添加文件级别的tag,虽然我不知道怎么能够看到就是了

比如我用org -roam 我是要把 org-roam-directory 也放到 org-agenda-files 里面才能 用到文件级别tag的功能,是这样吗?

不用放到 agenda 里,我上面的说法是指有这样一种用法罢了。正常来说所有 org tag 相关的函数都会处理文件 tag。当你多文件时就会比较有用。比如 org-contact 里,分类工作、家人这种,在 org-contacts 时就能列出来相关项。或者是用 org-ql 查多个文件/目录,比如常用于设置的 org-directory。 org-roam-node-find 原生好像是没有 tag 查找的功能,以前用 ivy 时记得好像补全里是能看到并过滤的,consult 也有第三方的支持的样子。org-roam-ui 也能用 tag 来查。

org roam 因为会有链接,所以可以用链接来正向表示层级关系。而 tag 就可以表示上下文关系。不同层级可能用相同的 tag,比如你某个文件里可能多个子 heading 用不同的 tag,但整个文件有一个统一的 tag,这个 tag 可能用到了其它文件内的 heading 里。这样,当你想找出所有这个 tag 的项目时,就有用了。 比方说,editor -> emacs 这样一个层级关系。而 emacs 可以打上 elisp 的文件标签。另外你又有一个 dev -> algo -> quicksort,这里你用 elisp 写了一份,你可以打上 elisp 的标签,这里你查 elisp 两个都能查到

不仅仅是搜索,这是一种选择机制,比如可以按tag 选择 TODO 条目,也有以在export 时排除或者 选择需要的tags

文件级别 tag 一个平凡的例子, 你有两个 agenda file, 一个 work, 一个 life. 然后你就可以只看 work (life), 或者排除 work (life).

打了 tag 方便 filter/narrow 搜索结果, 这可能是 tag 本质上唯一的作用. 具体怎么 filter/narrow 有不同的实现方案, 有些依赖于你的补全框架. org 本身自带的方案就是在 agenda files 的 tag 过滤. 如果你笔记多而且要在全笔记里打 tag, 那么迟早会抛弃这个方案, 因为开一次 agenda 要把全部 org 文件开一遍(而且所有 buffer 全都要走完一次开启 org mode 的全过程), 这个过程随着笔记增长的耗时增加是非常快的. 最终你可能直接用 ripgrep 实现搜索中的 tag 过滤, 或者用 roam 的建立的全笔记 db 来进行 tag 过滤

其实我难受的地方也是这个,目前只有三个agenda file ,每次开agenda都要全部打开,倒是速度上没什么影响,但是在dashboard的recent open file 会看到显示,但是我这就对我要看我真正的最近打开有了影响

org roam 有笔记级别的tag 搜索吗? 没有找到相关的函数调用啊?

有意思的是,这里面所有的和搜索其他文件的方法的前提是把全部文件打开,感觉这种级别的资源消耗很大,如果org roam 建立数据库的同时能建立tag相关的数据就好了,搜索某个tag 就能直接查看相关的node

无, 只是有 API 让你 query db, 理论上你想干啥都行, 可以自己写个搜索命令, 或者找有没有现成的(我不知道).

下面是我自己糊的:

(defun me/org-roam-node-find-by-tag ()
  (interactive)
    (let ((chosen-tag
	   (completing-read "filter by tag: "
			    (seq-uniq
			     (org-roam-db-query
			      [:select [tag]
				       :from tags ])))))
      (org-roam-node-find
       nil
       nil
       (lambda (node) (member chosen-tag (org-roam-node-tags node))))))
3 个赞

可以实现搜tag的。

另外在 roam 的语境下 tag 还可以表示直接将某 node 当成 tag,因为双链允许你看到所有引用了这个 node 的其他 node,相当于你用这个 node 标记了所有其他 node. 不过我个人从来不这么用,tag 是 tag,双链是双链,不想混淆.

总之单纯限定在 org 自身内的 tag 我的理解就是 gtd 专属的 tag,和 todo 是配套的,都是用来标记 gtd 项目的. todo 表示一个 node 状态需要变化(todo/defer/done),tag 表示一个不需要变化的稳定属性,比如给妈妈买东西的 shopping list 里你打上“妈妈”的 tag,你妈永远是你妈.

上面的用法假设了你的 agenda files 是很少的,几个或几十个,只是每个都可以很大而已. 就好比你随便用个 todo app 也不可能创建上千个 list.

在 gtd 范畴之外想将 org tag 利用为普通文件 tag,比如数学笔记 tag 数学,计算机笔记 tag 计算机. 这些笔记文件量日积月累会很大,我觉得 org 内部找不到好的解决方案,要靠第三方.

可以自己定制命令,

(defun my-blog-tags-view ()
  "Show all headlines for org files matching a TAGS criterion."
  (interactive)
  (let* ((org-agenda-files '("~/blog/"))
         (org-tags-match-list-sublevels nil))
    (call-interactively 'org-tags-view)))

这个本质上是把所有的文件都开一遍,然后在内存建立数据结构,开文件的这个时间消耗是我不能接收的,

像是org-roam 能够建立数据库,不知道能不能在在数据库中保存一个有关tag的数据库,只要我查找某个tag ,就能快速索引相关文件 查数据库文件,比直接查源文件要快好多