anything-browse-kill-ring と session.el

まとめ


  • Anything と session.el を一緒に使うなら, 以下を .emacs に追加すること.
(setq session-save-print-spec '(t nil nil))

経緯


anything-show-kill-ring が以下のエラーを返し, 使えない状態となってしまいました.

void-variable \.\.\.

いろいろ調べてると helm-show-kill-ring: void-variable ... に行き当たりました.

どうやら session.el と組み合わせるていたため, 起きた問題のようです.

このスレッドにもあるように session-save-print-spec へ上掲のような値を束縛したところ anything-show-kill-ring が使えるようになりました.

おまけ


変数 session-save-print-spec とは何なのか.

少しだけ深入りしてみました.

まず M-x describe-variable session-save-print-spec すると以下のように返ってきます.

session-save-print-spec is a variable defined in `session.el'.
Its value is (t 2 1024)

Documentation:
*Print specification for the values of global variables to save.
The value looks like (CIRCLE LEVEL LENGTH) and is used to bind variables
`print-circle', `print-circle' and `print-circle' when evaluating
`session-save-session'.

...ん. これは Documentation が間違ってる感じですね.

関数 session-save-insert-variable を見てみましょう. 以下のような個所が見付かります.

    (let ((print-circle (car session-save-print-spec)) ;#dynamic
	  (print-level  (cadr session-save-print-spec)) ;#dynamic
	  (print-length (caddr session-save-print-spec)) ;#dynamic

ということで CIRCLE は print-circle, LEVEL は print-level, LENGTH は print-length に束縛して使っているようです.

各変数の値は以下のような意味を持っているとのことです.

  • print-circle
    • 末尾が先頭と繋がった構造をどのように print するか
  • print-level
    • 入れ子になったリストやベクタをどこまで print するか
  • print-length

(詳細は Variables Affecting Output 等でご確認ください.)

session-save-print-spec のデフォルト値は (t 2 1024) でしたので, 以下と等価といって良いでしょう.

(setq print-circle t
      print-level 2
      print-length 1024)

print-level が 2 ですので, 2 より多い要素を持ったリストやベクタの場合, 後続要素が ... と表現されてしまいます.

print-length も同様です.

(print-circle は上記 2 つとは異なりますが, 普段の生活にはあまり現れないでしょうから割愛します)


これにより, session.el が変数の値をファイルに書き出す際に ... が含まれてしまいます.

session.el は session-initialize 時に session-save-file を load しているだけのようです. 従って束縛される値も ... が含まれたものとなります.

... は通常, 変数名として使われていませんので, これを評価すると (void-variable ...) となります.


これらは print-level, print-length の値を増やしてあげることで回避できます. またこれらの変数には nil を束縛することで限界値を設けないという設定も可能です.

したがって以下のように束縛すると, 今回の問題を回避できることがわかります.

(setq session-save-print-spec '(t nil nil))

...あれ


おかしいな, 長めに kill した文字列が session に保存されなくなったような...

宿題にします... :(