34 lines
1.8 KiB
Markdown
34 lines
1.8 KiB
Markdown
---
|
|
id: shell/all-keyboard-shortcuts-configurable
|
|
title: "All keyboard shortcuts configurable"
|
|
theme: shell
|
|
status: open
|
|
created: 2026-08-22
|
|
date_source: stated
|
|
order: 3
|
|
---
|
|
|
|
**All keyboard shortcuts configurable.** Stated 2026-08-22 as coming soon. Every binding in the app
|
|
should be something the owner sets, not something the code decides.
|
|
|
|
**There is nothing central to configure today.** Nine separate `keydown` listeners are registered across
|
|
the app — the code editor, the file browser and its grid and dialogs, the terminal, the chat launcher,
|
|
the embeddable chat, the file viewer's editor, and Spotlight — each owning its own keys, in its own
|
|
component, with no registry and no way to see the set at once. So the first half of this is an
|
|
inventory, and the second is a registry the bindings are read FROM rather than written INTO the
|
|
components.
|
|
|
|
Spotlight is the cautionary tale and it is already written down in `Spotlight.tsx:14`: the launcher went
|
|
`ctrl-space` → `shift-space` → `alt-space`, three changes in a day, because each chord turned out to
|
|
collide with something — `shift-space` types a space, which is why that version needed a focus check
|
|
that `alt-space` does not. **A hard-coded chord costs a code change and a release every time it is
|
|
wrong**, which is the argument for this item in one sentence.
|
|
|
|
Worth deciding with the config format: a binding that conflicts with another must be refused or flagged
|
|
at the moment it is set, since the failure otherwise is silent and shows up as "that key does nothing".
|
|
And a browser cannot claim every chord — some are the browser's or the window manager's — so the UI has
|
|
to be able to say a binding was rejected by something above it.
|
|
|
|
Storage lands on `todo/settings/` — this is exactly the kind of preference that should be a portable
|
|
file rather than a row.
|