org-mode links in 2022: implementation, packages, articles and videos | THIS IS EMACS
- Implementation
- Videos
- Articles
- Packages
- org-contrib
- On GitHub
- calibredb.el
- deft
- doomemacs
- ebdb
- ebib
- ejira
- el-easydraw
- elfeed
- elpher
- emacs-application-framework
- emacs-document
- emacs-webkit
- fanyi.el
- holy-books
- mu
- mu4e-dashboard
- org-annotate
- org-brain
- org-jira
- org-krita
- org-music
- org-pdftools
- org-ql
- org-ref
- org-roam-server
- org-roam
- org-sketch
- org-yt
- org2jekyll
- orgit-forge
- orgit
- orgqda
- orgstrap
- orly
- osm
- ox-ipynb
- paperless
- papis.el
- scimax
- sx.el
- telega.el
- treemacs
- weblorg
- zotxt-emacs
- WE ARE DONE!!!
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
:
the
:face
property is used to make links green,the
:display
property is used to show "all" the link,the
:help-echo
is used to produce a dynamic tooltip for some links,the
:follow
property is used to define a function to openfile
type link that let you choose the command to use to open a file with completion usinghelm
,the
:keymap
property is used to define a keymap only active on some links,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
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.
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
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-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:
doi in
doi-utils.el
,nist-wb-name in
nist-webbook.el
,arxiv in
org-ref-arxiv.el
,bibliography nobibliography, printbibliography and bibliographystyle in
org-ref-bibliography-links.el
,label in
org-ref-label-link.el
,list-of-tables, index, printindex and list-of-figures in
org-ref-misc-links.el
,pmcid nihmsid, pubmed-search, pubmed-clinical and pmid in
org-ref-pubmed.el
,ref pageref, nameref, eqref, autoref, cref, Cref, crefrange and Crefrange in
org-ref-ref-links.el
,orcid researcherid, eid, scopus-search, scopus-advanced-search and scopusid in
org-ref-sci-id.el
,wos, wos-search in
org-ref-wos.el
,cite
,nocite
,citet
,citet*
,citep
,citep*
,citealt
,citealt*
,citealp
,citealp*
,citenum
,citetext
,citeauthor
,citeauthor*
,citeyear
,citeyearpar
,Citet
,Citep
,Citealt
,Citealp
,Citeauthor
,Citet*
,Citep*
,Citealt*
,Citealp*
,Citeauthor*
in org-ref-citation-links.el#L780,cites
,Cites
,parencites
,Parencites
,footcites
,footcitetexts
,smartcites
,Smartcites
,textcites
,Textcites
,supercites
,autocites
,Autocites
in org-ref-citation-links.el#L791,bibentry in
org-ref-citation-links.el
,gls
,glspl
,Gls
,Glspl
,glssymbol
,Glssymbol
,glsdesc
,Glsdesc
in org-ref-glossary.el#L331,glslink and printglossaries in
org-ref-glossary.el
,glslink
,printglossaries
,acrshort
,acrshortpl
,Acrshort
,Acrshortpl
,ACRshort
,ACRshortpl
,acrlong
,acrlongpl
,Acrlong
,Acrlongpl
,ACRlong
,ACRlongpl
,acrfull
,acrfullpl
,Acrfull
,Acrfullpl
,ACRfull
andACRfullpl
in org-ref-glossary.el#L588.
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-sketch
https://github.com/yuchen-lea/org-sketch: Xournal, Draw.io support for Org Mode.
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.
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
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.
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.