Alice's Emacs Mods
SkillDev toolsTour of Alice's heavily-customized terminal Emacs — Causal transients, Worlding org, proof tooling, MLX chat, voice, and clipboard.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Alice's Emacs Mods skill
What this skill tells your AI
The instructions your AI receives, as published by plurigrid/asi in skills/alice-emacs-mods/SKILL.md and read by ahel’s review.
Read this BEFORE editing ~/.emacs.d/init.el, suggesting packages, or
explaining why some keybinding does something unexpected. Most surprises
here are intentional and load-bearing.
Shape of the install
- Build:
emacs-nox 30.2from Nix store (/nix/store/...emacs-nox-30.2) - Frontend: terminal only — no GUI Emacs. Always assume
(display-graphic-p) = nil - Daemons: typically 2–4 running at once (
factory,server,claude-crdt,horsin-around, …)factory= full init.el (the "real" one)claude-crdt/horsin-around=-Qdaemons, started for specific purposes- sockets:
/var/folders/.../T/emacs501/<name>
- Init:
~/.emacs.d/init.el(~700 lines),~/.emacs.d/early-init.el - Custom code:
~/.emacs.d/lisp/(e.g.org-worlding.el),~/.emacs.d/site-lisp/(whisper.el, chatgpt-shell, shell-maker) - Packages:
package.el+use-package(use-package-always-ensure t), MELPA + GNU + nonGNU.~/.emacs.d/elpa/≈ 70 packages - No straight, no elpaca, no doom, no spacemacs
The dominant pattern: Causal transients on C-o
causal is a plurigrid fork of casual-suite — Transient-based menus
covering most built-in modes plus several additions. The convention:
C-oopens the mode's transient menu in dired, isearch, ibuffer, info, calc, bookmarks, agenda, calendar, compile/grep, re-builder, eshell, help, man, csv, image, ediff, eww, make, ghostty, gnus (group/summary/ article/message), portal, proof.M-mopens transients for elisp-mode, html-mode, css-mode.- Globally,
C-oiscausal-editkit-main-tmenu(the umbrella menu).
Plurigrid additions beyond casual-suite:
| Binding | Menu | What it's for |
|---|---|---|
C-c C | causal-catcolab-tmenu | Capture proof → olog export to CatColab |
C-c p | causal-portal-tmenu | Post-web proof-theoretic navigation (Narya) |
C-c t z | causal-timezone-tmenu | Multi-zone planning |
Other causal modules loaded if present (require ... nil t):
causal-self-walker, causal-self-walker-paperproof, causal-proof,
causal-proofreader, causal-ucm, causal-xypic, causal-notebooklm,
sophia-mnemosyne, causal-portal, causal-gnus.
If a C-o binding doesn't seem to work, the mode probably isn't loaded
yet — Causal uses with-eval-after-load everywhere.
Org subsystem — "worlding," not GTD
- Each org file declares its own
#+TODO:states. There is no global GTD configuration. Don't impose one. org-worlding(custom, in~/.emacs.d/lisp/org-worlding.el) supplies faces, agenda files, capture templates, keybindings.- Heading colors are uniformly
#7AA2F7(light blue) across all 8 levels — this is intentional viaset-face-attributeafterorg-facesloads. org-bulletsfor pretty bullets,org-roamat~/org-roam/,org-downloadfor screenshots/yank to~/org-images/.C-c aagenda,C-c ccapture,C-c n …for org-roam.org-mcp— exposes org over MCP.
Email = Gnus over Gmail/Workspace
Configured for barton@plurigrid.com via IMAP imap.gmail.com:993 SSL +
SMTP smtp.gmail.com:587 STARTTLS. Auth in ~/.authinfo. Start with
C-c g. Gnus dirs all under ~/.emacs.d/gnus/. Causal-gnus binds C-o
in every Gnus mode.
Lisps / proof tooling
paredit,rainbow-delimiters,magit,avycider,clojure-mode,parseclj,parseedn,sesman— Clojurehy-mode— Hyproof-general+narya— Narya is the active proof assistantcausal-proofbindsC-oinproof-mode-map;causal-portalbindsC-oinnarya-mode-mapso Narya hops live inside the Portal menu.
LLMs in the buffer
chatgpt-shell(xenodium) loaded from~/.emacs.d/site-lisp/chatgpt-shellwithshell-makernext to it. Uses local MLX server athttp://127.0.0.1:8009runningmlx-community/Olmo-3-1125-32B-4bit("Olmo-3-32B"). Anthropic key fromANTHROPIC_API_KEYenv. OpenAI key falls back to literal"local".agent-shell+acp— Agent Client Protocol.mcp-server-lib,org-mcp— MCP from inside Emacs.
Voice → text on F9
whisper.el (in ~/.emacs.d/site-lisp/) bound to F9:
whisper-clifrom flox (NOT auto-installed by whisper.el;whisper-install-whispercpp = nil)- Model:
~/v/ggml-base.en.bin(base.en) - macOS mic:
avfoundation :1(MacBook Pro Mic) - Inserts at point, no timestamps. Custom
whisper-commandoverrides the default to point at the flox binary + local model.
Keyboard
- Caps Lock → F19 → Meta (and F7 fallback for terminals that map
F19→F7). Done via
key-translation-map+input-decode-mapso it works in both GUI and terminal frames. The user is on a Kinesis Advantage 360 + Dvorak. - Don't suggest remapping Caps Lock — already done.
Terminal-specific UI
xterm-mouse-modeon (terminal-only block).mouse-1set point, mouse-4/5 scroll, drag copies region.tab-line-modeglobal, terminal styling: black bg / white fg, current tab inverted.C-c <left>/C-c <right>switch tabs.- Tabs grouped by major-mode (
tab-line-tabs-mode-buffers).
Tree-sitter (Emacs 30 builtin)
treesit-language-source-alist populated for ~16 languages
(bash, c, cpp, css, go, html, java, js, json, markdown, python, rust, toml,
tsx, typescript, yaml). M-x install-tree-sitter-grammars installs all.
major-mode-remap-alist sends *-mode → *-ts-mode.
Other notable mods
- AUCTeX with
latexmk -pdfasTeX-command-default, RefTeX on,cdlatexfor both LaTeX and Org math.C-oin bibtex-mode. - ledger-mode wired to
hledger(not ledger). Custom reports for income statement / balance sheet / cash flow / monthly expenses. Files:*.journal,*.ledger,*.hledger.ob-ledgerfor org-babel. - undo-tree with persistent history at
~/.emacs.d/undo-tree-hist/. Auto-save every 100 keys / 30s idle. - crdt loaded — see
collaborative-emacsskill for the Claude-Code ↔ Emacs CRDT setup using socketclaude-crdton port 6531. - bbdb (contacts), bongo (music), org-drill (spaced repetition).
- clipetty — system clipboard via OSC 52 from TTY frames. Replaces
the broken
menu-bar-enable-clipboardbutton (which setsgui-*functions that no-op without a window-system frame). Enabled globally via(after-init . global-clipetty-mode).
Disabled but still present
- Emacspeak: commented out due to SwiftMac OGG decode having no
cache → CPU spin. The
binauralsound theme is built (seeemacspeak-binauralskill) but the(load-file ...)line is commented. Re-enable at your own risk.
Things NOT to do
- Don't suggest
pbcopy/pbpasteshellouts for clipboard — clipetty already handles this via OSC 52, faster + works over SSH. - Don't add a global
#+TODO:config — each org file owns its states. - Don't
M-x package-installan alternative to causal-suite — the plurigridcausalfork supersedes it and adds modes you'd lose. - Don't override
interprogram-cut-functiondirectly; letglobal-clipetty-modeadvise it per-frame. - Don't try to re-enable Emacspeak without first solving the SwiftMac OGG cache issue (it WILL spin a core).
- Don't assume GUI Emacs — there is none.
- Don't remove "selected packages" from the customize block at the
bottom of init.el — they're how
package-autoremoveis governed.
Quick triage
- Something doesn't bind on
C-o? Check whether the mode hook fired (with-eval-after-load) and whethercausal-<mode>was required. - "menu-bar-enable-clipboard" button doesn't paste? clipetty must be
loaded; check
(featurep 'clipetty)andglobal-clipetty-mode. - Whisper produces nothing? Check that
whisper-cliis on PATH (flox env active), that~/v/ggml-base.en.binexists, and thatavfoundation :1is the right mic index. - Caps Lock not Meta? Verify the terminal sends the F19 escape — some terminals translate it to F7 instead, both are mapped.
- Org-roam DB out of sync?
M-x org-roam-db-sync.
Related skills
emacs— base ecosystemelisp— language referenceemacs-color-chain— SplitMix64 → facesemacspeak-binaural— disabled audio themecollaborative-emacs— CRDT setup usingclaude-crdtdaemonxenodium-elisp— chatgpt-shell / agent-shellproofgeneral-narya— proof assistant
Cmd+C → Emacs kill (Ghostty binding)
The user's hard requirement is Cmd+C in terminal Emacs → macOS pasteboard, Cmd+V anywhere. The full chain that delivers this:
Cmd+C in Ghostty
→ Ghostty keybind sends literal M-w (ESC w) to Emacs
→ Emacs runs kill-ring-save on the marked region
→ clipetty advice fires, emits OSC 52 to terminal
→ Ghostty receives OSC 52 and writes selection to macOS pasteboard
→ Cmd+V anywhere on the Mac pastes the killed text
The Ghostty side lives in ~/.config/ghostty/config:
keybind = cmd+c=text:\x1bw
This OVERRIDES Ghostty's default Cmd+C = copy_to_clipboard. Trade-off: you
lose "copy Ghostty's mouse selection on Cmd+C". Workarounds for terminal-text
capture: right-click → Copy, or mouse-drag with copy-on-select = true.
The Emacs side: clipetty must be loaded and global-clipetty-mode on.
Already in init.el; verify with (featurep 'clipetty) and global-clipetty-mode.
Workflow: C-Space to set mark → move cursor → Cmd+C → text on macOS pasteboard.
Things that look like clipboard but aren't
menu-bar-enable-clipboard— the "turn on copy paste" menu button. Setsinterprogram-cut-functiontogui-select-textwhich is a no-op in TTY frames. clipetty bypasses this entirely. Don't trust the button.- Pressing Cmd+C with no Emacs region marked — sends M-w which kill-ring-saves an empty region (warning: "The mark is not active now"). Pasteboard unchanged. This isn't a bug; mark a region first.
- Ghostty selection + Cmd+C — no longer copies the terminal selection because the keybind override redirects Cmd+C to Emacs. Use right-click menu.
Reloading Ghostty config
Cmd+Shift+, reloads Ghostty config in place. If keybinds don't take effect,
fully quit and relaunch Ghostty.
Backups
Backup of original Ghostty config saved at ~/.config/ghostty/config.bak.<ts>
before the Cmd+C override was added (2026-04-19).
Color strobe (emacs-strobe-walk skill)
A separate sibling skill at ~/.claude/skills/emacs-strobe-walk/ that drives
every face in the frame from a SplitMix64 chain advanced once per
interaction. Background, foreground, cursor, region, hl-line, mode-line
(active + inactive), fringe, all font-lock-* faces, and org-level-1..8
get retinted on each tick. Strobing, deterministic, reseedable, throttled
(default 40 ms minimum gap).
This is what the horsin-around daemon already runs — it was launched
with -Q -l ~/horsin-around/color-walk.el (and the canonical copy is in the
skill dir). Default seed is #x42D (1069). Commands: M-x horsin/enable,
horsin/disable, horsin/reseed. Variables: horsin/seed, horsin/throttle.
Drop into any new daemon:
emacs --daemon=NAME -l ~/.claude/skills/emacs-strobe-walk/color-walk.el
# or, into a live one:
emacsclient -s NAME -e '(load-file "~/.claude/skills/emacs-strobe-walk/color-walk.el")'
Hooks installed: post-command-hook, server-visit-hook,
server-after-make-frame-hook, plus :after advice on
server-eval-and-print so even emacsclient -e ticks the chain.
Footgun (in the skill, repeating it here): never advise server-process-filter —
it fires on every network byte and deadlocks the daemon. Recovery is kill -9.
Also don't call redraw-display in the tick; force-mode-line-update t is
enough and won't block on a tty frame.
Composes cleanly with emacs-color-chain (the other SplitMix64 skill —
that one is on-demand single-apply via C-c g a; strobe-walk is continuous
auto-tick). Don't enable both at once on the same faces.
Gay-backed strobe (merged mode)
As of 2026-04-19 there is a bridge file
~/.claude/skills/emacs-strobe-walk/color-walk-gay.el that loads both
skills and rewires the strobe's two helpers (horsin/-sm, horsin/-hsl)
to delegate to gay--splitmix64 / gay--hsl-to-hex. Single source of
truth for the math; strobe provides hooks + face spec, gay provides the
color chain.
To launch a daemon with merged mode:
emacs --daemon=NAME -l ~/.claude/skills/emacs-strobe-walk/color-walk-gay.el
# or hot-load into a running daemon:
emacsclient -s NAME -e '(load-file "~/.claude/skills/emacs-strobe-walk/color-walk-gay.el")'
horsin/seed and gay-seed are mirrored at load time; horsin/reseed
is advised to also update gay-seed. Reseeding either now retargets
both the strobe trajectory and any on-demand gay-apply-chain calls.
Behavioral identity: same SplitMix64 constants, same face spec, same output — this is deduplication, not a visual change.
Takeover recipe (one-shot)
takeover.bb in this skill dir does the whole "I'm sitting down at a
daemon, give me my workspace" routine in a single call. Loading this
skill is enough — no need to also load emacs-strobe-walk /
emacs-color-chain / tmux / org; the script pulls what it needs.
~/.claude/skills/alice-emacs-mods/takeover.bb # server + 6 orgs + 0x42D
~/.claude/skills/alice-emacs-mods/takeover.bb factory # same for factory daemon
~/.claude/skills/alice-emacs-mods/takeover.bb server 4 0xCAFE
What it does, in order:
-
Finds
emacsclientvia/nix/store/*emacs-nox-*/bin/emacsclient(with PATH / homebrew fallbacks). -
Probes the daemon using
perl -e 'alarm 3; exec @ARGV'— never hangs on a stale socket (thefactorysocket has bitten us;claude-crdtandserverare usually live). -
Finds N most-recent
.orgfiles across~/worlds ~/org ~/org-roam ~/.emacs.dusingstat -f '%m %N'+sort -rn(macOS stat syntax). -
Splits every frame of the daemon into a 2×3 grid via
split-window … 'below+'right, thenbalance-windows, and visits one file per pane in reading order:w1 w4 w2 w5 w3 w6 -
Hot-loads
~/.claude/skills/emacs-strobe-walk/color-walk-gay.eland calls(horsin/reseed SEED)with an explicit seed. Gotcha: after the bridge loads,horsin/reseedis advised with arity 1 — calling it no-arg raisesWrong number of arguments. The script catches that and falls back to the no-arg form for the plaincolor-walk.elcase.
Daemon roles (matters — don't pick the wrong one)
| Daemon | What it is | Good for takeover? |
|---|---|---|
server | The real frame the user attaches to with emacsclient -t -s server | yes (default) |
factory | Full init.el daemon; may be stale (hung probe) | sometimes |
claude-crdt | -Q headless for CRDT sharing — no visible frame by default | no (placement is invisible) |
horsin-around | -Q strobe-only daemon | no |
Lesson 2026-04-20: targeting claude-crdt placed 6 files on an invisible
frame while the user watched an unrelated emacs -nw splash. Always target
server unless you have a reason not to.
Attach
emacsclient -s server -t # TTY frame in current terminal
emacsclient -s server -c # new graphical frame (GUI build only — N/A here)
See also (added by plurigrid-asi-ghostel)
- [[plurigrid-asi-ghostel]] — ghostel (libghostty-vt) substrate for plurigrid/asi agent channels. Replaces make-comint; adds OSC-133 prompt nav, OSC-51;e shell→Emacs bridge, TRAMP-aware remote VT, ghostel-compile.
See also (added by bob-emacs-mods)
- [[bob-emacs-mods]] — operational complement of alice: ghostel mastery, multi-daemon orchestration, cross-session coordination, REPL-as-citizen, debug/recovery, session-specific team-red params.
Session cross-refs (2026-04-23, e-session)
This skill participates in the 32-skill working set assembled in /Users/alice/worlds/e session 2026-04-23 (15 new skills also created).
Outgoing references (this skill src → other skill dest):
alice-emacs-mods→ghostel-imposter-audit— detects comint imposters in daemon buffer-listalice-emacs-mods→horsin-bignum-safe— fixes Crack #2 bignum seed overflow in horsin/tickalice-emacs-mods→ghostel-multi-spawn-safe— serialized spawn recipe avoids Crack #4 daemon hangalice-emacs-mods→narya-pg-clean-reload— workaround for Crack #1 PG macro collisionalice-emacs-mods→emacs-session-seed-bridge— ties $CLAUDE_SESSION_ID into horsin/seedalice-emacs-mods→causal-asi-hydra— wires asi-agenda onto C-c a A alongside Causal C-o
Incoming references (other skill src → this skill dest):
plurigrid-asi-ghostel→alice-emacs-mods— host daemon conventionsbob-emacs-mods→alice-emacs-mods— host-level defaults; operational layer lives in bob
Verified GF(3) triads containing this skill:
- alice-emacs-mods (-1) ⊗ bob-emacs-mods (0) ⊗ plurigrid-asi-ghostel (+1) = 0 ✓
REPL atlas
Part of: repl-commons. Family canonical: emacs.
Signals
- GitHub stars
- 63
- Forks
- 12
- Last commit
- Jul 2026
Advanced
- Catalog kind
- skill
- Gateway key
alice-emacs-mods- Source
- github.com/plurigrid/asi