file edit

FileEditTool 是 Claude Code 中最核心的工具之一,实现了基于 search-and-replace 的文件编辑机制。

设计理念

为什么不用 diff/patch?

传统的 diff/patch 方式存在问题:

  • AI 难以生成正确的 diff 格式

  • 行号容易过时

  • 对空白字符敏感

search-and-replace 更适合 AI:

  • 语义化的编辑描述

  • 不依赖行号

  • 更容易理解和调试

核心实现

输入 Schema

const FileEditInputSchema = z.object({
  path: z.string(),
  oldStr: z.string(),
  newStr: z.string(),
}).refine(
  data => data.oldStr !== data.newStr,
  { message: 'oldStr and newStr must be different' }
);

执行流程

关键特性

1. 引号归一化

处理不同类型的引号:

2. Staleness Check

检测文件是否在编辑期间被修改:

3. 唯一性验证

确保 oldStr 在文件中唯一:

4. LSP 通知

编辑后通知语言服务器:

使用示例

简单替换

多行替换

错误处理

常见错误

1

String not found

  • 原因:oldStr 不存在于文件中

  • 解决:检查拼写、空白字符、引号类型

2

Multiple matches

  • 原因:oldStr 在文件中出现多次

  • 解决:增加上下文,使 oldStr 唯一

3

File modified

  • 原因:文件在读取后被修改

  • 解决:重新读取文件

4

Permission denied

  • 原因:没有写入权限

  • 解决:检查文件权限或用户确认

错误恢复

性能优化

1

增量编辑

对于大文件,只读取和写入必要的部分:

2

批量编辑

多个编辑操作可以批量执行:

最佳实践

1

提供足够的上下文

2

保持空白字符一致

3

处理特殊字符

下一步