Your Cockpit: Making the Terminal a Place You Like
"If you're going to live in this window, you might as well like it: readable fonts, a prompt that helps, history that finds last Tuesday's command."
You have the skills. This short part is about the room — turning the default terminal into a cockpit: colors and a prompt you actually like, history tricks that recall any command in two keystrokes, the integrated terminal in VS Code where vibe coders live, and running several terminals at once without losing your mind.
12.1 Make It Yours
The default white-on-black is fine, but "fine" is not what you want from a tool you'll live in. Every terminal app ships with themes, font settings, and transparency — five minutes of setup pays off every day after:
macOS: Terminal.app got good again
macOS 26 Tahoe gave the stock Terminal.app its first real overhaul in roughly 24 years — 24-bit true color (~16.7 million shades, where older terminals were stuck with 16 or 256), Powerline font support, and a batch of fresh themes. Settings → Profiles (a profile is one saved bundle of font, colors and behavior): pick one, hit "Default" to keep it. As a beginner you genuinely don't need to install anything. iTerm2 remains the solid power-user choice — hundreds of importable color schemes, better splits, better search — and its AI features are an optional, separate plugin, off by default.
Windows: Windows Terminal
Already the default on Windows 11, and the host for your WSL and Git Bash sessions. Settings → Color schemes ships with One Half, Solarized, and Tango out of the box, and each profile (Ubuntu, Git Bash, PowerShell) can have its own theme — a handy visual cue for which shell you're in.
Linux: GNOME Terminal & friends
GNOME Terminal → Preferences → Profiles: colors, fonts, transparency. Konsole (KDE) and others offer the same. Profiles are cheap — make a garish red one for any terminal that's SSH'd into something important.
Everywhere: the font matters
Monospaced means every character takes the same width — the only reason columns of
output line up, so the choice is less taste than it looks. Pick one with a legible 0-vs-O and a size you don't squint at. JetBrains Mono, Fira
Code, and Cascadia Code are free favorites.
Everywhere: the clipboard bridge
Terminal to clipboard without a mouse: on macOS ps aux | pbcopy copies the whole output and pbpaste brings the clipboard back into a pipe. Linux says xclip (or wl-copy), WSL says clip.exe. The everyday move for handing a wall of output to an AI chat
without screenshotting your terminal.
The upgrade pick: Ghostty
Ghostty (v1.3, 2026; macOS & Linux) is the current favorite when you outgrow the stock app: extremely fast, native-feeling, free and open source, and deliberately AI-free. Your shell, prompt, and everything in this course carry over unchanged.
The AI-first one: Warp
Warp builds an AI agent directly into the terminal. Know what you're choosing: it went open source in 2026, but it wants an account, and its AI runs on a paid, metered credit system — an AI-first terminal with a subscription posture, not a free tool. Nothing it offers replaces being able to read the commands yourself.
A taste of prompt customization
The prompt itself — that user@host:~$ from the intro — is just a variable named PS1, short for prompt string 1, and you set it the way you set any variable
(Environment Variables):
PS1="\w > "
# ~/projects > <- your prompt is now the current directory
PS1="🌲 \W $ "
# 🌲 projects $ <- yes, emoji workThe name implies a PS2, and there is one: the continuation prompt — the bare > you get if you press Enter with a quote still hanging open. That's the shell
asking you to finish the line, not an error.
Hand-rolling a fancy PS1 with colors and git status is a classic rabbit hole. The modern shortcut is Starship — a fast, cross-shell prompt that works in bash, zsh, and every OS in this course. One install,
one line in your shell config (Your Shell Config, .bashrc / .zshrc), and your prompt shows the current directory, git branch, language
versions, and whether the last command failed — the useful stuff, with zero maintenance.
Pair it with a couple of small zsh plugins — extra files your shell config loads at startup, the same mechanism as the aliases you added
there yourself, only someone else wrote the file. Two earn their place: zsh-autosuggestions greys in the rest of a command as you start typing it, and zsh-syntax-highlighting turns a command red before you press Enter if the shell
can't find it. A framework like oh-my-zsh bundles hundreds instead, and charges
you startup time for the ones you'll never use.
curl ... | sh one-liner — the red-flag pattern, with one
detail worth catching: it ends in sh, not bash. sh is an older, more minimal shell that on many systems isn't bash at all — a quiet swap of what
runs the script, and the kind of detail an audit is for. Perfect low-stakes rehearsal: download
the script first, skim it (or ask your AI to), then run it. Trusted source, verified anyway —
that's the habit."Help me install starship and add it to my shell config — explain each step before we run it"
"Set up a terminal color scheme and font that are easy on the eyes for long sessions on my OS"
Try It: Design Your Prompt
Enough talk — build one. Pick a design, make it yours, and take the real starship.toml home. This is a genuine config for Starship, the cross-shell prompt — nothing here touches your machine until you choose to install
it.
Pastes into zsh, writes your config, enables Starship, and reloads — assuming it's already
installed. Everything's inline (not a curl … | sh), so you can .
"$schema" = 'https://starship.rs/config-schema.json'
add_newline = false
format = """
[░▒▓](fg:#7aa2f7)\
$directory\
[](fg:#7aa2f7 bg:#bb9af7)\
$git_branch$git_status\
[](fg:#bb9af7 bg:#7dcfff)\
$nodejs\
[](fg:#7dcfff bg:#9ece6a)\
$python\
[](fg:#9ece6a bg:#e0af68)\
$cmd_duration\
[](fg:#e0af68)\
$character"""
[character]
success_symbol = '[❯](bold fg:#9ece6a)'
error_symbol = '[❯](bold fg:#f7768e)'
[directory]
truncation_length = 3
truncation_symbol = '…/'
truncate_to_repo = false
style = "fg:#1a1b26 bg:#7aa2f7"
format = '[ $path ]($style)'
[git_branch]
symbol = ' '
style = "fg:#1a1b26 bg:#bb9af7"
format = '[ $symbol$branch ]($style)'
[git_status]
style = "fg:#1a1b26 bg:#bb9af7"
format = '[ $all_status$ahead_behind]($style)'
[nodejs]
symbol = ' '
style = "fg:#1a1b26 bg:#7dcfff"
format = '[ $symbol($version) ]($style)'
[python]
symbol = ' '
style = "fg:#1a1b26 bg:#9ece6a"
format = '[ $symbol($version) ]($style)'
[cmd_duration]
min_time = 500
style = "fg:#1a1b26 bg:#e0af68"
format = '[ $duration ]($style)'
Prefer to do it by hand? Three steps:
- Install Starship. Reach for a package manager first — it's the auditable
route:
brew install starship(macOS),winget install starship(Windows), orpacman -S starship/dnf install starshipon Linux. Starship's own documented installer is acurl … | shone-liner — the pattern you learned to stop on in Read Before You Run. If you'd rather take that route, take it in two steps and actually read the script in the middle:curl -fsSLo starship-install.sh https://starship.rs/install.sh less starship-install.sh # read it (or hand it to your AI to explain) sh starship-install.sh
- Save the config. Put the downloaded file at
~/.config/starship.toml(runmkdir -p ~/.configfirst if that folder doesn't exist). - Turn it on in your zsh. Add one
line to your config and reload (switch shell in the bar above):
echo 'eval "$(starship init zsh)"' >> ~/.zshrc source ~/.zshrc
Using a powerline or Nerd Font design? Install a Nerd Font and select it in your terminal's settings, or the arrows and icons show as boxes. The preview above draws them with CSS so you can design without one. Every design here is just a text file — open it, read it, tweak it. It's your prompt now.
Copy link saves your whole design — palette, colors and all — into a shareable URL. Bookmark it to come back to this exact prompt, or send it to a friend and they'll open the designer pre-loaded with it.
12.2 History Superpowers
Watch someone fluent in the terminal and you'll notice they barely type. The shell writes down every command you run in a file it keeps between sessions — that record is your history, and it is not the same thing as scrollback, the output still sitting in the window above your prompt. Scrollback is what a screenshot captures, and it dies with the window; history outlives it. The recall tools built on that record are the biggest speed unlock in this course:
Up-arrow — the one you know
Each press steps one command back through history; Enter re-runs, or edit first. Perfect for the last two or three commands — clumsy for anything older. That's what the rest of this section is for.
history — the full ledger
Prints your numbered command history — and because it's just text output, all of Text & Pipes applies: history | grep ssh finds every ssh command you've
ever run. Your history is a searchable log of how you did everything.
!! — the last command, verbatim
!! expands to your previous command. Its one legendary use: you run something, it fails with
"permission denied," and sudo !! re-runs it elevated — no retyping. (Every bit of the sudo caution in sudo still applies; the shell prints the expanded command, so you
see what's about to run.)
Ctrl+R — reverse search, the crown jewel
Press Ctrl+R and start typing any fragment — the shell live-searches backward through history for the most recent match. Press Ctrl+R again for older matches, Enter to run, arrow keys to edit first, Ctrl+C to bail. That 40-character command from last Tuesday? Three letters and it's back.
Edit the line — without riding the arrow keys
A recalled command usually needs one fix, and holding an arrow key across 60 characters
is not the fix. Ctrl+A jumps to the start of the line, Ctrl+E to the end, Ctrl+W deletes the word behind the cursor,
and Ctrl+U wipes the line entirely — the panic-adjacent one, for when you've
typed something you'd rather not have sitting at a prompt. Four chords, and recall-then-edit
becomes one motion.
history | grep backup
# 212 ./backup.sh notes
# 340 ./backup.sh recipes
npm run deploy
# Error: permission denied
sudo !!
# sudo npm run deploy <- the shell shows what !! became
# (reverse-i-search)`dep': npm run deploy <- Ctrl+R, then "dep"Ctrl+R the habit. The rule of thumb: up-arrow for the
last couple of commands, Ctrl+R for everything else. If you catch yourself pressing up-arrow more than three times, stop — reverse
search would have had it already. And for commands you recall constantly, promote
them to an alias (Your Shell Config) and stop searching altogether.Try It: Retrace Your Steps
Ctrl+R lives at a real prompt, but you can practice the other half here: run a
couple of commands, then pipe history into grep to dig one back out — and save the line you found.Loading playground...
"Search my shell history for every command I ran involving npm and summarize what they did"
"Teach me the Ctrl+R workflow with three practice rounds using commands from this session"
12.3 Terminal in VS Code
Here's where all of this lands in daily life. VS Code has a full terminal built into the
editor — toggle it with ⌃` (Control + backtick, same keys on every OS), and it slides up as a panel beneath your code. It's
not a lookalike or a simulation — it runs your real shell, with your .bashrc, your aliases, your PATH, your history. Everything
from this course works in it unchanged.
Two conveniences make it better than a separate window: it opens already cd'd into your project folder (no navigating to where your code lives — you're there), and the + button in the panel spawns extra terminals
in the same place, with a dropdown to pick which shell (bash, zsh, or on Windows: WSL, Git Bash,
PowerShell).
npm test, you watch it execute, you scroll back through the failures, you
run your own grep on the log — human and AI, sharing one shell. Every skill in this course
is what lets you be a participant in that terminal instead of a spectator.That shared visibility is the practical payoff of Terminal for the AI Era: when the
agent asks permission to run a command, you audit it first; when it writes a setup.sh, you read it line by line; when it says "tests failed," you can see the exit code it saw.
The integrated terminal is the one place code, agent, and shell meet — all in a single
window.
VS Code even builds the red-flag mental model from Read Before You Run into settings.
Copilot's agent mode runs terminal commands with per-command approval, and you can
maintain an allowlist and denylist of which commands auto-approve — let git status through without asking, always stop on rm -rf and sudo. Claude Code ships a VS Code extension that drives the same CLI from a
panel in the editor — same terminal, same approval moments, same skills.
ls, cat, grep) doesn't tangle with its work. Which is the perfect segue to the next
section."Run the test suite in the integrated terminal and walk me through the output you see"
"Before you run any command in this terminal, tell me what it does and wait for my okay"
12.4 Many Terminals at Once
Sooner or later one terminal isn't enough: a dev server occupies one (it runs until you stop
it, holding the prompt hostage), tail -f follows a log in another (Moving Around), and you still need a free prompt to
actually work. The answer is never "quit the server" — it's more terminals, and every modern terminal
app makes that cheap:
Tabs
Like browser tabs: ⌘T on macOS, Ctrl+Shift+T in Windows Terminal and GNOME Terminal. Each tab is a fresh, independent shell — new history position, own working directory. Best for separate contexts: one tab per project.
Split panes
Two or more shells visible side by side in one window — best for things you watch while you work (server output, a followed log). iTerm2, Windows Terminal, and VS Code's terminal panel all split with a keystroke or the pane's context menu.
A classic three-pane cockpit for a coding session: the dev server in one pane, tail -f server.log in a second, and a free prompt in the third — with your agent's terminal from Terminal in VS Code alongside. Every shell is independent: its own working directory,
its own cd, its own foreground command. Nothing you do in one pane disturbs another.
And here's the 2026 twist that turned splits from a power-user nicety into standard
practice: people now run multiple AI agents in parallel — one agent per pane or tab, each pointed at its own copy of the project (git calls that a worktree) so they never collide. The split layout stops being "server here, logs
there" and becomes several agents, each in its own pane: three panes, three agents on three tasks,
and you sweeping your eyes across all of them, approving and course-correcting. Every pane is
just a shell — which is why everything in this course scales from one terminal to ten.
One name to file away for later: tmux, a terminal multiplexer that does tabs and splits inside the terminal itself — and whose sessions survive the window closing, your laptop sleeping, even an SSH connection dropping. You log back in, reattach, and every pane is exactly where you left it (agents included — which is why people running several at once tend to live in it).
Careful with that word, though — everywhere else in this course a session is one shell's
lifetime, and it dies with its window. A tmux session is a named collection of
panes living in a process of its own, which is how it survives yours closing. Its keybindings
feel arcane for one reason: every one of them starts with the same two keys, Ctrl+B, pressed and released before the key that does the work — so splitting a pane is Ctrl+B,
then %.
Zellij is the friendlier modern multiplexer, with its shortcuts printed on screen. Overkill for today; indispensable the day you work on remote servers. It'll be waiting.
"Set up my layout: dev server in one terminal, log tail in a second, and a free shell for me"
"The dev server is hogging my only terminal — what are my options, and which do you recommend?"
Loading challenge...