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

嗯,看了老猫可以用来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经验实在不够,要是有办法,请告诉我。谢谢。

如果要用 ansi-color 渲染高亮, 一般是用 ansi-color-apply-on-region 函数, 看示例 color-rg/color-rg.el at e45bedec545c044accf307532b3c50dbb9ab2b66 · manateelazycat/color-rg · GitHub 但是这个要求命令行输出的字符就要带 \033 这种颜色字符才行, 要不是 ansi-color 没有用

还有就是针对 ``` 引用的代码块, 可以用 gfm-view-mode 来做语法高亮

但是我看 aider 命令行输出都是纯的文本就比较难搞了, 但是我以前开发 mind-wave 的时候发现AI的代码都是按照 markdown 格式来输出的呀, 不知道为啥 aider 都是文本输出的。

1 个赞

高亮的问题我试了试,ansi-color好像还是搞不定这个。可能aider用了某种更特殊的方法来高亮.

一个使用经验是,如果和它交谈,发现不能多add文件,比如我想让它解释某个功能怎么做的; 加一堆文件,还不如仅仅加直接相关的那个文件再问,结果好而且还便宜。

这两天试着用o1-mini,真是比以前的gpt-4o-mini贵了好多。文件加多了问个问题居然要将近$.20。

还是deepseek好,价格便宜放心用。

有一个 /read-only 的模式,在你提供文件给他参考而不是让他去修改时可以用

1 个赞

今天发现aider和gnu global配合帮助理解代码库有用 对我这种阅读代码比较困难的人有帮助

比如就针对aider自己的python代码库 可以用gnu global建立tag 然后问aider一些问题 比如 当我问aider一个代码问题的时候 aider如何处理的 调用哪些类和函数 结果的code change如何apply到我的代码里 用中文回答 aider就一步一步的讲解 把每一步哪个类哪个函数都说了

这个时候gnu global就有用了 对应的emacs插件可以从aider的回答里直接跳转到对应的类和方法看细节

具体我用的helm-gtags 插件 配合 aider.el 来读代码

2 个赞