Why a separate page
A loose collection of Emacs extensions, lovingly maintained by Drew Adams for nearly four decades. Most live only on emacsmirror, never made it into MELPA or Guix, and would be lost to history if not for that one mirror. They are also tightly inter-dependent — and the dependency graph demands a careful load order.
Within my Emacs config, Drew's packages are the entire reason straight.el exists alongside Guix Home. Everything else is in Guix; this corner is the only one that needs an upstream emacsmirror checkout. Keeping it isolated to one init module (init-straight.el) keeps the rest of the configuration clean.
Load-order tiers
The set splits into four tiers, mirrored in init.el's require ordering. Preserve this order when extending.
| Tier | Examples | Loaded in init.el |
|---|---|---|
| T0 | hexrgb, strings, naked, zones, thingatpt+, … |
On-demand by T1+; no init file |
| T1 | icicles, bookmark+, highlight, pp+ |
Eager require |
| T2 | help-fns+ (depends on naked, wid+) |
Eager require |
| T3 | dired+, info+, isearch+, replace+, … |
eval-after-load on the corresponding built-in mode |
T0 packages are utility libraries that other Drew packages depend on — they're installed but never required directly. T1 packages are eagerly loaded because they hook into early-startup state (icicles, bookmark+). T2 packages need T0/T1 plus built-in libs already loaded. T3 packages enhance built-in modes (Dired, Info, Isearch, Replace) and only load when those modes activate.
What each package does
| File | Package | Notable bindings / behavior |
|---|---|---|
init-help-fns-plus.el | help-fns+ | C-h M-f describe-file; C-h M-k describe-keymap; C-h M-l find-function-on-key |
init-pp-plus.el | pp+ | M-: → pp-eval-expression (pretty-printed) |
init-highlight.el | highlight | C-x X prefix; C-S-p / C-S-n prev/next highlight |
init-thing-cmds.el | thing-cmds | M-@ cycle-select; C-M-SPC select-things |
init-misc-cmds.el | misc-cmds | C-x k kill-buffer-and-its-windows; F5 revert; repeatable undo / next-buffer / prev-buffer |
init-lacarte.el | lacarte | ESC M-x execute-command; F10 execute-menu-command |
init-isearch-plus.el | isearch+ | Enhances all isearch keys; region-as-default, character properties |
init-replace-plus.el | replace+ | M-% → query-replace-w-options; region-as-default |
init-info-plus.el | info+ | Enhances Info mode; node bookmarking, history, tooltips |
init-dired-plus.el | dired+ | Enhances Dired; loads find-dired+; reuses dir buffers |
init-bookmark-plus.el | bookmark+ | C-x r l list bookmarks; C-x r m add |
init-icicles.el | icicles | M-x icy-mode to toggle (off by default — corfu does in-buffer completion) |
| (no init file) | apu | M-x apropos-unicode — interactive Unicode lookup, complements the ~/ref/text/unicode/ data files |
Why icicles is installed but disabled
icicles overlaps significantly with vertico + orderless + marginalia + consult for minibuffer completion, and the modern stack is what's enabled by default. icicles stays installed because its progressive narrowing mode is genuinely different from what consult offers — useful in the rare batch sessions where you want to peel a 10k-element completion list down by stages.
Toggle with M-x icy-mode; bind to a key only if it earns it. The current state is the right default: install, don't auto-enable.
Pinning
To pin straight versions: M-x straight-freeze-versions and commit straight/versions/default.el (currently gitignored — un-ignore it in .gitignore if you start using freeze).
Default state is unpinned: straight clones the current head of each emacsmirror checkout on first load. For a config that gets reconfigured rarely and rebuilt cleanly, that's been fine. Pinning becomes valuable only after one of Drew's packages introduces a breaking change between rebuilds — at which point freeze, commit, and review at leisure.