分享:有没有为org-mode中的标题创建固定id的

发现我在把 org当成html用 的路上越走越远……

在html里,div如果需要更新数据,我们通常会为div创建一个不重复的唯一id。在js取到数据后根据div id动态更新数据。

org的标题行嵌套展开和div的层层嵌套是相似的,只不过大部分的org文件都是纯手工写的,估计少有人会想去自动更新,都是手动更新,也就不需要id

只要约定一些规则,就可以在正常做笔记(手动修改org文件内容)与自动做笔记(其它程序修改org文件内容)间不冲突(但不能同时进行)。

因为不需要唯一id完整的显示出来,在org标题上隐藏就好(可能较长),于是我用了链接的方式(也想不出其它办法来隐藏id) 像下面的样子

*** 一二三四五 [[id值可能较长][id]]
自动添加自动更新的内容
# 手动添加手动更新的内容

org-id-get-or-create 不知道是不是你想要的

org-id-get-create is an interactive compiled Lisp function in
‘org-id.el’.

(org-id-get-create &optional FORCE)

Create an ID for the current entry and return it.
If the entry already has an ID, just return it.
With optional argument FORCE, force the creation of a new ID.

如果 headline 没有 ID,会创建一个写入到 PROPERTIES 里

image

有这个 ID 后,创建指向这个 headline 的链接就可以这样写:

参考文献见 [[id:f1f20679-ba36-4aba-b798-b25494a44b75][Footnotes]]
2 个赞

原来还有这个命令,这个也可以解决问题,不过我还是觉得隐藏式的属性好些,默认不显示出来,鼠标移入等触发时才看到,这样和html标签的title属性更像

properties可以折叠,折叠以后就只剩一行,

也可以添加自定义函数控制是否展示properties,只是隐藏了就不好判断加过没有,看你的需求,似乎隐藏 properties,然后用保存 hook 之类的自动补上 id 最省事

(defun init-headline-id ()
  "process every headline"
  (interactive)
  (org-with-point-at 1
    (org-map-entries
     (lambda ()
       (let ((id (org-id-get)))
         (when (not id)
           (org-id-get-create)))))))
(add-hook 'before-save-hook 'init-headline-id)

下面是从 org-roam 作者那里搬运的隐藏和显示properties的函数

(defun org-hide-properties ()
 "Hide all org-mode headline property drawers in buffer. Could be slow if it has a lot of overlays."
 (interactive)
 (save-excursion
  (goto-char (point-min))
  (while (re-search-forward
          "^ *:properties:\n\\( *:.+?:.*\n\\)+ *:end:\n" nil t)
   (let ((ov_this (make-overlay (match-beginning 0) (match-end 0))))
    (overlay-put ov_this 'display "")
    (overlay-put ov_this 'hidden-prop-drawer t))))
 (put 'org-toggle-properties-hide-state 'state 'hidden))

(defun org-show-properties ()
 "Show all org-mode property drawers hidden by org-hide-properties."
 (interactive)
 (remove-overlays (point-min) (point-max) 'hidden-prop-drawer t)
 (put 'org-toggle-properties-hide-state 'state 'shown))

(defun org-toggle-properties ()
 "Toggle visibility of property drawers."
 (interactive)
 (if (eq (get 'org-toggle-properties-hide-state 'state) 'hidden)
  (org-show-properties)
  (org-hide-properties)))
2 个赞

还真是轮回啊,最开始的时候这个函数是出自 Emacs-china @Kinney解决方法, 现在又回到了 Emacs-china 。

在海外转了一圈又回来了 :joy:

你需要设一下这个参数: org-id-link-to-org-use-id

div id实际上多是需要动态更新dom的内容时才用, 这个org-id能用于动态更新文本吗?

指的是一个已打开的org文件被其它程序局部更新内容,我现在用的办法是直接整个org文件内容全部改变 来实现的 ,如果能实现局部更新那就距离像使用网页应用一样使用org-mode更近一步了