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

Mir*_*lov 8 emacs elisp org-mode

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

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

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

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

Stu*_*tom 7

我搜索了源,找不到任何明显的方法可以做到这一点。我知道Org-mobile使用过它,但是我对此没有太多经验。

作为入门者,以下代码段将循环遍历当前文件中的所有大纲标题(组织模式标题基本上是标准的Emacs大纲标题),并添加一个ID(如果还没有的话):

   (require 'org-id)
   (save-excursion
      (goto-char (point-max))
      (while (outline-previous-heading)
        (org-id-get-create)))
Run Code Online (Sandbox Code Playgroud)

(如果您想知道为什么该循环在缓冲区上向后而不是向前,这是因为该while循环将始终至少调用一次大纲导航功能,并且如果您的组织模式文件以标题开头,则向前跳过)

通过遍历该函数返回的条目(org-agenda-files),或者将其添加到Org模式文件的保存钩子,可以很容易地在Org模式议程已知的所有文件的循环中使用此方法。

如果比我更灵活的手指没有首先到达那里,如果您可以确定何时添加ID,我可以将上述内容扩展为一个完整的解决方案。


cam*_*dez 6

我同意Stuart的观点 - 我认为org-id中没有任何内容可以自动执行此操作,因此您想要添加ID ,它真的可以归结为.

如果您使用org-capture添加所有项目,那么org-capture-prepare-finalize-hook放置代码是一个合理的位置:

(add-hook 'org-capture-prepare-finalize-hook 'org-id-get-create)
Run Code Online (Sandbox Code Playgroud)

或者你可以像Stuart建议的那样做,并为org-mode文件添加一个save hook.我认为处理文件中所有标题的最惯用方法是使用映射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))
Run Code Online (Sandbox Code Playgroud)

最后我们只需添加一个before-save-hook只在org-mode中运行的东西:

(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
Run Code Online (Sandbox Code Playgroud)

应该这样做!