La différence entre setq et setq-default dans Emacs Lisp

89

J'ai une question sur Emacs Lisp. Quelle est la différence entre setq et setq-default ?

Les didacticiels indiquent que setq prend effet dans le tampon local tandis que setq-default affecte tous les tampons.

Par exemple, si j'ai écrit (setq a-var a-vars-value) dans init.el , j'ai trouvé après le démarrage d'Emacs et l'ouverture d'un nouveau tampon, le a-var est également là et sa valeur est a-vars-value . Je pensais que ce n'était pas censé être là. Il semble qu'il n'y ait aucune différence entre setq et setq-default .

Y a-t-il quelque chose qui ne va pas avec ma compréhension?

Par exemple:

  1. J'ai écrit (setq hello 123) dans le fichier init.el , et j'exécute emacs abuffer dans le shell, puis j'entre "hello Cx Ce" , il montre "123". La même chose se produit lorsque je l'exécute dans tous les nouveaux tampons.

  2. J'ai écrit (setq tab-width 4) dans le fichier init.el. Lorsque j'exécute Cx Ce de largeur de tabulation , il affiche "8" (le mode actuel est "Texte"). Cependant, lorsque j'utilise (setq-default tab-width 4) , il affiche "4". Je ne peux pas expliquer ce phénomène.

ruanhao
la source

Réponses:

100

Certaines variables dans Emacs sont "tampon-local", ce qui signifie que chaque tampon est autorisé à avoir une valeur séparée pour cette variable qui remplace la valeur par défaut globale. tab-widthest un bon exemple de variable locale de tampon.

Si une variable est locale à la mémoire tampon, setqdéfinit sa valeur locale dans la mémoire tampon actuelle et setq-defaultdéfinit la valeur par défaut globale.

Si une variable n'est pas locale au tampon, alors setqet setq-defaultfaites la même chose.

Dans votre cas 2, (setq tab-width 4)définissez la valeur de tampon local tab-widthsur 4 dans le tampon actuel, en laissant la valeur par défaut globale de tab-widthstill à 8, donc lorsque vous avez évalué tab-widthdans un tampon différent qui n'avait pas de valeur locale, vous avez vu que 8. Ensuite, lorsque vous définissez la valeur par défaut sur 4, ce tampon l'a récupéré, car il n'avait toujours pas de valeur locale.

dfan
la source
quand I (définit la largeur de tabulation 4), et l'évalue, il est toujours 8 dans chaque tampon. Je ne sais pas pourquoi. Il semble que cela n'entre pas en vigueur. Mais lorsque j'utilise (sets-default tab-width 4), cela prend effet dans chaque tampon. Je ne sais pas non plus pourquoi :(
ruanhao
(setq tab-width 4)prend effet dans le tampon où vous avez évalué l'expression; si vous l'évaluez dans le *scratch*tampon, examinez sa valeur dans ce tampon.
tripleee
tab-widthest une variable locale du tampon. Ainsi, lorsque vous (setq tab-width 4), il est uniquement défini sur 4 dans le tampon actuel. Tous les autres tampons conservent un tab-widthde la valeur par défaut globale, 8. Lorsque vous (setq-default tab-width 4)modifiez la valeur par défaut globale de tab-widthà 4, chaque tampon qui ne s'est pas défini tab-widthlui-même a donc cette nouvelle valeur par défaut.
dfan
3
Oui. Consultez la liste des séquences d'actions d'emacs au démarrage . La lecture du fichier d'initialisation est l'étape 12, et la mise en place du tampon initial est l'étape 23.
dfan
1
@ruanhao Si vous (setq tab-width 4) dans le fichier init.el, cela ne s'appliquera qu'à ce tampon (init.el). Si vous voulez que cette modification s'applique à tous les nouveaux tampons, alors (setq-default tab-width 4) le fera. De plus, si vous souhaitez créer un mode pour un type de fichier spécifique, vous voudrez probablement utiliser (setq tab-width 4) afin de ne pas remplacer la valeur par défaut globale.
Hemm