Avantages de la définition de variables avec setq au lieu de custom.el?

69

Je vois beaucoup de personnes (auteurs d'extensions et autres) donner des exemples de configuration avec setq:

(setq foo 'bar)

Ces paramètres sont souvent définis avec defcustom, les rendant disponibles pour la personnalisation custom.el.

Je utilise généralement custom.elpour les définir. Y aurait-il un avantage à utiliser à la setqplace ou les deux méthodes sont-elles à peu près équivalentes?

J David Smith
la source

Réponses:

86

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 setqc'est la mauvaise approche pour ces options. Donc, en règle générale, setqla mauvaise approche est.

Si vous utilisez custom-set-variablesou customize-set-variableau 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 defcustommots - clés :setet :initialize, à l' aide et setqn'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 setqn’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-variablesou de customize-set-variableremplacer 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.

A dessiné
la source
5
Je pense que cela vaut la peine de mentionner que même avec les paramètres: set et: initialize, setq fonctionne toujours s'il est lu avant le chargement du paquet.
Malabarba
2
@Willyfrog Vous pouvez le voter!
Zane Shelby le
17
pas sûr de ça Drew. La personnalisation est plutôt complexe. Sans cela, le système emacs est beaucoup plus simple. La personnalisation est une couche qui ne s’intègre pas parfaitement avec elisp. D'une part, il commande tous les vars par alphabet. En outre, de nombreuses personnalisations ne concernent pas les variables (par exemple, les crochets, les clés) et ne peuvent donc pas être personnalisées. Donc, vous avez quand même une situation de code elisp manuel.
Xah Lee
4
@XahLee. Eh bien, j'en suis sûr. ;-) Mais oui, personnaliser c'est ce que c'est. Ce n'est pas la meilleure chose à faire pour les clés, les crochets, les mots clés de verrouillage de police, les tableaux d'affichage, etc. Mais pour ce qu'il fait (options et faces), il se débrouille plutôt bien. L’ interface utilisateur n’est pas fantastique, mais la gestion des déclencheurs, la vérification du type, etc. sont utiles. Je souhaite même que les programmeurs puissent (éventuellement) utiliser des éléments tels :typeque defvar- je ne pense pas que cela devrait être limité aux options de l'utilisateur. Malheureusement, de nombreux programmeurs utilisent paresseux :typeet le résultat n’est pas très utile (ce n’est pas la faute de Customize).
Drew
2
Point de données: Dans mes 3 300 lignes de code Emacs init développées au cours de la plus grande partie de l’année, j’ai été mordu en utilisant setqau lieu d’ customize-set-variableune seule fois. (C'était une fois pour auto-revert-interval, et j'ai réalisé plus tard que l'utilisation setq avant le chargement autorevertétait en réalité beaucoup plus rapide que l'utilisation customize-set-variable.)
Radon Rosborough
38

Je préfère setqplus customizepour plusieurs raisons:

  1. Tout d’abord, cela permet de définir les variables par programme (comme dans, (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’ customizeinterface ne fait que gêner.
  2. setqse 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 seul custom.elfichier, il serait beaucoup plus difficile de trouver et d’éditer rapidement les paramètres.
  3. C’est subjectif, mais pour moi toute l’ customizeinterface 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 :setet :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’échanger setqpour custom-set-variabledes cas spécifiques.

Shosti
la source
10
1. Vous pouvez définir des variables personnalisées à l'aide de programmes 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.
Nick McCurdy
24

Un avantage à utiliser setqau lieu de customizeest 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-variablesqui 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.

Vamsi
la source
Vous pouvez également revenir à la valeur par défaut avec setq, commentez simplement la setqligne et redémarrez emacs.
T. Verron
3
Oui, mais personnaliser peut revenir en arrière sans redémarrage embêtant. Très utile pour essayer de nouveaux paramètres.
Vamsi
2
En ce qui concerne les annotations, l'interface de personnalisation vous permet d'ajouter un commentaire à chaque variable que vous modifiez.
Andrew Swann
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).
Croad Langshan
L’interface <kbd> Mx personnaliser - * </ kbd> possède un champ "commentaire" qui permet de stocker un commentaire avec une variable.
Kdb
-1

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:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Le fait est que use package est une macro et n'évalue pas ses arguments immédiatement. Les paramètres :initet :configsont é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-packagecertains 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-packageest 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.

Daniel Mahler
la source
2
Cela ne répond pas vraiment à la question. Dans votre réponse, vous utilisez setq sans expliquer pourquoi.
J David Smith
3
Je pense qu’elle use-packagepré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 utilise setq. Aurait-il tout aussi bien pu l'utiliser customize-set-variableici? Je ne suis pas sûr. Pourrions-nous / devrions-nous l'échanger (ou customize-set-value) pour setq?
Mike
4
Veuillez modifier l'exemple pour qu'il utilise le :custommot - clé.
Toon Claes