Emacs 24: Chargement d'un paquet installé via ELPA

Je viens d'installer le paquet cmake-mode dans Emacs 24 en utilisant:

 Mx package-install cmake-mode 

Je peux voir le paquet à: ~/.emacs.d/elpa/cmake-mode-20110824 , et je peux le charger en utilisant les instructions dans le Commentary: section de ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el :

 ;; Add this code to your .emacs file to use the mode: ;; ;; (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path)) ;; (require 'cmake-mode) ;; (setq auto-mode-alist ;; (append '(("CMakeLists\\.txt\\'" . cmake-mode) ;; ("\\.cmake\\'" . cmake-mode)) ;; auto-mode-alist)) 

Cependant, cela contredit l' instruction d'utilisation sur la page EmacsWiki d'ELPA:

… les paquets sont initialisés APRÈS que l'init.el est chargé. Cela signifie que vous ne devriez PAS mettre l'initialisation spécifique au paquet dans votre init.el …

J'ai tendance à être d'accord avec cette instruction car ajouter à mon fichier ~/.gnu-emacs une ligne telle que:

 (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/") 

Est moche, et se cassera si et quand je vais mettre à niveau le paquet. Cependant, sans cette ligne, je ne peux pas utiliser cmake-mode .

Est-ce que j'ai râté quelque chose?

Remarques:

  • Je n'ai rien d'étrange avec package-enable-at-startup et sa valeur est t .
  • J'utilise un prélude .
  • user-emacs-directory valeur du user-emacs-directory est "~/.emacs.d/" (Merci @lawlist pour la suggestion)
  • package-user-dir est "~/.emacs.d/elpa"

J'ai installé cmake-mode avec marmalade-repo, et j'ai regardé cmake-mode-autoloads.el. Il semble que l'auteur ait pris une décision consciente et n'inclut not tout ce qui est nécessaire à la configuration dans le fichier autoloads. Cependant, les instructions sur les lignes 25 à 30 de cmake-mode.el sont correctes, que vous avez citées dans votre question. Si vous utilisez les lignes 25 à 30 et que vous définissez le chemin correctement, vous n'avez PAS besoin d'une ligne de code supplémentaire telle que (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/") .

De toute évidence, vous ne voudriez pas utiliser /dir/with/cmake-mode – vous souhaitez utiliser ~/.emacs.d/elpa/cmake-mode-20110824 sans ~/.emacs.d/elpa/cmake-mode-20110824 forwards à la fin.

 (setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path)) (require 'cmake-mode) (setq auto-mode-alist (append '(("CMakeLists\\.txt\\'" . cmake-mode) ("\\.cmake\\'" . cmake-mode)) auto-mode-alist)) 

Vous devrez peut-être supprimer le répertoire c-make-mode … et essayer de réinstaller si le code ci-dessus ne fonctionne pas (en utilisant votre propre chemin).

Compte tenu de la nature du wiki comme dépôt de demi-code, demi -aide-mémoire pour les pirates informatiques d'Emacs, vous avez négligemment ignoré ce point:

Il pourrait être plus facile de déplacer l'initialisation du paquet vers un autre point pendant le démarrage afin que vous puissiez (exiger) les paquets ELPA; Cela prend en charge une grande partie des problèmes décrits:

C'est ce que je fais; L'un des premiers fichiers chargés par mon script init personnalisé (dont la création, à partir de tout ce que je peux rassembler, est le pons asinorum d'Emacs sérieux 1 ) fait

 (require 'package) (setq package-enable-at-startup nil) (package-initialize) 

Et à partir de là, j'ai simplement (require) paquets ELPA dont j'ai besoin. Cela a également pour avantage de permettre un meilleur contrôle du comportement des paquets installés par ELPA; Si, par exemple, je désire désactiver un paquet donné pour le moment, mais je ne le désinstalle pas entièrement, il est simple de commenter l'appel (require) pertinent, où le comportement par défaut nécessiterait de déplacer complètement le paquet de mon répertoire ELPA .

(1. Malgré une tentation presque écrasante, j'ai manquement refusé de nommer mon lightsaber.el lumineux personnalisé init lightsaber.el .)

Vous pouvez simplement effectuer toute votre initialisation après le chargement des paquets en utilisant le after-init-hook . De EmacsWiki :

 ;; init.el (add-hook 'after-init-hook (lambda () (load "<real init file>"))) 

J'ai eu un problème similaire lorsque j'ai commencé à utiliser ELPA. Dans mon cas, j'ai eu plusieurs paquets locaux car ceux-ci n'étaient pas présents dans ELPA.

Et donc, j'avais modifié le chemin de chargement. Pour une raison quelconque, le chemin de chargement n'est pas correctement mis à jour par package.el. Pour résoudre le problème, je devais mettre (setq load-path (cons "~/.emacs.d" load-path)) après l'appel à l' package-initialize