Il me semble que le nouveau système d'emballage intégré sur EMACS 24 présente des défauts lorsqu'il s'agit de charger et d'initialiser correctement les packages installés.
Récemment, j'ai récemment mis à niveau vers EMACS 24.1.1, qui a été réalisé le 6/10/2012 et j'essaie d'utiliser le système d'emballage intégré et j'ai installé plusieurs packages en l'utilisant, mais ils ont tous un problème similaire lié à AutoLoad et initialisation.
Par exemple, j'utilise un package appelé smex
qui fournit des améliorations pour l'utilisation de la M-x
accord. Cela vous oblige à définir une clé pour M-x
, alors j'ai ajouté (global-set-key (kbd "M-x") 'smex)
dans mon init.el
déposer. Mais après avoir commencé Emacs, j'appuie sur la M-x
accord et je reçois le message "La définition de la fonction du symbole est annulée: SMEX" ... si je mets aussi (require 'smex)
Dans mon fichier init.el, je reçois le message d'erreur "Erreur de fichier: impossible d'ouvrir le fichier de chargement, SMEX"
L'ajout de l'emplacement de SMEX à la variable de chemin de charge permet de fonctionner comme prévu, cependant, qui semble vaincre tout le but d'avoir un système de paquet en premier lieu ...
Des pensées? Y a-t-il une meilleure façon ou vivons-nous avec cette limitation pour l'instant?
Les packages que vous installez avec package.el
sont activés par défaut après votre .emacs
est chargé. Être capable de les utiliser avant la fin de votre .emacs
Vous devez les activer en utilisant les commandes:
(setq package-enable-at-startup nil)
(package-initialize)
Ça vaut la peine de noter pourquoi Emacs apparaît l'initialisation du paquet:
Voir C-hig(emacs) Package Installation
RET, et en particulier:
La Chargement automatique de l'emballage automatique se produit après le chargement du fichier init. Les options utilisateur ne reçoivent que leurs valeurs personnalisées après avoir chargé le fichier init, y compris les options d'utilisateur qui affectent le système d'emballage. Dans certaines circonstances, vous voudrez peut-être charger explicitement des packages dans votre fichier init (généralement car un autre code dans votre fichier init dépend d'un package). Dans ce cas, votre fichier init devrait appeler la fonction
package-initialize
. C'est à vous de vous assurer que les options utilisateur concernées, telles quepackage-load-list
(voir ci-dessous), sont configurés avant lepackage-initialize
appel. Vous devriez également définirpackage-enable-at-startup
ànil
, pour éviter de charger à nouveau les packages après avoir traité le fichier init. Vous pouvez également choisir d'inhiber complètement le chargement du paquet au démarrage et d'invoquer la commandeM-x package-initialize
Pour charger vos paquets manuellement.
Ainsi, vous vous assurez que votre fichier initial s'occupe de toutes les valeurs non par défaut que vous souhaitez pour les variables dans le groupe de personnalisation package
1 Avant d'appeler package-initialize
- Et que vous maintenez cette approche lorsque vous personnalisez la bibliothèque de packages config, cela devrait être correct pour le faire.
Alternativement, parce que after-init-hook
Exécution Une fois l'initialisation de package standard terminée, vous pouvez l'utiliser pour évaluer tout code init qui dépend des packages. Donc, au lieu d'appeler package-initialize
directement dans init.el, vous pourriez plutôt écrire:
(add-hook 'after-init-hook 'my-after-init-hook)
(defun my-after-init-hook ()
;; do things after package initialization
)
mettre le code nécessitant le système d'emballage initialisé dans cette fonction.
Ymmv.
(N.B. Je n'ai pas testé l'approche après-init, car je n'utilise pas vraiment forkack.el; mais j'ai confirmé la séquence d'événements dans le code de démarrage, alors je pense que cela fonctionnera comme décrit.)
1M-xcustomize-group
RETpackage
RET