psession 20170110.228(in MELPA)
Persistent save of elisp objects.

概要

psessoin.elを使えば、Emacs終了時に特定の変数を保存し、
再起動時にそれらを復元します。

保存・復元する内容は以下のものです。

  • 各種変数
  • 開いているファイルバッファ・diredバッファ
  • 終了時点のウィンドウ構成

保存される場所は ~/.emacs.d/elisp-objects/ です。

ちなみに、保存・復元するEmacs Lispは古くから windows.el があります。
http://www.gentei.org/~yuuji/software/

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてpsessionを使う方は
以下のコマンドを実行します。

M-x package-install psession

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name psession

設定 140821132526.psession.el(以下のコードと同一)

(require 'dired)                        ;FIXME
(psession-mode 1)

実行方法

$ wget http://rubikitch.com/f/140821132526.psession.el
$ emacs -Q -f package-initialize -l 140821132526.psession.el

保存する変数をカスタマイズする

保存する変数は psession-object-to-save-alist で設定します。
このように定義されています。

(defcustom psession-object-to-save-alist
  '((ioccur-history . "ioccur-history.el")
    (extended-command-history . "extended-command-history.el")
    (helm-external-command-history . "helm-external-command-history.el")
    (helm-surfraw-engines-history . "helm-surfraw-engines-history.el")
    (psession--save-buffers-alist . "psession-save-buffers-alist.el")
    (helm-ff-history . "helm-ff-history.el")
    (helm-grep-history . "helm-grep-history.el")
    (kill-ring . "kill-ring.el")
    (kill-ring-yank-pointer . "kill-ring-yank-pointer.el")
    (register-alist . "register-alist.el")
    (psession--winconf-alist . "psession-winconf-alist.el"))
  "Alist of vars to save persistently.
It is composed of (var_name . \"var_name.el\").
Where \"var_name.el\" is the file where to save value of 'var_name."
  :group 'psession
  :type '(alist :key-type symbol :value-type string))

オブジェクトを永続化する方法

Emacs Lispのオブジェクトは簡単に永続化できます。

永続化している関数はこれですが、これを見ればわかるように、

  • print-length
  • print-level
  • print-circle
  • print-quoted
  • print-escape-newlines
  • print-escape-nonascii
  • print-escape-multibyte

を設定し、 prin1 でファイルに書き出せば永続化できます。

他にはバイトコンパイルし、setqを加え、バイトコンパイルし、
バイトコンパイル前のソースを削除しています。

(defun psession--dump-object-to-file (obj file)
  "Save symbol object OBJ to the byte compiled version of FILE.
OBJ can be any lisp object, list, hash-table, etc...
Windows configurations and markers are not supported.
FILE must be an elisp file with ext \"*.el\" (NOT \"*.elc\").
Loading the *.elc file will restitute object.
That may not work with Emacs versions <=23.1 for hash tables."
  (require 'cl-lib) ; Be sure we use the CL version of `eval-when-compile'.
  (cl-assert (not (file-exists-p file)) nil
             (format "dump-object-to-file: File `%s' already exists, please remove it." file))
  (unwind-protect
       (let ((print-length           nil)
             (print-level            nil)
             (print-circle           t)
             (print-quoted           t)
             (print-escape-newlines  t)
             (print-escape-nonascii  t)
             (print-escape-multibyte t))
         (with-temp-file file
           (prin1 `(setq ,obj (eval-when-compile ,obj)) (current-buffer)))
         (byte-compile-file file)
         (message "`%s' dumped to %sc" obj file))
    (delete-file file)))


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。