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

12

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

M-x package-install cmake-mode

Je peux voir le paquet à:, ~/.emacs.d/elpa/cmake-mode-20110824et je peux le charger en utilisant les instructions à la 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 les instructions d'utilisation sur la page EmacsWiki d'ELPA:

... les packages sont initialisés APRÈS que l'init.el soit chargé. Cela signifie que vous ne devez PAS mettre d'initialisation spécifique au package dans votre init.el ...

J'ai tendance à être d'accord avec cette instruction, car en ajoutant à mon ~/.gnu-emacsfichier une ligne telle que:

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

est moche, et se cassera si et quand je mettrai à jour 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-startupet sa valeur est t.
  • J'utilise un prélude .
  • user-emacs-directoryla valeur est "~/.emacs.d/" (Merci @lawlist pour la suggestion)
  • package-user-dir La valeur est "~/.emacs.d/elpa"
Chen Levy
la source
1
Est-il possible que vous ayez modifié l'emplacement du default-directoryou du user-emacs-directory, de sorte que le elparépertoire ne soit pas en cours de chargement? package-installcrée un elparépertoire et le fichier de chargement automatique créé lors de l'installation est basé sur cet emplacement.
lawlist
1
Votre dernière ligne de code dans votre question suggère que vous avez déplacé le package hors du elparépertoire - c'est-à-dire qu'il ~/.emacs.d/cmake-mode-20110824/n'est pas là où le fichier de chargement automatique s'attend à ce qu'il soit.
lawlist
@lawlist: Vous êtes très observateur. J'ai fait une erreur dans la question. Il est maintenant fixé (la question) à la valeur correcte de ~/.emacs.d/elpa/cmake-mode-20110824/. Le problème demeure.
Chen Levy

Réponses:

2

J'ai installé cmake-mode avec le marmalade-repo et jeté un œil à cmake-mode-autoloads.el. Il semble que l'auteur ait pris la décision consciente d' notinclure tout le nécessaire pour la configuration dans le fichier de chargement automatique. 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 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 voulez utiliser ~/.emacs.d/elpa/cmake-mode-20110824sans une barre oblique vers 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 réinstaller si le code ci-dessus ne fonctionne pas (en utilisant votre propre chemin).

liste des lois
la source
Bien sûr, mais sauf si je manque quelque chose, si vous mettez à jour ultérieurement cmake-mode via ELPA, alors soit le répertoire est renommé en quelque chose qui ne se trouve pas dans votre fichier init, soit la version la plus récente se retrouve dans un répertoire qui n'est pas dans votre chemin de chargement; dans ce dernier cas, soit vous ne voyez pas la mise à jour, soit vous obtenez une bizarrerie excessive parce que vous chargez manuellement une version et en (package-initialize)charge une autre. Ai-je tort? Je veux dire, je n'ai pas beaucoup utilisé ELPA et je n'ai pas encore mis à jour de paquet avec, donc je peux me tromper. Et, bien sûr, ce n'est pas une préoccupation majeure en tout cas, mais pourquoi ne pas l'éviter complètement?
Aaron Miller
Vous avez raison. Cependant, les packages ne se mettent pas à jour sans que vous le sachiez - si et quand vous mettez à jour, alors ce serait le moment de faire votre ménage. J'investis souvent beaucoup de temps à modifier les fichiers source de divers packages, et je ne voudrais pas nécessairement qu'ils soient mis à jour après avoir passé tout ce temps à les obtenir correctement. Emacs est loin de ce que l'on pourrait considérer comme "sans maintenance".
lawlist
Un excellent point.
Aaron Miller
3

Étant donné la nature du wiki en tant que référentiel à moitié de code, à moitié aide-mémoire pour les pirates Emacs, vous avez naturellement oublié ce point:

il pourrait être plus simple de déplacer l'initialisation du package à un autre moment du démarrage afin de pouvoir (exiger) des packages ELPA; cela prend en charge un grand nombre des problèmes décrits:

C'est ce que je fais; l'un des premiers fichiers chargés par mon script d'initialisation personnalisé (dont la création, d'après tout ce que je peux rassembler, est le pons asinorum d'Emacs sérieux utilise 1 )

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

et à partir de là, j'ai simplement (require)besoin des packages ELPA dont j'ai besoin. Cela a également l'avantage de permettre un contrôle plus fin du comportement des packages installés par ELPA; si, par exemple, je souhaite désactiver un package donné pour le moment mais ne pas le désinstaller complètement, il suffit de commenter l' (require)appel correspondant , où le comportement par défaut nécessiterait de déplacer le package de mon répertoire ELPA entièrement.

(1. Malgré une tentation presque écrasante, j'ai refusé avec virilité de nommer mon script d'init personnalisé lightsaber.el.)

Aaron Miller
la source
Juste un rappel pour vérifier le répertoire user-emacs s'il est modifié car les packages ELPA y résident par défaut. Je garde mes affaires dans Dropbox et j'ai été surpris de ne voir aucun effet des commandes ci-dessus dans mon script batch jusqu'à ce que je le définisse.
mlt
1

Vous pouvez simplement effectuer toute votre initialisation après le chargement des packages à l'aide de after-init-hook. De EmacsWiki :

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

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 que j'ai dû poser (setq load-path (cons "~/.emacs.d" load-path)) après l'appel àpackage-initialize

Dmytro
la source