EmacsLispのsetqとsetq-defaultの違い


89

EmacsLispについて質問があります。setqsetq-defaultの違いは何ですか?

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

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

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

例えば:

  1. 私が書いた(ハローsetqの123)init.elファイル、と私は実行abufferのemacsのシェルでは、その後、I入力は"helloてCx Ce" 、それが"123"を示しています。これをすべての新しいバッファーで実行すると、同じことが起こります。

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

回答:


100

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

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

変数はその後、ローカルのバッファリングされていない場合setqsetq-default同じことを行います。

ケース2では、現在のバッファでバッファ(setq tab-width 4)ローカル値tab-widthを4に設定し、グローバルデフォルト値をtab-width8のままにしtab-widthます。したがって、ローカル値を持たない別のバッファで評価すると、8が表示されます。デフォルト値を4に設定すると、ローカル値がまだないため、そのバッファーがそれを取得しました。


I(タブ幅を4に設定)して評価すると、すべてのバッファーで常に8になります。理由はわかりません。効果がないようです。しかし、(sets-default tab-width 4)を使用すると、すべてのバッファーで有効になります。理由もわかりません:(
ruanhao 2013

(setq tab-width 4)式を評価したバッファで有効になります。*scratch*バッファーで評価する場合は、そのバッファーでの値を調べます。
トリプリー2013

tab-widthバッファローカル変数です。したがって、を実行(setq tab-width 4)すると、現在のバッファでは4にのみ設定されます。他のすべてのバッファtab-widthは、グローバルデフォルトの8を保持します。を使用すると(setq-default tab-width 4)、グローバルデフォルトのtab-width4に変更されるため、tab-widthそれ自体を定義していないすべてのバッファに新しいデフォルトが設定されます。
dfan 2013

3
はい。起動時のemacsのアクションシーケンスのリストを参照してください。初期化ファイルを読むとステップ12で、最初のバッファがステップ23で育てる
dfan

1
@ruanhao init.elで(setq tab-width 4)の場合、そのバッファー(init.el)にのみ適用されます。この変更をすべての新しいバッファーに適用する場合は、(setq-default tab-width 4)でこれを実行できます。さらに、特定の種類のファイルのモードを作成する場合は、グローバルデフォルトを上書きしないように(setq tab-width 4)を使用することをお勧めします。
ヘム2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.