web-dev-qa-db-fra.com

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

J'ai une question sur Emacs LISP. Quelle est la différence entre setq et setq-default? Je suis très confus à ce sujet.

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) in init.el, j'ai trouvé après avoir démarré Emacs et ouvert 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 un problème avec ma compréhension?

Merci beaucoup.

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

2) J'ai écrit (setq tab-width 4) dans le fichier init.el. Lorsque je lance tab-width C-x C-e, 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.

77
ruanhao

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

Si une variable est tampon-local, alors setq définit sa valeur locale dans le tampon courant et setq-default définit la valeur globale par défaut.

Si une variable n'est pas un tampon local, alors setq et setq-default faire la même chose.

Dans votre cas 2, (setq tab-width 4) définit la valeur du tampon local de tab-width à 4 dans le tampon actuel, en laissant la valeur par défaut globale de tab-width toujours à 8, donc quand vous avez évalué tab-width dans un tampon différent qui n'avait pas de valeur locale, vous l'avez vu 8. Puis, 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.

91
dfan