Org-mode & Elisp:使用 ID 访问条目时如何切换缓冲区?

Org-mode & Elisp: How does one switch the buffer when using an ID to visit an entry?

我正在尝试编写一个 Elisp 函数,它打开一个给定 ID 的 Org 模式条目并对该条目进行操作。但是,当使用 org.el 中的 org-open-link-from-string 和条目的 ID 属性 的值时,Emacs 似乎跳转到条目(即条目的缓冲区出现,并且光标移动到正确的条目),但是调用 org-open-link-from-string 之后的任何代码似乎都在原始缓冲区上运行。

例如,假设您评估 *scratch* 中的以下代码,其中 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 是名为 Test.org 的文件中的合法组织模式 ID。再次,

这是在 *scratch*:

中计算的代码
(defun testfn-visit-org-entry (id)
  (org-open-link-from-string (concat "id:" id))
  (message "%s" (current-buffer))
  )
(testfn-visit-org-entry "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")

Emacs 光标跳转到 Test.org 中的正确条目,但 message 打印我们开始的缓冲区 *scratch*。此外,调用 org-open-link-from-string*scratch* 中运行,而不是 Task.org

有没有办法完全跳转到ID对应的条目,并在Elisp函数的上下文中实际切换到适当的缓冲区?

尝试:

(defun open-id (id)
 (org-id-goto id)
 (message "%s" (current-buffer)))

这似乎是你想要的。