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-update和completion-eager-display在用户输入时实时刷新补全 UI。 - 导航: 将
minibuffer-visible-completions设置为'up-down可使用方向键在可见候选项之间导航。 - Icomplete 增强: Icomplete 现在支持垂直的缓冲区内行为和前缀指示器。
版本控制 (VC)
- 自动隐藏:
vc-dir-auto-hide-up-to-date在vc-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)添加工具提示支持。- 终端修复:长期存在于
term和ansi-term中的 bug 已修复,该 bug 会导致基于 curses 的程序(如htop或nethack)的行被吞掉或乱码。 - Modus 主题:本次发布包含多个新 Modus 主题,包括针对色盲(Deuteranopia)和 Tritanopia 优化的版本。
社区视角
用户之间的讨论表明,Tree-sitter 的集成重新激发了对该项目的兴趣。一些用户指出,Emacs 的高度可配置性结合现代大语言模型(LLM),降低了新用户的入门门槛,他们现在可以使用 AI 代理帮助维护 init.el 配置。