*scratch*バッファを自動保存する

twitterで、*scratch*バッファで作業してて、間違えてC-xC-c押してうがーとなったと書いたら、
バッファがkillされるときと、emacsが終了するときに自動保存すべきというつっこみをいただき、まさにその通りだと思ったので実装してみました。



例によって対してテストしてません。ご使用の際には、問題は覚悟の上で(ry
作成するにあたって、saveplace.elを参考にしました。

(defvar scratch-save-directory "~/bak")
(defun scratch-save-kill-emacs-hook ()
  (let ((scratch-buf (get-buffer "*scratch*")))
    (when scratch-buf
      (with-current-buffer scratch-buf
        (write-file (format "%s/*scratch*%s"
                            (directory-file-name scratch-save-directory)
                            (format-time-string "%Y%m%d%H%M%S"))
                    nil)))))
(defun scratch-save-kill-buffer-hook ()
  (when (equal (current-buffer) (get-buffer "*scratch*"))
    (write-file (format "%s/*scratch*%s"
                        (directory-file-name scratch-save-directory)
                        (format-time-string "%Y%m%d%H%M%S"))
                nil)))
(add-hook 'kill-emacs-hook 'scratch-save-kill-emacs-hook)
(add-hook 'kill-buffer-hook 'scratch-save-kill-buffer-hook)

*scratchバッファをkillしたり、emacsを終了したりすると、ホームディレクトリ下のbakというディレクトリに自動で*scratch*バッファを保存します。
ファイル名は、*scratch*に20090605010109のような時刻を付与したものとなります。
# 秒までファイル名に加えてるから、被るということはそうそうないはず。たぶん。
問題は、*scratch*を一切利用してなくても、*scratch*バッファがあれば、確実に自動保存されちゃって、bakディレクトリ以下がすごい事になりかねないって事かなあ。
initial-scratch-messageとバッファの内容を比べて同じだったら、保存しないとかした方がいいかも。
まあ、そこは流動的に(^_^;)


そんなこんなで。やっぱりEmacs楽しい。

一応追記


initial-scratch-messageを見るならこんな感じかなあ…。

(defun scratch-save-kill-emacs-hook ()
  (let ((scratch-buf (get-buffer "*scratch*")))
    (when scratch-buf
      (with-current-buffer scratch-buf
        (when (not (string= initial-scratch-message (buffer-string)))
          (write-file (format "%s/*scratch*%s"
                              (directory-file-name scratch-save-directory)
                              (format-time-string "%Y%m%d%H%M%S"))
                      nil))))))
(defun scratch-save-kill-buffer-hook ()
  (when (equal (current-buffer) (get-buffer "*scratch*"))
    (when (not (string= initial-scratch-message (buffer-string)))
      (write-file (format "%s/*scratch*%s"
                          (directory-file-name scratch-save-directory)
                          (format-time-string "%Y%m%d%H%M%S"))
                  nil))))

ブログに書いて気付いたけど、(when (not ...))なんて書き方しないで、unless使うべきだったなあ。

更新時刻

  • 2009/06/05/01:15
  • 2009/06/05/01:20