在 IDE 中使用 Aider

Aider 能够监控您的文件,并对您在喜爱的 IDE 或文本编辑器中添加的 AI 注释作出响应。

在 IDE 中使用 Aider

AI 注释

如果你使用 --watch-files 参数运行 aider,它会监视仓库中的所有文件,并查找你使用喜欢的 IDE 或文本编辑器添加的任何 AI 编码指令。

具体来说,aider 会寻找以 AIAI!AI? 开头或结尾的单行注释(# … 或 // …),例如:

# 制作一个贪吃蛇游戏。AI!

# 这个方法的作用是什么 AI?

或者在 // 注释语言中…

// 编写一个蛋白质折叠预测引擎。AI!

Aider 会记录所有以 AI 开头或结尾的注释。 包含感叹号 AI! 或问号 AI? 的注释比较特殊。 它们会触发 aider 收集 所有 AI 注释并将它们作为你的指令。

  • AI! 触发 aider 修改你的代码
  • AI? 触发 aider 回答你的问题

观看上面的演示视频,了解 aider 如何在 VSCode 中处理 AI 注释。

示例

例如,如果你在代码中包含这个 AI 注释:

function factorial(n) // 实现这个函数。AI!

那么 aider 会更新文件并实现该函数:

function factorial(n) {
  if (n === 0 || n === 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

注释样式

Aider 只监视以下类型的 单行 注释:

Python 和 bash 风格

// Javascript 风格 – SQL 风格


Aider 会在所有文件中识别这些注释类型。
你可以在任何正在编辑的代码文件中使用它们,即使这些注释语法与该语言的标准语法不符。

## 多种用途

这一功能非常灵活且强大,可以用于多种场景。

### 上下文指令

你可以在需要修改的函数中添加 AI 注释,直接在需要变更的位置用上下文说明修改需求。

```javascript
app.get('/sqrt/:n', (req, res) => {
    const n = parseFloat(req.params.n);

    // 为 NaN 和小于零的情况添加错误处理。AI!

    const result = math.sqrt(n);
    res.json({ result: result });
});

多重注释

你可以添加多个不带 !AI 注释, 最后用一个带 !AI! 来触发 aider。 请注意,如果需要协调多个文件的修改, 你可以将 AI 注释分散在多个文件中。 只需最后使用 AI! 来触发 aider。

@app.route('/factorial/<int:n>')
def factorial(n):
    if n < 0:
        return jsonify(error="Factorial is not defined for negative numbers"), 400

    # AI: 重构这段代码...

    result = 1
    for i in range(1, n + 1):
        result *= i

    # ... 提取为 compute_factorial() 函数。AI!

    return jsonify(result=result)

长格式指令

你可以添加一个包含详细指令的注释块。 只需确保其中某一行以 AIAI! 开头或结尾, 以引起 aider 的注意。


# 进行以下修改:AI!

# - 添加一个标准的 main() 函数

# - 使用 Click 处理命令行参数

# - 接受 --host 和 --port 参数

# - 打印包含监听 URL 的欢迎信息

if __name__ == "__main__":
    app.run(debug=True)

将文件添加到 aider 聊天会话

无需在 aider 聊天中使用 /add 命令来添加文件,您只需在文件中添加 #AI 注释并保存即可。 添加后您可以立即撤销/删除该注释,文件仍会被加入到 aider 聊天会话中。

同时在终端使用 aider 聊天

通过 AI 注释启动修改非常有用,但有时您可能希望在此基础上进行扩展或优化。当然您可以继续使用 AI 注释来实现,但有时切换到 aider 终端聊天会更加高效。聊天会话会保留您刚才添加的 AI 注释历史,因此您可以自然地在此基础上继续工作。

您还可以通过终端中的常规 aider 聊天来使用许多更高级的功能:

  • 使用 /undo 撤销不满意的更改(虽然您也可以使用 IDE 的撤销功能回退文件历史)
  • 使用聊天模式提问或获取帮助
  • 通过 /tokens/clear/drop/reset 管理聊天上下文
    添加 AI 注释会将文件加入聊天会话。定期清理不再需要的额外上下文是个好习惯。
  • 修复代码规范及测试错误
  • 执行 shell 命令
  • 其他功能

你可以偷懒

上面的示例都展示了 AI 注释使用完整句子、正确大小写和标点等规范形式。这样做是为了便于解释 AI 注释的工作原理,但在实际使用中并非必需。

大多数 LLM 完全能够处理模糊性并推断隐含意图。这通常允许你在 AI 注释上相当”偷懒”。特别是,你可以用全小写的 aiai! 开始和结束注释,而且请求本身也可以更加简洁。下面是一些前述例子的简化版本。

当上下文已明确暗示所需操作时,可能只需要 ai! 就够了。例如,在一个充满数学函数的程序中实现阶乘函数,以下任意一种方式都可能奏效:

function factorial(n) // ai!

或者…

// add factorial() ai!

比起冗长明确的注释如”添加对 NaN 和小于零的错误处理”,你可以让 aider 推断更多请求内容。这样简单的注释可能就足够了:

app.get('/sqrt/:n', (req, res) => {
    const n = parseFloat(req.params.n);

    // add error handling ai!

    const result = math.sqrt(n);
    res.json({ result: result });
});

同样地,这个重构请求本可以用更少的词来表达,比如这样:

@app.route('/factorial/<int:n>')
def factorial(n):
    if n < 0:
        return jsonify(error="Factorial is not defined for negative numbers"), 400

    # ai refactor...

    result = 1
    for i in range(1, n + 1):
        result *= i

    # ... to compute_factorial() ai!

    return jsonify(result=result)

随着你使用 aider 和你选择的 LLM 的经验积累,你会逐渐掌握 AI 注释需要明确到何种程度。

幕后机制

Aider 会将您的 AI 注释连同代码库地图以及您添加到聊天中的所有其他代码上下文一起发送给大语言模型(LLM)。

它还会提取并高亮显示带有特定上下文的 AI 注释,向 LLM 清晰展示这些注释如何融入代码库。

以下标记为 █ 的"AI"注释可以在我已分享的代码文件中找到。
它们包含了您的指令。
请按要求进行修改。
务必从代码中移除所有这些"AI"注释!

todo_app.py:
⋮...
│class TodoList:
⋮...
│    def __init__(self):
│        """初始化一个空的任务列表"""
⋮...
│
│    def list_tasks(self):
│        """显示所有任务"""
█        # 实现这个功能。AI!
│
│def main():
│    todo = TodoList()
│
⋮...

致谢

此功能灵感来源于Override监控文件变更以寻找嵌入在//> 特定分隔符 <//中的提示的方式。


目录