Emacsで全バッファを読み直すコマンドmy-revert-all-file-buffers.

バージョン管理システムを使っていて、エディタの外部からファイルを更新した ときに、いちいち全バッファを読み直すのは面倒。探したけどすぐには見つから なかったので書いてみた。

ファイルに関連付けられたバッファだけが対象。 C-uで前置引数を付けると問い合わせなしに実行する。

シェルで

$ svn update
$ git-checkuot foobranch

とかした後にEmacsで

C-u M-x my-revert-all-file-buffers

とするのが典型的な使い方。

一応xyzzyでも動く。そもそもxyzzyは(Windows FSのおかげで)ファイルが更新 されたことを自動で認識するらしいので不要だけど。

(あと、xyzzyの場合はバッファが変更されているとmessage-boxで問い合わせて くるのであまり便利ではない。xyzzyのrevert-bufferは問い合わせをしないオプ ションがないのかな。問い合わせを出しているのは、buffer.lの revert-buffer-normalで使われているread-fileあたりらしい。)

;; uncomment these on xyzzy
;; (defun emacs-version ()
;;   (concat (software-type) " " (software-version)))
;; (defun buffer-file-name (&optional buf)
;;   (get-buffer-file-name (or buf (selected-buffer))))

;; my-revert-all-file-buffers
(defun my-revert-all-file-buffers (P)
  "Revert all visited buffers.
With prefix argument, it will not ask for confirmation."
  (interactive "P")
  (if (or P (y-or-n-p "Revert all file buffers?"))
      (dolist (buf (buffer-list))
        (if (not (buffer-file-name buf))
            (message (concat (buffer-name buf) " skipped."))
          (save-excursion
            (set-buffer buf)
            (cond ((string-match "Emacs" (emacs-version))
                   (revert-buffer t t))
                  ((string-match "xyzzy" (emacs-version))
                   (revert-buffer))
                  (else (error (emacs-version))))
            (message (concat (buffer-name buf) " reverted.")))))
    (message "Aborted."))