Emacsで保存する度に、保存時刻付きのバックアップファイルを1つのディレクトリに作る

Emacsのバックアップファイルが散逸するのがウザいので、1つのバックアップディレクトリに生成するようにしたい。
その設定はこちらを参考にした。
バックアップファイルについての設定


さらに、バックアップファイルを、保存する度に保存時刻付きで取っていけば、変な変更をしてしまって後で後悔したときにも戻しやすい。どうせ有り余っている研究室の巨大なハードディスク容量を有効に活用できる方法では無いか。まぁ増えていくと管理も面倒になるだろうから、Version Controlなどと併用するのがいいだろうという先輩の意見にも同意。あとcronとかで30日毎に消すとかしないと後々HDDが死ねるかも。

まず、参考にしたサイトからlispファイルを落とし、以下のように書き換えた。

(setq make-backup-files t)
(setq backup-directory "~/emacs-backup")
(if (and (boundp 'backup-directory)
         (not (fboundp 'make-backup-file-name-original)))
    (progn
      (fset 'make-backup-file-name-original
            (symbol-function 'make-backup-file-name))
      (defun make-backup-file-name (filename)
        (if (file-directory-p (expand-file-name backup-directory))
            (concat (expand-file-name backup-directory) 
                    "/" (file-name-nondirectory filename) "~" 
		    (format-time-string "%y%m%d-%T") "~")
          (make-backup-file-name-original filename)))))

backup-directoryの引数を変えることで、保存先を変えることが出来る。
これで出来るバックアップファイルのファイル名の形式は

test.txt~101225-14:11:07~

こんな感じだ。形式を変えたいならformat-time-stringの引数をいじる。


次。
Emacsは、1つのバッファに対して、そのセッションで初めて変更が加えられて保存された時しかバックアップを生成しない。これは、C-x C-sにバインドされている関数save-bufferの引数が0であることに起因するようだ。

save-bufferに引数16を与えると、二回目以降の変更保存でも自動でバックアップを生成する。

save-bufferに引数16を与える方法として、

C-x C-s

ストロークするかわりに

C-u C-u C-x C-s

ストロークすることがある。しかし毎回保存する度にこれを打つとか眩暈がするほど面倒臭い。

というわけで、C-x C-sにバインドされている関数を、(save-buffer 16)にしてしまおう。
以下の記述を.emacsなどの初期設定ファイルに追加。

; Backup files
(load "make-backup-file.el") ;; <- 上のlispファイル。置いた場所にパスを通しておくこと。
(defun save-buffer-with-backup ()
  (interactive)
  (save-buffer 16))
(global-set-key "\C-x\C-s" 'save-buffer-with-backup)

もっと賢い方法もあるのかもしれないが、俺に思い付くのはこれが精一杯だ。
とりあえずこれで動作確認。

バインドする第3引数には関数そのまま書いちゃいけないんだっけか。もう忘れた。