外观
Emacs 社区日报 2026-10-06
约 5745 字大约 19 分钟
2026-10-06
自动整理自 Telegram 讨论组,每天更新。内容为 AI 摘要,仅作信息索引与回顾。
Emacs 中文讨论组
🎯 核心热点与专题探讨
【专题】Emacs on Windows 输入法修复:一场硬核的 W32 编程攻坚
群内全天最核心的讨论围绕“奶蛙”(@zdn_y 或相关 ID)对 Emacs 在 Windows 平台输入法支持的一系列修复展开。这场讨论不仅展示了底层系统编程的艰难,也揭示了当前 AI 辅助编程在特定领域的局限性。
- 痛点:Emacs 在 Windows 上的输入法支持“极其糟糕”,具体表现为终端无法输入中文、GUI 下输入法字体大小异常、TSF(Text Services Framework)事件被错误过滤等。核心原因在于 Emacs 未正确处理 Windows 消息——有些窗口消息并不持有
hwnd,导致部分事件(如输入法消息)被错误过滤而未派发。 - 修复过程:“奶蛙”花费数天定位 bug,过程中 AI(如豆包)反复给出错误信息,“在骗我的同时,给不出一点有用的信息”。最终他提交了一个 patch(
https://github.com/zHaOdANiuu/emacs-w32-draw-preedit.patch),并修复了输入法字体大小、TSF 事件过滤以及中英文切换时任务栏状态图标更新等问题。用户实测编译后确认“语音输入时没有那个白色的框框了,字体也正常”。 - 后续争议:patch 目前未被 emacs 官方合并(“eli 没有合并而已”),引发了对 Emacs 维护流程的讨论。群友建议“奶蛙”去 debbugs 追踪器(bug 编号
81506)发邮件争取合并,否则每次新电脑都要重新应用 patch。若无法合并,他考虑“单独弄一个 dll 出来搞一个 emacs 包”。 - 生态观察:有群友感叹“W32 编程在这个时代可能不是重要的事情了”,修输入法需要熟悉 W32 编程,但在 2026 年这“其实挺困难的”,属于“有点像是淘汰的技术了”。这也侧面凸显了这份 patch 的稀缺价值。
【专题】字节码编译 vs. 原生性能:Emacs 执行模型的深度辨析
下午讨论转向 Emacs 的字节码编译(byte-compile)是否真的能带来性能提升。
- 正方(
κόσμος等)指出:官方文档明确“通常比字节编译快 2.5 到 5 倍”;不字节码编译时,每个 elisp 函数调用对应一个 C 函数栈,递归多了会爆栈;宏展开的提前处理是性能提升的重要原因。Emacs 本身解释 S-exp 的实现非常“直接”,而把 S-exp 压成 byte-code 后“解释起来简单很多”。 - 反方(另一位群友)则认为“提升还是很大的 x”但“我没有感觉到”,并猜测“字节码可以说基本没提升,给我的感觉就是明文压缩了方便快速解析”。他坦白“我从来没有用过宏”、“我写的包可能不是什么很需要性能的包”,因此感受不明显。
- 结论与引申:最终大家基本认同——Emacs 大部分时间处于 idle 状态,并不在执行代码,因此“一般体会不到”。这个讨论促生了一个很实用的想法:“或许我可以把我的配置编译成 elc 把 use-package 全部展开”,以加速启动。
🔑 关键概念与技术解析
- TSF(Text Services Framework):Windows 下的文本处理框架,支持输入法、语音等复杂文本服务。Emacs 之前会错误过滤 TSF 输入法事件,导致输入法在终端或 GUI 下失效。“奶蛙”修复的核心之一就是 TSF 事件过滤。
- W32 编程:指 Windows 原生 API(Win32)编程。群内讨论指出,随着时代发展,除了驱动开发,很少有人专门学习 Win32,导致相关修复人才稀缺。
- Face Underline 绘制缩放:群内提到一个“可以让 face 的 underline 绘制跟随字体缩放而缩放”的 patch,用于改善 DPI 缩放问题。目前 x 和 pgtk 框架已有实现,Windows 的实现由“奶蛙”编写,但尚未合并到主分支。
- Byte-code 编译(elc):Emacs Lisp 的一种编译产物,通过将 S-exp 压缩为字节码,显著提升解释和执行效率,并避免 C 栈递归爆栈问题。群内讨论确认它也能展开宏,可用于提前展开
use-package配置以加速启动。 - Emacs overlay:用于在文本上方绘制附加图形(如输入法预编辑框),支持字体着色。讨论中提到“这个字体还可以着色,因为是用的 emacs overlay 绘制的”。
💎 碎片知识与金句拾遗
- “所以奶娃你得感谢我,emacs 在之前对 Windows 上的输入法支持可以说是极其糟糕。” —— 语气极客又带点调侃,但点出了问题的严重性。
- “修输入法的这些问题需要熟悉 W32 编程,在 2026 年这其实挺困难的。我自己在修复的时候很多时候 ai 在骗我的同时,给不出一点有用的信息。” —— 真实反映 AI 辅助在底层系统编程中的局限性,AI 能“骗人”,却不能给出有用的指引,定位 bug 还得靠人力。
- “我自己在修复的时候很多时候 ai 在骗我的同时,给不出一点有用的信息” —— 对 AI 编程助手的辛辣吐槽,值得记录。
- “有一个尴尬的问题是有桥的群 notify 会提醒两次,自己发的消息在另外一边也会跳 notify。” —— 关于 Matrix 桥接(Bridged)群组的一个具体细节:消息会重复通知。有人调侃“只加一边就好了”。
- “我把之前修复的 patch 过程写入到文章了” —— 群友分享了自己的技术文章站点:
https://zdn.codeberg.page/public/sitemap.html。 - “emacs 没有考虑到 Windows 的窗口消息不一定是有 hwnd 的,导致把一些原本应该发给 Windows 窗口的事件给过滤掉没有派发出去。” —— 核心 bug 的根因,非常值得记录的技术细节。
- “这次把按键绑定抽出一些统一的语义放到 appkit 里了,然后配置应该可以统一配置。” —— 某位群友分享自己 Matrix 客户端的设计思路,体现了抽象统一配置的架构理念。
- “想弄一个 rss 订阅的,不过我没有弄了,变懒了。” —— 关于个人项目规划的真实自嘲。
- “github 的 Org 渲染好像恢复了,吔” / “高雅 linux 可以被渲染出来了” —— 提及 GitHub Org 渲染恢复,算是技术社区的小插曲。
- “你如果用小狼毫什么的输入法的话你还能发现现在切换中英文输入法,任务栏的中英文状态图标可以正确更新了。” —— 具体修复成果的直观验证方法,很有实操价值。
- “群友群友,你的配置仓库在哪,想抄抄你的配置😁” —— 配置分享需求,可见群内活跃度与乐于分享的氛围。
🛠️ 值得深入研究的点 (Follow-up)
- Emacs Windows 输入法修复 Patch:
https://github.com/zHaOdANiuu/emacs-w32-draw-preedit.patch,是本次讨论的核心成果。若您也是 Windows 用户,值得尝试应用并反馈体验,同时也应关注其在 debbugs 上的合并进展(bug 编号81506)。相关文章:https://zdn.codeberg.page/public/sitemap.html。 - Face Underline DPI 缩放 Patch:改善 Windows 下 Emacs 字体缩放与下划线对齐问题。目前已有 x/pgtk 实现,Windows 实现待合并。若您对 DPI 适配有需求,可深入研究并参与测试。
- Matrix 客户端(自研):群友分享了一个自己编写的 Matrix 客户端,设计上“把按键绑定抽出一些统一的语义放到 appkit 里,然后配置可以统一配置”。若您对 Matrix 客户端开发或统一配置抽象感兴趣,值得进一步交流。
- Emacs 配置仓库:群友分享了自己的
.emacs.d:https://github.com/zHaOdANiuu/.emacs.d/。鉴于群内对其配置评价不错,可作为参考学习,尤其是use-package的展开与优化配置思路。
观点延伸
当天最值得咀嚼的,不是“Windows 输入法终于能用了”,也不是“字节码到底快不快”,而是两个相似问题:软件真正的价值,往往出现在抽象层失效、默认体验失灵的边界上;而边界问题又最难靠泛化知识直接解决。
1. AI 能加速写代码,却不能替代因果链
群里提到,修复 W32 输入法问题时,AI 不但没能提供有效帮助,反而反复给出错误信息。原因并不神秘:这类 bug 依赖具体的消息分发路径、窗口句柄假设和 TSF 行为,答案必须和实际代码、平台文档、调试现象逐层对上,而不是“看起来合理”。
这说明 AI 辅助底层开发的可靠边界很清楚:它适合生成搜索关键词、解释局部 API、尝试小范围改动,却不能替人建立“现象—消息—过滤条件—最终渲染”的完整证据链。越是冷门、历史包袱重的平台,越不能把流畅的解释当成事实。真正有效的工作方式,是让 AI 提供候选假设,人用源码、日志、最小复现和编译结果逐个证伪。
2. 未合并的修复,不只是个人补丁问题
“每次换电脑都要重新应用 patch”暴露了一个比功能缺陷更大的问题:修复如果没有进入上游,就还没有成为生态能力。个人 fork 能解决自己的痛点,却会把维护成本转移给未来的自己;只有补丁说明、复现步骤、测试结果和持续的上游沟通都具备,修复才可能从“某个人知道的技巧”变成“项目能够继承的知识”。
这也解释了为什么冷门平台维护特别重要。W32 代码也许不是多数开发者的热门方向,但正因为参与者少,遗留假设才更容易长期无人触碰。所谓淘汰技术,并不等于没有价值;它通常意味着一旦出问题,用户几乎没有替代方案。
3. 性能优化首先是测量问题
字节码讨论中的分歧,其实不是谁对谁错,而是大家测量的对象不同。配置大部分时间处于 idle,运行中的包若不包含重计算、深递归或大量宏展开,体感自然不明显;但启动阶段、批量处理和数值计算可能完全不同。把“我没感觉到”当成“没有提升”,和把文档中的倍数直接当成所有场景的体验,同样不严谨。
可继续实践的方向是建立一个小型基准:分别测量未编译配置、字节码配置,以及宏展开后的启动时间、首次交互延迟和一段代表性计算任务;同时记录 Emacs 版本、机器、编译方式和测试命令。这样,输入法修复可以有可复现的回归测试,性能优化也能从争论变成工程判断。
Emacs 轻聊讨论组
🎯 核心热点与专题探讨
专题:多 Agent 协同工作的治理架构——从“群聊混乱”到“三层隔离”
群内一位成员(后文称“整理者”)分享了他在 DSH 中搭建的多 Agent 协同治理架构,引发了全场最深入的讨论。该方案直指当前 LLM 多 Agent 协作的痛点:Session 关系混乱、任务管理失控、模型性格缺陷、上下文压缩导致的低效。以下是各方观点与核心方案:
- 彻底反对“群聊”结构:群聊广播必然产生垃圾消息,不同模型反应不一——有的会“好的收到”形成广播风暴,有的会“为避免冲突”停下自己的任务。整理者强调:必须把角色层次拉开,Session 之间独立,各自在独立 Workspace 中开发,冲突交给 jj(Jujutsu)解决。
- 放弃 GitButler,改用 jj 做多任务管理:GitButler 无法解决编译产物混乱问题,实现思路“有毒”;jj 的 change-id 和冲突解决模型更先进,适合任务记录与追踪。有成员分享了 holon.run 的文章,指出有人“重新发明了 jj 的 change-id”。
- 任务生命周期管理:每个任务必须经历“声明 → Claim 并执行 → 签核”三个阶段,且声明/Claim/签核的 Session ID 全部记录,Claim 后其他 Session 不能插手。Claim 后自动开 Worktree 并初始化 Nix Flake 环境,完成后自动清理。
- 树状任务结构追踪兔子洞:解决一个问题又引发新问题(兔子洞)是常态,任务以树状存储,子任务签核时自动注入父任务提醒,防止 Agent 迷失。
- 模型性格差异与三层架构:GPT Astra 不适合做协调人(会 hang 死),Deepseek Pro 协调积极但开发激进,GLM 只适合小活且语言风格会传染。因此采用三层结构:一级协调者管理并行预算(防 429),二级执行 Session 负责单任务协调,三级 Sub Agent 实际开发。不要尝试无人值守自动开发,因为上下文压缩五次后模型会进入低效状态。
这个专题几乎占满整个群聊,是当之无愧的核心。它体现了硬核开发者对 LLM 协作的深刻反思,以及将软件开发流程管理经验移植到 AI 编排中的尝试。
次专题:构建工具的选择——Bazel vs buck2 vs Nix
在讨论完 Agent 治理后,群内转向构建工具。有成员宣布“放弃 Nix 和 Guix 拥抱 Bazel”,原因是 monorepo 场景下的开发构建缓存和多 workspace 共享缓存。他提到现在有 86 个子项目(很多是从上游导入),甚至用 Bazel 构建 Emacs 配置。有人问为什么不用 buck2(Meta 的类似工具),回答是“生态”和“对谷歌的认同”。有人吐槽“Bazel 用现成的很爽,自己写太折磨”,但“对谷歌的认同”成为关键。这个讨论展示了工具选择的权衡:生态成熟度 vs 技术先进性。
次专题:模型使用策略与成本博弈
群内多次提及 Opus 5.5(可能是 Claude Opus)的强能力与高成本,以及 Claude 封号问题。有人分享了通过“多年前注册的号停止续费”绕过 KYC 的经验,还有通过 modelflare 中转站使用(支持微信支付,但有 RPM 限制)。关于“蒸馏 X”(可能指蒸馏某个模型用于自动发 X 推文),有人提到用 Gork 蒸馏,也有人用 pi + deepseek + chrome dev tools mcp 自动化脚本执行发布队列。这反映了开发者对模型成本、封号风险和自动化落地的现实考量。
🔑 关键概念与技术解析
- jj (Jujutsu):一个基于
change-id的版本控制工具,比 Git 更擅长任务级管理。其 change-id 不随 rebase 改变,适合作为任务追踪的稳定锚点。群内推荐它替代 GitButler 做多 Agent 任务管理。 - GitButler:一个 Git 工作流工具,群内批评其“无法解决编译产物混乱问题”“实现思路有毒”,不适合多 Agent 场景。
- Nix Flake:Nix 包管理器的声明式配置单位。群内用它为每个任务初始化独立环境,并在任务完成后自动 gc。
- 兔子洞问题 (Rabbit Hole):指解决一个问题时引发新的嵌套问题,导致 Agent 迷失方向。群内用树状任务结构追踪,子任务签核时注入父任务提醒。
- Worktree:Git 的独立工作目录。群内通过 Claim 任务自动开 Worktree,并隔离 commit 权限。
- Session 权限:多 Agent 环境中,Session 对 git/jj 的访问受控,避免逃逸。特殊情况需手动开启完整权限。
- modelflare:一个模型 API 中转站,支持微信支付,但有 RPM 限制(超频会路由到垃圾模型)。
- 蒸馏 (Distill):在 AI 语境下,指用大模型生成数据训练小模型,或模仿特定模型行为。群内“蒸馏 X”可能指让模型模仿某人的风格发推。
- excali-mode:Emacs 的 org-mode 白板扩展,0.3.0 新增
excali-board-mode,类似 Obsidian Canvas,用于可视化 org-mode 内容。
💎 碎片知识与金句拾遗
- “xray 也不好用,不直观,还慢,xp 就有的功能”——某成员尝试新工具后失望的评价,暗示该工具可能名不副实。
- “不要尝试群聊结构……这侧面烘托了钉钉和飞书是有毒的氛围”——对群聊协作工具的辛辣吐槽。
- “GPT Astra 做了几十个 Round 之后就会彻底 hang 死,表现为‘我虽然有事情要协调但我每轮都说我会协调,但我就是不做’”——对模型协调能力的精准描述。
- “Deepseek 的问题是‘反正我轮数还够’,就去查手别的任务”——揭示了模型对任务边界的失守。
- “GLM 的问题是它会瞎试,胡乱归因……试着试着就会因为上下文劣化失去焦点最后变成弱智”——强烈建议不要让 GLM 做复杂任务。
- “想办法隐藏 LLM 的输出……你已经把 LLM 开起来了那你的职位就变成 Manager 了,思维模型要转变,否则你很有可能会越做越累”——对 AI 协作中心理健康的警醒。
- “Claude 账号是一定会被封的,或早或晚,我这个纯运气好,多年前注册了一个号,在它大规模封号之前停止了续费,于是它绕过了 kyc”——封号规避经验。
- “订阅确实便宜,昨天晚上玩了 40$ 的,感觉这玩意真的上瘾”——对 Opus 5.5 的痴迷与成本吐槽。
- “我的电脑可以关机了。我 token 用完了,得等 25h 之后 reset”——token 耗尽后的无奈。
- “magpie 居然直接做了 zcode 套餐的接入适配”——某个工具(magpie)对特定套餐的支持。
- “neomacs.org 的缩略图怎么是群友的头像”——一次偶然的赞助(匿名信用卡 20$)导致网站头像关联的趣事。
🛠️ 值得深入研究的点
- Jujutsu 作为 Agent 任务管理基础设施:群内多次提及 jj 的 change-id 适合任务追踪,配合 holon.run 的博客(重新发明 change-id)可深入探究。是否可以用 jj 实现多 Agent 状态机?
- 三层 Agent 协调架构:整理者提出的“一级协调者管理并行预算 → 二级执行 Session 推动任务 → 三级 Sub Agent 开发”模式,结合 Nix Flake 环境隔离,是极具潜力的编排范式,值得复现实验。
- Bazel 在 monorepo 场景下的缓存策略:86 个子项目的构建缓存管理,以及“用 Bazel 构建 Emacs 配置”的玩法,展示了 Bazel 的扩展性。
- excali-mode 0.3.0 的 excali-board-mode:作为 Emacs 内嵌的 org-mode 白板,可能改变 Org 用户的可视化工作流。
- 蒸馏 X(Grok 蒸馏):群内提及“开了个 gork 准备蒸馏你的 X”,可能指用 Grok 模型模仿某人社交账号风格,涉及风格迁移与自动化发布,是一个新兴的应用方向。
以上整理基于 2026-10-06 的群聊记录,旨在提取技术讨论的精华,保留原始观点的细节。对于闲聊与无关内容已忽略。
观点延伸
这场讨论最值得保留的判断,不是“jj 比 GitButler 好”或“某个模型更强”,而是:当 Agent 数量增加后,真正稀缺的已经不是执行能力,而是边界、责任和证据。没有治理结构的多 Agent 系统,本质上只是把一个人的混乱放大成多个会互相打扰的进程。
1. 多 Agent 的第一原则不是协作,而是互不越权
群聊式 Agent 协作的问题,不只是消息太多,而是消息广播会制造虚假的共同上下文。一个 Session 说“我来协调”,其他 Session 就可能误以为自己的任务从属于它;模型为了回应每条消息,又会产生大量“收到”“我会处理”的无效动作。这里真正需要的是能力隔离:谁能声明任务,谁能 Claim,谁能提交,谁能签核,都应该是系统状态,而不是提示词里的约定。
因此,三层架构的价值不在于层数本身,而在于把“做事”和“决定事情是否完成”分开。尤其是签核者必须独立,否则执行者很容易把“我改过了”偷换成“问题已经解决”。可验证的验收证据,比模型自述完成更可靠。
2. jj、Worktree 和任务树,解决的是同一个问题
表面上,change-id、Worktree、Nix Flake、任务树分别属于版本控制、目录隔离、环境管理和项目管理;实际上,它们都在回答同一个问题:一次变化究竟属于谁、发生在哪里、基于什么状态、何时算完成。
这也是为什么“兔子洞”不能只靠模型记忆。只要新问题没有被显式登记为子任务,Agent 就会把范围扩张伪装成深入研究,最后既没有解决原问题,也无法说明做了哪些额外改变。任务描述中的“外延”和“非目标”不是文档装饰,而是防止系统性漂移的边界条件。
3. 模型选择应当服从失控模式,而不是平均能力
群里的观察很有工程价值:有的模型会协调停滞,有的会越界扩张,有的会不断猜测并污染上下文。模型评估不能只看一次任务的代码质量,还要看它在长流程中的失败方式。协调模型需要稳定推进和严格收敛,执行模型需要遵守边界,审查模型则要擅长质疑证据。让同一个“大模型”包办三者,往往只是把不同类型的风险叠加起来。
可继续研究的方向是做一个最小实验:用同一组任务分别运行“群聊协作”和“三层隔离”,记录越权修改数、无效消息数、返工次数、验收证据完整度与总 Token 消耗。若三层架构不能在这些指标上稳定胜出,它就还只是漂亮的流程设计,而不是可复用的工程基础设施。
