【问题标题】:Assign IDs to every entry in Org-mode为 Org-mode 中的每个条目分配 ID
【发布时间】:2023-04-06 04:58:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么要为所有条目添加 ID? (并不是说这是一件坏事,只是好奇,因为我也在使用 ID)。

标签: emacs elisp org-mode


【解决方案1】:

我同意 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))

最后我们只需要添加一个before-save-hook,它只在组织模式下运行:

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

应该这样做!

【讨论】:

  • 您的 org-map-entries 方法比我的要简洁得多。我不知道,所以谢谢你教我!
  • 当然可以。映射 API 非常棒。
  • 有什么理由 org-capture-prepare-finalize-hookorg-capture-after-finalize-hook 更受欢迎?
【解决方案2】:

我搜索了源代码,但找不到任何明显可以执行此操作的内容。我知道 Org-mobile 使用它,但我没有太多经验。

首先,下面的 sn-p 将遍历当前文件中的所有大纲标题(Org-mode 标题基本上是标准 Emacs 大纲标题),如果那里还没有 ID,则添加一个 ID:

   (require 'org-id)
   (save-excursion
      (goto-char (point-max))
      (while (outline-previous-heading)
        (org-id-get-create)))

(如果你想知道为什么这个循环在缓冲区上向后而不是向前,这是因为while 循环总是会至少调用一次大纲导航函数,如果你的 Org-mode 文件以这个标题开头如果继续前进,将被跳过。)

通过循环函数 (org-agenda-files) 返回的条目,或添加到 Org 模式文件的保存钩子中,这可以相当容易地在 Org 模式议程已知的所有文件的循环中使用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多