系列文章:
编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客
编程AI深度实战:自己的AI,必会LangChain-CSDN博客
编程AI深度实战:给vim装上AI-CSDN博客
编程AI深度实战:火的编程AI,都在用语法树(AST)-CSDN博客
编程AI深度实战:让verilog不再是 AI 的小众语言-CSDN博客
我从 2022 年初到 2024 年年中使用 GitHub Copilot,并在 2024 年初切换到 Cursor。在此过程中,我已经测试了 Sourcegraph Cody 和 Supermaven。目前,我只将 Cursor 用于我的所有开发工作,由 Claude 3.5 Sonnet (New) 提供支持。我还计划将 Aider Chat 整合到我的工作流程中,并在 Zed Editor 支持 Windows 后密切关注它。
GitHub Copilot 时代
GitHub Copilot 通过其 AI 驱动的自动完成彻底改变了编码。尽管批评者认为它“只是一个花哨的自动完成”,但正是这种简单性使它变得强大。神奇之处不仅在于节省了几次击键 - 还在于消除了编码和文档/StackOverflow 搜索之间不断的上下文切换。
Copilot 擅长:
-
在光标位置准确建议您需要的内容
-
自然地理解代码上下文
-
回应简单的评论,例如 with accurate implementations// do xyz
-
在编码时保持流程,不中断
当 GitHub 后来添加聊天和其他集成等功能时,他们感觉自己已经被固定住了。我安装了它们,但发现自己被 ChatGPT 和 Claude 等专用聊天服务所吸引。
Enter Cursor:游戏规则改变者
Cursor 作为一个全面的解决方案出现,它改变了我处理 AI 辅助编码的方式。它的杀手锏?Ctrl+K 命令。这个简单的快捷方式支持强大的代码修改:
-
选择代码(通常是整个文件)
-
按 Ctrl+K
-
描述您要更改的内容
-
在优雅的差异视图中查看更改,其中添加的内容为绿色,删除内容为红色
-
单击即可接受或拒绝
虽然 Cursor 最初将“Copilot++”作为其自动完成解决方案,但我发现它令人困惑 - 它会同时建议不同文件位置的多个更改。我坚持在 Cursor 中使用 GitHub Copilot(这是可能的,因为 Cursor 本质上是一个 VSCode 分支)。
自动完成功能的演变
自动完成环境已经发生了重大变化:
-
Supermaven 成为 GitHub Copilot 的卓越替代品
-
Cursor 的新“Tab”功能已经明显成熟,取代了他们早期的 Copilot++
-
我现在已经删除了 GitHub Copilot 和 Supermaven,仅使用 Cursor 的 Tab 功能
其他著名球员
来源图 Cody
Cody 提供与 Cursor 类似的功能,但作为 VSCode 插件。虽然功能齐全,但它在两个关键方面存在不足:
-
与 Cursor 的 Ctrl+K 相比,代码修改的可靠性较低
-
由于 VSCode 插件限制,差异可视化受限
Zed 编辑器
由 Atom 和 Tree-sitter 背后的团队创建,Zed 凭借其内置的 AI 功能看起来很有前途。但是,它目前对 Windows 用户不可用。
当前设置和未来方向
我目前的设置是简化的:
-
所有内容的光标:
-
自动完成的 Tab 键功能
-
Ctrl+K 用于代码修改
-
聊天功能(尽管我仍然更喜欢 Claude Web 界面进行复杂的讨论)
-
Claude 3.5 Sonnet (New) 作为我的首选模型
展望未来:Cursor Composer 和 Aider
有两个工具对未来特别有趣:
Cursor Composer 显示出希望,但需要改进:
-
一次性更改多个文件
-
目前感觉有些混乱
-
需要提高运营透明度
Aider Chat 是一个令人兴奋的 CLI 替代方案:
-
成熟且开源
-
基于命令行
-
需要更深入的心智模型,但提供强大的功能
-
非常适合喜欢基于终端的工作流程的用户
深入探究
光标
标签
Cursor 的 Tab 功能是他们的代码自动完成解决方案,取代了他们早期的 Copilot++ 实现。与 GitHub Copilot 的仅插入方法不同,Tab 可以修改光标位置周围的代码,包括编辑现有行。它的工作范围为光标上方一行到光标下方两行。
您可以通过以下方式与 Tab 建议交互:
-
按 Tab 键接受
-
使用 Esc 拒绝
-
按 Ctrl/⌘ → 逐字接受
-
只需继续键入即可忽略建议
系统会监视您的击键和光标移动以提出上下文建议,但有时它会确定不需要任何建议。这有助于防止编辑过程中出现杂色。
Ctrl + K 组合键
Ctrl+K(在 macOS 上为 Cmd+K)有两个主要用途:
-
未选择文本时生成新代码
-
选择文本时修改现有代码
该命令将打开一个提示栏,您可以在其中描述要执行的作。生成后,您可以使用后续说明优化您的请求。更改显示在差异视图中,清楚地显示添加和删除。
默认情况下,Cursor 会尝试包含相关上下文,如相关文件和最近的视图,您可以使用对特定文件或代码部分的 @ 引用来补充这些上下文。
聊天
聊天界面位于主边栏对面的 AI 窗格中(使用 Ctrl/⌘ + L 切换)。每个聊天都会保留其上下文和历史记录,您可以通过以前的聊天 (Ctrl/⌘ + Alt/Option + L) 重新访问。
聊天的上下文系统通过多种机制工作:
-
默认包含当前文件(可以禁用)
-
@ 文件、文件夹、代码片段的符号引用
-
代码库搜索(Ctrl/⌘ + Enter 或 @codebase)
-
Web 搜索 (@web)
-
文档参考资料 (@docs)
-
Git 信息(提交/差异/PR 的@git)
聊天响应中生成的代码可以通过 “Apply” 按钮直接应用于您的文件,更改以 diff 格式显示。
终端 Ctrl+K
在 Cursor 的终端中,Ctrl+K 提供自然语言到 shell 命令的转换。它会考虑您最近的终端历史记录和命令上下文。可以使用 Esc 接受命令,也可以使用 Ctrl/⌘ + Enter 立即执行命令。
艾德
核心工作流程
Aider 作为命令行工具运行,可在您的终端中创建 AI 对编程环境。首先将其指向特定文件:.这些文件成为 “chat session” 的一部分,允许 AI 查看和编辑它们。aider <file1> <file2> ...
Aider 的一个关键原则是只添加需要编辑的文件 - 它通过其存储库映射系统自动从存储库中的相关文件中提取上下文。这样可以保持上下文的集中性和效率。
命令和控制
Aider 使用 / 命令系统进行作:
-
/add:将文件添加到聊天会话
-
/drop:删除文件以释放上下文
-
/diff:显示自上次消息以来的更改
-
/run:执行 shell 命令并可选择将输出添加到聊天
-
/undo:还原上次 AI 制作的 git 提交
-
/commit:提交外部编辑
-
/ask:提出问题而不进行更改
-
/architect:在进行更改之前讨论高级设计
该工具支持 Emacs 和 Vim 键绑定(使用 --vim 标志激活),并允许通过多种方法进行多行输入:
-
直接粘贴
-
使用 { 和 } 作为分隔符
-
新行的 Meta-ENTER
-
/paste用于剪贴板内容的命令
Git 集成
Git 集成是 Aider 工作流程的核心。AI 所做的每项更改都会自动提交,并显示一条描述性消息。这创建了 AI 辅助更改的清晰历史记录,并在需要时可以轻松还原修改。该命令专门用于回滚上次的 AI 提交。/undo
模型支持和聊天模式
Aider 与 GPT-4 和 Claude 3.5 Sonnet 配合得最好,但几乎可以连接到任何 LLM。它为不同的任务提供了不同的聊天模式:
-
code:直接修改代码
-
architect:在进行更改之前提出解决方案
-
ask:无需更改代码的问题和分析
-
help:工具使用指南
架构师模式特别有趣,因为它使用两个 LLM 调用 - 一个用于设计解决方案,另一个用于实现它,尽管速度较慢,但通常会产生更好的结果。
光标 vs Aider
这些工具之间的主要区别不在于它们的能力——两者都可以在 AI 的帮助下有效地修改代码——而是它们的方法和工作流程。
工作流
Cursor 直接集成到您的 IDE 中。它的功能始终可以通过键盘快捷键使用,AI 辅助感觉就像是标准 IDE 功能的扩展。这使得它特别适合以下开发人员:
-
首选 GUI 环境
-
希望将 AI 帮助无缝集成到他们的编辑器中
-
键入时需要实时建议
-
在 IDE 界面中频繁处理多个文件
Aider 采取了不同的方法,将 AI 协助视为一个重点终端会话。这更适合以下开发人员:
-
首选命令行界面
-
喜欢在专注的会议中工作,而不是持续的帮助
-
感谢每个 AI 更改的自动 git 提交
上下文管理
这两种工具处理代码库上下文的方式不同:
-
Cursor 通过其索引系统维护持久上下文,并通过其 @ 符号系统提供多种引用代码的方法
-
Aider 专注于显式文件添加和存储库映射,具有更直接但可能更精确的上下文模型
用例优化
-
Cursor 擅长在正常开发工作中进行快速编辑和实时帮助
-
Aider 在专注的结对编程课程中大放异彩,在这些课程中,你正在解决特定问题或实施计划的更改
GitHub 副驾驶
自动完成
Copilot 的核心功能是其自动完成系统。键入时,它会以重影文本的形式显示建议,这些建议可以通过 Tab 键接受、按 Esc 拒绝或继续键入来忽略。您可以使用 Alt+[ 和 Alt-](或 Mac 上的 Option+[ 和 Option-])循环显示替代建议。
这些建议来自分析当前文件、打开的编辑器和项目上下文。特别有效的是使用 comments 来获取特定的实现。编写 or 通常会为您提供与项目模式匹配的合理验证或解析代码。// validate email// parse json response
如果要一次查看多个建议,请在建议出现时按 Ctrl+Enter 以打开包含多个选项的新选项卡。要进行更精细的控制,您可以使用 Ctrl/Cmd+→ 逐字接受建议,这在建议中只有一部分与您想要的内容匹配时非常有用。
在实践中,自动完成最适合增量编码 - 添加新函数、实现接口或编写标准模式(如数据验证)。它特别擅长匹配代码库中的现有模式,这有助于保持一致性,但也可以传播现有的反模式(如果存在)。
聊天界面
在 VS Code 中,可以通过多种方式访问聊天功能:
-
按 Ctrl+Shift+I 打开专用聊天侧边栏
-
按 Ctrl+I 直接在编辑器中进行内联聊天
-
按 Shift+Ctrl+I 打开快速聊天下拉列表
要使用聊天命令:
-
在编辑器中选择一些代码
-
按 Ctrl+I 打开内联聊天
-
键入 / 可查看可用命令,如 /explain、/tests 或 /fix
-
按 Enter 键执行命令
或者,您可以右键单击所选代码,然后从上下文菜单中选择 Copilot > Explain 或 Copilot > Generate Tests。
聊天以多种方式理解上下文。它会自动看到您当前文件的内容,并可以理解选定的代码。对于较大的更改或有关多个文件的问题,您需要通过选择或打开相关文件来显式共享上下文。
与 Cursor 的聊天感觉更对话不同,Copilot 的聊天更注重任务。它最适合特定请求,例如解释代码、提出改进建议或生成测试,而不是关于体系结构或设计的开放式讨论。
GitHub 功能
Copilot 以多种方式与 GitHub 的 Web 界面集成:
对于拉取请求:
-
导航到拉取请求
-
单击页面右下角的 Copilot 图标
-
在打开的聊天面板中,您可以询问更改或获取摘要
-
对于特定的文件更改,请单击 Files Changed 选项卡,然后使用任何已更改文件旁边的 Copilot 图标
对于问题:
-
在 GitHub 上打开问题
-
单击右下角的 Copilot 图标
-
询问有关问题的问题或请求修复建议
对于探索代码库:
-
导航到任何存储库文件
-
单击文件视图右上角的 Copilot 图标
-
键入诸如 “explain this file” 或 “what does this function do” 之类的问题
-
对于特定代码部分,请先选择行,然后单击出现的 Copilot 图标
在探索不熟悉的代码或尝试了解复杂的更改时,这些集成效果最佳。PR 摘要对于快速代码审查上下文特别有用,尽管您仍然需要仔细查看实际更改。
CLI 集成
CLI 通过 GitHub 的命令行工具工作。首先,您需要:
-
安装 GitHub CLI
-
安装 Copilot 扩展gh extension install github/gh-copilot
然后,您可以使用:
例如:
gh copilot suggest "find large files in current directory" gh copilot explain "docker ps -a"
当 Copilot 建议命令时,您可以:
-
按 Enter 键直接执行
-
按 Tab 键可在执行前对其进行修改
-
按 Esc 键将其复制到剪贴板而不执行
CLI 集成对于您不经常使用的复杂 shell 命令特别有用,例如特定的 git作或系统管理任务。
IDE 支持
Copilot 通过插件跨多个 IDE 工作。在 VS Code 中,所有内容都可以通过键盘快捷键或命令面板 (Ctrl+Shift+P) 进行访问。JetBrains 实现使用其标准快捷方式:
-
Ctrl+Shift+Space 用于基本完成
-
Alt+\ 用于下一个建议
-
Ctrl+Shift+I 用于聊天
Visual Studio 使用 Alt+/ 进行内联聊天,并维护与 VS Code 类似的 UI,但使用 Microsoft 的标准键盘映射。
Neovim 集成需要在 init.vim/init.lua 中进行配置,并提供基本命令,如 :Copilot enable 和 :Copilot disable,以及您可以自定义的映射。
Copilot vs Cursor vs Aider
以增量方式编写代码时,Copilot 的自动完成功能比 Cursor 的 Tab 功能更具可预测性。它建议遵循项目模式的代码,并且很少试图过于聪明。Cursor 的建议可能更激进,有时当您只想完成当前行时,会尝试修改多行。
对于更大的更改,Copilot 无法满足这两种选择。虽然您可以使用聊天来请求更改,但没有等同于 Cursor 的 Ctrl+K 命令。您最终会复制聊天的建议并手动应用它,而 Cursor 会向您显示清晰的差异,并让您一键应用更改。Aider 通过自动 git 提交更进一步,尽管它需要切换到终端。
上下文处理因工具而异。Copilot 可以处理您打开的任何文件 - 没有明确的方法可以告诉它“将此文件用于上下文,但不要修改它”。Cursor 的 @ 引用为您提供了更多控制权,让您明确指向相关文件或函数。Aider 将文件显式添加到会话的方法是最直接的,但需要更多的设置。
选择通常取决于您的特定需求:
-
如果您主要希望在键入和跨不同 IDE 工作时完成代码,Copilot 会以非常可预测的方式执行此作。
-
如果您经常进行较大的更改并希望保留在 GUI 编辑器中,则 Cursor 的 Ctrl+K 工作流程效率更高。虽然 Cursor 的 Tab 可能更激进,但它也可能更有用。这更多的是品味问题。最棒的是您可以简单地尝试一下。Cursor 是一个 VSCode 分支,您可以安装扩展,例如 GitHub Copilot。
-
如果你想要显式的 git 集成并且不介意使用终端,Aider 可以提供更好的更改控制。这是一种不同的做事模式,但可以非常高效。
每个工具都会将您推向不同的工作流程。Copilot 鼓励以增量方式编写具有大量小补全的代码。当您规划较大的更改并使用 Ctrl+K 实现这些更改时,光标效果会更好。Aider 最适合您明确需要 AI 帮助的重点编程会话。
Cursor 的一个缺点似乎是,道听途说,它对所有查询都使用了大量的上下文,因此会消耗大量精力,而且,如果不使用本地模型,最终会赚钱(比如说像 ChatGPT 这样流行的 OpenAI 模型)。