Mettre à jour les packages dans Emacs

144

J'ai la configuration suivante pour les paquets (je ne sais pas s'il y en a une meilleure recommandée):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

J'ai trois questions liées à l'installation et à la mise à jour des packages.

Q1. Existe-t-il un moyen de mettre à jour la liste des packages disponibles (et les versions les plus récentes) et de mettre à jour un package spécifique?

Q.2 Quelle est la différence entre les sources de package suivantes?:

  • EL PA,
  • GNOU
  • confiture
  • melpa

Q.3 L'ordre dans lequel ils sont ajoutés est-il important package-archives?

Amelio Vazquez-Reina
la source
13
MELPA est nécessaire pour l'auto-complétion puisque évidemment personne ne se soucie de rendre l'auto-complétion disponible sur Marmalade. Ne vous embêtez pas, nettoyez plutôt votre fichier package-archives. Débarrassez-vous de l'archive ELPA, qui n'est plus maintenue, et de l'archive marmelade, qui est un gâchis de paquets obsolètes et dupliqués sans conseils et maintenance clairs. Utilisez uniquement l'archive GNU standard et MELPA>
lunaryorn
2
Merci @lunaryorn! C'est très utile. Savez-vous comment je pourrais rester informé sur des choses comme ça? (ie "bonnes-choses-à-savoir" comme celles-ci alors qu'Emacs évolue)
Amelio Vazquez-Reina
3
L'information circule librement sur le Web, attrapez-la: suivez / emacs sur Reddit, suivez les blogs et Twitter de personnes renommées d'Emacs comme Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley, etc., rejoignez #emacs sur Freenode IRC, et beaucoup plus.
lunaryorn
3
Vous devriez (setq package-enable-at-startup nil)si vous vous appelez (package-initialize).
phils
2
Merci @phils - Pourquoi est-ce nécessaire?
Amelio Vazquez-Reina

Réponses:

163
  1. Afin de mettre à jour automatiquement la liste des packages, uniquement s'il n'y a pas déjà de liste de packages , utilisez ce qui suit:

    (when (not package-archive-contents)
        (package-refresh-contents))

    Afin de mettre à jour tous les packages installés, tapez package-list-packages, qui vous mènera au *Packages*tampon (et mettra également à jour la liste des packages), puis tapez U x.

    package-refresh-contentsessaie inconditionnellement de télécharger une liste de paquets à partir de tous les dépôts auxquels vous avez ajouté package-archives; package-archive-contentsest non nul si vous avez déjà téléchargé la liste des packages.

  2. ELPA est l'original. Je ne pense pas que ce soit vraiment plus maintenu, mais je ne suis pas sûr. Je ne m'en sers pas.

    GNU est "officiel". Il est maintenu avec Emacs, ce qui signifie que les choses devraient toujours fonctionner, mais les mises à jour et les nouveaux packages ne viennent pas très souvent.

    Marmalade est essentiellement un site Web sur lequel vous pouvez télécharger un package complet et il sera ajouté au repo de marmelade. Vous ne soumettez pas simplement un lien vers l'amont du package, et cela n'automatise pas complètement la création du package. Je pense que c'est la bonne chose, car vous ne voulez pas nécessairement suivre en amont. Malheureusement, il n'a pas été entretenu pendant un certain temps, mais quelqu'un l'a récemment repris, il devrait donc être de retour et mieux à un moment donné.

    Melpa prend une URL vers, par exemple, la zone lisp d'EmacsWiki ou un dépôt github, et construit automatiquement un paquet à partir de celui-ci. Ainsi, il a généralement au plus un jour de retard sur tout ce qu'il suit. Même s'il suit en amont, je n'ai jamais eu de problème en pratique, et c'est de là que viennent la plupart de mes paquets. Il y a aussi Melpa Stable , qui est comme Melpa mais récupère les révisions marquées du dépôt en amont au lieu de la dernière révision. Melpa stable a moins de paquets que Melpa.

    Le mode organisation a son propre package.eldépôt ( http://orgmode.org/elpa/ ).

    Tous les dépôts de packages fonctionnent de la même manière, il vous suffit de les ajouter à votre fichier package-archives.

    Voici un article de blog plus détaillé sur ce sujet, avec lequel je suis pour la plupart d'accord.

  3. Je ne suis pas sûr, mais je pense que si un package est dupliqué dans différents dépôts, l'ordre dans lequel les dépôts apparaissent package-archivesdétermine la priorité. Je ne sais pas si une priorité plus élevée se trouve au début ou à la fin de la liste.

    Mise à jour: Dans Emacs 25, il existe une variable package-archive-prioritiesque vous pouvez utiliser pour hiérarchiser vos dépôts de paquets (par exemple, préférez ELPA à MELPA).


Voici la section pertinente de mon init.el, si vous êtes intéressé:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))
jpkotta
la source
2
Merci! Qu'est-ce que le when (not package-archive-contents)chèque?
Amelio Vazquez-Reina
3
Le conditionnel empêche l'actualisation à chaque fois que je lance emacs (je veux généralement qu'il ne vérifie que lorsque je le lui demande). Il vérifie uniquement s'il n'y a pas d'archives de paquets, ce qui ne devrait être le cas que la première fois que je clonerai ma configuration sur une nouvelle machine.
jpkotta
Je vous informe simplement de la réponse de @Brandy Trainor, qui semble compléter votre réponse - au cas où cela serait utile.
Amelio Vazquez-Reina
Je pense que cela doit être appelé (refresh-package-contents)sans condition avant de télécharger de nouveaux packages, sinon Emacs peut essayer de télécharger une ancienne version de package (qui est alors un 404), échouer et arrêter le chargement.
Vladimir Panteleev le
Quelle est la meilleure façon de comprendre quel paquet est indésirable? @jpkotta
alper
103

Dans Emacs, utilisez M-x list-packagespour lister tous les paquets qui actualiseront automatiquement le contenu de l'archive. Ensuite, utilisez Upour marquer tous les packages pouvant être mis à niveau et xpour effectuer les nouvelles mises à jour. Emacs récupérera et installera ensuite toutes les mises à niveau, et vous demandera si vous souhaitez supprimer les anciennes versions obsolètes par la suite.

Vous pouvez également jeter un œil à Carton qui fournit un moyen plus pratique de gérer vos paquets en les déclarant dans un fichier dédié, et inclut un client de ligne de commande pratique pour installer et mettre à jour automatiquement les paquets déclarés de cette manière.


L'ordre de package-archivesn'a pas d' importance. Emacs regroupe le contenu de toutes les archives en une seule liste cohérente des packages disponibles et de leurs versions, stockés dans package-archive-contents.

Ensuite package-install, Emacs choisira simplement la dernière version d'un package, quelle que soit l'archive d'origine. Pour plus de contrôle sur l'origine du paquet, MELPA fournit le paquet melpa qui permet de mettre en liste noire ou blanche des paquets à partir d'archives spécifiées.

lunaryorn
la source
2
C'est S-upour être plus précis.
Lenar Hoyt
@mcb Quoi S-u? Le menu du package n'utilise pas cette liaison.
lunaryorn
2
Je veux dire Shift-upar là.
Lenar Hoyt
8
@mcb Eh bien, c'est pourquoi j'ai écrit un U majuscule
lunaryorn
1
C'est juste pour ceux qui sont confus comme moi qui pensent que cela signifie <kbd> U </kbd>.
Lenar Hoyt
23

Dans le terminal:

emacs

M-x list-packages

cela vous met dans le tampon * packages *

shift-u x

emacs vous demandera (o / n), attendez les mises à jour

C-x k <ret>

cela tuera le * packages * buffer et vous ramènera à * scratch *

C-x-C-c

cela quittera emacs et vous permettra de relancer via, mais vous devrez peut-être déboguer :(

emacs

mes 2 ¢

rezwits
la source
J'ai eu "aucune commande spécifiée" ou quelque chose comme ça quand j'ai tapé "U". Après l'exécution M-x package-refresh-contents, il m'a invité à taper «U» pour marquer tout pour la mise à jour, puis j'ai pu taper «x» pour exécuter les mises à jour.
MrColes
2

C'est plus un commentaire prolongé sur la réponse de jpkotta.

C'est un ajustement que j'expérimente pour la réponse de jpkotta ci-dessus:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(en remplaçant (when (not package-archive-contents) (package-refresh-contents)) ).

La liste de paquets n'était pas suffisamment rafraîchissante pour mon cas d'utilisation.

Je n'ai pas envisagé s'il existe une solution plus efficace à mon problème; d'abord, je dois voir si le problème disparaît avec cet ajustement.

Brady Trainor
la source
Dans ma réponse, package-archive-contentsest actualisé uniquement s'il n'existe pas. L'idée est que vous copiez votre .emacs.d sur une nouvelle machine et qu'il installe automatiquement tous vos packages, mais après cela, vous devez mettre à jour manuellement. J'essaye de mettre à jour environ une fois toutes les deux semaines. Je suppose que vous avez ajouté un package à votre liste, mais vous étiez package-archive-contentstrop vieux pour l'avoir?
jpkotta
@jpkotta, j'ai un double démarrage, chacun utilisant sa valeur ~/.emacs.d/elpa/par défaut pour l'emplacement des paquets. Cependant, ma version de votre code d'installation de paquet est dans une "troisième" partition, ( e:/emacs-configou /e/emacs-config/). J'ajoute donc un package à la liste dans un système d'exploitation, et il devrait se mettre à jour lorsque je charge Emacsdans l'autre système d'exploitation. Bien sûr, il y a un élément de surpuissance dans ma solution, mais cela semble fonctionner au moins.
Brady Trainor
@jpkotta, pourquoi mon package-archive-contentssemblait peut-être si déréglé m'échappe. C'est un problème que je n'ai pas précisé. Si je cherche et trouve une solution «plus élégante» à l'avenir, je l'ajouterai à mon message.
Brady Trainor
1
(package-refresh-contents)écrit à ~/.emacs.d/elpa/archives. Il n'est pas clair si vous avez ce répertoire partagé entre les systèmes d'exploitation. Je recommanderais de ne pas partager les elpa/répertoires, car le bytecode d'Emacs (le code dans elpa/est bytecompiled) n'est pas rétrocompatible ( gnu.org/software/emacs/manual/html_node/elisp/… ). Vous devrez vous assurer que les deux installations ont la même version d'Emacs. Je garde mon .emacs.dcontrôle de version et je synchronise différentes installations avec cela.
jpkotta