Single source of truth for the TUI's keyboard shortcuts.
Shortcuts are CTRL chords, identical on every platform (macOS / Windows / Linux). The old Alt/Option chords were removed: stock macOS terminals send Option+letter as a special character, never an Alt modifier, so those chords silently did nothing. Ctrl always reaches the app.
ONE registry, ONE exception: every vis-side chord is defined HERE — verbs in
bindings, structural keys (palette / help / quit) as the constants below.
constants below. The SOLE exception is the Emacs EDITING chords
(C-a/C-e/C-b/C-f/C-p/C-n/C-k/C-u/C-w/C-d), which live in lanterna's
TextEditKeymap so they work in EVERY input (prompt + dialogs); they are
never re-declared here, and no vis chord may reuse one of those letters
(enforced by keymap-test).
Chord labels use ONE format everywhere: Emacs notation, lower-cased —
C-c, C-g, C-l, and C-x <key> (plain second key) for the prefixed vis
commands (e.g. C-x m, C-x s). chord / label-for / palette-chord all
emit this shape, so a hint never drifts between Ctrl+X and C-x.
Tiers:
palette-chord (C-x p) opens the searchable command palette, which
can run EVERY app verb. It is the discoverable entry point. (A PLAIN
second key after C-x always reaches the app — unlike Ctrl+S/Ctrl+M — so
the palette is C-x p, not C-x C-p.)
named verbs (model, reasoning, length, search, attach, voice,
named verbs (model, reasoning, length, search, attach, voice, dirs,
resources, help) — the C-x prefix keeps them off the editing letters, and a
PLAIN second key keeps them clear of unusable Ctrl bytes (Ctrl+S=flow
control, Ctrl+M=Enter).bindings (direct Ctrl chords) is EMPTY: every Ctrl letter is an Emacs
editing key, so vis verbs all live behind the C-x prefix or in the palette.Every surface — the input dispatcher, the pickers, footer hints, the help overlay, the clickable header chips — reads this namespace, so a shortcut is defined once and stays in sync.
Single source of truth for the TUI's keyboard shortcuts. Shortcuts are CTRL chords, identical on every platform (macOS / Windows / Linux). The old Alt/Option chords were removed: stock macOS terminals send Option+letter as a special character, never an Alt modifier, so those chords silently did nothing. Ctrl always reaches the app. ONE registry, ONE exception: every vis-side chord is defined HERE — verbs in `bindings`, structural keys (palette / help / quit) as the constants below. constants below. The SOLE exception is the Emacs EDITING chords (C-a/C-e/C-b/C-f/C-p/C-n/C-k/C-u/C-w/C-d), which live in lanterna's `TextEditKeymap` so they work in EVERY input (prompt + dialogs); they are never re-declared here, and no vis chord may reuse one of those letters (enforced by `keymap-test`). Chord labels use ONE format everywhere: Emacs notation, lower-cased — `C-c`, `C-g`, `C-l`, and `C-x <key>` (plain second key) for the prefixed vis commands (e.g. `C-x m`, `C-x s`). `chord` / `label-for` / `palette-chord` all emit this shape, so a hint never drifts between `Ctrl+X` and `C-x`. Tiers: - `palette-chord` (C-x p) opens the searchable command palette, which can run EVERY app verb. It is the discoverable entry point. (A PLAIN second key after C-x always reaches the app — unlike Ctrl+S/Ctrl+M — so the palette is `C-x p`, not `C-x C-p`.) named verbs (model, reasoning, length, search, attach, voice, named verbs (model, reasoning, length, search, attach, voice, dirs, resources, help) — the C-x prefix keeps them off the editing letters, and a PLAIN second key keeps them clear of unusable Ctrl bytes (Ctrl+S=flow control, Ctrl+M=Enter). - `bindings` (direct Ctrl chords) is EMPTY: every Ctrl letter is an Emacs editing key, so vis verbs all live behind the C-x prefix or in the palette. Every surface — the input dispatcher, the pickers, footer hints, the help overlay, the clickable header chips — reads this namespace, so a shortcut is defined once and stays in sync.
(abort-hint)The advertised abort chord for a footer/echo hint — every abort-keys label
joined, e.g. C-g / Esc.
The advertised abort chord for a footer/echo hint — every `abort-keys` label joined, e.g. `C-g / Esc`.
C-g — Emacs keyboard-quit (abort): cancel a running turn / close a
dialog / clear the draft. The ctrl-char the dispatcher matches; Esc is its
mirror. See abort-keys for the full advertised set.
C-g — Emacs `keyboard-quit` (abort): cancel a running turn / close a dialog / clear the draft. The ctrl-char the dispatcher matches; Esc is its mirror. See `abort-keys` for the full advertised set.
The COMPLETE set of keys that abort (cancel a running turn / close a dialog /
clear the draft): C-g (Emacs keyboard-quit) and its Esc mirror. ONE source
of truth — the dispatcher recognizes all of them and the footer/echo hint
advertises all of them, so an abort key never fires without being shown, and
the two never drift apart. Ordered for a stable hint (abort-hint).
The COMPLETE set of keys that abort (cancel a running turn / close a dialog / clear the draft): C-g (Emacs `keyboard-quit`) and its Esc mirror. ONE source of truth — the dispatcher recognizes all of them and the footer/echo hint advertises all of them, so an abort key never fires without being shown, and the two never drift apart. Ordered for a stable hint (`abort-hint`).
(action-for ch)The action bound to a DIRECT Ctrl + ch chord, or nil — always nil now (verbs
are C-x-prefixed). Kept so the dispatcher's direct-chord clause stays total.
The action bound to a DIRECT Ctrl + `ch` chord, or nil — always nil now (verbs are C-x-prefixed). Kept so the dispatcher's direct-chord clause stays total.
Direct (single-chord) app verbs — EMPTY now. Every verb moved behind the C-x prefix or into the M-x palette, freeing the Ctrl letters for Emacs editing.
Direct (single-chord) app verbs — EMPTY now. Every verb moved behind the C-x prefix or into the M-x palette, freeing the Ctrl letters for Emacs editing.
(chord key)Human label for a Ctrl + key chord in Emacs notation, e.g. (chord \f) →
"C-f". Single letters are LOWER-cased (Emacs style); named keys pass
through verbatim ((chord "Enter") → "C-Enter"). This is the ONE chord
format across the whole TUI — label-for/palette-chord use the same
C-x C-… shape, so a hint never drifts between Ctrl+X and C-x. Identical
on every platform.
Human label for a Ctrl + `key` chord in Emacs notation, e.g. `(chord \f)` → `"C-f"`. Single letters are LOWER-cased (Emacs style); named keys pass through verbatim (`(chord "Enter")` → `"C-Enter"`). This is the ONE chord format across the whole TUI — `label-for`/`palette-chord` use the same `C-x C-…` shape, so a hint never drifts between `Ctrl+X` and `C-x`. Identical on every platform.
(label-for action)Display label for action's shortcut, or nil. Direct chord → C-l; a C-x
prefix command → C-x <key> with a PLAIN second key (e.g. C-x s).
The second key is PLAIN, never C-x C-<key>: a Ctrl'd second key is unusable
for several letters — Ctrl+S/Ctrl+Q are tty flow-control (XOFF/XON, eaten
before the app sees them) and Ctrl+M is byte 0x0D = Enter (indistinguishable
from Return). A plain letter byte always reaches the app, so C-x s,
C-x m, … work everywhere. (resolve-prefix-key still ALSO accepts a Ctrl'd
second key for the letters where it survives, so old muscle memory keeps
working — the displayed hint is just the reliable one.) palette-only → nil.
Display label for `action`'s shortcut, or nil. Direct chord → `C-l`; a C-x prefix command → `C-x <key>` with a PLAIN second key (e.g. `C-x s`). The second key is PLAIN, never `C-x C-<key>`: a Ctrl'd second key is unusable for several letters — `Ctrl+S`/`Ctrl+Q` are tty flow-control (XOFF/XON, eaten before the app sees them) and `Ctrl+M` is byte 0x0D = Enter (indistinguishable from Return). A plain letter byte always reaches the app, so `C-x s`, `C-x m`, … work everywhere. (`resolve-prefix-key` still ALSO accepts a Ctrl'd second key for the letters where it survives, so old muscle memory keeps working — the displayed hint is just the reliable one.) palette-only → nil.
(label-or-palette action)A WORKING chord hint for action: its direct/prefix chord if it has one, else
palette-chord (C-x C-p) — every verb is in the palette, so this never
advertises a dead key.
A WORKING chord hint for `action`: its direct/prefix chord if it has one, else `palette-chord` (C-x C-p) — every verb is in the palette, so this never advertises a dead key.
Label for the chord that opens the searchable Command Palette. It is
C-x p — the Emacs C-x prefix followed by a PLAIN p (prefix-palette-key).
This is the RELIABLE, no-config trigger: both bytes reach the app on macOS
AND Linux, nothing OS-grabs them, and it touches no editing key. C-x C-p
still ALSO opens it (old muscle memory), and M-x (Alt/Option+x) is the
canonical Emacs alias (needs "Use Option as Meta" on macOS), but C-x p is
the displayed binding.
Label for the chord that opens the searchable Command Palette. It is C-x p — the Emacs C-x prefix followed by a PLAIN `p` (`prefix-palette-key`). This is the RELIABLE, no-config trigger: both bytes reach the app on macOS AND Linux, nothing OS-grabs them, and it touches no editing key. C-x C-p still ALSO opens it (old muscle memory), and M-x (Alt/Option+x) is the canonical Emacs alias (needs "Use Option as Meta" on macOS), but C-x p is the displayed binding.
M-x palette alias: Alt/Option + this key also opens the palette (the canonical
Emacs command launcher; needs "Use Option as Meta" on macOS).
x = execute-extended-command.
M-x palette alias: Alt/Option + this key also opens the palette (the canonical Emacs command launcher; needs "Use Option as Meta" on macOS). `x` = `execute-extended-command`.
(prefix-action-for ch)The verb action bound to the C-x prefix followed by ch, or nil. Lower-cased.
The verb action bound to the C-x prefix followed by `ch`, or nil. Lower-cased.
C-x <key> → app verb. :key is the SECOND key pressed after the C-x prefix,
displayed and pressed as a PLAIN letter (C-x s, C-x m, …). A Ctrl'd second
key is NOT reliable: Ctrl+S/Ctrl+Q are tty flow-control (eaten before the
app) and Ctrl+M == Enter (byte 0x0D). The dispatcher still ALSO accepts a
Ctrl'd second key where it survives (so C-x C-f == C-x f), but the plain
form is the one we advertise because it works for EVERY letter.
Order is the which-key / help display order. An optional :show-when tag
(:multi-tab, :has-turns) gates the verb's which-key STRIP entry to the
context where it can act; :never keeps it palette-only. The chord, palette,
and help still list every verb.
C-x <key> → app verb. `:key` is the SECOND key pressed after the C-x prefix, displayed and pressed as a PLAIN letter (`C-x s`, `C-x m`, …). A Ctrl'd second key is NOT reliable: `Ctrl+S`/`Ctrl+Q` are tty flow-control (eaten before the app) and `Ctrl+M` == Enter (byte 0x0D). The dispatcher still ALSO accepts a Ctrl'd second key where it survives (so `C-x C-f` == `C-x f`), but the plain form is the one we advertise because it works for EVERY letter. Order is the which-key / help display order. An optional `:show-when` tag (`:multi-tab`, `:has-turns`) gates the verb's which-key STRIP entry to the context where it can act; `:never` keeps it palette-only. The chord, palette, and help still list every verb.
The Emacs prefix key for vis commands: C-x, then one of prefix-commands.
C-x is Emacs's own command prefix, so this is the faithful home for vis verbs.
The Emacs prefix key for vis commands: C-x, then one of `prefix-commands`. C-x is Emacs's own command prefix, so this is the faithful home for vis verbs.
C-x p — after the C-x prefix, this key opens the Command Palette. A PLAIN p
is the primary, reliable, no-config, Emacs-idiomatic palette trigger; a Ctrl'd
second key (C-x C-p) is ALSO accepted for old muscle memory.
C-x p — after the C-x prefix, this key opens the Command Palette. A PLAIN `p` is the primary, reliable, no-config, Emacs-idiomatic palette trigger; a Ctrl'd second key (C-x C-p) is ALSO accepted for old muscle memory.
C-c — quit on an empty draft, else clear it (terminal reflex).
C-c — quit on an empty draft, else clear it (terminal reflex).
C-l — Emacs recenter: jump the conversation to the bottom + repaint.
C-l — Emacs `recenter`: jump the conversation to the bottom + repaint.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |