Aider 编程伙伴

2025-12-23
6 min read

Aider 是一个基于 AI 的代码助手工具,它允许开发者通过自然语言与 AI 模型交互,直接在代码库中进行代码生成、修改和重构。它支持多种 AI 模型(包括本地和远程 API),并深度集成到开发工作流中,能够显著提升开发效率。

img

核心特性

  1. 自然语言驱动:用自然语言描述需求,Aider 会自动理解并生成或修改代码。
  2. 上下文感知:Aider 会读取项目中的相关文件(通过 repo map),确保生成的代码符合项目结构和规范。
  3. 交互式审查:所有修改都会通过 ediff 展示,开发者可以逐块审查、接受或拒绝更改。
  4. 版本控制友好:支持自动或手动提交更改,与 Git 无缝集成。
  5. 可配置性强:通过 .aider.conf.yml 文件可以灵活调整各项行为,适应不同项目需求。

适用场景

  • 快速实现新功能或修复 bug
  • 重构现有代码,提升代码质量
  • 添加测试用例和文档
  • 学习新代码库或技术栈
  • 代码审查和优化建议

工作流程

  1. 启动 Aider 并配置相关设置
  2. 使用 /add 命令添加需要编辑的文件
  3. 通过 /code 或自然语言描述需求
  4. 在 ediff 中审查 AI 生成的修改
  5. 接受合适的更改并提交到版本控制

.aider.conf.yml

aider 的配置文件,用于设置默认行为。常用的各配置项说明如下:

# 是否自动提交代码更改(建议关闭,手动控制提交)
auto-commits: false

# 保留的最大对话历史轮数,避免上下文过长
max-chat-history: 6

# 每次会话自动读取的只读文件,通常用于项目规范、约定等
read:
  - CONVENTIONS.md

# 指定忽略文件列表,语法与 .gitignore 类似
aiderignore: .aiderignore

# 是否在生成代码后自动运行 lint 检查(如 flake8、eslint 等)
auto-lint: false

# 是否在生成代码后自动运行测试
test: false

# 指定使用的 AI 模型,支持本地模型或远程 API 模型
model: deepseek/deepseek-chat

.aiderignore

指定哪些文件应该被忽略,不会包含在 repo map 中。这有助于:

  1. 排除临时文件、构建产物和依赖目录
  2. 减少 repo map 的大小,提高 AI 处理效率
  3. 避免将敏感信息(如密钥、配置文件)暴露给 AI

/ls

列出 repo map 中的文件列表,该列表应该越聚焦越好。

Repo map 应只包含与当前任务直接相关的文件,例如正在编辑的源代码、相关配置文件(package.json、build.gradle)、接口定义(.proto、OpenAPI)、关键数据模型、相关测试文件以及项目结构说明(README.md、ARCHITECTURE.md)。

保持 repo map 聚焦至关重要。AI 模型的上下文长度有限(通常 64K‑128K tokens),过大的 repo map 会占用大量 tokens,减少可用于对话和代码生成的额度,同时可能引入噪声、降低理解准确性、拖慢响应速度,并增加 API 成本。

最佳实践是:

  1. 使用 `/add` 仅添加必需文件,任务完成后及时用 `/drop` 移除不再需要的文件
  2. 利用 `.aiderignore` 排除构建产物和依赖目录,并定期通过 `/ls` 检查以确保 repo map 保持精简。

/add

将文件添加至 aider。aider 可以查看且可以编辑这些文件。
添加到 aider 的文件应该尽可能少,这有助于:

  1. 让 AI 聚焦在当前任务上,避免被无关文件分散注意力
  2. 减少输入 token 数量,从而节省宝贵的上下文空间
  3. 提高 AI 的理解和响应准确性
  4. 更有效地利用有限的上下文窗口

/drop

将文件从 aider 中移除。处理完毕一个问题后,应该及时移除无关的文件,这有助于:

  1. 让 AI 聚焦在当前任务上,避免被无关信息干扰
  2. 减少输入 token 数量,从而节省上下文空间
  3. 提高 AI 的理解和响应准确性
  4. 更有效地利用有限的上下文窗口

/context

列出当前 session 的上下文,包括:

  • 只读文件列表
  • 可编辑文件列表

/token

列出 token 信息,包括:

  • 输入的基础 token 量(repo map token、read token、add files token)
  • 当前 session 已使用的 token 量
  • 当前 session 剩余的 token 量(上下文信息在此范围内不会被截断)
  • 当前 session 上下文的最大 token 容量(DeepSeek 模型通常支持 128K 或 64K 上下文长度)

/ask

向 AI 提问,但不生成或修改代码。适用于:

  1. 询问项目相关的概念、设计思路或最佳实践
  2. 获取关于代码库的解释或文档说明
  3. 讨论实现方案而不立即执行
  4. 寻求调试建议或问题分析

/code

指示 AI 生成或修改代码。这是 aider 的核心功能,适用于:

  1. 实现新功能或修复 bug
  2. 重构现有代码
  3. 添加测试用例
  4. 编写文档字符串或注释

使用 /code 时,应尽可能明确地描述需求,并指定要修改的文件。

/commit

提交当前所有已暂存的更改。aider 会自动生成提交信息,但你可以:

  1. 使用 /commit “自定义提交信息” 来指定信息
  2. 在提交前查看 diff,确保更改符合预期
  3. 结合 auto-commits: false 配置,实现手动控制提交

/web

在浏览器中打开 aider 的 Web 界面(如果支持)。这通常用于:

  1. 查看更丰富的交互界面
  2. 使用图形化工具管理会话
  3. 访问在线文档或额外功能

/clear

清除当前的对话历史,但保留已添加到会话中的文件。这有助于:

  1. 重置 AI 的上下文,避免历史对话干扰新任务
  2. 减少 token 使用量,释放上下文空间
  3. 开始一个全新的对话分支,同时保持对相同文件的访问

/reset

完全重置当前会话,包括:

  1. 清除所有对话历史
  2. 移除所有已添加的文件(回到初始状态)
  3. 重置 token 计数器

适用于需要从头开始全新任务的情况。

ediff

aider 在修改文件后会自动启动 ediff 来展示改动差异。ediff 是 Emacs 内置的差异对比工具,可以让你逐块审查、接受或拒绝 AI 所做的修改。

基本操作

按键 功能说明
? 显示帮助信息,列出所有可用命令
q 退出 ediff 会话(不会保存任何更改)
a 将当前差异块从缓冲区 A(原始版本)复制到缓冲区 B(修改版本)
ra 撤销上一次对缓冲区 A 的操作
b 将当前差异块从缓冲区 B(修改版本)复制到缓冲区 A(原始版本)
rb 撤销上一次对缓冲区 B 的操作
n 跳转到下一个差异块
p 跳转到上一个差异块
v 垂直分割窗口查看差异(默认)
h 水平分割窗口查看差异
\ 将当前差异块在两侧缓冲区之间交换
* 将当前差异块标记为“已解决”,后续跳过该块
D 显示当前差异块的详细差异信息
E 进入编辑模式,可以直接在缓冲区中修改内容
! 执行外部 diff 命令并刷新差异显示

工作流程建议

  1. 启动时:aider 完成代码修改后会自动弹出 ediff 窗口,通常分为三个区域:

    • 左侧:原始文件(缓冲区 A)
    • 右侧:修改后的文件(缓冲区 B)
    • 底部:控制面板(显示操作提示)
  2. 审查差异:

    • 使用 `n` 和 `p` 在各个差异块之间导航
    • 仔细阅读每个差异块,确保 AI 的修改符合预期
    • 注意是否有不必要或错误的更改
  3. 接受或拒绝修改:

    • 如果接受 AI 的修改,不用做任何处理,跳过代码块
    • 如果拒绝修改,按 `a` 将左侧内容复制到右侧(保持原样)
    • 也可以直接按 `q` 退出,接受全部修改

aidermacs

aidermacs 是一个专为 Emacs 设计的 Aider 前端,它提供了更便捷的交互界面和快捷键,让开发者能够在 Emacs 中更高效地使用 Aider 进行 AI 辅助编程。通过 aidermacs,你可以快速启动 Aider 会话、管理文件、执行代码生成任务,而无需离开 Emacs 环境。

主要功能

  1. 快速启动:通过快捷键(如 `SPC d`)一键打开 Aider 交互菜单
  2. 会话管理:轻松创建、切换和关闭 Aider 会话
  3. 配置集成:支持在 Emacs 配置中直接设置 Aider 的各项参数
  4. 多后端支持:可选择使用 vterm、eshell 等终端后端运行 Aider
  5. 本地化支持:可设置聊天语言(如中文),提升交互体验

配置说明

以下是一个典型的 aidermacs 配置示例,展示了如何设置快捷键、禁用自动提交、指定中文聊天语言等:

(map! :nv  "SPC d"    'aidermacs-transient-menu              )

(use-package aidermacs
  ;; :bind (("SPC d" . aidermacs-transient-menu))
  :config
  (setq aidermacs-auto-commits nil)
  (setq aidermacs-extra-args (list "--chat-language" "zh-cn"))
  (setq aidermacs-exit-kills-buffer t)
  (setq aidermacs-backend 'vterm)
  :custom
  ; See the Configuration section below
  (aidermacs-default-chat-mode 'architect)
  (aidermacs-default-model "deepseek/deepseek-chat"))