Elisp Posts

org-mode links in 2022: implementation, packages, articles and videos | THIS IS EMACS

2022-05-11
/Tony Aldon/
comment on reddit
/
org-mode revision: af6f1298b6f6

Hey Emacsers,

I hope you are doing well.

In the last few weeks, we have dedicated 6 posts to org-mode links.

Our interest was not only to show the specific features of org-mode links but also to see how they are implemented.

In this post, the last one about org-mode links, we list ALL the videos, articles and packages related to org-mode links.

It is unrealistic to think that it is possible to do so. But, we can try. And If you think about any video, article or package that should be part of that list, please do share it in the comment section below.

Let's go!

Implementation

In the post Search options in file links | link abbreviations | COME WITH ME on this JOURNEY into the heart of the command org-open-at-point, we looked at the implementation of org-open-at-point.

To do so, we also looked at the functions: org-element-context, org-element--object-lex, org-element-link-parser, org-link-expand-abbrev, org-link-open, org-link-open-as-file and org-open-file.

In the post Did you know that Org links in property drawers are not links?, we looked at the functions org-element-link-parser, org-link-make-regexps, org-open-at-point and also the variable org-link-any-re.

In the post FULL example of org-mode links: internal links and search options, instead of "explaining" the implementation of the function org-link-search we gave an full example that demonstrates its behavior and provided some Elisp examples of the functions and variables used by org-link-search: case-fold-search, replace-regexp-in-string, string-to-char, split-string, substring and regexp-quote.

In the post Link to a git commit from Org mode using Magit | THIS IS EMACS, we looked at the functions org-link-open, org-link-get-parameter and org-link--open-elisp.

In the post org-mode links everywhere, not only in org-mode buffers | THIS IS EMACS, we looked at org-open-at-point-global and org-link-open-from-string.

In the post org-store-link... powerful and flexible | THIS IS EMACS, we looked at org-store-link and org-link--store-help.

Videos

Zaiste Programming

In his series DoomCasts: Emacs Doom Screencasts Zaiste dedicates the episode 10, 11 and 12 to org-mode links.

In Emacs Doom E10: Org Mode - Links, Hyperlinks and more, the focus is on internal links to headline, file links, links to url, elisp link type (use for instance to open org agenda with org-agenda), shell link type (to list files in a directory) and org-insert-link.

In Emacs Doom E11: Org Mode - Custom Link Types Zaist describes how to add a new link type using org-add-link-type. Note that org-add-link-type is obsolete since org-mode 9.0 but still supported.

Since 9.0 we use org-link-set-parameters to add the links:

;; from the video
(defun make-youtube-link (youtube_id)
  (browse-url (concat "https://www.youtube.com/embed/" youtube_id)))

(org-add-link-type "yt" #'make-youtube-link) ; obsolete since 9.0

;; since 9.0
(org-link-set-parameters "yt" :follow #'make-youtube-link)

This allows us to open the following link [[yt:Febe4lUK5G4]] in the browser with org-open-at-point (bound to C-c C-o by default).

In Emacs Doom E12: Org Mode - Linking to words & Bookmarks the focus is on using command org-store-link on an org-mode headline and the behavior of org-open-at-point when we modify the variable org-link-search-must-match-exact-headline.

Rainer König

In his series OrgMode tutorial Rainer König dedicates the episode E05S01 and E05S02 to org-mode links.

In OrgMode E05S01: Linking (internal) the focus is on org-insert-link, link to named target (#+NAME:), link to headline with CUSTOM_ID property, radio targets (enclosed by triple angular brackets like this <<<radio target>>>).

At some point he says that we are responsible for the CUSTOM_ID to make them unique through out the document which is true.

We take the opportunity to mention the command org-lint that checks the current Org buffer for syntax mistakes. This command reports if there are duplicated CUSTOM_ID property.

For instance, if we call the command org-lint in the following Org buffer (with two CUSTOM_ID with the value foo):

* headline 1
:PROPERTIES:
:CUSTOM_ID: foo
:END:
* headline 2
:PROPERTIES:
:CUSTOM_ID: foo
:END:

the buffer *Org Lint* pops up with the following content:

3 nil   Duplicate CUSTOM_ID property "foo"
7 nil   Duplicate CUSTOM_ID property "foo"

In OrgMode E05S02: Linking (external) Rainer talks about links of type file, url, bbdb. He shows how to use id links (org-id-get-create and some custom functions). He also demonstrates how id links does not break when we archive a subtree with the command org-archive-subtree-default (bound to C-c C-x C-a by default).

John Kitchin

In New link features in org-mode v9.0 John Kitchin demonstrates how to defines new link types using the function org-link-set-parameters:

  1. the :face property is used to make links green,

  2. the :display property is used to show "all" the link,

  3. the :help-echo is used to produce a dynamic tooltip for some links,

  4. the :follow property is used to define a function to open file type link that let you choose the command to use to open a file with completion using helm,

  5. the :keymap property is used to define a keymap only active on some links,

  6. the properties :complete, :store and :activate-func are also demonstrated.

This video is completed with this article New link features in org 9.

Articles

In New link features in org 9 John Kitchin demonstrates how to defines new link types using the function org-link-set-parameters. This article is completed with this videos New link features in org-mode v9.0.

Kaushal Modi wrote two articles about org-mode links:

Linking and Exporting Org "info:" links with the following abstract:

Journey of Org links from copying (storing) them, inserting them in
Org documents and exporting them. The focus of this post is on the
info: type Org links, but the same concept would apply to any Org link
type.

and Improving ox-hugo exported Org "info:" links with the following abstract:

In my previous post, I talked about how info: Org link export support
got added to ox-hugo. This post is about making those exported links a
tiny 🤏 bit better.

In Custom Org-mode link abbrevs Eigenbahn "blends" link abbreviations and link types to have fast copy/paste experience with link abbreviations. He uses org-link-set-parameters and advices the command org-yank to do so.

In Emacs: With ace-window and link-hint, open links exactly where you want them Grant Rosson describes, as said in the abstract:

how the Emacs package link-hint can be combined with ace-window to
allow you to select, on-the-fly, which window a link will open
in—instead of letting fate, or custom, or Emacs decide for you.

Packages

org-contrib

The repository https://git.sr.ht/~bzg/org-contrib contains many add-ons to Org.

Doing a recursive grep inside the repository for the function org-link-set-parameters we can find the following link types.

ol-mew.el

This file implements links to Mew messages from within Org-mode.

It defines the link type mew.

ol-vm.el

This file implements links to VM messages and folders from within Org-mode.

It defines the link types vm and vm-imap.

org-mairix.el

Support for hooking mairix search into Org for different MUAs.

It defines the link type mairix.

ol-notmuch.el

Links to notmuch messages.

It defines the link types notmuch, notmuch-search and notmuch-tree.

ol-elisp-symbol.el

Links to Emacs-lisp symbols.

It defines the link type elisp-symbol.

org-mac-link.el

Insert org-mode links to items selected in various Mac apps.

It defines the link types x-together-item, addressbook, skim, acrobat, mac-outlook, mac-evernote, x-devonthink-item and message.

ol-git-link.el

Links to specific file version.

It defines the link types gitbare and git.

ob-smiles.el

Org-mode Babel support for SMILES.

It defines the link type molecule.

ol-wl.el

Links to Wanderlust messages.

It defines the link type wl.

org-contacts.el

This file contains the code for managing your contacts into Org-mode.

It defines the link types tel and org-contact.

ol-bookmark.el

Links to bookmarks.

It defines the link type bookmark.

On GitHub

By doing a search for the function org-link-set-parameters (used to define new Org link types) using https://grep.app/ we can find "all" the org link types defined in GitHub public repositories.

There are more than 150 of them.

I tried some of them, read the source of others.

One of these Org link types may meet your needs or you can read their implementations to get inspired to write your own.

So here is the list of Org link types I found (the urls point to the definition on GitHub of these links pinned to the last revision while I was writing this post).

calibredb.el

https://github.com/chenyanming/calibredb.el: Yet another calibre client for emacs.

calibredb.el defines the link type calibredb.

deft

https://github.com/jrblevin/deft: Deft is an Emacs mode for quickly browsing, filtering, and editing directories of plain text notes, inspired by Notational Velocity.

deft defines the link type deft.

doomemacs

https://github.com/doomemacs/doomemacs: Doom is a configuration framework for [GNU Emacs] tailored for Emacs bankruptcy veterans who want less framework in their frameworks, a modicum of stability (and reproducibility) from their package manager, and the performance of a hand rolled config (or better).

doomemacs defines the link types kbd, doom-package and doom-module.

ebdb

https://github.com/girzel/ebdb: EBDB is a contact management/addressbook package for Emacs.

ebdb defines the link type ebdb.

ebib

https://github.com/joostkremers/ebib: Ebib is a BibTeX database manager that runs in GNU Emacs.

ebib defines the link type ebib.

ejira

https://github.com/nyyManni/ejira: JIRA integration to Emacs org-mode

ejira defines the link type jirauser.

el-easydraw

https://github.com/misohena/el-easydraw: Emacs Easy Draw is a drawing tool that runs inside Emacs.

el-easydraw defines the link type edraw.

elfeed

https://github.com/skeeto/elfeed: Elfeed is an extensible web feed reader for Emacs, supporting both Atom and RSS.

elfeed defines the link type elfeed.

elpher

https://github.com/emacsmirror/elpher: Elpher aims to provide a full-featured combination gopher and gemini client for GNU Emacs.

elpher defines the link types elpher, gemini, gopher and finger.

emacs-application-framework

https://github.com/emacs-eaf/emacs-application-framework: The vision of the Emacs Application Framework (EAF) project is, while fully retaining the rich history, culture, and ecosystem of Emacs and Emacs Lisp, to open up completely new doors to the ecosystems of Python, Qt6, and even JavaScript. EAF extends Emacs to the world of modern graphics, but still preserving the extensibility and customizability of Emacs. It will be the key to ultimately Live in Emacs

emacs-application-framework defines the link types docview, pdfview and pdftools in the extension/eaf-org.el#L92 and also eaf.

emacs-document

https://github.com/lujun9972/emacs-document: Translate emacs documents to Chinese for convenient reference.

emacs-document defines the link type video.

emacs-webkit

https://github.com/akirakyle/emacs-webkit: A successor to xwidget-webkit.

emacs-webkit defines the link type webkit.

fanyi.el

https://github.com/condy0919/fanyi.el: fanyi.el is a simple yet powerful multi-dictionaries interface for Emacs.

fanyi.el defines the link type fanyi.

holy-books

https://github.com/alhassy/holy-books: An Emacs interface to the Quran and the Bible: Org-mode links, tooltips, and Lisp look-ups.

holy-books defines the link types quran, Quran, bible, Bible and basmala.

mu

https://github.com/djcb/mu: mu is a tool for dealing with e-mail messages stored in the Maildir-format.

mu defines the link type mu4e.

mu4e-dashboard

https://github.com/rougier/mu4e-dashboard: mu4e dashboard provides a new mu4e org link type that allows to execute various mu4e queries when clicked.

mu4e-dashboard defines the link type mu.

org-annotate

https://github.com/girzel/org-annotate: Provides a new link type for Org that allows you to create annotations on arbitrary chunks of text.

org-annotate defines the link type note.

org-brain

https://github.com/Kungsgeten/org-brain: org-brain implements a variant of concept mapping in Emacs, using org-mode.

org-brain defines the link types brain, brain-child, brain-parent, brain-friend and brainswitch.

org-jira

https://github.com/ahungry/org-jira: Use Jira in Emacs org-mode.

org-jira defines the link type jira.

org-krita

https://github.com/lepisma/org-krita: Minor mode for working with krita notes, sketches etc. in org mode.

org-krita defines the link type krita.

org-music

https://github.com/tecosaur/org-music: This adds a new link type, [[music:artist:song]].

org-music defines the link types music and Music.

org-pdftools

https://github.com/fuxialexander/org-pdftools: A custom org link type for pdf-tools.

org-pdftools defines the link type pdf.

org-ql

https://github.com/alphapapa/org-ql: This package provides a query language for Org files. It offers two syntax styles: Lisp-like sexps and search engine-like keywords.

org-ql defines the link type org-ql-search.

org-ref

https://github.com/jkitchin/org-ref: org-ref makes it easy to insert citations, cross-references, indexes and glossaries as hyper-functional links into org files. The links are fontified so you can tell them apart from other links, and each link is clickable to access functions like opening a pdf, notes or url associated with the link. Each link also can be exported to LaTeX to build a PDF. For citations, export to other formats is supported by citeproc for high quality export to HTML, markdown, plain text, or stand-alone (i.e. independent of a bibtex file) LaTeX.

org-ref defines the link types:

org-roam-server

https://github.com/org-roam/org-roam-server: Server for org-roam v1.

org-roam-server defines the link types: server, file and image.

org-roam

https://github.com/org-roam/org-roam: Org-roam is a plain-text knowledge management system. It brings some of Roam's more powerful features into the Org-mode ecosystem.

org-roam defines the link type id and roam.

org-sketch

https://github.com/yuchen-lea/org-sketch: Xournal, Draw.io support for Org Mode.

org-sketch defines the link type xournal and drawio.

org-yt

https://github.com/TobiasZawada/org-yt: Youtube links in org-mode.

org-yt defines the link type yt.

org2jekyll

https://github.com/ardumont/org2jekyll: Blogging with org-mode and jekyll without alien yaml headers.

org2jekyll defines the link type local.

orgit-forge

https://github.com/magit/orgit-forge: This package defines the Org link type orgit-topic, which can be used to link to Forge topic buffers. This is similar to the orgit package, which links to various Magit buffers.

orgit-forge defines the link type orgit-topic.

orgit

https://github.com/magit/orgit: This package defines several Org link types, which can be used to link to certain Magit buffers.

orgit defines the link types orgit, orgit-log and orgit-rev.

orgqda

https://github.com/andersjohansson/orgqda: orgqda defines a minor mode and several commands for making coding, listing of codes, and collection of coded extracts possible in text written in org mode.

orgqda defines the link types oqdats, opbm and otag.

orgstrap

https://github.com/tgbugs/orgstrap: orgstrap allows Org files to describe their own requirements and define their own functionality, making them self-contained standalone computational artifacts dependent only on Emacs or other implementations of the Org Babel protocol in the future.

orgstrap defines the link types FOLD-HEADLINE, RUN, RUNPREV, RUNC, TEXT-LARGER, TEXT-SMALLER and TEXT-RESET.

orly

https://github.com/abo-abo/orly: Additional Org-mode link types and completion for them.

orly defines the link types code, el, man, pdf and exe.

osm

https://github.com/minad/osm: Osm.el is a tile-based map viewer, with a responsive moveable and zoomable display. The map can be controlled with the keyboard or with the mouse. The viewer fetches the map tiles in parallel from tile servers via the curl program. The package comes with a list of multiple preconfigured tile servers. You can bookmark your favorite locations using regular Emacs bookmarks or create links from Org files to locations. Furthermore the package provides commands to search for locations by name and to open and display GPX tracks.

osm defines the link type osm.

ox-ipynb

https://github.com/jkitchin/ox-ipynb: This module allows you to export an org-file to an Ipython notebook. Python and R notebooks are currently supported. It is not currently possible to mix these languages.

ox-ipynb defines the link type image.

paperless

https://github.com/atgreen/paperless: Emacs assisted PDF document filing.

paperless defines the link type paperless.

papis.el

https://github.com/papis/papis.el: The main motivation of this package is to make it easy to interact with org-mode and papis.

papis.el defines the link types papis+doi and papis.

scimax

https://github.com/jkitchin/scimax: Scimax is an Emacs starterkit for scientists and engineers. It provides a comprehensive configuration of Emacs for scientific programming and publishing.

scimax defines the link types box, nersc, contact, elfeed, inkscape, file, pydoc, attachfile, altmetric, man and subfile.

sx.el

https://github.com/vermiculus/sx.el: SX is a full-featured Stack Exchange mode for GNU Emacs 24+. Using the official API, it provides a versatile experience for the Stack Exchange network within Emacs itself.

sx.el defines the link type sx.

telega.el

https://github.com/zevlg/telega.el: telega.el is full featured unofficial client for https://telegram.org platform for GNU Emacs.

telega.el defines the link type telega.

treemacs

https://github.com/Alexander-Miller/treemacs: A tree layout file explorer for Emacs.

treemacs defines the link type treemacs.

weblorg

https://github.com/emacs-love/weblorg: A Static HTML Generator entirely written in Emacs-Lisp.

weblorg defines the link types anchor, url_for and url_for_img.

zotxt-emacs

https://github.com/egh/zotxt-emacs: zotxt-emacs works with https://github.com/egh/zotxt to provide Emacs integration with Zotero, allowing you to manage citation keys for pandoc markdown documents as well as org mode links to items in your Zotero collection.

zotxt-emacs defines the link type zotero.

WE ARE DONE!!!