前面十篇文章讲了从安装配置到 Skills 和 MCP 的各种技巧。本文是两个"自动挡"功能:Memory (让 Claude 记住你的偏好,不用说第二次)和 Hook(特定事件触发自动执行脚本,不用手动跑)。配完之后很多重复操作就自动化了。
Memory:三层记忆
Claude Code 有三层记忆结构,每层的作用不一样:
第一层:CLAUDE.md(项目规范)
放在项目根目录,每次对话启动时自动读取。记录技术栈、编码规范、常用命令。
这个文件是所有配置里投入产出比最高的。花一小时写一份好的 CLAUDE.md,之后每次对话 Claude 生成的代码自动遵守规范------不用再反复纠正"别用 @Autowired""用 LocalDateTime 别用 Date"。
第二层:Memory 文件(个人偏好)
存放在 ~/.claude/projects/<项目名>/memory/ 下,跨对话持久化。
使用方式特别简单------直接在对话里说人话:
markdown
> 记住:我不喜欢在代码里写注释,除非逻辑特别复杂。
> 记住:这个项目正在做用户中心改造,下月上线,不要做大范围重构。
Claude Code 会自动把偏好保存到 memory 文件,之后的对话都会自动遵守。
Memory 有四种类型:
- user:关于你。比如你是 Java 后端开发、偏好简洁回复。
- project:项目背景。比如"正在做用户中心改造,下月上线"。
- feedback:你对 Claude 的反馈。比如"不要写注释""不用 @Autowired"。
- reference:外部资源。比如"接口文档在 Confluence 某个页面"。
用 /memory 命令可以查看和管理所有记忆。
第三层:对话上下文(会话级)
当前对话的所有历史,退出就没了。超过 50 轮后回复质量会下降,该 /clear 就清。
我对 Memory 的真实评价
说实话,Memory 不像 CLAUDE.md 那样"必须配置"------它是锦上添花。
刚用 Claude Code 的时候你不需要配 Memory。用了一个月之后,如果你发现自己经常在对话里纠正同一个偏好(比如"别写注释""回复简洁点"),那就可以把这个偏好记到 Memory 里------以后就不用每次都纠正了。
我自己目前大概有 5-6 条 Memory,都是用了几个月积累下来的小偏好。不多,但每一条都确实省了不少重复的口头纠正。
Hook:事件驱动的自动化
Hook 比 Memory 更进一步------它不是在对话里生效,而是在特定事件发生时自动执行脚本。
六个可以挂 Hook 的事件
| 事件 | 什么时候触发 | 能干什么 |
|---|---|---|
| PreToolUse | 工具调用之前 | 拦截危险命令、commit 前强制跑测试 |
| PostToolUse | 工具调用之后 | 改完 Java 文件自动格式化 |
| Stop | Claude 回复完成时 | 自动跑测试、发通知 |
| SessionStart | 会话开始时 | 加载环境变量 |
| SessionEnd | 会话结束时 | 清理临时文件 |
| PreCompact | 上下文压缩前 | 保存完整对话记录 |
最实用的是前两个------PreToolUse 和 PostToolUse。
实用 Hook 一:改完代码自动格式化
每次 Claude 改完 Java 文件,自动用 maven spotless 格式化:
json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit(*.java)",
"hooks": [{
"type": "command",
"command": "mvn spotless:apply -q 2>/dev/null || true"
}]
}
]
}
}
原来是:Claude 改代码 → 你可能忘记格式化 → 提交时 Checkstyle 报错 → 回头再改。现在是:Claude 改代码 → 自动格式化 → 完事。
|| true 这个后缀是有意加的------如果项目没有配 spotless,这个 Hook 静默跳过,不影响正常使用。
实用 Hook 二:commit 前强制跑测试
在执行 git commit 之前先跑测试,失败了不让提交:
json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash(git commit *)",
"hooks": [{
"type": "command",
"command": "mvn test -q && echo 'Tests passed' || (echo 'Tests failed!'; exit 1)"
}]
}
]
}
}
这个 Hook 相当于给你的 Git 加了一道自动检查------测试不通过就不让 commit。以前可能会忘了跑测试直接提交,现在有它做守门员。
Hook 可用的环境变量
Hook 脚本里能用这些变量来获取上下文:
CLAUDE_TOOL_NAME:触发了哪个工具CLAUDE_TOOL_INPUT_FILE_PATH:操作了哪个文件CLAUDE_SESSION_ID:当前会话 ID
Hook 和 Permissions 怎么区分
第 7 篇讲了权限系统,也能拦截危险操作。这里容易搞混------两个都能管操作,区别在哪?
- Permissions (权限):做 Yes/No 判断------"允不允许"。比如说
Bash(rm -rf *): Deny,就是一刀切地拒绝。 - Hook:做自动化------"操作前后自动执行"。比如说"commit 前跑测试"、"改完代码自动格式化"。
简单记:只是不让做某件事 → Permissions。要在操作前后自动做事 → Hook。Permissions 先于 Hook 执行,被 Deny 的操作压根不会走到 Hook。
配置放哪
- 项目级 :
.claude/settings.json(可随 Git 提交,团队共享) - 用户级 :
~/.claude/settings.json(所有项目生效) - 项目级优先级高于用户级
我建议:跟编码规范相关的 Hook(比如自动格式化、commit 前跑测试)放在项目级,随代码提交,团队成员都能受益。跟个人偏好相关的(比如 Memory)放在用户级。
总结
- CLAUDE.md = 项目规范,最重要,每个项目第一时间写好
- Memory = 个人偏好,用久了慢慢积累,不用一开始就配
- Hook = 事件自动化,配一次长期生效
- 最实用的两个 Hook:改完代码自动格式化 + commit 前自动跑测试
- 跟团队规范相关的 Hook 放项目级
.claude/settings.json,随 Git 提交共享
这两个功能都是"配置十分钟,受益好几个月"的类型。不复杂,但确实能让日常开发少做很多重复操作。
下一篇讲 /plan 计划模式、验证循环和常见故障排除,也是这个系列的收尾篇。有用的话欢迎点赞收藏。