内联编辑与 Diff
概述
当 AI 编辑文件时,wescode 不会直接覆盖磁盘内容,而是在编辑器内展示 inline diff decoration,让你清楚地看到每一处修改。你可以逐一审查并决定接受或拒绝。
工作流程
1. AI 发起编辑
AI 通过 edit 或 write 工具提交文件修改。修改内容先写入磁盘,然后立即触发编辑器同步。
2. 展示 Diff
编辑器在文件中显示 inline diff:
- 绿色高亮:新增的行
- 红色高亮:删除的行
- 修改标记:变更的行会同时显示旧内容和新内容
3. 用户决策
你可以对每处修改进行操作:
- Accept:接受 AI 的修改,保留新内容
- Reject:拒绝修改,回滚到原始内容
4. 状态同步
操作完成后,编辑器 buffer 与磁盘内容保持一致,不会留下 dirty 状态。
核心保证:buffer === disk
wescode 遵循一条关键不变量:AI 编辑完成后,编辑器 buffer 与磁盘内容完全一致,dirty flag 为 false。
这意味着:
- 关闭文件永远不会弹出"是否保存"对话框
- 你不需要在 AI 编辑后手动保存文件
- Accept 是纯 UI 操作(清除 diff decoration)
- Reject 会回滚磁盘内容并重新同步 buffer
Edit Engine 三级匹配
wescode 的编辑引擎采用三级匹配机制来准确定位修改位置:
- 精确匹配:AI 提供的上下文与文件内容完全一致
- 模糊匹配:处理空白差异、缩进变化等小幅偏差
- 启发式匹配:当文件在 AI 读取后发生了变化,尝试智能定位
如果三级匹配都无法定位,编辑操作会安全失败并通知 AI 重试。
格式化处理
代码格式化是写操作的一部分,由 Go 后端在写入前完成(pre-write),而不是写入后在编辑器中异步格式化。这样做的好处:
- 避免格式化产生额外的 dirty 状态
- AI 看到的内容和最终写入的内容一致
- 不会因为格式化触发意外的 diff
常见场景
AI 修改多个文件
AI 可能在一次对话中修改多个文件。每个文件的 diff 独立显示,你可以分别审查和操作。
与版本控制的关系
AI 的编辑直接写入工作目录,与 Git 的工作方式一致:
git diff能看到 AI 的所有修改- 你可以用
git checkout -- <file>回滚特定文件 - AI 编辑不会自动 commit
大文件编辑
对于大文件,AI 通常使用 edit(局部修改)而非 write(全量写入),以减少 diff 范围和提高准确性。
注意事项
- Inline diff 是临时的 UI decoration,关闭编辑器后不会保留
- 如果你在 AI 编辑的同时手动修改了同一文件,可能需要 AI 重新读取
- Buffer Overlay 机制确保 AI 始终基于编辑器最新内容工作