Docs
Jan Agent
Keybindings

Keybindings

/help prints this list inside the console.

Input

KeyAction
EnterSend the message
Alt+Enter / Ctrl+JInsert a newline
Shift+EnterInsert a newline, on terminals that report it - see Shift+Enter and Option
Ctrl+VPaste an image from the clipboard
Shift+TabCycle reasoning effort: low -> medium -> high -> low
Alt+TToggle 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.

KeyAction
Ctrl+A / Ctrl+E, Home / EndStart / end of the line
Ctrl+B / Ctrl+F, / One character left / right
Alt+B / Alt+FOne word left / right
Ctrl+ / , Option+ / One word left / right
Backspace / Delete, Ctrl+HDelete one character
Alt+Backspace, Option+DeleteDelete the word before the caret
Ctrl+WDelete the whitespace-delimited word before the caret
Alt+D, Ctrl+DeleteDelete the word after the caret
Ctrl+U / Ctrl+KDelete to the start / end of the line
Ctrl+TTranspose the characters around the caret
Ctrl+P / Ctrl+NPrevious / next sent message
EscClear 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 Option as Alt. 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

KeyAction
Esc / Ctrl+CCancel the running turn
Esc EscRewind to an earlier message (when idle)

Cancelling stops the turn, not the session. See rewinding.

Reading

KeyAction
/ Recall sent messages, or scroll the transcript once the input has text
PgUp / PgDnScroll the transcript, always
Ctrl+OExpand or collapse all tool calls and reasoning blocks
DragSelect text, copied on release (Alt+drag selects a block)
ClickExpand 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:

KeyAction
yAllow once
aAllow, and stop asking for this kind of call this session
nDeny

See Tool permissions.

Exit

KeyAction
Ctrl+DQuit