Certaines personnes pourraient penser que c'est plus simple à utiliser setq
. Certaines personnes pourraient penser que c'est plus lispy. En réalité, il est naïf dans le cas général.
Il est vrai que pour certaines options d'utilisateur, cela n'a pas d'importance. Mais pour d'autres, c'est important, et setq
c'est la mauvaise approche pour ces options. Donc, en règle générale, setq
la mauvaise approche est.
Si vous utilisez custom-set-variables
ou customize-set-variable
au lieu de setq
, ou si vous utilisez l'interface utilisateur Personnaliser (par exemple M-x customize-option
), vous êtes sûr que tout code d'initialisation ou de mise à jour prévu nécessaire pour la valeur d'option sera automatiquement déclenché et exécuté selon les besoins. Si vous utilisez setq
, cela ne sera pas fait.
Maintenant, il est également vrai que la plupart des options de l' utilisateur, en particulier un grand nombre d'entre eux écrit pour les bibliothèques 3e partie, ne font pas usage des defcustom
mots - clés :set
et :initialize
, à l' aide et setq
n'a pas d' importance pour eux. Mais beaucoup d’options de la vanille Emacs utilisent de tels mots-clés, et pour ceux qui le font, ce setq
n’est pas la bonne chose. Donc, si vous souhaitez utiliser le code Lisp et non l'interface de personnalisation pour définir vos options, il est préférable d'utiliser custom-set-variables
ou de customize-set-variable
remplacer setq
. Ça ne fait jamais de mal et ça aide parfois (beaucoup).
Mais ce que je recommande, c'est de faire les deux choses suivantes:
Utilisez l'interface utilisateur Personnaliser au lieu d'écrire du code Lisp pour cela.
Définissez la variablecustom-file
, de sorte que Personnaliser écrit les personnalisations dans ce fichier et non dans votre fichier init ( ~/.emacs
). IOW, gardez votre code d'initialisation écrit à la main séparé du code automatique écrit par Customize.
:type
quedefvar
- je ne pense pas que cela devrait être limité aux options de l'utilisateur. Malheureusement, de nombreux programmeurs utilisent paresseux:type
et le résultat n’est pas très utile (ce n’est pas la faute de Customize).setq
au lieu d’customize-set-variable
une seule fois. (C'était une fois pourauto-revert-interval
, et j'ai réalisé plus tard que l'utilisationsetq
avant le chargementautorevert
était en réalité beaucoup plus rapide que l'utilisationcustomize-set-variable
.)Je préfère
setq
pluscustomize
pour plusieurs raisons:(setq foo (calculate-foo))
). J'utilise ce pouvoir tout le temps dans ma configuration pour garder les choses au sec. Pour moi, le but d’utiliser Emacs est la programmabilité, et l’customize
interface ne fait que gêner.setq
se prête mieux au contrôle de version et à l’organisation du code. J'ai divisé mon initialisation entre des dizaines de fichiers; si tout était dans un seulcustom.el
fichier, il serait beaucoup plus difficile de trouver et d’éditer rapidement les paramètres.customize
interface ressemble à une horrible relique des pires interfaces utilisateur des années 90. Je préférerais éditer du texte avec la puissance d'Emacs tous les jours.@Drew fait quelques bons points à propos de certaines subtilités avec
:set
et:initialize
. J'utilise Emacs depuis des années et j'ai rarement rencontré de tels problèmes. Lorsque je le fais, il est facile d’échangersetq
pourcustom-set-variable
des cas spécifiques.la source
customize-set-variable(s)
, et c'est mieux en raison des déclencheurs qu'elles exécutent automatiquement. 2. Vous pouvez utiliser diverses commandes de personnalisation pour afficher toutes vos variables définies et / ou enregistrées dans différentes hiérarchies. Vous obtenez ainsi automatiquement l'organisation de différents groupes sans avoir à utiliser des fichiers séparés dans le contrôle de version. 3. Cela s'est beaucoup amélioré. Si vous n'aimez pas l'interface utilisateur, vous pouvez toujours utiliser la personnalisation par programme et par le biais des commandes interactives qui évitent le mode personnalisation pour obtenir tous les autres avantages de l'utilisation de la personnalisation.Un avantage à utiliser
setq
au lieu decustomize
est la lisibilité. On est libre d'annoter chaque personnalisation à sa guise, ce qui améliore la lisibilité de l'OMI. Il est également possible de regrouper des personnalisations liées, ce qui améliore la modularité. Enfin, je dirais que naviguer dans un tampon elisp est plus "facile" que de personnaliser l'interface utilisateur et les widgets.D'autre part, personnaliser vous permet de revenir facilement aux valeurs par défaut, ce qui peut s'avérer inestimable lorsque les choses tournent mal.
EDIT: La réponse de Drew fournit une excellente raison d’utiliser
customize-set-variables
qui peut fournir tous les avantages que j’ai signalés. Toutefois, l'interface utilisateur de personnalisation ne se prête pas à des configurations portables entre différentes plates-formes aussi facilement que le produit elisp brut. Si vous souhaitez qu'une variable ait un paramètre dépendant du système d'exploitation, vous devrez revenir à elisp dans de nombreux cas. Mon argument concernant la navigation plus facile dans les mémoires tampon elisp est toujours valable.la source
setq
, commentez simplement lasetq
ligne et redémarrez emacs.custom-set-variables
est "raw elisp", et je l’utilise tous les jours sur plusieurs machines. Copiez-le simplement à l’endroit où personnalisation l’écrit (si vous ne l’avez pas écrit vous-même).Une autre alternative consiste à utiliser le paquet use de John Wiegley . Cela fournit un moyen par programme de configurer les paquets qui fonctionne bien avec le processus d’initialisation de paquet d’emacs 24+. Voici un exemple d'utilisation tiré du readme:
Le fait est que use package est une macro et n'évalue pas ses arguments immédiatement. Les paramètres
:init
et:config
sont évalués à différentes étapes du processus d’initialisation, ce qui permet d’avoir la configuration de chaque package à un endroit donné, mais de faire exécuter chaque partie à l’étape appropriée de l’initialisation.Sans quelque chose comme
use-package
certains paquets, une partie de leur code d'initialisation est nécessaire avant(package-initialize)
et une autre partie après. Si vous avez beaucoup de paquets comme ceux-là, il faudra alors entrelacer leurs initialisations.Un autre avantage
use-package
est qu’il peut installer automatiquement les packages manquants à partir de package.el si vous transférez un fichier .emacs vers une nouvelle machine ou si vous partagez votre configuration avec un autre utilisateur et toute initialisation peut être différée jusqu’à ce qu’un package soit réellement chargé.Il existe également des arguments de mots clés supplémentaires permettant un contrôle accru du processus d'initialisation.
Cela dit, l'un des grands avantages de la personnalisation est qu'elle vous indique ce qu'il y a à configurer dans un package donné. C'est une des raisons pour lesquelles je l'utilise encore pour beaucoup de mes paquets.
la source
use-package
présente les avantages de la configuration modulaire, ainsi que de l’importation et de la configuration de packages en un seul endroit. Mais oui, l'exemple utilisesetq
. Aurait-il tout aussi bien pu l'utilisercustomize-set-variable
ici? Je ne suis pas sûr. Pourrions-nous / devrions-nous l'échanger (oucustomize-set-value
) poursetq
?:custom
mot - clé.