変数にバッファローカルな束縛があるように、
変数にはフレームローカルな束縛もあります。
これらの束縛は1つのフレームに属し、
そのフレームを選択しているときに有効になります。
フレームローカルな束縛は、実際にはフレームパラメータです。
特定のフレームでフレームローカルな束縛を作るには
modify-frame-parameters
を呼び出し、
パラメータ名として変数名を指定します。
特定の変数に対するフレームローカルな束縛を有効にするには、
関数make-variable-frame-local
を呼び出します。
variableに対してフレームローカルな束縛を使うようにする。 この関数そのものはvariableに対してフレームローカルな束縛を作成しない。 しかし、フレームパラメータとしてvariableの値を持つフレームが すでに存在すれば、その値は自動的にフレームローカルな束縛になる。
変数が端末にローカルであると、この関数はエラーを通知する。 そのような変数はフレームローカルな束縛を同時には持てないからである。 see Multiple Displays。 Emacsで特別に実装されている少数の変数は(普通) バッファローカルになることができるが、フレームローカルにはならない。
バッファローカルな束縛はフレームローカルな束縛に優先します。
変数foo
を考えてみましょう。
カレントバッファにfoo
のバッファローカルな束縛があると、
その束縛が有効になります。
選択したフレームにfoo
のフレームローカルな束縛があると、
その束縛が有効になります。
さもなければ、foo
のデフォルトの束縛が有効になります。
つぎに例を示します。
まず、foo
の束縛を準備しておきます。
(setq f1 (selected-frame)) (make-variable-frame-local 'foo) ;; `b1'において、foo
のバッファローカルな束縛を作る (set-buffer (get-buffer-create "b1")) (make-local-variable 'foo) (setq foo '(b 1)) ;; 新しいフレームでfoo
のフレームローカルな束縛を作る ;; そのフレームをf2
に格納する (setq f2 (make-frame)) (modify-frame-parameters f2 '((foo . (f 2))))
では、さまざまな文脈でfoo
を調べてみましょう。
バッファ`b1'がカレントバッファであれば、
選択したフレームに関係なく、
`b1'のバッファローカルな束縛が有効になっています。
(select-frame f1) (set-buffer (get-buffer-create "b1")) foo => (b 1) (select-frame f2) (set-buffer (get-buffer-create "b1")) foo => (b 1)
さもなければ、フレームの束縛を使う可能性があります。
フレームf2
を選択していると、
そのフレームローカルな束縛が有効になります。
(select-frame f2) (set-buffer (get-buffer "*scratch*")) foo => (f 2)
カレントバッファにもフレームにも束縛がなければ、 デフォルトの束縛を使います。
(select-frame f1) (set-buffer (get-buffer "*scratch*")) foo => nil
変数の有効な束縛がフレームローカルな束縛であるとき、
変数に設定するとその束縛を変更します。
frame-parameters
でその結果を見ることができます。
(select-frame f2) (set-buffer (get-buffer "*scratch*")) (setq foo 'nobody) (assq 'foo (frame-parameters f2)) => (foo . nobody)