TL; DR:
Ajoutez la ligne suivante en haut de votre fichier init ( .emacs.d/init.el
ou .emacs
):
(package-initialize)
L'explication
Créer plus de fichiers qu'Emacs pourrait utiliser user-init-file
n'est certainement pas la bonne approche. Parce que le manuel ne dit pas ce qui est préféré en cas de conflit, du moins pas dans la partie que vous avez citée, tout cela ne fait qu'ajouter de la confusion - maintenant nous ne savons pas quelle est réellement la user-init-file
(dont vous voudrez peut-être la valeur inspecter pour le découvrir).
Commencez donc par supprimer tous les candidats sauf celui ~/.emacs.d/init.el
qui est généralement préféré (par les utilisateurs) car il ne contribue pas au désordre impie qui est $HOME
et il permet de garder tous les fichiers de configuration Emacs, y compris le plus important, sous contrôle de version en utilisant un référentiel juste pour Emacs.
Par défaut, Emacs appelle package-initialize
après le chargement du fichier init de l'utilisateur. Il le fait du tout , car de nos jours la plupart des utilisateurs installent leurs packages en utilisant package.el
- ils ne devraient donc pas avoir à faire quoi que ce soit pour que ces packages soient disponibles.
En revanche, tout le monde ne le fait pas, il devrait donc être possible de ne pas appeler package-initialize
. Empêcher cette fonction d'être appelée se fait en ajoutant (setq package-enable-at-startup nil)
au fichier init de l'utilisateur (où d'autre pourriez-vous le mettre?).
package-initialize
ne peut pas être appelé avant que l'utilisateur n'ait eu une modification pour dire à Emacs de ne pas le faire, et cela doit donc être fait après le chargement du fichier init. Tant que l'utilisateur installe uniquement les packages, puis les utilise tels quels ou les personnalise à l'aide de l'interface personnalisée qui fonctionne très bien. Mais si vous souhaitez personnaliser vos packages à l'aide d'elisp, vous devez vous assurer qu'ils sont bien sur load-path
avant d'utiliser les fonctions qu'ils définissent.
C'est assez facile à faire et correctement documenté (si j'avais d'abord recherché cela, je n'aurais pas eu à écrire la plupart des éléments ci-dessus: - /
La raison du chargement automatique du package après le chargement du fichier init est que les options utilisateur ne reçoivent leurs valeurs personnalisées qu'après le chargement du fichier init, y compris les options utilisateur qui affectent le système de packaging. Dans certaines circonstances, vous souhaiterez peut-être charger explicitement des packages dans votre fichier init (généralement parce qu'un autre code dans votre fichier init dépend d'un package). Dans ce cas, votre fichier init devrait appeler la fonction package-initialize
. Il vous appartient de vous assurer que les options utilisateur pertinentes, telles que package-load-list
(voir ci-dessous), sont configurées avant l' package-initialize
appel. Vous devez également définir
package-enable-at-startup
ànil
, pour éviter de charger à nouveau les packages après le traitement du fichier init. Alternativement, vous pouvez choisir d'inhiber complètement le chargement des packages au démarrage et invoquer la commande `Mx package-initialize 'pour charger vos packages manuellement.
Donc:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
Bien sûr, le problème (ou un problème supplémentaire) pourrait également être que la faute de frappe se Symbol's function definition is void: use-packge
trouve dans votre fichier init et ne s'est pas produite tant que vous ne l'avez pas saisie dans emacs.se.