Next: , Previous: Buffer-Local Variables, Up: Variables


10.11 フレームローカルな変数

変数にバッファローカルな束縛があるように、 変数にはフレームローカルな束縛もあります。 これらの束縛は1つのフレームに属し、 そのフレームを選択しているときに有効になります。 フレームローカルな束縛は、実際にはフレームパラメータです。 特定のフレームでフレームローカルな束縛を作るには modify-frame-parametersを呼び出し、 パラメータ名として変数名を指定します。

特定の変数に対するフレームローカルな束縛を有効にするには、 関数make-variable-frame-localを呼び出します。

— コマンド: make-variable-frame-local variable

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)