使用 Claude Code 时,每次 AI 编辑后手动运行格式化工具(mix format、prettier、rubocop)和 linter 很快就会变得烦人。
Claude Code 内置了 Hooks 机制,可以在工作流的关键节点自动执行指定的 shell 命令——比如在工具刚完成文件编辑之后。
下面介绍如何配置它们,以及我在项目中的用法。
配置作用域
Hooks 在 Claude Code 的 settings JSON 文件中配置,共有三个层级的作用域:
~/.claude/settings.json— 全局用户设置(适用于所有项目).claude/settings.json— 项目设置(提交到 git,与团队成员共享).claude/settings.local.json— 本地项目覆盖(gitignored,仅限个人机器)
基础设置:文件编辑时格式化
要让 Claude Code 每次修改文件后都运行 mix format 这样的格式化工具,可以配置一个 PostToolUse hook,并用匹配器指定 Edit 工具:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "mix format"
}
]
}
]
}
}有了这个 .claude/settings.json,你就不用再担心未格式化的代码混进 diff 里了。
触发点与匹配器
Claude Code 提供了几个触发点:
PreToolUse:在工具执行前运行,适合日志记录或校验。PostToolUse:在工具成功完成后运行,最适合格式化器和 linter。Stop:在 Claude 完成对提示的回复后运行。Notification:在 Claude 发送通知时触发。
matcher 字段控制哪个工具会触发 hook:
"matcher": "Edit":仅在文件编辑时触发。"matcher": "Edit|Write":用正则匹配多个工具(例如部分编辑和整文件写入)。"matcher": "Bash":在命令执行时触发。- 省略匹配器:该触发点的每个事件都会运行。
多命令示例
你可以在单个触发点下串联多个命令。例如,每次文件修改时同时运行格式化器和严格 linter,并记录 shell 命令:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "mix format"
},
{
"type": "command",
"command": "mix credo --strict"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "echo \"[$(date)] Running: $CLAUDE_TOOL_INPUT\" >> .claude/command_log.txt"
}
]
}
]
}
}总结
为项目默认格式化器配置一个简单的 PostToolUse hook 只需两分钟,却能省去 AI 辅助编辑后手动清理的麻烦。如果你在多种语言间切换,把与语言无关的偏好放进用户设置,把项目专属的 linter 放进 .claude/settings.json,就能保持整洁和可预测。

正在加载评论…