Emacs が落ちたけど大丈夫。使っててよかった session.el。

どもです。

午前3:03。Emacs 落ちる。

あるものを elisp で作っていて,そのせいかどうかはわからないが,
3時3分に,Emacs が落ちた。メモリアクセス違反。
一瞬まいった! と焦ったが,時刻を見て,すぐに,あ,大丈夫だと。


以前,バイナリファイルを,shell-mode から,cat してしまって,
制御不能になり,落ちたのですが,その時に,30分毎に,セッション情報を
書き出すようにしていたので,へっちゃら。
30分毎に設定したつもりですが,どうやら,30分毎というのは,
たとえば,9:00, 9:30, 10:30, ... という30分ごとでした。
ほいで,今回落ちた時刻は 3:03 だったので,セッション情報を全くと言っていいほど,
失わずに済みました。
前回落ちたときに,新たに設定した内容を,
http://d.hatena.ne.jp/whitypig/20101215/1292416275
から引用。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; session.el
;; http://emacs-session.sourceforge.net/
(when (require 'session nil t)
  (setq session-save-file-coding-system 'utf-8-unix)
  (setq session-save-file (expand-file-name "~/.session/.session.ntemacs"))
  (setq session-initialize '(session places))
  (setq session-globals-max-size 1024)
  (setq session-globals-max-string (* 1024 1024))
  (setq session-globals-include '((kill-ring 512)
                                  (session-file-alist 512)
                                  (file-name-history 512)
                                  (tags-table-set-list 128)
                                  (tags-table-list 128)))
  (add-hook 'after-init-hook 'session-initialize)
  ;; Save session info every 30 minutes
  (setq my-timer-for-session-save-session (run-at-time t 1800 'session-save-session)))

(setq my-timer-for-session-save-session (run-at-time t 1800 'session-save-session))
というが,30分毎に設定している部分。秒単位で指定です。


アイドル時間にセッション情報を書き出すようにしてもいいんですが,
それだと,パチパチしている間に落ちたら,前回のアイドル時間までの
セッション情報しか復元できない。
そして,停電とか以外で落ちるときは,だいたいパチパチしているとき。
なので,問答無用で,一定時間毎に書き出してくれる方が助かると思うわけです。
心配なら,15分ごと,つまり900秒に設定すりのもありかなぁと思います。


Linux とかの Emacs なら,滅多に落ちることはないんだしょうが,
というかよく知りませんが,Windows の場合,たまーーーに落ちる。
ま,たぶん,ワタシがへっぽこなコードを書いているせいでしょう。
ほいで,Emacs を一度立ち上げたら,終了することはほとんどないので,
何かしらの手段で,セッション情報を定期的に保存することは必要かなと。
開いたファイルの履歴とか,使ったコマンドの履歴とか飛ぶと大変だお。
あぁ,もちろんバッファ自体の保存は,auto-save-buffers-enhanced.el を
使って,アイドル時間1秒で保存するように設定してあるので,飛ぶことはまずないと。
ついでに,auto-save-buffers-enhanced.el の設定も。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; http://svn.coderepos.org/share/lang/elisp/
;; http://0xcc.net/misc/auto-save/
(require 'auto-save-buffers-enhanced)
(auto-save-buffers-enhanced t)
(setq auto-save-buffers-enhanced-interval 1)

そんなわけで,session.el を使って,一定時間毎にセッション情報を保存するの,
おすすめです。