1. ホーム
  2. emacs

[解決済み] Emacs Lispにおけるsetqとsetq-defaultの相違点

2023-01-10 02:20:09

質問

Emacs Lispについて質問です。とはどう違うのでしょうか? setq setq-default ?

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

例えば、もし私が (setq a-var a-vars-value) init.el で、Emacsを起動し、新しいバッファを開くと a-var も存在し、その値は a-vars-valueです。 . あるはずのないものだと思っていました。という違いはないようです。 setq setq-default .

私の理解に何か間違いがあるのでしょうか?

例えば

  1. 私は (setq hello 123) の中で init.el ファイルを作成し、私は emacs abuffer をシェルで実行し、次に "hello C-x C-e" と入力すると、"123"と表示されます。これをすべての新しいバッファで実行しても同じことが起こります。

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

どのように解決するのですか?

Emacs のいくつかの変数は "buffer-local" で、これは各バッファがその変数に個別の値を持つことが許され、それがグローバルなデフォルトを上書きすることを意味します。 tab-width はバッファローカル変数の良い例です。

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

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

あなたの場合 2, (setq tab-width 4) のバッファローカルの値を設定します。 tab-width を 4 に設定し、グローバルなデフォルト値である tab-width のグローバルなデフォルト値は 8 のままなので tab-width をローカル値を持たない別のバッファで評価すると、その 8 が表示されます。 その後、デフォルト値を 4 に設定すると、ローカル値がまだないため、そのバッファがそれを拾いました。