The VS Code Terminal vs a Real One (2026)
·Terminal Candy ·6 min read
The integrated terminal won a long time ago. VS Code put one at the bottom of the window in 2016, Cursor and Zed inherited the idea, and for most developers the standalone terminal quietly became the thing you open when something has gone wrong.
Then coding agents moved into the terminal, and the tradeoff changed enough to be worth re-examining. Not "integrated terminals are bad" — they are good, and I use one daily. But the workload they were designed for is not the workload most people are now running in them.
What the integrated terminal is genuinely better at
Start here, because the case is strong.
Zero context switch. The terminal is where your code is. No window management, no wondering which project a terminal is pointed at. `⌃`` and you are there.
It already knows your project. It opens in the workspace root, inherits the workspace environment, and picks up the right Python interpreter or Node version because the editor already resolved that.
Clickable everything. A stack trace in the integrated terminal is a set of links into your editor at the right line. That single feature is worth a lot and standalone terminals can only approximate it.
Tasks. tasks.json in VS Code, and equivalents elsewhere, give you a build system with keybindings and problem matchers that parse compiler output into the editor's diagnostics panel. Nothing in a standalone terminal touches this.
If your terminal use is "run the tests, read the failure, click the line" — the integrated one is not a compromise, it is the correct tool, and you should stop reading.
Where it starts to hurt
The design assumption is that terminal work is short, subordinate to editing, and produces output you consume once. Agents violate all three.
It is a strip, not a window. The default integrated terminal is maybe fifteen lines tall. That is fine for npm test. It is bad for an agent that renders a full-screen TUI with a status area, a diff preview, and a prompt. You spend the session dragging the divider up to read something, then back down to see your code.
Scrollback is capped, and lower than you think. VS Code defaults terminal.integrated.scrollback to 1000 lines. A long agent run blows past that in minutes, and the top of the session — including, often, the reasoning about why it did the thing you are now confused by — is simply gone. Raise it:
{
"terminal.integrated.scrollback": 20000
}
That is the single highest-value setting in this post. It is also memory per terminal instance, so it is a real tradeoff at ten open terminals rather than a free win.
Rendering is a compromise. Integrated terminals are xterm.js in a webview, and they have gotten fast — the WebGL renderer is legitimately good. But under sustained high-throughput output, which is exactly what a streaming agent produces, a native or GPU terminal stays smoother. You will notice it most in the thing agents do constantly: redrawing a spinner and a progress area many times per second.
You cannot see two agents at once. Split the panel and each agent gets seven lines. This is the hard ceiling. If you run more than one agent — and the case for running several is strong — the integrated panel stops being viable somewhere around the second one.
No notifications worth the name. The editor has a bell and a badge. Neither tells you which of your four terminals is waiting, and neither reaches you when the editor is not the frontmost app. For a tool whose defining behavior is going quiet and waiting for a human, that is the wrong feedback model. I compared every approach to this, including the free DIY ones, in AI agent alerts on Mac.
The editor's own theme wins. Integrated terminal colors come from the editor theme's terminal.ansi* tokens. That is convenient and consistent, and it also means every terminal in your editor looks identical — so with three agents running you have three visually identical panes and position is your only cue for which is which.
The split that actually works
I stopped trying to pick one. The division that survived contact with real work:
Integrated terminal — anything with a result I click. Test runs, builds, linters, one-off scripts, anything whose output is a path and a line number. The clickability is the feature and it is worth staying in the editor for.
Standalone terminal — anything long-running or interactive. Agents, dev servers, database sessions, log tails, SSH. Anything where "I need to see this for the next twenty minutes" or "this will ask me something" is true.
The test is not "is this a terminal command." It is: does this output want to be read, or clicked? Clicked goes in the editor. Read goes in a real window.
That maps cleanly onto agents, because agent output is the most read-heavy terminal output there is. You scroll back through it, you re-read the plan, you copy chunks of it into an issue. That is a reading task, and reading tasks want a real window, a real font size, and unbounded scrollback.
Zed and Cursor specifically
Zed's terminal is native rather than a webview and it shows — it is the best integrated terminal of the three by rendering quality, and the gap to a standalone GPU terminal is genuinely small. It is still a panel with panel-sized real estate, so the space argument stands, but the performance argument mostly does not.
Cursor inherits VS Code's terminal wholesale, including the scrollback default, so the setting above applies verbatim. Worth noting that Cursor's own agent features increasingly run outside the terminal, which reduces how much terminal-agent work you are doing in the editor at all.
VS Code has the deepest integration — tasks, problem matchers, shell integration with command decorations and "rerun this command" — and the most compromises on the raw terminal experience.
If you are going to run agents in the panel anyway
Fair. Then set these and stop losing sessions:
{
"terminal.integrated.scrollback": 20000,
"terminal.integrated.gpuAcceleration": "on",
"terminal.integrated.enablePersistentSessions": true,
"terminal.integrated.tabs.enabled": true,
"terminal.integrated.defaultLocation": "editor"
}
The last one is the underrated fix: "defaultLocation": "editor" opens terminals as full editor tabs rather than in the bottom panel. A terminal that gets the whole editor pane, side by side with a file, removes most of the space complaint without leaving the app. If you take one thing from this post and you are committed to the integrated terminal, take that.
enablePersistentSessions means a reload does not kill your running agent, which you will be grateful for exactly once, memorably.
Where I landed
The integrated terminal is not losing to standalone terminals. It is losing to a workload it was never designed for. It was built to be a subordinate strip below your real work, and agents turned the terminal into the real work for hours at a time.
If your terminal is where the work happens now, give it a window. If it is where the results appear, leave it in the editor.
For the standalone side of that split on a Mac, the best terminal for Claude Code on Mac covers the options, and iTerm2 and Warp alternatives covers the rest of the field.
Terminal Candy is a native macOS terminal — AppKit and SwiftTerm, Apple Silicon, no Electron — with per-session skins so two agents never look alike, and alerts that name the session waiting on you. $10 once, 14 day trial. Try it.