站点图标 高效码农

Claude Code进阶指南:从并行开发到智能钩子,10大实战技巧让你开发效率飙升

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能够快速定位并修复问题源:

  1. 错误分析:直接粘贴错误日志,Claude会分析错误类型和可能原因
  2. 代码定位:使用Grep搜索错误相关的函数、类或变量
  3. 自动修复:让Claude生成修复方案,然后使用Edit工具应用更改
  4. 验证修复:运行测试或检查代码,确认问题已解决

团队的经验是:大多数bug,Claude自己就能修好。一个常见场景是启用Slack MCP,把Slack上的bug反馈帖子直接粘贴给Claude,然后只说一个词:”fix”。不需要解释上下文,不需要手动定位问题。Claude会自己去看代码、理解问题、修复。

更复杂的场景如分布式系统出问题,把docker logs指给Claude,让它帮忙排查。Claude在这方面”能力出乎意料地强”。

代码重构

更新旧代码以使用现代模式和实践时,Claude Code提供系统化的重构流程:

  1. 代码分析:先分析现有代码的结构和问题
  2. 重构规划:在Plan Mode中讨论重构方案
  3. 分步实施:使用Edit和Write工具逐步替换旧代码
  4. 测试验证:运行测试确保重构没有破坏功能

基本原则:遇到复杂任务,先用Plan Mode和Claude讨论方案。反复迭代,直到你对计划满意,再切换到自动编辑模式让Claude执行。一个好的计划通常意味着Claude可以一次到位,不用来回改。

测试工作流程

为未覆盖的代码添加测试时,Claude Code能够:

  1. 分析代码覆盖率:识别缺少测试的代码路径
  2. 生成测试用例:根据现有测试模式生成新测试
  3. 验证测试:运行测试确保通过
  4. 发现边缘案例:分析代码路径,建议错误条件、边界值和意外输入的测试

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"时,流程如下:

  1. Claude Code生成JSON输入
  2. PreToolUse hook匹配器匹配”Bash”
  3. block-rm.sh脚本执行并读取JSON输入
  4. 脚本检测到rm -rf并返回deny决定
  5. Claude Code读取JSON输出并阻止命令

Hook配置

Hooks在JSON设置文件中定义。配置有三个嵌套级别:

  1. 选择hook事件,如PreToolUseStop
  2. 添加匹配器组来过滤何时触发,如”仅针对Bash工具”
  3. 定义一个或多个在匹配时运行的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)中显示。UserPromptSubmitSessionStart的例外是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适用于所有事件
  • **顶层decisionreason**被某些事件用于阻止或提供反馈
  • **hookSpecificOutput**是需要更丰富控制的事件的嵌套对象。它需要设置为事件名称的hookEventName字段
字段 默认值 说明
continue true 如果为false,Claude在hook运行后完全停止处理。优先于任何事件特定的决策字段
stopReason continuefalse时向用户显示的消息。不显示给Claude
suppressOutput false 如果为true,从详细模式输出中隐藏stdout
systemMessage 向用户显示的警告消息

关键Hook事件

SessionStart

当Claude Code启动新会话或恢复现有会话时运行。对于加载开发上下文(如现有问题或对代码库的最近更改)或设置环境变量很有用。对于不需要脚本的静态上下文,请使用CLAUDE.md代替。

匹配值对应于会话如何启动

匹配器 何时触发
startup 新会话
resume --resume--continue/resume
clear /clear
compact 自动或手动压缩

除了通用输入字段外,SessionStart hooks接收sourcemodel和可选的agent_typesource字段指示会话如何开始:新会话为"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创建工具参数之后和处理工具调用之前运行。匹配工具名称:BashEditWriteReadGlobGrepTaskWebFetchWebSearch以及任何MCP工具名称。使用PreToolUse决策控制来允许、拒绝或请求使用工具的权限。

除了通用输入字段外,PreToolUse hooks接收tool_nametool_inputtool_use_idtool_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_nametool_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_nametool_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

  1. 打开设置 → 配置文件 → 键盘
  2. 选中”将Option用作Meta键”

对于iTerm2和VS Code终端

  1. 打开设置 → 配置文件 → 键盘
  2. 在常规下,将左/右Option键设置为”Esc+”

Vim模式

Claude Code支持通过/vim或通过/config配置启用的Vim键绑定子集。支持的子集包括:

  • 模式切换Esc(到NORMAL)、i/Ia/Ao/O(到INSERT)
  • 导航h/j/k/lw/e/b0/^gg/Gf/F/t/T;/,重复
  • 编辑xdw/de/db/dd/Dcw/ce/cb/cc/C.(重复)
  • 复制/粘贴yy/Yyw/ye/ybp/P
  • 文本对象iw/awiW/aWi"/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等。

退出移动版