Cursor 编辑器深度玩法
引言:为什么 Cursor 值得认真对待
从 VS Code 切换到 Cursor 已经有一段时间了。说实话,最初只是抱着"试试看"的心态——毕竟 VS Code 用得好好的,Copilot 也够用。但深入使用后发现,Cursor 不只是"VS Code + AI"那么简单,它从底层重新思考了 AI 与代码编辑器的融合方式。
这篇文章分享我在实际项目中积累的 Cursor 使用心得,特别是那些官方文档没有详细说明、需要自己摸索的进阶技巧。
第一部分:理解 Cursor 的设计哲学
1.1 从"补全"到"对话"的范式转变
传统的 AI 代码工具(包括 Copilot)基于"补全"模式——你写一部分,AI 猜测并补全剩余部分。Cursor 则引入了"对话"模式:你可以用自然语言描述需求,AI 理解后直接执行修改。
传统模式:
┌────────────────────────────────────────┐
│ 你写代码 → AI 补全 → 你修改 → 循环 │
└────────────────────────────────────────┘
Cursor 模式:
┌────────────────────────────────────────┐
│ 你描述需求 → AI 理解并执行 → 你审查 │
└────────────────────────────────────────┘
这个转变看似微小,但对工作流的影响是颠覆性的。
1.2 三种核心交互方式
Cursor 提供三种与 AI 交互的方式,各有适用场景:
| 方式 | 快捷键 | 适用场景 | 特点 |
|---|---|---|---|
| Tab 补全 | Tab | 行内补全、小段代码 | 快速、无缝 |
| Cmd+K 编辑 | Cmd+K | 修改选中代码块 | 精准、可控 |
| Composer | Cmd+I | 多文件修改、功能实现 | 强大、全面 |
我的使用比例:
- Tab 补全:40%(日常编码)
- Cmd+K:35%(重构、优化)
- Composer:25%(新功能、大改动)
第二部分:Cmd+K 的进阶用法
2.1 精准的代码修改
Cmd+K 不只是"让 AI 改代码",它的强大在于可以给出精准的修改指令:
// 选中这段代码后按 Cmd+K
function fetchUserData(userId: string) {
return fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => data)
.catch(err => console.error(err));
}
// 输入指令:
// "重构为 async/await,添加类型定义,增加超时和重试机制"
// AI 会生成:
interface UserData {
id: string;
name: string;
email: string;
}
async function fetchUserData(
userId: string,
options: { timeout?: number; retries?: number } = {}
): Promise<UserData> {
const { timeout = 5000, retries = 3 } = options;
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout);
const response = await fetch(`/api/users/${userId}`, {
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (attempt === retries) throw error;
await new Promise(r => setTimeout(r, 1000 * attempt));
}
}
throw new Error('Unexpected error');
}
2.2 指令模板化
我整理了一些常用的 Cmd+K 指令模板:
## 代码优化类
"优化性能,减少不必要的渲染/计算"
"提取重复逻辑为独立函数"
"简化条件判断,使用 early return"
"添加缓存/记忆化"
## 类型增强类
"添加完整的 TypeScript 类型定义"
"用泛型重构,提高复用性"
"添加 JSDoc 文档注释"
## 错误处理类
"添加完善的错误处理和边界检查"
"添加输入验证"
"改为 Result 模式处理错误"
## 测试相关
"为这个函数生成单元测试"
"添加边界条件测试用例"
"生成测试数据 mock"
## 重构类
"拆分为更小的函数"
"转换为函数式写法"
"应用 [设计模式名] 模式重构"
2.3 上下文增强技巧
Cmd+K 的效果很大程度取决于你提供的上下文。以下是增强上下文的技巧:
// 技巧 1:选中相关代码一起修改
// 不只选函数本身,还选上相关的类型定义
interface User {
id: string;
name: string;
}
// 选中上面的 interface 和下面的函数一起
function createUser(name: string): User {
return { id: Date.now().toString(), name };
}
// 指令:"添加 email 字段,包括验证"
// AI 会同时更新 interface 和函数
// 技巧 2:在指令中引用其他文件
// "参考 utils/validation.ts 中的验证风格"
// 技巧 3:说明业务背景
// "这是电商平台的订单服务,需要考虑并发安全"
第三部分:Composer 深度使用
3.1 什么时候用 Composer
Composer 是 Cursor 最强大的功能,但也最容易用错。我的经验是:
适合用 Composer 的场景:
- 实现跨多个文件的新功能
- 大规模重构
- 创建新的模块/组件
- 需要 AI 理解整体架构的任务
不适合用 Composer 的场景:
- 单文件的小修改(用 Cmd+K)
- 简单的代码补全(用 Tab)
- 已有明确方案,只需执行(用 Cmd+K)
3.2 Composer 的最佳实践
## 实践 1:分步骤描述需求
❌ 错误示例:
"实现一个完整的用户管理模块"
✅ 正确示例:
"我需要实现用户管理模块,包括以下部分:
1. 数据层
- 用户实体类型定义 (types/user.ts)
- 用户 API 封装 (api/user.api.ts)
2. 状态管理
- Pinia store (stores/user.store.ts)
- 支持列表、详情、CRUD 操作
3. 视图层
- 用户列表页面,支持搜索和分页
- 用户表单组件,用于新增和编辑
请先创建数据层,等我确认后再继续。"
## 实践 2:提供参考文件
"请参考现有的 product 模块结构:
- stores/product.store.ts
- api/product.api.ts
- views/ProductList.vue
按照相同的模式实现 order 模块"
## 实践 3:明确技术约束
"实现表单验证功能,要求:
- 使用 VeeValidate + Zod
- 支持异步验证(如邮箱唯一性检查)
- 错误信息支持 i18n
- 不使用 any 类型"
3.3 Composer 的隐藏功能
功能 1:@ 引用
在 Composer 中可以使用 @ 引用:
- @filename - 引用特定文件
- @folder - 引用整个文件夹
- @codebase - 让 AI 搜索整个代码库
- @web - 让 AI 搜索网络信息
- @docs - 引用官方文档(如果配置了)
功能 2:图片输入
Composer 支持图片输入,适用场景:
- 将设计稿转为代码
- 描述 UI bug(截图说明)
- 展示期望的效果
功能 3:多轮对话优化
第一轮:描述整体需求
第二轮:针对第一轮结果提出修改
第三轮:微调细节
这比一次性描述所有需求效果更好,
因为你可以根据中间结果调整方向。
第四部分:Codebase 索引与搜索
4.1 配置索引
Cursor 会索引你的代码库,让 AI 能够理解整个项目。正确配置索引很重要:
// .cursorignore 文件 - 类似 .gitignore
// 排除不需要索引的文件
node_modules/
dist/
build/
.git/
*.log
*.lock
coverage/
.next/
.nuxt/
# 大型数据文件
*.csv
*.json # 如果有大型 JSON 数据文件
public/data/
# 生成的文件
*.generated.ts
*.d.ts
4.2 利用 @codebase 搜索
## 有效的 @codebase 查询示例
"@codebase 项目中是如何处理用户认证的?"
"@codebase 找到所有使用 localStorage 的地方"
"@codebase 这个项目的数据流是怎样的?"
"@codebase 哪些组件使用了 UserContext?"
## 无效的查询(过于宽泛)
"@codebase 这个项目是干什么的?" // 太宽泛
"@codebase 所有代码" // 无意义
4.3 项目文档配置
在项目根目录创建 .cursorrules 文件,为 AI 提供项目级别的上下文:
# .cursorrules
## 项目概述
这是一个基于 Vue 3 + TypeScript 的电商后台管理系统。
## 技术栈
- 框架:Vue 3.4 + TypeScript 5
- 构建:Vite 5
- 状态管理:Pinia
- UI:Element Plus
- 样式:Tailwind CSS + SCSS
- HTTP:Axios
- 路由:Vue Router 4
## 代码规范
1. 组件使用 `<script setup lang="ts">` 语法
2. 状态管理使用 Composition API 风格的 Pinia
3. API 调用统一封装在 `src/api/` 目录
4. 通用 hooks 放在 `src/composables/` 目录
5. 类型定义放在 `src/types/` 目录
## 命名规范
- 组件:PascalCase(UserList.vue)
- composables:camelCase,以 use 开头(useAuth.ts)
- 常量:UPPER_SNAKE_CASE
- 类型/接口:PascalCase
## 注意事项
- 所有 API 请求必须有错误处理
- 表单必须有前端验证
- 列表页必须支持分页
- 敏感操作需要二次确认
## 目录结构
src/ ├── api/ # API 接口封装 ├── assets/ # 静态资源 ├── components/ # 通用组件 ├── composables/ # 组合式函数 ├── layouts/ # 布局组件 ├── router/ # 路由配置 ├── stores/ # Pinia stores ├── styles/ # 全局样式 ├── types/ # TypeScript 类型 ├── utils/ # 工具函数 └── views/ # 页面组件
第五部分:Agent 模式实战
5.1 什么是 Agent 模式
Cursor 的 Agent 模式允许 AI 执行更复杂的任务,包括:
- 运行终端命令
- 创建/修改/删除文件
- 安装依赖
- 执行构建和测试
5.2 安全地使用 Agent
## Agent 模式的安全实践
1. 始终审查 AI 要执行的命令
- 特别注意 rm、删除、覆盖类操作
- 检查安装的依赖是否合理
2. 使用 Git 作为安全网
- 确保有提交后再让 Agent 工作
- 方便回滚不满意的修改
3. 在非关键分支上实验
- 创建测试分支让 Agent 工作
- 确认效果后再合并
4. 设置合理的边界
- 不让 Agent 直接操作生产配置
- 敏感文件添加到 .cursorignore
5.3 Agent 实战示例
## 示例 1:初始化新项目
指令:
"帮我创建一个新的 Vue 3 项目,要求:
- 使用 Vite + TypeScript
- 安装 Vue Router、Pinia、Element Plus
- 配置 ESLint + Prettier
- 创建基本的目录结构
- 添加一个示例页面"
Agent 会:
1. 运行 npm create vue@latest
2. 安装额外依赖
3. 创建配置文件
4. 生成示例代码
## 示例 2:添加新功能
指令:
"给项目添加暗色模式支持:
- 创建主题切换 composable
- 使用 Tailwind 的 dark 模式
- 在 header 添加切换按钮
- 持久化用户偏好到 localStorage"
Agent 会:
1. 修改 tailwind.config.js
2. 创建 composables/useTheme.ts
3. 修改相关组件
4. 更新样式文件
第六部分:效率优化技巧
6.1 快捷键备忘
基础操作:
Tab - 接受 AI 补全
Esc - 取消 AI 补全
Cmd + K - 打开内联编辑
Cmd + I - 打开 Composer
Cmd + L - 打开 Chat 面板
Cmd + Shift + L - 将选中代码发送到 Chat
进阶操作:
Cmd + / - 切换 AI 模型
Cmd + Enter - 在 Chat/Composer 中发送
Cmd + . - 应用 AI 建议的修改
6.2 常用设置调优
// settings.json 推荐配置
{
// AI 相关
"cursor.cpp.enablePartialAccepts": true, // 支持部分接受
"cursor.chat.showSuggestedFiles": true, // 显示相关文件建议
// 性能相关
"cursor.general.enableShadowWorkspace": true,
// 补全行为
"cursor.autocomplete.alwaysSuggest": true,
"cursor.autocomplete.useOpenTabsAsContext": true
}
6.3 我的日常工作流
┌─────────────────────────────────────────────────────────┐
│ Cursor 日常工作流 │
├─────────────────────────────────────────────────────────┤
│ │
│ 早晨:项目启动 │
│ ├── 打开 Cursor │
│ ├── 确认 .cursorrules 是最新的 │
│ └── 用 Chat 快速回顾昨天的进度 │
│ │
│ 编码时:灵活切换 │
│ ├── 简单补全 → Tab │
│ ├── 修改重构 → Cmd+K │
│ ├── 新功能 → Composer │
│ └── 不确定时 → Chat 讨论 │
│ │
│ 遇到问题: │
│ ├── 报错 → 选中错误信息 Cmd+K "修复" │
│ ├── 不懂 → Chat 问 "解释这段代码" │
│ └── 卡住 → @codebase 找类似实现 │
│ │
│ 完成功能后: │
│ ├── Cmd+K "为这个函数添加测试" │
│ ├── Cmd+K "添加文档注释" │
│ └── 用 Chat review 代码质量 │
│ │
└─────────────────────────────────────────────────────────┘
第七部分:与其他工具的配合
7.1 Cursor + Git
## Git 工作流整合
1. 提交信息生成
- 选中 diff 内容
- Cmd+K "生成 commit message"
2. Code Review
- 在 PR 分支上打开 Cursor
- Chat: "review 这个 PR 的改动"
3. 冲突解决
- 选中冲突代码
- Cmd+K "解决这个 git 冲突,保留双方功能"
7.2 Cursor + 终端
# Cursor 内置终端也支持 AI
# 选中命令输出,可以让 AI 解析错误
npm run build # 如果报错,选中错误信息问 AI
# 在终端中 Cmd+K 也能工作
# 输入自然语言描述,生成命令
"找到所有超过 100KB 的图片文件"
# AI 生成: find . -name "*.jpg" -o -name "*.png" | xargs ls -la | awk '$5 > 102400'
第八部分:常见问题与解决
8.1 AI 响应慢
可能原因及解决方案:
1. 索引问题
- 检查 .cursorignore 是否正确配置
- 重建索引:Cmd+Shift+P → "Cursor: Rebuild Index"
2. 上下文过大
- 减少同时打开的文件数
- 关闭不相关的标签页
3. 网络问题
- 检查代理设置
- 尝试切换 AI 模型
8.2 补全不准确
改善方法:
1. 提供更多上下文
- 打开相关的类型定义文件
- 写更详细的注释
2. 使用 Cmd+K 替代 Tab
- 给出明确的修改指令
- 比依赖自动补全更可控
3. 更新 .cursorrules
- 添加项目特定的约束
- 说明命名规范和代码风格
8.3 Composer 生成的代码有问题
处理流程:
1. 不要完全重新生成
- 在对话中指出具体问题
- 让 AI 只修改有问题的部分
2. 分步验证
- 让 AI 先生成核心逻辑
- 确认后再添加错误处理、类型等
3. 提供反馈
- "这个实现有个问题:[具体问题]"
- "请保留 [好的部分],只修改 [问题部分]"
结语:工具进化,心智升级
Cursor 代表了代码编辑器的一个新方向——AI 不再是"插件",而是编辑器的"原生能力"。这种深度整合带来的流畅体验,是传统 IDE + AI 插件难以比拟的。
但工具终究是工具。Cursor 能够放大你的能力,前提是你本身有能力被放大。它不会让你自动成为更好的程序员,但会让好的程序员更加高效。
学会与 AI 协作,不是放弃思考,而是将思考集中在更重要的事情上——架构设计、业务理解、技术决策。把重复性的编码工作交给 AI,把创造性的工作留给自己。
这或许就是 AI 时代程序员的新定位:不是写代码的人,而是指挥 AI 写代码的人。


