内联编辑
内联编辑就地重写代码。你描述修改,twinny 把结果以 diff 形式流式写入编辑器,在你接受之前不会保留任何内容。它使用当前的对话提供者。
编辑选区
- 选中要修改的代码。没有选区时,twinny 编辑光标所在的行。
- 按
Ctrl+I(macOS 为Cmd+I),或右键选择 Twinny - Edit with instruction…。 - 描述修改并按
Enter。
建议的修改以删除行(红)和新增行(绿)的形式出现在原选区处。流式输出期间,区域上方的 Stop CodeLens 可以取消并恢复原文。
模型完成后,修改上方出现 Accept 和 Reject 两个 CodeLens 按钮,也可用快捷键:
| 操作 | Windows / Linux | macOS |
|---|---|---|
| 接受编辑 | Ctrl+Shift+Enter | Cmd+Shift+Enter |
| 拒绝编辑 | Ctrl+Shift+Backspace | Cmd+Shift+Backspace |
| 流式输出时停止 | Ctrl+Shift+/ | Cmd+Shift+/ |
涉及多处的修改会拆成多个块(hunk),每块可从各自的 CodeLens 单独接受或拒绝。在编辑待定时再按 Ctrl+I 可以微调它(“更短”、“保留原名称”、“加注释”),而不必重来。
修改待定时你可以继续编辑文件其他位置:twinny 会跟踪 diff 移动到了哪里。
模型被要求做什么
提示包含选中的代码、其上下有限行数的上下文、语言和你的指令,并严格要求只返回重写后的代码。小模型并不总是遵守,所以回复会被防御性解析:去掉围栏,移除“思考”段落,缩进与原文匹配。如果模型没有返回可用内容,你会看到没有建议的修改。
模型只看到选区及其周围,而不是整个文件,这让编辑快速而聚焦。需要用到其他地方知识的修改,请在指令中说明(“使用 utils 中的 formatDate 辅助函数”),或在对话中附上相关文件后用 apply。
预设编辑
右键菜单中有现成的指令,通过内联编辑作用于选区:
- Refactor 在不改变行为的前提下提升可读性和效率。
- Add types 添加精确的类型标注。
- Generate docs 以该语言的标准格式添加文档注释(JSDoc、docstring 等)。
Explain 不同:它把选区发送到对话并在那里回答。
用灯泡修复
在有错误或警告的行上,代码操作灯泡(Ctrl+.)提供 Fix with Twinny。它以诊断信息作为指令运行内联编辑,无需输入任何内容。只有错误和警告有此操作,提示不算,区域限制在问题周围 60 行内。任何选区在同一菜单中也会有 Edit with Twinny。
编写测试
Twinny - Write tests(右键菜单或命令面板)为选中的代码(无选区时为整个文件)编写测试,写入按该语言测试运行器约定命名的同级测试文件:
| 语言 | 测试文件 |
|---|---|
| JavaScript、TypeScript 及大多数其他语言 | foo.test.ts |
| Python | test_foo.py |
| Go、Rust | foo_test.go、foo_test.rs |
| Ruby | foo_spec.rb |
| Java、Kotlin、Scala、C#、PHP | FooTest.java |
twinny 尽可能从项目声明的依赖中检测测试框架(Jest、Vitest、Mocha、pytest 等)并告知模型;否则模型选择该语言的常用框架。测试文件已存在时追加新测试而不是替换。结果同样以待定编辑的形式出现,供你接受或拒绝。
从对话应用代码
对话中的每个代码块都有 apply 按钮。它把代码块作为内联编辑放入当前编辑器,让你以 diff 形式审阅,而不是直接覆盖代码:
- 有选区时,代码块替换选区;
- 没有选区时,twinny 查找文件中被该代码块重写的部分并在其上显示 diff;
- 没有匹配时,代码块插入到光标处。
按 apply 前先打开要修改的文件。如果文件已包含完全相同的代码,则什么都不会发生,状态栏会说明。
提示
- 简短的祈使句指令对小模型效果最好:“把循环提取成函数”、“处理 null 情况”、“改成 async/await”。
- 选中完整语句。从行中间开始的选区会让模型猜测编辑从哪里开始。
- 对文件中的重复性修改,手动做第一处,然后让代码补全从最近的编辑中学到模式。