私がバッファローカル変数を定義し、fooそのデフォルト値が "a"であるとしましょう:
(defvar foo "a")
(make-variable-buffer-local 'foo)
(default-value 'foo) ;; => "a"
この直後に、次のコードを実行します。
(let ((foo "b"))
  (with-temp-buffer
    (message "foo: %s" foo))) ;; => "b"
結果は "b"です。これは、で設定した値letです。
setq変数の設定に使用する場合は、前とまったく同じコードを再実行します。
(setq foo "c") ;; => "c"
(let ((foo "b"))
  (with-temp-buffer
    (message "foo: %s" foo))) ;; => "a"
結果は "a"で、これが現在のデフォルト値です。
質問:一時バッファの場合、のデフォルト値はfoo使用するまで設定されませんsetqか?そしてsetq、私が使用しない限りlet、他のバッファのデフォルト値を変更するために使用できますか?
編集:@npostavsが言ったように、これはmake-varible-buffer-local本当に意味することです。make-variable-buffer-local自分で使えば、setqその後いつでも使えます。しかし、これはのような「組み込み」のバッファローカル変数では本当にトリッキーになりますcase-fold-search。私がパッケージ作成者として外部でバインドcase-fold-searchし、でデフォルト値(ユーザーが設定したかどうかにかかわらず)を使用したい場合、デフォルト値が実際にあることを確認する前に使用する必要があります場合に使用されているユーザはそれを持っていない、彼/彼女に。バッファローカル変数の場合、おそらく、値を設定するときよりも常に安全であることを意味します。デザインやドキュメンテーションは改善できるのかしら。nilletwith-temp-buffersetqwith-temp-buffersetqinit.elsetqlet
with-temp-buffer(つまり、マクロなし)の拡張形式を使用してローカルでテストします。バッファローカル変数の特定の動作に似ていると思います。
                
with-temp-buffer(前ではなく)の体の中に入れた場合、それは役に立ちますか?with-temp-bufferマクロであり、標準の関数とは少し異なる動作をします。例:(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))