感觉 org-id-open 很难用,有比较好的 override 么?

我感觉 org-id-open 就是我当下关于 org-mode 的痛点了,具体来说它对我有以下缺点:

  • org-id-open 根本不起作用,我试图打开一个链接,由于我有一些 .org.gpg 文件, 它就要我输入 password, 但目标链接根本不在 gpg 文件中。我关闭了所有 gpg buffer 还是会这样。但有时候又没这个问题,很奇怪。
  • 打不开没 open 的文件的链接。
  • 就算能 work 的时候,速度也很慢。 想问问有没有对 org-id-open override 的方案,比如用 rg 的?再比如,org-node 打开 ID 就很快而且准确,但它的实现是维护了一个 hash table, 映射 heading->node, node 包含 file path, position 等信息。我感觉比较理想的还是用 rg, 没有任何存储开销。

你的 .org-id-locations 这个文件是不是坏了

1 个赞

好像还挺简单,速度也挺快:

(defun my/org-id-open-with-rg (id)
  (interactive "sEnter ID: ")
  (let* ((org-directory (file-truename org-directory))
         (command (format "rg -n --vimgrep -g !book -t org '^:ID:\s*%s' %s" id "~/notes/"))
         (output (shell-command-to-string command))
         (result (split-string output "\n" t)))
    (if (null result)
        (message "not found ID: %s" id)
      (let* ((first-match (car result))
             (parts (split-string first-match ":" t))
             (file (nth 0 parts))
             (line (string-to-number (nth 1 parts))))
        (find-file file)
        (goto-char (point-min))
        (forward-line (1- line))))))

(advice-add 'org-id-open :override #'my/org-id-open-with-rg)

可能会遇到一些问题,遇到了再说。

感谢,你不说我根本不知道这个,的确 org-id-locations-file 被 ob-go 改了,我改回去,然后执行 org-id-update-id-locations, 就可以了,也相当快。