
Claude Code Hands-On (2): Shortcuts, the Four-State Toggle, and Thinking Modes
Shift+Tab is a four-state cycle, not a binary. Thinking modes have five levels. Escape and double-Escape do different things. Five shortcuts that reshape how Claude Code feels day-to-day.
The shortcuts are not in the help screen for a reason — they’re discoverable through use, not documentation. Here they are anyway.

Shift+Tab — the four-state cycle#
Most people think Shift+Tab toggles auto-accept on and off. It doesn’t. It cycles four states in order:
| |
Each state changes what Claude does without asking:
| State | What changes | Status bar shows |
|---|---|---|
| Normal | Default. Asks before file writes and shell commands. | No indicator |
| Accept edits | Auto-accepts file edits. Still asks for shell commands. | Auto-accept edits |
| Plan mode | Builds a plan but does not execute. Useful for reviewing the approach before any side effects. | Plan mode |
| Bypass permissions | Skips all confirmation prompts. Use when you trust the current task. | Yolo mode |
The status bar tells you which state you’re in. Shift+Tab cycles. There is no state I use most — they correspond to different tasks.

When to use each state — practical scenarios#
Normal mode is where you start every session and where you should stay for:
- First-time interactions with unfamiliar code
- Anything involving production data or deployment
- Working with code you don’t fully understand yet
- Teaching someone how Claude Code works (they need to see the permission prompts)
I stay in Normal mode about 40% of the time. The permission prompts aren’t just safety — they’re a feedback mechanism. When Claude asks “can I run npm test?”, that’s also telling me what it’s about to do.
Accept edits mode is my default for active development. The typical session looks like:
| |
This mode hits the sweet spot: Claude can write code without interrupting me, but anything with side effects (shell commands, git operations) still needs my approval. I use this mode for 40% of my sessions — basically any focused coding task where I’m watching the output.
The trap: don’t turn on Accept edits and then walk away from the terminal. The point is that you’re watching. If you’re not watching, stay in Normal.
Plan mode is underrated. It turns Claude into an architect instead of a builder:
| |
Now I can review the plan, ask questions (“why not Socket.io?”), adjust (“skip step 6, the client team handles that”), and then switch to Accept edits mode and say “go.” Plan mode is what I use when:
- I’m not sure about the right approach
- The change touches multiple files and I want to see the scope first
- I’m going to hand off the plan to someone else to execute
- The change is risky enough that I want to review before anything happens
Bypass permissions (Yolo mode) is exactly what it sounds like. Claude doesn’t ask before doing anything — file writes, shell commands, all of it. I use this in very specific situations:
- Running a well-understood script that I’ve run before
- Doing a bulk rename or format operation across many files
- Quick prototyping where I’ll
git stashor discard everything anyway - Automated workflows where I’m piping output and don’t want interactive prompts
| |
The danger is obvious. I have two rules for Yolo mode:
- Never use it on code I can’t easily revert (
git stashorgit checkout .should be one command away) - Never use it when the task involves external services (APIs, databases, deployments)
If you’re new to Claude Code, ignore Yolo mode for the first month. You need to build intuition for what Claude does before you stop watching it do things.
The muscle memory pattern#
After a few weeks, state switching becomes unconscious. My typical session:
| |

Thinking modes — five levels#

Type one of these phrases anywhere in your prompt and Claude shifts how much it reasons before responding:
| Phrase | Approximate effort | Token cost | Response time |
|---|---|---|---|
| (none) | Default reasoning | Baseline | Fast |
think | Light extra reasoning | ~1.2x | Slightly slower |
think more | Moderate reasoning | ~1.5x | A few seconds more |
think a lot | Deep reasoning | ~2x | Noticeably slower |
think longer | Extended reasoning | ~2.5x | Several seconds |
ultrathink | Maximum reasoning | ~3x+ | Can take 15-30 seconds |

How thinking levels affect output quality#
The difference isn’t just “more time.” Each level changes the structure of Claude’s internal reasoning:
No thinking phrase — Claude responds quickly with its first-pass answer. Good for straightforward tasks: “rename this variable,” “add a null check here,” “what does this function return?” If the answer is obvious, extra thinking is wasted.
think — Claude pauses briefly to consider alternatives. I use this for small but non-obvious tasks: “is there a simpler way to write this?” “does this handle the edge case where the list is empty?”
think more — Claude starts considering trade-offs and second-order effects. Good for debugging: “find why this test is flaky,” “trace this null pointer to its source.”
think a lot — This is my default for anything I’d describe as “non-trivial.” Architecture questions, refactoring decisions, security reviews. Claude at this level will often identify issues you didn’t ask about:
| |
Without think a lot, it might catch items 1 and 3 but miss the timing attack.
think longer — Reserved for architecture decisions with real consequences. “Should we split this monolith into services?” “What’s the right caching strategy for this data access pattern?” Claude will lay out multiple approaches with pros and cons before making a recommendation.
ultrathink — The maximum. I use this maybe once a week. The right situations:
- “Design the data model for this new feature, considering the existing schema, the anticipated query patterns, and the migration path from the current structure”
- “Review this entire module for correctness, performance, and maintainability. I want a senior engineer-level review.”
- “This system is hitting latency spikes under load. Analyze the architecture and propose fixes.”
Practical scenarios — which level for which task#
| Task | Thinking level | Why |
|---|---|---|
| Fix a typo | None | Obvious, no reasoning needed |
| Rename a variable across files | None | Mechanical, not analytical |
| Add error handling to a function | think | Needs to consider what errors can occur |
| Debug a failing test | think more | Needs to trace cause and effect |
| Refactor a module | think a lot | Needs to preserve behavior while restructuring |
| Code review for PR | think a lot | Needs to find subtle issues |
| Architecture decision | think longer | Needs to weigh multiple approaches |
| System design from scratch | ultrathink | Needs comprehensive analysis |
| Security audit | ultrathink | Needs to think like an attacker |
The cost trap#
The trap is using ultrathink on every prompt because it sounds rigorous. It’s not — it’s expensive. The model does best at the level that matches the actual task complexity. Using ultrathink to rename a variable is like hiring a consulting firm to change a lightbulb.
I’ve measured the practical difference: my daily token spend dropped 40% when I started matching thinking levels to tasks instead of defaulting to think a lot for everything.
A good heuristic: if you could explain the task to a junior developer in one sentence, no thinking phrase needed. If you’d need a whiteboard session, think a lot or above.
Every keyboard shortcut, annotated#
Here’s the complete reference for Claude Code keyboard shortcuts:
Input line shortcuts#
| Shortcut | Action | When I use it |
|---|---|---|
Enter | Send message | Obviously |
Shift+Enter | New line in input | Multi-line prompts |
Shift+Tab | Cycle permission state | Multiple times per session |
Up arrow | Previous message | Re-edit a prompt I just sent |
Ctrl+C | Cancel current input | When I’m re-typing from scratch |
Ctrl+L | Clear screen (not context) | Visual cleanup, context stays |
During generation#
| Shortcut | Action | When I use it |
|---|---|---|
Escape | Stop generation | Wrong instruction, stop immediately |
Escape Escape | Conversation fork | Undo the last exchange(s) |
File and context#
| Shortcut | Action | When I use it |
|---|---|---|
@ | File/directory picker | Every session, multiple times |
# | Write to CLAUDE.md | When I discover a new convention |
Ctrl+V | Paste image | Screenshots, error dialogs, designs |
Escape and double-Escape — interruption vs. time travel#
These deserve their own section because they’re the most important shortcuts after Shift+Tab.

Single Escape — stop generation#
A single Escape interrupts the current generation. Use it the moment you realize you gave the wrong instruction. The agent stops, you correct.
| |
The partial output from the interrupted generation stays visible but isn’t committed. Claude hasn’t written any files yet (assuming you’re in Normal or Accept edits mode and it hadn’t reached the file-writing stage).
Timing matters. If Claude has already started writing files when you press Escape, the files it already wrote stay changed. You’d need to git checkout . or undo manually. Press Escape early.
Double Escape — conversation fork#
Double-Escape (press it twice quickly) opens a history view of the last few exchanges. You pick one to “rewind” to, and the conversation forks from there. Anything after the picked turn is dropped from context.
| |
This is the feature I miss most when using other coding agents. Forking conversations is the right primitive — it lets you try one path, decide it was wrong, and go back without polluting the agent’s memory.
Important: double-Escape doesn’t undo file changes. If Claude wrote files before you fork, those files are still changed on disk. The fork only affects the conversation context. You’ll need to git checkout . if you also want to undo the file changes.
My common pattern: before asking Claude to do something risky, I make a checkpoint:
| |
Then if the result is bad, I double-Escape to fork the conversation AND git stash pop to restore the files. Clean slate.
Control+V — paste images#
Paste an image directly into the prompt. UI screenshot, error dialog, design comp, whiteboard photo — Claude reads it like text. The most useful version of this is “the test failed and the output is in this terminal screenshot, what’s wrong?”. You don’t need to transcribe.
What works well with image paste#
- Error screenshots: Stack traces, browser console errors, terminal output
- UI bugs: “The button is in the wrong position” with a screenshot
- Design comps: “Implement this design” with a Figma export
- Whiteboard sketches: Architecture diagrams drawn during meetings
- Data visualizations: “What’s wrong with this chart?” with a screenshot
What doesn’t work well#
- Screenshots of tiny text: If you can barely read it, Claude can barely read it
- Complex UML diagrams: Claude can read them but often misses details in dense diagrams
- Video/GIF: Not supported — take a screenshot of the relevant frame
/compact and /clear — context management#
Two ways to deal with a long conversation:
/compactsummarizes the conversation so far into a much shorter message and continues from there. Use when the agent is starting to feel slow because the context is large./cleardrops the conversation entirely and starts fresh. Use when you’ve moved on to an unrelated task in the same project.
Both keep CLAUDE.md and .claude/settings.json in scope. They only affect the per-session message history.
/compact — when and how#
Claude Code has a context window. As your conversation grows, you burn more of it on history and less is available for the current task. Symptoms of a full context:
- Responses get slower
- Claude starts forgetting things you said earlier
- Claude repeats suggestions it already made
- The quality of code generation drops
When you notice these, run /compact. Claude summarizes the entire conversation into a few paragraphs and continues from the summary. You lose the exact wording of earlier messages but keep the gist.
| |
When to compact vs. clear:
| Situation | Action | Why |
|---|---|---|
| Slow responses, same task | /compact | Keep context, reduce tokens |
| Switching to unrelated task | /clear | Fresh start, no stale context |
| Lost in a wrong approach | Double-Escape | Fork to before the mistake |
| Starting the work day | /clear | Yesterday’s context is stale |
| Mid-refactor, many files | /compact | Keep file change context |
The compaction quality trade-off. Compaction loses detail. If you had a nuanced discussion about why you chose approach A over approach B, the compact summary might just say “chose approach A.” If that discussion matters, consider writing the decision to CLAUDE.md with # before compacting.
A pattern I use: at the end of a complex decision, before it gets compacted away:
| |
Now the reasoning survives compaction because it’s in the persistent memory.
/compact with a custom prompt#
You can guide what /compact preserves by adding a prompt after it:
| |
Claude will weight its summary toward those topics. Useful when you know which part of the conversation is most important to carry forward.
Multi-monitor and multi-terminal workflows#
Claude Code is a terminal application, which means it fits into terminal multiplexer workflows naturally.
Tmux split panes#
My typical layout on a wide monitor:
| |
Claude writes files in the left pane. The editor auto-reloads on the right. I run tests in the bottom-left. This three-pane layout means I never need to switch contexts.

Multiple Claude sessions#
You can run multiple Claude Code instances in the same project. Each has its own conversation context. Both share CLAUDE.md and settings.
Useful when you’re working on two unrelated tasks in the same repo:
| |
They won’t conflict as long as they’re working on different files. If they touch the same file, the last one to write wins, which is messy. Use this for genuinely independent tasks.
What this looks like in practice#
A real workflow I had this morning:
| |
That whole flow uses every primitive in this piece. None of them are individually impressive. Together they make Claude Code feel like a real tool instead of an autocomplete on top of a chat.
Another example: debugging with mode switches#
| |
Notice how the mode switches match the risk level. Investigation in Normal. Code writing in Accept edits. Anything touching the database stays in Normal with explicit approval.
Quick reference card#
Print this, tape it to your monitor for the first week:
| |
Next piece: custom slash commands and $ARGUMENTS.
Claude Code Hands-On 10 parts
- 01 Claude Code Hands-On (1): Install, the Three-Layer Config, and the # @ /init Trio
- 02 Claude Code Hands-On (2): Shortcuts, the Four-State Toggle, and Thinking Modes you are here
- 03 Claude Code Hands-On (3): Custom Slash Commands and Conversation Control
- 04 Claude Code Hands-On (4): MCP Servers, or How Claude Talks to Anything
- 05 Claude Code Hands-On (5): Hooks, or How to Stop Worrying About Yolo Mode
- 06 Claude Code Hands-On (6): The SDK, GitHub Integration, and Claude in CI
- 07 Claude Code Hands-On (7): Ten Hooks I Actually Use, with the Code
- 08 Claude Code Hands-On (8): Sub-Agents, Worktrees, and Plan Mode
- 09 Claude Code Hands-On (9): settings.json, the Three-Layer Permission Model, and Env
- 10 Claude Code Hands-On (10): Skills, and When to Reach for Each Extension Mechanism