1 ポイント 投稿者 GN⁺ 13 시간 전 | 1件のコメント | WhatsAppで共有
  • Emacs 31は正式リリース前だが、emacs-31ブランチとmasterにはすでに体感できる変化が蓄積しており、多くの設定が外部パッケージなしでEmacsコアだけで解決できる方向へ移っている
  • Tree-sitterの自動切り替え・文法インストールが入ったことで、メジャーモードや文法ソース設定を直接管理していた負担が減る
  • markdown-ts-mode、Eglotのドキュメントレンダリング、eldoc-help-at-pt、eager completion、xref-edit-modeは、編集・探索・ドキュメント確認の流れを組み込み機能中心に強化する
  • Speedbarのside window、VCの自動非表示、ERCログ条件、kill-region-dwimielm-history-file-namenative-comp-async-on-battery-powerのような小さなオプションが、繰り返し発生する摩擦を減らす
  • Emacs 31の機能名とデフォルト値はまだ変わる可能性があり、markdown-ts-modeとそれを使うEglotのドキュメントレンダリングは実験的機能であることが明記されている

Emacs 31プレビューの前提

  • Emacs 31はまだリリース前であり、基準環境は2026年半ばemacs-31ブランチとmasterをビルドして使う構成である
  • 紹介されている項目は実際に日常設定へ入った変更であり、その大半はEmacsコアに入っているか、それに近い状態である
  • 機能名やデフォルト値は最終リリースまでに変わる可能性がある
  • 設定例はEmacs Soloinit.el; EMACS-31コメントから確認できる

Tree-sitter設定の削減

  • Emacs 31では2つのオプションでTree-sitterベースのモード切り替えと文法インストールの流れが簡潔になる
    • treesit-enabled-modes t
    • treesit-auto-install-grammar t
  • treesit-enabled-modestにすると、Tree-sitter派生があるメジャーモードはそのモードへ切り替わる
  • treesit-auto-install-grammarは、文法がないときに単にエラーを出すのではなく、Emacsが文法を取得してビルドすることを提案する
  • TypeScript、TSX、Rust、TOML、YAML、Dockerfileのような言語の文法ソースがモード内に入ったことで、treesit-language-source-alistにURLやパスを手で書いていた設定を減らせる
  • 複数アーキテクチャで共有のEmacsディレクトリを使う場合は注意が必要
    • 自動インストールされた文法はアーキテクチャごとに分離されない
    • x86_64向けの.soarm64向けの.soが同じ名前の下に置かれるため、あるマシンでビルドしたバイナリを別のマシンで読み込めない可能性がある

組み込みの markdown-ts-mode

  • Emacs 31には実験的なmarkdown-ts-modeが含まれる
  • このモードは2025年初頭にemacs-develへ送られた提案から始まり、その後Stéphane Marksが共同執筆者として加わって改善が続いている
  • Markdownを単なる構文ハイライト対象ではなく、書きやすく読みやすい編集環境に近いものとして扱う
    • Orgユーザーに馴染みのある見出し移動、折りたたみ、構造要素の移動方式を提供する
    • fenced code blockは平坦な等幅テキストではなく、その言語の実際のmajor modeでfont-lockされる
    • Emacs Lispブロックや他の組み込みモードも実際の構文ハイライトを受けられる
    • コードブロック編集コマンドもかなりの部分が動作するが、ブロック内補完はまだ粗い部分が残っている
    • 画像リンクはバッファ内にインラインでレンダリングされる
  • まだauto-mode-alistには結び付けられておらず、.mdファイルを自動では扱わない
    • M-x load-library RET markdown-ts-modeでライブラリを読み込んだ後、バッファ内で有効化できる
    • 自分でauto-mode-alistへ追加する方法も可能
  • フィードバックはbug listM-x report-emacs-bugで送れる
  • 追加スクリーンショットはmarkdown-ts-mode-lab demoにある

Eglot、Eldoc、completionの改善

  • EglotはEmacs 31でLSPドキュメントをmarkdown-ts-view-modeでレンダリングできる
    • eglot-documentation-renderer 'markdown-ts-view-mode
    • 整形済みhover docsを外部パッケージなしで見られる
    • この機能はmarkdown-ts-modeに依存するため、同様に実験的である
  • eglot-code-action-indicationsで新しいinline code actionヒントを無効にできる
    • 一部のlanguage serverではヒントがうるさく感じられることがある
  • eglot-events-buffer-sizeeglot-events-buffer-configに置き換えられつつある
  • eldoc-help-at-pt tはカーソル下の項目のヘルプを別途呼び出さずに表示する
    • eldoc-echo-area-prefer-doc-bufferと一緒に使うと、不慣れなコードを探索するときの案内が増える
  • completion関連の新しい設定は、入力中のUIをより積極的に更新する
    • completion-eager-update t
    • completion-eager-display 'auto
    • minibuffer-visible-completions 'up-down
  • completion-eager-updatecompletion-eager-displayは、ユーザーが明示的に要求する前でも入力に合わせてcompletion UIを更新する
  • minibuffer-visible-completions'up-downに設定すると、表示中の候補を矢印キーで移動できる
  • icompleteにはbug#75784のパッチが含まれ、vertical in-buffer動作とprefix indicatorが入っている
    • icomplete-vertical-in-buffer-adjust-list
    • icomplete-vertical-render-prefix-indicator

ウィンドウ配置とSpeedbar

  • Emacs 31には、ウィンドウを手動で分割し直したり閉じたりしなくても配置を変えられるコマンドが追加された
    • window-layout-transpose
    • window-layout-rotate-clockwise
    • window-layout-flip-leftright
    • window-layout-flip-topdown
  • transposeは横・縦の配列を入れ替え、rotateは全体レイアウトを回転させ、flipコマンドは左右または上下にミラーする
  • バッファを維持したまま3ウィンドウ構成で、エディタウィンドウの位置だけ変えたいときに便利である
  • SpeedbarはEmacs 31で別フレームではなくside window内に配置できる
    • speedbar-window-default-width
    • speedbar-window-max-width
    • speedbar-window
  • speedbar-windowはSpeedbarをモダンなファイルツリーのように横へドックする
  • tiling環境や単一モニターのノートPCでは、従来のfloating frameよりside window方式のほうが適している

VCと編集可能なxref

  • VCには日常的なバージョン管理フローを軽くする設定が入っている
    • vc-auto-revert-mode t
    • vc-allow-rewriting-published-history t
    • vc-dir-auto-hide-up-to-date 'revert
  • vc-dir-auto-hide-up-to-dateは、vc-dirバッファを更新したときに最新状態のファイルを自動で隠す
    • 従来vc-dir-refreshの後にvc-dir-hide-up-to-dateを呼んでいたキーハックを削除できる
  • vc-allow-rewriting-published-historyは、Jujutsuやfeature branchのforce-pushのように、すでにpush済みの履歴を意図的に書き換える流れに合っている
  • Emacs 31には編集可能なxrefバッファが入っている
    • 既存のxrefバッファにはrxref-query-replace-in-resultsしかなく、正規表現ベースの置換に限られていた
    • Diredのwdired-modeやgrepバッファのgrep-edit-modeのように、結果バッファを直接編集する流れはxrefにはなかった
  • 最初の提案は、xref-export-to-grepでxref結果をfile:line:content形式のgrep-modeバッファへ書き出してから編集する方式だった
  • xrefメンテナーのDmitry Gutovが、grepバッファを経由するUIではなくxrefバッファのインライン編集を提案し、その後xref-edit-modeが実装されて入った
  • xref-edit-modeは追加のバッファ移動をなくし、大きなxrefバッファでもより高速に動作する
  • 利用フローは、C-x p gで検索した後、*xref*バッファでeを押して編集モードを開始し、修正後にC-c C-cで確定する形である
  • 関連する議論はbug#80616で公開されている

ERCと小さな品質改善

  • ERCはerc-log-insert-log-on-open 'erc-log-new-target-buffer-pで、新しいtarget bufferを開いたときだけ過去ログを挿入できる
  • Emacs 31ではERCのscrolltobottomモジュールがもはやerc-fill-wrapに依存しないため、以前のバージョン向け条件付き設定を削除できる
  • 小さな設定値も使い勝手の改善に寄与する
    • delete-pair-push-mark t: delete-pairの後にmarkをpushし、C-x C-xで内側を選択できる
    • ibuffer-human-readable-size t: 生のバイト数ではなくKB/MB表示を使う
    • ielm-history-file-name: IELM入力履歴を再起動後も保持する
    • kill-region-dwim 'emacs-word: active regionがないとき、C-wがエラーではなく後方の単語をkillする
    • native-comp-async-on-battery-power nil: バッテリー使用中はバックグラウンドnative compilationを止める
    • view-lossage-auto-refresh t: C-h lが最近のキー入力をリアルタイム更新する
    • display-fill-column-indicator-warning nil
    • dired-hide-details-hide-absolute-location t: dired-hide-details-modeで絶対ディレクトリパスを隠す
    • world-clock-sort-order "%FT%T": world clockのソートを調整する
    • zone-all-frames t
    • zone-all-windows-in-frame t
    • uniquify-after-kill-buffer-flag t: 以前の-pバリアントから名前が変わった
  • kill-region-dwimC-wで"the mark is not active"エラーを避けられるようにする
  • view-lossage-auto-refreshは画面共有や教育中にキー入力をリアルタイム表示するのに役立つ
  • native-comp-async-on-battery-power nilは、電源未接続で移動中にバックグラウンドコンパイルでファンが回る状況を減らす
  • tty-tip-mode-nwで実行するEmacsでもtooltipsを提供する

term、Modusテーマ、masterを使う理由

  • Emacs 31はtermansi-termで、行が飲み込まれたり画面が壊れたりする問題を修正する
    • htopnethack、cursesベースのプログラムのように、カーソル位置指定や全画面再描画を使うプログラムがEmacsターミナル内で正しく再描画される
    • 外部ターミナルエミュレーターを開かなければならない理由が1つ減る
  • EmacsにはProtesilaosのModus 5テーマが同梱される
    • modus-operandi-deuteranopia: 白背景のdeuteranopia最適化テーマ
    • modus-operandi: 白背景の可読性が高いテーマ
    • modus-operandi-tinted: 明るい黄土色背景の可読性が高いテーマ
    • modus-operandi-tritanopia: 白背景のtritanopia最適化テーマ
    • modus-vivendi-deuteranopia: 黒背景のdeuteranopia最適化テーマ
    • modus-vivendi: 黒背景の可読性が高いテーマ
    • modus-vivendi-tinted: 夜空背景の可読性が高いテーマ
    • modus-vivendi-tritanopia: 黒背景のtritanopia最適化テーマ
  • 未リリースのEmacsを毎日使う理由は、コアに何が入ってくるのかを直接確認し、リリースごとに自作のglue codeが減っていく過程を見るためである
  • すでに入っている機能を扱った対になる記事としてEven More Batteries Included with Emacsもあわせて読める

1件のコメント

 
Lobste.rs の意見
  • tree-sitter の変更が本当に楽しみ。設定の過程がいつもかなりぎこちないと感じていた
    eager complete も気になる。icompletefido-mode は求めているものにかなり近いけれど、まだ corfu のようなサードパーティ製パッケージほど使いやすくはない

    • いつか vertico などに近い体験を 組み込み機能だけで、しかもデフォルトで有効な状態で得られるようになってほしい
      いくつか調整して組み込み機能を有効にするだけでも使い勝手は大きく変わるが、bedrockemacs-solo はそういう形で構成されている
    • Emacs 32 を日常的に使っているが、treesit がそのまま動くとは言いがたい
      Emacs を起動するたびに、欠けている dylib についての大きなメッセージが毎回表示される
  • 例にある (treesit-auto-install-grammar t)(treesit-enabled-modes t) の構文は関数呼び出しのように見えるが、実際には設定すべき オプション
    次のリリースには気に入っている小さな変化もある。minibuffer-nonselected-mode がデフォルトで有効になり、ミニバッファに未完了の作業が残っているかをより把握しやすくなったし、diff-modediff-delete-other-hunks は Emacs 29 で導入された diff バッファの VC 動作と組み合わせるととても便利だ
    with-work-bufferwith-temp-buffer に似ているが、バッファプールを再利用する。個人設定でたまたま同じバッファ名規則の *work* を使っていて、それで知った
    Emacs 31 には lua-mode が含まれており、もう別途インストールする必要がない
    再び自分の望む形で正確に動かすために、いくつか調整も必要だった。xterm-mouse-mode がデフォルトで有効なので明示的に無効にし、mode-line face が暗いテーマ向けに変わるが以前のデフォルト色に慣れていたので戻した
    Emacs 31 はソースファイルに lexical-binding クッキーがないと警告する。気になるなら無効化できるし、elisp-enable-lexical-binding コマンドで簡単に修正でき、lexical-binding をグローバルなデフォルト値にすることもできる
    新しいバグさえなければ、いつものように 堅実なリリース になりそうだ

    • この例はおそらく use-package:custom リストからコピーしたものだろう
      そのせいで :custom には少し曖昧さを感じる。値を試したり共有したりするときにより面倒になる
    • with-work-buffer性能目的 なのか? ドキュメントには with-temp-buffer の代わりにこれを使うべき理由ではなく、より注意すべきだという話しかない
    • この警告をどう無効にするのか気になる。理想的には elpa 内のファイルは警告せず、自分のファイルに対してだけ警告できるとよい
      それに、自分の Emacs の警告 68 件のうち 64 件が生成ファイルである -autoloads.el から出ている。これは elpa/melpa 側の生成ツールで直すべき問題のようだ
  • ついに 編集可能な xref を待ち望んでいたが、これは自分の生活をずっと楽にしてくれそうだ
    日々触るものに驚くほど多く関わる、すばらしい変更がたくさんある

  • Nvim がデフォルトを vim の正規表現から treesitter に変えたせいで、自分の執筆環境が壊れた
    treesitter は Markdown 内の HTML コメントをパースするのに多少設定が必要で、つぎはぎで整えたあとでも動かなかった
    結局 treesitter を無効にして解決した
    エディタのような基本インフラにはかなり保守的だ。エディタの変更はたいてい、何年も問題なく使えていた何かを壊す

    • 幸い Emacs はデフォルトを treesitter に変えるのではなく、今でもすべて 任意で有効化 する形だ