vc-modeでコミットメッセージを書くときに diffを表示する

基本的にコミットする際は git commit -vVimで書いているけど, Emacsの標準機能だけでいい感じにできないだろうかと思って調べてみた. 個人的には diffを見ながらコミットメッセージを書ければそれでよく、あとは基本的にはいらない.

;; Emacs 30以下向け
(add-hook 'vc-before-checkin-hook #'vc-diff)
(add-hook 'vc-checkin-hook (lambda ()
                             (when-let* ((buf (get-buffer "*vc-diff*"))
                                         (window (get-buffer-window buf)))
                               (delete-window window))))

とりあえず checkin(この表現も懐かしいが)前に vc-diff を実行し, commitが終わったらその窓を消すということで対応できた. Emacs 30までだとこれでいいんだけど, この辺りのソースを調べていると Emacs 31から log-edit-maybe-show-diff という関数が追加されており, これを使うと log-edit-hook の調整だけで対応できた

;; Emacs 31以上の場合
(setopt log-edit-hook '(log-edit-insert-message-template log-edit-maybe-show-diff))

log-edit-hook には変更したファイルリストを表示とかの機能がデフォルトで含まれているのだが, それは不要なので除いた.

余談

初めはコメントしてコミット用バッファに全部埋め込めばいいんじゃねって思ったんだけど, AIに尋ねたところ git commit でコメントとか diffを削除してくれるのは commit自体の機能ではなくてそのあとの cleanというフェーズでやっているらしい. なんで # で始めた行をコメントとして扱うということは単体ではできないようです.