这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Learning Cursor

Cursor 学习笔记

1 - Cursor介绍

Cursor介绍和资料收集

1.1 - Cursor介绍

Cursor介绍

介绍

Cursor 的官网是这样介绍的:

The AI Code Editor

人工智能代码编辑器

Built to make you extraordinarily productive, Cursor is the best way to code with AI.

让你的工作效率超乎寻常、Cursor 是使用 AI 编程的最佳方式。

Cursor 的优点

  • 可预测下一次编辑,让你轻松完成更改。

  • 可以了解您的代码库。从代码库中获取答案,或参考文件或文档。并一键使用模型代码。

  • 用自然语言编辑。Cursor 可让你使用指令编写代码。只需一个简单的提示,即可更新整个类或函数。

  • 更快地构建软件。Cursor 智能、快速、熟悉,是使用人工智能编码的最佳方式。

cursor的特性

Tab

Cursor 包含功能强大的自动完成功能,可预测你的下一次编辑。

一旦启用,它将始终保持开启状态,并在考虑到您最近所做更改的情况下,建议您对多行代码进行编辑。

  • 多行编辑: Cursor 可同时建议多行编辑,节省您的时间。
  • 智能重写: 放心输入,cursor将修复您的错误。
  • 光标预测: cursor 预测您的下一个光标位置,以便您可以无缝导航代码。

chat

chat可以让你与看到你的代码库的AI交谈。chat总是可以看到你当前的文件和光标,所以你可以问它这样的事情:“这里有一个错误吗?".您可以使用Ctrl+Shift+L或“@”将特定的代码块添加到上下文。您可以通过 Ctrl+Enter 与整个代码库聊天。

  • 立即应用:通过点击任何聊天代码块顶部的 apply 按钮,将聊天中的代码建议应用回您的代码库。
  • 代码库答案: 使用@Codebase或Ctrl Enter询问有关代码库的问题。cursor将搜索您的代码库,以找到与您的查询相关的代码。
  • 参考您的代码: 带有@符号的参考代码将用作AI的上下文。只需键入@即可查看文件夹中所有文件和代码符号的列表。
  • 使用图像: 点击聊天下的图像按钮或将图像拖到输入框中以将视觉上下文包含到聊天中。
  • 问询WEB: 使用 @Web 从 Internet 获取最新信息。Cursor将为您搜索网页,并使用最新信息回答您的问题。
  • 使用文档: 使用 @LibraryName 引用流行的库,或使用@ Library → Add new doc 添加您自己的库。

Ctrl K

Ctrl K 允许您使用AI编辑和编写代码。要编辑,请尝试选择一些代码,单击“编辑”,并描述应如何更改代码。要生成全新的代码,只需键入Ctrl K而不选择任何内容。

  • 快速编辑: 用AI编辑和编写代码。选择一些代码,单击Ctrl K,然后描述应该如何更改代码。或者,使用Ctrl K生成新代码而不选择任何内容。
  • 终端 Ctrl K: 在终端中使用Ctrl K以简单的英语编写终端命令。cursor 会将它们转换成你需要的终端命令。
  • 快速问题: 如果您对代码的某些部分有任何快速问题,您可以选择并单击“quick question”以立即获得答案。

1.2 - Cursor定价

Cursor订阅和定价

https://www.cursor.com/pricing

定价

Hobby

免费,包括:

  • Pro两周试用
  • 2000 completions
  • 50个慢速高级请求

Pro

每月20美元,在 Hobby 的基础上,加上:

  • 无限的completions
  • 每月500个快速高级请求
  • 无限制的慢速高级请求
  • 每天10次 o1-mini 使用

Business

每月40美元,在 Pro 的基础上,加上:

  • 在组织范围内强制实施隐私模式
  • 集中式团队计费
  • 管理员仪表板与使用统计
  • SAML/OIDC SSO

常见问题

什么是高级模型?

What are the premium models?

GPT-4、GPT-4 o和Claude 3.5 Sonnet都被认为是高级模型。你有500个快速使用和无限的慢速使用每个月这些模型。每次对Claude 3.5 Haiku的请求都相当于一次高级请求的1/3。

什么是快速和慢速使用?

我们的后端优先考虑快速使用高级模型。在Pro上,一旦达到快速使用限制,您仍然可以使用高级模型,但在高负载时,您的请求可能会排在其他请求之后。

1.3 - Cursor资料收集

Cursor资料收集

官方资料

官方网站: https://www.cursor.com/

官方文档:https://docs.cursor.com/

官方博客:https://www.cursor.com/blog

官方论坛:https://forum.cursor.com/

文档

Cursor 中文文档

https://cursordocs.com/

Cursor 中文文档,完整同步官方最新内容,为 Cursor 中文用户提供全面学习支持,覆盖Cursor所有功能,包括Composer、Chat、Tab、Context等。

Cursor中文网

https://cursor.qiannianlu.com/

2 - Cursor安装配置

Cursor的安装和配置

2.1 - 在linux mint上安装

在linux mint22上安装cursor

下载

下载 linux 的安装文件,会得到类似 Cursor-0.47.8-82ef0f61c01d079d1b7e5ab04d88499d5af500e3.deb.glibc2.25-x86_64.AppImage 这样的文件。

安装

需要设置可执行权限,然后运行它进行安装:

chmod +x Cursor-0.47.8-82ef0f61c01d079d1b7e5ab04d88499d5af500e3.deb.glibc2.25-x86_64.AppImage

./Cursor-0.47.8-82ef0f61c01d079d1b7e5ab04d88499d5af500e3.deb.glibc2.25-x86_64.AppImage      

安装界面:

“Add terminal command” 是用来从终端中启动,因为我同时还使用标准版本的vscode,因此我选择 “+ Install cursor”。但是很遗憾,报错。

配置 vs code 的 extension:

登录 cursor:

完成后打开的 cursor 界面:

发现其实没所谓安装过程,这个下载的文件就是应用启动文件。

因此转移到特定目录,方便以后使用:

mkdir -p ~/work/soft/cursor
mv Cursor-0.47.8-82ef0f61c01d079d1b7e5ab04d88499d5af500e3.deb.glibc2.25-x86_64.AppImage ~/work/soft/cursor/cursor.AppImage
cd ~/work/soft/cursor                               
./cursor.AppImage 

但这个启动的方式,无法固定在面板,也无法固定在 dock,甚至 Synapse 都找不到它。总不能每次都用终端启动吧?

启动

google 之后找到的方法是这样的:

https://forum.cursor.com/t/how-to-open-cursor-from-terminal/3757/10

ctrl + shift + p 打开 Command Palette,然后运行 Shell Command :Install Cursor command

但很遗憾,在 linux mint 22 (基于ubuntu24.04)下,找不到 Shell Command :Install Cursor command。看回帖有人也遇到和我一样的问题:

命令行启动

可以通过其他方法来解决这个问题:

vi ~/.zshrc

增加以下内容:

# cursor
cursor() {
  # Run the cursor command and suppress background process output completely
  (nohup ~/work/soft/cursor/cursor.AppImage "$@" >/dev/null 2>&1 &)
} 

重新载入:

source ~/.zshrc

之后在终端中输入 cursor 就可以启动 cursor 了,而且关闭这个终端也不会造成 cursor 进程退出。

应用图标启动

从命令行启动终究有点麻烦,可以自己建立应用程序,然后点击启动 cursor。

从下列地址下载一个 cursor 的图标文件,放到 ~/work/soft/cursor/ 目录:

curl -o ~/work/soft/cursor/cursor-icon.svg https://www.cursor.com/favicon.svg

然后新建一个 cursor.desktop:

cd ~/.local/share/applications/

vi cursor.desktop

内容为:

[Desktop Entry]
Name=Cursor
Comment=start cursor
Exec=gnome-terminal -- bash -c "~/work/soft/cursor/cursor.AppImage;"
Icon=~/work/soft/cursor/cursor-icon.png
Terminal=false
Type=Application
Categories=Development;Application;

增加执行权限:

chmod +x cursor.desktop

进入 ~/.local/share/applications/ 目录,双击 cursor 的图标就可以启动 cursor 了。

启动后,右键选择 “keep in Dock”,以后就可以从 Dock 直接启动了。

如果要增加桌面启动,复制这个 cursor.desktop 文件到桌面即可。

正常情况下,linux mint 默认的 Cinnamon Menu 应用启动器会识别到 ~/.local/share/applications/ 下的这个 cursor 应用,然后将其放置在开始菜单中的 Programming 分类中,从这里也可以打开 cursor。另外 Synapse 之类的应用程序启动器也可以识别到 cursor 了,alt + g 快捷键也可以方便的启动 cursor。

2.2 - 在windows上安装

在 windows 上安装cursor

以 windows 11 ltsc 2024 为例。

下载

下载 windows 的安装文件,会得到类似 Cursor Setup 0.45.14 - x64.exe 这样的文件。

安装

运行它进行安装,安装界面:

“Add to command line” 是用来从命令行中启动,因为我同时还使用标准版本的vscode,因此我选择 “+ Install cursor”。

配置 vs code 的 extension:

资料收集:

登录 cursor:

完成后打开的 cursor 界面:

可以通过多种方式打开 cursor,比如在 cmd 或者 gitbash 里面输入 cursor 命令,实际是调用这个:

$ which cursor
/d/sky/AppData/Local/Programs/cursor/resources/app/bin/cursor

也可以通过 windows 键然后通过 cursor 查找应用,然后打开。最方便的方式还是将 cursor 固定在任务栏上。

3 - Editor

Cursor Editor

3.1 - Tab

基于 AI 的代码自动补全,根据你的最近工作建议编辑和多行更改

3.1.1 - 概述

cursor editor tab 概述

官方说明

https://docs.cursor.com/tab/overview

AI-powered code autocomplete that suggests edits and multi-line changes based on your recent work

Cursor Tab is our native autocomplete feature. It’s a more powerful Copilot that suggests entire diffs with especially good memory.

AI 驱动的代码自动完成,根据您最近的工作建议编辑和多行更改。

Cursor Tab 是我们的原生自动完成功能。它是一个功能更强大的 Copilot,能建议整个差异,而且记忆力特别好。

Powered by a custom model, Cursor Tab can:

  • Suggest edits around your cursor, not just insertions of additional code.
  • Modify multiple lines at once.
  • Make suggestions based on your recent changes and linter errors.

由自定义模型提供支持,Cursor Tab 可以:

  • 在光标周围进行建议编辑,而不仅仅是插入额外的代码。
  • 一次修改多行。
  • 根据您最近的更改和 linter 错误提出建议。

Free users receive 2000 suggestions at no cost. Pro and Business plans receive unlimited suggestions.

免费用户可免费获得2000条建议。专业和商业计划会收到无限的建议。

UI

When Cursor is only adding additional text, completions will appear as grey text. If a suggestion modifies existing code, it will appear as a diff popup to the right of your current line.

当 Cursor 仅添加附加文本时,完成文本将显示为灰色文本。如果一个建议修改了现有的代码,它将在你当前行的右边显示为一个 diff 弹出窗口。

alt text

说明:就是显示建议内容时,如果只是在现有内容后面添加内容,则显示为灰色文本,如果修改了现有的代码,则不会就地显示,而是在这一行的后面弹出一个窗口。

You can accept a suggestion by pressing Tab, or reject it by pressing Esc. To partially accept a suggestion word-by-word, press Ctrl/⌘ →. To reject a suggestion, just keep typing, or use Escape to cancel/hide the suggestion.

您可以按 Tab 键接受建议,也可以按 Esc 键拒绝建议。要逐字部分接受建议,请按 Ctrl/⌘ → (即 ctrl + 向右的方向键)。要拒绝建议,只需继续键入,或使用 Esc 取消/隐藏建议。

Every keystroke or cursor movement, Cursor will attempt to make a suggestion based on your recent changes. However, Cursor will not always show a suggestion; sometimes the model has predicted that there’s no change to be made.

每一次鼠标或光标移动,Cursor都会尝试根据您最近的更改提出建议。然而,Cursor并不总是显示建议;有时模型已经预测到不需要进行任何更改。

Cursor can make changes from one line above to two lines below your current line.

Cursor 可以从当前行的上一行到下两行进行更改。

Toggling/切换

To turn the feature on or off, hover over “Cursor Tab” icon on the status bar in the bottom right of the application.

要打开或关闭该功能,请将鼠标悬停在应用程序右下角状态栏上的 “Cursor Tab” 图标上。

Keyboard Shortcut/键盘快捷键

Bind Cursor Tab to a custom keyboard shortcut by selecting Settings > Keyboard Shortcuts from the Cursor menu and searching for Accept Cursor Tab Suggestions.

通过从 cursor 菜单中选择 设置 >键盘快捷键 并搜索 “接受光标选项卡建议”,将 Cursor Tab 绑定到自定义键盘快捷键。

3.1.2 - 高级功能

cursor editor tab 高级功能

官方说明

https://docs.cursor.com/tab/advanced-features

学习在预览视图、预测和部分接受中使用Tab高效地导航代码

Peek中的Tab

也可以在 “Go to Definition” 或 “Go to Type Definition” 预览视图中使用光标选项卡。这是有用的,例如,当添加一个新的参数到一个函数调用。

我们特别喜欢在 vim 中结合 gd 使用,例如,修改一个函数定义,然后一次性修复所有它的用法。

光标预测

光标还可以预测在接受编辑后您将转到何处。如果可用,您将能够按 tab 键转到下一个位置,允许您通过 tab-tab-tab 进行编辑。

Cursor 预测了下一个位置,并建议在那里进行编辑。

部分接受

您可以通过按 Ctrl + 右箭头(或将 editor.action.inlineSuggest.acceptNextWord 设置为您的首选键绑定)来接受建议的下一个单词。

要启用部分接受,请导航到 Cursor Settings > Features > Cursor Tab 。

3.2 - Agent

利用工具和推理执行编码任务的人工智能助手,只需最少的监督

3.2.1 - Agent

使用工具和推理来执行编码任务的 AI 助手

https://docs.cursor.com/agent

使用工具和推理来执行编码任务的 AI 助手,只需最少的监督

您可以将任务委托给 Cursor Agent,让它与您一起工作。Agent 在 Composer 中执行其工作,并构建在 Composer 之上。请确保阅读 Composer 以最好地使用Agent。

工具

Agent 可以访问多个工具,包括

  • 阅读&写代码
  • 搜索代码库
  • 呼叫 MCP 服务器
  • 运行终端命令
  • 自动网络搜索最新信息

Agent 的推理能力使一些非常强大的工作流成为可能,它可以在没有太多监督的情况下执行许多连续的操作。在需要时,Agent将自动搜索Web以查找相关信息、文档或示例,以帮助您完成任务。

插入这个视频地址到当前 markdown 文件中,不要全屏

Agent 可以进行多达 25 次工具调用,然后停止。当达到限制时,您可以按“继续”让 Agent 进行更多工具调用(每次“继续”调用都算作一个请求)。

Terminal/终端

当 agent 运行终端命令时,它使用 VS Code 的终端配置文件来确定要使用哪个 shell。它从默认配置文件开始,遍历可用的配置文件,并选择第一个支持命令检测的配置文件。这意味着如果先找到另一个兼容的终端配置文件,agent 使用的 shell 可能与默认系统 shell 不同。

要更改使用的终端配置文件,请执行以下操作:

  1. 打开命令行(Cmd/Ctrl+Shift+P)
  2. 搜索 “Terminal: Select Default Profile”
  3. 选择您的首选终端配置文件

Yolo模式

启用 Yolo 模式后,Agent 可以自己执行终端命令。这在运行测试套件时特别有用。向 Agent 指示任务以及如何验证更改(运行测试),它将继续执行,直到任务完成。

Guardrails/护栏

您可以为不希望 agent 自动运行的某些命令定义护栏和允许/拒绝列表。这是从 Cursor Settings 完成的。

yolo-settings

备注: 新版本的 cursor 中,yolo 模式被改名为 auto-run 模式,开启时会有一个警告:

auto-run-warnning

规则

你可以用规则来指导 agent 。它们可以根据 glob 模式自动附加到任何 Agent 请求,或者 Agent 可以根据规则描述获取一个。

阅读有关如何 使用规则 的更多信息

使用 Agent

首先打开一个新的 Composer 并启用 agent 模式。从那里,你可以给它指示要执行什么工作。

备注:切换 Composer 的模式必须要打开新的 session,不能在已经运行的 session 中切换模式。

备注2:最新版本的 cursor 中,直接就是 agent 模式,不需要切换。

模型

今天您可以使用 claude-3.5-sonnet,gpt-4 o 和 o3-mini与代理。我们将很快添加更多的模型!

FAQ

Agent 和 Composer 有什么区别?

您可以在 Composer 中的 Normal 和 Agent 模式之间切换。主要的区别是 Agent 会更努力地思考,使用推理和工具来解决问题。普通模式(编辑)用于单轮编辑,而询问模式(Ask mode)则帮助您理解和探索代码。

3.3 - Composer

新版本统一为 agent 模式

新版本的 cursor 中,没有 composer 的概念,直接就是 agent 模式。

3.4 - Chat

统一的人工智能界面,结合了询问、编辑和代理模式

3.4.1 - 概述

统一的人工智能界面,结合了询问、编辑和代理模式,可帮助您直接在编辑器中编写、编辑和理解代码

Cursor 的统一 AI 界面将不同的功能组合在一起,以帮助您直接在编辑器中编写、编辑和理解代码。使用 ctrl + I 打开它,并使用 ctrl + N 创建一个新的对话。使用输入框中的模式选择器在模式之间切换。

模式

该界面提供了三种模式,您可以从模式选择器中进行选择:

  1. Agent 模式: 访问用于复杂任务的工具和推理功能。默认模式。
  2. Edit 模式: 精确而清晰地对代码进行单次编辑。
  3. Ask 模式: 询问有关您的代码的问题、获取解释并发现您的代码库。(ctrl + L)

您可以使用模式选择器或 ctrl + . 快捷方式在模式间切换。这种灵活性使您能够适应当前的需求-从提出问题到进行更改再到使用高级工具。

备注: 需要鼠标点在 chat 的输入框内,才能使用快捷键 ctrl + . 在模式间切换。

上下文

您可以使用 @ 符号在提示中包含相关上下文。该界面将根据您的查询自动建议相关上下文。

AutoContext(Beta 版)

Cursor 可以使用嵌入和自定义模型在对话中自动包含相关代码。它不会使用 @ 符号手动选择上下文,而是分析您的提示并包含代码库(codebase)中最相关的代码。在 设置> 功能> 自动上下文中启用此功能。

备注:AutoContext 的设置应该是这个

enable-autocontext

生成和应用更改

Cursor 有一个内部训练的自定义模型,可以进行一系列编辑,正如您正在使用的 AI 模型所建议的那样,并在几秒钟内将其应用于具有 1000 行的文件。

这在“代理/Agent”和“编辑/Edit”模式下都会自动发生。

在 Ask 模式下,您可以通过单击 diff 视图右下角的 Apply 按钮来应用更改。

一旦你的更改完成,你可以在你的代码库中查看它们,然后选择接受或拒绝它们,如果你想进一步交互的话。

检查点

对于每个迭代,都会创建一个检查点。您可以通过单击该检查点附近的签出返回到任何以前的版本。如果您不喜欢当前的更改并希望恢复到以前的状态,这很方便。

checkpoints

聊天记录

通过历史记录访问之前的对话。从 cursor 选项卡右侧的历史记录图标打开它。您将看到一个过去的对话列表,您可以重新访问,重命名或删除。

history

备注:聊天历史记录的列表是没有删除/重命名的按钮的,要点击 show all,在弹出来的列表中才有删除/重命名的按钮。

当界面处于焦点状态时,使用 Ctrl + Alt +L 或 Ctrl+Alt+L 打开。

布局

  • Pane :侧边栏,左边是界面,右边是代码编辑器。

  • Editor: 编辑器窗口,类似于正常查看代码。你可以移动它,分割它,甚至把它放在一个单独的窗口。

  • Floating: 可拖动的窗口,您可以将其放置在您喜欢的位置

您可以从菜单> 打开为[布局]更改此设置

备注:居然找不到这个设置。

在 lint 上迭代

Cursor 让 AI 可以直接访问代码库中的 linter,这有助于它检查自己的代码以及项目中的现有代码。

当 Cursor 检测到已安装的 Linter 标记的问题时,AI 可以智能地尝试自行修复这些问题,并能够在需要时进行更改。

这意味着您将始终获得干净、兼容的代码,而无需手动检查和修复任何问题。

iterate-on-lint

在编辑器中使用 AI

Cursor 的 AI 界面在编辑器中是可访问的,这意味着您可以随时使用它。

FAQ

模式之间有什么区别?

Ask 模式可以帮助你理解和探索代码。使用它来提出问题,获得解释,并了解您的代码库。

Editor 模式侧重于对代码进行单次编辑。它提供了一个工作区,您可以在其中对文件进行精确更改。

Agent (默认)将这两种功能与额外的工具和推理能力相结合,以处理复杂的任务。

长时间的谈话是如何处理的?

对于长时间的对话,Cursor 使用较小的模型(如 cursor-small 和 gpt-4 o-mini) 总结早期的消息,以保持响应的快速性和相关性。

这种方法有助于确保即使是延长的对话也能保持响应性和连贯性,而不会丢失早期交流的关键细节。

我可以在另一台计算机上访问我的对话历史记录吗?

对话历史记录存储在您的本地计算机上,而不是存储在 Cursor 的服务器上或与您的 Cursor 帐户绑定。

这意味着如果您切换到其他计算机,您将无法访问以前的历史记录。您只能在最初创建历史记录的计算机上访问历史记录。

3.4.2 - Apply

了解如何使用 Cursor 的 apply 功能应用、接受或拒绝聊天中的代码建议

Cursor 的 Apply 允许您将 chat 中的代码块建议快速集成到代码中。

应用代码块

要应用代码块建议,您可以按每个聊天代码块右上角的 apply 按钮。

apply

这将编辑您的文件,以包含 Chat 生成的代码。由于您可以在 Chat 中添加最多的上下文并与模型进行最多的来回操作,因此我们建议您使用 Chat + Apply 进行更复杂的 AI 驱动的代码更改。

接受或拒绝

一旦你应用了代码块,你就可以通过 diff 来接受或拒绝更改。您也可以点击聊天代码块右上角的 “Accept” 或 “Reject” 按钮。

Ctrl + Enter 表示接受,Ctrl + Backspace 表示拒绝。

accept-apply

3.5 - Cmdk

使用 Cmd/Ctrl K 来生成、编辑代码并使用提示栏提问

3.5.1 - 概述

了解如何在 cursor 中使用 Cmd/Ctrl K 来生成、编辑代码并使用提示栏提问

Cmd K,在 Windows/Linux 上也称为“Ctrl K”,允许您在编辑器窗口中生成新代码或编辑现有代码。

regular

提示栏

在 Cursor 中,我们将按 Ctrl/Cmd K 时出现的栏称为“Prompt Bar”。它的工作原理类似于聊天的 AI 输入框,您可以正常输入,或使用 @ 符号引用其他上下文。

Inline Generation/内连生成

如果按下 Ctrl/Cmd K 时没有选择任何代码,光标将根据您在提示栏中键入的提示生成新代码。

generate

in-place editing/原地编辑

对于原地编辑,只需选择要编辑的代码并在提示栏中键入即可。

edit

后续说明

在每次生成之后,您可以通过向提示栏添加更多指令来进一步优化提示,然后按 Enter 键, 以便 AI 根据您的后续指令重新生成。

默认上下文

默认情况下,Cursor 将尝试查找不同类型的有用信息来改进代码生成,除了您包含的手动 @符号之外 。

其他上下文可能包括相关文件、最近查看的文件等。收集后,Cursor 根据与您的编辑/生成的相关性对上下文项进行排名,并将顶部项保留在大型语言模型的上下文中。

快速问答

如果您在提示栏中按 Option/Alt Enter,光标将回答您对选择的任何问题,以及您附加的上下文。

这个对话的内容可以在后续的生成中进一步使用,所以你可以在 Cursor 在一个快速的问题后给出一个响应来生成代码后,简单地输入“do it”。

3.5.2 - 终端 Cmdk

在 cursor 终端中使用 Ctrl/Ctrl + K,通过提示栏界面生成并运行命令

在内置的 cursor 终端中,您可以按 Ctrl + K 在终端底部打开一个提示栏。这个提示栏允许您在终端中描述您想要的操作,终端 Cmd K 将生成一个命令。您可以通过按 esc 来接受命令,也可以使用 Ctrl + Enter 立即运行命令。

terminal-cmdk

默认情况下,Terminal Cmd K 会看到您最近的终端历史记录,您的指令以及您在提示栏中放置的任何其他内容。

备注:这个功能很好用啊,比如我想在终端中运行一个命令,但是我不记得命令的参数了,我就可以使用这个功能。

example

3.6 - AI Commit Message

了解如何使用闪烁图标或快捷方式在 cursor 中自动生成 Git 提交消息

cursor 可以帮助您生成有意义的提交消息,您只需点击一下。以下是如何使用此功能:

generate-commit-message

  1. 暂存要提交的文件
  2. 打开边栏中的 Git 标签
  3. 查找提交消息输入字段旁边的闪烁(sparkle)图标
  4. 单击 sparkle 图标以根据您的暂存更改生成提交消息

生成的提交消息将基于暂存文件中的更改和仓库的 git 历史记录。这意味着 Cursor 将分析您当前的更改和以前的提交消息,以生成适合上下文的消息。游标从你的提交历史中学习,这意味着如果你使用像 Conventional Commits 这样的约定,生成的消息将遵循相同的模式。

快捷键

您可以将生成提交消息功能绑定到键盘快捷键。

  1. 转到键盘快捷键 ctrl + R ctrl + S 或 ctrl + shift + P 并搜索“Open Keyboard Shortcuts (JSON)”
  2. 将以下内容添加到文件中以绑定到 ctrl + m:
{
  "key": "cmd+m",
  "command": "cursor.generateGitCommitMessage"
}
  1. 保存文件

3.7 - Notepads

在 composer 和聊天交互之间共享上下文

概述

记事本是 Cursor 中功能强大的上下文共享工具,可在 composer 和聊天交互之间弥补差距的桥梁。可以将它们看作是增强的参考文档,它超越了 .cursorrules 的功能,允许您为开发工作流创建可重用的上下文。

empty-notepad.png

记事本是思想、规则和文档的集合,可以:

  • 在开发环境的不同部分之间共享

  • 使用 @ 语法引用

  • 通过文件附件增强

  • 用作各种开发方案的动态模板

入门

  1. 单击记事本部分中的“+”按钮
  2. 给你的记事本起一个有意义的名字
  3. 添加您的内容,上下文,文件和其他相关信息,就像您在 composer 或聊天中一样。
  4. 在 composers 中引用它或使用 @ 聊天

create-notepad.png

备注:需要手工打开 View -> Open View ,然后找到 notepads ,才能显示记事本面板

关键特性

  • 上下文共享 :在 composer 和聊天之间无障碍地共享上下文

  • 附加文档和参考文件(在 .cursorrules 中不可能)

  • 动态引用 :使用 @mentions 链接到其他资源

  • 灵活的内容 :以适合您需求的方式编写和组织信息

常见用例

  1. 动态样板生成
  • 为常见代码模式创建模板
  • 存储特定于项目的脚手架规则
  • 在整个团队中保持一致的代码结构
  1. 架构文档
  • 前端规格
  • 后端设计模式
  • 数据模型文档
  • 系统架构指南
  1. 研发指导方针
  • 编码标准
  • 项目特定规则
  • 最佳实践
  • 团队约定

FAQ

我应该在记事本中写什么?

记事本非常适合:

  • 项目架构决策
  • 发展准则和标准
  • 可重用代码模板
  • 需要经常引用的文档
  • 特定于团队的惯例和规则

什么不应该写在记事本里?

避免使用记事本:

  • 临时注释或临时工作
  • 属于版本控制的信息(如 git)
  • 敏感数据或凭据
  • 经常变化的高度不稳定信息

我应该遵循特定的格式或结构吗?

虽然记事本很灵活,但我们建议:

  • 使用清晰的标题和章节
  • 包括相关的例子
  • 保持内容的重点和组织
  • 使用 markdown 格式以提高可读性
  • 必要时添加相关文件附件

示例记事本

下面是一个用于 Web 应用程序项目的记事本的典型示例:

# API Development Guidelines

## Endpoint Structure
- Use RESTful conventions
- Base URL: `/api/v1`
- Resource naming in plural form

## Authentication
- JWT-based authentication
- Token format: Bearer {token}
- Refresh token mechanism required

## Response Format
{
  "status": "success|error",
  "data": {},
  "message": "Optional message"
} 

## Attached References
@api-specs.yaml
@auth-flow.md

3.8 - 快捷键

键盘快捷键的全面指南

Cursor 中键盘快捷键和键绑定的高级概述。您可以通过按 ctrl + R 然后按 ctrl + S 查看所有键盘快捷键。

要了解更多关于 cursor 中的键盘快捷键,请查看 VS 代码的键绑定 ,因为它是 cursor 键绑定的良好基线。

cursor 的所有键绑定,包括 cursor 特定功能的键绑定,都可以在键盘快捷键设置页面中重新映射。

常规

快捷键 动作
Ctrl + I 打开 Agent
Ctrl + L 打开 Ask
Ctrl + . 切换聊天模式
Ctrl + / AI 模型之间的循环
Ctrl + Shift + J 打开 cursor 设置
Ctrl + , 打开常规设置
Ctrl + Shift + P 打开命令选项板

Chat - Agent, Edit & Ask

这些快捷方式在专注于聊天输入框时有效。

快捷键 动作
Enter 提交
Ctrl + Backspace 取消生成
Ctrl + L 已选择代码 将选定代码添加为上下文
Ctrl + Shift + L 已选择代码 将选定代码添加为上下文
Ctrl + Enter 接受所有更改
Ctrl + Backspace 拒绝所有更改
Tab 循环至下一条消息
Shift + Tab 循环到上一条消息
Ctrl + Alt + / 打开模型切换
Ctrl + N / Ctrl + R 创建新聊天
Ctrl + Shift + K 打开 composer 作为 bar
Ctrl + [ 打开以前的聊天
Ctrl + ] 打开下一个聊天
Ctrl + W 关闭聊天
Esc 取消字段的聚焦

Ctrl+K

快捷键 动作
Ctrl + K 开放
Ctrl + Shift + K 切换输入焦点
Enter 提交
Ctrl + Backspace 取消
Option + Enter 快速提问

代码选择和上下文

快捷键 动作
@ @-symbols
# 文件
/ 快捷命令
Ctrl + Shift + L 将所选内容添加到聊天
Ctrl + Shift + K 将所选内容添加到编辑
Ctrl + L 将选择添加到新的聊天
Ctrl + M 切换文件阅读策略
Ctrl + → 接受下一个建议
Ctrl + Enter 在聊天中搜索代码库
选择代码, Ctrl + C, Ctrl + V 将复制的引用代码添加为上下文
选择代码, Ctrl + C, Ctrl + Shift + V 将复制的代码添加为文本上下文

Tab

快捷键 动作
Tab 接受建议
Ctrl + → 接受下一个单词

终端

快捷键 动作
Ctrl + K 打开终端提示栏
Ctrl + Enter 运行生成的命令
Esc 接受命令

4 - Context

Cursor Context

4.1 - 代码库索引

索引代码库,以获得更准确的AI帮助和搜索结果

了解如何在Cursor中索引代码库,以获得更准确的AI帮助和搜索结果

索引代码库

为了获得更好和更准确的代码库答案,您可以索引您的代码库。在幕后,Cursor 为代码库中的每个文件计算嵌入,并将使用这些来提高代码库答案的准确性。

当项目被打开时,每个 Cursor 实例将初始化该工作空间的索引。初始索引设置完成后,Cursor 将自动为添加到您的工作区的任何新文件建立索引,以保持您的代码库上下文最新。

代码库索引的状态位于 Cursor Settings > Features > Codebase Indexing

高级设置

默认情况下,Cursor 将索引代码库中的所有文件。

您还可以展开 “Show Settings” 部分以访问更高级的选项。在这里,您可以决定是否要为新存储库启用自动索引,并配置 Cursor 在存储库索引期间将忽略的文件。

Cursor 使用与 VS Code 相同的包来处理文件忽略,这意味着它尊重所有 .gitignore 文件,包括子目录中的文件。您还可以为用户特定的忽略模式创建一个 .cursorignore 文件,您可能希望将其添加到 global.gitignore 中,以避免将其提交到存储库。

如果你的项目中有任何 AI 绝对不需要阅读的大型内容文件,忽略这些文件可以提高答案的准确性。

使用大型单体仓库

在处理包含数十万个文件的大型单体仓库时,重要的是要对索引的内容进行战略性的考虑。

  • 使用 .cursorignore 让每个开发人员配置他们在单体仓库中工作的文件夹和路径

  • 将 .cursorignore 添加到 global.gitignore

这允许每个开发人员在单体仓库中优化其特定工作区域的索引。

FAQ

我在哪里可以看到我索引的所有代码库?

目前,没有办法看到你索引的所有代码库的列表。您需要手动检查每个项目的索引状态,方法是在 Cursor 中打开项目并检查 Codebase Indexing settings。

如何删除所有代码库?

您可以从 “设置” 中删除 cursor 帐户以删除所有已索引的代码库,也可以从每个项目的“代码库索引”设置中手动删除单个代码库。目前没有办法在不删除帐户的情况下一次性删除所有代码库。

4.2 - AI规则

使用项目特定和全局规则在Cursor中自定义AI行为

使用 Cursor 中的规则,您可以控制底层模型的行为。您可以将其视为指令和/或LLMs的系统提示。

在 Cursor 内部,我们有两种主要方法来定制 AI 的行为以满足您的需求:

  • 项目规则:特定于项目的规则,存储在 .cursor/rules 目录中。当引用匹配的文件时,它们会自动包含在内。

  • 全局规则: 规则全局应用于所有项目,在 Cursor Settings > General > Rules 部分中进行配置。

在以下部分中了解有关如何使用它们的更多信息。

项目规则(推荐)

project-rules.png

项目规则提供了一个强大而灵活的系统,具有特定于路径的配置。项目规则存储在 .cursor/rules 目录中,并在项目的不同部分提供对 AI 行为的粒度控制。

它们是这样工作的

  • 语义描述:每个规则都可以包括一个关于何时应用它的描述
  • 文件模式匹配:使用 glob 模式指定规则适用于哪些文件/文件夹
  • 自动附加:引用匹配文件时可以自动包含规则
  • 以使用@file引用规则文件,允许您将多个规则链接在一起

您可以使用命令面板通过 ctrl + Shift + P > New Cursor Rule 创建新规则。通过使用项目规则,您还可以获得版本控制的好处,因为它只是一个文件

示例用例:

  • 针对某些文件类型的特定于框架的规则(例如,.tsx 文件的 SolidJS 首选项)
  • 自动生成文件的特殊处理(例如,.proto文件)
  • 自定义UI开发模式
  • 特定文件夹的代码样式和架构首选项 ​

全局规则

全局规则可以通过修改 Cursor Settings > General > Rules for AI 下的 AI 规则部分来添加。如果你想指定每个项目都应该包含的规则,比如输出语言、响应长度等,这很有用。

rules-for-ai.png

.cursorrules

为了向后兼容,您仍然可以在项目的根目录中使用 .cursorrules 文件。我们最终将在未来删除 .cursorrules,因此我们建议迁移到新的项目规则系统,以获得更好的灵活性和控制。

4.3 - @符号

用于上下文和命令的@符号

4.3.1 - 概述

Cursor 中用于上下文和命令的所有@符号概述

在 cursor 输入框中,例如 Composer、Chat 和 Cmd K中,您可以通过键入 @ 来使用 @符号。会弹出菜单显示建议列表,它将自动过滤,只显示根据您的输入最相关的建议。

Keyboard Shortcuts 键盘快捷键

您可以使用上/下箭头键浏览建议列表。您可以按 Enter 键选择建议。如果建议是一个类别,如 Files,建议将被过滤,只显示该类别中最相关的项目。

img

以下是所有可用的@符号列表:

4.3.2 - @Files

了解如何在 Cursor 的 Chat 和 Cmd+K 中使用 @ 来引用文件,以及预览和分块功能

在人工智能输入框中,如 Chat 和 Cmd K,您可以通过使用 @Files 引用整个文件。此外,如果您继续在 @ 之后键入,您将在 @Code 策略之后看到文件搜索结果。

为了确保您引用的文件是正确的文件,光标将显示文件路径的预览。当您在不同的文件夹中有多个同名文件时,这尤其有用。

实操:同名文件太多时体验很差,还是拖放吧

聊天长文件引用

在 Cursor 的聊天中,如果文件的内容太长,Cursor 会将文件分成更小的块,并根据与查询的相关性对其进行重新排序。

拖放

您可以将文件从主侧边栏拖放到 Composer、Chat 或 Cmd K 中,以将其添加为上下文。

实操:这个比较简单方便,尤其是同名文件很多时

4.3.3 - @Folders

将文件夹作为 Chat & cmd k 中的上下文,以增强 AI 对话

您可以在 Cursor 中引用整个文件夹作为上下文。当将 @Folders 与 Agent 一起使用时,它会附加目录中所有项目的列表,这允许 Agent 自己搜索内容。这使代理能够根据手头任务的需要独立地浏览和分析文件夹的内容。

实操:在 chat 窗口可以调出 files & folders:

cmd k 不行,只有 @files

4.3.4 - @Code

学习使用 @Code 符号和键盘快捷键引用代码,以便将代码添加到 chat 或编辑

要引用特定的代码段,可以使用 @Code 符号。

代码预览

与 @Files 符号类似,Cursor 将显示代码内容的预览,以便您可以验证所引用的代码是否正确。

实操:有不好代码

从编辑器

另一种添加代码片段作为上下文的方法是选择要引用的代码,然后单击 “添加到聊天”(Ctrl/Shift L)或“添加到编辑”(Ctrl/Shift K)。

这将把选定的代码段添加到聊天输入框或当前活动的 Cmd K 提示栏中。

实操:还是这个方便。

4.3.5 - @Docs

了解如何使用 @Docs 在 Cursor 中使用、添加和管理自定义文档作为上下文

Cursor 附带了一组第三方文档,这些文档被抓取、索引并准备用作上下文。您可以使用 @ 符号访问它们。你可以在这里找到我们默认的预抓取文档列表。

附录:默认的预抓取文档列表

备注:cursor 的默认的预抓取文档列表

https://raw.githubusercontent.com/getcursor/crawler/main/docs.jsonl

内容如下:

{  "name": "ASP.NET",  "crawlerStart": "https://learn.microsoft.com/en-us/aspnet/core/?view=aspnetcore-7.0",  "crawlerPrefix": "https://learn.microsoft.com/en-us/aspnet/core/"}
{  "name": "AWS Amplify",  "crawlerStart": "https://docs.amplify.aws/",  "crawlerPrefix": "https://docs.amplify.aws/"}
{  "name": "AWS CLI",  "crawlerStart": "https://docs.aws.amazon.com/cli/latest/reference/",  "crawlerPrefix": "https://docs.aws.amazon.com/cli/latest/reference/"}
{  "name": "AWS DynamoDB",  "crawlerStart": "https://docs.aws.amazon.com/dynamodb/",  "crawlerPrefix": "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/"}
{  "name": "AWS ECS",  "crawlerStart": "https://docs.aws.amazon.com/ecs/",  "crawlerPrefix": "https://docs.aws.amazon.com/ecs/latest/developerguide/"}
{  "name": "AWS Lambda",  "crawlerStart": "https://docs.aws.amazon.com/lambda/index.html",  "crawlerPrefix": "https://docs.aws.amazon.com/lambda/latest/dg/"}
{  "name": "AWS RDS",  "crawlerStart": "https://docs.aws.amazon.com/rds/",  "crawlerPrefix": "https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/"}
{  "name": "Amazon EC2",  "crawlerStart": "https://docs.aws.amazon.com/ec2/index.html",  "crawlerPrefix": "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/"}
{  "name": "Amazon S3",  "crawlerStart": "https://docs.aws.amazon.com/s3/index.html",  "crawlerPrefix": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/"}
{  "name": "Android SDK",  "crawlerStart": "https://developer.android.com/docs",  "crawlerPrefix": "https://developer.android.com/"}
{  "name": "Angular",  "crawlerStart": "https://angular.dev/overview",  "crawlerPrefix": "https://angular.dev/"}
{  "name": "Ansible",  "crawlerStart": "https://docs.ansible.com/ansible/latest/index.html",  "crawlerPrefix": "https://docs.ansible.com/ansible/latest/"}
{  "name": "Ant Design",  "crawlerStart": "https://ant.design/docs/react/introduce",  "crawlerPrefix": "https://ant.design/docs/react/"}
{  "name": "Apache Airflow",  "crawlerStart": "https://airflow.apache.org/docs/apache-airflow/stable/index.html",  "crawlerPrefix": "https://airflow.apache.org/docs/apache-airflow/stable/"}
{  "name": "Apollo GraphQL",  "crawlerStart": "https://www.apollographql.com/docs/",  "crawlerPrefix": "https://www.apollographql.com/docs/"}
{  "name": "Apple Developer Documention",  "crawlerStart": "https://developer.apple.com/documentation/",  "crawlerPrefix": "https://developer.apple.com/documentation/"}
{  "name": "Astro",  "crawlerStart": "https://docs.astro.build/en/",  "crawlerPrefix": "https://docs.astro.build/en/"}
{  "name": "Auth0",  "crawlerStart": "https://auth0.com/docs",  "crawlerPrefix": "https://auth0.com/docs"}
{  "name": "Azure Pipelines",  "crawlerStart": "https://docs.microsoft.com/en-us/azure/devops/pipelines/?view=azure-devops",  "crawlerPrefix": "https://docs.microsoft.com/en-us/azure/devops/pipelines/"}
{  "name": "Bash",  "crawlerStart": "https://www.gnu.org/software/bash/manual/bash.html",  "crawlerPrefix": "https://www.gnu.org/software/bash/manual/"}
{  "name": "BeautifulSoup",  "crawlerStart": "https://www.crummy.com/software/BeautifulSoup/bs4/doc/",  "crawlerPrefix": "https://www.crummy.com/software/BeautifulSoup/bs4/doc/"}
{  "name": "Boto3",  "crawlerStart": "https://boto3.amazonaws.com/v1/documentation/api/latest/index.html",  "crawlerPrefix": "https://boto3.amazonaws.com/v1/documentation/api/latest/"}
{  "name": "Bun",  "crawlerStart": "https://bun.sh/docs",  "crawlerPrefix": "https://bun.sh/docs"}
{  "name": "C#",  "crawlerStart": "https://learn.microsoft.com/en-us/dotnet/csharp/",  "crawlerPrefix": "https://learn.microsoft.com/en-us/dotnet/csharp/"}
{  "name": "CSS",  "crawlerStart": "https://developer.mozilla.org/en-US/docs/Web/CSS",  "crawlerPrefix": "https://developer.mozilla.org/en-US/docs/Web/CSS"}
{  "name": "Cheerio",  "crawlerStart": "https://cheerio.js.org/docs/intro",  "crawlerPrefix": "https://cheerio.js.org/docs/"}
{  "name": "CircleCI",  "crawlerStart": "https://circleci.com/docs/",  "crawlerPrefix": "https://circleci.com/docs/"}
{  "name": "Clerk",  "crawlerStart": "https://clerk.com/docs",  "crawlerPrefix": "https://clerk.com/docs"}
{  "name": "Cloudflare",  "crawlerStart": "https://developers.cloudflare.com/",  "crawlerPrefix": "https://developers.cloudflare.com/"}
{  "name": "CodeMirror",  "crawlerStart": "https://codemirror.net/docs/",  "crawlerPrefix": "https://codemirror.net/docs/"}
{  "name": "Cursor",  "crawlerStart": "https://docs.cursor.com/",  "crawlerPrefix": "https://docs.cursor.com/"}
{  "name": "Cypress",  "crawlerStart": "https://docs.cypress.io/guides/overview/why-cypress",  "crawlerPrefix": "https://docs.cypress.io/guides/"}
{  "name": "D3",  "crawlerStart": "https://d3js.org/getting-started",  "crawlerPrefix": "https://d3js.org/"}
{  "name": "Datadog",  "crawlerStart": "https://docs.datadoghq.com/",  "crawlerPrefix": "https://docs.datadoghq.com/"}
{  "name": "Deno",  "crawlerStart": "https://deno.land/manual@v1.35.0/introduction",  "crawlerPrefix": "https://deno.land/manual@v1.35.0/"}
{  "name": "DigitalOcean",  "crawlerStart": "https://docs.digitalocean.com/",  "crawlerPrefix": "https://docs.digitalocean.com/"}
{  "name": "Discord API",  "crawlerStart": "https://discord.com/developers/docs/intro",  "crawlerPrefix": "https://discord.com/developers/docs"}
{  "name": "Django",  "crawlerStart": "https://docs.djangoproject.com/en/4.2/",  "crawlerPrefix": "https://docs.djangoproject.com/en/4.2/"}
{  "name": "Django Rest Framework",  "crawlerStart": "https://www.django-rest-framework.org/api-guide/requests/",  "crawlerPrefix": "https://www.django-rest-framework.org/api-guide"}
{  "name": "Docker",  "crawlerStart": "https://docs.docker.com/",  "crawlerPrefix": "https://docs.docker.com/"}
{  "name": "Drizzle",  "crawlerStart": "https://orm.drizzle.team/docs/overview",  "crawlerPrefix": "https://orm.drizzle.team/docs/overview"}
{  "name": "ELK Stack",  "crawlerStart": "https://www.elastic.co/guide/en/elastic-stack/current/index.html",  "crawlerPrefix": "https://www.elastic.co/guide/en/elastic-stack/current/"}
{  "name": "ESBuild",  "crawlerStart": "https://esbuild.github.io/api/",  "crawlerPrefix": "https://esbuild.github.io/api/"}
{  "name": "ESLint",  "crawlerStart": "https://eslint.org/docs/latest/",  "crawlerPrefix": "https://eslint.org/docs/latest/"}
{  "name": "Elasticsearch",  "crawlerStart": "https://www.elastic.co/guide/en/enterprise-search/current/index.html",  "crawlerPrefix": "https://www.elastic.co/guide/en/enterprise-search/current/"}
{  "name": "Electron",  "crawlerStart": "https://www.electronjs.org/docs/latest/",  "crawlerPrefix": "https://www.electronjs.org/docs/latest/"}
{  "name": "Emacs",  "crawlerStart": "https://www.gnu.org/software/emacs/manual/html_node/emacs/",  "crawlerPrefix": "https://www.gnu.org/software/emacs/manual/html_node/emacs/"}
{  "name": "Expo",  "crawlerStart": "https://docs.expo.dev/",  "crawlerPrefix": "https://docs.expo.dev/"}
{  "name": "Express",  "crawlerStart": "https://expressjs.com/en/5x/api.html",  "crawlerPrefix": "https://expressjs.com/en/5x/"}
{  "name": "FFmpeg",  "crawlerStart": "https://ffmpeg.org/ffmpeg.html",  "crawlerPrefix": "https://ffmpeg.org/ffmpeg.html"}
{  "name": "Fabric.js",  "crawlerStart": "http://fabricjs.com/docs/",  "crawlerPrefix": "http://fabricjs.com/docs/"}
{  "name": "FastAPI",  "crawlerStart": "https://fastapi.tiangolo.com/tutorial/",  "crawlerPrefix": "https://fastapi.tiangolo.com/tutorial/"}
{  "name": "Firebase",  "crawlerStart": "https://firebase.google.com/docs",  "crawlerPrefix": "https://firebase.google.com/docs"}
{  "name": "Flask",  "crawlerStart": "https://flask.palletsprojects.com/en/2.3.x/",  "crawlerPrefix": "https://flask.palletsprojects.com/en/2.3.x/"}
{  "name": "Flutter",  "crawlerStart": "https://docs.flutter.dev/",  "crawlerPrefix": "https://docs.flutter.dev/"}
{  "name": "FontAwesome",  "crawlerStart": "https://fontawesome.com/docs/web/",  "crawlerPrefix": "https://fontawesome.com/docs/web/"}
{  "name": "GCP CLI",  "crawlerStart": "https://cloud.google.com/sdk/docs",  "crawlerPrefix": "https://cloud.google.com/sdk/docs"}
{  "name": "Git",  "crawlerStart": "https://git-scm.com/docs",  "crawlerPrefix": "https://git-scm.com/docs"}
{  "name": "GitHub Actions",  "crawlerStart": "https://docs.github.com/en/actions",  "crawlerPrefix": "https://docs.github.com/en/actions"}
{  "name": "GitLab CI",  "crawlerStart": "https://docs.gitlab.com/ee/ci/",  "crawlerPrefix": "https://docs.gitlab.com/ee/ci/"}
{  "name": "Go",  "crawlerStart": "https://go.dev/doc",  "crawlerPrefix": "https://go.dev/doc"}
{  "name": "Godot",  "crawlerStart": "https://docs.godotengine.org/en/stable/",  "crawlerPrefix": "https://docs.godotengine.org/en/stable/"}
{  "name": "Google Maps JS API",  "crawlerStart": "https://developers.google.com/maps/documentation/javascript",  "crawlerPrefix": "https://developers.google.com/maps/documentation/javascript"}
{  "name": "Gradle",  "crawlerStart": "https://docs.gradle.org/current/userguide/userguide.html",  "crawlerPrefix": "https://docs.gradle.org/current/userguide/"}
{  "name": "Grafana",  "crawlerStart": "https://grafana.com/docs/grafana/latest/",  "crawlerPrefix": "https://grafana.com/docs/grafana/latest/"}
{  "name": "GraphQL",  "crawlerStart": "https://graphql.org/learn/",  "crawlerPrefix": "https://graphql.org/learn/"}
{  "name": "HTML",  "crawlerStart": "https://developer.mozilla.org/en-US/docs/Web/HTML",  "crawlerPrefix": "https://developer.mozilla.org/en-US/docs/Web/HTML"}
{  "name": "Heroku",  "crawlerStart": "https://devcenter.heroku.com/categories/reference",  "crawlerPrefix": "https://devcenter.heroku.com/"}
{  "name": "Insomnia",  "crawlerStart": "https://docs.insomnia.rest/",  "crawlerPrefix": "https://docs.insomnia.rest/"}
{  "name": "Ionic",  "crawlerStart": "https://ionicframework.com/docs",  "crawlerPrefix": "https://ionicframework.com/docs"}
{  "name": "JAX",  "crawlerStart": "https://jax.readthedocs.io/en/latest/",  "crawlerPrefix": "https://jax.readthedocs.io/"}
{  "name": "JUnit 5",  "crawlerStart": "https://junit.org/junit5/docs/current/user-guide/",  "crawlerPrefix": "https://junit.org/junit5/docs/current/user-guide/"}
{  "name": "Java",  "crawlerStart": "https://docs.oracle.com/javase/8/docs/api/",  "crawlerPrefix": "https://docs.oracle.com/javase/8/docs/api/"}
{  "name": "Jenkins",  "crawlerStart": "https://www.jenkins.io/doc/",  "crawlerPrefix": "https://www.jenkins.io/doc/"}
{  "name": "Jest",  "crawlerStart": "https://jestjs.io/docs/getting-started",  "crawlerPrefix": "https://jestjs.io/docs/getting-started"}
{  "name": "Jquery",  "crawlerStart": "https://api.jqueryui.com/1.12/",  "crawlerPrefix": "https://api.jqueryui.com/1.12/"}
{  "name": "Keras",  "crawlerStart": "https://keras.io/api/",  "crawlerPrefix": "https://keras.io/api/"}
{  "name": "Kubernetes",  "crawlerStart": "https://kubernetes.io/docs/",  "crawlerPrefix": "https://kubernetes.io/docs/"}
{  "name": "LLVM",  "crawlerStart": "https://llvm.org/docs/",  "crawlerPrefix": "https://llvm.org/docs/"}
{  "name": "Langchain",  "crawlerStart": "https://python.langchain.com/docs/",  "crawlerPrefix": "https://python.langchain.com/docs/"}
{  "name": "Langchain-JS",  "crawlerStart": "https://js.langchain.com/docs/",  "crawlerPrefix": "https://js.langchain.com/docs/"}
{  "name": "Laravel",  "crawlerStart": "https://laravel.com/docs/10.x",  "crawlerPrefix": "https://laravel.com/docs/10.x"}
{  "name": "Linux Man Pages",  "crawlerStart": "https://man7.org/linux/man-pages/dir_all_alphabetic.html",  "crawlerPrefix": "https://man7.org/linux/man-pages/"}
{  "name": "MCP",  "crawlerStart": "https://modelcontextprotocol.io/introduction",  "crawlerPrefix": "https://modelcontextprotocol.io/"}
{  "name": "MLX",  "crawlerStart": "https://ml-explore.github.io/mlx/build/html/",  "crawlerPrefix": "https://ml-explore.github.io/mlx/build/html/"}
{  "name": "Material UI",  "crawlerStart": "https://mui.com/material-ui/getting-started/",  "crawlerPrefix": "https://mui.com/material-ui/"}
{  "name": "Matplotlib",  "crawlerStart": "https://matplotlib.org/stable/api/",  "crawlerPrefix": "https://matplotlib.org/stable/api/"}
{  "name": "Maven",  "crawlerStart": "https://maven.apache.org/guides/",  "crawlerPrefix": "https://maven.apache.org/guides/"}
{  "name": "Microsoft Teams",  "crawlerStart": "https://learn.microsoft.com/en-us/microsoftteams/platform/",  "crawlerPrefix": "https://learn.microsoft.com/en-us/microsoftteams/platform/"}
{  "name": "Mockito",  "crawlerStart": "https://javadoc.io/doc/org.mockito/mockito-core/latest/index.html",  "crawlerPrefix": "https://javadoc.io/doc/org.mockito/mockito-core/latest/"}
{  "name": "MongoDB",  "crawlerStart": "https://www.mongodb.com/docs/manual/",  "crawlerPrefix": "https://www.mongodb.com/docs/manual/"}
{  "name": "MySQL",  "crawlerStart": "https://dev.mysql.com/doc/",  "crawlerPrefix": "https://dev.mysql.com/doc/"}
{  "name": "NLTK",  "crawlerStart": "https://www.nltk.org/",  "crawlerPrefix": "https://www.nltk.org/"}
{  "name": "Neo4j",  "crawlerStart": "https://neo4j.com/docs/",  "crawlerPrefix": "https://neo4j.com/docs/"}
{  "name": "NestJS",  "crawlerStart": "https://docs.nestjs.com/",  "crawlerPrefix": "https://docs.nestjs.com/"}
{  "name": "Netlify",  "crawlerStart": "https://docs.netlify.com/",  "crawlerPrefix": "https://docs.netlify.com/"}
{  "name": "NextJS",  "crawlerStart": "https://nextjs.org/docs",  "crawlerPrefix": "https://nextjs.org/docs"}
{  "name": "Nginx",  "crawlerStart": "http://nginx.org/en/docs/",  "crawlerPrefix": "http://nginx.org/en/docs/"}
{  "name": "NodeJS",  "crawlerStart": "https://nodejs.org/api/",  "crawlerPrefix": "https://nodejs.org/api/"}
{  "name": "Notion",  "crawlerStart": "https://developers.notion.com/reference/",  "crawlerPrefix": "https://developers.notion.com/reference/"}
{  "name": "NumPy",  "crawlerStart": "https://numpy.org/doc/stable/",  "crawlerPrefix": "https://numpy.org/doc/stable/"}
{  "name": "Nuxt",  "crawlerStart": "https://nuxt.com/docs",  "crawlerPrefix": "https://nuxt.com/docs"}
{  "name": "OpenAI",  "crawlerStart": "https://platform.openai.com/docs/",  "crawlerPrefix": "https://platform.openai.com/docs/"}
{  "name": "OpenCV",  "crawlerStart": "https://docs.opencv.org/4.x/",  "crawlerPrefix": "https://docs.opencv.org/4.x/"}
{  "name": "PHP",  "crawlerStart": "https://www.php.net/manual/en/",  "crawlerPrefix": "https://www.php.net/manual/en/"}
{  "name": "Pandas",  "crawlerStart": "https://pandas.pydata.org/docs/",  "crawlerPrefix": "https://pandas.pydata.org/docs/"}
{  "name": "Playwright",  "crawlerStart": "https://playwright.dev/docs/intro",  "crawlerPrefix": "https://playwright.dev/docs/"}
{  "name": "Pnpm",  "crawlerStart": "https://pnpm.io/",  "crawlerPrefix": "https://pnpm.io/"}
{  "name": "PostgreSQL",  "crawlerStart": "https://www.postgresql.org/docs/current/",  "crawlerPrefix": "https://www.postgresql.org/docs/current/"}
{  "name": "Postman",  "crawlerStart": "https://learning.postman.com/docs/",  "crawlerPrefix": "https://learning.postman.com/docs/"}
{  "name": "Prisma",  "crawlerStart": "https://www.prisma.io/docs",  "crawlerPrefix": "https://www.prisma.io/docs"}
{  "name": "Puppeteer",  "crawlerStart": "https://pptr.dev/",  "crawlerPrefix": "https://pptr.dev/"}
{  "name": "PyTorch",  "crawlerStart": "https://pytorch.org/docs/stable/",  "crawlerPrefix": "https://pytorch.org/docs/stable/"}
{  "name": "Python",  "crawlerStart": "https://docs.python.org/3/",  "crawlerPrefix": "https://docs.python.org/3/"}
{  "name": "ROS",  "crawlerStart": "https://docs.ros.org/en/rolling/",  "crawlerPrefix": "https://docs.ros.org/en/rolling/"}
{  "name": "Railway",  "crawlerStart": "https://docs.railway.app/",  "crawlerPrefix": "https://docs.railway.app/"}
{  "name": "React",  "crawlerStart": "https://react.dev/reference/react",  "crawlerPrefix": "https://react.dev/reference/"}
{  "name": "Redis",  "crawlerStart": "https://redis.io/docs/",  "crawlerPrefix": "https://redis.io/docs/"}
{  "name": "Regex",  "crawlerStart": "https://www.regular-expressions.info/",  "crawlerPrefix": "https://www.regular-expressions.info/"}
{  "name": "Remix",  "crawlerStart": "https://remix.run/docs/en/main",  "crawlerPrefix": "https://remix.run/docs/"}
{  "name": "Ruby",  "crawlerStart": "https://docs.ruby-lang.org/en/master/",  "crawlerPrefix": "https://docs.ruby-lang.org/en/"}
{  "name": "Rust",  "crawlerStart": "https://doc.rust-lang.org/book/",  "crawlerPrefix": "https://doc.rust-lang.org/book/"}
{  "name": "Rust Stdlib",  "crawlerStart": "https://doc.rust-lang.org/std/",  "crawlerPrefix": "https://doc.rust-lang.org/std/"}
{  "name": "SQLite",  "crawlerStart": "https://www.sqlite.org/docs.html",  "crawlerPrefix": "https://www.sqlite.org/"}
{  "name": "Scikit-learn",  "crawlerStart": "https://scikit-learn.org/stable/",  "crawlerPrefix": "https://scikit-learn.org/stable/"}
{  "name": "Selenium",  "crawlerStart": "https://www.selenium.dev/documentation/",  "crawlerPrefix": "https://www.selenium.dev/documentation/"}
{  "name": "Sentry",  "crawlerStart": "https://docs.sentry.io/",  "crawlerPrefix": "https://docs.sentry.io/"}
{  "name": "Socket.io",  "crawlerStart": "https://socket.io/docs/v4/",  "crawlerPrefix": "https://socket.io/docs/v4/"}
{  "name": "Solidity",  "crawlerStart": "https://docs.soliditylang.org/en/latest/",  "crawlerPrefix": "https://docs.soliditylang.org/en/latest/"}
{  "name": "Spring",  "crawlerStart": "https://docs.spring.io/spring-framework/reference/",  "crawlerPrefix": "https://docs.spring.io/spring-framework/reference/"}
{  "name": "Stripe",  "crawlerStart": "https://stripe.com/docs",  "crawlerPrefix": "https://stripe.com/docs"}
{  "name": "Supabase",  "crawlerStart": "https://supabase.com/docs",  "crawlerPrefix": "https://supabase.com/docs"}
{  "name": "Svelte",  "crawlerStart": "https://svelte.dev/docs",  "crawlerPrefix": "https://svelte.dev/docs"}
{  "name": "Tailwind",  "crawlerStart": "https://tailwindcss.com/docs",  "crawlerPrefix": "https://tailwindcss.com/docs"}
{  "name": "Terraform",  "crawlerStart": "https://developer.hashicorp.com/terraform/docs",  "crawlerPrefix": "https://developer.hashicorp.com/terraform/docs"}
{  "name": "Three.js",  "crawlerStart": "https://threejs.org/docs/",  "crawlerPrefix": "https://threejs.org/docs/"}
{  "name": "Tinygrad",  "crawlerStart": "https://docs.tinygrad.org",  "crawlerPrefix": "https://docs.tinygrad.org"}
{  "name": "TypeScript",  "crawlerStart": "https://www.typescriptlang.org/docs/",  "crawlerPrefix": "https://www.typescriptlang.org/docs/"}
{  "name": "Unity",  "crawlerStart": "https://docs.unity3d.com/Manual/",  "crawlerPrefix": "https://docs.unity3d.com/Manual/"}
{  "name": "Unreal Engine",  "crawlerStart": "https://docs.unrealengine.com/5.0/en-US/",  "crawlerPrefix": "https://docs.unrealengine.com/5.0/en-US/"}
{  "name": "Vercel",  "crawlerStart": "https://vercel.com/docs",  "crawlerPrefix": "https://vercel.com/docs"}
{  "name": "Vim",  "crawlerStart": "https://vimhelp.org/",  "crawlerPrefix": "https://vimhelp.org/"}
{  "name": "Vite",  "crawlerStart": "https://vitejs.dev/guide/",  "crawlerPrefix": "https://vitejs.dev/guide/"}
{  "name": "Vitest",  "crawlerStart": "https://vitest.dev/guide/",  "crawlerPrefix": "https://vitest.dev/guide/"}
{  "name": "Vue",  "crawlerStart": "https://vuejs.org/guide/introduction.html",  "crawlerPrefix": "https://vuejs.org/guide/"}
{  "name": "Webpack",  "crawlerStart": "https://webpack.js.org/concepts/",  "crawlerPrefix": "https://webpack.js.org/concepts/"}
{  "name": "Zsh",  "crawlerStart": "https://zsh.sourceforge.io/Doc/",  "crawlerPrefix": "https://zsh.sourceforge.io/Doc/"}
{  "name": "help",  "crawlerStart": "https://docs.cursor.com/get-started/welcome",  "crawlerPrefix": "https://docs.cursor.com/"}

140 多个常用的文档。

添加自定义文档

如果您想抓取和索引尚未提供的自定义文档,您可以通过 @Docs > Add new doc 来完成。

实操:调出菜单

在您粘贴所需文档的 URL 后,

将出现以下模式:

实操: confirm 之后会报错,因为 entrypoint 强制要求是一个以文件介绍的 url,而不是 https://www.docsy.dev/docs/ 这种目录形式的 url。

在路径后面加入 index.html 之后,就可以正常抓取了。

https://www.docsy.dev/docs/index.html

然后 Cursor 将索引并学习文档,您将能够像任何其他文档一样将其用作上下文。

如果要索引所有子页面和子目录,请确保在 URL 后面添加一个斜杠

实操:能看到索引的具体的页面

实操:通过 @Docs 调出

管理自定义缓存

在 Cursor Settings > Features > Docs 下,您将看到您添加的文档。您可以在此处编辑、删除或添加新文档。

4.3.6 - @Git

了解如何在 Cursor 的 Chat 中使用 @Git 分析差异、查找 bug 并生成提交消息

目前,@Git 仅在 Chat & Composer 中支持

在 Cursor 的 Chat 中,您可以使用 @Git 将 git commits、diffs 或 pull requests 添加到提示词中。

常见用例

@Git 的一个常见用例是允许 Cursor 的 AI 扫描差异并查找可能由差异引起的错误或问题。

您还可以使用 @Diff of Working State 从当前的差异生成提交消息。

实操: 生成的 commit message 还是很不错的,可以参考。

咨询 ai 得到的用法

我来为您解释 Cursor 中 @Git 的使用方法:

根据文档内容,@Git 是 Cursor 中一个强大的功能,目前仅在 Chat 和 Composer 中可用。以下是主要用途:

  1. 代码差异分析

    • 您可以使用 @Git 来分析代码的变更(diffs)
    • AI 可以帮助扫描这些变更,找出潜在的问题或 bug
  2. 提交消息生成

    • 使用 @Diff of Working State 命令可以基于当前的代码变更自动生成 git commit 消息
  3. 代码审查

    • 可以将 git commits、diffs 或 pull requests 添加到对话中
    • AI 可以帮助分析这些变更的影响

使用步骤:

  1. 在 Cursor 的 Chat 界面中
  2. 输入 @Git 或相关命令
  3. 选择您想要分析的内容(比如某个 commit 或当前的代码变更)

这个功能特别适合:

  • 代码审查时快速发现潜在问题
  • 自动生成规范的提交信息
  • 分析代码变更的影响范围

需要注意的是,目前这个功能仅限于 Chat 和 Composer 环境中使用。

如果您想了解更多具体的使用场景或详细信息,建议您尝试在 Cursor 中实际操作一下这些功能。

4.3.7 - @Web

@Web 命令自动搜索互联网,以查找 cursor 查询的相关上下文

@Web

使用 @Web,Cursor 根据查询和您提供的上下文构造搜索查询,并搜索 Web 以查找相关信息作为附加上下文。

这可能有助于 Cursor 在线查找最新信息,或者允许 Cursor 在几秒钟内抓取多个网站以找到最佳答案,而无需用户手动搜索任何地方。

实操:咨询明天的上海天气,给了最新的信息(2025-03-28号的天气信息),列出了三个网站。但很奇怪,答复中的明天写的是 2025-03-05,给的三个URL显示的28号的天气。

当使用 agent 模式时,Cursor 将在需要最新信息或其他上下文时自动搜索 Web。

4.3.8 - @Definitions

使用 @Definitions 符号将附近的代码定义添加到 Cmd K 上下文

此功能目前仅适用于 Cmd K。

@Definitions 符号将所有附近的定义作为上下文添加到 Cmd K。

4.3.9 - @Link

通过链接到外部网站和资源,将 Web 内容用作上下文

粘贴链接

为了让 cursor 在粘贴链接之前访问一个链接,你会看到这个链接是“标记”的。

实操:复制了一个链接 https://www.docsy.dev/docs/adding-content/shortcodes/ 到 chat 中,可以看到链接前面加了一个 @,我让它总结一下:

删除链接

默认情况下,我们会自动解析链接并将其转换为聊天中的 @Links 。如果您希望链接为纯文本,请单击链接,然后单击 “取消链接 ”。

实操:单击一下链接就有取消链接的 unlink 按钮了

您也可以不带格式地粘贴以确保链接未被标记。

实操:windows下是 control + Shift + v 无格式粘贴

4.3.10 - @Lint Errors

访问和引用代码库中的 linting 错误

@Lint Errors 符号自动捕获并提供有关当前活动文件中的任何 lint 错误和警告的上下文。

默认情况下 ,Composer 和 Agent 可以看到 lint 错误:

咨询 cursor 给出的答复

让我帮您了解关于 @Lint Errors 的更多信息。我会先搜索相关代码来了解更多细节。

根据搜索结果,我来为您详细解释 Cursor 中的 @Lint Errors 功能:

@Lint Errors 是 Cursor 中的一个重要功能,主要用于:

  1. 基本功能

    • 自动捕获并提供当前活动文件中的任何 lint 错误和警告的上下文
    • 默认情况下,Composer 和 Agent 模式可以看到 lint 错误
  2. 智能修复

    • Cursor 让 AI 可以直接访问代码库中的 linter
    • 当检测到已安装的 Linter 标记的问题时,AI 可以智能地尝试自行修复这些问题
    • 这意味着您将始终获得干净、兼容的代码,而无需手动检查和修复任何问题
  3. 使用场景

    • 在编写代码时自动检测和修复代码规范问题
    • 在代码审查时快速发现潜在问题
    • 确保代码质量和一致性
  4. 注意事项

    • 某些语言(如 Rust)要求在 lint 错误出现之前保存文件,这可能会限制此功能在所有语言中的有效性
    • 该功能主要在 Chat 和 Composer 环境中使用
  5. 与其他功能的集成

    • 与 Tab 功能集成:Tab 可以根据您最近的更改和 linter 错误提出建议
    • 与 Agent 模式集成:Agent 可以自动检测和修复 lint 错误

这个功能是 Cursor 中代码质量控制的重要组成部分,可以帮助开发者保持代码质量,减少手动检查的工作量。

4.3.11 - @Recent Changes

访问和引用工作区中的最新更改

cursor 会自动跟踪最近对代码库所做的更改。@Recent Changes 符号允许您将这些修改作为上下文传递。

实操:让 cursor 总结一下最近对代码库所做的更改。

4.3.12 - @Cursor Rules

在项目中使用和引用 cursor 规则

@Cursor Rules 符号提供对您为项目设置的项目规则和指导方针的访问,允许您将它们显式应用到上下文。

实操:需要先创建规则

4.3.13 - @Notepads

在 cursor 中引用并包含记事本作为上下文

@Notepads 符号允许您在对话中引用和包含您的 Notepads 作为上下文。记事本是功能强大的上下文共享工具,可以在编写器和聊天交互之间架起差距的桥梁,允许您为开发工作流创建可重用的上下文。

实操:TODO

4.3.14 - @Summarized Composers

在新的对话中引用以前 Composer 会话的摘要版本作为上下文

在 Composer 中处理复杂任务时,您可能希望引用上下文或以前对话中的决策。@Summarized Composers 符号允许您将以前 Composer 会话的摘要版本作为上下文包含在内。

这在以下情况下特别有用:

  • 您有一个很长的 Composer 会话,其中包含要引用的重要上下文
  • 你开始了一项新的但相关的任务,并希望保持连续性
  • 你想分享上一次会议的推理或决定

cursor 的解释

根据文件内容,我来为您解释 @-summarized-composers 符号的功能:

@-summarized-composers 是一个用于在 Cursor IDE 中引用历史 Composer 会话摘要的特殊符号。它的主要用途包括:

  1. 上下文引用:允许您在新的对话中引用之前 Composer 会话的摘要版本作为上下文。

  2. 使用场景

    • 当您有一个很长的 Composer 会话,其中包含需要引用的重要上下文时
    • 当您开始一个新的但相关的任务,需要保持连续性时
    • 当您需要分享上一次会议的推理或决定时
  3. 优势

    • 帮助保持对话的连续性
    • 避免重复之前的讨论
    • 方便引用历史决策和推理过程

这个功能对于处理复杂任务特别有用,因为它可以帮助您在不同会话之间保持上下文的连贯性,同时避免重复之前已经讨论过的内容。

4.3.15 - @Files

使用 # 选择文件,使用 @ 在与 AI agent 聊天时进行上下文控制

使用 # 后跟文件名来关注特定文件。将其与 @ 符号结合,以实现精确的上下文控制。

4.3.16 - /command

使用 / 引用打开的编辑器选项卡,并在使用 AI agent 编写聊天时将其作为上下文添加

您可以键入 / 来快速引用打开的编辑器并将其添加为上下文

  • 打开编辑器 :当前打开所有编辑器选项卡
  • 活动编辑器 :视图中的所有编辑器选项卡。这通常发生在分割布局以显示多个编辑器时

实操:菜单和文档有些小的出入

  • “Add open files to context” : 是把所有打开的文件都添加到上下文
  • “Add active files to context” : 是把当前视图中的文件添加到上下文

4.4 - 忽略文件

了解如何使用 .cursorignore 和 .cursorindexingignore 在 Cursor 中控制文件访问和索引

概述

Cursor 提供了两个不同的忽略文件来控制文件的处理方式:

  • .cursorignore:尽最大努力从 AI 功能和索引中排除文件

  • .cursorindexingignore:仅控制为搜索和上下文索引哪些文件(与旧的 .cursorignore 相同)

.cursorignore

.cursorignore 文件会尽最大努力将文件从 AI 功能和索引中排除。这对于以下情况很有用:

  • 试图从 AI 访问和索引中排除敏感文件

  • 排除包含机密的配置文件

  • 限制对专有代码的访问

.cursorignore 中列出的文件将以最佳方式从 Cursor 的 AI 功能中排除:

  • 不包含在标签页和聊天请求中

  • 未包含在 AI 功能的上下文中

  • 未为搜索或上下文功能编制索引

  • 通过@-symbols 或其他上下文工具不可用

.cursorindexingignore

.cursorindexingignore 文件仅控制为搜索和上下文功能索引哪些文件。这提供了与旧的 .cursorignore 相同的索引控件。当您需要执行以下操作时,请使用此文件:

  • 从索引中删除生成的大型文件

  • 跳过二进制文件的索引

  • 控制代码库的哪些部分可搜索

  • 优化索引性能

重要提示:.cursorindexingignore 中的文件仍然可以作为上下文手动包含或通过 AI 功能访问-它们不会自动索引或包含在搜索结果中。

默认索引忽略文件

仅对于索引,除了在 .gitignore、.cursorignore 和 .cursorindexignore 文件中指定的文件外,默认情况下还忽略以下文件。请注意,这些默认文件仅适用于索引,而不适用于其他 AI 功能。

package-lock.json
pnpm-lock.yaml
yarn.lock
composer.lock
Gemfile.lock
bun.lockb
.env*
.git/
.svn/
.hg/
*.lock
*.bak
*.tmp
*.bin
*.exe
*.dll
*.so
*.lockb
*.qwoff
*.isl
*.csv
*.pdf
*.doc
*.doc
*.xls
*.xlsx
*.ppt
*.pptx
*.odt
*.ods
*.odp
*.odg
*.odf
*.sxw
*.sxc
*.sxi
*.sxd
*.sdc
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tif
*.mp3
*.wav
*.wma
*.ogg
*.flac
*.aac
*.mp4
*.mov
*.wmv
*.flv
*.avi
*.zip
*.tar
*.gz
*.7z
*.rar
*.tgz
*.dmg
*.iso
*.cue
*.mdf
*.mds
*.vcd
*.toast
*.img
*.apk
*.msi
*.cab
*.tar.gz
*.tar.xz
*.tar.bz2
*.tar.lzma
*.tar.Z
*.tar.sz
*.lzma
*.ttf
*.otf
*.pak
*.woff
*.woff2
*.eot
*.webp
*.vsix
*.rmeta
*.rlib
*.parquet
*.svg
.egg-info/
.venv/
node_modules/
__pycache__/
.next/
.nuxt/
.cache/
.sass-cache/
.gradle/
.DS_Store/
.ipynb_checkpoints/
.pytest_cache/
.mypy_cache/
.tox/
.git/
.hg/
.svn/
.bzr/
.lock-wscript/
.Python/
.jupyter/
.history/
.yarn/
.yarn-cache/
.eslintcache/
.parcel-cache/
.cache-loader/
.nyc_output/
.node_repl_history/
.pnp.js/
.pnp/

文件格式

这两个文件使用与 .gitignore 相同的语法。以下是一些示例:

基本模式

# Ignore all files in the `dist` directory
dist/

# Ignore all `.log` files
*.log

# Ignore specific file `config.json`
config.json

高级模式

只在 app 目录中包含 *.py 文件:

# ignore everything
*
# do not ignore app
!app/
# do not ignore directories inside app
!app/*/
!app/**/*/
# don't ignore python files
!*.py

故障排查

ignore 文件的语法完全遵循 .gitignore。如果您遇到问题:

  1. 在搜索查询中将 “cursorignore” 替换为 “gitignore”
  2. 为类似模式检查 Stack Overflow
  3. 使用 git check-ignore -v [file] 测试模式以了解匹配

常见问题:

  • 模式相对于 ignore 文件位置进行匹配

  • 后来的模式覆盖了以前的模式

  • 目录模式需要一个尾随斜杠

  • 否定模式(!)必须否定以前的模式

4.5 - 模型上下文协议

了解如何在 Cursor 中添加和使用自定义 MCP 工具

什么是 MCP?

模型上下文协议(Model Context Protocol / MCP) 是一个开放的协议,它描述了应用程序如何向 LLMs 提供上下文和工具。可以将 MCP 看作 Cursor 的插件系统-它允许您通过标准化接口将 Agent 连接到各种数据源和工具,从而扩展 Agent 的功能。

要了解有关 MCP 的更多信息,请访问官方 MCP 文档,深入了解协议:

https://modelcontextprotocol.io/introduction

使用

MCP 允许您将 Cursor 连接到外部系统和数据源。这意味着您可以将 Cursor 与现有的工具和基础设施集成,而不必在代码本身之外告诉 Cursor 项目的结构。

MCP 服务器可以用任何可以打印到标准输出或服务于 HTTP 端点的语言编写。这种灵活性允许您使用首选的编程语言和技术堆栈非常快速地实现 MCP 服务器。

示例

  • 数据库: 允许 Cursor 直接查询数据库,而不是手动输入模式或自己操作数据。

  • notion: 从 notion 中读取数据以引导 cursor 实现功能

  • GitHub: 让 Cursor 创建 PR、创建分支、查找代码等

  • Memory: 允许 cursor 在您工作时记住和调用信息

  • Stripe: 允许 Cursor 创建客户、管理订阅等

疑问: 这些 example 在哪里啊?没有链接

架构

MCP 服务器是通过标准化协议公开特定功能的轻量级程序。它们充当 cursor 和外部工具或数据源之间的中介。

cursor 支持 MCP 服务器的两种传输类型:

  • stdio Transport

    • 在本地计算机上安装
    • 由光标自动管理
    • 通过标准输出直接通信
    • 仅限您在本地访问

    输入:Cursor 自动运行的有效 shell 命令

    对于 stdio 服务器,该命令应该是 Cursor 可以运行的有效 shell 命令。

  • SSE Transport

    • 可以在本地或远程运行
    • 由您管理和运营
    • 通过网络进行通信
    • 可以跨机器共享

    输入: 指向 Cursor 外部 MCP 服务器的 /sse 端点的 URL

    对于 SSE 服务器,URL 应该是 SSE 端点的 URL,例如 http://example.com:8000/sse

每种传输类型都有不同的用例,stdio 对于本地开发来说更简单,而 SSE 为分布式团队提供了更大的灵活性。

配置 MCP 服务器

MCP 配置文件使用 JSON 格式,结构如下:

// 该示例演示了使用 stdio 格式的 MCP 服务器
// Cursor 会自动为您运行该进程 
// 该示例使用 Node.js 服务器,使用 `npx` 运行
{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "mcp-server"],
      "env": {
        "API_KEY": "value"
      }
    }
  }
}
// 本例演示了使用 stdio 格式的 MCP 服务器
// Cursor 会自动为您运行该进程
// 该示例使用 Python 服务器,用 `python` 运行
{
  "mcpServers": {
    "server-name": {
      "command": "npx",
      "args": ["-y", "mcp-server"],
      "env": {
        "API_KEY": "value"
      }
    }
  }
}
// 本例演示了使用 SSE 格式的 MCP 服务器
// 用户应手动设置和运行服务器
// 可以联网,让其他人也能访问它
{
  "mcpServers": {
    "server-name": {
      "url": "http://localhost:3000/sse",
      "env": {
        "API_KEY": "value"
      }
    }
  }
}

env 字段允许您指定 MCP 服务器进程可用的环境变量。这对于管理 API 密钥和其他敏感配置特别有用。

配置位置

您可以将此配置放置在两个位置,具体取决于您的用例:

  • 项目配置

    对于特定于项目的工具,请在项目目录中创建 .cursor/mcp.json 文件。这允许您定义仅在特定项目中可用的 MCP 服务器。

  • 全局配置

    对于要在所有项目中使用的工具,请在 home 目录中创建一个 ~/.cursor/mcp.json 文件。这使得 MCP 服务器在您的所有 Cursor 中可用。

在 Agent 中使用 MCP 工具

Composer Agent 将自动使用 MCP 设置页面上的可用工具下列出的任何 MCP 工具(如果确定它们相关)。要有意地提示工具的使用,只需告诉代理使用该工具,通过名称或描述来引用它。

工具批准

默认情况下,当代 agent 要使用 MCP 工具时,它将显示一条消息,要求您批准。您可以使用工具名称旁边的箭头展开消息,并查看 agent 使用哪些参数调用工具。

Yolo 模式

您可以启用 Yolo 模式,以允许 agent 自动运行 MCP 工具,而无需批准,类似于终端命令的执行方式。阅读更多关于 Yolo 模式和如何启用它在这里 .

工具响应

当使用工具时,cursor 将在聊天中显示响应。此图像显示了示例工具的响应,以及工具调用参数和工具调用响应的扩展视图。

限制

MCP 是一个非常新的协议,仍处于积极的发展中。有一些已知的警告要注意:

  • 工具数量: 一些 MCP 服务器,或用户与许多 MCP 服务器活动,可能有许多工具可供 cursor 使用。目前,Cursor 只会将前 40 个工具发送给 agent。

  • 远程开发: Cursor 直接从本地机器与 MCP 服务器通信,可以直接通过 stdio 或使用 sse 通过网络。因此,当通过 SSH 或其他开发环境访问 Cursor 时,MCP 服务器可能无法正常工作。我们希望在未来的版本中改进这一点。

  • mcp 资源:MCP 服务器提供两种主要功能:工具和资源。今天,Cursor 中提供了工具,允许 Cursor 执行 MCP 服务器提供的工具,并在其后续步骤中使用输出。但是,Cursor 中还不支持资源。我们希望在未来的版本中添加资源支持。

5 - 设置

Cursor 设置

5.1 - 模型

Cursor 提供多种前沿模型,可与 Chat 和 ⌘K 不同的定价层配合使用

https://docs.cursor.com/settings/models

可用模型

要将模型添加到 chat 和 ⌘K 选择菜单,请从 Cursor Settings > Models 中启用它。

Model Provider Premium Agent Price 6
claude-3.7-sonnet Anthropic $0.04
claude-3.7-sonnet MAX 1 Anthropic $0.05
claude-3.5-sonnet Anthropic $0.04
claude-3.5-haiku 2 Anthropic $0.01
claude-3-opus 3 Anthropic $0.10
cursor-small Cursor Free
deepseek-v3 Fireworks Free
deepseek-r1 Fireworks $0.04
gemini-2.5-pro-exp Google $0.04
gemini-2.0-pro-exp Google $0.04
gpt-4o OpenAI $0.04
gpt-4o-mini 4 OpenAI Free
gpt-4.5-preview OpenAI $2.00
o1 OpenAI $0.40
o1-mini 3 OpenAI $0.10
o3-mini 2, 5 OpenAI $0.01
grok-2 xAI $0.04

表格中的批注内容:

  1. 工具调用按请求收费
  2. 按1/3请求计费
  3. 付费计划每天包含10次请求
  4. 免费计划每天500次请求
  5. 需要高推理能力
  6. 长上下文窗口请求的价格更高

高级模型

高级模型可以与每月 Pro 或 Business 订阅中包含的 500 个请求一起使用。

一旦您用完了每月 500 个请求,Cursor 将继续为您提供高级模型请求,但可能会延迟响应时间和/或在平台高负载时限制对某些模型的访问。

为了避免延迟和有限的访问,您可以从设置中为高级模型启用基于使用的定价,并在用完每月 500 的配额后按请求支付。

代理模型

代理模型可以与 chat 的代理模式一起使用。这些模型在进行工具调用方面能力很强,并且在 Agent 中表现最好。

提交一个包含最多 25 个工具调用的代理提示符将消耗一个请求。如果您的请求超过 25 个工具调用,Cursor 将询问您是否要继续,这将消耗第二个请求。

非高级模型

那些未指定为高级的型号是按需付费的,可以通过从设置启用基于使用的定价来使用。500 montly 请求不能用于这些模型。

MAX

MAX 模式下提供的模型具有更大的上下文窗口和扩展推理的增强功能。

MAX 模式目前作为 Claude 3.7 Sonnet 的一个选项提供,它提供了一个 200k 的令牌上下文窗口,200 个代理工具调用限制,以及每个文件读取操作处理多达 750 行的能力。

当作为代理操作时,MAX 模式下的每个工具调用除了初始提示请求外,还作为单独的请求收费。

选择模型

chat 和 ⌘K 中的输入界面包括一个模型选择菜单,其中列出了从 Settings > Models 中启用的模型。

备注:chat 界面的设置如图,必须在开始 chat 之前才能设置。要更换模型,需要新开一个 chat。

备注:cmd + k 界面的设置如图,在 cmd + k 调出界面后就可以设置了。

自动选择

启用 Auto-select 可将 Cursor 配置为根据当前需求选择最适合当前任务并具有最高可靠性的高级型号。此功能可以检测输出性能下降,并自动切换模型以解决问题。

Thinking

开启 thinking 将模型列表限制为推理模型,这些模型逐步思考问题,并具有更深层次的能力来检查自己的推理和纠正错误。

这些模型通常在复杂的推理任务上表现更好,尽管它们可能需要更多的时间来生成响应。

上下文窗口

上下文窗口是 LLM 可以同时考虑的文本和代码的最大跨度,包括输入提示和模型生成的输出。

Cursor 中的每个 chat 会话都维护自己的上下文窗口。会话中包含的提示、附加文件和响应越多,上下文窗口就越大。

随着聊天会话的进行,Cursor 会主动优化上下文窗口,智能地修剪非必要内容,同时保留关键代码和会话元素。

为获得最佳效果,建议您采用基于目的的聊天会话管理方法,为每个独特的任务启动一个新会话。

大上下文和定价

大上下文模式允许 Cursor 在每个会话中处理更多的文本和代码,处理更大的文件和复杂的任务,同时保持关键的上下文。

与标准上下文会话相比,使用大型上下文会使请求价格翻一番 。这种定价反映了处理和分析大量信息所需的计算资源增加。

可以通过两种方式启用大上下文:

  • 通过从 Settings > Features 中检查 “Large context” 手动设置

  • 当聊天会话变长和/或包含大型文件附件时自动执行;在这种情况下,输入界面中将显示一个图标来指示大型上下文费用

您可以从设置页面真实的监控每个请求的成本。

上下文窗口大小

Mode Context Window
Agent: claude-3.7-sonnet MAX 200,000 tokens
Agent: claude-3.7-sonnet 120,000 tokens
Agent: Other Models 60,000 tokens
⌘K 10,000 tokens

随着 Cursor 进一步优化其上下文功能,这些阈值可能会发生变化。

模型托管

模型由模型的提供商、受信任的合作伙伴或 Cursor 托管在美国的基础设施上。

当从设置中启用隐私模式(Privacy Mode)时,cursor 或模型提供程序将存储您的数据,并在处理每个请求后删除所有数据。有关详细信息,请参阅我们的隐私 、 隐私政策和安全页面。

备注:在 cursor settings > general 中可以设置隐私模式。

5.2 - API Keys

了解如何在 Cursor 中为 OpenAI、Anthropic、Google 和 Azure LLM 提供商使用您自己的 API key

Cursor 允许您为各种 LLM 提供商输入自己的 API 密钥,以便以自己的成本发送尽可能多的 AI 消息。当使用客户 API key 时,我们将在调用 LLM 提供程序时使用该密钥。

若要使用您自己的 API 密钥,请前往 Cursor Settings > Models,然后输入您的 API 密钥。然后,点击“验证”按钮。一旦您的密钥通过验证,您的 API 密钥将被启用。

FAQ

我的 API 密钥会被存储还是会离开我的设备?

您的 API 密钥将不会被存储,但它将与每个请求一起发送到我们的服务器。所有的请求都通过我们的后端路由,我们在那里做最后的提示建设。

支持哪些自定义LLM提供程序?

Cursor 仅支持与 OpenAI API 格式(如 OpenRouter)兼容的 API 提供程序。我们不提供对自定义本地 LLM 设置或其他 API 格式的支持。如果您遇到的自定义 API 设置问题不是来自我们支持的提供商,我们很遗憾无法提供技术支持。