Claude Code高级使用指南:从并行开发到智能钩子的完整实践
摘要:本文基于Claude Code官方文档和团队内部实践,系统介绍了Git worktree并行会话、Plan Mode任务规划、CLAUDE.md项目知识库、Skills自动化、Subagents多线程处理、Hooks事件驱动自动化等10大核心技术,以及终端优化、数据分析、Bug修复等实用技巧,提供完整的技术实现和配置方案。
Claude Code核心工作流程
理解新代码库
Claude Code提供了快速理解陌生代码库的工作流程。当你刚刚加入一个新项目时,可以通过几个关键步骤快速掌握项目结构:
-
获取代码库概览:让Claude分析项目目录结构、主要模块和架构 -
查找相关代码:使用Glob和Grep工具定位特定功能或特性相关的代码文件 -
理解代码关系:通过Read工具阅读关键文件,建立代码间的连接关系
这些工具可以组合使用,形成一个完整的代码探索流程。例如,先使用Glob查找所有配置文件,然后使用Grep搜索特定函数名,最后用Read工具阅读关键实现。
高效修复Bug
当遇到错误消息时,Claude Code能够快速定位并修复问题源:
-
错误分析:直接粘贴错误日志,Claude会分析错误类型和可能原因 -
代码定位:使用Grep搜索错误相关的函数、类或变量 -
自动修复:让Claude生成修复方案,然后使用Edit工具应用更改 -
验证修复:运行测试或检查代码,确认问题已解决
团队的经验是:大多数bug,Claude自己就能修好。一个常见场景是启用Slack MCP,把Slack上的bug反馈帖子直接粘贴给Claude,然后只说一个词:”fix”。不需要解释上下文,不需要手动定位问题。Claude会自己去看代码、理解问题、修复。
更复杂的场景如分布式系统出问题,把docker logs指给Claude,让它帮忙排查。Claude在这方面”能力出乎意料地强”。
代码重构
更新旧代码以使用现代模式和实践时,Claude Code提供系统化的重构流程:
-
代码分析:先分析现有代码的结构和问题 -
重构规划:在Plan Mode中讨论重构方案 -
分步实施:使用Edit和Write工具逐步替换旧代码 -
测试验证:运行测试确保重构没有破坏功能
基本原则:遇到复杂任务,先用Plan Mode和Claude讨论方案。反复迭代,直到你对计划满意,再切换到自动编辑模式让Claude执行。一个好的计划通常意味着Claude可以一次到位,不用来回改。
测试工作流程
为未覆盖的代码添加测试时,Claude Code能够:
-
分析代码覆盖率:识别缺少测试的代码路径 -
生成测试用例:根据现有测试模式生成新测试 -
验证测试:运行测试确保通过 -
发现边缘案例:分析代码路径,建议错误条件、边界值和意外输入的测试
Claude可以生成遵循项目现有模式和约定的测试。当要求测试时,要具体说明你想要验证什么行为。Claude会检查你现有的测试文件以匹配已经在使用的样式、框架和断言模式。为了全面覆盖,要求Claude识别你可能遗漏的边缘案例。
创建Pull Requests
你可以通过直接询问Claude(”create a pr for my changes”)或使用/commit-push-pr技能来创建PR,该技能在一个步骤中提交、推送并打开PR。
> /commit-push-pr
如果你配置了Slack MCP服务器并在CLAUDE.md中指定了频道(例如”post PR URLs to #team-prs”),该技能会自动将PR URL发布到这些频道。为了对过程有更多控制,可以逐步引导Claude或创建你自己的技能。
当你使用gh pr create创建PR时,会话会自动链接到该PR。稍后可以使用claude --from-pr <number>恢复它。
Plan Mode:复杂任务的规划利器
使用场景
Plan Mode指示Claude通过只读操作分析代码库来创建计划,非常适合探索代码库、规划复杂更改或安全地审查代码。在Plan Mode中,Claude使用AskUserQuestion收集需求并明确你的目标,然后再提出计划。
使用Plan Mode的场景包括:
-
多步骤实现:当你的功能需要对多个文件进行编辑时 -
代码探索:当你想要在更改任何内容之前彻底研究代码库时 -
交互式开发:当你想要与Claude迭代方向时
激活方式
在会话期间切换到Plan Mode:可以在会话期间使用Shift+Tab循环切换权限模式。如果你在Normal Mode,Shift+Tab首先切换到Auto-Accept Mode,在终端底部显示⏵⏵ accept edits on。后续的Shift+Tab会切换到Plan Mode,显示⏸ plan mode on。
在Plan Mode中启动新会话:使用--permission-mode plan标志启动新会话:
claude --permission-mode plan
在Plan Mode中运行”无头”查询:也可以使用-p直接在Plan Mode中运行查询(即在”无头模式”中):
claude --permission-mode plan -p "分析身份验证系统并提出改进建议"
实践示例
规划复杂的重构:
claude --permission-mode plan
> 我需要将我们的身份验证系统重构为使用OAuth2。创建详细的迁移计划。
Claude分析当前实现并创建全面的计划。可以使用后续提问进行完善:
> 关于向后兼容性怎么办?
> 我们应该如何处理数据库迁移?
配置为默认模式
// .claude/settings.json
{
"permissions": {
"defaultMode": "plan"
}
}
Hooks:事件驱动的自动化系统
Hook生命周期
Hooks是在Claude Code生命周期特定点执行的用户定义shell命令或LLM提示。当事件触发且匹配器匹配时,Claude Code将有关事件的JSON上下文传递给hook处理程序。
某些事件每个会话触发一次,而其他事件在代理循环内重复触发:
| 事件 | 触发时间 |
|---|---|
SessionStart |
会话开始或恢复时 |
UserPromptSubmit |
提交提示时,Claude处理之前 |
PreToolUse |
工具调用执行之前。可以阻止它 |
PermissionRequest |
出现权限对话框时 |
PostToolUse |
工具调用成功之后 |
PostToolUseFailure |
工具调用失败之后 |
Notification |
Claude Code发送通知时 |
SubagentStart |
生成子代理时 |
SubagentStop |
子代理完成时 |
Stop |
Claude完成响应时 |
PreCompact |
上下文压缩之前 |
SessionEnd |
会话终止时 |
Hook解析流程
考虑这个PreToolUse hook,它阻止破坏性shell命令。该hook在每个Bash工具调用之前运行block-rm.sh:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/block-rm.sh"
}
]
}
]
}
}
脚本从stdin读取JSON输入,提取命令,如果包含rm -rf则返回permissionDecision为"deny":
#!/bin/bash
# .claude/hooks/block-rm.sh
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "破坏性命令被hook阻止"
}
}'
else
exit 0 # 允许命令
fi
当Claude Code决定运行Bash "rm -rf /tmp/build"时,流程如下:
-
Claude Code生成JSON输入 -
PreToolUse hook匹配器匹配”Bash” -
block-rm.sh脚本执行并读取JSON输入 -
脚本检测到 rm -rf并返回deny决定 -
Claude Code读取JSON输出并阻止命令
Hook配置
Hooks在JSON设置文件中定义。配置有三个嵌套级别:
-
选择hook事件,如 PreToolUse或Stop -
添加匹配器组来过滤何时触发,如”仅针对Bash工具” -
定义一个或多个在匹配时运行的hook处理程序
Hook位置
定义hook的位置决定了其作用域:
| 位置 | 作用域 | 可共享 |
|---|---|---|
~/.claude/settings.json |
所有你的项目 | 否,本地到你的机器 |
.claude/settings.json |
单个项目 | 是,可以提交到仓库 |
.claude/settings.local.json |
单个项目 | 否,被gitignore |
| 托管策略设置 | 组织范围 | 是,管理员控制 |
插件hooks/hooks.json |
启用插件时 | 是,与插件捆绑 |
| Skill或agent frontmatter | 组件激活期间 | 是,在组件文件中定义 |
匹配器模式
matcher字段是过滤何时触发hooks的regex字符串。使用"*"、""或完全省略matcher以匹配所有出现。每种事件类型在不同的字段上匹配:
| 事件 | 匹配器过滤内容 | 示例匹配器值 |
|---|---|---|
PreToolUse, PostToolUse, PostToolUseFailure, PermissionRequest |
工具名称 | Bash, `Edit |
SessionStart |
会话如何开始 | startup, resume, clear, compact |
SessionEnd |
会话为何结束 | clear, logout, prompt_input_exit |
Notification |
通知类型 | permission_prompt, idle_prompt |
SubagentStart |
代理类型 | Bash, Explore, Plan |
PreCompact |
触发压缩的内容 | manual, auto |
SubagentStop |
代理类型 | 与SubagentStart相同值 |
UserPromptSubmit, Stop |
无匹配器支持 | 每次出现都触发 |
匹配器是regex,因此Edit|Write匹配任一工具,Notebook.*匹配任何以Notebook开头的工具。匹配器针对从JSON输入发送到hook的stdin中的字段运行。对于工具事件,该字段是tool_name。
Hook处理程序字段
内部hooks数组中的每个对象都是hook处理程序:hook匹配时运行的shell命令、LLM提示或代理。
三种类型:
-
命令hooks ( type: "command"):运行shell命令。脚本通过stdin接收事件的JSON输入,并通过退出代码和stdout传达结果 -
提示hooks ( type: "prompt"):向Claude模型发送提示进行单轮评估。模型返回yes/no决策作为JSON -
代理hooks ( type: "agent"):生成可以使用Read、Grep和Glob等工具验证条件再返回决策的子代理
所有类型的通用字段:
| 字段 | 必需 | 说明 |
|---|---|---|
type |
是 | "command", "prompt"或"agent" |
timeout |
否 | 取消前的秒数。默认值:命令为600,提示为30,代理为60 |
statusMessage |
否 | hook运行时显示的自定义旋转器消息 |
once |
否 | 如果为true,则每个会话仅运行一次然后被移除。仅限Skills |
命令hook的额外字段:
| 字段 | 必需 | 说明 |
|---|---|---|
command |
是 | 要执行的shell命令 |
async |
否 | 如果为true,则在后台运行而不阻塞。见在后台运行hooks |
提示和代理hook的额外字段:
| 字段 | 必需 | 说明 |
|---|---|---|
prompt |
是 | 要发送给模型的提示文本。使用$ARGUMENTS作为hook输入JSON的占位符 |
model |
否 | 用于评估的模型。默认为快速模型 |
所有匹配的hooks并行运行,相同的处理程序会自动去重。处理程序在当前目录中使用Claude Code的环境运行。$CLAUDE_CODE_REMOTE环境变量在远程web环境中设置为"true",在本地CLI中不设置。
Hook输入和输出
Hooks通过stdin接收JSON数据,并通过退出代码、stdout和stderr传达结果。
通用输入字段
所有hook事件通过stdin作为JSON接收这些字段:
| 字段 | 说明 |
|---|---|
session_id |
当前会话标识符 |
transcript_path |
对话JSON的路径 |
cwd |
调用hook时的当前工作目录 |
permission_mode |
当前权限模式:"default"、"plan"、"acceptEdits"、"dontAsk"或"bypassPermissions" |
hook_event_name |
触发的事件名称 |
例如,Bash命令的PreToolUse hook在stdin上接收:
{
"session_id": "abc123",
"transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",
"cwd": "/home/user/my-project",
"permission_mode": "default",
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "npm test"
}
}
退出代码输出
hook命令的退出代码告诉Claude Code是否应该继续、阻止或忽略操作。
退出代码0表示成功。Claude Code解析stdout以获取JSON输出字段。JSON输出仅在退出代码0时处理。对于大多数事件,stdout仅在详细模式(Ctrl+O)中显示。UserPromptSubmit和SessionStart的例外是stdout被添加为Claude可以看到和操作的上下文。
退出代码2表示阻塞错误。Claude Code忽略stdout和其中的任何JSON。相反,stderr文本作为错误消息反馈给Claude。效果取决于事件:PreToolUse阻止工具调用,UserPromptSubmit拒绝提示等。
任何其他退出代码是非阻塞错误。stderr在详细模式(Ctrl+O)中显示,执行继续。
JSON输出
退出代码允许允许或阻止,但JSON输出提供更细粒度的控制。不是通过退出代码2来阻止,而是退出0并将JSON对象打印到stdout。Claude Code从该JSON中读取特定字段以控制行为,包括决策控制。
hook的stdout必须只包含JSON对象。如果shell配置文件在启动时打印文本,可能会干扰JSON解析。
JSON对象支持三种字段:
-
通用字段如 continue适用于所有事件 -
**顶层 decision和reason**被某些事件用于阻止或提供反馈 -
** hookSpecificOutput**是需要更丰富控制的事件的嵌套对象。它需要设置为事件名称的hookEventName字段
| 字段 | 默认值 | 说明 |
|---|---|---|
continue |
true |
如果为false,Claude在hook运行后完全停止处理。优先于任何事件特定的决策字段 |
stopReason |
无 | 当continue为false时向用户显示的消息。不显示给Claude |
suppressOutput |
false |
如果为true,从详细模式输出中隐藏stdout |
systemMessage |
无 | 向用户显示的警告消息 |
关键Hook事件
SessionStart
当Claude Code启动新会话或恢复现有会话时运行。对于加载开发上下文(如现有问题或对代码库的最近更改)或设置环境变量很有用。对于不需要脚本的静态上下文,请使用CLAUDE.md代替。
匹配值对应于会话如何启动:
| 匹配器 | 何时触发 |
|---|---|
startup |
新会话 |
resume |
--resume、--continue或/resume |
clear |
/clear |
compact |
自动或手动压缩 |
除了通用输入字段外,SessionStart hooks接收source、model和可选的agent_type。source字段指示会话如何开始:新会话为"startup",恢复的会话为"resume",/clear之后为"clear",或压缩之后为"compact"。
任何hook脚本打印到stdout的文本都添加为Claude的上下文。除了所有hooks可用的JSON输出字段外,你可以返回这些事件特定字段:
| 字段 | 说明 |
|---|---|
additionalContext |
添加到Claude上下文的字符串。多个hooks的值会连接 |
持久化环境变量:SessionStart hooks可以访问CLAUDE_ENV_FILE环境变量,该变量提供文件路径,可以在其中持久化后续Bash命令的环境变量。要设置单个环境变量,将export语句写入CLAUDE_ENV_FILE。使用append(>>)保留其他hooks设置的变量。
#!/bin/bash
if [ -n "$CLAUDE_ENV_FILE" ]; then
echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"
echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"
echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"
fi
exit 0
PreToolUse
在Claude创建工具参数之后和处理工具调用之前运行。匹配工具名称:Bash、Edit、Write、Read、Glob、Grep、Task、WebFetch、WebSearch以及任何MCP工具名称。使用PreToolUse决策控制来允许、拒绝或请求使用工具的权限。
除了通用输入字段外,PreToolUse hooks接收tool_name、tool_input和tool_use_id。tool_input字段取决于工具:
Bash输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
command |
字符串 | "npm test" |
要执行的shell命令 |
description |
字符串 | "Run test suite" |
命令作用的可选描述 |
timeout |
数字 | 120000 |
可选超时(毫秒) |
run_in_background |
布尔值 | false |
是否在后台运行命令 |
Write输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
file_path |
字符串 | "/path/to/file.txt" |
要写入的文件的绝对路径 |
content |
字符串 | "file content" |
要写入文件的内容 |
Edit输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
file_path |
字符串 | "/path/to/file.txt" |
要编辑的文件的绝对路径 |
old_string |
字符串 | "original text" |
要查找和替换的文本 |
new_string |
字符串 | "replacement text" |
替换文本 |
replace_all |
布尔值 | false |
是否替换所有出现 |
Read输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
file_path |
字符串 | "/path/to/file.txt" |
要读取的文件的绝对路径 |
offset |
数字 | 10 |
可选开始读取的行号 |
limit |
数字 | 50 |
可选要读取的行数 |
Glob输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
pattern |
字符串 | "**/*.ts" |
要匹配文件的glob模式 |
path |
字符串 | "/path/to/dir" |
可选搜索目录。默认为当前工作目录 |
Grep输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
pattern |
字符串 | "TODO.*fix" |
要搜索的regex模式 |
path |
字符串 | "/path/to/dir" |
可选搜索的文件或目录 |
glob |
字符串 | "*.ts" |
可选过滤文件的glob模式 |
output_mode |
字符串 | "content" |
"content"、"files_with_matches"或"count"。默认为"files_with_matches" |
-i |
布尔值 | true |
不区分大小写的搜索 |
multiline |
布尔值 | false |
启用多行匹配 |
WebFetch输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
url |
字符串 | "https://example.com/api" |
从中获取内容的URL |
prompt |
字符串 | "Extract the API endpoints" |
在获取的内容上运行的提示 |
WebSearch输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
query |
字符串 | "react hooks best practices" |
搜索查询 |
allowed_domains |
数组 | ["docs.example.com"] |
可选:仅包含来自这些域的结果 |
blocked_domains |
数组 | ["spam.example.com"] |
可选:排除来自这些域的结果 |
Task输入字段:
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
prompt |
字符串 | "Find all API endpoints" |
代理要执行的任务 |
description |
字符串 | "Find API endpoints" |
任务的简短描述 |
subagent_type |
字符串 | "Explore" |
要使用的专用代理类型 |
model |
字符串 | "sonnet" |
可选模型别名以覆盖默认值 |
PreToolUse决策控制:PreToolUse hooks可以控制工具调用是否继续。与其他使用顶层decision字段的hooks不同,PreToolUse在hookSpecificOutput对象内返回其决策。这提供了更丰富的控制:三种结果(允许、拒绝或询问)以及在执行前修改工具输入的能力。
| 字段 | 说明 |
|---|---|
permissionDecision |
"allow"绕过权限系统,"deny"阻止工具调用,"ask"提示用户确认 |
permissionDecisionReason |
对于"allow"和"ask",向用户显示但不向Claude显示。对于"deny",向Claude显示 |
updatedInput |
在执行前修改工具的输入参数。与"allow"结合以自动批准,或与"ask"结合以向用户显示修改的输入 |
additionalContext |
在工具执行之前添加到Claude的上下文的字符串 |
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "我的原因在这里",
"updatedInput": {
"field_to_modify": "新值"
},
"additionalContext": "当前环境:生产。继续时请谨慎。"
}
}
PermissionRequest
当向用户显示权限对话框时运行。使用PermissionRequest决策控制代表用户允许或拒绝。匹配工具名称,与PreToolUse相同的值。
除了通用输入字段外,PermissionRequest hooks接收tool_name和tool_input字段,如PreToolUse hooks,但没有tool_use_id。可选的permission_suggestions数组包含用户通常在权限对话框中看到的”always allow”选项。
PermissionRequest决策控制:PermissionRequest hooks可以允许或拒绝权限请求。除了所有hooks可用的JSON输出字段外,你的hook脚本可以返回包含这些事件特定字段的decision对象:
| 字段 | 说明 |
|---|---|
behavior |
"allow"授予权限,"deny"拒绝它 |
updatedInput |
仅对于"allow":在执行前修改工具的输入参数 |
updatedPermissions |
仅对于"allow":应用权限规则更新,相当于用户选择”always allow”选项 |
message |
仅对于"deny":告诉Claude为何拒绝权限 |
interrupt |
仅对于"deny":如果为true,停止Claude |
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow",
"updatedInput": {
"command": "npm run lint"
}
}
}
}
PostToolUse
在工具成功完成后立即运行。匹配工具名称,与PreToolUse相同的值。
PostToolUse hooks在工具已经成功执行后触发。输入包括tool_input(发送到工具的参数)和tool_response(它返回的结果)。两者的精确模式取决于工具。
PostToolUse决策控制:PostToolUse hooks可以在工具执行后向Claude提供反馈。除了所有hooks可用的JSON输出字段外,你的hook脚本可以返回这些事件特定字段:
| 字段 | 说明 |
|---|---|
decision |
"block"使用reason提示Claude。省略以允许操作继续 |
reason |
当decision为"block"时向Claude显示的解释 |
additionalContext |
Claude要考虑的额外上下文 |
updatedMCPToolOutput |
仅限MCP工具:将工具的输出替换为提供的值 |
{
"decision": "block",
"reason": "决策的解释",
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "Claude的额外信息"
}
}
PostToolUseFailure
当工具执行失败时运行。此事件为抛出错误或返回失败结果的工具调用触发。使用此来记录失败、发送警报或向Claude提供纠正反馈。匹配工具名称,与PreToolUse相同的值。
除了通用输入字段外,PostToolUseFailure hooks接收与PostToolUse相同的tool_name和tool_input字段,以及作为顶层字段的错误信息:
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PostToolUseFailure",
"tool_name": "Bash",
"tool_input": {
"command": "npm test",
"description": "运行测试套件"
},
"tool_use_id": "toolu_01ABC123...",
"error": "命令以非零状态代码1退出",
"is_interrupt": false
}
PostToolUseFailure决策控制:PostToolUseFailure hooks可以在工具失败后向Claude提供上下文。除了所有hooks可用的JSON输出字段外,你的hook脚本可以返回这些事件特定字段:
| 字段 | 说明 |
|---|---|
additionalContext |
Claude要与错误一起考虑的额外上下文 |
{
"hookSpecificOutput": {
"hookEventName": "PostToolUseFailure",
"additionalContext": "关于Claude失败的额外信息"
}
}
实用技巧和最佳实践
投资你的CLAUDE.md
这可能是性价比最高的技巧。CLAUDE.md是放在项目根目录的文件,Claude Code每次启动都会读取它。你可以在里面写代码规范、设计原则、PR模板、常见错误提醒——任何你希望Claude记住的东西。
关键在于怎么维护这个文件。团队的做法是:每次纠正Claude的错误后,让它自己更新CLAUDE.md。具体提示可以是:”Update your CLAUDE.md so you don’t make that mistake again.”
团队里有个工程师的做法更系统:他为每个项目/任务维护一个notes目录,每次PR后更新。然后在CLAUDE.md里指向这些notes,相当于给Claude建了一个持续更新的知识库。
CLAUDE.md不建议放太多内容,只会适得其反,只放最重要的AI没训练过的内容,更多的内容作为文件链接按需读取。很多人把设计模式、规范、最佳实践之类的都放进去,先不说这些AI都训练过,你最多说个名字就够了,就算是你需要的,也不是每次都要,不如放一个链接或者移到Skills按需加载。
Claude Code官方项目中CLAUDE.md文件也就大约2.5k tokens:
-
常用Bash指令:让AI知道如何像开发者一样操作命令行 -
代码风格规范:确保AI写的代码符合团队编码标准 -
UI与内容设计准则:指导AI如何设计界面和编写文案 -
核心技术实现流程:教AI如何处理状态管理、日志记录、错误处理、功能门控以及调试 -
代码合并请求模板:规范提交代码时的文档格式
创建自定义技能(Skills)
如果某件事你一天要做两次以上,就值得把它变成一个skill或者slash command。Skill是一组可复用的指令,放在项目里,用斜杠命令调用。比如/commit-push-pr可以一键完成提交、推送、创建PR的整个流程。
团队分享了几个在用的skill:
-
/techdebt:在每次session结束时运行,让Claude检查并清理重复代码
还有人搭建了一个slash command,可以把过去7天的Slack消息、Google Drive文档、Asana任务、GitHub活动同步到一个上下文里,相当于一键获取”这周发生了什么”的全景视图。
更高级的用法:有人用skill构建了”数据分析工程师”类型的agent,可以自动写dbt模型、审核代码、在开发环境测试变更。
Skill的好处是可以提交到git,跨项目复用。你在一个项目里积累的自动化,可以带到下一个项目。
提升你的Prompting技巧
让Claude来考你:提示示例:”针对这些改动考我,直到我通过测试才能提PR。”或者:”向我证明这个能work。”让Claude对比main分支和你的feature分支的行为差异。这相当于把Claude从”执行者”变成了”审核者”,让它反过来review你。
推倒重来:当Claude给出的方案不够好,不要在上面打补丁。直接说:”基于你现在知道的所有信息,扔掉这个方案,实现一个更优雅的版本。”通常会用git把代码回滚到修改前,然后新开会话、调整提示词重来。
减少歧义:交代任务时,spec写得越详细越好。你越具体,Claude的输出越准确。这听起来像废话,但很多人还是习惯性地写模糊的需求,然后抱怨AI不懂。用Plan模式相对好一点,你能知道它听懂了没有。
终端和环境配置
团队里很多人用Ghostty终端,理由是它有同步渲染、24位真彩色、完善的unicode支持。这些对于同时开多个Claude会话很重要。
另一个实用技巧:用/statusline自定义状态栏,始终显示当前的context用量和git分支。这样你一眼就能知道每个会话的状态。
还有人用tmux管理多个会话,给每个tab上色、命名,一个tab对应一个task或worktree。
最后一个容易被忽视的建议:用语音输入。你的说话速度是打字速度的三倍。更重要的是,用语音的时候你会不自觉地说得更详细,prompt质量反而更高。macOS上按两下fn键就能启动语音输入。
用Subagents多线程处理
这是一个进阶技巧,用好了很强大。
最简单的用法:在任何请求后面加上”use subagents”。Claude会自动把任务拆分给多个Subagents并行处理,相当于让它”开更多的线程”来解决问题。
另一个用法是用Subagents保持主会话的上下文干净。把一些独立的子任务分派出去,主会话只负责整体协调。这样主会话的context window不会被塞满中间过程。
Subagents可以让任务并行,大大节约时间。比如之前给文章生成插图的时候,就会让它跑4个Subagents,把提示词文件路径传给每个Subagent。
更高级的玩法:用hook把权限请求路由给更强的模型,让它判断哪些操作是安全的可以自动批准,哪些需要人工确认。相当于给Claude加了一个”安全审核员”。
用Claude Code做数据分析
这个用法可能出乎很多人意料。团队把BigQuery的使用封装成了一个skill,所有人都可以在Claude Code里直接用bq命令行查询数据。
这不限于BigQuery。任何有CLI、MCP或API的数据库都可以这样用。PostgreSQL、MySQL、MongoDB,都可以让Claude帮你写查询、跑分析、生成报告。
对于非工程师来说这可能更有价值。团队里的数据科学家们现在也在用Claude Code写查询、做可视化。工具的边界正在模糊。
用Claude Code学习
最后这个技巧是关于怎么用Claude Code来学习新东西。
首先,在/config里开启”Explanatory”或”Learning”输出风格。这样Claude在改代码的时候会解释”为什么”这么改,而不只是改完拉倒。
第二个用法:让Claude生成HTML幻灯片来解释不熟悉的代码。效果出奇的好。你可以直接在浏览器里看一个图文并茂的代码讲解。
第三个用法:让Claude画ASCII图来解释协议、架构、数据流。纯文本的图表意外地有助于理解复杂系统。
终端设置优化
主题和外观
Claude不能控制你的终端主题。这由你的终端应用程序处理。你可以随时通过/config命令将Claude Code的主题与你的终端匹配。对于Claude Code界面本身的额外自定义,你可以配置自定义状态行以在终端底部显示上下文信息,如当前模型、工作目录或git分支。
换行符
你有几个选项可以在Claude Code中输入换行符:
-
快速转义:输入 \后跟Enter创建新行 -
Shift+Enter:在iTerm2、WezTerm、Ghostty和Kitty中开箱即用 -
键盘快捷键:在其他终端中设置键绑定以插入新行
为其他终端设置Shift+Enter:在Claude Code中运行/terminal-setup,自动为VS Code、Alacritty、Zed和Warp配置Shift+Enter。
设置Option+Enter(VS Code、iTerm2或macOS Terminal.app)
对于Mac Terminal.app:
-
打开设置 → 配置文件 → 键盘 -
选中”将Option用作Meta键”
对于iTerm2和VS Code终端:
-
打开设置 → 配置文件 → 键盘 -
在常规下,将左/右Option键设置为”Esc+”
Vim模式
Claude Code支持通过/vim或通过/config配置启用的Vim键绑定子集。支持的子集包括:
-
模式切换: Esc(到NORMAL)、i/I、a/A、o/O(到INSERT) -
导航: h/j/k/l、w/e/b、0/^、gg/G、f/F/t/T与;/,重复 -
编辑: x、dw/de/db/dd/D、cw/ce/cb/cc/C、.(重复) -
复制/粘贴: yy/Y、yw/ye/yb、p/P -
文本对象: iw/aw、iW/aW、i"/a"、i'/a'、i(/a(、i[/a[、i{/a{ -
缩进: >>/<< -
行操作: J(合并行)
扩展思维(思维模式)
扩展思维默认启用,保留部分输出token预算(高达31,999个token),供Claude逐步推理复杂问题。这种推理在详细模式中可见,你可以用Ctrl+O切换开启。扩展思维对于复杂的架构决策、具有挑战性的bug、多步骤实现规划和评估不同方法之间的权衡特别有价值。它提供了更多空间来探索多个解决方案、分析边缘案例和自我纠正错误。
配置思维模式:思维默认启用,但你可以调整或禁用它。
| 范围 | 如何配置 | 详情 |
|---|---|---|
| 切换快捷键 | 按Option+T(macOS)或Alt+T(Windows/Linux) |
为当前会话切换思维开/关。可能需要终端配置以启用Option键快捷键 |
| 全局默认 | 使用/config切换思维模式 |
设置所有项目的默认 |
保存为~/.claude/settings.json中的alwaysThinkingEnabled |
||
| 限制token预算 | 设置MAX_THINKING_TOKENS环境变量 |
将思维预算限制为特定数量的token。例如:export MAX_THINKING_TOKENS=10000 |
要查看Claude的思维过程,按Ctrl+O切换详细模式,查看内部推理显示为灰色斜体文本。
扩展思维token预算如何工作:扩展思维使用控制Claude在响应之前可以进行多少内部推理的token预算。更大的思维token预算提供:
-
更多空间来逐步探索多个解决方案 -
分析边缘案例并彻底评估权衡的余地 -
修改推理和自我纠正错误的能力
思维模式的token预算:
-
当思维启用时,Claude可以从你的输出预算中使用多达31,999个token进行内部推理 -
当思维禁用时(通过切换或 /config),Claude使用0个token进行思维
限制思维预算:使用MAX_THINKING_TOKENS环境变量来限制思维预算。设置时,此值限制Claude可以用于思维的最大token数。
常见问题解答
如何同时处理多个任务?
使用Git worktree可以同时检出3-5个工作目录,每个目录运行一个独立的Claude Code会话。比如目录A在重构模块,目录B在写测试,目录C在改文档,三件事并行推进。Git worktree让你在同一个仓库里同时打开多个分支的工作目录,不用来回切换。
什么时候应该使用Plan Mode?
遇到复杂任务时,先用Plan Mode和Claude讨论方案。反复迭代,直到你对计划满意,再切换到自动编辑模式让Claude执行。一旦事情跑偏,立刻回到Plan Mode重新规划,不要硬推。
CLAUDE.md应该包含什么内容?
只放最重要的AI没训练过的内容,如项目特定的Bash指令、代码风格规范、UI设计准则、核心技术实现流程、PR模板等。更多的内容作为文件链接按需读取。
如何创建有效的Skill?
如果某件事你一天要做两次以上,就值得把它变成一个skill或者slash command。可以自动化重复性任务,如提交、推送、创建PR的整个流程,或者整合多个数据源获取全景视图。
Hooks和Skills有什么区别?
Hooks是事件驱动的自动化,在特定事件触发时执行,如工具调用前后、会话开始/结束时。Skills是可复用的指令集,用斜杠命令手动调用,适合重复性的工作流程。
如何让Claude更准确地修复Bug?
描述Bug时要清楚:如何复现问题、期望的结果、实际的问题(如错误日志、截图等)。有了这些基本信息,AI才能有足够的上下文去定位和验证问题。给Claude足够的上下文和权限,然后信任它,不需要一步步指挥。
如何在多个Claude会话之间切换?
从活动会话中,使用/resume切换到不同的对话。会话按项目目录存储。/resume选择器显示来自同一git存储库的会话,包括工作树。启动Claude Code时,可以恢复先前的会话:claude --continue继续当前目录中最最近的对话,claude --resume打开对话选择器或按名称恢复。
如何管理Hooks?
使用/hooks命令打开交互式hooks管理器,可以在不直接编辑设置文件的情况下查看、添加和删除hooks。菜单中的每个hook都用括号前缀标记,指示其来源:[User]来自~/.claude/settings.json,[Project]来自.claude/settings.json,[Local]来自.claude/settings.local.json,[Plugin]来自插件的hooks/hooks.json,只读。
如何在Claude Code中使用Subagents?
在任何请求后面加上”use subagents”,Claude会自动把任务拆分给多个Subagents并行处理。或者用Subagents保持主会话的上下文干净,把独立的子任务分派出去,主会话只负责整体协调。
如何在Claude Code中做数据分析?
可以将数据库的CLI命令封装成skill,直接在Claude Code里用命令行查询数据。任何有CLI、MCP或API的数据库都可以这样用,如BigQuery、PostgreSQL、MySQL、MongoDB等。

