Emacs scratch バッファの内容を保存しておいて読み込む

Emacs を起動したときに最初に開かれる scratch というバッファがあります。 temporary な内容をちょっとメモしておくのに使ったりしていますが、間違って Emacs を終了してしまった場合などにバッファの内容が失われてしまう点がネックとなっていました。

scratch バッファを使わずに別途即座に使い捨て用途のファイルを開く、open-junk-file.el という elisp もあり、私も便利に使っていますが、それでもたまには scratch に何かを書いておきたくなることがあります。

少し検索したところ Emacs 終了時に scratch バッファの内容をファイルに保存して、次回起動時にその内容を読み込んで scratch バッファを復元する elisp を公開している方が見つかりました。

保存するファイルのパスだけ変更して、init.el に書き加えました。

;; scratch バッファの内容をファイルに書き出して保持する
(defun save-scratch-data ()
  (let ((str (progn
               (set-buffer (get-buffer "*scratch*"))
               (buffer-substring-no-properties
                (point-min) (point-max))))
        (file "~/.emacs.d/.scratch"))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert str)
    (save-buffer)
    (kill-buffer buf)))

(defadvice save-buffers-kill-emacs
  (before save-scratch-buffer activate)
  (save-scratch-data))

(defun read-scratch-data ()
  (let ((file "~/.emacs.d/.scratch"))
    (when (file-exists-p file)
      (set-buffer (get-buffer "*scratch*"))
      (erase-buffer)
      (insert-file-contents file))
    ))

(read-scratch-data)

設定を反映させてから scratch バッファに適当に書き込んで、Emacs を C-x C-c で終了してみます。 .scratch というファイルが作られていました。再度 Emacs を起動したところ、 scratch バッファに先ほどの内容が復元されていることが確認できました。 これでいざというときも安心ですね!