web-dev-qa-db-fra.com

Problèmes d'initialisation du système EMACS 24

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?

45
λ Jonas Gorauskas

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)
42
Nicolas Dudebout

Ç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 que package-load-list (voir ci-dessous), sont configurés avant le package-initialize appel. Vous devriez également définir package-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 commande M-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 package1 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

79
phils