103 votes

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 y setq-default ?

Les tutoriels disent setq prend effet dans la tampon local tandis que setq-default affecte tous les tampons.

Par exemple, si j'ai écrit (setq a-var a-vars-valeur) en init.el j'ai constaté qu'après avoir démarré Emacs et ouvert un nouveau tampon, la fonction a-var est également présent et sa valeur est a-vars-valeur . Je pensais qu'il n'était pas censé être là. Il semble qu'il n'y ait pas de différence entre setq y setq-default .

Est-ce que j'ai mal compris ?

Par exemple :

  1. J'ai écrit (setq hello 123) en el init.el et je lance emacs abuffer dans le shell, puis je saisis "Bonjour C-x C-e" il affiche "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) en el init.el dossier. Lorsque j'exécute largeur de la tabulation 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.

120voto

dfan Points 3542

Certaines variables dans Emacs sont "buffer-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-width est un bon exemple de variable locale à la mémoire tampon.

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

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

Dans votre cas, 2, (setq tab-width 4) définir la valeur locale du tampon de tab-width à 4 dans le tampon actuel, laissant la valeur globale par défaut de tab-width toujours à 8, donc quand vous avez évalué tab-width dans un autre tampon qui n'avait pas de valeur locale, vous avez vu ce 8. Ensuite, lorsque vous avez défini la valeur par défaut à 4, ce tampon l'a repris, puisqu'il n'avait toujours pas de valeur locale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X