La differenza tra setq e setq-default in Emacs Lisp


89

Ho una domanda su Emacs Lisp. Qual'è la differenza tra setq e setq-default ?

I tutorial dicono che setq ha effetto nel buffer locale mentre setq-default ha effetto su tutti i buffer.

Ad esempio, se ho scritto (setq a-var a-vars-value) in init.el , ho trovato dopo aver avviato Emacs e aperto un nuovo buffer, anche a-var è lì e il suo valore è a-vars-value . Ho pensato che non doveva essere lì. Sembra che non ci sia differenza tra setq e setq-default .

C'è qualcosa che non va nella mia comprensione?

Per esempio:

  1. Ho scritto (setq ciao 123) nel file init.el , ed eseguo emacs abuffer nella shell, quindi inserisco "ciao Cx Ce" , mostra "123". Lo stesso accade quando lo eseguo in tutti i nuovi buffer.

  2. Ho scritto (setq tab-width 4) nel file init.el. Quando eseguo Cx Ce con la larghezza di tabulazione , viene visualizzato "8" (la modalità corrente è "Testo"). Tuttavia, quando uso (setq-default tab-width 4) , mostra "4". Non riesco a spiegare questo fenomeno.

Risposte:


102

Alcune variabili in Emacs sono "buffer-local", il che significa che ogni buffer può avere un valore separato per quella variabile che sovrascrive il default globale. tab-widthè un buon esempio di variabile locale del buffer.

Se una variabile è locale nel buffer, setqimposta il suo valore locale nel buffer corrente e setq-defaultimposta il valore predefinito globale.

Se una variabile non è locale nel buffer, allora setqe setq-defaultfai la stessa cosa.

Nel tuo caso 2, (setq tab-width 4)imposta il valore locale del buffer su tab-width4 nel buffer corrente, lasciando il valore predefinito globale tab-widthancora a 8, quindi quando hai valutato tab-widthin un buffer diverso che non aveva valore locale, l'hai visto 8. Quindi, quando si imposta il valore predefinito su 4, quel buffer lo ha rilevato, poiché non aveva ancora un valore locale.


quando I (imposta la larghezza di tabulazione 4) e lo valuta, è sempre 8 in ogni buffer. Non so perché Sembra che non abbia effetto. Ma quando uso (sets-default tab-width 4), ha effetto in ogni buffer. Inoltre non so perché :(
ruanhao

(setq tab-width 4)ha effetto nel buffer in cui hai valutato l'espressione; se lo valuti nel *scratch*buffer, esamina il suo valore in quel buffer.
tripleee

1
tab-widthè una variabile locale del buffer. Quindi, quando tu (setq tab-width 4), è impostato solo su 4 nel buffer corrente. Tutti gli altri buffer mantengono un tab-widthvalore predefinito globale, 8. Quando si (setq-default tab-width 4)modifica il valore predefinito globale di tab-widthin 4, quindi ora ogni buffer che non si è definito tab-widthha quel nuovo predefinito.
dfan

3
Sì. Vedi l'elenco delle sequenze di azioni di emacs all'avvio . La lettura del file di inizializzazione è il passaggio 12 e la visualizzazione del buffer iniziale è il passaggio 23.
dfan

1
@ruanhao Se tu (setq tab-width 4) in init.el, allora si applicherà solo a quel buffer (init.el). Se vuoi che questa modifica si applichi a tutti i nuovi buffer, allora (setq-default tab-width 4) lo farà. Inoltre, se vuoi creare una modalità per un tipo specifico di file, probabilmente vorrai usare (setq tab-width 4) in modo da non sovrascrivere l'impostazione predefinita globale.
Hemm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.