外观
Emacs 社区日报 2026-10-01
约 4689 字大约 16 分钟
2026-10-01
自动整理自 Telegram 讨论组,每天更新。内容为 AI 摘要,仅作信息索引与回顾。

Emacs 中文讨论组
🎯 核心热点与专题探讨
专题 1:Emacs + AI 编程工具的「阵痛」与工作流重构
围绕 gptel(Emacs 中接入 LLM 的客户端)与 DeepSeek(ds)的搭配,群里展开了一场"半吐槽半方法论"的讨论。核心观点非常鲜明:模型能力本身不是瓶颈,关键问题出在"shell/harness"(即外部驱动框架)。具体痛点包括:
gptel的 tool 支持体验差,且存在文件读取与安全限制的硬伤(如 symlink 幽灵问题在 Emacs 中难以妥善处理)。- DeepSeek 不适合处理资料稀缺、需要即时探索的任务,必须让 A/O(可能指 Agent/Orchestrator)预先制定计划。
- 有成员表示已半年不用 gptel,认为"可以直接去掉"。
而有效的解法是:放弃在 Emacs 内硬耦合模型,转向自定义 harness + CLI 技能体系。有人提到 pi + ds 的组合体验极佳,并且强调"每开发一个技能就有一套 CLI,探索过程中有价值的东西能沉淀下来,每次使用技能又是不断完善的机会"。这实际上是一种"迭代式技能沉淀"的知识管理思路,值得借鉴。
专题 2:C++ 编译器前端——「曾经的超级秘密武器」与现实的复杂性
群友分享了一个 GitHub 仓库(edgcpp/compiler)和 Reddit 帖子,一开始大家疑惑"这是干啥的",随后有人解答:这是 Visual Studio 的前端(C++ 编译器前端),并形容为"曾经的超级秘密武器"。随即话题转向 C++ 前端开发的普遍困境:"c++ 前端就没有简单的""就没有不出 bug 的"。这映射出编译器前端工程的高复杂度,即便有历史沉淀,依然难以做到完美。该仓库的价值在于它展示了现代 C++ 编译器架构的一种具体实现。
🔑 关键概念与技术解析
- gptel:一个在 Emacs 中接入 OpenAI/本地模型(如 DeepSeek)的客户端包。它支持调用函数工具(tools),但在实际使用中工具支持不够完善,尤其在文件系统安全处理上有缺陷。
- symlink 幽灵(symlink ghost):指通过符号链接绕过路径校验的安全问题。讨论中提到在 Emacs 中直接读取文件做安全限制时,这种隐患难以被妥善处理。
- harness(驱动框架):在本讨论中指用户自己搭建的、用于调用 AI 模型并执行任务的工具链,而非依赖某个现成的 Emacs 插件。它决定了模型能力能否真正落地。
- edgcpp/compiler:一个 C++ 编译器前端项目,来自微软 Visual Studio 的前端代码。虽非新概念,但作为开源参考代码,对理解 C++ 编译器架构有帮助。
💎 碎片知识与金句拾遗
- "我觉得和自己的 harness 有很大的关系,模型能力都是够的" —— 一针见血:模型能力上限远未触及,瓶颈在于外部工程。
- "每开发一个技能就有了一套 cli,然后探索过程中有价值的东西也能沉淀下来。每次使用技能又是一次不断完善技能的机会。这样不断迭代。" —— 这套"技能 + CLI + 沉淀"的循环,几乎是知识管理的最佳实践。
- "曾经的超级秘密武器" —— 指 Visual Studio 的 C++ 编译器前端,带有历史神秘感。
- 有人提到
magit(Emacs 的 Git 前端)时发了一条链接,主题是"Magit 提速",但未展开讨论。 - 群聊末尾出现"已 all in AI"一句,态度明确地表示全面转向 AI 驱动开发。
🛠️ 值得深入研究的点 (Follow-up)
- edgcpp/compiler:开源 C++ 编译器前端,可作为研究 C++ 解析、语法分析、语义分析的参考实现。值得跟踪其项目状态与后续进展。
- 自定义 AI harness + CLI 技能体系:虽然没有公开代码,但"开发技能 -> 沉淀 -> 迭代"的思路很值得实践。若能总结成一套方法论或工具,将极具价值。
- Magit 提速方案:
https://emacs-china.org/t/magit-magit-fast/32105中讨论的优化技巧,适合 Emacs 重度用户深挖。
观点延伸
当天最值得咀嚼的判断是:AI 编程体验的上限,往往不由模型单独决定,而由 harness 把模型放进什么样的工作环境决定。群里从 gptel 的 tool 不好用、Emacs 读取文件时难处理符号链接,到 pi + ds 的顺手,表面上是在比较工具,实质上是在比较“谁负责控制任务边界、文件权限和执行反馈”。
1. 编辑器内嵌 AI,不等于拥有了工程化 Agent
把模型直接塞进 Emacs,最大的诱惑是交互连续:读文件、改代码、继续对话都在同一个界面里。但工程问题也会被一起塞进来:路径是否可信、符号链接是否越界、工具失败后如何回滚、模型是否知道当前操作的权限边界。只要这些机制没有被明确建模,所谓“tool 支持”就容易停留在能调用,而不是可审计、可恢复、可组合。
因此,“去掉 gptel”未必是在否定 Emacs,而可能是在拒绝让编辑器承担它不擅长的职责。Emacs 更适合做人的控制面和知识工作台;文件访问、命令执行、权限隔离、状态记录,则应由边界更清楚的外部 harness 负责。真正值得比较的不是插件数量,而是一次任务能否被限制、观察和复现。
2. “技能 + CLI”比一次性的提示词更接近可积累的软件
群里提到“每开发一个技能就有一套 CLI”,这个观点的关键不在 CLI 这个形式,而在于把隐含经验变成稳定接口。提示词通常只在一次对话里有效;CLI 则迫使人明确输入、输出、失败条件和副作用。使用过程中发现的新情况,可以回写成测试、参数或保护规则,下一次调用便不再从零开始。
这也解释了为什么“模型能力都够”可能成立:当任务被拆成边界清晰的步骤,模型只需在有限空间内判断,而不是独自探索整个文件系统和问题域。Agent 的可靠性,更多来自任务分解与反馈闭环,而不是让模型拥有更大的自由度。
3. C++ 前端与 AI harness,其实共享同一种复杂性
“C++ 前端就没有简单的”“就没有不出 bug 的”,与前面的讨论并不割裂。编译器前端难,是因为它必须把大量隐含规则转成精确、可执行的结构;AI harness 难,也因为它要把自然语言意图转成权限、工具调用和状态转移。两者都不能靠“看起来能跑”证明可靠,必须依赖边界条件、错误处理和回归测试。
可继续实践的方向是:把一个真实的 Emacs + AI 任务拆成最小 CLI,明确允许访问的目录、输入输出格式、失败即停规则,并为符号链接、无权限文件和半途失败各写一个测试。若这套接口比原来的对话更容易复现和修正,才说明 harness 真正改善了工作流。
Emacs 轻聊讨论组
🎯 核心热点与专题探讨
专题:Transient 性能问题的“终极解法”
这是本日最激烈的技术交锋。讨论由 magit 按下快捷键后面板弹出极慢的现象引发,最终促成了一个对 transient 机制的底层改造方案。
- 痛点:magit 的面板弹出速度极慢,每次按键后要等很久才显示。有群友猜测是混入了“vim间谍”,但真正的原因指向 transient 在构建面板布局时,会强制
autoload-do-load加载所有相关包的 autoload 命令,导致大量的磁盘 I/O 和加载开销。 - 解决方案:群友 [WD] 给出了一套完整的
advice-add改造方案,核心思路是“构建时不加载,按键时再加载”。具体改动:- 通过
define-advice包裹transient--init-suffix,在构建布局阶段设置z/transient--defer-autoload为 t,跳过 autoload 加载。 - 对缺失的 suffix 命令进行“stub”(存根),不直接报错,而是输出一条带蓝色高亮的告警消息,并在按下键时才真正加载对应功能。
- 效果显著:面板瞬间启动,不再卡顿。
- 通过
- 群友反应:“这才是正常人想要的 transient。自从安装了 transient 相关的包,每个月都在和 transient 的奇怪行为打架”。有人甚至调侃“现在都扔给 deepseek 豆包了,不怕 transient 了”,说明该方案极具普适价值,有望成为配置的最佳实践。
专题:magit 与 magit-fast 的优化路径
从 magit 面板慢的问题出发,延伸出对 magit 本身架构的讨论,并引入了新的 Emacs Git 前端 majutsu。
- 对比结论:
majutsu的status比magit快,因为magit要加载 diff,而majutsu只加载 log。编写 log 的 revset 也需要技术。有群友计划将magit-fast独立出来发布。 - 生态:有人提到“不是都用 jj 了”,但群友表示 jj 还不太会用,且“思想不一样”,已经用 git 很久了,反映了新旧 VCS 工具的碰撞。
专题:oh-my-openagent 与 DAG 的融合
- 群友分享了
oh-my-openagent(原oh-my-opencode)的项目,提到它“完全融合了 DAG”。这一特性得到了认可:“dag 应该是最近主打的功能了”。不过也有群友表示“我不太喜欢 oh-my-opencode”。有群友认为“越来越像 emacs 了”,暗示其设计哲学与 Emacs 趋同。
🔑 关键概念与技术解析
- majutsu:一个新兴的 Emacs Git 前端,定位是 magit 的替代或补充。与 magit 相比,它在
status命令上的性能优势明显,因为它不加载 diff 文件,仅加载 log。对于追求效率的用户,majutsu 值得尝试。 - transient:Emacs 中用于构建临时弹出面板的框架,常用于 magit 等工具。其缺陷在于构建面板时强制加载所有 autoload,导致启动缓慢。本日群友提出的“构建时不加载,按键时加载”方案,是对这一框架的重要优化。
- oh-my-openagent:一个开源配置框架,前身为
oh-my-opencode。最新特性是深度集成了 DAG(有向无环图)能力,用于管理和编排复杂的 Agent 流程。它在设计上越来越接近 Emacs 的可扩展风格。 - lottie 支持:用于
video.el,可以取代tgs2png(Telegram 动画贴纸转 PNG 的工具),直接在 Emacs 中渲染 Lottie 动画。 - nested herdr:当在 Emacs 中运行 herdr 命令时,如果配置是通过 herdr 同步的,可能会被检测为嵌套环境,导致冲突。
- Libghostty:iOS 上基于 ghostty 终端核心的本地终端引擎,支持完整 TTY,是 iOS 上运行 Emacs 的关键突破。
- CSI u:kitty 键盘协议的一部分,用于编码组合键和修饰键(如 Ctrl+Shift)。Rootshell 在 iOS 上正确实现了这一编码。
💎 碎片知识与金句拾遗
- “我感觉推特上已经没有真人了,全都是 LLM 在发帖然后互相评论” —— 对当前社交媒体生态的观察,暗示 AI 生成内容已占据主导。
- “我做了三个视频 才花了 $13 左右 credit” —— 关于 AI 视频生成的成本细节,显示出当前 AI 视频的成本正在下降。
- “在 herdr 里运行 doom sync 把环境变量同步进去了,结果在 Emacs 运行 herdr 被检测为 nested herdr,生草(” —— 一个有趣的配置冲突案例,体现了工具之间的复杂交互。
- “带有 nn- 前缀的是我的专属 package,没有的是打算发的” —— 分享者对其 Emacs 配置中包命名规范的说明,体现个人化的管理策略。
- “majutsu 怎么只保存某个文件的某几行当作一个新的 commit” —— 对细粒度提交的需求。
- “红迪喊你做 async” —— 网友对异步编程的呼吁,后续解释“红迪”即 Reddit。
- “Windows 兼容性的解决方案是把会用到的 unix 命令全部做成 shell 的 builtin。然后他自己 builtin 实现的 ps 不支持 -C 参数” —— 针对 omp 在 Windows 上兼容性问题的具体实现细节和缺陷,属于极客视角的深度吐槽。
- “lazytyper 每次纠错能自动识别加入” —— 语音输入编程术语的解决方案之一:利用可自定义词典的输入工具,通过自学习积累专业词汇。
- “Google 发布 Gemini 4 Argon,大幅强化长上下文能力。目前只有 AI Ultra / Paid API 用户配用” —— 行业动态,价格门槛较高,群友评价“太贵了”。
- “Claude 的 reset 也可以在网站上直接点” —— 关于 Claude 对话重置功能的使用提示。
- “excali-mode 在 r/emacs 的反响很好,看上去可以获得 200 个 upvote 了,谢谢 WD 的想法,我在 readme 里把 video.el 作为 credit” —— 一个 Emacs 包的社区成功案例,并提及了贡献者。
- “最近看了下 mg 的代码,感觉里面的写法很古董” —— 对旧代码风格的吐槽。
- “都是现充啊” —— 群内对他人社交生活的调侃。
🛠️ 值得深入研究的点 (Follow-up)
- Transient 的“构建时 stub、按键时加载”方案:该方案完美解决了 transient 启动缓慢的问题,并提供了针对缺失命令的优雅降级策略。这套
advice-add方案具有很强的普适性,可以做成一个通用包发布,作为 Emacs 配置的最佳实践。 - majutsu:作为 magit 的高性能替代品,它“融合了 DAG”的设计理念值得深入。探索其 revset 编写技巧,以及如何实现“只保存某文件某几行作为新 commit”的细粒度提交,可能引领 Git 前端的新潮流。
- oh-my-openagent 的 DAG 融合:该项目的核心能力是将 Agent 编排抽象为 DAG,这为构建复杂的、多步骤的 AI 代理工作流提供了新的范式。深入研究其设计,可启发个人构建 AI 代理或自动化系统。
- iOS 上的 Rootshell:基于 libghostty,支持 kitty 图形协议和键盘协议。对于想在 iPad/iPhone 上运行完整 Emacs 的用户,这是一个值得尝试的开源方案。其 kitty 协议实现的细节(如 CSI u、imgcat)值得探索。
- 语音输入编程术语:lazytyper 的自动纠错学习机制提供了思路。开发一个可自定义、自学习的词典,并集成到手机输入法或语音助手(如 whisper)中,可能是解决编程术语识别难题的关键。
观点延伸
当天最值得咀嚼的,不是“magit 终于变快了”,而是一个更普遍的工程判断:交互系统不应该为了准备所有可能发生的事情,牺牲当前这一步的响应速度。Transient 面板构建时强制加载相关命令,正是把“用户可能按什么键”的未来成本,提前转嫁给了每一次打开面板。将加载推迟到真正按键时,表面上只是一个 Emacs 性能补丁,实质上是在重新划分初始化责任。
1. 延迟加载不是越晚越好,而是要把成本放到可解释的位置
这套方案的关键不只是“lazy load”,而是让延迟发生在用户能理解的边界上:面板先出现,用户选择某个功能后,对应子系统才启动。这样即使第一次按键仍有加载延迟,用户也知道延迟来自刚刚选择的动作,而不是一个看似无害的快捷键却长时间没有反馈。
Stub 也体现了同一原则。缺失命令不应该让整个面板构建失败,但也不能悄悄吞掉错误。用可见的告警保留故障线索,再把真正的失败推迟到具体操作,是比“启动阶段全量校验”更适合交互软件的降级方式。可验证的工程标准应当是:面板打开时间稳定,首次调用的额外延迟可测,错误不会被静默隐藏。
2. magit-fast 与 majutsu 暗示:性能优化首先是工作流取舍
majutsu 只加载 log、magit 需要处理 diff,这种差异说明“更快”往往不是同一功能的纯技术加速,而是减少了默认承诺。用户打开 status 时究竟需要完整 diff、历史关系,还是只需要快速知道仓库状态?答案不同,最佳实现就不同。
因此,magit-fast 如果继续发展,重点不应只是堆更多缓存或微优化,而应明确自己的交互契约:哪些信息默认不加载,哪些操作进入后才展开,以及用户如何主动获得完整视图。否则它很容易变成另一个“默认做很多事”的前端,只是暂时更快。
3. Agent 的 DAG 设计与 Emacs 的相似性,也在重复这个问题
群里提到 oh-my-openagent 越来越像 Emacs,未必只是因为它可扩展,而是因为两者都把复杂能力拆成可组合、可延迟执行的节点。DAG 的价值不在于画出流程图,而在于明确依赖、并行边界和失败位置。若每个节点都预先启动、加载和生成全部上下文,DAG 只会把复杂度可视化,却不会降低实际成本。
可继续研究的方向是:把 Transient 的“构建时轻量、执行时加载”原则,与 Agent DAG 的任务调度结合起来,做一个可观测的最小实验。记录节点启动时间、首次执行延迟、失败传播范围和缓存命中率,再比较“全量预热”与“按需执行”两种策略。真正成熟的系统,不是看起来功能最多,而是让每一次等待都发生在用户能理解、也能测量的位置。
