Next: , Previous: , Up: Variables   [Contents][Index]


49.2.3 ローカル変数

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バッファーにたいしてローカル(local)にすることができます。これは、そのバッファーでの変数の値が、他のバッファーでの変数の値とは、独立していることを意味します。多くはありませんが、常にバッファーごとにローカルな変数もあります。他のすべてのEmacs変数は、バッファーで変数をローカルにしていないかぎりは、すべてのバッファーに効果を及ぼすグローバル(global)な値をもちます。

M-x make-local-variableは変数名を読み取り、それをカレントバッファーにたいしてローカルにします。その後、このバッファーで変数の値を変更しても他のバッファーには影響せず、変数のグローバル値を変更してもこのバッファーには影響しなくなります。

M-x make-variable-buffer-localは、変数がセットされたとき自動的にローカルになるように、変数をマークします。より正確には、1度この方法で変数がマークされると、通常の方法による変数のセットは、最初に自動的にmake-local-variableを呼び出します。このような変数をパーバッファー(per-buffer: バッファーごと)変数と呼びます。Emacsの多くの変数は、通常はパーバッファーです。変数のドキュメント文字列には、いつこれを行なうかが記述されています。パーバッファー変数のグローバル値は、通常は任意のバッファーには影響しませんが、それでもまだ意味があります。グローバル値は、新しいバッファーにたいする、この変数の初期値として使用されます。

メジャーモード(Major Modesを参照してください)は常に変数をセットする前に、変数をローカルにします。あるバッファーでメジャーモードを変更しても、他のバッファーに影響がないのは、これが理由です。マイナーモードは変数をセットすることにより機能します — 通常、各マイナーモードは1つの制御変数(controlling variable)をもっていて、この変数が非nilの場合はモードが有効になります(Minor Modesを参照してください)。多くのマイナーモードにたいして制御変数はパーバッファーであり、したがって常にバッファーローカルです。そうでない場合、他の変数と同様に特定のバッファーで変数をローカルにできます。

多くはありませんが、バッファーでローカルにできない(かわりに各ディスプレーにたいして常にローカル。Multiple Displaysを参照してください)変数も存在します。そのような変数をバッファーローカルにしようとすると、エラーメッセージが表示されます。

M-x kill-local-variableは、指定された変数が、カレントバッファーにたいしてローカルであることを終了させます。その後は、そのバッファーにたいして、その変数のグローバル値が効力をもちます。メジャーモードのセットにより、数少ないパーマネントローカル(permanent locals: 永久にローカル)な変数を除いて、そのバッファーのすべてのローカル変数はkillされます。

変数がカレントバッファーでローカル値をもつかに関わらず、変数にグローバル値をセットするには、Lispコンストラクトsetq-defaultを使用することができます。このコンストラクトはsetqと同じように使用されますが、(もしあれば)ローカル値のかわりにグローバル値をセットします。カレントバッファーがローカル値をもつ場合、新しいグローバル値は他のバッファーに切り替えるまで見えないでしょう。以下は例です:

(setq-default fill-column 75)

setq-defaultは、make-variable-buffer-localでマークされた変数のグローバル値をセットする唯一の方法です。

Lispプログラムは変数のデフォルト値を得るために、default-valueを使用することができます。この関数はシンボルを引数として受け取り、それのデフォルト値を返します。引数は評価されるので、通常は明示的にクォートする必要があります。たとえば、以下はfill-columnのデフォルト値を得る方法です:

(default-value 'fill-column)