λ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ λ

✧ Drew Adams Ecosystem ✧

Drew Adams
λ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ λ

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.

TierExamplesLoaded 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

FilePackageNotable bindings / behavior
init-help-fns-plus.elhelp-fns+C-h M-f describe-file; C-h M-k describe-keymap; C-h M-l find-function-on-key
init-pp-plus.elpp+M-:pp-eval-expression (pretty-printed)
init-highlight.elhighlightC-x X prefix; C-S-p / C-S-n prev/next highlight
init-thing-cmds.elthing-cmdsM-@ cycle-select; C-M-SPC select-things
init-misc-cmds.elmisc-cmdsC-x k kill-buffer-and-its-windows; F5 revert; repeatable undo / next-buffer / prev-buffer
init-lacarte.ellacarteESC M-x execute-command; F10 execute-menu-command
init-isearch-plus.elisearch+Enhances all isearch keys; region-as-default, character properties
init-replace-plus.elreplace+M-% → query-replace-w-options; region-as-default
init-info-plus.elinfo+Enhances Info mode; node bookmarking, history, tooltips
init-dired-plus.eldired+Enhances Dired; loads find-dired+; reuses dir buffers
init-bookmark-plus.elbookmark+C-x r l list bookmarks; C-x r m add
init-icicles.eliciclesM-x icy-mode to toggle (off by default — corfu does in-buffer completion)
(no init file)apuM-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.