Aidermacs:Emacs 里的 AI 代码助手,真正适配 Emacs 的 Aider 体验

我之前没看到你的eureka,有空来取取经

我写eureka最主要就是因为aider会直接修改文件,我实在是不喜欢。

eureka额外的我觉得还算可取之处的是结合lsp客户端,根据incoming calls和outgoing calls自动计算当前文件的依赖来生成(一部分)context。 Emacs其它llm工具都没有类似功能。但是这个功能实际效果有待评估,毕竟我也没太怎么用eureka。

其它的还有使用treesitter生成文件的outline,也是模仿aider。别的就没了。

Aidermacs打磨好了我完全不介意抛弃eureka切换过来,哈哈。毕竟有aider这个很好的基础。

1 个赞

今天刚修了vterm的bug,ediff可以在vterm用了。

大佬欢迎一起来玩Aidermacs呀!

不知道能不能利用 git worktree 的机制,让 aider 工作在独立的 worktree,这样就不用担心它搞乱代码了,然后 diff 的时候也(应该)会比较方便?

我最开始考虑过,集成git我怕和自带的auto-commit打架,或者和用户自己的git项目流程打架。现在的流程是:

  1. 实时监控哪些文件在当前对话框,每次发送command先给这些文件在tmp创建备份
  2. 实时监控Aider进程有没有更改文件,Aider的output结束后就把对应文件备份拎出来放到临时buffer和更改后的文件ediff
  3. ediff完成后,清理所有临时文件和临时buffer

就算集成git最后想diff也得走我现在这条路子做临时buffer来ediff(或者就看magit了),也得判断哪些更改了哪些没动,我想想就算了,目前的方案也不算太heavy

有没有考虑过使用 ediff-buffers ,这样每次不需要把文件创建临时目录并存入用户的文件系统里面,只需要把文件的内容存入一个临时 buffer 里?

有道理,确实可以简化一下,直接把文件内容放入buffer,省略写入tmp的功夫,我这两天看看。

1 个赞

我觉着这样是合理的。也比较自然。之前我就和其他人说过,aider这种形式是更适合ai的。ai能力一般的时候不方便,但随着ai能力的提高,这种形式就更合适了。甚至编辑器会沦为浏览工具,而不是写代码的工具。

1 个赞

搞定!git pull就可以体验了。

新版流程:

  1. 实时监控哪些文件在当前对话框,每次发送command先把这些文件放入临时buffer
  2. Aider的output结束后检查文件有没有更改,然后对应的临时buffer和更改后的文件ediff
  3. ediff完成后,清理所有临时buffer
2 个赞

可不可以每次启动一个 sesstion,就单独拉个分支,然后 aider 在分支上自动提交,最后从分支 merge 到主干(好像可以合并分支所有提交为一个)。这样就可以避免 aider 自动提交把主干的提交搞乱了。

理论上是可以。

这样也会形成commit,而且还是个merge commit,和aider自带的autocommit相比没啥区别,还搞得更复杂了。

其实aider的自动提交并不会真的搞乱主干,因为他不会提交他没更改的unstage内容,主要太烦了,平白多了后期rebase的工作,增加工作量。我认为如果只是想看diff,完全不需要和git高度集成,毕竟emacs有ediff这么牛逼的东西哈哈

1 个赞

看得我都想切换过来了。

我就是手动这么用的。没一个功能都新分支。然后merge -s到主干。主干上只有最后的结果。

来呀来呀,别用cursor了快回emacs吧哈哈哈哈

这样和aider autocommit完手动stash成一个commit效果没什么区别吧?

1 个赞

windows 11 家庭版本 pipx install aider-chat 有人在windows系统中碰到如下问题吗?

> /code Code change: add a bubble sort function with vector parameter
Traceback (most recent call last):
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\aider\coders\base_coder
.py", line 1312, in send_message
    yield from self.send(messages, functions=self.functions)
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\aider\coders\base_coder
.py", line 1645, in send
    yield from self.show_send_output_stream(completion)
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\aider\coders\base_coder
.py", line 1720, in show_send_output_stream
    for chunk in completion:
                 ^^^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\litellm\llms\ollama_cha
t.py", line 377, in ollama_completion_stream
    with httpx.stream(**_request) as response:
         ^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Applications\Scoop\apps\anaconda3\current\App\Lib\contextlib.py", 
line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File "C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_api.py", 
line 159, in stream
    with client.stream(
         ^^^^^^^^^^^^^^
  File "D:\Applications\Scoop\apps\anaconda3\current\App\Lib\contextlib.py", 
line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_client.py", line
855, in stream
    request = self.build_request(
              ^^^^^^^^^^^^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_client.py", line
378, in build_request
    return Request(
           ^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_models.py", line
408, in __init__
    headers, stream = encode_request(
                      ^^^^^^^^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_content.py", 
line 216, in encode_request
    return encode_json(json)
           ^^^^^^^^^^^^^^^^^
  File 
"C:\Users\donal\pipx\venvs\aider-chat\Lib\site-packages\httpx\_content.py", 
line 179, in encode_json
    ).encode("utf-8")
      ^^^^^^^^^^^^^^^
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcb0' in position 
5044: surrogates not allowed

'utf-8' codec can't encode character '\udcb0' in position 5044: surrogates not 
allowed

做了一个视频demo:

4 个赞

看起来像Aider的问题,可以去上游提个issue

好的,谢谢

顺道问下,视频有哔哩的链接么?

没有放B站呢