跨 emacs 组织模式文件引用唯一 ID

amd*_*amd 7 emacs org-mode

我有几个 .org 文件,我希望能够使用 ID 在它们之间创建链接。我使用 DOI 作为唯一标识符。我可以使用属性在文件中链接:

* Paper 1
  :PROPERTIES:
  :CUSTOM_ID: 10.1088/0953-8984/23/21/213001
  :END:

* Paper 2
  :PROPERTIES:
  :CUSTOM_ID: 10.1038/nphys2935
See also [[#10.1088/0953-8984/23/21/213001]]
Run Code Online (Sandbox Code Playgroud)

有没有办法使 custom_id 全局化,以便我可以从另一个文件中引用它?

我认为 org-id 是我需要更进一步的,但我发现文档有点混乱。我尝试在我的.emacs

;; Use global IDs
(require 'org-id)
(setq org-id-link-to-org-use-id use-existing)

;; Update ID file .org-id-locations on startup
(org-id-update-id-locations)
Run Code Online (Sandbox Code Playgroud)

但该文件.emacs.d/.org-id-locations只有nil.

似乎不会自动生成全局链接(为 Org-mode 中的每个条目分配 ID)。我尝试(在标题上使用光标)使用M-x org-id-get-create,但这似乎没有任何作用。

编辑:(基于有用的评论)

在一个会话中,我可以M-x org-store-link在标题上使用while存储和创建链接(Paper 1在我上面的示例中)。然后我可以使用M-x org-insert-link, 并输入 ID 来插入链接。该链接看起来像[[id:10.1088/0953-8984/23/21/213001][Paper 1]]。但是我遇到了两个问题:(1)我希望自动存储 ID。(2) 当我关闭并重新打开文件时链接不起作用。

编辑:一个相关的问题:

https://emacs.stackexchange.com/questions/2186/have-org-modes-exported-html-use-custom-id-when-linking-to-sub-sections-in-toc

amd*_*amd 6

所以这是我想出的解决方案。

  1. 在我的.emacs配置中,我保留了与我的问题相同的设置:

    (require 'org-id)
    (setq org-id-link-to-org-use-id use-existing)
    
    ;; Update ID file on startup
    (org-id-update-id-locations)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这些文件需要成为议程列表的一部分(或使用org-id-extra-files参见org-id文档)添加到附加文件列表中)

  3. 使用ID而不是CUSTOM_IDPROPERTIES抽屉中:

    * Paper 1
      :PROPERTIES:
      :ID: 10.1088/0953-8984/23/21/213001
      :END:
    
    Run Code Online (Sandbox Code Playgroud)
  4. 需要创建每个 ID(如有必要;在我的情况下,我已经有了它们),并将链接添加到 ID 文件(链接存储在 中.emacs.d/.org-id-locations)。这是使用org-id-get-create以下方法完成的:将光标放在标题上,使用

    M-x org-id-get-create
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用 链接到 ID [[id:10.1088/0953-8984/23/21/213001][Paper 1]]

我必须多考虑一下何时创建 ID;我可以通过将 ID 存储绑定到另一个我将对所有标题执行的功能来自动化该过程。