scratchバッファを定期的に保存するコードを書いた

私自身は scratchバッファはほとんど使わないのですが、
会社の同僚が scratchバッファにいろいろ書いている最中
Emacsが落ちてしまってえらい目にあっていたので書いてみました。


同様のコードはいろんなところにあるんだけど、定期的に保存って
いうのはあまりなかったので、そこが新しいかなと。

コード

こんな具合です。
elispは全然詳しくないので、指摘していただけると嬉しく思います。


追記 バッファサイズが 0の場合保存しないようにしました。

(defun scratch-buffer-save-periodically ()
  (let ((pid (emacs-pid))
        (save-dir (expand-file-name "~/.emacs.d"))
        (scratch-buffer (get-buffer "*scratch*")))
    (when scratch-buffer
      (with-temp-buffer
        (erase-buffer)
        (insert-buffer scratch-buffer)
        (unless (= (- (point-max) (point-min)) 0)
          (write-region (point-min) (point-max)
                        (format "%s/scratch-%s-%d"
                                save-dir
                                (format-time-string "%Y-%m-%d")
                                pid)
                        nil 'silent))))))

(run-at-time t 60 'scratch-buffer-save-periodically)

run-at-timeに第二引数を好きな秒数にしてもらえれば、その秒ごとに
保存されます。ファイル名は何でもいいかなと思ったんですが、複数
Emacsの scratchでごにょごにょしている人のことを考慮して、日付と pidを
付けるようにしました。

まとめ

scratchバッファを定期的に保存する方法を示しました。
scratchバッファを使うことは個人的にはおすすめしません。
ちょっと面倒でもファイル作ってやった方がいいと思います。


もしくは open-junk-file等を使うようにすべきだと思います。
EmacsWiki: open-junk-file.el