跳转到内容

内联编辑

内联编辑就地重写代码。你描述修改,twinny 把结果以 diff 形式流式写入编辑器,在你接受之前不会保留任何内容。它使用当前的对话提供者。

编辑选区

  1. 选中要修改的代码。选区会扩展到整行;没有选区时,twinny 编辑光标所在的行。
  2. 按 Ctrl+I(macOS 为 Cmd+I),或右键选择 Twinny - Edit with instruction…。
  3. 描述修改并按 Enter。

建议的修改以删除行(红)和新增行(绿)的形式出现在原选区处。流式输出期间,区域上方的 Stop CodeLens 可以取消并恢复原文。

模型完成后,修改上方出现 Accept 和 Reject 两个 CodeLens 按钮,也可用快捷键:

操作Windows / LinuxmacOS
接受编辑Ctrl+Shift+EnterCmd+Shift+Enter
拒绝编辑Ctrl+Shift+BackspaceCmd+Shift+Backspace
流式输出时停止Ctrl+Shift+/Ctrl+Shift+/

涉及多处的修改会拆成多个块(hunk),每块可从各自的 CodeLens 单独接受或拒绝。此时顶部的 CodeLens 显示 Accept all 和 Reject all,快捷键作用于所有块。在编辑待定时再按 Ctrl+I 可以微调它(“更短”、“保留原名称”、“加注释”),而不必重来。

修改待定时你可以继续编辑文件其他位置:twinny 会跟踪 diff 移动到了哪里。你自己的编辑若切过待定的行,diff 会被丢弃,文本保持原样;用撤销(Ctrl+Z)还原。修改待定期间旧行和新行都在文档中,此时保存文件会把两者都写入;请先接受或拒绝。

模型被要求做什么

提示包含选中的代码、其上下最多各 40 行的上下文(每侧最多 6,000 字符)、文件名、语言和你的指令,并严格要求只返回重写后的代码。小模型并不总是遵守,所以回复会被防御性解析:去掉围栏,移除“思考”段落,缩进与原文匹配。如果模型没有返回可用内容,你会看到没有建议的修改。

模型只看到选区及其周围,而不是整个文件,这让编辑快速而聚焦。需要用到其他地方知识的修改,请在指令中说明(“使用 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
Pythontest_foo.py
Go、Rustfoo_test.go、foo_test.rs
Rubyfoo_spec.rb
Java、Kotlin、Scala、C#、PHPFooTest.java

对 JavaScript 和 TypeScript,twinny 从最近的 package.json 读取测试框架(Vitest、Jest、Mocha、AVA 或 Jasmine)并告知模型;没有声明时由模型选择。其他语言使用常用框架:pytest、Go 的 testing 包、Rust 的 #[test]、RSpec、JUnit 5、xUnit 或 PHPUnit。测试文件已存在时追加新测试而不是替换;新的测试文件以未保存状态在源文件旁打开,保存之前不会写入磁盘。结果同样以待定编辑的形式出现,供你接受或拒绝。在测试文件本身中运行该命令只会给出提示,不做任何事。

从对话应用代码

对话中的每个代码块都有 apply 按钮。它把代码块作为内联编辑放入当前编辑器,让你以 diff 形式审阅,而不是直接覆盖代码:

  • 有选区时,代码块替换选区;
  • 没有选区时,twinny 查找文件中被该代码块重写的部分并在其上显示 diff;
  • 没有匹配时,代码块插入到光标处。

按 apply 前先打开要修改的文件。如果文件已包含完全相同的代码,则什么都不会发生,状态栏会说明。

提示

  • 简短的祈使句指令对小模型效果最好:“把循环提取成函数”、“处理 null 情况”、“改成 async/await”。
  • 选中完整语句。选区会扩展到整行,因此在语句中间结束的选区只会发送半条语句。
  • 对文件中的重复性修改,手动做第一处,然后让代码补全从最近的编辑中学到模式。