maxandClaude Opus 5 8eae35af3e Stand the pin upright once a tab is pinned
The pinned state and the hover affordance drew the same slanted pin, so the
only difference was opacity. Rotating the pinned one to vertical separates
"this is pinned" from "click to pin", and the short transition reads as the
toggle landing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 16:37:57 +02:00

Vertical Tabs

Your open editors as a flat vertical list, colour-coded by project. Built for working with the tab bar turned off ("workbench.editor.showTabs": "none"), where a side list is the tab bar.

It shows up as a Tabs view in the Explorer — drag it wherever you want it, including the secondary side bar.

Two ways to use it

Just the colours. verticalTabs.decorateFiles colours files by project wherever VS Code shows file decorations — the Explorer, the built-in Open Editors view, and the editor tabs. If colour coding is all you want, use this and keep the built-in view: it drags to dock, shows file icons, and can focus every kind of tab. Set it to colorAndBadge to add a two-letter project badge such as AC for Acme.Shop.Client.

The Tabs view. A drawn list that the built-in view cannot be: a project border down each row, real spacing, and file names that keep their extension. Costs drag-and-drop and file icons — see Known limitations.

What it adds over the built-in Open Editors view

  • A colour per project, as a border down the left of each row — the way Visual Studio marks them. The project is the nearest .asmdef, .csproj/.fsproj/.vbproj, package.json, Cargo.toml, go.mod, pyproject.toml, pom.xml or build.gradle above the file. The colour comes from a hash of the project name, so a project keeps the same colour across sessions and windows.
  • A flat list, not a tree. One row per open editor, no group nodes to expand.
  • Names that stay readable in a narrow strip. The stem is ellipsized but the extension never is, so you get ClientDogSurgeryCompanionBeha… .cs rather than losing the .cs.
  • Sorting. Open order (matching the tab bar), by project so the colours run in blocks, or by file name. Pinned tabs stay on top, with a rule under the pinned block.
  • Room to breathe. Row spacing and border width are settings.

Pinning is VS Code's own — this view exposes it per row as a single toggle, and pinned tabs sort first.

Usage

Action How
Focus a tab Click the row
Close The × on hover, middle-click, or Delete
Pin / unpin The pin icon on the left of the row — one button, filled when pinned
Close others Right-click → Close Others — keeps pinned tabs
Copy path, reveal in Explorer Right-click
Move around Arrow keys, Home, End, Enter to open
Change sorting The view's menu

The list follows the active editor, so whatever you switch to is selected. An unsaved file shows a dot, which the close button replaces on hover.

Settings

  • verticalTabs.decorateFiles — colour files by project in the Explorer, Open Editors and tabs: off, color (default), or colorAndBadge
  • verticalTabs.orderopen (default), project, or name
  • verticalTabs.pinnedFirst — list pinned tabs above the rest (default true)
  • verticalTabs.colorByProject — colour each row's left border by project (default true)
  • verticalTabs.borderWidth — width of that border in pixels (default 3)
  • verticalTabs.rowSpacing — pixels between rows (default 3)
  • verticalTabs.showProject — also show the project name as text (default false, so the file name gets the whole row and the border alone tells you the project); turn it on for the name in text too
  • verticalTabs.showDirectory — when to show the directory: never, duplicates (default — only when two open tabs share a file name), or always
  • verticalTabs.allGroups — list every editor group, not just the active one (default true)
  • verticalTabs.projectFiles — file names or extensions that mark a project root

The twelve project colours are theme colours (verticalTabs.project1project12, plus verticalTabs.noProject), so you can pin a project to a specific colour in workbench.colorCustomizations.

Known limitations

  • Webview tabs cannot be focused from the list. There is no API to activate an arbitrary tab; a file-backed tab is focused by re-opening its resource, which webviews (Settings, Keyboard Shortcuts, Markdown preview, extension panels) do not have. They are listed in italics, with a tooltip saying so, and clicking does nothing rather than pretending.
  • Pinning another tab focuses it first. VS Code can only pin the active editor, so the pin button also switches to that tab.
  • No drag to reorder. The list reflects VS Code's own tab order. Note that VS Code moves a pinned tab to the front of its group, so open order shows pinned tabs first regardless of verticalTabs.pinnedFirst — that setting only changes the project and name orders.
  • No file-type icons. The row shows the project border instead. Adding icons back would mean bundling an icon set, since a webview cannot reach the active file-icon theme.
  • Rows are drawn rather than native, so they do not pick up list styling from every theme the way a tree view would, and there is no native drag-and-drop.
  • Drag to dock is not possible in this view, at all. Dragging a row into the editor area needs TreeDragAndDropController and its text/uri-list support, which only tree views have — a drag started inside a webview iframe cannot be handed to the workbench. If dragging matters more than the borders and spacing, use decorateFiles with the built-in Open Editors view instead.
  • Decorations colour the Explorer as well as the Open Editors view; there is no way to target one. Git also decorates modified files and only one colour wins, so a dirty file may show Git's colour rather than its project's.

Tests

npm test launches VS Code with all other extensions disabled on a multi-project folder, opens editors, and asserts on the resulting list — projects resolved, ordering, pinning through the real actions, diff tabs reporting their modified side, and webview tabs correctly reporting that they cannot be activated.

Point it at your own multi-project folder with VERTICAL_TABS_TEST_FOLDER:

VERTICAL_TABS_TEST_FOLDER=/path/to/solution npm test

The rendering itself is checked in a browser harness at side-bar width, driving the same media/tabs.js with stub tab data.

S
Description
No description provided
Readme MIT
164 KiB
2026-09-08 18:38:37 +02:00
Languages
TypeScript 72.5%
JavaScript 18.5%
CSS 9%