Tabs
Open multiple terminal sessions inside a single window, switch between them with the keyboard, rearrange them, and rename them.
Tabs let you keep several terminal sessions inside one window. Each tab is an independent surface with its own shell process, working directory, and title. Splits (covered in Splits) live inside a tab, so you can mix the two without conflict.
Wintty uses native tab UI on every platform that has one:
- On Windows, tabs are WinUI 3 tab views with full drag-and-drop reordering, context menus, and a custom new-tab split button.
- On Linux, tabs use the GTK 4 / libadwaita tab bar.
The default keybindings to open a new tab are:
| Platform | Keybinding |
|---|---|
| Windows | ctrl+t |
| Linux | ctrl+shift+t |
Windows uses ctrl+t rather than ctrl+shift+t so that ctrl+shift+t
stays free for reopening the last closed tab, the way browsers and
VS Code do it.
Under the hood this triggers the
new_tab action. You can rebind it
to any key you like:
keybind = ctrl+alt+n=new_tab
A new tab inherits the working directory of the previously focused terminal when shell integration is active.
On Windows, the new-tab button in the tab strip is actually a split button.
The main click opens a new tab with the default profile. The dropdown chevron
opens a menu listing your saved profiles, one row each. This is implemented
by NewTabSplitButton.xaml in the Windows port.
| Action | Default Keybinding |
|---|---|
previous_tab | ctrl+shift+tab (drives the MRU switcher on Windows, see below) |
next_tab | ctrl+tab (drives the MRU switcher on Windows, see below) |
last_tab | ctrl+9 (Windows), alt+9 (Linux) |
goto_tab | ctrl+<n> (Windows), alt+<n> (Linux), for n = 1..8 |
On Windows, ctrl+tab and ctrl+shift+tab don't step through the tab
strip positionally. Wintty intercepts both chords and drives a
most-recently-used switcher popup instead: hold ctrl to keep cycling,
release it to commit, which makes flipping between the last two tabs a
single press. For positional switching on Windows, use ctrl+page_down
and ctrl+page_up.
goto_tab takes the tab index starting at 1. Jumping to the last tab
no matter how many there are is the separate last_tab action, which
is what the ctrl+9 / alt+9 / cmd+9 binding is wired to.
Note
On Windows only indices 1 through 8 are wired up.
goto_tab:9and anything above it is dropped before it reaches the tab strip, so the keybind does nothing. An in-range action that points past the last open tab is also a no-op rather than a clamp: with 3 tabs open,goto_tab:5leaves you where you are instead of moving to tab 3.
# Jump directly to tab 3
keybind = ctrl+3=goto_tab:3
You can drag a tab in the tab bar to reorder it. From the keyboard, use
move_tab with a positive or
negative offset:
# Move the current tab one position to the right
keybind = ctrl+shift+right=move_tab:1
# Move the current tab one position to the left
keybind = ctrl+shift+left=move_tab:-1
Note
On Windows the offset is read as a direction rather than a distance, so
move_tab:3moves the tab a single position right, exactly likemove_tab:1. Positions do not wrap either: moving the last tab right or the first tab left does nothing.
A tab's title is set by the running program through escape sequences (such
as the prompt printing OSC 0 or OSC 2). You can override it with a
prompt:
| Action | What it does |
|---|---|
prompt_tab_title | Opens a popup to type a new tab title |
set_tab_title | Sets the tab title to the given string |
keybind = ctrl+shift+i=prompt_tab_title
Manually setting a tab title via prompt_tab_title or set_tab_title
overrides any title escape sequence from the running program, and the
override persists across focus changes within the tab. Pass an empty
string to set_tab_title to clear the override and let the program set
the title again.
On Windows the rename dialog (RenameTabDialog.xaml) is also reachable
from the tab's right-click context menu, so you don't need a keybinding
for it.
Closing tabs uses the
close_tab action, which takes
a mode argument:
| Mode | Behavior |
|---|---|
this (default) | Close the current tab and all splits within it |
other | Close every tab except the current one |
right | Close every tab to the right of the current tab |
keybind = ctrl+w=close_tab:this
Note
On Windows the mode argument is discarded before the action is dispatched, so
close_tab:otherandclose_tab:rightdo the same thing asclose_tab:this.thisis also progressive rather than absolute there: it closes the focused split first, and only closes the whole tab once the focused split is the last one in it.
On Windows, closing a tab that holds more than one split asks for
confirmation first. That prompt is a plain pane count check; it does
not look at whether a process is running, and
confirm-close-surface
is not read by the Windows app at all.
The Windows port also includes a vertical tab strip
(VerticalTabStrip.xaml) for users who prefer a sidebar layout instead of
the horizontal bar at the top. It is toggled from Settings, under
General, in the "App Behavior" section.
Note
Vertical tabs are Windows-only. Elsewhere, tabs always render in the platform-native horizontal tab bar.
The toggle_tab_overview
action opens a grid view of all tabs in the current window so you can
pick one visually.
Note
The
toggle_tab_overviewaction itself is Linux-only and requires libadwaita 1.4 or newer; on Windows it has no effect. Windows has its own tab overview instead, onctrl+shift+e, also reachable from the command palette.
| Option | Purpose |
|---|---|
tab-inherit-working-directory | New tabs inherit the focused tab's working directory |
window-new-tab-position | Where new tabs are inserted (current, end). Not read by the Windows app |
confirm-close-surface | Whether to confirm before closing a tab with a running process. Not read by the Windows app |
window-inherit-font-size | New tabs inherit the focused tab's adjusted font size |
| Action | Purpose |
|---|---|
new_tab | Open a new tab |
close_tab | Close tabs (this, other, right; the mode is ignored on Windows) |
previous_tab | Switch to the previous tab |
next_tab | Switch to the next tab |
last_tab | Switch to the last tab |
goto_tab | Switch to a tab by 1-based index (1 to 8 on Windows) |
move_tab | Move the current tab by a relative offset (direction only on Windows) |
prompt_tab_title | Prompt for a new tab title |
set_tab_title | Set the tab title to a literal string |
toggle_tab_overview | Open the tab overview (Linux only) |