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].

Keys are listed for both platforms wherever they differ. The ctrl-w chords, and every bare key in the file tree, the workspaces panel, the overlays, and copy mode, are identical on macOS and Linux. Where macOS uses cmd, Linux uses ctrl-shift — the usual terminal convention, so plain ctrl-c stays the shell's — and alt-1alt-9 for tabs, because Super belongs to the window manager: nothing is bound to it. A row tagged mac only has no Linux binding at all; that job is the window manager's.

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

The command palette filtered to drawer actions, each listed with its key binding

How contexts work

Everything terminal-scoped is either modifier-prefixed (cmd-… on macOS, ctrl-shift-… on Linux) 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]
# on Linux, write ctrl-shift-… where a Mac uses cmd-…
"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… On Linux, cmd means Super: it parses and binds, but under Hyprland, GNOME, or KDE the compositor usually takes Super combos before Oxide sees them, which is why none of the defaults use it. Prefer ctrl-shift or alt.
  • 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-, mac ctrl-, linuxopen the config file in $EDITORapp::settings
cmd-shift-p mac ctrl-shift-p linuxcommand paletteapp::palette
cmd-alt-t mac ctrl-w shift-t linuxtheme pickerapp::select_theme
cmd-q mac ctrl-shift-q linuxquitapp::quit
cmd-h / alt-cmd-h mac onlyhide Oxide / hide others — the window manager's job on Linuxapp::hide / app::hide_others
cmd-m mac onlyminimizewindow::minimize
ctrl-cmd-f mac onlytoggle full screenwindow::toggle_fullscreen

Terminal

cmd-c / cmd-v mac
ctrl-shift-c / ctrl-shift-v linux
copy / paste (bracketed); on Linux, selecting also sets the primary selection and middle-click pastes itterminal::copy / terminal::paste
cmd-a mac ctrl-shift-a linuxselect allterminal::select_all
cmd-f mac ctrl-shift-f linuxsearch scrollback — older, ⇧⏎ newer, esc closesterminal::search
cmd-alt-r cmd-alt-c cmd-alt-w mac
ctrl-alt-r ctrl-alt-c ctrl-alt-w linux
search toggles: regex / case-sensitive / whole word (also chips in the bar)terminal::search_regex / …search_case / …search_word
ctrl-w [ / cmd-shift-v maccopy mode — vim keys in the scrollbackterminal::copy_mode
cmd-k mac ctrl-shift-k linuxclear scrollbackterminal::clear_scrollback
cmd-↑ / cmd-↓ mac
ctrl-shift-↑ / ctrl-shift-↓ linux
jump to previous / next promptterminal::prompt_up / terminal::prompt_down
cmd-r mac ctrl-shift-r linuxcommand history — inserts, ⌘⏎ (ctrl-⏎ on Linux) runsterminal::history
cmd-shift-c mac ctrl-shift-alt-c linuxcopy the last command's outputterminal::copy_last_output
click a gutter tickscroll to that command
cmd-+ cmd-- cmd-0 mac
ctrl-+ ctrl-- ctrl-0 linux
font size up / down / reset (ctrl-= also steps up on Linux)terminal::font_increase / …decrease / …reset
cmd-click mac ctrl-click linuxopen the URL, or the path:line in your editor, under the pointer
cmd-p mac ctrl-shift-o linuxfuzzy file finder — open, ⌘⏎ / ctrl-⏎ insert path, ⌥⏎ revealapp::file_finder
shift + dragselect text even while a program grabs the mouse

Tabs & windows

cmd-t mac ctrl-shift-t linuxnew tabtab::new
cmd-shift-t mac ctrl-shift-alt-t linuxreopen 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-n mac ctrl-shift-n linuxnew windowwindow::new
cmd-1cmd-9 mac
alt-1alt-9 linux
select tab 1–9tab::select_1 … tab::select_9
⌃tab / ⌃⇧tabnext / previous tabtab::next / tab::previous
⇧⌘] / ⇧⌘[ mac
ctrl-pagedown / ctrl-pageup linux
next / previous tabtab::next / tab::previous
cmd-w mac ctrl-shift-w linuxclose the pane; the window with the last onewindow::close

Splits & focus

ctrl-w v / cmd-d macsplit rightpane::split_right
ctrl-w s / cmd-shift-d macsplit 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-←↓↑→ mac onlyfocus 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-b mac ctrl-shift-b linuxshow / hide the drawerdrawer::toggle
ctrl-w t / cmd-shift-e mac ctrl-shift-e linuxfocus the file treedrawer::focus_tree
cmd-alt-1cmd-alt-9 mac
ctrl-alt-1ctrl-alt-9 linux
switch to workspace 1–9workspace::select_1 … workspace::select_9
ctrl-w pfocus the workspaces paneldrawer::focus_workspaces
cmd-shift-r mac ctrl-shift-alt-r linuxreveal 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-c mac ctrl-shift-c linuxcopy the pathtree::copy_path
cmd-shift-o mac ctrl-shift-o linuxreveal in Finder / the file managertree::reveal_in_finder
right-clickopen, preview markdown (.md files), set as root, insert path, copy path, reveal in Finder / the file manager
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 m dadd / rename / move / delete to Trashtree::add / tree::rename / tree::move / 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-enter mac ctrl-enter linuxin 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 / ctrl-shift-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 key. On macOS they live in the menu bar at the path shown; Linux has no menu bar, so there they're palette-only. Every one is in the command palette (cmd-shift-p / ctrl-shift-p) 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
View → Toggle Tab Barshow or hide the tab bar for this windowapp::toggle_tab_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