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

给它头文件, 如何让它调用该头文件对应的库?

生成代码的时候自动调用这个库

其实可以配合lsp,更加精准

试用了一下,感觉不太喜欢 来回在两个buffer 间切换,总感觉跟emacs 配合的不太好。

比如我想 重构当前函数的内容,我需要先新开一个 aider buffer ,此时光标来到aider buffer, 然后又需要重新回到原buffer重新选中当前函数再操作。

我琢磨着开一个aider session, 应该让用户看到它确实开了。就好像开python session也会开buffer一样。它启动的时候也会汇报各种启动参数

一般来说 开了以后可以用很久不需要关的

如果你想让它不切换buffer 请试试看把aider-run-aider函数里Switch to the buffer那行comment掉

刚看到一个新包,看了下,也提供了几个命令 用于把当前文件、选中内容作为prompt 的命令,有兴趣也可以试下。

;; Suggested Key bindings:
;; (global-set-key (kbd "C-c g c") #'corsair-open-chat-buffer)                    ;; Open chat buffer
;; (global-set-key (kbd "C-c g a c") #'corsair-accumulate-file-path-and-contents) ;; Accumulate file path and contents
;; (global-set-key (kbd "C-c g a n") #'corsair-accumulate-file-name)              ;; Accumulate file name
;; (global-set-key (kbd "C-c g a v") #'corsair-accumulate-file-path)              ;; Accumulate file path
;; (global-set-key (kbd "C-c g a w") #'corsair-accumulate-selected-text)          ;; Accumulate selected text
;; (global-set-key (kbd "C-c g a D") #'corsair-drop-accumulated-buffer)           ;; Drop chat buffer
;; (global-set-key (kbd "C-c g f") #'corsair-insert-file-or-folder-contents)      ;; Insert file or folder contents
1 个赞

我想应该把.h和.c都加进去吧 然后和他说想生成某个函数 有可能要说具体一些 比如为某个函数头生成实现

有的库没有对应的源码, 比如第三方sdk的库, 只有头文件, 库的二进制文件, 还有文档, 这种库AI能用起来吗? 感觉好像挺麻烦的

哦… 你的目的是想让AI去生成新代码 其中调用某个具体实现不可见的函数 是吧

我自己用GitHub copilot和ChatGPT 的经验觉得是有可能的。可以让AI去参考代码中已经调用那个函数地方的相关代码 来生成新的 如果之前代码中调用的地方有注释 也会有帮助。

在给AI的指示当中也可以描述需要调用某个函数来做什么的提示

虽然可能是可行的 不过我觉得AI还是在生成用公开api来做事的代码上做得更好一些 因为在公开api上它有更多的训练数据

明白了.

还有个问题, aider生成或修改代码有中间过程吗? 还是将最终结果瞬间呈现?

比如很多ai的交互是一个字符一个字符输出

stream模式的

针对新的插件, 比较新的功能, 大佬们能否录个视频演示一下, 使用方法, 体验, 效果等, 一目了然

这两天刚体验了cursor编辑器, 交互体验挺不错

你自己体验就好了, 为什么还要别人录视频呢?这些稍微看一下aider官方文档,研究一下就知道怎么用了。

1 个赞

和 cursor 不太一样的体验,这个是直接修改源代码,没有 diff 查看

不放心让aider直接改code话,个人喜欢的方式,可以使用archtect来进行对话。向aider提出修改需求,它会反馈说,计划如何如何改(diff)。如果你接受的话(Yes),它才修改。你觉得它的方案不好,可以revise对它archtect对话的具体要求重试。

我个人感觉,给出的修改需求越具体,它改得越好。有大的需求它搞不定的话,breakdown成小的,一步一步来。

就算把文件改了,其实也没什么关系,有git commit在,用magit很方便看diff。随时可以undo。

1 个赞

这个不错的,紫薯布丁

忙完了一些事情,有时间继续折腾了,正在 play with aider 中,感觉有点意思。作为颜色强迫症,下来的第一件事情是给 aider 配置好颜色 :joy:

接下来的配置考虑是拿到 emacs 主题的 face 然后作为命令行的参数动态输入给 aider。

# 3492eb for day
# f5c2ae for night
user-input-color: "#f5c2ae"
# 2d0d6e for day
# c5aef5 for night
assistant-output-color: "#c5aef5"
# use any theme from pygments
# dracula for night
# emacs for day
code-theme: dracula

需要注意的是,不能在配置中声明 light-mode: true 或者 dark-mode: true,因为它们比用户自定义的颜色有更高的优先级,导致用户的自定义颜色无法生效。

接下来是多看看大家的配置,了解下玩法,再多玩玩几天再来反馈心得和使用体会。

好像最新的提交少了(provide 'aider)

谢谢 应该是我弄错了 这就加回去

如果想要用颜色渲染,还有一个最简单的办法,就是不要用comint做后端,而是用vterm做后端。

用vterm做后端,只需要用let绑定设置如下的几个变量,就可以实现“命名空间”的隔离,和常规的vterm terminal buffer隔离开来。

开启一个 aider 的 repl buffer 需要动态绑定 vterm-shell 和 vterm-buffer-name 两个变量然后调用 vterm 函数。发送命令给 repl 需要调用的函数接口是 vterm-send-string,同时在调用函数的时候动态绑定 vterm-buffer-name 就可以了。

我就是这么做的,用 vterm 来做 ipython 和 R 的 REPL 的后端。

1 个赞

你们都买AI服务了啊?