Next: , Previous: Hooks, Up: Variables


28.2.4 ローカル変数

M-x make-local-variable <RET> var <RET>
変数varがカレントバッファでローカルに値を持つようにする。
M-x kill-local-variable <RET> var <RET>
変数varがカレントバッファではグローバル値を使うようにする。
M-x make-variable-buffer-local <RET> var <RET>
変数varを、値を設定したときにその時点のカレントバッファでローカル に値を持つようにする。

ほとんどの変数はEmacsバッファに対してローカルにできます。 つまり、その変数のバッファ中での値は他のバッファでの値とは 独立になります。 いくつかの変数はつねにすべてのバッファにおいてローカルです。 それ以外の変数はすべて、グローバルな値、 つまりその変数をローカルにしていないすべてのバッファにおいて 共有される値を持ちます。

M-x make-local-variableは変数名を受け取り、 その変数をカレントバッファにおいてローカルにします。 それ以降、このバッファ内でその変数を変更しても 他のバッファには影響しませんし、 その変数のグローバルな値を変更してもこのバッファ内での値には影響しません。

M-x make-variable-buffer-localは、変数名を受け取り、 値が設定されるとその変数が自動的にローカルになるようにします。 もっと正確にいえば、このように特別な印を変数に付けておくと、 通常の方法で変数に値を設定するときにはつねにまず make-local-variableが実行されるようになるのです。 このような変数をバッファごとの変数と呼びます。

メジャーモード(see Major Modes)では、 変数を設定するまえにつねにローカルにします。 このため、あるバッファでメジャーモードを変更しても 他のバッファには影響が及びません。 マイナモード(see Minor Modes)も同様で、通常、 マイナモードごとにオン/オフを制御する変数があり、 その変数がnil以外のときにそのマイナモードはオンになります。 ほとんどのマイナモードでは、その制御用変数はバッファごとの変数です。

Emacsには、つねにバッファごとの変数であるような変数が数多くあります。 abbrev-modeauto-fill-functioncase-fold-searchcomment-columnctl-arrowfill-columnfill-prefixindent-tabs-modeleft-marginmode-line-formatoverwrite-modeselective-display-ellipsesselective-displaytab-widthtruncate-linesがそのような変数です。 これ以外にもつねに各バッファでローカルな変数はありますが、 それらは内部作業用の変数です。

いくつかの変数はディスプレイに対してローカルになっているため、 バッファに対してローカルにはできません (see Multiple Displays)。 これらの変数をバッファにローカルにしようとすると、 エラーメッセージが表示されます。

M-x kill-local-variableは、変数名を受け取り、 その変数をカレントバッファに対してローカルでなくします。 それ以降そのバッファでは、その変数のグローバルな値が使われます。 メジャーモードを設定すると、つねにローカルと印が付いた少数の特別な 変数を除いて、そのバッファにローカルなすべての変数をローカルでなくします。

ある変数がカレントバッファでローカルか否かに係わらず その変数のグローバルな値を設定したければ、setq-defaultを使います。 これはsetqのように使われますが、 (たとえローカルな値があったとしても)つねにグローバルな値のほうを設定します。 その変数がローカルな値を持っている場合、 新たに設定したグローバルな値は別のバッファに切り替えるまでは参照できません。 以下に例をあげます。

     (setq-default fill-column 75)

setq-defaultは、 make-variable-buffer-localで印を付けた変数の グローバルな値を設定する唯一の方法です。

Lispプログラム中では、変数のデフォルト値を参照するためには default-valueを使えます。 この関数はシンボルを引数とし、その変数のデフォルト値を返します。 引数は評価されるので、普通は引数をクォートします。 たとえば、fill-columnのデフォルト値を取得するにはつぎのようにします。

     (default-value 'fill-column)