Keybindings
/help prints this list inside the console.
Input
| Key | Action |
|---|---|
| Enter | Send the message |
| Alt+Enter / Ctrl+J | Insert a newline |
| Shift+Enter | Insert a newline, on terminals that report it - see Shift+Enter and Option |
| Ctrl+V | Paste an image from the clipboard |
| Shift+Tab | Cycle reasoning effort: low -> medium -> high -> low |
| Alt+T | Toggle reasoning effort between low and the last non-low level |
Typing while the agent works queues your message rather than dropping it. See Sessions.
Editing
The composer follows readline, so shell habits carry over. Motion and deletion are line-wise, not buffer-wise: a message with newlines in it has more than one line to move around.
| Key | Action |
|---|---|
| Ctrl+A / Ctrl+E, Home / End | Start / end of the line |
| Ctrl+B / Ctrl+F, ← / → | One character left / right |
| Alt+B / Alt+F | One word left / right |
| Ctrl+← / →, Option+← / → | One word left / right |
| Backspace / Delete, Ctrl+H | Delete one character |
| Alt+Backspace, Option+Delete | Delete the word before the caret |
| Ctrl+W | Delete the whitespace-delimited word before the caret |
| Alt+D, Ctrl+Delete | Delete the word after the caret |
| Ctrl+U / Ctrl+K | Delete to the start / end of the line |
| Ctrl+T | Transpose the characters around the caret |
| Ctrl+P / Ctrl+N | Previous / next sent message |
| Esc | Clear the input |
Ctrl+W and Alt+Backspace both delete backwards, but
they disagree on where a word ends, exactly as they do in a shell. On src/core/cli/tui.rs,
Ctrl+W takes the whole path and Alt+Backspace takes
just rs.
Shift+Enter and the Option key
Two keystrokes depend on the terminal rather than on Jan, because the terminal decides what reaches the application at all:
- Shift+Enter has no representation in the classic terminal encoding - it sends a bare carriage return, identical to a plain Enter. It only arrives when the terminal implements the kitty keyboard protocol, which Jan asks for at startup. kitty, Ghostty, WezTerm, foot, Rio, Konsole 24+, Alacritty 0.14+, iTerm2 3.5+ and Windows Terminal all deliver it. Terminal.app and VTE terminals (gnome-terminal, Tilix) cannot.
- Option+Delete on macOS needs the terminal to send
OptionasAlt. Several terminals - including kitty and Ghostty - default to treating it as an accent-composition modifier instead, so the keystroke arrives as a plain delete and removes one character.
Run /terminal-setup to fix whichever of these applies. It writes the terminal's own config
where it can (a VS Code keybinding, macos_option_as_alt for kitty, macos-option-as-alt for
Ghostty, extended-keys for tmux) and prints the exact manual step where it cannot. It is
idempotent and never overwrites a binding you already set.
The console offers it once at startup when a config file shows a key is being dropped. Set
terminal_hint = false in ~/.jan/config.toml to silence that note.
Alt+Enter, Ctrl+J and Ctrl+W need no terminal support at all. If you would rather not configure anything, use those.
Running
| Key | Action |
|---|---|
| Esc / Ctrl+C | Cancel the running turn |
| Esc Esc | Rewind to an earlier message (when idle) |
Cancelling stops the turn, not the session. See rewinding.
Reading
| Key | Action |
|---|---|
| ↑ / ↓ | Recall sent messages, or scroll the transcript once the input has text |
| PgUp / PgDn | Scroll the transcript, always |
| Ctrl+O | Expand or collapse all tool calls and reasoning blocks |
| Drag | Select text, copied on release (Alt+drag selects a block) |
| Click | Expand or collapse the row under the pointer |
Mouse tracking is on by default, which means Jan owns selection rather than the terminal - dragging
selects and copies through Jan, and clicking a folded row expands it. Set mouse = false in
~/.jan/config.toml to hand both back to the terminal. There is no hotkey for this.
Approval prompts
When the agent asks before a write or a command:
| Key | Action |
|---|---|
| y | Allow once |
| a | Allow, and stop asking for this kind of call this session |
| n | Deny |
See Tool permissions.
Exit
| Key | Action |
|---|---|
| Ctrl+D | Quit |