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?
Réponses
Trop de publicités?; 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)))
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)
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.
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
.
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))