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 / picker-reorder) as the
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.)prefix-commands are the C-x <key> plain-second-key shortcuts for the
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 / picker-reorder) as the 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`.) - `prefix-commands` are the `C-x <key>` plain-second-key shortcuts for the 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.
C-g — Emacs keyboard-quit (abort): cancel a running turn / close a
dialog / clear the draft. Mirrors Escape.
C-g — Emacs `keyboard-quit` (abort): cancel a running turn / close a dialog / clear the draft. Mirrors Escape.
(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`.
C-n — move the selected picker row down.
C-n — move the selected picker row down.
C-p — move the selected picker row up.
C-p — move the selected picker row up.
(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.
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.
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 |