AI 编辑功能
wescode 提供了多种 AI 辅助编辑模式,从轻量的自动补全到完整的多文件重构,覆盖日常编码的各种场景。
四种交互模式
| 模式 | 触发方式 | 适用场景 | 工具集 |
|---|---|---|---|
| Ghost Write | 光标停留 >800ms | 代码补全、续写 | 无(FIM 补全) |
| Selection Action | 选中文字后右键 | 单次操作(解释、优化) | 无 |
| Inline Command | Ctrl+K | 就地修改选中代码 | Block 操作 |
| Sidebar Chat | Ctrl+L | 完整对话式编码 | 全部工具 |
Ghost Write 自动补全
工作原理
Ghost Write 是 wescode 的实时代码补全功能。当你在编辑器中输入代码并短暂停顿(>800ms)时,AI 会预测你接下来要写的代码,并以灰色幽灵文本显示。
使用方式
- 正常编写代码
- 光标停留片刻,等待灰色建议出现
- 按
Tab接受整行补全 - 按
Esc忽略建议 - 继续输入会自动更新建议
补全能力
Ghost Write 不仅仅是简单的文本续写,它结合了:
- 编辑器 Buffer:理解你当前正在编辑的内容(即使未保存)
- CKG 上下文:了解项目的代码结构和风格
- 光标位置:理解你在哪个函数、哪个代码块中
性能说明
- Ghost Write 使用轻量级补全模型(如 Claude Haiku),响应通常在 200-500ms
- 大文件(>1MB)中 Ghost Write 可能会延迟
- 可以在设置中调整触发延迟或完全禁用
Inline Command(Ctrl+K)
基本用法
- 在编辑器中选中你想要修改的代码(也可以不选中,AI 会自动判断范围)
- 按
Ctrl+K(macOS:Cmd+K) - 在弹出的输入框中输入你的指令
- AI 会就地修改代码
常用指令示例
| 指令 | 效果 |
|---|---|
添加错误处理 | 为函数添加 error return 和检查 |
添加注释 | 为代码添加中文注释 |
重构为更简洁的写法 | 简化代码逻辑 |
添加参数验证 | 在函数入口添加参数校验 |
转换为 async/await | 将回调风格改为 async 风格 |
提取为独立函数 | 将选中代码提取为新函数 |
添加单元测试 | 为函数生成测试代码 |
Inline Command 的特点
- 最大轮次为 1:Inline Command 是单轮操作,不会进入多轮对话
- 就地修改:修改直接应用在编辑器中,不会创建新文件
- Block 操作工具:可以使用 6 个 Block 操作工具进行结构化编辑
编辑预览与 Diff
Diff 视图
当 AI 修改代码时,wescode 会在编辑器中显示 Inline Diff 视图:
func processOrder(order *Order) error {
+ if order == nil {
+ return fmt.Errorf("order cannot be nil")
+ }
+ if order.Amount <= 0 {
+ return fmt.Errorf("invalid order amount: %d", order.Amount)
+ }
// 处理订单逻辑...
return nil
}
- 🟢 绿色背景:新增的代码行
- 🔴 红色背景:被删除的代码行
- ⚪ 无背景:未修改的代码行
预览行为
AI 编辑完成后,编辑器会自动:
- 显示 Diff decoration(颜色标记)
- 同步磁盘内容到编辑器 Buffer(
textFileService.revert) - 确保编辑器 Buffer 与磁盘一致(无 dirty 状态)
重要:AI 编辑后你不会看到「未保存」的小圆点标记,因为 wescode 会自动将磁盘内容同步到编辑器。关闭文件时不会弹出「是否保存」对话框。
Accept / Reject 工作流
接受修改
| 操作 | 效果 |
|---|---|
| 点击「Accept」按钮 | 接受当前文件的所有 AI 修改 |
按 Ctrl+Enter | 同上 |
| 点击「Accept All」 | 接受所有文件的所有修改(多文件场景) |
接受后:
- Diff decoration 被清除
- 文件保持在修改后的状态
- 可以通过
Ctrl+Z撤销
拒绝修改
| 操作 | 效果 |
|---|---|
| 点击「Reject」按钮 | 回滚当前文件的 AI 修改 |
按 Escape | 同上 |
| 点击「Reject All」 | 回滚所有文件的修改 |
拒绝后:
- 文件恢复到 AI 修改前的状态
- Diff decoration 被清除
- 磁盘内容被恢复
部分接受
如果 AI 修改了多处,你可以逐块接受或拒绝:
- 在 Diff 视图中浏览每个修改块
- 使用块旁边的「✓」接受或「✗」拒绝单个块
- 处理完所有块后,最终确认
批量编辑
多文件编辑
在 Chat 面板中,AI 可以同时修改多个文件:
帮我在所有 handler 中添加请求日志中间件
AI 会:
- 搜索所有相关文件
- 逐个文件进行修改
- 在 Chat 面板中显示每个文件的修改摘要
- 你可以逐个文件 Accept/Reject
apply_patch 工具
对于大范围的代码修改,AI 会使用 apply_patch 工具,它可以精确地应用多个文件的补丁:
- 支持跨文件的结构化修改
- 自动处理文件创建和删除
- 修改前自动验证上下文匹配
编辑引擎的三级匹配
wescode 的编辑引擎使用三级匹配策略确保编辑准确应用:
- 精确匹配 — 完全匹配目标代码片段
- 模糊匹配 — 允许空白和缩进差异
- Fallback 匹配 — 使用
EditMatchFallbackhook 进行启发式匹配
如果匹配失败,AI 会收到明确的错误信息并尝试修正。
格式化与一致性
自动格式化
wescode 不会在 AI 编辑后自动运行格式化工具。格式化是写操作的一部分,由 Go 后端在编辑前处理(pre-write),而不是 UI 后处理。
代码风格
AI 在生成和编辑代码时会:
- 自动匹配项目已有的代码风格(通过 CKG 的 Convention 检测)
- 遵循
.editorconfig的配置 - 使用与周围代码一致的缩进和命名风格
常见场景
场景一:快速修 Bug
1. 在编辑器中打开有 Bug 的文件
2. 选中相关代码
3. Ctrl+K → "修复这里的 nil pointer 错误"
4. 查看 Diff → Accept
场景二:添加新功能
1. Ctrl+L 打开 Chat
2. 描述新功能需求
3. AI 创建/修改多个文件
4. 逐个文件查看 Diff
5. Accept All 或逐个处理
场景三:重构代码
1. 选中要重构的函数
2. Ctrl+K → "将这个函数拆分为更小的辅助函数"
3. 查看 Diff,确认逻辑正确
4. Accept
注意事项
- AI 编辑是不可见的:AI 的编辑在完成时自动保存,不会产生 dirty 状态
- Buffer Overlay:AI 读取的是编辑器内存中的最新内容,即使未保存到磁盘
- 撤销支持:
Ctrl+Z可以撤销 AI 的修改 - 同一时间一个 Run:同一工作区同时只能运行一个 AI 编辑任务