<!-- title: 计划模式入门：先规划再改码 -->

# Claude Code 计划模式（Plan Mode）入门：让 AI 先出方案再动手

## 概述

本教程面向已经装好 Claude Code、能跑通第一个项目，但每次让 AI 改代码时心里没底的零基础到入门用户。学完之后你将掌握：Claude Code 的三种输入模式（普通 / 自动接受 / 计划模式）如何切换与区分；如何用 `Shift+Tab` 进入只读规划状态；如何写一句高质量的"规划提示词"；如何审阅、迭代并批准 Claude 给出的实施方案；以及在什么场景下该用、什么场景下纯属浪费时间。适用人群：第一次在真实项目（哪怕只有三五个文件）上用 Claude Code 的人、对"AI 直接改我的代码"感到不安全的初学者、希望养成"先想清楚再动手"工程习惯的新手。

## 前置条件

- 已安装 Claude Code（任何安装方式均可，原生 npm 安装、WSL2、桌面应用皆可），并能正常进入交互式会话。
- 有一个可被修改的本地项目目录（git 仓库更佳，便于回滚）。
- 终端能正常显示 Unicode 字符（计划模式的状态指示符 `⏺`、`⏵⏵` 需要等宽字体支持）。
- 建议先做一次 `git commit` 或 `git stash`，给项目留一个干净的"存档点"，方便在方案不满意时一键回到原状。

---

## 正文

### 第一步：先搞懂三种输入模式，别上来就按快捷键

很多新手的第一个困惑是："我到底在什么模式下？"Claude Code 的输入框底部有一行状态提示，它对应三种输入模式，理解它们的差别是安全使用 AI 改代码的前提。

| 模式 | 状态指示 | 行为 | 适合场景 |
|------|---------|------|---------|
| 普通模式（Normal） | 无特殊提示 / `⏵` | 每次写文件、执行命令前会**暂停并请求你确认** | 默认模式，谨慎操作 |
| 自动接受模式（Auto-accept edits） | `⏵⏵ accept edits on` | 写文件**不再暂停**，自动应用（bash 命令通常仍会询问） | 信任度高、重复性的小改动 |
| 计划模式（Plan mode） | `⏺ plan mode on` | **只读**：可读文件、搜索、探索，但**禁止编辑文件和执行有副作用的命令**，最终输出一份方案等你批准 | 3+ 文件改动、不熟悉的代码、风险操作 |

关键认知：计划模式不是"让 AI 多说几句"，而是一道**结构性护栏**——在这个模式下，Claude 物理上拿不到改文件的能力，它只能看、只能想、只能写方案。这把你从"我得全程盯着防止它乱改"的焦虑中解放出来，让你能专注审阅它的思路对不对。

预期结果：在你的终端输入框附近，你应该能清晰看到当前处于哪种模式。如果看不到任何 `⏵⏵` 或 `⏺` 标记，说明你在普通模式。

### 第二步：用 `Shift+Tab` 切换模式（两次进入计划模式）

切换模式的快捷键是 `Shift+Tab`，它会在三种模式间**循环**：

```
普通模式  --Shift+Tab-->  自动接受模式  --Shift+Tab-->  计划模式  --Shift+Tab-->  普通模式
```

也就是说，从默认的普通模式出发，**连续按两次 `Shift+Tab`** 就进入计划模式。每按一次，输入框底部的状态提示都会更新，请务必看一眼确认。

操作要点：

- 进入计划模式后，底部应显示 `⏺ plan mode on`（或中文环境的等价提示）。
- 如果按多了进到自动接受模式（`⏵⏵`），再按一次 `Shift+Tab` 即可。
- 退出计划模式回到普通模式，同样按 `Shift+Tab` 循环回去。

**常见问题 1：按了 `Shift+Tab` 没反应？**
检查是否焦点在输入框；某些终端（尤其经过 tmux、SSH）会拦截 `Shift+Tab`。可以尝试 `Ctrl+Shift+Tab` 或在终端设置里把 `Shift+Tab` 映射为发送 `\x1b[Z`（ESC [ Z）。实在不行，也可以在消息开头用自然语言触发，例如直接说"先给我一个计划，不要改任何文件"，Claude 会自觉进入只读规划。

**常见问题 2：进入计划模式后，AI 还是试图改文件？**
正常情况下不会。如果出现，通常是模式没真正切换成功（状态提示没变成 `⏺`）。重新确认一次底部指示符。

### 第三步：写一句好的"规划提示词"

计划模式的价值，七成取决于你这一句话写得好不好。新手的通病是只说目标、不说约束，结果拿到的方案泛泛而谈。一个好提示词应该包含四要素：**目标 + 范围 + 约束 + 验收标准**。

对比两个例子：

```
❌ 差的提示词：
   "给我的待办应用加一个截止日期功能。"

✅ 好的提示词：
   "给这个 Flask 待办应用增加'截止日期'功能：
    1. 数据模型里给 Task 加一个可选的 due_date 字段（日期类型）；
    2. 首页表单增加日期选择，列表按截止日期升序展示，已过期的标红；
    3. 只改 models.py、app.py、templates/index.html 三个文件，
       不要动数据库迁移脚本以外的任何东西；
    4. 用 SQLite，不引入新依赖；
    5. 完成后告诉我如何手动验证：新增一个过期任务应显示红色。"
```

后者因为有明确的文件范围、技术约束和验收标准，Claude 给出的方案会精准得多，也更不容易"顺手"重构你不想动的代码。

预期结果：提交后，Claude 会开始读取相关文件（你会在屏幕上看到它列出读过的文件路径），然后给出一份结构化方案，通常包含"改动清单 + 每个文件的具体修改思路 + 验证方法"。

### 第四步：审阅与迭代方案——这是计划模式最值钱的一步

Claude 给出方案后，**不要急着批准**。把它当成一次免费的代码评审，重点检查三件事：

1. **改对文件了吗？** 方案里列出的文件，是否都在你预期的范围内？有没有"顺手"想改 utils.py、配置文件？
2. **思路和你想的一致吗？** 它选择的技术路径（比如要不要新建一个类、要不要加一个辅助函数）是否符合你的代码风格？
3. **有没有遗漏的边界？** 比如"如果 due_date 为空怎么办""排序时空值排哪里"——好的方案会主动列出这些，差的方案你需要追问。

迭代方法：直接用自然语言反馈，**不需要重新进入任何模式**。例如：

```
"方案整体可以，但有两点要改：
 - 第 2 条，已过期任务的红色样式用现有的 .overdue 类，别新建 CSS；
 - due_date 为空的任务排在最后，别让它们干扰排序。
 请更新方案。"
```

Claude 会重新读取文件、给出修订版方案。这个"来回打磨方案"的过程，比直接让它改代码省下的返工时间多得多。

**常见问题 3：方案来回改了好几轮，上下文是不是变长了？**
是的。计划模式下虽然不写文件，但读取和对话都会占用上下文窗口。如果轮次超过四五次，可以考虑用 `/clear` 清空后带着最终共识重新开始，或在方案基本定稿后直接进入执行。

### 第五步：批准并退出，让方案落地

当方案让你满意，Claude 会通过一个"退出计划模式"的动作请求你的批准（屏幕上会出现类似"是否批准该方案并开始实施？"的确认）。批准后，它会自动退出计划模式，回到普通（或自动接受）模式，开始按方案逐个文件实施。

此时建议：

- 如果改动较多，批准前先确认你处于**普通模式**而非自动接受模式，这样每个文件写入前你还有最后一道确认机会。
- 改动落地后，**第一时间用 `git diff` 审查实际变更**，对照方案核对。
- 跑一遍你事先约定的验收标准（如"新增过期任务显示红色"），确认行为正确。
- 满意后 `git commit`；不满意，`git checkout .` 或 `git stash` 一键回到存档点。

### 何时该用、何时不该用（决定 80% 效率）

**该用计划模式：**
- 改动涉及 3 个及以上文件。
- 涉及数据库 schema、迁移、接口契约变更。
- 安全敏感代码（认证、授权、加密、配置加载）。
- 接手不熟悉的代码库，需要先摸清结构再动手。
- 你对实现路径本身不确定，想先看 AI 的判断。

**纯属浪费时间的场景（直接跳过计划模式）：**
- 单文件的拼写、改名、小修小补。
- 你已经明确知道要怎么改、只是让 AI 代手的机械操作。
- 临时性的探索性提问（"这个函数是干嘛的"）。

一个简单的决策原则：**当你回答"AI 该怎么改"这个问题需要超过 10 秒思考时，就用计划模式；如果答案脱口而出，就别用。**

---

## 实战案例：给 Flask 待办应用加"截止日期 + 过期高亮"功能

下面用一个完整可运行的最小项目演示整个流程。先准备项目骨架（你也可以让 Claude 在计划模式里帮你生成这段）：

```bash
mkdir todo-demo && cd todo-demo
git init && mkdir -p templates
```

**`models.py`**（用纯 SQLite，零依赖）：

```python
import sqlite3, datetime

DB = "todo.db"

def get_db():
    conn = sqlite3.connect(DB)
    conn.row_factory = sqlite3.Row
    return conn

def init_db():
    conn = get_db()
    conn.execute("""
        CREATE TABLE IF NOT EXISTS tasks (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            done INTEGER DEFAULT 0
        )
    """)
    conn.commit()
    conn.close()

def all_tasks():
    return get_db().execute("SELECT * FROM tasks ORDER BY id").fetchall()

def add_task(title):
    conn = get_db()
    conn.execute("INSERT INTO tasks (title) VALUES (?)", (title,))
    conn.commit()
    conn.close()
```

**`app.py`**：

```python
from flask import Flask, request, render_template
from models import init_db, all_tasks, add_task
import datetime

app = Flask(__name__)
init_db()

@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "POST":
        add_task(request.form["title"])
    return render_template("index.html", tasks=all_tasks())

if __name__ == "__main__":
    app.run(debug=True)
```

**`templates/index.html`**：

```html
<!doctype html>
<html><body>
  <h1>待办清单</h1>
  <form method="post">
    <input name="title" placeholder="新任务" required>
    <button>添加</button>
  </form>
  <ul>
    {% for t in tasks %}
      <li>{{ t.title }}</li>
    {% endfor %}
  </ul>
</body></html>
```

安装依赖并验证基线：`pip install flask && python app.py`，浏览器打开 `http://127.0.0.1:5000` 能增删任务即基线正常。**先 `git add -A && git commit -m "baseline"` 留存档点。**

现在进入计划模式（按两次 `Shift+Tab`，确认底部出现 `⏺ plan mode on`），输入第三步那个"好的提示词"。Claude 给出的方案大致长这样（已精简）：

```
实施方案：
1. models.py
   - 迁移：给 tasks 表加 due_date TEXT（ISO 日期，可空）
   - all_tasks()：按 due_date 升序排，NULL 排最后
     （用 ORDER BY due_date IS NULL, due_date）
   - add_task(title, due_date=None)：写入可选日期
   - 新增 is_overdue(task)：today > due_date 且未完成时返回 True
2. app.py
   - index() POST 分支读取 due_date 传入 add_task
   - 给模板传 today 用于判断过期
3. templates/index.html
   - 表单加 <input type="date" name="due_date">
   - 过期行加 class="overdue"（复用，无需新 CSS）
   - 渲染时显示 due_date
验证：
   - 新增一个 yesterday 的任务 → 列表置顶且标红
   - 新增一个无日期任务 → 排在最后
   - 新增一个未来日期任务 → 正常排序、不变红
```

检查无误后批准方案。Claude 退出计划模式，开始按方案逐个文件实施。落地后 `git diff` 核对，跑验收三条，全部通过后 `git commit`。如果发现 due_date 排序不符合预期，`git checkout .` 回到 baseline 重来即可——全程零风险。

---

## 工作流程图

```mermaid
flowchart TD
    A[进入会话 留 git 存档点] --> B{改动是否 3+ 文件\n或风险高?}
    B -- 否 --> Z[普通模式 直接改]
    B -- 是 --> C[按两次 Shift+Tab\n进入计划模式 ⏺]
    C --> D[写规划提示词\n目标+范围+约束+验收]
    D --> E[Claude 只读探索\n读文件/搜索]
    E --> F[给出结构化方案]
    F --> G{方案满意?}
    G -- 否 迭代 --> D
    G -- 是 --> H[批准 退出计划模式]
    H --> I[实施改动]
    I --> J[git diff 审查\n跑验收标准]
    J --> K{通过?}
    K -- 否 --> L[git checkout 回滚]
    L --> D
    K -- 是 --> M[git commit 完成]
```

---

## 进阶提示

- **配合 `/clear` 与 `/compact`**：计划模式反复迭代会让上下文变长。方案定稿后若要执行，可先 `/compact` 压缩历史，或直接批准让它在当前上下文里动手。
- **用 `/cost` 盯预算**：长方案讨论会消耗 token，随时 `/cost` 查看花费，避免在低价值讨论上烧钱。
- **计划模式 + 子智能体**：进阶用法是在方案里让 Claude 调度子智能体并行探索不同模块，但新手阶段先把"单人规划 → 批准 → 执行"的闭环练熟。
- **把好提示词存进 CLAUDE.md**：如果你的项目反复需要类似约束（如"始终用 SQLite、不引入新依赖"），写进项目根目录的 `CLAUDE.md`，以后每次规划都自动带上，省得重复写。

## 延伸阅读

- Anthropic 官方交互模式文档（键盘快捷键、输入模式完整参考）：`https://docs.anthropic.com/en/docs/claude-code/interactive-mode`
- Claude Code 计划模式完整指南（2026）：`https://www.anyonebuilds.com/guides/claude-code-plan-mode`
- DataCamp 教程——评审优先的重构循环：`https://www.datacamp.com/tutorial/claude-code-plan-mode`

## 训练营适用性评估

- **适合的训练营类型**：Claude Code 零基础入门营、AI 辅助编程新手营、企业内部"AI 编程安全实践"培训。本教程定位为入门营的**第二节课**（紧接安装与首跑之后），补上"如何安全地让 AI 改真实代码"这一最关键的工程习惯。
- **预计教学时长**：理论讲解 30 分钟 + 跟做实战案例 45 分钟 + 学员用自己的小项目练习 30 分钟，合计约 105 分钟（1.5–2 课时）。
- **教学建议**：先让学员**不用**计划模式直接让 AI 做一个 5 文件改动，亲身体验"AI 顺手重构了不想动的代码"的混乱，再引入计划模式形成强烈对比，记忆最深。
- **前置衔接**：本课之前应已完成"安装与首跑"课；本课之后自然衔接"权限围栏""CLAUDE.md 项目记忆"等课，构成"装好 → 会用 → 用得安全"的完整入门路径。

## 参考来源

1. [Interactive mode — Claude Code Docs](https://docs.anthropic.com/en/docs/claude-code/interactive-mode) — 官方对键盘快捷键与输入模式（含 `Shift+Tab` 切换、计划模式）的权威说明
2. [Claude Code Plan Mode: The Complete Guide (2026)](https://www.anyonebuilds.com/guides/claude-code-plan-mode) — 详解两次 `Shift+Tab` 进入计划模式、适用与不适用场景
3. [Claude Code Plan Mode: Design Review-First Refactoring Loops — DataCamp](https://www.datacamp.com/tutorial/claude-code-plan-mode) — 只读探索、提问、评审优先的工作流实践
4. [Claude Code Plan Mode (2026): When to Use It and How to Get Real Value](https://www.claudedirectory.org/blog/claude-code-plan-mode-guide) — 计划模式作为可靠性杠杆的价值分析
5. [Claude Code Plan Mode: Complete Tutorial + Keyboard Shortcuts](https://www.masteringai.io/guides/claude-code-plan-mode-guide) — `Shift+Tab`、`/plan` 等快捷键与完整操作教程

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
