Emacs 31 發行預覽:Tree‑sitter 自動化、Markdown‑ts 與核心增強

Emacs 31 專注於減少現代編輯體驗所需的「黏合程式碼」與外部套件,透過將高度需求的功能納入核心。最具衝擊的變更包括 tree‑sitter 語法的自動化、原生 Markdown tree‑sitter 模式的引入,以及能在 xref 緩衝區內直接編輯的功能。

自動化的 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 主動提供下載與建置缺少的語法,而不是直接回傳錯誤。

架構說明:自動安裝的語法不會依架構分離。如果設定目錄在不同架構(例如 x86_64 與 arm64)之間共享,則在一台機器上建置的二進位檔案無法在另一台機器上載入,因為它們位於相同的檔名下。

實驗性 markdown-ts-mode

Emacs 31 引入實驗性的 markdown-ts-mode,提供比單純語法高亮更完整的寫作體驗。因為仍屬實驗階段,它尚未掛接至 auto-mode-alist,必須透過 M-x load-library 手動載入,或自行加入 auto-mode-alist

主要功能包括:

  • 類 Org 的導覽:為導覽標題、折疊區段、在結構元素間移動等設計的快捷鍵,讓 Org‑mode 使用者感到熟悉。
  • 即時程式碼區塊:有圍欄的程式碼區塊會使用該語言的實際主要模式進行字體化(例如 elisp 區塊會使用真實的 Emacs Lisp font‑lock)。目標語言的編輯指令在這些區塊內也大多可正常運作。
  • 行內影像渲染:影像連結會直接在緩衝區中呈現,將文件從路徑清單轉變為視覺化文件。

Eglot 與 LSP 增強

Emacs 31 的 Eglot 現在可以利用內建的 markdown-ts-mode 來渲染 LSP 文件說明。透過 markdown-ts-view-mode,使用者可以在不安裝外部套件的情況下檢視格式化的懸停說明。

此外,eglot-events-buffer-size 正被 eglot-events-buffer-config 取代,以提供更好的事件日誌控制。

可編輯的 Xref 緩衝區

最重要的工作流程改進之一是引入 xref-edit-mode。過去 xref 緩衝區只能透過 xref-query-replace-in-results 以正規表達式進行取代,使用者常需將 xref 結果匯出至 grep 緩衝區才能逐行編輯。

有了 xref-edit-mode,使用者現在可以直接在 xref 結果中編輯。執行搜尋(例如 C-x p g)後,按 e 進入編輯模式;完成後以 C-c C-c 確認變更。

視窗管理與 UI 改進

Emacs 31 為重新排列視窗佈局提供了多個新指令,無需分割或關閉視窗:

  • Transpose:交換水平與垂直排列。
  • Rotate:旋轉整個佈局。
  • Flip:左右或上下鏡像佈局。

其他 UI 更新包括:

  • 側邊視窗 Speedbarspeedbar-window 現在允許 Speedbar 以正確的側邊視窗形式存在,而非獨立的浮動框架。
  • 積極補全completion-eager-updatecompletion-eager-display 會在使用者輸入時即時刷新補全 UI。將 minibuffer-visible-completions 設為 'up-down 可使用方向鍵在候選項間切換。
  • Icomplete 更新:一項修補(bug#75784)為 icomplete-mode 帶來垂直緩衝區行為與前綴指示器。

版控與 ERC 更新

  • VC 改進vc-dir-auto-hide-up-to-date 會在 vc-dir 重新整理時自動隱藏已是最新的檔案。另有 vc-allow-rewriting-published-history 支援強制推送或歷史改寫的工作流程(例如使用 Jujutsu)。
  • ERC 整潔:新設定確保 ERC 僅在新開啟的目標緩衝區插入先前日誌。scrolltobottom 模組不再依賴 erc-fill-wrap,簡化了舊版使用者的設定。

生活品質修正與配色主題

  • 終端模擬:長期以來 termansi-term 中的 bug 會在重新繪製時「吞掉」或弄亂行,現在已修復,使得基於 curses 的程式(如 htop)可正常使用。
  • Kill Region:將 kill-region-dwim 設為 'emacs-word 後,當未選取區域時 C-w 會向後刪除一個字,避免出現「標記未啟用」的錯誤。
  • Lossage 檢視view-lossage-auto-refreshC-h l 成為即時檢視最近按鍵的視窗。
  • Modus 主題:Emacs 現在隨附多種 Modus 主題,包含針對色盲(deuteranopia、tritanopia)優化的版本,以及針對亮色(modus-operandi)與暗色(modus-vivendi)背景的「著色」變體。

社群觀點

社群中的使用者與開發者指出,Tree‑sitter 的整合為專案注入新活力,從原本的獨立語言模式轉向更普遍有用的工具。有使用者表示,Emacs 超高度可設定的特性特別適合現代 LLM 代理人,這些代理人能協助維護複雜的 init.el 檔案。

"像 Emacs 這樣可以透過文字檔高度設定的系統,似乎天生就適合現代 LLM… 代理人在設定與維護你的 .emacs/init.el 上表現非常好。"

其他人則強調,雖然學習曲線仍然陡峭,但朝向「開箱即用」功能的方向減少了新手必須依賴 Doom、Spacemacs 等大型發行版的摩擦。


摘要

Emacs 31 帶來多項生活品質提升,包括自動安裝 tree‑sitter 語法、實驗性的內建 markdown‑ts‑mode,以及可編輯的 xref 緩衝區。

Sources