Emacs 31 发布预览:Tree-sitter、Markdown-ts 与核心增强

Emacs 31 旨在通过将常见的社区模式纳入核心编辑器,减少对外部配置的需求。主要收获包括 Tree-sitter 设置的自动化、原生 Markdown Tree-sitter 模式的引入,以及一系列窗口管理和版本控制的改进,消除了许多常见的自定义 Lisp hack 的需求。

简化的 Tree-sitter 集成

Emacs 31 大幅降低了设置 *-ts-mode 变体的手动工作量。以前,用户必须手动填充 treesit-language-source-alist 并调用 treesit-install-language-grammar,同时确保本地工具链配置正确。

关键改进包括:

  • 自动安装:treesit-enabled-modes 设置为 t 会自动将兼容的主模式切换为其 Tree-sitter 变体。treesit-auto-install-grammar 变量现在允许 Emacs 自动提供获取并构建缺失语法的功能。
  • 内置来源: 如 Rust、TypeScript、TSX、TOML、YAML 和 Dockerfile 等语言的语法来源现在在模式代码内部定义,省去了用户配置中手动定义来源的需求。

架构警告: 自动安装的语法不会按架构分离。如果配置目录在不同架构之间共享(例如 x86_64 和 arm64),在一台机器上构建的二进制文件将无法在另一台机器上加载。

实验性的 markdown-ts-mode

Emacs 31 引入了 markdown-ts-mode,一种基于 Tree-sitter 的实验性 Markdown 模式。虽然它尚未绑定到 auto-mode-alist,需要通过 M-x load-library 手动加载,但它提供了若干高级功能:

  • 类 Org 导航: 用于在标题之间导航和折叠章节的键绑定旨在让 Org-mode 用户感到熟悉。
  • 动态代码块高亮: 用围栏标记的代码块会使用指定语言的实际主模式进行字体化(例如,elisp 块使用真正的 Emacs Lisp 语法高亮),而不是仅仅使用等宽文本。
  • 内联图像渲染: 图像链接直接在缓冲区中渲染,使文档能够以格式化文件的形式阅读,而不是原始文本。
  • 代码块编辑: 用户可以使用目标语言的模式编辑围栏代码块。

此外,Eglot 现在可以使用 markdown-ts-view-mode 将 LSP 文档悬停渲染为格式化的 Markdown,而不是纯文本。

可编辑的 Xref 缓冲区

最重要的工作流改进之一是引入了 xref-edit-mode。以前,Xref 缓冲区仅支持通过 xref-query-replace-in-results 进行基于正则表达式的替换。

使用 xref-edit-mode,用户现在可以在 Xref 结果中直接编辑。通过在 *xref* 缓冲区中按 e,编辑器进入编辑模式,可对多个匹配项进行更改;这些更改随后通过 C-c C-c 确认并写入文件。

窗口布局和 UI 增强

Emacs 31 引入了多种工具,用于重新排列编辑器界面,无需手动关闭和拆分窗口:

  • 布局体操: 新命令允许用户 Transpose(交换水平和垂直布局)、Rotate(旋转布局)和 Flip(左右或上下镜像布局)。
  • 侧窗 Speedbar: speedbar-window 命令现在允许 Speedbar 位于合适的侧窗,而不是单独的浮动框架,使其更兼容平铺窗口管理器。
  • 点上 Eldoc: 启用后,eldoc 会显示光标下元素的帮助文本,无需手动调用。

补全和版本控制改进

小缓冲区和补全

  • 即时更新: completion-eager-updatecompletion-eager-display 在用户输入时实时刷新补全 UI。
  • 导航:minibuffer-visible-completions 设置为 'up-down 可使用方向键在可见候选项之间导航。
  • Icomplete 增强: Icomplete 现在支持垂直的缓冲区内行为和前缀指示器。

版本控制 (VC)

  • 自动隐藏: vc-dir-auto-hide-up-to-datevc-dir 刷新期间自动隐藏已是最新的文件。
  • 历史重写: vc-allow-rewriting-published-history 为涉及强制推送或类似 Jujutsu 工具的工作流提供原生支持。

生活质量改进与小调节

  • kill-region-dwim:将其设置为 'emacs-word 可在未激活区域时让 C-w 向后删除一个单词,防止出现 “mark is not active” 错误。
  • view-lossage-auto-refresh:在 lossage 缓冲区(C-h l)中实时显示最近的按键。
  • ielm-history-file-name:允许 IELM 临时会话在重启后保持。
  • native-comp-async-on-battery-power:可设为 nil,以防止后台本地编译耗电或在笔记本上触发风扇。
  • tty-tip-mode:为在终端运行的 Emacs(-nw)添加工具提示支持。
  • 终端修复:长期存在于 termansi-term 中的 bug 已修复,该 bug 会导致基于 curses 的程序(如 htopnethack)的行被吞掉或乱码。
  • Modus 主题:本次发布包含多个新 Modus 主题,包括针对色盲(Deuteranopia)和 Tritanopia 优化的版本。

社区视角

用户之间的讨论表明,Tree-sitter 的集成重新激发了对该项目的兴趣。一些用户指出,Emacs 的高度可配置性结合现代大语言模型(LLM),降低了新用户的入门门槛,他们现在可以使用 AI 代理帮助维护 init.el 配置。

Sources