Org-mode有一个名为org-id
的捆绑扩展,它为组织模式文件实现全局唯一ID。每个条目(标题及其正文)都可以在其:PROPERTIES:
抽屉中具有ID属性。
可以使用函数org-id-get-create
分配单个条目的新ID。
如何为组织模式文件中的每个条目分配ID?
我可以使用Emacs方法自动执行此操作,例如为org-id-get-create
开头的每个字符串调用*
的宏。但我想知道org-mode是否已具备该功能。如果没有,请为此目的推荐最恰当的方式来编写elisp代码。
答案 0 :(得分:6)
我同意Stuart的观点 - 我认为org-id中没有任何内容可以自动执行此操作,所以当想要添加ID时,它真正归结为。
如果您使用org-capture添加所有商品,则org-capture-prepare-finalize-hook
是放置代码的合理位置:
(add-hook 'org-capture-prepare-finalize-hook 'org-id-get-create)
或者你可以像Stuart建议的那样做,并为org-mode文件添加一个保存挂钩。我认为处理文件中所有标题的最惯用方法是使用mapping API:
(defun my/org-add-ids-to-headlines-in-file ()
"Add ID properties to all headlines in the current file which
do not already have one."
(interactive)
(org-map-entries 'org-id-get-create))
最后,我们只需要添加一个只在org-mode中运行的before-save-hook
:
(add-hook 'org-mode-hook
(lambda ()
(add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
应该这样做!
答案 1 :(得分:5)
我搜索了源代码,找不到任何明显的事情。我知道它是由 Org-mobile 使用的,但我对此并没有多少经验。
通过启动器,以下代码段将遍历当前文件中的所有大纲标题(组织模式标题基本上是标准的Emacs大纲标题),如果还没有ID,则添加ID:
(require 'org-id)
(save-excursion
(goto-char (point-max))
(while (outline-previous-heading)
(org-id-get-create)))
(如果你想知道为什么这个循环在缓冲区而不是向前循环,这是因为while
循环将始终至少调用一次轮廓导航函数,如果你的组织模式文件以如果前进,将跳过此标题。)
这可以通过循环遍历函数(org-agenda-files)
返回的条目,或者添加到组织模式文件的保存挂钩,在Org模式议程已知的所有文件的循环中合理地使用。
如果有人比我更灵活,那么如果你能够识别 时你想要添加ID,我可以扩展上面的内容以成为一个完整的解决方案。< / p>