Emacs 31 即将发布:我日常开发中的关键变更
速览
Emacs 31 版本即将正式推出,引发了开源社区的广泛关注。本文作者基于日常高强度使用体验,详细梳理了该版本带来的核心变更与功能改进。这些更新旨在提升开发效率与用户体验,为即将到来的正式发布提供了重要的预览参考。
AI 深度解读
Emacs 31 前瞻:作者日常配置中的新特性解读
背景
Emacs 31 目前仍处于开发阶段(实际上处于预发布阶段),其名称和默认设置在最终发布前仍可能发生变化。本文基于作者 Karthik Chikmagalur 在 Hacker News 上分享的一篇深度文章,记录了他作为 Emacs 核心贡献者,在 emacs-31 分支和 master 分支上构建并日常使用 Emacs 31 的体验。
作者提到,Karthik 此前曾发表过一篇关于 Emacs 现有“内置电池”(即未激活但已存在的优秀功能)的文章,而本文则是其镜像之作,旨在展示那些即将随 Emacs 31 正式发布的“新电池”。作者将这些新特性整合进他名为 Emacs Solo 的无外部包配置中,并通过 ; EMACS-31 注释标记,以便在官方发布后回顾和清理。
需要注意的是,以下内容反映的是截至 2026 年中期的开发状态。如果你不直接从 emacs-31 或 master 分支构建,请将其视为对即将到来的变化的预览。
核心内容
开箱即用的 Tree-sitter 支持
这是作者最满意的一项改变。过去,启用 *-ts-mode(Tree-sitter 模式)需要手动配置 treesit-language-source-alist,调用 treesit-install-language-grammar,并祈祷工具链能正确编译语法文件。在 Emacs 31 中,这一繁琐过程被大幅简化:
- 自动化安装:通过设置
(treesit-auto-install-grammar t),当缺少语法文件时,Emacs 会自动提示获取并构建,而不是直接报错。 - 自动切换:设置
(treesit-enabled-modes t)后,所有拥有 Tree-sitter 变体的主模式(major modes)将自动切换到该模式。
这相当于将 treesit-auto 包的核心功能内置到了 Emacs 核心中。对于 TypeScript、TSX、Rust、TOML、YAML 和 Dockerfile 等语言,语法源现在直接嵌入在模式代码中。作者表示,他配置中大量用于定义语法来源的代码块即将成为历史,只需更少的配置即可实现相同的功能。
此外,Yuan Fu 等开发者在 Tree-sitter 的语言支持、可用性和性能方面进行了持续改进,使其在 Emacs 中的发展速度令人瞩目。
内置的 Markdown-ts-mode(实验性)
Emacs 31 内置了 markdown-ts-mode,这是作者亲自发起并参与开发的功能。该模式源于 2025 年初作者向 emacs-devel 邮件列表提出的提案。作者特别感谢了 Stéphane Marks,后者后来加入并成为该模式的共同作者,对模式的可用性和细节打磨做出了巨大贡献。
该模式提供了远超基础语法高亮的功能:
- Org 模式用户友好:快捷键和编辑手感与 Org 模式高度相似,包括标题导航、章节折叠和结构元素移动。熟悉 Org 的用户无需重新学习。
- 实时彩色代码块:这是作者最喜欢的功能。围栏代码块(fenced code blocks)会使用对应语言的主模式进行字体着色(fontification),而不是简单的等宽文本。即使是 Emacs 内部模式(如
elisp),也能获得真正的 Emacs Lisp 语法高亮,无需额外设置。 - 内联图片查看:图片链接会在缓冲区中直接渲染,使得包含截图或图表的 Markdown 文档阅读体验更像普通文档,而非充满
噪音的文本。
注意事项:markdown-ts-mode 目前仍为实验性功能,未自动关联到 auto-mode-alist。用户需通过 M-x load-library RET markdown-ts-mode 手动加载,或自行添加到 auto-mode-alist 中。作者呼吁用户通过 M-x report-emacs-bug 或直接向作者及 Stéphane Marks 反馈使用体验,以帮助其在下一次发布前达到稳定状态。
Eglot 使用 Markdown-ts 渲染文档
在 Emacs 31 中,Eglot 可以利用 markdown-ts-view-mode 来渲染 LSP 文档,而不是回退到纯文本。
- 配置示例:
(eglot-documentation-renderer 'markdown-ts-view-mode) ;; EMACS-31 (eglot-code-action-indications nil) ;; EMACS-31 - 效果:
markdown-ts-view-mode提供了格式化的悬停文档,无需额外依赖。 - 代码操作提示:作者建议关闭
eglot-code-action-indications,因为虽然新的内联“此处可执行代码操作”提示很巧妙,但某些语言服务器生成的提示可能过于嘈杂。 - 变量变更:
eglot-events-buffer-size正在被eglot-events-buffer-config取代,旧变量标记为待清理。
光标处的 ElDoc 支持
一个小但作者很喜欢的改动是启用光标处的 ElDoc:
(eldoc-help-at-pt t) ;; EMACS-31
开启后,ElDoc 会显示光标下内容的帮助文本,无需手动触发。配合 eldoc-echo-area-prefer-doc-buffer,在浏览陌生代码时能提供更清晰的引导。
更智能、积极的补全体验
minibuffer 和补全机制引入了一些新的开关,提升了开箱即用的体验:
- 积极更新与显示:
这些设置会在用户输入时刷新补全 UI,而不是等待用户请求。如果不使用(completion-eager-update t) ;; EMACS-31 (completion-eager-display 'auto) ;; EMACS-31icomplete,将eager-display设为t即可获得锐利的原生体验。 - 箭头键导航:
允许用户使用方向键在可见候选项中移动,操作更加自然。(minibuffer-visible-completions 'up-down) ;; EMACS-31 - Icomplete 改进:Emacs 31 包含了作者提议并参与开发的 bug#75784 补丁,为
icomplete带来了垂直的缓冲区内行为和前缀指示器。
关键要点
- Tree-sitter 核心化:Emacs 31 将 Tree-sitter 语法安装和模式切换功能内置,消除了手动配置语法的繁琐步骤,显著降低了使用门槛。
- Markdown-ts-mode 成为核心:由社区协作开发的
markdown-ts-mode正式进入核心,提供 Org 风格的导航、代码块实时高亮和内联图片渲染,但当前仍标记为实验性,需手动启用。 - LSP 文档渲染升级:Eglot 支持使用
markdown-ts-view-mode渲染 LSP 文档,提升文档阅读体验;同时建议关闭部分可能产生噪音的代码操作内联提示。 - 交互体验精细化:
- ElDoc 支持直接在光标处显示帮助信息。
- 补全机制支持输入时实时更新和显示(eager update/display)。
- 支持使用方向键在 minibuffer 补全列表中进行上下导航。
icomplete获得垂直视图和前缀指示器改进。
- 配置简化趋势:作者通过移除大量旧配置(如语法源定义、外部包依赖),展示了 Emacs 31 如何通过核心功能的增强来简化用户配置。
意义与影响
Emacs 31 的这些变化标志着 Emacs 正在从“高度可配置但初始体验复杂”向“开箱即用且功能强大”的方向演进。
- 降低学习曲线:Tree-sitter 的自动化和补全机制的改进,使得新用户能够更轻松地获得现代化的编辑体验,无需深入理解复杂的底层配置。
- 社区协作的成果:
markdown-ts-mode的成功整合证明了 Emacs 社区协作的有效性。从邮件列表提案到核心代码,再到共同维护,这种模式不仅丰富了功能,也增强了社区的凝聚力。 - 核心功能的现代化:通过内置
