本教程面向已经装好 Claude Code、能跑通第一个项目,但每次让 AI 改代码时心里没底的零基础到入门用户。学完之后你将掌握:Claude Code 的三种输入模式(普通 / 自动接受 / 计划模式)如何切换与区分;如何用 Shift+Tab 进入只读规划状态;如何写一句高质量的"规划提示词";如何审阅、迭代并批准 Claude 给出的实施方案;以及在什么场景下该用、什么场景下纯属浪费时间。适用人群:第一次在真实项目(哪怕只有三五个文件)上用 Claude Code 的人、对"AI 直接改我的代码"感到不安全的初学者、希望养成"先想清楚再动手"工程习惯的新手。
⏺、⏵⏵ 需要等宽字体支持)。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 给出方案后,不要急着批准。把它当成一次免费的代码评审,重点检查三件事:
迭代方法:直接用自然语言反馈,不需要重新进入任何模式。例如:
"方案整体可以,但有两点要改:
- 第 2 条,已过期任务的红色样式用现有的 .overdue 类,别新建 CSS;
- due_date 为空的任务排在最后,别让它们干扰排序。
请更新方案。"
Claude 会重新读取文件、给出修订版方案。这个"来回打磨方案"的过程,比直接让它改代码省下的返工时间多得多。
常见问题 3:方案来回改了好几轮,上下文是不是变长了?
是的。计划模式下虽然不写文件,但读取和对话都会占用上下文窗口。如果轮次超过四五次,可以考虑用 /clear 清空后带着最终共识重新开始,或在方案基本定稿后直接进入执行。
当方案让你满意,Claude 会通过一个"退出计划模式"的动作请求你的批准(屏幕上会出现类似"是否批准该方案并开始实施?"的确认)。批准后,它会自动退出计划模式,回到普通(或自动接受)模式,开始按方案逐个文件实施。
此时建议:
git diff 审查实际变更,对照方案核对。git commit;不满意,git checkout . 或 git stash 一键回到存档点。该用计划模式: - 改动涉及 3 个及以上文件。 - 涉及数据库 schema、迁移、接口契约变更。 - 安全敏感代码(认证、授权、加密、配置加载)。 - 接手不熟悉的代码库,需要先摸清结构再动手。 - 你对实现路径本身不确定,想先看 AI 的判断。
纯属浪费时间的场景(直接跳过计划模式): - 单文件的拼写、改名、小修小补。 - 你已经明确知道要怎么改、只是让 AI 代手的机械操作。 - 临时性的探索性提问("这个函数是干嘛的")。
一个简单的决策原则:当你回答"AI 该怎么改"这个问题需要超过 10 秒思考时,就用计划模式;如果答案脱口而出,就别用。
下面用一个完整可运行的最小项目演示整个流程。先准备项目骨架(你也可以让 Claude 在计划模式里帮你生成这段):
mkdir todo-demo && cd todo-demo
git init && mkdir -p templates
models.py(用纯 SQLite,零依赖):
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:
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:
<!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 重来即可——全程零风险。
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.md,以后每次规划都自动带上,省得重复写。https://docs.anthropic.com/en/docs/claude-code/interactive-modehttps://www.anyonebuilds.com/guides/claude-code-plan-modehttps://www.datacamp.com/tutorial/claude-code-plan-modeShift+Tab 切换、计划模式)的权威说明Shift+Tab 进入计划模式、适用与不适用场景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 等场景全覆盖。
