バッファローカルな束縛を持つ変数のグローバル値は、現在のバッファにその変数の独自の束縛がない場合に常に適用される値であるため、デフォルト値とも呼ばれます。
関数 default-value および setq-default
は、現在のバッファにバッファローカルな束縛があるかどうかにかかわらず、変数のデフォルト値にアクセスして変更します。例えば、setq-default を使用してほとんどのバッファにおける paragraph-start のデフォルト設定を変更することができ、この変数にバッファローカルな値を持つ C
モードや Lisp モードのバッファにいる場合でも動作します。
特殊形式 defvar および defconst
も、バッファローカルな値ではなく、デフォルト値(そもそも変数を設定する場合)を設定します。
この関数は symbol
のデフォルト値を返します。これは、この変数に対する独自の値を持たないバッファやフレームで表示される値です。symbol がバッファローカルでない場合、これは symbol-value と同等になります(変数の値へのアクセス を参照してください)。
関数 default-boundp は、symbol
のデフォルト値が nonvoid であるかどうかを判定します。(default-boundp
'foo) が nil を返す場合、(default-value 'foo) はエラーになります。
default-boundpとdefault-valueの比は、boundpとsymbol-valueの比に等しい。
この特殊な形式は、各 symbol に、対応する form
を評価した結果である新しいデフォルト値を与えます。symbol は評価しませんが、form は評価します。setq-default
形式の値は、最後の form の値となります。
symbol
が現在のバッファに対してバッファローカルではなく、かつ自動的にバッファローカルとしてマークされていない場合、setq-default は setq
と同じ効果を持ちます。symbol
が現在のバッファに対してバッファローカルである場合、これにより他のバッファが参照する値(バッファローカルな値を持たない限り)は変わりますが、現在のバッファが参照する値は変わりません。
;; In buffer ‘foo’:
(make-local-variable 'buffer-local)
⇒ buffer-local
(setq buffer-local 'value-in-foo)
⇒ value-in-foo
(setq-default buffer-local 'new-default)
⇒ new-default
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ new-default
;; In (the new) buffer ‘bar’:
buffer-local
⇒ new-default
(default-value 'buffer-local)
⇒ new-default
(setq buffer-local 'another-default)
⇒ another-default
(default-value 'buffer-local)
⇒ another-default
;; Back in buffer ‘foo’:
buffer-local
⇒ value-in-foo
(default-value 'buffer-local)
⇒ another-default
この関数はsetq-defaultと同様ですが、symbolが通常の評価済み引数である点が異なります。
(set-default (car '(a b c)) 23)
⇒ 23
(default-value 'a)
⇒ 23
変数を値に let-bind することができます(ローカル変数を参照)。これにより、そのグローバル値がバインドによってシャドウイングされます。すると、default-value はグローバル値ではなくそのバインドの値を返し、set-default はグローバル値を設定することができなくなります(代わりに let-bind
された値が変更されます)。以下の2つの関数を使用すると、let-bind によってシャドウイングされていても、グローバル値を参照できます。
この関数は、symbol のトップレベルのデフォルト値(つまり、いかなる let 束縛の外側での値)を返します。
(defvar variable 'global-value)
⇒ variable
(let ((variable 'let-binding))
(default-value 'variable))
⇒ let-binding
(let ((variable 'let-binding))
(default-toplevel-value 'variable))
⇒ global-value
この関数は、symbol のトップレベルのデフォルト値を指定した value に設定します。これは、コードが symbol の let 束縛のコンテキストで実行されるかどうかにかかわらず、symbol のグローバル値を設定したい場合に便利です。
変数のバッファローカル値は、let束縛によってシャドウイングされることもあります。2つの関数を使えば、変数のトップレベルのバッファローカル値(すなわちlet束縛の外側の値)を取得・設定できます。
この関数は、let束縛の外において、buffer内のsymbolのローカル値(デフォルトは現在のバッファ)を返します。symbolがbuffer内でローカルでない場合、この関数はエラーを通知します。
この関数は、let束縛の外で、buffer 内の symbol のローカル値を value に設定します(デフォルトでは現在のバッファが対象となります)。
symbol は、まだローカルでなかった場合、buffer 内でローカルになります。グローバル変数の場合、これは symbol が buffer で別の値を持つことを意味します。自動的にバッファローカルとなる変数の場合、この関数によって buffer にローカル値が存在することになります。symbol が恒久的にバッファローカルである場合、value はメジャーモードの変更をまたいで、その変数のバッファローカル値として保持されるようになります。
これは、現在実行中のコマンドが完了した後も保持されるバッファローカル値を変更したい場合に有用です。その変数が let
束縛された状態でコードが実行される可能性があるためです。この場合、setq-local
を用いた通常のバッファローカル値の設定方法では、let
束縛内の値のみが変更され、基盤となるバッファローカル値は変更されません。この関数は、後者の値を設定します。