Here are the shownotes of my GLT 2026 workshops to Emacs and Org-mode:
There is no recording of this four hour session.
- Surveys
- Who is using Emacs already? a third
- Who is totally new to Emacs? the rest
Introduction to the GNU Emacs Platform
History and Basics
https://en.wikipedia.org/wiki/Emacs
- Emacs development began during the 1970s at the MIT AI Lab
- Text Editor and Corrector (TECO)
- E editor, written by Fred Wright
- Richard Stallman added a macro feature to the TECO display-editing mode
- Steele and Stallman's finished implementation
- The new version of TECO quickly became popular at the AI Lab and soon accumulated a large collection of custom macros whose names often ended in MAC or MACS, which stood for macro.
- 1976: The resulting system was called EMACS, which stood for Editing MACroS or, alternatively, E with MACroS. Later, the use of EMACS as a recursive acronym for "EMACS Makes All Computing Simple" became popular; this fit in with the growing use of recursive acronyms for other versions of EMACS.
- later: GNU Emacs, XEmacs, Aquamacs, Meadow, JOVE, edwin, …
based on Emacs Lisp
does't use modes: https://www.nomodes.com/ → A personal history of modeless text editing and cut/copy-paste | ACM Interactions
the other editor beneath vi (1976) or Vim (1988) or Neovim (2015) → that's really just an editor
- Emacs = Emacs + modes → minor and major
Emacs is old. Therefore: it contains usage patterns that precedes Ctrl-X, Ctrl-V, Alt-F4, … or IBM Common User Access (F1 for help, F5 for refresh, Menu with F10, ESC for Cancel, …)
Different names for "Window", "File", … → https://www.emacswiki.org/emacs/Window#window
- Window → Frame
- "File views" → Windows (displaying buffers)
- Menu Bar → Menu Bar :-)
- Task bar? → Mode Lines
Emacs is not comparable to (almost) anything I've come across so far.
- And this is also a very good thing!
- Evolutional Steps of Computer Systems → "Information-Centric Systems"
- And this is also a very good thing!
Start Emacs
emacs --init-directory=. -q
Emacs Tutorial
- provided on the Emacs startup screen or
M-x help-with-tutorialorC-h t
- quick references
Manual Customization
start of the week
M-x customize→ browse in menu: Parent groups: Environment Editing …M-x customize→ search for "week"C-h v calendar-week-start-dayin
init.el(setq-default calendar-week-start-day 1)
outdated double space after each sentence
(setq-default sentence-end-double-space nil)Options → Customize Emacs → Custom Themes
C-h k C-x s→ "save-some-buffers"- access code
- copy code
- add
(message "Hello GLT") - evaluate and execute
Init File
create init file:
(find-file (expand-file-name "init.el" user-emacs-directory))open init file:
(find-file emacs-init-file)learning Elisp
- https://www.emacswiki.org/ official resource
- https://bzg.fr/en/learn-emacs-lisp-in-15-minutes/
- Tips for the learning process: https://sachachua.com/blog/2013/03/learn-emacs-lisp-by-reading-emacs-lisp/
M-x functionname→ call defined Elisp functionsM-: (message "Hi!")→ evaluate Elisp code
- help on variables:
C-h v foobar - help on functions:
C-h f foobar
activate Elisp code/settings
- mark region +
M-x eval-region M-x eval-bufferfor whole buffer- restart Emacs ;-)
- mark region +
debugging issues in
init.el:emacs --debug-initmy configuration: https://github.com/novoid/dot-emacs/blob/master/config.org
Packages
- package install: mastodon mpv
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/") t)
(use-package mastodon
:ensure t
:config
(setq mastodon-instance-url "https://graz.social"
mastodon-active-user "graz_social_demo")
)
- start Mastodon demo (PW for encrypting the demo key in session = foobar9472!)
- update all packages:
M-x list-packages+U x
MISC
- Undo
is special
- Undo within region
- Keyboard macros
- proced - process manager
- Language Server Protocol - Wikipedia
- Magit - git made awesome
my-title-capitalization()- Emacs window management via eyebrowse
- Emacs shell
- TRAMP (“Transparent
Remote (file) Access, Multiple Protocol”)
- Seamless SSH, SCP, sudo, and Docker file access within dired
- Edit and manage remote files as if local
- Spray speed reading:
M-x spray-mode - ELIZA - Wikipedia
(1966!) →
M-x doctor
- all sorts of LLM integration modes
File Management
- Dired - the very
first file manager!
- editing names as text:
C-x C-qand confirm changes withC-c C-c - Deep integration with Emacs buffers and shell commands
- (similar: vidir)
- Dired-sidebar —
Dired in a persistent sidebar
- Leverages all existing dired keybindings and extensions
- Tree-explorer feel with full dired power underneath
- Dired-hacks —
Modular dired extension collection
- dired-subtree for inline subdirectory expansion, dired-filter for dynamic filtering
- dired-narrow for live fuzzy/regex narrowing of listings
- Casual
Dired — Discoverable transient menus for dired
- Transient-based UI that surfaces dired operations via menus
- Lowers learning curve for dired's extensive keybindings
- editing names as text:
- Dirvish — Modern
dired replacement
- File preview, icons, and git integration out of the box
- Extensible via dirvish extensions (fd-find, media preview)
- Sunrise
Commander — Orthodox dual-pane file manager
- Inspired by Midnight Commander with tabs and tree navigation
- Background file operations and batch processing
- Ranger.el —
Miller-columns file navigation
- Multi-pane parent/current/preview layout modeled after terminal ranger
- Integrates with dired as a minor mode; includes minimal
deerpicker
- Treemacs
— Project-focused tree sidebar
- Workspace/project grouping with deep LSP and Magit integration
- Supports icons, follow-mode, and file watching
- Neotree —
Simple sidebar tree browser
- Lightweight toggleable display inspired by Vim's NERDTree
- Icon support and minimal configuration needed
Web Browsers
- EWW (Emacs Web Wowser) — built-in text-based browser; renders HTML without CSS or JS, tightly integrated with Emacs buffers.
- emacs-w3m — Emacs
interface to the external
w3mtext browser; supports tabs, bookmarks, and async page loading. - xwidget-webkit
— built-in full WebKit rendering embedded in a buffer; requires Emacs
compiled
--with-xwidgets. - xwwp — enhances
xwidget-webkitwith link-hinting (ace-jump style), smarter URL handling, and completion-framework integration. - EAF (Emacs Application Framework) — embeds a full Chromium-based browser (and other apps) via Python/Qt6; supports ad-blocking and JS.
- emacs-webkit — dynamic module approach to embedding WebKitGTK, with more control than xwidgets; now largely superseded by improved xwidgets in Emacs 29+.
- Elpher — client for Gopher, Gemini, and Finger protocols; not the regular web, but covers the "small web" from within Emacs.
- W3 — the original Emacs browser written entirely in Elisp; largely obsolete but historically significant.
- Interesting: Nyxt — not within GNU Emacs but as an independent GUI application that follows Emacs patterns deeply!
Emails
- mu4e
- Search-based frontend to the
muindexer; fast, polished UI - Strong org-mode integration; composes HTML emails via org
- Requires external sync tool (e.g. mbsync/offlineimap) + msmtp for sending
- Search-based frontend to the
- Gnus
- Built into Emacs; handles both email and newsgroups (NNTP)
- Monolithic or split-MUA capable; highly configurable
- Steeper learning curve; can back notmuch as a search engine
- Notmuch (notmuch.el)
- Tag-based, search-oriented; conversation/thread view
- Does not send or move mail itself — pairs with msmtp/afew
- Inspired by Gmail's philosophy; fast global search
- Wanderlust
- Pure Elisp; native IMAP support without external sync tools
- Good for Windows users where mbsync is unavailable
- Considered powerful but notoriously tricky to configure
- Rmail
- Oldest MUA, ships with GNU Emacs
- Simple and minimal; limited modern protocol support
- Uses the BABYL/mbox format; mostly for local/legacy use
- MH-E
- Emacs frontend to the MH and nmh message-handling systems
- Folder-based; each message is a separate file
- Mature but niche; requires MH/nmh installed separately
- Mew
- Secure email focus; built-in S/MIME and PGP support
- Fast; designed around Emacs conventions
- Less actively maintained than mu4e or notmuch
- VM (View Mail)
- Emacs-native; supports IMAP, POP, and local spool
- Folder-based with threading; predates most alternatives
- Development is slow; mostly legacy use today
Selected Resources
- my Emacs articles: https://karl-voit.at/tags/emacs/
- https://emacsconf.org/ → yearly online Emacs conference
- https://www.masteringemacs.org/ → awesome book about Emacs → recommended
Introduction to GNU Emacs Org-mode
Org-mode History and Basics
- https://en.wikipedia.org/wiki/Org-mode
- initial release 2003 by Carsten Dominik for Emacs → around the same time as Markdown and other LMLs were introduced
- https://orgmode.org/
- Current maintainer: Ihor Radchenko
- social media: https://fosstodon.org/@yantar92
- his Emacs config: https://github.com/yantar92/emacs-config/blob/master/config.org
- Ihor donations: https://liberapay.com/yantar92/
- Org-mode donations: https://liberapay.com/org-mode
- Current maintainer: Ihor Radchenko
- Consists of two different things:
- Orgdown: a lightweight markup language
- Org-mode: Elisp code within GNU Emacs to work with Orgdown information
- it's important to differ between those two things!
Orgdown - Syntax
- The syntax is supported by many tools outside of GNU Emacs
- https://gitlab.com/publicvoit/orgdown/
Org-mode - Features of the Elisp Implementation
Org-mode Demos
Disclaimer: I've invested many years into my personal PIM setup. Most demos here are not considered to teach how it's done. Instead, they should teach you how to get creative to adapt the computer to your personal requirements yourself.
- Visibility cycling
fill-or-unfill()→ESC q
- Properties
- Column
View
C-c C-x C-c→org-columns()q= quit
- Contact mangement
my-org-region-to-property()
- Column
View
- refiling
org-tree-to-indirect-buffer()→C-c C-x b
my-add-description()→mymap u
- Todo management
- UOMF: My Current Life-Cycle of an Org Mode Task
my-mark-as-project()my-create-business-appointment-surrogate()- progress indicators: [3/6] [50%]
- Agenda
- Tags
my-dwim-insert-stuff()my-rocketchat-insert-message-from-url()- Example: I copy the link of the message to the system clipboard,
invoke my Emacs shortcut and then it inserts:
- [2026-03-26 Thu 09:06] Message from firstname.lastname: This is the body of the mesasge in our Rocket.Chat.
- Example: I copy the link of the message to the system clipboard,
invoke my Emacs shortcut and then it inserts:
my-mastodon-insert-message-from-url()→ the process is similar to Rocket.Chat- same for email headers
- Example: 2026-04-07 08:45 First Last <First.Last@example.com>: Example subject from the clipboard snippet:
From: First Last <First.Last@example.com> To: me@example.com Subject: Example subject Date: Tue, 7 Apr 2026 10:45:31 +0200 Message-Id: <abcde12345@example.com>
- Tables with spreadsheets
org-copy-as-visible()
- Exporting
- PDF export
- pandoc
- slides export with reveal: file:/home/shared/shares/src/pim-lv/pim-slides.org
- example chapter: "Basics of PIM 3 • Choosing A Tool"
- Export → R B (in my setup)
- hydra
- Org-babel
- Template: tbrief → LaTeX letter template via Org-mode template and
babel
- create new Org-mode file
- insert yankpad template "tbrief"
- provide letter data
make pdfin shell generates PDF of letter
- Template of lecture
- Bi-directional links between headings: UOMF: Linking
Headings With org-super-links (Poor-Man's Zettelkasten)
- UOMF:
Linking Headings →
my-id-get-or-generate() - UOMF: Easy Dependency Creation With org-linker-edna
- Karl Voit / GNU Emacs Org mode - link demo · GitLab
my-bidirectional-link-to-parent-heading()→ links current heading with parent (before potential refiling)
- UOMF:
Linking Headings →
- UOMF: Path-Independent Links to Local Files Via Locate
- Links to emails, instant messenger, …
- lazyblorg → https://Karl-Voit.at as example page
- mention only