为组织模式中的每个条目分配ID

时间:2012-11-12 08:47:41

标签: emacs elisp org-mode

Org-mode有一个名为org-id的捆绑扩展,它为组织模式文件实现全局唯一ID。每个条目(标题及其正文)都可以在其:PROPERTIES:抽屉中具有ID属性。

可以使用函数org-id-get-create分配单个条目的新ID。

如何为组织模式文件中的每个条目分配ID?

我可以使用Emacs方法自动执行此操作,例如为org-id-get-create开头的每个字符串调用*的宏。但我想知道org-mode是否已具备该功能。如果没有,请为此目的推荐最恰当的方式来编写elisp代码。

2 个答案:

答案 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>