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

对!我也觉得把前后端做得更分离一点就完美了,之后有机会看看上游有没有我能贡献的地方。

其实我对Aidermacs未来的构想和EAF以及lsp-bridge有些类似,把Emacs解放出来。

Aidermacs有Logo啦!

1 个赞

aidermacs 能配置三方的deepseek 比如硅基流动 或者火山引擎的

可以,它的配置是设置 env 变量,具体参考 aider 文档。

1 个赞

siliconflow 这类和 OpenAI API 适配的,可以参考 OpenAI compatible APIs 进行配置。

需要注意的是,模型需要加上 openai 的前缀。

例如这是我配置的使用 siliconflow 的配置

(with-eval-after-load 'aider
  (setq aider-args '("--no-auto-commits" "--model" "openai/Pro/deepseek-ai/DeepSeek-V3"))
  (setenv "OPENAI_API_KEY" (spike-leung/get-siliconflow-api-key))
  (setenv "OPENAI_API_BASE" "https://api.siliconflow.cn")

aider 依赖 litellm 提供 llm 的 provider,如果你擅长 python,也可以提个 PR 把 siliconflow 添加到 provider 中,就更方便使用了 :)

2 个赞

今天又重构了一堆函数,增加了几个新功能:

  1. M-x aidermacs-add-files-interactively
  2. aidermacs-default-model 设置默认
  3. aidermacs-extra-args 作为用户可自定义的额外args

大家的config可以把之前的 aidermacs-args 删啦,已经没用啦

(setq aidermacs-args '("--model" "anthropic/claude-3-5-sonnet-20241022"))

-> (setq aidermacs-default-model "anthropic/claude-3-5-sonnet-20241022")

我每个项目的根目录下面有自己的 aider 配置文件 .aider.conf.yml ,里面定义了模型参数,那我应该怎么配置?

1 个赞

感觉比较合理的设置应该是当这个模型的变量为 nil 时,在 launch aider 时生成的 args 就不带 --model 这个参数。目前的代码里还没有考虑到这种情形。

建议 aidermacs 裸配置的情况下跟 aider 无配置的行为保持一致,可以做一些 enable、disable 的参数wrapper,但默认情况下是不污染命令行、环境变量,不要 suprise 用户,文档里给些设置用例就够了。

我没有用过.aider.conf.yml所以没考虑过这个情况,稍等哈我思考一下,我先上线一个新功能

Aidermacs 支持 Reason 和 Edit 模型分离了!

(setq aidermacs-use-architect-mode t)
(setq aidermacs-architect-model "o1-mini") ; default
(setq aidermacs-editor-model "anthropic/claude-3-5-sonnet-20241022") ; default

Reasoner/Edit 模型分离是 Aider上游提供的一个 显著提升LLM代码benchmark的方式,目前可以通过设置 aidermacs-use-architect-mode 来启用,启用后会无视 aidermacs-default-model 的设置。

1 个赞

目前Aidermacs调整的参数有这些:

/Users/matthewzmd/.emacs.d/straight/repos/aidermacs/aidermacs-backend-vterm.el
85:22:                     "--dark-mode"
86:20:                   "--light-mode"))

/Users/matthewzmd/.emacs.d/straight/repos/aidermacs/aidermacs-backend-comint.el
232:34:        (args (append args (list "--no-pretty" "--no-fancy-input"))))

/Users/matthewzmd/.emacs.d/straight/repos/aidermacs/aidermacs.el
227:60:         (has-model-arg (seq-position aidermacs-extra-args "--model"))
230:31:                        (list "--architect"
231:31:                              "--model" aidermacs-architect-model
232:31:                              "--editor-model" aidermacs-editor-model))
235:33:                          (list "--model" aidermacs-default-model)))
237:27:                        '("--no-auto-commits"))
239:27:                        '("--subtree-only"))

其中

  1. --dark-mode/light-mode 仅应用于vterm,根据你emacs的模式自动调整。
  2. --no-pretty--no-fancy-input 都是用来处理在comint下的显示效果

剩下 --architect, --model, --editor-model, --subtree-only 都有对应的Emacs变量来启用,默认关闭,和Aider默认一致。

只有 aidermacs-auto-commits 我默认关闭了,和Aider默认不一致,因为我交流下来,很多人被Aider劝退就是Aider的强制 commit,然后在还没了解到--no-auto-commits就弃坑了。基于这种原因我关掉了。

我对Aidermacs的构想是以用户体验和Emacs集成为主要目标,Aider默认我尽量不动,但如果默认功能我觉得对用户体验是负面的,我才会调整。嗯非常非常主观,目前只有aidermacs-auto-commits 得到这个级别的待遇,所以听听你们想法。

还有个折中的方案,在defcustom启用aidermacs-auto-commits 但是把(setq aidermacs-auto-commits t)写到README的推荐配置里,大家怎么看?

有个简单粗暴的方式是,当检测到用户有 .aider.conf.yml,默认用户是高级aider玩家,这部分代码直接略过,完全采用用户配置文件:

(final-args (append
                      (when aidermacs-use-architect-mode
                        (list "--architect"
                              "--model" aidermacs-architect-model
                              "--editor-model" aidermacs-editor-model))
                      (unless aidermacs-use-architect-mode
                        (unless has-model-arg
                          (list "--model" aidermacs-default-model)))
                      (unless aidermacs-auto-commits
                        '("--no-auto-commits"))
                      (when aidermacs-subtree-only
                        '("--subtree-only"))
                      aidermacs-extra-args))

或者说只略过--model--editor-model,和--architect的设置?其他设置照样apply?

你们怎么看

aider-architect-model aider-editor-model 默认设置为 nil,当非空时就生成相对应的命令行参数怎么样?

这样不需要两个 use-xxx 和 xxx-model 两个参数来做同样的事情

no-auto-commits 默认设置为 t 我觉得问题不大,因为这个也好改。

或者就只需要一个 variable aider-model,这个变量为空时就不插入 —model 的命令行参数。当是一个 string 时就插入 —model,当是一个 plist 时,就插入 —architect-model 和 —editor-model。

可以,你有空提个PR吧,conf文件测试没问题我睡醒了合并

这个有点复杂了,runtime替换model和切换architect mode以及用户配置都得动态调整,感觉不是很intuitive?

对我来说只要solution能平衡好functionality, configurability, usability, intuitiveness,我都可以

我个人的话会倾向于不提供任何 llm, provider 相关的默认配置,只在文档中引导用户如何配置

  • aider 的配置有哪些,指向官方文档
  • aidermacs 如何使用集成这些配置,并给出示例

比如目前我的个人配置像这样:

(use-package aidermacs
  :vc (:url "https://github.com/MatthewZMD/aidermacs"
       :ignored-files
       "aidermacs-doom.el"
       "aidermacs-helm.el")
  :bind ("C-c a" . aidermacs-transient-menu)
  :config
  ;; Code mode by default
  (setq aidermacs-extra-args '("--model" "openrouter/google/gemini-2.0-flash-001"))

  ;; Architect mode by default
  ;; (setq aidermacs-extra-args '("--architect"
  ;;                              "--model" "deepseek/deepseek-reasoner"
  ;;                              "--editor-model" "deepseek/deepseek-chat"))

  ;; More aider config options, please check `https://aider.chat/docs/config/options.html'
  (setenv "DEEPSEEK_API_KEY" (auth-source-pick-first-password :host "api.deepseek.com"))
  (setenv "OPENROUTER_API_KEY" (auth-source-pick-first-password :host "openrouter.ai"))
  (setenv "AIDER_AUTO_COMMITS" "False") ;; Disable auto commit of LLM changes
  (setenv "AIDER_CHAT_LANGUAGE" "Chinese") ;; Specify the language to use in the chat

  (setq aidermacs-backend 'vterm))

我记得Aider默认指向claude 3.5 sonnet的

对,我就是不是很喜欢之前全部只用一个args来设置所以才abstract到各个variable,对用户增加太多学习成本了

我把常用的arg做成variable方便懒得看doc的用户直接按照emacs的setq习惯配置,喜欢研究doc的朋友可以接着衍生aidermacs-extra-args

我觉得不用管官方自己的默认,用户只要去官方那查询配置项就行,emacs端做个信息桥接以及展示就够了。