web-dev-qa-db-ja.com

Emacs Lispでのsetqとsetq-defaultの違い

Emacs LISPについて質問があります。 setqsetq-defaultの違いは何ですか?私はそれについてとても混乱しています。

チュートリアルでは、setqlocal bufferで有効になりますが、setq-defaultはすべてのバッファーに影響します。

たとえば、(setq a-var a-vars-value) in init.elと書いた場合、Emacsを起動して新しいバッファーを開いた後、- a-varもあり、その値はa-vars-valueです。そこにあるはずはないと思った。 setqsetq-defaultの間に違いはないようです。

私の理解に何か問題がありますか?

どうもありがとうございました。

例えば:
1)(setq hello 123)init.elファイルに書き込み、シェルでemacs abufferを実行しました、次に"hello Cx Ce"と入力すると、「123」と表示されます。すべての新しいバッファでこれを実行すると、同じことが起こります。

2)(setq tab-width 4)init.elファイルに書きました。 tab-width C-x C-eを実行すると、「8」が表示されます(現在のモードは「テキスト」です)。ただし、(setq-default tab-width 4)を使用すると、「4」が表示されます。この現象は説明できません。

77
ruanhao

Emacsの一部の変数は「バッファーローカル」です。つまり、各バッファーは、グローバルデフォルトをオーバーライドする変数の個別の値を持つことができます。 tab-widthは、バッファローカル変数の良い例です。

変数がバッファローカルの場合、setqは現在のバッファにローカル値を設定し、setq-defaultはグローバルなデフォルト値を設定します。

変数がバッファローカルでない場合、setqsetq-defaultは同じことをします。

ケース2では、(setq tab-width 4)は現在のバッファーでtab-widthのバッファーローカル値を4に設定し、tab-widthのグローバルなデフォルト値は8のままにして、tab-widthローカル値を持たない別のバッファーで、8を見ました。その後、デフォルト値を4に設定すると、ローカル値がまだないため、そのバッファーがそれを選択しました。

91
dfan