132 votes

Comment installer automatiquement les paquets emacs en spécifiant une liste de noms de paquets?

J'utilise package pour gérer mes extensions emacs. Afin de synchroniser mes paramètres emacs sur différents ordinateurs, j'aimerais un moyen de spécifier une liste de noms de paquets dans .emacs fichier, puis package pourrait rechercher et installer automatiquement les paquets de sorte que je n'ai pas besoin de les installer manuellement en appelant M-x package-list-packages . Comment faire ça?

114voto

Nicolas Dudebout Points 5457
; list the packages you want
(setq package-list '(package1 package2))

; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")))

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(unless package-archive-contents
  (package-refresh-contents))

; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

45voto

RNA Points 19596

Basé sur les commentaires de Profpatsch et les réponses ci-dessous:

 (defun ensure-package-installed (&rest packages)
  "Assure every package is installed, ask for installation if it's not.

Return a list of installed packages or nil for every skipped package."
  (mapcar
   (lambda (package)
     ;; (package-installed-p 'evil)
     (if (package-installed-p package)
         nil
       (if (y-or-n-p (format "Package %s is missing. Install it? " package))
           (package-install package)
         package)))
   packages))

;; make sure to have downloaded archive description.
;; Or use package-archive-contents as suggested by Nicolas Dudebout
(or (file-exists-p package-user-dir)
    (package-refresh-contents))

(ensure-package-installed 'iedit 'magit) ;  --> (nil nil) if iedit and magit are already installed

;; activate installed packages
(package-initialize)
 

19voto

Bozhidar Batsov Points 23298

Voici le code que j'utilise pour Emacs Prelude :

 (require 'package)
(require 'melpa)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(setq url-http-attempt-keepalives nil)

(defvar prelude-packages
  '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
                   gist haml-mode haskell-mode helm helm-projectile inf-ruby
                   magit magithub markdown-mode paredit projectile
                   python sass-mode rainbow-mode scss-mode solarized-theme
                   volatile-highlights yaml-mode yari yasnippet zenburn-theme)
  "A list of packages to ensure are installed at launch.")

(defun prelude-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (prelude-packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs Prelude is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'prelude-packages)
 

Si vous n'utilisez pas MELPA, vous n'avez pas besoin de l'exiger (et si vous l'utilisez, melpa.el doit figurer sur votre load-path (ou installé via MELPA). Le paquet db n'est pas actualisé à chaque fois (car cela ralentirait considérablement le démarrage) - uniquement là où des packages désinstallés sont présents.

6voto

Alastair Points 2491

Personne n'a encore mentionné Cask , mais il convient parfaitement à cette tâche.

Fondamentalement, vous créez ~/.emacs.d/Cask listant les packages que vous souhaitez installer. Par exemple:

 (source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc
 

L'exécution de cask partir de la ligne de commande installera ces packages pour vous et toutes les dépendances dont ils ont besoin.

En outre, vous pouvez mettre à jour automatiquement les packages installés à l’aide de cask update .

4voto

ataylor Points 31154

Appelez package-install avec le nom du package sous forme de symbole. Vous pouvez trouver les noms de paquet pour vos paquets en appelant package-install interactive et en complétant le nom. La fonction package-installed-p vous indiquera si elle a déjà été installée.

Par exemple:

 (mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(package1 package2 package3))
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X