Skip to Content
二. 核心功能篇06 · Inline Edit(Cmd+K)

06 · Inline Edit:Cmd+K

精准的外科手术刀——选中代码,描述改动,预览 diff,一键接受。单文件修改的最快方式。


01 Cmd+K 是什么

Inline Edit(Cmd+K) 是 Cursor 的第二层 AI 能力,也是你日常开发中使用频率最高的主动式 AI 功能之一。

它的操作流程极短:

  1. 在编辑器中选中一段代码
  2. Cmd+K(Windows: Ctrl+K
  3. 在弹出的输入框中用自然语言描述你要的改动
  4. AI 在原位生成 diff 对比
  5. Cmd+Enter 接受,或按 Esc 拒绝

整个过程只有 5 秒——不需要打开侧边栏,不需要切换上下文,不需要多轮对话。你在写代码的”流”里,就能完成一次精确的代码修改。

对比 Cursor 的其他 AI 入口:

能力触发方式交互模式完成一次修改的时间
Tab 补全被动出现按 Tab 接受< 1 秒
Cmd+K 内联编辑主动选中 + 快捷键自然语言指令 + 原地 diff5-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+RAI 重新生成一次(如果第一版不满意)

你不一定非要一次性满意。如果 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补充注释和 JSDocAI 理解代码后自动写文档注释
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+KChatAgent
启动方式选中代码 → Cmd+KCmd+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 还是生成偏了,可以:

  1. Cmd+Shift+R 重新生成(很多时候换一次生成结果就好很多)
  2. 减少选中范围——选太多代码会让 AI 算力分散
  3. 增加约束条件——用”保持……不变""只改……其他别动”这类约束
  4. 如果连续 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 —— 随身技术导师,代码问答和方案讨论的最稳妥选择。