06 · Inline Edit:Cmd+K
精准的外科手术刀——选中代码,描述改动,预览 diff,一键接受。单文件修改的最快方式。
01 Cmd+K 是什么
Inline Edit(Cmd+K) 是 Cursor 的第二层 AI 能力,也是你日常开发中使用频率最高的主动式 AI 功能之一。
它的操作流程极短:
- 在编辑器中选中一段代码
- 按
Cmd+K(Windows:Ctrl+K) - 在弹出的输入框中用自然语言描述你要的改动
- AI 在原位生成 diff 对比
- 按
Cmd+Enter接受,或按Esc拒绝
整个过程只有 5 秒——不需要打开侧边栏,不需要切换上下文,不需要多轮对话。你在写代码的”流”里,就能完成一次精确的代码修改。
对比 Cursor 的其他 AI 入口:
| 能力 | 触发方式 | 交互模式 | 完成一次修改的时间 |
|---|---|---|---|
| Tab 补全 | 被动出现 | 按 Tab 接受 | < 1 秒 |
| Cmd+K 内联编辑 | 主动选中 + 快捷键 | 自然语言指令 + 原地 diff | 5-30 秒 |
| Chat(Cmd+L) | 主动快捷键 | 多轮对话 | 1-5 分钟 |
| Agent(Cmd+I) | 主动快捷键 | 任务分配 + 自主执行 | 1-30 分钟 |
Cmd+K 填补了”Tab 补全不够用,开 Chat 又太大动干戈”的中间地带。 这是它在日常开发中不可替代的原因。
02 心智模型:精准的外科手术刀
Cmd+K 不是一个”帮你写代码”的功能,而是一个”帮你改代码”的功能。
这是最重要的认知差异。
- Tab 补全是”写”——AI 在你停下来的时候帮你继续写
- Cmd+K 是”改”——你已经有了一段代码,你想让它变成另一段样子
所以 Cmd+K 的心智模型应该是:
你定位病灶,AI 下刀切除。你判断方案,AI 执行替换。
它不像 Chat 那样可以漫无边际地讨论技术方案。你也很难用 Cmd+K 写完一个完整的函数——虽然技术上可以(把光标停在空行上,不选中任何代码,按 Cmd+K 输入”写一个分页工具函数”),但那样做效率不如直接用 Agent。
Cmd+K 的强项永远是:精确、局部、快。
03 完整操作拆解
第一步:选中代码
你可以选中一段代码,也可以不选中任何内容。两种情况的区别:
| 情况 | 效果 | 最常用场景 |
|---|---|---|
| 选中一段代码 | AI 把选中代码替换为修改后的版本 | 重构、改写、优化 |
| 光标停在空行上,不选中 | AI 在光标位置生成新代码 | 在函数体内写新逻辑 |
| 光标停在某行上,不选中 | AI 以光标所在行为起点生成修改 | 修改当前行上下文 |
经验法则:想改什么就选什么——选得越精确,AI 越不会改歪。
第二步:按 Cmd+K
按下快捷键后,编辑区顶部会弹出一个浅色的输入框,类似 VS Code 的搜索栏。这个输入框没有复杂的界面,只有一个输入区——你输入的自然语言就是指令。
第三步:输入自然语言指令
这是最关键的一步。指令质量直接决定输出质量。
差指令:
- “改一下这个函数”(太模糊,AI 不知道改什么)
- “优化”(优化什么?性能?可读性?)
- “这里有问题”(什么问题?)
好指令:
- “把这个函数改成 async/await 写法,保持原有逻辑不变”
- “给这段代码加上完整的 try-catch 错误处理,错误信息输出到控制台”
- “把这段代码提取成独立的 fetchUserData 函数,返回类型定义为 Promise
” - “把 if-else 链改写成 switch 语句”
你输入的指令越具体、越有边界,AI 的输出越准确。
第四步:预览 diff
AI 生成修改后,原代码区域会变为 diff 对比视图:
- 绿色高亮:新增的代码
- 红色背景:删除的代码
- 修改的部分以逐行对比方式呈现
此时你有三个选择:
| 操作 | 快捷键 | 效果 |
|---|---|---|
| 接受修改 | Cmd+Enter | 修改应用到文件 |
| 拒绝修改 | Esc | 恢复为原始代码 |
| 重新生成 | Cmd+Shift+R | AI 重新生成一次(如果第一版不满意) |
你不一定非要一次性满意。如果 AI 第一版的方向对了但细节有偏差,按
Cmd+Shift+R重新生成——有时候换个”扩散值”或”随机种子”,AI 会给出更好的第二版。
04 实际场景演练
场景 1:将回调改写为 async/await
你在维护一个老项目,看到一段 Promise 链式调用:
function loadUserData(userId: string) {
return fetch(`/api/users/${userId}`)
.then(response => response.json())
.then(data => {
return {
id: data.id,
name: data.name,
email: data.email
};
})
.catch(error => {
console.error('Failed to load user:', error);
throw error;
});
}选中整个函数,按 Cmd+K,输入:
“把这个函数改成 async/await 写法,保持类型定义和 catch 逻辑不变”
AI 会生成:
async function loadUserData(userId: string) {
try {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
return {
id: data.id,
name: data.name,
email: data.email
};
} catch (error) {
console.error('Failed to load user:', error);
throw error;
}
}预览 diff,确认无误,Cmd+Enter 接受——整个过程不到 10 秒。
场景 2:为一个函数加上错误处理
你刚写完一个数据处理函数,但没有做边界检查:
function calculateTotal(items) {
return items
.filter(item => item.active)
.reduce((sum, item) => sum + item.price * item.quantity, 0);
}选中它,按 Cmd+K,输入:
“加上对 items 参数的验证:如果 items 是 null、undefined 或不是数组,返回 0。同时给每个 item 加可选链读取,防止属性不存在时报错。”
AI 会生成:
function calculateTotal(items) {
if (items == null || !Array.isArray(items)) {
return 0;
}
return items
.filter(item => item?.active)
.reduce((sum, item) => sum + (item?.price ?? 0) * (item?.quantity ?? 0), 0);
}场景 3:提取独立函数
一段逻辑重复的代码:
function processOrder(order) {
// ... 很多业务逻辑 ...
const subtotal = order.items.reduce((sum, item) => sum + item.price * item.qty, 0);
const tax = subtotal * 0.08;
const shipping = subtotal > 100 ? 0 : 15;
const total = subtotal + tax + shipping;
// ... 更多逻辑 ...
}选中计算部分的代码,按 Cmd+K,输入:
“把这 5 行计算逻辑提取成独立的 calculateOrderSummary 函数,返回 { subtotal, tax, shipping, total } 对象,并在这里调用它”
AI 会帮你提取出函数,同时保持原位置的调用正确。
场景 4:转换成 TypeScript
选中一段 JavaScript 代码,按 Cmd+K,输入:
“给这个函数加上完整的 TypeScript 类型定义,包括参数类型、返回类型,以及内部变量的 interface”
这是 Cmd+K 最常用的场景之一——渐进式迁移到 TypeScript,不需要动整个文件。
05 Cmd+K 的最佳场景
基于实际使用频率,以下是 Cmd+K 最值得用的场景(按频率排序):
| 排名 | 场景 | 为什么适合 Cmd+K |
|---|---|---|
| 1 | 代码风格转换(callback→async、for→map、if→switch) | 机械转换无需讨论,AI 一次搞定 |
| 2 | 添加错误处理(try-catch、边界检查、数据验证) | 模式固定,描述一遍就能复用 |
| 3 | 提取函数/变量 | 你指出范围,AI 完成提取和替换 |
| 4 | 添加类型注解(JS→TS、补全类型、细化类型) | AI 能推导出类型 |
| 5 | 单文件重构(简化条件、拆分逻辑、重命名) | 量小精确,不值得开 Chat |
| 6 | 修正 Bug(“这个条件反了”、“把 == 改成 ===“) | 说明 bug 位置和正确逻辑,AI 直接修 |
| 7 | 添加日志/调试代码 | 指定要打 log 的位置和内容 |
| 8 | 修改命名(变量名、函数名统一) | 选中全部引用,AI 批量替换 |
| 9 | 补充注释和 JSDoc | AI 理解代码后自动写文档注释 |
| 10 | 生成单元测试(对同一个函数的简单测试) | 选中函数,让 AI 写单测骨架 |
不适合 Cmd+K 的场景
| 场景 | 为什么不适合 | 用什么替代 |
|---|---|---|
| 跨多个文件的改动 | Cmd+K 只操作选中的那一段代码 | Agent(Cmd+I) |
| 全新功能的开发 | Cmd+K 适合”改”不适合”写” | Agent 或 Chat 模式 |
| 需要深入讨论的方案设计 | 没有对话空间,只接受一条指令 | Chat(Cmd+L)Plan 模式 |
| 大量文件的批量修改 | 一次只能改一个地方 | Agent + @git |
| 不确定要不要改的东西 | Cmd+K 默认就已”决定要改了” | 先用 Chat Ask 讨论 |
06 进阶技巧
技巧 1:用注释提供上下文
Cmd+K 的输入框是你唯一的沟通通道——但它不是唯一的上下文。你在代码中写的注释会被 AI 当作指令的一部分。
// TODO: 这个函数需要处理分页参数
// 接口返回格式: { data: [], total: number, page: number }
// 翻页逻辑: 当 scrollTop + clientHeight >= scrollHeight - 100 时加载下一页
function fetchList(params) {
// 在这里调用 API
}选中这个函数,按 Cmd+K,输入 “按注释实现完整的分页加载逻辑”——AI 会仔细读完所有注释,然后生成符合你预期的代码。
这个技巧的本质:注释是你的”持久化提示词”。把复杂的业务规则用注释写在代码里,不只在当前 Cmd+K 有用,下次别人来维护也能看懂。
技巧 2:链式编辑
一个 Cmd+K 只做一件事。不要指望”把这个函数重写并提取两个子函数并加上类型定义并写上单元测试”——AI 会在一次生成中迷失。
正确做法:把大修改拆成多个 Cmd+K,链式进行:
第 1 次 Cmd+K: "提取 validateInput 函数"
→ 接受
第 2 次 Cmd+K: "提取 formatResponse 函数"
→ 接受
第 3 次 Cmd+K: "给两个新函数加上完整类型定义"
→ 接受
第 4 次 Cmd+K: "在文件末尾为这两个函数各写一个简单的单元测试"每次只做一件事,每次预览确认。这比一次做五件事然后返工快十倍。
技巧 3:选择正确的范围
选多少代码非常关键。
- 选多了:AI 看不懂上下文,或者改写不相关的行
- 选少了:AI 没有上下文,可能写出不合逻辑的代码
经验法则:选中你想修改的范围 + 上面 1-2 行作为上下文。
如果你只是改一个函数的内部实现,选整个函数体(含函数签名更好)。如果你改了函数签名,确保也选中调用处的代码(让 AI 同步更新调用)。
技巧 4:用 “保持…不变” 来约束
AI 经常会在你只想改 A 的时候顺手改了 B。用”保持”关键词来做约束:
- “给这个函数加上 try-catch,保持原有的 return 逻辑不变”
- “把接口地址从 /v1 改成 /v2,保持参数结构和返回类型不变”
- “把 console.log 替换成 logger.info,保持日志消息内容不变”
“保持……不变” 是最有效的 AI 约束短语之一。
技巧 5:不选中任何内容,在光标处生成新代码
把光标放在文件末尾的空行上,按 Cmd+K,输入:
“写一个工具函数 debounce,支持 leading 和 trailing 选项,带 TypeScript 类型定义”
或者把光标放在函数体内,按 Cmd+K,输入:
“在这里加一段数据验证逻辑:检查 email 格式是否合法,不合法的返回 400 错误”
这种方式适合在已有代码中插入新逻辑——比 Tab 补全更精确,比开 Chat 更快。
07 Cmd+K vs Chat vs Agent
这是新手最容易困惑的问题:三个都能改代码,有什么区别?到底什么时候用哪个?
用一个现实场景来理解差异。
| 维度 | Cmd+K | Chat | Agent |
|---|---|---|---|
| 启动方式 | 选中代码 → Cmd+K | Cmd+L 打开对话 | Cmd+I 打开面板 |
| 交互方式 | 一条指令,一次执行 | 多轮对话讨论 | 分配任务,自主完成 |
| 上下文范围 | 你选中的代码 | 当前文件 + @ 引用 | 整个项目 + 终端 |
| 跨文件能力 | 无(仅当前选区) | 有限(@filename 引用) | 完整(创建/修改多个文件) |
| 文件操作 | 只改选中代码 | 用 Agent 子模式可改 | 创建、修改、删除文件 |
| 终端命令 | 不能 | Chat Agent 模式可以 | 完整终端访问 |
| diff 展示 | 原地 inline diff | 显示在对话中 | 专门的 Agent Review Tab |
| 执行速度 | < 5 秒 | 10 秒 - 1 分钟 | 30 秒 - 30 分钟 |
| 回滚粒度 | 一次修改 | 一步对话/一次修改 | 接受/拒绝整个任务的结果 |
决策流程图
你想做什么?
│
├─ 只改当前文件的某一段代码
│ └─ 我已经知道怎么改 → Cmd+K(最快)
│ └─ 我不确定怎么改好 → Chat 讨论方案,再 Cmd+K 执行
│
├─ 跨多个文件的改动
│ └─ 改动范围明确 → Agent
│ └─ 需要先调研 → Chat Plan 模式 → Agent
│
├─ 纯代码问答 / 理解项目
│ └─ Chat Ask
│
├─ 大量文件的批量修改
│ └─ Agent + @git
│
└─ 日常编码中写新代码
└─ 模式化代码 → Tab 补全
└─ 精确生成 → Cmd+K(不选中,光标处生成)简单记忆法
- Tab 补全:AI 主动猜你要写什么,你只管继续打字
- Cmd+K 内联编辑:你知道要改什么,AI 帮你精确执行
- Chat:你不知道或者不确定,和 AI 讨论
- Agent:任务太大一个人搞不定,让 AI 当实习生去做
如果只能记一条规则:改动范围 = 选中范围 用 Cmd+K;改动范围超过一个文件 用 Agent。
08 常见问题
Q:Cmd+K 生成的代码质量不够好怎么办?
首先检查你的指令是否足够具体。如果指令没问题但 AI 还是生成偏了,可以:
- 按
Cmd+Shift+R重新生成(很多时候换一次生成结果就好很多) - 减少选中范围——选太多代码会让 AI 算力分散
- 增加约束条件——用”保持……不变""只改……其他别动”这类约束
- 如果连续 3 次都不满意,说明可能不适合 Cmd+K——改用 Chat 讨论方案
Q:Cmd+K 能用哪些模型?
默认使用你在 Cursor 设置中选择的模型。你可以在 Cmd+K 输入框的右下角看到当前使用的模型名称,也可以点击切换:
- Sonnet 级别:默认模型,速度和质量的平衡点,适合绝大多数场景
- GPT / Claude Opus:更高质量但更慢,适合复杂重构时使用
- 快速模型:超低延迟,适合简单机械替换
日常开发 90% 的场景用 Sonnet 级别模型就足够了。只有在特别复杂的逻辑重构时才需要切换到 Opus 级别。
Q:Cmd+K 和 Chat 的 Agent 子模式有什么区别?
Chat 的 Agent 子模式也能改代码,但它是在对话上下文中执行的——你可以追加深层指令、反问”为什么这样改”、要求调整方案。而 Cmd+K 是一次性的:输入指令 → 看结果 → 接受或拒绝。
选择指南:
- 你对方案完全确定 → Cmd+K
- 你还需要讨论方案 → Chat Agent
Q:Cmd+K 支持多光标编辑吗?
支持。如果你选中了多个不连续的代码区域(用 Cmd 点击多选),然后按 Cmd+K,AI 会知道你选的是多个片段,并根据你的指令同时对它们进行修改。这在批量重命名或统一修改模式时非常有用。
Q:Cmd+K 会修改文件的其余部分吗?
不会。 Cmd+K 只操作你选中的那段代码。文件的其余部分完全不受影响。这是它和 Agent 的最大区别之一——Agent 可能因为理解偏差而修改了你不想改的地方,Cmd+K 不会。
但这同时也是它的限制:如果你的改动需要同步修改文件的其他部分(比如改了函数签名,调用处也需要更新),Cmd+K 一次只能改一个位置。
09 小结
| 关键问题 | 答案 |
|---|---|
| Cmd+K 是什么 | 选中代码 → 按 Cmd+K → 描述改动 → AI 生成 diff → 接受或拒绝 |
| 心智模型 | 精准的外科手术刀——你定位病灶,AI 下刀 |
| 最佳场景 | 单文件重构、加错误处理、代码风格转换、提取函数、加类型 |
| 不适合的场景 | 跨文件改动、全新功能开发、需要讨论的方案 |
| 和 Chat 的区别 | Cmd+K 是一次性执行,Chat 是多轮对话 |
| 和 Agent 的区别 | Cmd+K 只改选中代码,Agent 能改整个项目 |
| 提升质量的关键 | 指令具体 + 范围精确 + 用”保持”做约束 |
| 高频操作链 | 注释引导 → Cmd+K 提取函数 → 加类型 → 加测试 |
Cmd+K 是一个看起来简单但实际上需要练习才能用好的功能。很多新手对它最大的误解是”它和 Chat 差不多”——实际上,它们是两个完全不同的交互模式:一个是指令执行,一个是对话协作。理解这个区别,你就能在正确的时间用正确的工具。
一句话记住
Tab 补全负责”写”,Cmd+K 负责”改”,Chat 负责”聊”,Agent 负责”做”。它们各有各的赛道,没有谁比谁更高级。
下一篇:07 Chat:Cmd+L —— 随身技术导师,代码问答和方案讨论的最稳妥选择。