私がバッファローカル変数を定義し、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
し、でデフォルト値(ユーザーが設定したかどうかにかかわらず)を使用したい場合、デフォルト値が実際にあることを確認する前に使用する必要があります場合に使用されているユーザはそれを持っていない、彼/彼女に。バッファローカル変数の場合、おそらく、値を設定するときよりも常に安全であることを意味します。デザインやドキュメンテーションは改善できるのかしら。nil
let
with-temp-buffer
setq
with-temp-buffer
setq
init.el
setq
let
with-temp-buffer
(つまり、マクロなし)の拡張形式を使用してローカルでテストします。バッファローカル変数の特定の動作に似ていると思います。
with-temp-buffer
(前ではなく)の体の中に入れた場合、それは役に立ちますか?with-temp-buffer
マクロであり、標準の関数とは少し異なる動作をします。例:(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))