什么是上下文管理?
上下文管理是 Cursor 中的一项核心功能,它允许您为 AI 提供足够的信息和背景,使其能够更准确地理解您的项目、代码和需求。与传统编辑器不同,Cursor 的 AI 功能依赖于对代码上下文的深入理解,而上下文管理功能正是为了优化这一理解过程而设计的。
有效的上下文管理可以显著提高:
- AI 生成代码的质量和相关性
- 对项目特定概念和术语的理解
- 代码建议的准确性
- 问题回答的针对性
- 故障排除和调试的效率
上下文类型
Cursor 中的上下文可以分为以下几种类型:
1. 自动收集的上下文
- 当前文件:您正在编辑的文件内容
- 打开的标签页:编辑器中打开的其他文件
- 最近的编辑:您最近修改过的内容
- 项目结构:文件夹和文件组织方式
2. 显式提供的上下文
- 选中的代码:您在编辑器中选择的代码片段
- 聊天中引用的文件或代码:通过特殊命令引用的内容
- 上传的文件或链接:手动添加到聊天的外部资源
3. 项目级上下文
- 代码库索引:Cursor 自动生成的项目索引
- AI 规则:定义的项目特定指导原则
- 依赖关系:项目使用的库和框架
上下文特殊命令
Cursor 的聊天功能提供了多种特殊命令,用于有效地提供上下文信息:
命令 | 描述 | 使用场景 |
---|---|---|
@code |
引用选中的代码或指定代码片段 | 询问关于特定代码片段的问题,请求分析或修改选中的代码 |
@file |
引用整个文件的内容 | 讨论文件的整体结构、逻辑或需要考虑整个文件的修改 |
@folder |
列出文件夹中的文件和结构 | 讨论组件或模块的组织方式,了解项目结构 |
@codebase |
引用整个代码库的概要 | 讨论架构设计、项目重构或需要理解整个项目的问题 |
@definition |
查找并引用符号定义 | 了解函数、类或变量的定义和用法 |
@docs |
引用文档文件内容 | 讨论项目文档、需求规格或技术说明 |
@git |
引用 Git 历史信息 | 理解代码变更历史,讨论特定提交或变更 |
@web |
引用网络搜索结果 | 获取外部知识,了解最新技术或解决方案 |
使用示例 1:代码查询
使用 @code
命令询问关于选中代码的问题:
@code 这个函数有什么可以优化的地方?
// 选中的代码会自动包含在请求中
使用示例 2:文件分析
使用 @file
命令引用整个文件并提问:
@file src/components/UserList.js
这个组件的性能问题可能出在哪里?
使用示例 3:项目架构
使用 @codebase
命令分析整个项目结构:
@codebase
请帮我分析一下这个项目的整体架构,特别是数据流动方式。
上下文管理最佳实践
以下是一些提高 AI 理解效果的最佳实践:
1. 提供适量上下文
提供足够的上下文让 AI 理解问题,但避免信息过载。
建议
- 针对特定问题选择相关代码,而不是提供过多无关代码
- 使用 @folder 先展示结构,再使用 @file 引用具体文件
- 对于复杂问题,分步提供上下文,而不是一次性提供所有信息
2. 利用自动索引
Cursor 会自动索引您的代码库,充分利用这一功能。
建议
- 打开项目根目录,而不仅是单个文件,以便 Cursor 可以索引整个项目
- 使用 .cursorignore 文件排除与代码理解无关的目录(如 node_modules)
- 项目结构变化较大时,考虑重新索引项目
3. 创建 AI 规则
为项目定义特定的 AI 规则(Cursor Rules),指导 AI 的行为。
建议
- 创建规则定义项目的编码风格、命名约定和架构原则
- 为特定文件或目录设置特定规则
- 在规则中说明项目特有的术语和概念
示例 AI 规则文件:
// 示例 AI 规则文件 (.cursorrules)
{
"rules": [
{
"pattern": "src/components/*.tsx",
"instructions": "所有组件使用函数组件和 React Hooks,遵循 PascalCase 命名,每个组件一个文件"
},
{
"pattern": "src/utils/*.ts",
"instructions": "工具函数使用纯函数设计,遵循单一责任原则,使用详细的 JSDoc 注释"
}
]
}
4. 清晰表述需求
结合上下文提供清晰的需求描述。
建议
- 说明您想要实现的具体目标,而不仅仅是问题描述
- 提供预期输出的示例或格式
- 明确任何约束条件或偏好
❌ 不佳示例:
"这个函数有问题"
✅ 良好示例:
"这个用户认证函数在处理无效令牌时会抛出未捕获的异常。请修改它,添加适当的错误处理,并遵循我们项目的错误处理模式,即返回 Result 对象而不是抛出异常。"
代码库索引
Cursor 会自动索引您的代码库,建立符号、依赖关系和语义联系的数据库,帮助 AI 更好地理解项目。
索引过程
- 当您打开一个项目文件夹时,Cursor 会自动开始索引
- 索引会分析文件内容、结构和关系
- 索引完成后,AI 将能够更准确地理解代码库
- 索引会在后台自动更新,反映项目变化
优化索引
- 使用 .cursorignore 文件排除大型二进制文件、生成的代码和第三方库
- 确保项目结构良好,文件位置和命名有意义
- 项目发生重大变化后,可以手动触发重新索引
提示
如果您发现 AI 对项目的理解不准确,可能是因为索引不完整或过时。尝试重新启动 Cursor 或手动触发重新索引。
忽略文件配置
使用 .cursorignore 文件可以排除不需要被索引或上下文中引用的文件和目录,类似于 .gitignore:
示例 .cursorignore 文件内容:
# 示例 .cursorignore 文件
# 排除依赖目录
node_modules/
vendor/
.venv/
# 排除构建输出
dist/
build/
*.min.js
# 排除大型数据文件
*.csv
*.json.gz
datasets/
# 排除自动生成的代码
src/generated/
*.g.ts
提示
将经常变化但对代码理解不重要的文件(如日志、临时文件)添加到 .cursorignore 中,可以减少索引负担并提高 AI 响应速度。
常见问题排查
问题:AI 不理解项目特定术语或概念
可能的解决方案:
- 创建 AI 规则,定义项目特定术语和概念
- 确保项目文档(如 README.md)被纳入上下文
- 在提问时简要解释特殊术语
问题:引用的文件无法被找到
可能的解决方案:
- 检查文件路径是否正确(区分大小写)
- 尝试使用相对路径而不是绝对路径
- 确保文件在项目目录内,而不是外部位置
- 检查文件是否被 .cursorignore 排除
问题:上下文窗口太小,无法包含所有相关代码
可能的解决方案:
- 分解大型问题为多个小问题
- 使用多个特定的 @file 或 @code 引用,而不是一个大的引用
- 将上下文重点放在最相关的部分
- 考虑重构代码,将大文件分解为小文件
问题:项目索引似乎不完整或过时
可能的解决方案:
- 重新启动 Cursor
- 选择"重新索引项目"选项(如果可用)
- 检查 .cursorignore 文件确保重要文件未被排除
- 确保项目文件使用正确的文件扩展名