Org protocol: following Org links from outside Emacs
| org, emacs
_xor
had an interesting idea: can we use org-protocol
to link to
things inside Emacs, so that we can have a webpage with bookmarks into
our Org files? Here's a quick hack that reuses org-store-link
and
org-link-open
.
(defun org-protocol-open-link (info) "Process an org-protocol://open style url with INFO." (org-link-open (car (org-element-parse-secondary-string (plist-get info :link) '(link))))) (defun org-protocol-copy-open-link (arg) (interactive "P") (kill-new (concat "org-protocol://open?link=" (url-hexify-string (org-store-link arg))))) (with-eval-after-load 'org (add-to-list 'org-protocol-protocol-alist '("org-open" :protocol "open" :function org-protocol-open-link)))
To make exporting and following easier, we also need a little code to
handle org-protocol
links inside Org.
(defun org-protocol-follow (path &rest _) "Follow the org-protocol link for PATH." (org-protocol-check-filename-for-protocol (concat "org-protocol:" path) nil nil)) (defun org-protocol-export (path desc format info) "Export an org-protocol link." (setq path (concat "org-protocol:" path)) (setq desc (or desc path)) (pcase format (`html (format "<a href=\"%s\">%s</a>" path desc)) (`11ty (format "<a href=\"%s\">%s</a>" path desc)) (`latex (org-latex-link path desc info)) (`ascii (org-ascii-link path desc info)) (`md (org-md-link path desc info)) (_ path))) (with-eval-after-load 'org (org-link-set-parameters "org-protocol" :follow #'org-protocol-follow :export #'org-protocol-export))
Now I can use org-protocol-copy-open-link
to copy a link to the
current location, and I can put it into my Org files.
Example bare link to the Org manual, which will work only if you have
open
in the org-protocol-protocol-alist
:
org-protocol://open?link=%5B%5Binfo%3Aorg%23Protocols%5D%5Borg%23Protocols%5D%5D
With a description:
This is part of my Emacs configuration.
You can comment with Disqus or you can e-mail me at sacha@sachachua.com.