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 フォントロックが適用されます)。対象言語向けの編集コマンドも概ねブロック内で機能します。
  • インライン画像レンダリング: 画像リンクがバッファ内に直接描画され、パスのリストから視覚的な文書へと変換されます。

Eglot と LSP の強化

Emacs 31 の Eglot は内部の markdown-ts-mode を利用して LSP ドキュメントをレンダリングできるようになりました。markdown-ts-view-mode を使用すれば、外部パッケージを必要とせずに整形されたホバー情報を閲覧できます。

さらに、eglot-events-buffer-sizeeglot-events-buffer-config に置き換えられ、イベントロギングの制御が向上しました。

編集可能な Xref バッファ

最も重要なワークフロー改善の一つは xref-edit-mode の導入です。従来、xref バッファは正規表現置換 xref-query-replace-in-results のみをサポートしており、個別行の編集を行うには結果を grep バッファにエクスポートする必要がありました。

xref-edit-mode を使えば、検索結果(例: C-x p g)の直後に e を押すだけでインライン編集モードに入り、C-c C-c で変更を確定できます。

ウィンドウ管理と UI の改善

Emacs 31 はウィンドウを分割したり削除したりせずにレイアウトを再配置できる新コマンドを複数追加しました:

  • Transpose: 水平配置と垂直配置を入れ替えます。
  • Rotate: レイアウト全体を回転させます。
  • Flip: 左右または上下にミラーリングします。

その他の UI 更新:

  • サイドウィンドウ Speedbar: speedbar-window が、別個のフローティングフレームではなく適切なサイドウィンドウに Speedbar を配置できるようになりました。
  • Eager Completion: completion-eager-updatecompletion-eager-display が、入力中に補完 UI をリアルタイムで更新します。minibuffer-visible-completions'up-down に設定すると、矢印キーで候補を移動できます。
  • Icomplete の更新: パッチ (bug#75784) により、icomplete-mode に縦方向のバッファ内表示とプレフィックスインジケータが追加されました。

バージョン管理と ERC の更新

  • VC の改善: vc-dir-auto-hide-up-to-datevc-dir のリフレッシュ時に最新のファイルを自動的に非表示にします。また、vc-allow-rewriting-published-history が強制プッシュや履歴書き換え(例: Jujutsu 使用)をサポートします。
  • ERC の整理: 新設定により、ERC は新しく開いた対象バッファに対してのみ以前のログを挿入します。scrolltobottom モジュールは erc-fill-wrap への依存をなくし、古いバージョンのユーザーでも設定が簡素化されました。

品質向上の修正とテーマ

  • 端末エミュレーション: termansi-term の長年のバグ(再描画時に行が「飲み込まれる」または文字化けする)が修正され、htop など curses 系プログラムが使えるようになりました。
  • Kill Region: kill-region-dwim'emacs-word に設定すると、領域が選択されていないときに C-w が単語を後方に削除でき、"the mark is not active" エラーを防げます。
  • Lossage View: view-lossage-auto-refresh により、C-h l が最近のキー入力をリアルタイムで表示します。
  • Modus テーマ: Emacs には複数の Modus テーマが同梱され、デュテラノピアやトリタノピア向けに最適化されたバージョンや、明るい背景 (modus-operandi) と暗い背景 (modus-vivendi) の両方に対する「ティント」バリエーションが含まれます。

コミュニティの視点

コミュニティのユーザーや開発者は、Tree‑sitter の統合がプロジェクトに活力を与え、個別の言語モードから汎用的なツールへとシフトしたことを評価しています。あるユーザーは、Emacs のハイパー構成可能性が現代の LLM エージェントに特に適していると指摘しています。LLM エージェントは複雑な init.el ファイルの保守を支援できるからです。

"テキストファイルでハイパー構成可能な Emacs のようなシステムは、現代の LLM にとってまさに作られたものです… エージェントは .emacs/init.el の設定や保守が得意です。"

他方で、学習曲線は依然として急であるものの、"箱から出すだけ"の機能が増えることで、従来は Doom や Spacemacs といった重厚なディストリビューションに依存していた新規ユーザーの導入障壁が下がったと強調されています。

Sources