変数にバッファローカルな束縛があるように、
変数にはフレームローカルな束縛もあります。
これらの束縛は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)