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

就是正常问, 让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 个赞

想起来了, Aider这玩意是自带 tree-sitter repo-map 的, 你只用说名字, 它会主动要文件源码的, 还不习惯这么高级的玩法。

有没有人分享一下具体的用法,一个是能不能展示 diff 而不是直接修改了代码。另外一个是对话内容代码好像不能高亮?

前面 manateelazycat大牛 找出–no-auto-commits这样它就不自动commit,不过还是会改文件,但是不commit.

或者就让它产生commit,也容易看出改了啥,不喜欢就undo; 再或用/architect跟他讲,他会先给出方案,同意了他才继续改下去。

aider session代码高亮的话,确实aider在命令行下面的版本是可以高亮的…

emacs里面这个现在用的是comint buffer,默认设置高亮就没了。

我尝试了chatgpt建议的方案如下,好像不管用

(require 'ansi-color) (add-hook 'comint-output-filter-functions 'ansi-color-process-output) (add-hook 'comint-mode-hook 'ansi-color-for-comint-mode-on)

不过,在emacs里用term, 然后运行aider的话,结果是能highlight的

manateelazycat有办法吗?我的emacs lisp经验实在不够,要是有办法,请告诉我。谢谢。