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 に保存されなくなったような...
宿題にします... :(