Keybindings

On macOS, some bindings use Option or Fn keys instead (run /help for exact keybindings).

General

KeyAction
Ctrl+CQuit / clear input
Ctrl+HShow keybindings
Ctrl+N / Ctrl+PNext / previous task chat
Ctrl+FSearch messages
Ctrl+SFile picker
Ctrl+OOpen plan in editor
Ctrl+TToggle plan panel
Ctrl+XOpen tasks

Editing

KeyAction
EnterSubmit prompt
\+Enter / Ctrl+J / Alt+EnterNewline
TabToggle mode
/commandOpen command palette
Ctrl+WDelete word backward
Alt+← / Alt+→Move word left / right
Ctrl+AJump to start of line
Home / EndJump to start/end of line
Ctrl+U / Ctrl+DScroll half page up / down
Ctrl+EJump to end of line
Ctrl+GScroll to top
Ctrl+BScroll to bottom
Ctrl+QPop queue
Esc EscRewind
Alt+OEdit input in external editor

macOS-specific

KeyAction
Ctrl+Del / ⌥DelDelete word forward
Ctrl+KDelete to end of line

While Streaming

KeyAction
/ Navigate input history
Esc EscCancel agent

Form

KeyAction
/ Navigate options
EnterSelect option
EscClose

Pickers

KeyAction
/ Navigate
EnterSelect
EscClose
TypeFilter
PageUp / PageDownScroll page up / down
Ctrl+U / Ctrl+DScroll page up / down

Context-Specific

Some pickers add extra bindings on top of the defaults:

ContextKeyAction
QueueEnterRemove item
CommandsTabComplete command
Model Picker!/@/#/$Set tier (strong/medium/weak/compaction)
Session PickerCtrl+NNew session
Session PickerCtrl+RRename session
Session PickerCtrl+DDelete session (press twice)

Context Inheritance

Child contexts inherit their parent's bindings and add their own.

  • Pickers is the base for: Task Picker, Rewind Picker, Theme Picker, Model Picker, Queue, Commands, Search, File Picker

Overriding Keybindings

Plugins and init.lua can rebind keys at runtime with maki.keymap.set and maki.keymap.del. The tables above are the built-in defaults. An override on the same key wins, unless a modal or overlay is open (help, plan form, permission prompt).

Precedence, high to low:

  1. Suspend (Ctrl+Z, Unix). Always wins, non-remappable.
  2. Modal and overlay keys. An open modal or picker consumes its keys first, so they cannot be shadowed while open.
  3. Lua overrides from maki.keymap.set. Last set wins; binding the same key twice warns.
  4. Built-in defaults. An override on the same key shadows them; maki.keymap.del lifts the override so the default returns. Suspend is the only binding outside this layer, so every key is remappable except Ctrl+Z.

Only single-key bindings can be overridden. Multi-key combinations and non-key rows (like Type to filter) cannot.

The /help modal and the splash show default labels, not live overrides, but pressing the key still runs the override.

Recovering from a bad keymap

If an override leaves Maki stuck (a rebound Ctrl+C, a modal that won't close, a plugin that throws on load), boot without user init.lua:

maki --no-plugins

Skips user init.lua files (global and project) but keeps the Lua host and builtin plugins running, so tools still work. permissions.toml, custom commands, and env files load as usual.

The default keymap lives in Rust, not Lua, so --no-plugins never drops it.