*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