Escape Editor Window Hell — Consolidate Multiple Projects with macOS Native Tabs
This article was generated by AI. The accuracy of the content is not guaranteed, and we accept no responsibility for any damages resulting from use of this article. By continuing to read, you agree to the Terms of Use.
- 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.nativeTabssetting - 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 Tabs | macOS Native Tabs | |
|---|---|---|
| Scope | Files | Windows (projects) |
| Location | Top of editor area | Title bar |
| Unit | A single file | An entire VS Code window |
| OS | All platforms | macOS 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 featurewindow.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 Settings → Desktop & Dock → Windows 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
| Action | Method |
|---|---|
| From menu | File → New Window (opens as a tab) |
| From command palette | workbench.action.newWindowTab |
| Open a folder | File → 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.
Navigating Between Tabs
| Action | Shortcut |
|---|---|
| Next tab | Ctrl+Tab or Cmd+Shift+] |
| Previous tab | Ctrl+Shift+Tab or Cmd+Shift+[ |
| Specific tab | Click the tab bar |
| Show all tabs | View → 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.
| Aspect | Native Tabs | Multi-Root Workspaces |
|---|---|---|
| Project independence | Fully independent (settings, extensions, terminal) | Shared workspace settings apply |
| Resource usage | Separate process per project (more memory) | Single process (more memory-efficient) |
| File search | Independent search per tab | Cross-folder search |
| Git | Independent Git state per tab | Per-folder Git state in a single view |
| Settings sharing | Not possible (each tab is independent) | Shareable via .code-workspace file |
| Team sharing | Not 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.
Related Articles
You may also find these articles relevant:
- Delegating Multiple Tasks to AI Leads to Human Multitasking Hell: Solutions from Cognitive Science - Why parallel delegation to AI increases human cognitive load, explained through cognitive science
References
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] ↩︎
Use tabs in windows on Mac - Apple (2024). [Reliability: High] ↩︎
Visual Studio Code April 2017 (version 1.12) Release Notes - Microsoft (2017). [Reliability: High] ↩︎
macOS: New setting for always opening new windows in native tabs · Issue #250042 - microsoft/vscode, GitHub (2025). [Reliability: Medium-High] ↩︎ ↩︎2
Multi-root Workspaces - Microsoft (2024). [Reliability: High] ↩︎
Multi Root Workspaces in Visual Studio Code - ISE Developer Blog, Microsoft (2025). [Reliability: Medium-High] ↩︎
New Window Tabcan result in swapped tab titles with macOS Native Tabs · Issue #276577 - microsoft/vscode, GitHub (2025). [Reliability: Medium-High] ↩︎