org roam capture notes as a node

本来希望用 org-roam-capture 定制一个模板把笔记捕捉成一个 node, 但是 org-roam-capture-template 好像只能把笔记 capture 为一个文件。想了下,既然 org roam v2 把有 ID 属性的 node 识别为一个节点,那用 org 原有的 capture 系统就好了。

(setq org-capture-templates
      '(("n" "NOTE" entry (file+headline "~/org/roam/notes.org" "NOTES")
	 "* %?\n  :PROPERTIES:\n  :ID:  %(org-id-uuid)\n  :CREATED:  %U\n  :CONTEXT:  %a\n:END:\n%i\n")))
3 个赞

遇到了和楼主一样的需求。我的解决方法是这样的:在(setq org-id-link-to-org-use-id 'create-if-interactive)后,不管哪个模板,只要在目标节点上按C-c l (org-store-link) /org-id-get-create就可以了,虽然多了一步,但是个人认为比较自由。

试了下楼主的方法,因为org-roam-db-update-on-save默认是t。如果用auto-save等自动保存的插件的话, capture后写慢了会有警告:Warning (org-roam): Node in xxxx has no title, skipping... Disable showing Disable logging

解决方法:

(defun my/org-capture-maybe-create-id ()
  (when (org-capture-get :create-id)
    (org-id-get-create)))
(add-hook 'org-capture-prepare-finalize-hook #'my/org-capture-maybe-create-id)

(setq org-capture-templates
      '(("n" "NOTE" entry (file+headline "~/org/roam/notes.org" "NOTES")
	 "* %?\n%i\n"
     :create-id t)))

我一般都是在 headline 上使用 M-x org-id-get-create RET ,有时也会在 headline 上 M-x org-roam-alias-add RET。来达到类似的效果!

强!才知道 org-capture 可以自定义属性

我是自己写了几个小函数来插入 node 节点,绑定了快捷键,没有用 capture 模板,模板限制又多语法又麻烦

(defun iso8601-format (time)
  "format time to iso8601 string with current timezone"
  (format-time-string "%FT%T%z" time nil))

(defun reverie-init-node ()
  "init org-roam headline node"
  (interactive)
  (progn (org-id-get-create)
         (org-entry-put nil "CREATED" (iso8601-format (current-time)))))

(defun reverie-brother-headline ()
  "insert same level headline node"
  (interactive)
  (progn (org-insert-heading-respect-content)
         (org-id-get-create)
         (org-entry-put nil "CREATED" (iso8601-format (current-time)))))

(defun reverie-child-headline ()
  "insert next level headline node"
  (interactive)
  (progn (org-insert-heading-respect-content)
         (org-do-demote)
         (org-id-get-create)
         (org-entry-put nil "CREATED" (iso8601-format (current-time)))))

效果是这样

:PROPERTIES:
:ID:       D41B546E-340E-44A4-B15B-4DB2A39B1DB8
:CREATED: 2021-08-07T03:10:28+0800
:END:
1 个赞

这个在 capture 的时候,如何确定是写到哪个 org 文件呢?

这个不能在capture里面用,只能在当前光标处执行,我觉得capture那套操作新建文件节点还行,新建其他节点太麻烦了,还不如直接定位过去执行命令

是的,我也不是很喜欢 org-capture 了,一是配置麻烦,二是每次 org-capture 会弹出窗口,容易破坏窗口布局。所以 gtd 记录待办的时候,我都是直接打开相应的 org 文件,只要把这些 org 文件提前加到书签,这样也不麻烦,然后再添加 TODO。