Oxide Terminal / docs
Docs / Reference / Keybindings

Keybindings

The complete built-in keymap, and how to change it. Bindings are grouped by context: the terminal deliberately steals nothing, so every bare key reaches your shell. The third column is the action id you use in [keymap].

Can't remember a key? cmd-shift-p opens the command palette: every action, fuzzy-searchable, with its current binding shown alongside.

How contexts work

Everything terminal-scoped is either modifier-prefixed (cmd-…) or sequence-led (ctrl-w then a key), and bound at the root, so no bare keystroke is taken away from the shell. The file tree, the workspaces panel, and the theme picker are modeless lists with no text input, so bare letters are free there. The command palette has a text input, so only arrows and ctrl-n / ctrl-p move its selection. Copy mode is the one place in the terminal where bare keys are legal: nothing typed there reaches the shell, so it has its own context, terminal_vi.

Configuring

Add a [keymap] table to config.toml: keystroke on the left, action id on the right. Anything you don't mention keeps its default. Changes apply live when you save.

[keymap]
"cmd-shift-p"  = "app::palette"
"ctrl-w e"     = "pane::equalize"
"cmd-shift-]"  = "tab::next"

# Unbind by assigning nothing.
"cmd-d"        = ""

[keymap.file_tree]    # context-scoped tables
"y"            = "tree::refresh"

[keymap.terminal]
"cmd-shift-c"  = "terminal::copy"
  • Keystrokes are modifier-…-key, with cmd, ctrl, alt, shift, and fn as modifiers, in any order. Separate the steps of a chord with a space: "ctrl-w z". Named keys: up, down, left, right, enter, escape, tab, space, backspace, f1
  • Contexts. Pairs directly under [keymap] bind at the root and work everywhere. Subtables scope a binding: [keymap.terminal], [keymap.terminal_vi] (copy mode, where bare keys are allowed), [keymap.file_tree], [keymap.workspaces], and [keymap.overlay] (the theme picker and command palette). A binding in a deeper context wins over the same key at the root.
  • The shell comes first. A bare key — no cmd, ctrl, or alt — at the root or in [keymap.terminal] would hide that key from whatever you're running, so Oxide refuses it and tells you why. Use a modifier, or a ctrl-w chord.
  • Mistakes are reported, not ignored. An unknown action id (with a "did you mean" suggestion), a keystroke that doesn't parse, or a bare key in the terminal each produce a line in the error toast in the bottom-right corner. Everything else in the table still binds.
  • Starting from scratch. replace_defaults = true under [keymap] drops the built-in map entirely. Every action Oxide ships after that is unreachable until you bind it, so prefer overriding.

Application

cmd-,open the config file in $EDITORapp::settings
cmd-shift-pcommand paletteapp::palette
cmd-alt-ttheme pickerapp::select_theme
cmd-qquitapp::quit
cmd-h / alt-cmd-hhide Oxide / hide othersapp::hide / app::hide_others
cmd-mminimizewindow::minimize
ctrl-cmd-ftoggle full screenwindow::toggle_fullscreen

Terminal

cmd-c / cmd-vcopy / paste (bracketed)terminal::copy / terminal::paste
cmd-aselect allterminal::select_all
cmd-fsearch scrollback — older, ⇧⏎ newer, esc closesterminal::search
cmd-alt-r cmd-alt-c cmd-alt-wsearch toggles: regex / case-sensitive / whole word (also chips in the bar)terminal::search_regex / …search_case / …search_word
ctrl-w [ / cmd-shift-vcopy mode — vim keys in the scrollbackterminal::copy_mode
cmd-kclear scrollbackterminal::clear_scrollback
cmd-↑ / cmd-↓jump to previous / next promptterminal::prompt_up / terminal::prompt_down
cmd-rcommand history — inserts, ⌘⏎ runsterminal::history
cmd-shift-ccopy the last command's outputterminal::copy_last_output
click a gutter tickscroll to that command
cmd-+ cmd-- cmd-0font size up / down / resetterminal::font_increase / …decrease / …reset
cmd-clickopen the URL, or the path:line in your editor, under the pointer
cmd-pfuzzy file finder — open, ⌘⏎ insert path, ⌥⏎ revealapp::file_finder
shift + dragselect text even while a program grabs the mouse

Tabs & windows

cmd-tnew tabtab::new
cmd-shift-treopen the last closed tab (the last ten are remembered)tab::reopen
ctrl-w , / double-click a tabrename the tab; an empty name restores the automatic titletab::rename
drag a tabreorder — drop it on the tab whose place it should taketab::move_left / tab::move_right (unbound)
cmd-nnew windowwindow::new
cmd-1cmd-9select tab 1–9tab::select_1 … tab::select_9
⌃tab / ⌃⇧tabnext / previous tabtab::next / tab::previous
⇧⌘] / ⇧⌘[next / previous tabtab::next / tab::previous
cmd-wclose the pane; the window with the last onewindow::close

Splits & focus

ctrl-w v / cmd-dsplit rightpane::split_right
ctrl-w s / cmd-shift-dsplit downpane::split_down
ctrl-w V / ctrl-w Ssplit left / uppane::split_left / pane::split_up
ctrl-w h j k lfocus the pane in that directionpane::focus_left / …down / …up / …right
cmd-opt-←↓↑→focus the pane in that directionpane::focus_left / …down / …up / …right
ctrl-w qclose the focused panepane::close
ctrl-w < / ctrl-w >shrink / grow the pane horizontally (4 columns)pane::narrower / pane::wider
ctrl-w - / ctrl-w +shrink / grow the pane vertically (2 rows)pane::shorter / pane::taller
ctrl-w =equalise every split in the tabpane::equalize
ctrl-w zzoom the pane to the full tab; again to restorepane::zoom
ctrl-w bbroadcast typing and pastes to every pane in the tabpane::broadcast
ctrl-w oclose every other pane in the tab (asks when more than one would go)pane::only
ctrl-w xswap the pane with its neighbour in the splitpane::swap
ctrl-w rset the pane's startup command — run when its pinned workspace is restoredpane::set_startup_command
drag a dividerresize the two panes either side of it
ctrl-w wtoggle focus: drawer ↔ terminaldrawer::focus_toggle

The drawer

cmd-bshow / hide the drawerdrawer::toggle
ctrl-w t / cmd-shift-efocus the file treedrawer::focus_tree
ctrl-w pfocus the workspaces paneldrawer::focus_workspaces
cmd-shift-rreveal the shell's directory in the treedrawer::reveal
tabswitch between the two panelsdrawer::focus_workspaces / drawer::focus_tree

In the file tree

j k / movetree::down / tree::up
gg / Gtop / bottomtree::top / tree::bottom
ctrl-d / ctrl-uhalf page down / uptree::half_page_down / tree::half_page_up
l / hexpand & descend / collapse & ascendtree::expand / tree::collapse
pselect the parent directorytree::parent
enter / oopen a directory, or a file in $EDITORtree::open
y / Yinsert the path at the prompt, relative / absolutetree::yank_path / tree::yank_path_absolute
cmd-ccopy the pathtree::copy_path
cmd-shift-oreveal in Findertree::reveal_in_finder
right-clickopen, preview markdown (.md files), set as root, insert path, copy path, reveal in Finder
cd the shell to the selection without re-rooting (only differs with follow_cwd = false)tree::cd
drag a row onto a paneinsert the path at the prompt
c / -re-root at the selection / one level uptree::set_root / tree::root_up
/filtertree::filter
a r dadd / rename / delete to Trashtree::add / tree::rename / tree::delete
I / Rtoggle hidden files / refreshtree::toggle_hidden / tree::refresh
escdismiss input → clear filter → back to the terminaltree::escape

In the workspaces panel

j k / moveworkspace::down / workspace::up
enter / oswitch to the workspaceworkspace::open
a r dadd / rename / delete (y confirms)workspace::add / workspace::rename / workspace::delete
ppin — persist across restartsworkspace::toggle_persist
eedit every pane's startup commandworkspace::edit_startup_commands
escdismiss input → back to the terminalworkspace::escape

In the palette, history, file finder, and theme picker

/ ctrl-n ctrl-pmove (the theme picker previews as you go)overlay::next / overlay::prev
j kmove — theme picker only; the palette is typingoverlay::next / overlay::prev
enterrun the command / apply the theme / insert the history entryoverlay::confirm
cmd-enterin history: run the entry; in the file finder: insert the pathoverlay::confirm_alt
alt-enterin the file finder: reveal in the treeoverlay::confirm_reveal
escclose, restoring focus (and the previous theme)overlay::cancel

In copy mode

ctrl-w [ turns the scrollback into a vim buffer. These keys are fixed — they're vim's — but anything else can be bound in [keymap.terminal_vi], bare keys included, since nothing typed here reaches the shell.

h j k l / arrowsmove; a count prefix repeats (5j)
w b e / W B Eword motions — punctuation-aware / whitespace-delimited
0 ^ $line start / first non-blank / line end
gg G / H M Ltop / bottom of the buffer; top / middle / bottom of the screen
ctrl-d ctrl-u / ctrl-f ctrl-bhalf page / full page down and up
% / { }matching bracket / paragraph
/ ? then n Nsearch forward / backward from the cursor, repeat — the same bar and toggles as cmd-f; parks the cursor on the match
v V ctrl-vcharacter / line / block selection; motions extend it
y / yy / yank the selection (or the line) to the clipboard and leave
esc / qclear the selection, then leave; ctrl-w [ also toggles outterminal::copy_mode

These have no default binding, but every one is in the command palette and can be bound in [keymap]:

Window → Move Tab Left / Rightreorder without the mousetab::move_left / tab::move_right
Edit → Copy Last Commandthe last command lineterminal::copy_last_command
Edit → Copy Last Command and Outputboth together, for an issueterminal::copy_last_block
View → Toggle Status Barshow or hide the bar for this windowapp::toggle_status_bar
File → New Workspacecreate an unnamed workspaceworkspace::new
Oxide → Check for Updates…check GitHub for a newer releaseapp::check_for_updates
Oxide → About Oxideopen the project pageapp::about
Window → Zoomzoom the windowwindow::zoom
Help → Oxide Help / Report an Issueopen the docs / a new issueapp::help / app::report_issue
Help → What's Newopen the changelog in a new tabapp::changelog