Post
JA EN

Escape Editor Window Hell — Consolidate Multiple Projects with macOS Native Tabs

Escape Editor Window Hell — Consolidate Multiple Projects with macOS Native Tabs
  • Target audience: Developers using VS Code-based editors on macOS
  • Prerequisites: Basic familiarity with VS Code (or its forks)
  • Reading time: 8 min

Overview

When you work on multiple projects simultaneously in VS Code on macOS, windows multiply and your desktop descends into chaos. Hunting for the right window in Mission Control, losing track of which project is which in Cmd+Tab, getting lost swiping between fullscreen spaces — every developer has experienced this “window hell.”

The solution is macOS’s built-in native tabs feature. Just like consolidating multiple web pages into browser tabs, you can group multiple editor windows into a single physical window.

This article covers setup, use-case-specific workflows, and when to choose native tabs over workspaces.

Not Just VS Code

This article focuses on VS Code, but the feature works with any Electron + Code-OSS-based editor. Specifically:

  • VS Code — The original. First to implement the window.nativeTabs setting
  • Cursor — VS Code fork AI IDE. Same setting enables the feature
  • Google Antigravity — AI IDE developed after the Windsurf (formerly Codeium) team joined Google. Code-OSS-based, so it supports the same feature

All of these are Electron apps that leverage macOS’s native window management APIs, so the configuration is identical. Throughout this article, “VS Code” refers to all of the above.

Why Windows Proliferate

VS Code’s fundamental design is “one window = one project folder.” Opening a new folder spawns a new window.

Consider these everyday scenarios:

  • Frontend and backend live in separate repositories
  • Each microservice has its own repository
  • You reference a library’s source while building an application
  • You consult a documentation repository while writing code

The “Window Explosion” in the AI Agent Era

This problem has become significantly worse with the rise of AI coding tools.

Tools like Claude Code and Cursor Agent recognize project context at the directory level. When you run AI agents across multiple related repositories simultaneously, you need one editor window per repository.

For example, you might instruct Claude Code to implement API endpoints in your backend repository while using Cursor to build UI in your frontend repository and fixing type definitions in a shared library — all at the same time. Having 5+ windows open simultaneously is no longer unusual.

The tricky part is that even when you delegate work to AI agents in parallel, your cognitive load as a human doesn’t decrease. You still need to monitor, review, and integrate the output from multiple agents. Time spent hunting for windows translates directly into task-switching costs. Cognitive science research shows that task switching alone can consume up to 40% of productive time1. Losing cognitive resources to window management — an operation completely unrelated to your actual work — is something to minimize.

Cmd+Tab displays every window under the same application name, making it difficult to quickly locate the right project. The act of searching for a window is itself a switching cost that breaks your focus.

What Are macOS Native Tabs?

Since macOS Sierra (10.12), macOS has provided OS-level tab functionality for many applications2. It consolidates multiple windows of the same application into tabs within a single physical window. Apple’s own apps like Finder and TextEdit use this feature.

VS Code has supported this since version 1.12 (April 2017)3, enabled by an Electron update that exposed macOS’s native tab APIs.

Importantly, this feature is macOS-only — it is not available on Windows or Linux, as it depends on macOS-specific window management APIs.

How Native Tabs Differ from Built-in Tabs

This is an easy point of confusion — VS Code has two kinds of “tabs”:

 VS Code Built-in TabsmacOS Native Tabs
ScopeFilesWindows (projects)
LocationTop of editor areaTitle bar
UnitA single fileAn entire VS Code window
OSAll platformsmacOS only

Native tabs don’t replace VS Code’s built-in tabs — they coexist as a higher-level layer. Inside each native tab, regular file tabs appear as usual.

Setup

Configuration requires changes in two places. Configuring only one often doesn’t work, which is the main reason for “I enabled it but nothing happened” reports4.

Editor Side: Modify settings.json

To configure via GUI, open Settings with Cmd+, and search for “native tabs.”

To edit settings.json directly:

1
2
3
4
{
  "window.nativeTabs": true,
  "window.titleBarStyle": "native"
}
  • window.nativeTabs: Enables the native tabs feature
  • window.titleBarStyle: Switches the title bar to macOS native style (this may happen automatically when native tabs are enabled, but setting it explicitly ensures consistency)

A VS Code restart is required after changing these settings.

OS Side: Modify System Settings

Navigate to System SettingsDesktop & DockWindows section, and change “Prefer tabs when opening documents” to “Always”.

This setting affects all of macOS. Finder, TextEdit, and every other native-tab-compatible app will open new windows as tabs.

Note: Since this changes system-wide behavior, if you’re concerned about the impact on other apps, try it first and switch to “In Full Screen Only” if needed. A May 2025 GitHub issue requests the ability to have VS Code’s own setting control this behavior without requiring the global macOS setting4.

Basic Operations

Opening New Tabs

ActionMethod
From menuFile → New Window (opens as a tab)
From command paletteworkbench.action.newWindowTab
Open a folderFile → Open Folder and select a different project

Merging Existing Windows into Tabs

If you already have multiple VS Code windows open:

Window → Merge All Windows

This consolidates all windows into tabs within a single physical window.

ActionShortcut
Next tabCtrl+Tab or Cmd+Shift+]
Previous tabCtrl+Shift+Tab or Cmd+Shift+[
Specific tabClick the tab bar
Show all tabsView → Show All Tabs

Organizing Tabs

  • Reorder: Drag tabs to rearrange
  • Detach to separate window: Drag a tab outside the window, or Window → Move Tab to New Window
  • Close a tab: Hover over the tab and click the × button

Enhanced Keyboard Shortcuts

Beyond the default shortcuts, you can add custom shortcuts in VS Code’s keybindings.json for more efficient tab management.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
  {
    "key": "ctrl+cmd+right",
    "command": "workbench.action.showNextWindowTab"
  },
  {
    "key": "ctrl+cmd+left",
    "command": "workbench.action.showPreviousWindowTab"
  },
  {
    "key": "ctrl+cmd+t",
    "command": "workbench.action.newWindowTab"
  }
]

This lets you switch between projects without taking your hands off the home row.

Use Cases

Frontend + Backend Development

When frontend and backend live in separate repositories, grouping them with native tabs is effective. Arrange tabs as “Frontend → Backend → Shared Library” for smooth navigation between API definitions and frontend implementation.

Microservice Development

Microservice architectures often involve 5–10 repositories simultaneously. Native tabs let you keep everything in one window while maintaining each service’s independent development environment (extension settings, terminal, debug configuration).

Library Development + Test App

When developing a library, you often work on both the library itself and a test application side by side. Native tabs let you instantly switch between the two projects for verification.

Coding While Referencing Documentation

If you manage design documents or API specs in Markdown, keeping the documentation repository open as a permanent tab is convenient.

Native Tabs vs. Multi-Root Workspaces

VS Code also offers multi-root workspaces, which combine multiple folders into a single workspace56. Here’s how to decide between the two.

AspectNative TabsMulti-Root Workspaces
Project independenceFully independent (settings, extensions, terminal)Shared workspace settings apply
Resource usageSeparate process per project (more memory)Single process (more memory-efficient)
File searchIndependent search per tabCross-folder search
GitIndependent Git state per tabPer-folder Git state in a single view
Settings sharingNot possible (each tab is independent)Shareable via .code-workspace file
Team sharingNot possible (OS-level setting).code-workspace can be committed to the repository

Decision Criteria

Native tabs are better when:

  • Projects have different tech stacks (Python + TypeScript, etc.)
  • Each project needs fully independent settings
  • You’re temporarily referencing a project
  • You work in fullscreen mode

Multi-root workspaces are better when:

  • Projects are related in a monorepo-like structure
  • You frequently need cross-project file search
  • You want to share workspace configuration with your team
  • You want to minimize memory usage

You can also use both together. Open a multi-root workspace as one native tab and a separate project in another tab.

Common Issues and Solutions

Tabs Not Appearing

Cause 1: Only the VS Code setting was changed; the macOS setting was forgotten. → Change System Settings → Desktop & Dock → “Prefer tabs when opening documents” to “Always.”

Cause 2: VS Code was not restarted after changing settings. → Fully quit VS Code (Cmd+Q) and relaunch.

Cause 3: The tab bar is hidden. → Show it via View → Show Tab Bar.

Title Bar Appearance Changes to macOS Standard

When window.nativeTabs is enabled, VS Code’s custom title bar switches to the macOS standard title bar. This may feel unfamiliar, but native tabs rely on the OS’s window management API, which requires the native-style title bar.

Tab Titles Get Swapped

Since VS Code 1.105, a bug has been reported where “New Window Tab” causes tab titles to swap7. If this occurs, close and reopen the window, or check for VS Code updates.

Summary

macOS’s native tabs feature significantly improves multi-project management in code editors. Setup requires changes in two places — the editor and the OS — but once configured, you can intuitively switch between projects with just a tab click.

Unlike multi-root workspaces, native tabs let you maintain full independence for each project while physically consolidating them into a single window. This makes them especially well-suited for development styles that involve frequent switching between independent projects, such as frontend/backend parallel development or microservice architectures.

If you’re struggling with “window hell” on macOS, it’s worth trying.

You may also find these articles relevant:

References

  1. Rubinstein, J. S., Meyer, D. E., & Evans, J. E. (2001). Executive control of cognitive processes in task switching. Journal of Experimental Psychology: Human Perception and Performance, 27(4), 763-797. [Reliability: High] ↩︎

  2. Use tabs in windows on Mac - Apple (2024). [Reliability: High] ↩︎

  3. Visual Studio Code April 2017 (version 1.12) Release Notes - Microsoft (2017). [Reliability: High] ↩︎

  4. macOS: New setting for always opening new windows in native tabs · Issue #250042 - microsoft/vscode, GitHub (2025). [Reliability: Medium-High] ↩︎ ↩︎2

  5. Multi-root Workspaces - Microsoft (2024). [Reliability: High] ↩︎

  6. Multi Root Workspaces in Visual Studio Code - ISE Developer Blog, Microsoft (2025). [Reliability: Medium-High] ↩︎

  7. New Window Tab can result in swapped tab titles with macOS Native Tabs · Issue #276577 - microsoft/vscode, GitHub (2025). [Reliability: Medium-High] ↩︎

This post is licensed under CC BY 4.0 by the author.