バッファローカル変数は、特定のバッファに関連付けられたバッファローカルバインディングを持ちます。このバインディングは、そのバッファがカレントであるときに有効となり、そうでないときは無効となります。バッファローカルバインディングが有効な状態で変数に値を設定すると、新しい値はそのバインディングに格納されるため、他のバインディングは変更されません。つまり、この変更は値を設定したバッファ内でのみ反映されます。
特定のバッファに関連付けられていない変数の通常の束縛は、デフォルト束縛と呼ばれます。ほとんどの場合、これはグローバル束縛となります。
変数は、あるバッファではバッファローカルなバインディングを持ち、別のバッファでは持たないことがあります。デフォルトのバインディングは、その変数に対する独自のバインディングを持たないすべてのバッファで共有されます。(これには、新しく作成されたすべてのバッファが含まれます。)バッファローカルなバインディングを持たないバッファで変数を設定すると、これがデフォルトのバインディングとして設定されるため、新しい値はデフォルトのバインディングを参照するすべてのバッファで参照可能になります。
バッファローカルなバインディングの最も一般的な用途は、メジャーモードがコマンドの動作を制御する変数を変更することです。例えば、CモードとLispモードはともに変数
paragraph-start
を設定し、段落間を空行のみで区切るように指定します。これは、CモードまたはLispモードに設定されるバッファにおいて変数をバッファローカルにし、そのモードに応じた新しい値を設定することで実現しています。メジャーモードを参照してください。
バッファローカルなバインディングを作成する一般的な方法は make-local-variable
を用いることであり、メジャーモードのコマンドでは通常これが使用されます。これは現在のバッファにのみ影響し、他のすべてのバッファ(まだ作成されていないものを含む)は、明示的に独自のバッファローカルなバインディングが指定されない限り、引き続きデフォルト値を共有します。
より強力な操作は、make-variable-buffer-local を呼び出すことで変数を
自動的にバッファローカル
としてマークすることです。これは、まだ作成されていないバッファも含め、すべてのバッファにおいて変数をローカルにする操作だと考えることができます。より正確に言えば、変数を設定することで、その変数がまだローカルでない場合に、自動的に現在のバッファのローカル変数になるという効果があります。すべてのバッファは、通常通り変数のデフォルト値を共有した状態で始まりますが、変数を設定すると、現在のバッファに対してバッファローカルなバインディングが作成されます。新しい値はバッファローカルなバインディングに格納され、デフォルトのバインディングはそのまま保持されます。つまり、どのバッファにおいても
setq でデフォルト値を変更することはできず、変更する唯一の方法は setq-default を用いることです。
警告:
変数が1つ以上のバッファでバッファローカルなバインディングを持っている場合、let
は現在有効なバインディングを再バインドします。例えば、現在のバッファにバッファローカルな値がある場合、let はその値を一時的に再バインドします。バッファローカルなバインディングがいずれも有効でない場合、let はデフォルト値を再バインドします。let
内で別の現在のバッファに切り替え、そこで異なるバインディングが有効になった場合、let
のバインディングは表示されなくなります。また、別のバッファのまま let
を抜けた場合、アンバインディングは発生しません(ただし、処理自体は正しく行われます)。以下に例を示します:
(setq foo 'g) (set-buffer "a") (make-local-variable 'foo)
(setq foo 'a) (let ((foo 'temp)) ;; foo ⇒ 'temp ; let binding in buffer ‘a’ (set-buffer "b") ;; foo ⇒ 'g ; the global value since foo is not local in ‘b’ body...)
foo ⇒ 'g ; exiting restored the local value in buffer ‘a’, ; but we don’t see that in buffer ‘b’
(set-buffer "a") ; verify the local value was restored
foo ⇒ 'a
なお、body 内の foo への参照は、バッファ
‘b’ のバッファローカルなバインディングにアクセスします。
ファイルでローカル変数の値が指定されている場合、そのファイルを開くとそれらはバッファローカルな値となります。The GNU Emacs ManualのFile Variablesを参照してください。
端末ローカル変数をバッファローカルにすることはできません(複数の端末を参照)。