Skip to content

Keyboard shortcuts

A terminal agent’s input line looks like a text box and behaves like a readline-descended line editor. Ctrl+A doesn’t select all, it moves to the start of the line. Ctrl+X doesn’t cut. Nothing errors - you just get a different feature, silently.

Everything below was read from each tool’s own source, binary or docs, and is dated. 489 bindings, 6 tools, 8 surfaces.

The test: if you keep reaching for the same familiar key and the agent does something else, look up the binding by intent before changing your terminal or editor.

Show

Pick the one you use - or two, if you're migrating between them.

Everything on this page - the tables, the collisions, the full reference - filters to what you pick above.

TaskClaude CodeCodexOpenCodePiCursorIDECursorCopilotIDECopilot
Stop the agentEscEscEscEsc---Esc
Newline without submittingCtrl+JCtrl+JCtrl+JCtrl+J-Ctrl+J--
Newline (alternative)-Shift+EnterShift+EnterShift+Enter-Shift+Enter-Shift+Enter
Paste an imageCtrl+VCtrl+V-Ctrl+V----
Delete to line startCtrl+UCtrl+UCtrl+UCtrl+U---Ctrl+U
Delete to line endCtrl+KCtrl+KCtrl+KCtrl+KCtrl+K--Ctrl+K
Delete previous wordCtrl+WCtrl+WCtrl+WCtrl+WCtrl+W--Ctrl+W
Paste back what you deletedCtrl+YCtrl+Y-Ctrl+Y----
Jump to line startCtrl+ACtrl+ACtrl+ACtrl+A---Ctrl+A
Jump to line endCtrl+ECtrl+ECtrl+ECtrl+ECtrl+E--Ctrl+E
Search past promptsCtrl+RCtrl+R-----Ctrl+R
Open $EDITOR-Ctrl+G-Ctrl+G---Ctrl+X then e
Cycle modeShift+TabShift+TabShift+TabShift+TabShift+TabShift+Tab-Shift+Tab
QuitCtrl+DCtrl+DCtrl+DCtrl+D-Ctrl+D-Ctrl+D
Suspend to shellCtrl+ZCtrl+ZCtrl+ZCtrl+Z---Ctrl+Z

Three things worth pulling out of that table, if you turn all six on:

  • Esc is the stop key in the terminal agents here. Not Ctrl+C. This is the strongest convergence in the set - but it holds for the CLI surfaces, not the editor ones. Inside an IDE, Esc is already spoken for: in Cursor it can accept a suggested terminal command, and in VS Code it dismisses an inline suggestion. Check which surface you are actually typing into.
  • Shift+Tab cycles a mode everywhere, but not the same mode - permission modes in Claude Code, collaboration mode in Codex, the agent in OpenCode, thinking level in Pi, agent modes in Cursor, session modes in Copilot CLI.
  • Ctrl+J inserts a newline in every TUI agent here; Shift+Enter sometimes can’t. Shift+Enter depends on your terminal being able to transmit it. Ctrl+J is the newline character, so it survives the trip. In Cursor and Copilot the newline is the host editor’s to define, not the agent’s. If Shift+Enter keeps submitting, that’s your terminal, not the agent.
KeyYou expectWhat it actually does
ctrl+kcan lose workIn stock VS Code, Cmd/Ctrl+K is a chord prefix (e.g. Cmd+K Cmd+S for Keyboard Shortcuts, Cmd+K Cmd+C to comment a block, Cmd+K Cmd+F to format selection, etc.) - pressing it alone does nothing visible, it just arms the second key.
  • claude-codedeletes from cursor to end of line (readline kill-line), stored in a yank buffer
  • codexdeletes from the cursor to the end of the line (readline-inherited kill-line)
  • opencodeinput_delete_to_line_end - deletes from the cursor to end of the current line.
  • pideletes from cursor to end of line (action id tui.editor.deleteToLineEnd, readline 'kill-line') - silently destroys unsaved typed text if triggered by muscle memory from a chord-based editor.
  • cursorCursor rebinds bare Cmd/Ctrl+K (no second key needed) to immediately open Inline Edit in the editor, or the terminal AI prompt bar when the integrated terminal has focus.
  • copilotDeletes all text from the cursor to the end of the line (and the line break itself if the cursor is already at end-of-line); no undo is documented
ctrl+asilently differentSelect all text in the current field
  • claude-codemoves cursor to the start of the current line - no selection occurs
  • codexmoves the cursor to the start of the input line (readline-inherited); inside an approval prompt it instead opens the approval details fullscreen
  • opencodeinput_line_home - moves the cursor to the start of the current line (also model_provider_list in dialog context). Real select-all is cmd/super+a instead.
  • piin the main editor: move cursor to line start (readline 'beginning-of-line', action id tui.editor.cursorLineStart). In /tree: toggle 'show all entries' filter (app.tree.filter.all). In the scoped-models selector: enable all models (app.models.enableAll - this one DOES match 'select all' semantics).
  • copilotMoves the cursor to the beginning of the current line; nothing is selected
ctrl+ccan lose workCopy the current selection to the clipboard
  • claude-codeinterrupt running operation, or clear input on first press with nothing running (second press exits)
  • codexinterrupts the running turn; if idle, quits Codex immediately with no confirmation prompt
  • opencodeinput_clear - wipes the entire input box (or, per the app_exit binding, can quit the app). A GUI user copying text before pasting elsewhere could instead lose an in-progress draft.
  • picopies selection if one exists (tui.input.copy), otherwise clears the editor (app.clear) rather than sending SIGINT/interrupt like a typical terminal ctrl+c. To actually abort/cancel the agent, use Escape (app.interrupt), not ctrl+c.
  • copilotCancels the current operation or clears the prompt input on the first press; a second press ends the whole CLI session. No copy action occurs
ctrl+dcan lose workNo universal GUI meaning; closest common expectation is 'do nothing' or, in a browser, 'bookmark this page'
  • claude-codewith empty input: exits Claude Code (double-press within 800ms); with text in the input: deletes the character after the cursor instead of exiting
  • codexdeletes the character under/after the cursor when the composer has text; quits Codex immediately (no confirmation) when the composer is empty
  • opencodeOverloaded across contexts as session_delete, stash_delete, or dialog.move_session.delete (all dialog-list actions, deletes an item in the currently open list dialog), input_delete (forward-delete a character - confirmed to win while the prompt textarea has focus, since EditBufferRenderable.deleteChar() always reports the key as handled), or one of the app_exit keys when no editor is focused.
  • picontext-dependent: deletes the character forward if the input line is non-empty (tui.editor.deleteCharForward); exits pi entirely if the input line is empty (app.exit, EOF-style shell exit); deletes a session in the session picker (app.session.delete); sets the default filter in /tree (app.tree.filter.default). Same physical key, four different action ids, one of which (app.exit) can look like the whole app quit unexpectedly to someone expecting delete-forward.
  • copilotShuts the CLI session down. The docs give no press-count qualifier or confirmation language (unlike Ctrl+C's explicit 'press twice to exit'), so the best-evidence reading is an immediate, unconfirmed shutdown with no stated handling for an in-flight agent turn or unsaved prompt text
ctrl+rsilently differentReload the page, or redo the last undone action, in most GUI apps and browsers
  • claude-codeopens reverse history search over previous prompts
  • codexopens reverse history search over previously submitted prompts
  • opencodesession_rename - opens a rename prompt for the current session.
  • pirenames the current session in the session list UI (action id app.session.rename); no evidence of a reverse-search feature in the main input (see gaps).
  • copilotOpens reverse search through the CLI's own command history
ctrl+wcan lose workclose tab/window (browsers, many GUI apps)
  • claude-codedeletes the previous word in the input (readline word-rubout)
  • codexdeletes the previous word in the composer (readline-inherited kill-word-backward)
  • opencodeinput_delete_word_backward - deletes the word before the cursor in the input box.
  • pideletes the word immediately before the cursor (action id tui.editor.deleteWordBackward, readline 'unix-word-rubout') - a longstanding terminal-app trap where users can silently delete large chunks of a half-typed prompt.
  • copilotDeletes the previous word in the prompt input, with no undo documented - a well-known terminal foot-gun for anyone reaching for it out of browser habit
ctrl+zcan lose workUndo the last action
  • claude-codesuspends the entire Claude Code process to the shell (Unix SIGTSTP) - requires `fg` to resume; input/session appears to vanish
  • codexsuspends the entire Codex process to the shell (SIGTSTP); there is no in-app undo bound to Ctrl+Z
  • opencodeterminal_suspend - backgrounds the entire OpenCode process (POSIX SIGTSTP); the TUI screen disappears until the user runs `fg` in the shell. On macOS/Linux, actual undo is cmd+z (super+z), not ctrl+z.
  • pisuspends the process to the background (job control, action id app.suspend), matching standard Unix shell behavior, not GUI undo. Editor undo is instead ctrl+- (tui.editor.undo).
  • copilotSuspends the entire CLI process to the background (standard Unix job control, resumed with 'fg' at the shell) - not scoped to a single edit, and can make the whole session appear to freeze for anyone expecting a text undo. Docs explicitly scope this to Unix; Windows behavior is unstated
ctrl+vsilently differentPaste clipboard contents as plain text at the cursor
  • codexpastes only an image from the clipboard as an attachment; text paste is a separate, automatic bracketed-paste path not bound to a key
  • opencodeinput_paste - pastes clipboard into the input box (matches expectation, no collision - included here only to confirm it was checked)
  • pipastes an IMAGE from clipboard (action id app.clipboard.pasteImage) with text fallback; plain text paste is presumably handled by normal terminal bracketed-paste rather than this binding, which is documented specifically as the image-paste action.
  • copilotPastes clipboard contents as an attachment rather than inserting them inline as text
ctrl+xsilently differentCut the current selection to the clipboard
  • claude-codenot a standalone binding - enters chord-wait mode as a prefix for ctrl+x ctrl+k / ctrl+x ctrl+e / ctrl+x ctrl+b; no text is cut
  • opencodeleader - arms leader mode and waits up to 2s for the next key; no text is cut.
  • picopies the last assistant message to the clipboard (action id app.message.copy); in /tree, copies the selected message; in the scoped-models selector, clears all model selections instead (app.models.clearAll). No 'cut' semantics anywhere.
  • copilotDoes nothing by itself - it is only a chord prefix key that waits for a follow-up key (/, e, b, or o) to run a specific action (slash command, external editor, background task, or open last link). No cut/clipboard behavior at all
tabsilently differentInside any text input/textarea (including VS Code's own webview panels), Tab conventionally either inserts a tab character or moves focus to the next control - it does not change which message is displayed.
  • codexqueues the draft while a task is running (no literal tab character can be typed via Tab)
  • cursorWhen focus is in the Cursor Chat input, Tab is bound to 'Cycle to next message' rather than an indent/focus-move action. (Tab's editor behavior - accept AI suggestion when ghost text is showing, else indent - matches ordinary VS Code IntelliSense convention and is not flagged as a collision.)
  • copilotAccepts the Copilot ghost-text suggestion in full (or first line)
ctrl+bsilently differenttoggle the browser's bookmarks bar (most browsers)
  • claude-codebackgrounds the current running Bash task; also collides with tmux's own Ctrl+B prefix (tmux users must press twice)
  • opencodesession_background - backgrounds running synchronous subagents (only reachable when the prompt textarea is not focused; while typing, ctrl+b is input_move_left's readline backward-char component instead).
ctrl+isilently differentCmd/Ctrl+I has no default binding in stock VS Code, but is widely muscle-memorized by GitHub Copilot users as 'open Copilot Inline Chat' (an inline, in-editor AI prompt at the cursor position).
  • cursorCursor binds Cmd/Ctrl+I to 'Toggle Sidepanel', opening the docked Chat/Agent panel rather than an inline, at-cursor prompt. A Copilot user reaching for inline chat gets a different UI surface (panel vs inline).
  • copilotOpens Copilot inline chat (editor context) or terminal inline chat (terminal context), inserting an AI prompt box at the cursor
ctrl+osilently differentopen a file
  • claude-codetoggles the verbose transcript viewer
  • codexcopies the last agent response to the clipboard
ctrl+tsilently differentnew tab (browser)
  • claude-codetoggles Claude's to-do checklist visibility
  • opencodevariant_cycle - cycles the active model's reasoning/thinking variant.
ctrl+ysilently differentIn the classic emacs/readline convention this CLI otherwise follows for Ctrl+A/E/U/K/W/B/F/H, Ctrl+Y is 'yank' - paste back the text most recently deleted by Ctrl+U, Ctrl+K, or Ctrl+W
  • claude-codepastes (yanks) text previously deleted via Ctrl+K/Ctrl+U/Ctrl+W - unrelated to redo
  • copilotAccepts the current inline completion suggestion instead (same action as Tab) - breaking the CLI's own readline pattern rather than colliding with a generic GUI convention
escapesilently differentEscape is a near-universal 'cancel/dismiss' convention across all editors and OSes - including elsewhere in this same Cursor shortcuts table, where Escape means 'Unfocus field' (Chat) and is commonly used to dismiss dialogs.
  • cursorIn the Terminal AI-command flow specifically, Escape is documented as 'Accept command' - it inserts/confirms the AI-generated shell command rather than dismissing it. A reflexive Escape press to back out of the flow instead confirms it.
  • copilotDismisses the active inline suggestion without any confirmation

Ctrl+Z is the one that generates panic. It is not a crash and your session isn’t gone - the process is stopped in the background. Type fg to bring it back.

Pick a tool, hold a modifier, click a key. Or search by what you’re trying to do - including the key you’d wrongly reach for, so typing ctrl+x or “select all and delete” lands on the correction.

Loading the interactive keymap...

The kill ring is not your clipboard. Ctrl+U and Ctrl+Y are a matched pair inside the editor. Text moved that way cannot be pasted into your browser. To get text out, use your terminal emulator’s own selection and copy. Some tools bind their own key for it: Pi copies the last assistant message with Ctrl+X, Codex copies the last response with Ctrl+O.

Context decides, not the key. In OpenCode, Ctrl+A, Ctrl+D, Ctrl+F and the arrows each appear against several actions and don’t conflict: a managed text-area layer is active only while the prompt has focus and wins there, and the history handler declines the keystroke unless the cursor is already at the buffer edge. When a shortcut “doesn’t work,” focus is usually somewhere you didn’t think it was.

You can rebind almost all of it, by action id. Four tools ship a remappable keymap: Claude Code (~/.claude/keybindings.json), Codex (tui.keymap.*, with an in-app /keymap picker), OpenCode (tui.json, ~140 actions plus a leader key), Pi (~/.pi/agent/keybindings.json). Default keys move between releases; action names rarely do, so write down the action. This also reveals capability no shortcut list shows: Codex ships toggle_vim_mode and toggle_fast_mode as real actions with no default key.

Every binding we have, grouped by where it applies. rl marks bindings inherited from readline rather than implemented by the tool. The last column is how the fact was established: source (read from the implementation), first-hand (run locally), docs.

Claude Codeterminal

2.1.222 · 57 bindings · checked 2026-08-05 · source

Input line

KeysDoesSrc
ctrl+lForce a full terminal redraw, preserving input. In fullscreen rendering, press twice within two seconds to run /clear.chat:clearInputsource
ctrl+rOpen reverse history search over previous prompts.rlhistory:searchsource
ctrl+sStash the current prompt text and clear the input. Pressed again on an empty prompt, restores the stashed text, cursor position, and pasted content.chat:stashsource
ctrl+vctrl+v (or cmd+v in iTerm2) macOSPaste an image from the clipboard, inserting a `[Image #N]` chip at the cursor.chat:imagePastesource
esc escDouble-tap: if the prompt has text, clears it and saves the draft to history (Up recalls it). If the prompt is empty, opens the rewind menu to restore/summarize code and conversation from an earlier point.docs
shift+tabCycle permission modes (default/Manual -> acceptEdits -> plan -> any custom modes like auto/bypassPermissions).chat:cycleModesource
option+p (mac) / alt+p (win/linux)option+p / meta+p macOSOpen the model picker.chat:modelPickersource
option+t (mac) / alt+t (win/linux)option+t / meta+t macOSToggle extended thinking mode. No effect on Fable 5, which always uses extended thinking.chat:thinkingTogglesource
option+o (mac) / alt+o (win/linux)option+o / meta+o macOSToggle fast mode.chat:fastModesource
enterSubmit the message.chat:submitsource
ctrl+jInsert a newline without submitting. Works in any terminal without configuration.chat:newlinesource
ctrl+_ / ctrl+shift+-Undo last input edit - restores the previous input text and cursor position.rlchat:undosource
ctrl+g / ctrl+x ctrl+eOpen the current prompt in your default text editor ($VISUAL/$EDITOR).rlchat:externalEditorsource
ctrl+x ctrl+kStop all running background subagents in this session. Press twice within 3 seconds to confirm.chat:killAgentssource
ctrl+aMove cursor to the start of the current logical line (in multiline input).rldocs
ctrl+eMove cursor to the end of the current logical line (in multiline input).rldocs
ctrl+kDelete from cursor to end of line. Stores deleted text for pasting (yank buffer).rldocs
ctrl+uDelete from cursor to line start. Stores deleted text for pasting; repeat to clear across lines in multiline input.rldocs
ctrl+wDelete the previous word. Stores deleted text for pasting.rldocs
ctrl+yPaste (yank) text previously deleted with Ctrl+K, Ctrl+U, or Ctrl+W.rldocs
alt+y (after ctrl+y)option+y (after ctrl+y, requires Option-as-Meta) macOSCycle through previously deleted (killed) text after a yank.rldocs
alt+boption+b (requires Option-as-Meta) macOSMove cursor back one word.rldocs
alt+foption+f (requires Option-as-Meta) macOSMove cursor forward one word.rldocs
up / down (or ctrl+p / ctrl+n)Move cursor within a multi-row prompt first; once the cursor is on the first/last visual row, navigates command history instead.history:previoushistory:nextsource
?On an empty prompt, toggles the shortcut help panel. With text already in the input, types a literal '?' instead.docs
tabAccept the current autocomplete suggestion (or place a prompt suggestion into the input).autocomplete:acceptsource
/At the start of input, opens the command/skill menu.docs
!At the start of input, enters shell mode - runs a command directly and adds its output to context.docs
@Trigger file path autocomplete/mention.docs
:name:Type a full :shortcode: to insert an emoji, or 2+ chars for a suggestion popup.docs
space (hold or tap)space macOSVoice dictation push-to-talk (hold to record, or /voice tap for tap-to-toggle).voice:pushToTalkdocs
escIn vim editing mode: switch from INSERT or VISUAL back to NORMAL mode.docs
i / I / a / A / o / O / v / VVim NORMAL-mode entry points into INSERT or VISUAL modes (insert before/at-line-start/after/at-line-end cursor, open line below/above, char-wise/line-wise visual select).docs
h j k l, w e b, 0 $ ^, gg G, f/F/t/T{char}, ; ,same macOSVim NORMAL-mode navigation motions (left/down/up/right, word/end/back-word, line start/end/first-non-blank, buffer start/end, find-char motions, repeat motion).docs
x, dd, D, dw/de/db, cc, C, cw/ce/cb, s, S, yy/Y, yw/ye/yb, p, P, >>, <<, J, u, .same macOSVim NORMAL-mode editing operators (delete char/line/to-end/word variants, change line/to-end/word variants, substitute char/line, yank line/word variants, paste after/before, indent/dedent, join lines, undo, repeat last change).docs
iw/aw, iW/aW, i"/a", i'/a', i(/a(, i[/a[, i{/a{same macOSVim text objects (inner/around word, WORD, quotes, brackets) usable with d/c/y operators.docs

Anywhere

KeysDoesSrc
ctrl+cInterrupt a running operation. If nothing is running, first press clears the prompt input; a second press exits Claude Code.app:interruptsource
ctrl+dExit Claude Code. First press shows a confirmation hint, second press within 800ms exits. When the prompt has text, deletes the character after the cursor instead (classic readline forward-delete).app:exitsource
ctrl+oToggle the verbose transcript viewer (detailed tool usage/execution with timestamps and model per message).app:toggleTranscriptsource
ctrl+tToggle visibility of Claude's to-do checklist (not the /tasks background-task view).app:toggleTodossource
ctrl+bBackground the currently running Bash command/agent task.task:backgrounddocs
ctrl+zSuspend Claude Code to the shell (Unix only). Run `fg` to resume.docs
escInterrupt Claude mid-turn (stop the current response/tool call, keeping work done so far), or close an open dialog (e.g. permission prompt) without interrupting.chat:cancelsource

Transcript / pager

KeysDoesSrc
q / ctrl+c / escExit the transcript viewer.transcript:exitsource
{ / }Jump to the previous/next user prompt in the transcript, like vim paragraph motion.docs
[Write the full conversation to the terminal's native scrollback so Cmd+F/tmux copy mode can search it.docs
vWrite the conversation to a temp file and open it in $VISUAL/$EDITOR.docs
?Show the full shortcut reference panel inside the transcript viewer.docs
ctrl+home / ctrl+endctrl+home / ctrl+end (cmd+up / cmd+down conventionally on mac, but docs specify Ctrl+Home/End) macOSJump to start/latest message of the conversation (fullscreen rendering).scroll:topscroll:bottomdocs
pageup / pagedownpageup / pagedown (fn+up/down on mac laptop keyboards) macOSScroll up/down half the viewport height in the transcript or diff viewer.scroll:pageUpscroll:pageDowndocs
ctrl+shift+c / cmd+ccmd+c macOSCopy the selected transcript text to the clipboard (fullscreen rendering text selection).selection:copydocs

Dialogs and pickers

KeysDoesSrc
left / rightCycle through dialog tabs (navigate between tabs in permission dialogs and menus).tabs:previoustabs:nextdocs
up/down/left/right, ctrl+n/ctrl+p, j/ksame macOSMove selection up/down in generic select lists and the rewind/summarize message selector.rlselect:nextselect:previoussource
spaceToggle a checkbox/selection in confirmation dialogs, plugin dialogs, or settings.confirm:togglesource
/Enter search mode in the Settings menu.settings:searchdocs

Permission prompts

KeysDoesSrc
y / nConfirm (Y) or decline (N) a permission/confirmation dialog.confirm:yesconfirm:nosource
ctrl+eToggle a model-generated explanation of the command on Bash/PowerShell permission prompts.confirm:toggleExplanationsource

Codexterminal

128 bindings · checked 2026-08-05

Input line

KeysDoesSrc
enterreturn macOSSubmit the current composer draft.tui.keymap.composer.submitsource
tabQueue the draft while a task is running.tui.keymap.composer.queuesource
? or shift+?Show or hide the composer shortcut overlay.tui.keymap.composer.toggle_shortcutssource
ctrl+rOpen reverse history search, or move to the previous match.rltui.keymap.composer.history_search_previoussource
ctrl+sMove to the next match in reverse history search.tui.keymap.composer.history_search_nextsource
ctrl+j / ctrl+m / shift+enter / alt+enterctrl+j / ctrl+m / shift+return / option+return macOSInsert a newline in the editor.tui.keymap.editor.insert_newlinesource
left / ctrl+bMove the cursor left.rltui.keymap.editor.move_leftsource
right / ctrl+fMove the cursor right.rltui.keymap.editor.move_rightsource
up / ctrl+pMove the cursor up.rltui.keymap.editor.move_upsource
down / ctrl+nMove the cursor down.rltui.keymap.editor.move_downsource
alt+b / alt+left / ctrl+leftoption+b / option+left / ctrl+left macOSMove to the beginning of the previous word.rltui.keymap.editor.move_word_leftsource
alt+f / alt+right / ctrl+rightoption+f / option+right / ctrl+right macOSMove to the end of the next word.rltui.keymap.editor.move_word_rightsource
home / ctrl+aMove to the beginning of the line.rltui.keymap.editor.move_line_startsource
end / ctrl+eMove to the end of the line.rltui.keymap.editor.move_line_endsource
backspace / shift+backspace / ctrl+hdelete / shift+delete / ctrl+h macOSDelete one grapheme to the left.rltui.keymap.editor.delete_backwardsource
delete / shift+delete / ctrl+dfn+delete / shift+fn+delete / ctrl+d macOSDelete one grapheme to the right.rltui.keymap.editor.delete_forwardsource
alt+backspace / ctrl+backspace / ctrl+shift+backspace / ctrl+w / ctrl+alt+hoption+delete / ctrl+delete / ctrl+shift+delete / ctrl+w / ctrl+option+h macOSDelete the previous word.rltui.keymap.editor.delete_backward_wordsource
alt+delete / ctrl+delete / ctrl+shift+delete / alt+doption+fn+delete / ctrl+fn+delete / ctrl+shift+fn+delete / option+d macOSDelete the next word.rltui.keymap.editor.delete_forward_wordsource
ctrl+uDelete from cursor to line start.rltui.keymap.editor.kill_line_startsource
ctrl+kDelete from cursor to line end.rltui.keymap.editor.kill_line_endsource
ctrl+yPaste the kill buffer (yank).rltui.keymap.editor.yanksource
ctrl+vcmd+v is NOT wired; use ctrl+v macOSPaste an image from the clipboard as an attachment.source
/Trigger the slash-command popup (only at the start of an empty draft).source
!Trigger shell-command mode (only at the start of an empty draft).source
@Trigger the file-path mention popup.source
$Trigger the connector-mentions popup.source
esc (backtrack step 1, main view, empty composer, no running turn)esc macOSPrime edit-previous-message (backtrack) mode.source
i / insertEnter insert mode at the cursor.tui.keymap.vim_normal.enter_insertsource
aEnter insert mode after the cursor.tui.keymap.vim_normal.append_after_cursorsource
shift+a / AEnter insert mode at end of line.tui.keymap.vim_normal.append_line_endsource
shift+i / IEnter insert mode at the first non-blank character.tui.keymap.vim_normal.insert_line_startsource
oOpen a new line below and enter insert mode.tui.keymap.vim_normal.open_line_belowsource
shift+o / OOpen a new line above and enter insert mode.tui.keymap.vim_normal.open_line_abovesource
h / leftMove left in Vim normal mode.tui.keymap.vim_normal.move_leftsource
l / rightMove right in Vim normal mode.tui.keymap.vim_normal.move_rightsource
k / upMove up or recall older history in Vim normal mode.tui.keymap.vim_normal.move_upsource
j / downMove down or recall newer history in Vim normal mode.tui.keymap.vim_normal.move_downsource
wMove to the start of the next word.tui.keymap.vim_normal.move_word_forwardsource
bMove to the start of the previous word.tui.keymap.vim_normal.move_word_backwardsource
eMove to the end of the current or next word.tui.keymap.vim_normal.move_word_endsource
0Move to the start of the line.tui.keymap.vim_normal.move_line_startsource
$ / shift+$Move to the end of the line.tui.keymap.vim_normal.move_line_endsource
xDelete the character under the cursor.tui.keymap.vim_normal.delete_charsource
sDelete the character under the cursor and enter insert mode.tui.keymap.vim_normal.substitute_charsource
shift+d / DDelete from cursor to end of line.tui.keymap.vim_normal.delete_to_line_endsource
shift+c / CChange from cursor to end of line and enter insert mode.tui.keymap.vim_normal.change_to_line_endsource
shift+y / YYank the entire line.tui.keymap.vim_normal.yank_linesource
pPaste after the cursor.tui.keymap.vim_normal.paste_aftersource
dBegin a delete operator and wait for a motion.tui.keymap.vim_normal.start_delete_operatorsource
yBegin a yank operator and wait for a motion.tui.keymap.vim_normal.start_yank_operatorsource
cBegin a change operator and wait for a text object.tui.keymap.vim_normal.start_change_operatorsource
escCancel a pending Vim operator.tui.keymap.vim_normal.cancel_operatorsource
dRepeat delete operator to delete the whole line.tui.keymap.vim_operator.delete_linesource
yRepeat yank operator to yank the whole line.tui.keymap.vim_operator.yank_linesource
hOperator motion left.tui.keymap.vim_operator.motion_leftsource
lOperator motion right.tui.keymap.vim_operator.motion_rightsource
kOperator motion up.tui.keymap.vim_operator.motion_upsource
jOperator motion down.tui.keymap.vim_operator.motion_downsource
wOperator motion to start of next word.tui.keymap.vim_operator.motion_word_forwardsource
bOperator motion to start of previous word.tui.keymap.vim_operator.motion_word_backwardsource
eOperator motion to end of word.tui.keymap.vim_operator.motion_word_endsource
0Operator motion to line start.tui.keymap.vim_operator.motion_line_startsource
$ / shift+$Operator motion to line end.tui.keymap.vim_operator.motion_line_endsource
iSelect an inner text object.tui.keymap.vim_operator.select_inner_text_objectsource
aSelect an around text object.tui.keymap.vim_operator.select_around_text_objectsource
escCancel the pending operator.tui.keymap.vim_operator.cancelsource
wTarget the current word.tui.keymap.vim_text_object.wordsource
shift+w / WTarget the current WORD.tui.keymap.vim_text_object.big_wordsource
( / shift+( / ) / shift+) / bTarget enclosing parentheses.tui.keymap.vim_text_object.parenthesessource
[ / ]Target enclosing brackets.tui.keymap.vim_text_object.bracketssource
{ / shift+{ / } / shift+} / shift+b / BTarget enclosing braces.tui.keymap.vim_text_object.bracessource
" / shift+"Target enclosing double quotes.tui.keymap.vim_text_object.double_quotesource
'Target enclosing single quotes.tui.keymap.vim_text_object.single_quotesource
`Target enclosing backticks.tui.keymap.vim_text_object.backticksource
escCancel the pending text object.tui.keymap.vim_text_object.cancelsource

Anywhere

KeysDoesSrc
ctrl+tOpen the transcript overlay.tui.keymap.global.open_transcriptsource
ctrl+gOpen the current draft in an external editor ($EDITOR).tui.keymap.global.open_external_editorsource
ctrl+oCopy the last agent response to the clipboard.tui.keymap.global.copysource
ctrl+lClear the terminal UI.rltui.keymap.global.clear_terminalsource
alt+roption+r macOSToggle raw scrollback mode for copy-friendly transcript selection.tui.keymap.global.toggle_raw_outputsource
ctrl+/Switch between a side conversation and its parent without closing either.tui.keymap.global.toggle_side_conversationsource
escInterrupt the active turn.tui.keymap.chat.interrupt_turnsource
alt+, or shift+downoption+, or shift+down macOSDecrease reasoning effort.tui.keymap.chat.decrease_reasoning_effortsource
alt+. or shift+upoption+. or shift+up macOSIncrease reasoning effort.tui.keymap.chat.increase_reasoning_effortsource
alt+up or shift+leftoption+up or shift+left macOSEdit the most recently queued message.tui.keymap.chat.edit_queued_messagesource
ctrl+c (first press)Interrupt the active turn if one is running.source
ctrl+c (idle, second/only press)Quit Codex.source
ctrl+d (composer empty)Quit Codex.rlsource
shift+tabCycle the collaboration mode.source
alt+leftoption+left macOSSwitch to the previous agent.source
alt+rightoption+right macOSSwitch to the next agent.source
ctrl+zSuspend Codex (SIGTSTP); resume with `fg` in the shell.source

Transcript / pager

KeysDoesSrc
esc (backtrack step 2)esc macOSOpen the transcript overlay with the last user message highlighted for editing.source
left / escSelect the previous (older) prior user message to edit.source
rightSelect the next (newer) prior user message to edit.source
enterreturn macOSFork the thread before the selected prior message and reopen it for editing.source
up / kScroll up by one row (pager/transcript overlay).tui.keymap.pager.scroll_upsource
down / jScroll down by one row (pager/transcript overlay).tui.keymap.pager.scroll_downsource
pageup / shift+space / ctrl+bScroll up by one page (pager/transcript overlay).tui.keymap.pager.page_upsource
pagedown / space / ctrl+fScroll down by one page (pager/transcript overlay).tui.keymap.pager.page_downsource
ctrl+uScroll up by half a page (pager/transcript overlay).tui.keymap.pager.half_page_upsource
ctrl+dScroll down by half a page (pager/transcript overlay).tui.keymap.pager.half_page_downsource
homeJump to the beginning (pager/transcript overlay).tui.keymap.pager.jump_topsource
endJump to the end (pager/transcript overlay).tui.keymap.pager.jump_bottomsource
q / ctrl+cClose the pager overlay.tui.keymap.pager.closesource
ctrl+tClose the transcript overlay.tui.keymap.pager.close_transcriptsource

Dialogs and pickers

KeysDoesSrc
up / ctrl+p / ctrl+k / kMove list selection up (popup pickers).tui.keymap.list.move_upsource
down / ctrl+n / ctrl+j / jMove list selection down (popup pickers).tui.keymap.list.move_downsource
left / ctrl+hMove horizontally left in list pickers (tabs/toolbars).tui.keymap.list.move_leftsource
right / ctrl+lMove horizontally right in list pickers (tabs/toolbars).tui.keymap.list.move_rightsource
pageup / ctrl+bMove list selection up by one page.tui.keymap.list.page_upsource
pagedown / ctrl+fMove list selection down by one page.tui.keymap.list.page_downsource
homeJump to the first list item.tui.keymap.list.jump_topsource
endJump to the last list item.tui.keymap.list.jump_bottomsource
enterreturn macOSAccept the current list selection.tui.keymap.list.acceptsource
escCancel and close selection views.tui.keymap.list.cancelsource
ctrl+cCancel the open list picker (resume picker etc.), does not quit Codex.source
ctrl+tToggle transcript preview inside the resume/session picker.source
ctrl+eToggle expansion inside the resume/session picker.source
ctrl+oToggle density inside the resume/session picker.source

Approval prompts

KeysDoesSrc
ctrl+a / ctrl+shift+aOpen approval details fullscreen.tui.keymap.approval.open_fullscreensource
oOpen the approval's source thread, when available.tui.keymap.approval.open_threadsource
yApprove the primary option.tui.keymap.approval.approvesource
aApprove for the rest of the session, when available.tui.keymap.approval.approve_for_sessionsource
pApprove with an exec-policy prefix, when available.tui.keymap.approval.approve_for_prefixsource
dChoose the explicit deny option, when available.tui.keymap.approval.denysource
esc / nDecline and provide corrective guidance.tui.keymap.approval.declinesource
cCancel an elicitation request.tui.keymap.approval.cancelsource

OpenCodeterminal

140 bindings · checked 2026-08-05

Input line

KeysDoesSrc
<leader>eeditor_open - open the external $EDITOR to compose the current message.editor_opensource
ctrl+cinput_clear - clear the input box.input_clearsource
ctrl+vinput_paste - paste clipboard contents into the input box.input_pastesource
returninput_submit - submit the current message.input_submitsource
shift+return,ctrl+return,alt+return,ctrl+jinput_newline - insert a newline in the input box without submitting.input_newlinesource
left,ctrl+binput_move_left - move cursor left one character.rlinput_move_leftsource
right,ctrl+finput_move_right - move cursor right one character.rlinput_move_rightsource
upinput_move_up - move cursor up a line in a multi-line input.input_move_upsource
downinput_move_down - move cursor down a line in a multi-line input.input_move_downsource
shift+leftinput_select_left - extend selection left one character.input_select_leftsource
shift+rightinput_select_right - extend selection right one character.input_select_rightsource
shift+upinput_select_up - extend selection up one line.input_select_upsource
shift+downinput_select_down - extend selection down one line.input_select_downsource
ctrl+ainput_line_home - move cursor to the start of the current line.rlinput_line_homesource
ctrl+einput_line_end - move cursor to the end of the current line.rlinput_line_endsource
ctrl+shift+ainput_select_line_home - select from cursor to start of line.input_select_line_homesource
ctrl+shift+einput_select_line_end - select from cursor to end of line.input_select_line_endsource
alt+ainput_visual_line_home - move to start of the visual (wrapped) line.input_visual_line_homesource
alt+einput_visual_line_end - move to end of the visual (wrapped) line.input_visual_line_endsource
alt+shift+ainput_select_visual_line_home - select to start of the visual line.input_select_visual_line_homesource
alt+shift+einput_select_visual_line_end - select to end of the visual line.input_select_visual_line_endsource
homeinput_buffer_home - move cursor to the very start of the whole input buffer.input_buffer_homesource
endinput_buffer_end - move cursor to the very end of the whole input buffer.input_buffer_endsource
shift+homeinput_select_buffer_home - select to the start of the whole buffer.input_select_buffer_homesource
shift+endinput_select_buffer_end - select to the end of the whole buffer.input_select_buffer_endsource
ctrl+shift+dinput_delete_line - delete the entire current line.input_delete_linesource
ctrl+kinput_delete_to_line_end - delete from cursor to end of line (kill-line).rlinput_delete_to_line_endsource
ctrl+uinput_delete_to_line_start - delete from cursor to start of line (unix-line-discard).rlinput_delete_to_line_startsource
backspace,shift+backspaceinput_backspace - delete character before cursor.input_backspacesource
ctrl+d,delete,shift+deleteinput_delete - delete character after cursor (forward delete).rlinput_deletesource
ctrl+-,super+zcmd+z (super+z),ctrl+- macOSinput_undo - undo the last text edit in the input box.input_undosource
ctrl+.,super+shift+zcmd+shift+z,ctrl+. macOSinput_redo - redo the last undone text edit in the input box.input_redosource
alt+f,alt+right,ctrl+rightinput_word_forward - move cursor forward one word.rlinput_word_forwardsource
alt+b,alt+left,ctrl+leftinput_word_backward - move cursor backward one word.rlinput_word_backwardsource
alt+shift+f,alt+shift+rightinput_select_word_forward - extend selection forward one word.input_select_word_forwardsource
alt+shift+b,alt+shift+leftinput_select_word_backward - extend selection backward one word.input_select_word_backwardsource
alt+d,alt+delete,ctrl+deleteinput_delete_word_forward - delete word after cursor (kill-word).rlinput_delete_word_forwardsource
ctrl+w,ctrl+backspace,alt+backspaceinput_delete_word_backward - delete word before cursor (unix-word-rubout).rlinput_delete_word_backwardsource
super+acmd+a macOSinput_select_all - select all text in the input box.input_select_allsource
uphistory_previous - recall the previous submitted prompt from history.history_previoussource
downhistory_next - recall the next submitted prompt from history.history_nextsource
up,ctrl+pprompt.autocomplete.prev - move to previous autocomplete suggestion (e.g. @file references).rlprompt.autocomplete.prevsource
down,ctrl+nprompt.autocomplete.next - move to next autocomplete suggestion.rlprompt.autocomplete.nextsource
escapeprompt.autocomplete.hide - dismiss the autocomplete popup.prompt.autocomplete.hidesource
returnprompt.autocomplete.select - accept the highlighted autocomplete suggestion.prompt.autocomplete.selectsource
tabprompt.autocomplete.complete - complete/accept via Tab.prompt.autocomplete.completesource

Anywhere

KeysDoesSrc
ctrl+xLeader key. Activates leader mode for leader_timeout ms (default 2000); the next key pressed is interpreted as a leader combo, e.g. ctrl+x then n = new session.leadersource
ctrl+c,ctrl+d,<leader>qapp_exit - quit OpenCode.app_exitsource
ctrl+pcommand_list - open the command palette.command_listsource
<leader>ttheme_list - open theme picker.theme_listsource
<leader>bsidebar_toggle - show/hide the sidebar.sidebar_togglesource
<leader>sstatus_view - open status view.status_viewsource
<leader>xsession_export - export current conversation to Markdown and open in $EDITOR.session_exportsource
<leader>nsession_new - start a new session.session_newsource
<leader>lsession_list - list and switch between saved sessions.session_listsource
<leader>gsession_timeline - open session timeline view.session_timelinesource
ctrl+rsession_rename - rename the current session.session_renamesource
ctrl+dsession_delete - delete the currently selected/open session.session_deletesource
escapesession_interrupt - interrupt/cancel the model's in-flight response.session_interruptsource
<leader>csession_compact - compact/summarize the current session.session_compactsource
<leader>downsession_child_first - jump to the first child (subagent) session.session_child_firstsource
rightsession_child_cycle - cycle to the next child/subagent session.session_child_cyclesource
leftsession_child_cycle_reverse - cycle to the previous child/subagent session.session_child_cycle_reversesource
upsession_parent - go to the parent session.session_parentsource
ctrl+dstash_delete - delete a stashed prompt.stash_deletesource
<leader>mmodel_list - list/switch available models.model_listsource
f2model_cycle_recent - cycle to the next recently-used model.model_cycle_recentsource
shift+f2model_cycle_recent_reverse - cycle to the previous recently-used model.model_cycle_recent_reversesource
<leader>aagent_list - list/switch agents.agent_listsource
tabagent_cycle - cycle to the next agent.agent_cyclesource
shift+tabagent_cycle_reverse - cycle to the previous agent.agent_cycle_reversesource
ctrl+tvariant_cycle - cycle the active model's reasoning/thinking variant (e.g. effort level).variant_cyclesource
ctrl+zterminal_suspend - suspend OpenCode to the background (POSIX SIGTSTP, like any terminal job-control suspend; resume with `fg` in the shell).terminal_suspendsource
<leader>htips_toggle - toggle the tips panel.tips_togglesource
ctrl+alt+kwhich_key_toggle - toggle the 'which-key' style help overlay listing available leader combos.which_key_togglesource
ctrl+alt+shift+kwhich_key_layout_toggle - toggle the which-key overlay's layout.which_key_layout_togglesource
ctrl+alt+shift+pwhich_key_pending_toggle - toggle showing only pending/available combos in the which-key overlay.which_key_pending_togglesource
ctrl+alt+left,ctrl+alt+[which_key_group_previous - previous group in the which-key overlay.which_key_group_previoussource
ctrl+alt+right,ctrl+alt+]which_key_group_next - next group in the which-key overlay.which_key_group_nextsource
ctrl+alt+up,ctrl+alt+pwhich_key_scroll_up - scroll the which-key overlay up.which_key_scroll_upsource
ctrl+alt+down,ctrl+alt+nwhich_key_scroll_down - scroll the which-key overlay down.which_key_scroll_downsource
ctrl+alt+pageupwhich_key_page_up - page up in the which-key overlay.which_key_page_upsource
ctrl+alt+pagedownwhich_key_page_down - page down in the which-key overlay.which_key_page_downsource
ctrl+alt+homewhich_key_home - jump to top of the which-key overlay.which_key_homesource
ctrl+alt+endwhich_key_end - jump to bottom of the which-key overlay.which_key_endsource
ctrl+bsession_background - background running synchronous subagents.session_backgroundsource
<leader>1session_quick_switch_1 - switch to the session pinned in quick slot 1.session_quick_switch_1source
<leader>2session_quick_switch_2 - switch to the session pinned in quick slot 2.session_quick_switch_2source
<leader>3session_quick_switch_3 - switch to the session pinned in quick slot 3.session_quick_switch_3source
<leader>4session_quick_switch_4 - switch to the session pinned in quick slot 4.session_quick_switch_4source
<leader>5session_quick_switch_5 - switch to the session pinned in quick slot 5.session_quick_switch_5source
<leader>6session_quick_switch_6 - switch to the session pinned in quick slot 6.session_quick_switch_6source
<leader>7session_quick_switch_7 - switch to the session pinned in quick slot 7.session_quick_switch_7source
<leader>8session_quick_switch_8 - switch to the session pinned in quick slot 8.session_quick_switch_8source
<leader>9session_quick_switch_9 - switch to the session pinned in quick slot 9.session_quick_switch_9source

Transcript / pager

KeysDoesSrc
pageup,ctrl+alt+bmessages_page_up - scroll transcript up one page.messages_page_upsource
pagedown,ctrl+alt+fmessages_page_down - scroll transcript down one page.messages_page_downsource
ctrl+alt+ymessages_line_up - scroll transcript up one line.messages_line_upsource
ctrl+alt+emessages_line_down - scroll transcript down one line.messages_line_downsource
ctrl+alt+umessages_half_page_up - scroll transcript up half a page.messages_half_page_upsource
ctrl+alt+dmessages_half_page_down - scroll transcript down half a page.messages_half_page_downsource
ctrl+g,homemessages_first - jump to the first message in the transcript.messages_firstsource
ctrl+alt+g,endmessages_last - jump to the last message in the transcript.messages_lastsource
<leader>ymessages_copy - copy message(s) from the transcript.messages_copysource
<leader>umessages_undo - undo the last conversation turn (git-based; reverts file changes too). Requires the project to be a git repo.messages_undosource
<leader>rmessages_redo - redo a previously undone turn.messages_redosource
<leader>hmessages_toggle_conceal - toggle concealment of message content.messages_toggle_concealsource

Dialogs and pickers

KeysDoesSrc
ctrl+amodel_provider_list - open the model provider list.model_provider_listsource
ctrl+fmodel_favorite_toggle - toggle a model as favorite.model_favorite_togglesource
up,ctrl+pdialog.select.prev - move selection up in an open dialog/list.rldialog.select.prevsource
down,ctrl+ndialog.select.next - move selection down in an open dialog/list.rldialog.select.nextsource
pageupdialog.select.page_up - page up within an open dialog/list.dialog.select.page_upsource
pagedowndialog.select.page_down - page down within an open dialog/list.dialog.select.page_downsource
homedialog.select.home - jump to first item in an open dialog/list.dialog.select.homesource
enddialog.select.end - jump to last item in an open dialog/list.dialog.select.endsource
returndialog.select.submit - confirm the selected item in an open dialog/list.dialog.select.submitsource
returndialog.prompt.submit - submit a text-entry dialog/prompt.dialog.prompt.submitsource
spacedialog.mcp.toggle - toggle an item in the MCP server dialog.dialog.mcp.togglesource
spaceplugins.toggle - toggle a plugin on/off in the plugins dialog.plugins.togglesource
shift+idialog.plugins.install - install the selected plugin.dialog.plugins.installsource
escape,qdiff_close - close the diff viewer.diff_closesource
enter,spacediff_toggle - toggle the selected diff viewer item (e.g. expand/collapse or check off a file).diff_togglesource
rightdiff_expand - expand the selected diff viewer item.diff_expandsource
Ediff_expand_all - expand all folders in the diff viewer file tree.diff_expand_allsource
leftdiff_collapse - collapse the selected diff viewer item.diff_collapsesource
tabdiff_switch_focus - switch focus between diff viewer panes (e.g. file tree vs diff body).diff_switch_focussource
]diff_next_hunk - jump to the next diff hunk.diff_next_hunksource
[diff_previous_hunk - jump to the previous diff hunk.diff_previous_hunksource
ndiff_next_file - jump to the next file in the diff viewer.diff_next_filesource
pdiff_previous_file - jump to the previous file in the diff viewer.diff_previous_filesource
bdiff_toggle_file_tree - show/hide the diff viewer's file tree pane.diff_toggle_file_treesource
sdiff_single_patch - toggle single-patch view in the diff viewer.diff_single_patchsource
ddiff_switch_source - switch the diff viewer's source.diff_switch_sourcesource
vdiff_toggle_view - toggle diff viewer split vs unified view.diff_toggle_viewsource
?diff_help - show more diff viewer shortcuts.diff_helpsource
ctrl+fsession_pin_toggle - pin or unpin a session inside the session-list dialog.session_pin_togglesource
ctrl+mdialog.move_session.new - create a new project copy from the move-session dialog.dialog.move_session.newsource
ctrl+ddialog.move_session.delete - delete a project copy from the move-session dialog.dialog.move_session.deletesource
ctrl+rdialog.move_session.refresh - refresh project copies in the move-session dialog.dialog.move_session.refreshsource

Permission prompts

KeysDoesSrc
ctrl+fpermission.prompt.fullscreen - expand the permission prompt to fullscreen.permission.prompt.fullscreensource

Piterminal

0.82.1 · 56 bindings · checked 2026-08-05 · source

Input line

KeysDoesSrc
upMove cursor uptui.editor.cursorUpfirst-hand
downMove cursor downtui.editor.cursorDownfirst-hand
left, ctrl+bMove cursor leftrltui.editor.cursorLeftfirst-hand
right, ctrl+fMove cursor rightrltui.editor.cursorRightfirst-hand
alt+left, ctrl+left, alt+boption+left, ctrl+left, option+b (terminal-dependent Alt/Option mapping) macOSMove cursor one word leftrltui.editor.cursorWordLeftfirst-hand
alt+right, ctrl+right, alt+foption+right, ctrl+right, option+f (terminal-dependent) macOSMove cursor one word rightrltui.editor.cursorWordRightfirst-hand
home, ctrl+aMove to line startrltui.editor.cursorLineStartfirst-hand
end, ctrl+eMove to line endrltui.editor.cursorLineEndfirst-hand
ctrl+]Jump forward to charactertui.editor.jumpForwardfirst-hand
ctrl+alt+]ctrl+option+] macOSJump backward to charactertui.editor.jumpBackwardfirst-hand
pageUpfn+up (pageUp, terminal-dependent) macOSScroll up by page (editor)tui.editor.pageUpfirst-hand
pageDownfn+down (pageDown, terminal-dependent) macOSScroll down by page (editor)tui.editor.pageDownfirst-hand
backspacedelete (backspace) macOSDelete character backwardrltui.editor.deleteCharBackwardfirst-hand
delete, ctrl+dfn+delete (forward delete), ctrl+d macOSDelete character forwardrltui.editor.deleteCharForwardfirst-hand
ctrl+w, alt+backspacectrl+w, option+delete macOSDelete word backwardrltui.editor.deleteWordBackwardfirst-hand
alt+d, alt+deleteoption+d, option+fn+delete macOSDelete word forwardrltui.editor.deleteWordForwardfirst-hand
ctrl+uDelete to line startrltui.editor.deleteToLineStartfirst-hand
ctrl+kDelete to line endrltui.editor.deleteToLineEndfirst-hand
shift+enter, ctrl+jshift+return, ctrl+j macOSInsert new line (multiline input)tui.input.newLinefirst-hand
enterreturn macOSSubmit input; when the agent is already running, Enter instead queues a steering message delivered after the current tool-call turn finishestui.input.submitfirst-hand
tabTab / autocompletetui.input.tabfirst-hand
ctrl+yPaste (yank) most recently deleted textrltui.editor.yankfirst-hand
alt+yoption+y macOSCycle through deleted text after yank (yank-pop)rltui.editor.yankPopfirst-hand
ctrl+-Undo last editrltui.editor.undofirst-hand
ctrl+cCopy selection; if no selection, clears the editortui.input.copyapp.clearfirst-hand
ctrl+dExit pi when the editor is empty (EOF-style exit)rlapp.exitfirst-hand
ctrl+gOpen current input in an external editor ($VISUAL, $EDITOR, Notepad on Windows, or nano elsewhere)app.editor.externalfirst-hand
ctrl+vcmd+v (native paste)/ctrl+v; alt+v on Windows macOSPaste image from clipboardapp.clipboard.pasteImagefirst-hand
ctrl+pCycle to next model (when --models patterns configured); also toggles path display in the session list, and toggles all models for the current provider in the scoped-models selectorapp.model.cycleForwardapp.session.togglePathapp.models.toggleProviderfirst-hand
shift+ctrl+pCycle to previous modelapp.model.cycleBackwardfirst-hand
ctrl+lOpen model selectorapp.model.selectapp.tree.filter.labeledOnlyfirst-hand
shift+tabCycle thinking level (off/minimal/low/medium/high/xhigh/max)app.thinking.cyclefirst-hand
alt+enteroption+return macOSQueue a follow-up message, delivered after the agent finishes all current workapp.message.followUpfirst-hand
alt+upoption+up macOSRestore queued messages back to the editorapp.message.dequeueapp.models.reorderUpfirst-hand
ctrl+homeMove cursor to line start / editor top (fullscreen mode)tui.editor.cursorLineStartdocs
ctrl+endMove cursor to editor end (fullscreen mode)tui.editor.cursorLineEnddocs

Anywhere

KeysDoesSrc
escapeesc macOSCancel / abort current agent turn; in dialogs/selectors, cancels the selectionapp.interrupttui.select.cancelfirst-hand
ctrl+zSuspend to background (job control)rlapp.suspendfirst-hand

Transcript / pager

KeysDoesSrc
ctrl+tCollapse or expand thinking blocksapp.thinking.toggleapp.tree.filter.noToolsfirst-hand
ctrl+oCollapse or expand tool outputapp.tools.expandapp.tree.filter.cycleForwardfirst-hand
ctrl+xCopy the last assistant message (or the selected message in /tree)app.message.copyapp.models.clearAllfirst-hand
home (unmodified)home macOSScroll transcript to top (fullscreen mode only; controls editor in default mode)tui.altScreen.topdocs
end (unmodified)end macOSScroll transcript to bottom and follow new output (fullscreen mode only)tui.altScreen.bottomdocs
ctrl+shift+upJump to the previous marked message in the transcript (fullscreen mode)tui.altScreen.previousPromptdocs
ctrl+shift+downJump to the next marked message in the transcript (fullscreen mode)tui.altScreen.nextPromptdocs

Dialogs and pickers

KeysDoesSrc
ctrl+left, alt+leftctrl+left, option+left macOSFold current tree branch segment, or jump to previous segment startapp.tree.foldOrUpfirst-hand
ctrl+right, alt+rightctrl+right, option+right macOSUnfold current tree branch segment, or jump to next segment/branch endapp.tree.unfoldOrDownfirst-hand
shift+lEdit the label on the selected tree nodeapp.tree.editLabelfirst-hand
shift+tToggle label timestamps in the treeapp.tree.toggleLabelTimestampfirst-hand
ctrl+aToggle tree filter that shows all entries (inside /tree); also enables all models in the scoped-models selectorapp.tree.filter.allapp.models.enableAllfirst-hand
ctrl+sToggle sort mode in the session list; saves current model selection in the scoped-models selectorapp.session.toggleSortapp.models.savefirst-hand
ctrl+nToggle named-only filter in the session listapp.session.toggleNamedFilterfirst-hand
ctrl+rRename sessionapp.session.renamefirst-hand
ctrl+backspacectrl+delete (backspace) macOSDelete session when the session-list query is emptyapp.session.deleteNoninvasivefirst-hand
shift+ctrl+oCycle tree filter backwardapp.tree.filter.cycleBackwardfirst-hand
alt+downoption+down macOSMove the selected model down in the cycle order (scoped-models selector)app.models.reorderDownfirst-hand

Cursoreditor extension

48 bindings · checked 2026-08-05 · source

Anywhere

KeysDoesSrc
ctrl+icmd+i macOSToggle Sidepanel (opens the Chat/Agent panel) - unless bound to a specific modedocs
ctrl+lcmd+l macOSToggle Sidepanel (opens the Chat/Agent panel) - unless bound to a specific modedocs
ctrl+.cmd+. macOSMode Menu (open the Agent/Ask/Plan mode selector)docs
ctrl+/cmd+/ macOSLoop between AI modelsdocs
ctrl+shift+jcmd+shift+j macOSCursor settingsdocs
ctrl+shift+spacecmd+shift+space macOSToggle Voice Modedocs
ctrl+,cmd+, macOSGeneral settingsdocs
ctrl+shift+pcmd+shift+p macOSCommand palettedocs

agent

KeysDoesSrc
ctrl+ecmd+e macOSToggle Agent layoutdocs

chat

KeysDoesSrc
enterNudge (default) - send/submit the chat messagedocs
ctrl+enterQueue messagedocs
ctrl+entercmd+enter macOSForce send message (when typing)docs
ctrl+shift+backspacecmd+shift+backspace macOSCancel generationdocs
ctrl+shift+lcmd+shift+l macOSAdd selected code as context (with code selected)docs
ctrl+vcmd+v macOSAdd clipboard as context (with code or log in clipboard)docs
ctrl+shift+vcmd+shift+v macOSAdd clipboard to input box (with code or log in clipboard)docs
ctrl+entercmd+enter macOSAccept all changes (with suggested changes pending)docs
ctrl+backspacecmd+backspace macOSReject all changesdocs
tabCycle to next messagedocs
shift+tabRotate between Agent modesdocs
ctrl+alt+/cmd+opt+/ macOSModel toggledocs
ctrl+ncmd+n macOSNew chatdocs
ctrl+rcmd+r macOSNew chatdocs
ctrl+tcmd+t macOSNew chat tabdocs
ctrl+[cmd+[ macOSPrevious chatdocs
ctrl+]cmd+] macOSNext chatdocs
ctrl+wcmd+w macOSClose chatdocs
escUnfocus fielddocs
@@-mentions - trigger the context-attachment picker (files, docs, symbols, etc.)docs
/Shortcut Commands - trigger the slash-command menu in chat/agent inputdocs
ctrl+entercmd+enter macOSSearch codebase in chatdocs
ctrl+c then ctrl+vcmd+c then cmd+v macOSAdd copied reference code as contextdocs
ctrl+c then ctrl+shift+vcmd+c then cmd+shift+v macOSAdd copied code as text contextdocs

editor

KeysDoesSrc
ctrl+kcmd+k macOSOpen (Inline Edit prompt)docs
ctrl+shift+kcmd+shift+k macOSToggle input focus (Inline Edit)docs
enterSubmit (Inline Edit)docs
ctrl+shift+backspacecmd+shift+backspace macOSCancel (Inline Edit)docs
alt+enteropt+enter macOSAsk quick question (Inline Edit)docs
ctrl+shift+lcmd+shift+l macOSAdd selection to Chatdocs
ctrl+shift+kcmd+shift+k macOSAdd selection to Editdocs
ctrl+lcmd+l macOSAdd selection to new chatdocs
ctrl+mcmd+m macOSToggle file reading strategiesdocs
ctrl+rightcmd+right macOSAccept next word of suggestiondocs
tabAccept suggestion (Tab completion)docs
ctrl+rightcmd+right macOSAccept next word (Tab completion, partial accept)docs

terminal

KeysDoesSrc
ctrl+kcmd+k macOSOpen terminal prompt bar (natural-language -> shell command)docs
ctrl+entercmd+enter macOSRun generated commanddocs
escAccept commanddocs

Cursorterminal

9 bindings · checked 2026-08-05 · source

Anywhere

KeysDoesSrc
shift+tabRotate between modes (Agent, Plan, Ask)docs
shift+enterInsert a newline instead of submitting (multi-line prompts)docs
ctrl+dExit the CLIdocs
ctrl+jInsert a newline (universal alternative that works in all terminals)docs
ctrl+rReview changesdocs
iAdd follow-up instructions (while in the review flow)docs
up/downCycle through previous messages (Navigation) / scroll (during review)docs
left/rightSwitch files (during the review flow)docs
@Select files/folders to include in contextdocs

Copilotvscode extension

19 bindings · checked 2026-08-05 · source

chat

KeysDoesSrc
ctrl+alt+ictrl+cmd+i macOSOpen/focus the Copilot Chat view (side panel)workbench.action.chat.opendocs
ctrl+shift+alt+lcmd+opt+shift+l macOSOpen Quick Chat (transient inline chat popover, not the full panel)workbench.action.quickchat.toggledocs
ctrl+ncmd+n macOSStart a new chat session (clears current Chat view thread)docs
ctrl+shift+i (win) / ctrl+shift+alt+i (linux)cmd+shift+i macOSSwitch the Chat view into Agent modedocs
ctrl+alt+.option+cmd+. macOSOpen the model picker in the Chat viewdocs
ctrl+alt+upopt+cmd+up macOSGo to the previous prompt in the current chat sessiondocs
ctrl+alt+downopt+cmd+down macOSGo to the next prompt in the current chat sessiondocs
ctrl+alt+pageupopt+cmd+pageup macOSGo to the previous code block in the chat sessiondocs
ctrl+alt+pagedownopt+cmd+pagedown macOSGo to the next code block in the chat sessiondocs

completion

KeysDoesSrc
tabAccept the full ghost-text inline suggestion (or its first line if multi-line)editor.action.inlineSuggest.commitdocs
escapeDismiss the current inline suggestioneditor.action.inlineSuggest.hidedocs
alt+]option+] macOSShow next inline suggestion (cycle forward)editor.action.inlineSuggest.showNextdocs
alt+[option+[ macOSShow previous inline suggestion (cycle backward)editor.action.inlineSuggest.showPreviousdocs
alt+\option+\ macOSManually trigger an inline suggestioneditor.action.inlineSuggest.triggerdocs
ctrl+rightcmd+right macOSAccept the suggestion word-by-wordeditor.action.inlineSuggest.acceptNextWorddocs
none (no default)Accept the suggestion one line at a timeeditor.action.inlineSuggest.acceptNextLinedocs
ctrl+entercmd+enter macOSOpen the Copilot completions panel showing multiple suggestions in a new editor tabdocs

inline-chat

KeysDoesSrc
ctrl+icmd+i macOSOpen inline chat at the cursor position in the editorinlineChat.startdocs

terminal

KeysDoesSrc
ctrl+icmd+i macOSOpen inline chat in the integrated terminalworkbench.action.terminal.chat.startdocs

Copilotterminal

32 bindings · checked 2026-08-05 · source

Anywhere

KeysDoesSrc
shift+tabCycle between Standard, Plan, and Autopilot session modesdocs
escCancel the current operation; press twice to interrupt the running turn, or to stop background agents when the main agent is idledocs
ctrl+cCancel operation / clear input. Press twice to exitrldocs
ctrl+dShutdownrldocs
ctrl+lClear the screenrldocs
ctrl+enter or ctrl+qcmd+enter or ctrl+q macOSQueue a message to send while the agent is busydocs
ctrl+rReverse search through command historyrldocs
up / downNavigate the command historyrldocs
ctrl+aMove to beginning of the line (when typing)rldocs
ctrl+eMove to end of the line (when typing); when the prompt input is empty instead, this same key expands all items in the response timelinerldocs
ctrl+bMove to the previous characterrldocs
ctrl+fMove to the next character (when typing); when the prompt input is empty instead, this same key opens timeline searchrldocs
ctrl+hDelete the previous characterrldocs
ctrl+kDelete from cursor to end of the line. If the cursor is at the end of the line, delete the line breakrldocs
ctrl+uDelete from cursor to beginning of the linerldocs
ctrl+wDelete the previous wordrldocs
ctrl+vcmd+v macOSPaste from clipboard as an attachmentdocs
ctrl+zSuspend the process to the background (Unix)rldocs
ctrl+x then /Run a slash command after you have already started typing a promptdocs
ctrl+x then eEdit the prompt in an external editor ($EDITOR)docs
ctrl+x then bPromote the running task or shell command to the backgrounddocs
ctrl+x then oOpen the most recent link from the response timelinedocs
ctrl+gEdit the prompt in an external editor ($EDITOR)docs
ctrl+oWith an empty prompt input, expand the most recent item in the response timeline to show more detaildocs
ctrl+tExpand/collapse the display of the model's reasoning in responsesdocs
shift+enter or alt+entershift+enter or option+enter macOSInsert a newline in the prompt input without submittingdocs
@ then filenameInclude a file's contents as context (input prefix, not a modifier-key binding)docs
# then numberInclude a GitHub issue or pull request as contextdocs
! then commandExecute a shell command directly, bypassing Copilot; '!' alone on an empty prompt enters shell mode for running multiple shell commands in sequence, exited via Esc or Ctrl+Cdocs
$Hand the terminal over to a real interactive shell ($SHELL on Unix, %COMSPEC% on Windows), suspending the CLI UI entirely so job control, full-screen apps, tab completion, and colors work nativelydocs
?Open quick help, when the prompt input is empty; press again to dismiss and insert a literal '?'docs

completion

KeysDoesSrc
tab or ctrl+yAccept the current inline completion suggestiondocs

Verified against 2.1.222 on 2026-08-07. Bindings below were read from the official keybindings reference and cross-checked against action strings in the installed binary.

The input line is readline-based. Ctrl+A / Ctrl+E move to line start and end, Ctrl+U and Ctrl+K kill backwards and forwards, Ctrl+W deletes the previous word, and Ctrl+Y yanks the last killed text back. None of these touch your system clipboard.

Ctrl+X is a chord prefix. Pressed alone it does nothing visible - it arms a two-key sequence (Ctrl+X Ctrl+K, and others). If a keystroke seems to vanish, this is usually why.

Stopping the agent: press Esc. It interrupts mid-turn and keeps the work done so far. Double-tapping Esc does one of two things depending on the prompt: with text in it, it clears the prompt and saves the draft to history (Up recalls it); with the prompt empty, it opens the rewind menu to restore or summarize from an earlier point. Ctrl+C also interrupts a running operation, or clears the input when nothing is running, but Esc is the one that transfers to every other terminal agent here.

Session control: Ctrl+D on an empty input exits, requiring a double press. Ctrl+Z suspends the process to the shell - fg brings it back.

Images: Ctrl+V pastes an image from the clipboard, inserting an [Image #N] chip into the prompt.

Views: Ctrl+O toggles the verbose transcript, Ctrl+T toggles the to-do checklist, Ctrl+B backgrounds a running Bash task, Ctrl+R opens reverse history search over your previous prompts.

Multi-line: Ctrl+J inserts a newline without submitting.

Modes: Shift+Tab cycles permission modes - default → acceptEdits → plan, plus any additional modes you have enabled, such as auto or bypassPermissions.

Rebinding: ~/.claude/keybindings.json maps keys to action ids such as chat:submit, app:interrupt, app:exit. The action id is the stable identifier; defaults move between releases. Eleven documented actions ship with no default key at all, so they are only reachable if you bind them yourself.

A vim mode exists for the input line, with its own normal/insert bindings.

TaskClaude CodeCodexOpenCodeCursorCopilotPi
Stop the current runEscEscEscEscEscEsc
Insert a newlineCtrl+JCtrl+JCtrl+JHost editor/terminalHost editor/terminalCtrl+J
Rebind defaults~/.claude/keybindings.jsonTUI keymap settingstui.jsonVS Code keybindingsVS Code keybindings~/.pi/agent/keybindings.json
Main caveatreadline and Claude chords share a line editorTUI actions vary by modeleader/chord prefixes change contextIDE and terminal layers overlapsurface-specific keymapsextensions can add bindings
  • “Keybindings” means a user config file of action ids in Claude Code and Pi; in Cursor and Copilot it means VS Code’s keybindings UI, a different system with different precedence.
  • Ctrl+X is a leader key in OpenCode and a chord prefix in Claude Code and Copilot CLI. A leader arms a timed window for a whole command vocabulary; a chord prefix waits for one specific completion. Neither cuts.
  • Ctrl+R splits the field: reverse history search in Claude Code, Codex and Copilot CLI; rename the session in OpenCode and Pi.
  • “Vim mode” is not one feature. Claude Code ships one. Codex has the action but no default key. Nothing equivalent was found in OpenCode’s source.