抛砖引玉: 介绍命令行AI编程工具aider以及emacs集成aider.el

好的 谢谢!我也去试试看

晚上用 aider 的 repo-map 修复了两个bug:

sort-tab close tab经常不生效, 需要第二次才行, aider + deepseek 分析是 dolist 里面的 kill-buffer 不是同步的, 会失败, 用 mapc 替代 dolist 后修复了。

第二个 bug 是 eaf-git 里面的 delete_hunk 一直是有问题的, 导致我只能 stage_hunk 不能根据选中的 hunk 针对性的做 delete_hunk 操作。 一顿 aider 问, aider 自动写补丁全自动搞定了。

在这之前, 如果要修复这种有逻辑关联性的bug, 我需要拷贝相关代码到 poe.com 的Web界面, 做很多描述, 现在只用把相关的文件 aider /add 后, 直接问问题就好了, 确实非常方便。

2 个赞

谢谢分享 没想到aider可以修复复杂的问题 在和aider对话的时候有什么技巧吗?

就是正常问, 让aider一直改代码, 然后配合上面的 --no-auto-commits 参数, 这样AI可以一直生成 diff 文件, 我只用审查 diff 文件做测试就好了。

如果不加上 --no-auto-commits , AI每次有方案就自己写一个补丁, 中间很多方案都是不靠谱的, 就会产生很多垃圾补丁。

3 个赞

这样与aider / deepseek的交流,是需要自己额外支付一些的么?还是可以做到免费?

我是买的 OpenRouter 的收费服务, OpenRouter 基本上提供了所有著名大模型的API, 可以自由切换。

Claude 3.5 最强, 但是聊一次 0.6 ~ 1.5 元, DeepSeek 能力可以, 就是速度是 Claude 3.5 的1/3, 但是价格是一次几分钱。

2 个赞

Deepseek的模型非常便宜 太良心了。抛开可能带来的生产力提升不说 个人认为花费少量的费用去学习和实践有潜力的新的生产力工具 是值得的

嗯,看了老猫可以用来debug这么复杂的逻辑,觉得可以试试了。

Deepseek 的问题就是推理有点太慢了,可能和国内公司被卡脖子用不了很好的 GPU 有关系。有条件注册外网账号的话、可以试一下用 groq 的 llama 3.1,完全免费,而且速度极快,每秒 300+ tokens,但是高峰期限流。国内和美国有12小时时差,因此可以错峰出行。此外也可以考虑 fireworks 的 llama 模型,速度很快;每秒 100+ tokens,而且价格也非常便宜(72b 模型每百万 token 0.9刀,405b 模型每百万token 3刀)

还有一个选项就是 deepinfra 的 Qwen2.5,deepinfra 的推理速度要明显比 fireworks 和 groq 慢一些,所以不建议在 deepinfra 上用 llama。但是可以用国产的 qwen 模型如果有兴趣的话。也很便宜,每百万 token 0.35 刀。

1 个赞

加了两个功能:

  1. aider-batch-add-dired-marked-files:用户可以在 dired 缓冲区中标记多个文件(也可以是 find-name-dired的输出缓冲区),然后调用此函数批量添加多个文件。一个一个加文件有些麻烦。

  2. aider-ask-question-under-cursor:个人觉得加入文件后和aider交互询问问题(/ask)很有用,它会给出启发性建议,但并不直接修改代码。所以我加了这个函数,用户可以在某个文件,比如/aider.txt中写下想问aider的问题,并调用此命令将光标下那一行问题发送到aider session并观看回答。如果回答有用处,可以把它粘贴回aider.txt里留做笔记。如果回答不满意,可以迅速在aider.txt里修改问题,再用这个命令发过去。

PR: Feat: Add aider-ask-question-under-cursor and aider-batch-add-dired-marked-files function by tninja · Pull Request #6 · tninja/aider.el · GitHub

1 个赞

/add 可以同时添加多个文件吗? 这样就可以不用 dolist 啦

1 个赞

@tingliang 大佬, 有空给 lsp-bridge 开发一个acm补全后端不? 这样按 / 命令和 /add 文件方便很多。

确实。改成一行/add 添加多个文件了。同时这个生成的命令可以保留下来,下次操作的时候很容易add需要的文件列表。

基于这个想法,进一步增加了两个函数aider-send-line-under-cursor, 和aider-send-paragraph,它们用于把当前光标下的命令发送进aider buffer (比如先增加一批文件,然后询问关于这些文件的问题?),从而命令编辑可以在单独的文件里(比如.aider),有利于reproducibility.

1 个赞

可以用treesit提取当前函数做重构,可以看我的mind-wave实现,一般重构函数更方便,不需要复制

我对用emacs做重构实在是有些迷茫 特别是python语言 Elpy 带的重构功能很有限 用大模型做重构不能保证语义完全相同 得睁大眼睛看 完全不能像IntelliJ 那样所随意重构 treesit 可以做python语言的重构吗

我的意思是用treesit来提取当前光标函数内容发给AI

1 个赞

明白了 最近发现和aider说 我需要重构xx函数 他好像就能认识 那个选择区域重构的本意是让aider处理某个冗长函数里的一小段 如果不说明改哪个函数 他可能会改错

aider已经集成了tree-sitter https://aider.chat/2023/10/22/repomap.html

厉害啊,这样都可以搞!Emacs真是与时俱进!

(defun eaf-file-manager-send-files-to-aider ()
  (interactive)
  (let ((files (eaf-call-sync "execute_function" eaf--buffer-id "get_mark_file_names")))
    (if files
        (let ((command (concat "/add " (mapconcat 'expand-file-name files " "))))
          (aider--send-command command))
      (message "No files marked in EAF file manager."))))

(eaf-bind-key eaf-file-manager-send-files-to-aider "s" eaf-file-manager-keybinding)

给 EAF file manager 也加了一个函数。

2 个赞