ここでSXですべてのドキュメントと多数の投稿を読んだ後でも、バッファローカル変数のすべてのバリエーションについては明確ではありません。
私の理解の概要は次のとおりです。
(defvar foo ..)
ファイルの動的変数を宣言します。ただし、変数は(1)defvar
ステートメントも含まれていない限り、他のファイルには認識されません。(2)変数はバッファーローカルではなくスコープ内でグローバルです。
(make-variable-buffer-local foo)
defvar
上記は、変数fooが設定されている場合、変数fooが設定されているすべての場所でバッファローカルとして扱われることをコンパイラと他のすべての人に伝えた後です。そのため、このパターンは、バッファローカル変数を宣言するのに適したスタイルであり、ファイルに両方のステートメントを連続して配置します。
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
便宜上、(defvar-local xxx ...)
フォームは上記の2行の代わりに1行として使用できます。
(defvar-local xxx ...) ;make xxx buffer local everywhere
上記のように宣言されると、変数xxxはsetqステートメントの他の変数と同様に使用できます。
既にグローバルダイナミック変数であるバッファローカル変数の単一のインスタンスが必要な場合は、次の宣言を使用します。最初のステートメントはグローバルスコープの動的変数を宣言し、2番目のステートメントはその変数のバッファーローカルバージョンのインスタンスを現在のバッファーに1つだけ作成します。
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
さて、私の明示的な質問について(上記はすべて、私の理解が正しいかどうかに関する暗黙の質問でした)。
変数の値を設定するとき、setq
または
を使用できますsetq-local
。いつsetq-local
使用すべきですか?どうして?
setq-local
バッファローカル変数または非バッファローカル変数で使用するとどうなりますか?
されるsetq-local
ために必要なdefvar-local
宣言された変数?
ウィルsetq-local
通常のdefvar
宣言された変数はバッファローカル変数にそれを回しますか?(言い換えれば、setq-local
何らかの形で(make-variable-local xxx)
宣言と同等ですか?
(setq-local VAR VALUE)
は、の省略形です(set (make-local-variable VAR) VALUE)
。