Comment faire pour installer automatiquement Emacs paquets en spécifiant une liste de noms de package?
Je suis en utilisant package
à gérer mon Emacs extensions. Afin de synchroniser mon Emacs paramètres sur les différents ordinateurs, je voudrais un moyen de spécifier une liste de noms de package dans .emacs
fichier, puis package
peut automatiquement rechercher et installer les paquets, de sorte que je n'ai pas besoin de les installer manuellement en appelant M-x package-list-packages
. Comment faire?
- Si vous êtes en s'appuyant sur le gestionnaire de paquets pour installer votre configuration, vous voudrez probablement pour spécifier les versions exactes (et si ce n'est pas possible, pensez à l'enregistrer tout dans le contrôle de version de vous-même), car sinon vous ne sont pas protégés, alors que les bibliothèques sont mises à jour et commencer à entrer en conflit.
Vous devez vous connecter pour publier un commentaire.
package
.package-refresh-contents
ne serait exécuté si le package n'est pas installé? Comment est(or (file-exists-p package-user-dir))
mieux / comment est-il même pas vérifier si les paquets sont installés?package-refresh-contents
. Ce sera probablement seulement être exécuté la première fois que vous ouvrez emacs sur un nouvel ordinateur, et je suis très bien avec ça. Si un paquet doit être mis à jour qui peut être fait manuellement.use-package
, vous pouvez utiliser le:ensure
mot-clé pour installer les paquets automatiquement. Cela définit aussipackage-selected-packages
si vous devez accéder à la liste des paquets à travers le personnaliser, ou par programmation.Sur la base des observations par Profpatsch et réponses ci-dessous:
or
? Oh, wow.mapc
est les effets secondaires. Mais pourquoi ne pas utiliserunless
?(package-initialize)
avant la référence àpackage-user-dir
package-activated-list
après l'appel depackage-initialize
doit être réglé à une variable comme(setq packages '(all yaml-mode))
et puis(apply #'ensure-package-installed packages)
Emacs 25.1+ conserve automatiquement la trace de l'utilisateur, les logiciels installés dans l'personnalisable
package-selected-packages
variable.package-install
va mettre à jour le personnaliser variable, et vous pouvez installer tous les packages sélectionnés avec lepackage-install-selected-packages
fonction.Une autre pratique de l'avantage de cette approche est que vous pouvez utiliser
package-autoremove
pour supprimer automatiquement les paquets qui ne sont pas inclus danspackage-selected-packages
(bien qu'il permettra de préserver les dépendances).Source: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html
Voici le code que j'utilise pour Emacs Prélude:
Si vous ne l'utilisez pas MELPA vous n'avez pas besoin de l'exiger (et si vous ne
melpa.el
a obtenu d'être sur votreload-path
(ou installé via MELPA). Le package db n'est pas actualisé à chaque fois (ce qui permettrait de ralentir le démarrage de manière significative) - uniquement s'il y a désinstallé les paquets présents.Personne n'a mentionné Fût encore, mais il est tout à fait approprié pour cette tâche.
Fondamentalement, vous créez
~/.emacs.d/Cask
liste des paquets que vous voulez installer. Par exemple:De course
cask
à partir de la ligne de commande va installer ces packages pour vous, et toutes les dépendances dont ils ont besoin.Aussi, vous pouvez automatiquement mettre à jour les paquets installés à l'aide de
cask update
./path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]
Appel
package-install
avec le nom du package, comme un symbole. Vous pouvez trouver les noms de vos colis en appelantpackage-install
de manière interactive et de remplir sur le nom. La fonctionpackage-installed-p
vous permettra de savoir si il est déjà installé.Par exemple:
error: Package
dired+ "n'est pas disponible pour l'installation". dired+ est un paquet j'ai essayé avec ton code.dired+
afficher lorsque vous exécutezpackage-list-packages
? Je crois que vous aurez besoin d'ajouter de la marmelade ou melpa à votrepackage-archives
. Si oui, pouvez-vous courir(package-install 'dired+)
?(package-installed-p 'dired+)
doit retournert
et il sera ignoré dans le code ci-dessus.package-installed-p
seul fonctionne très bien, mais l'ensemble du bloc de code qui ne fonctionne pas. J'ai essayé plusieurs paquets.'(dired+)
, pas'('dired+)
package-initialize
oupackage-refresh-contents
avant votre codeJ'aime vérifier si l'utilisateur souhaite installer les paquets d'abord comme le fait le cette réponse. Je suis aussi rafraîchissante mon contenu de l'emballage une fois avant d'installer quoi que ce soit. Je ne suis pas sûr si c'est le meilleur moyen, mais je ne pense pas que les réponses les plus fréquentes étaient le faire pour moi.
J'ai rencontré un problème que rien ne s'est passé après l'ajout de
(package-install 'org)
en.emacs
. J'ai voulu installer la mise à jour de la version deorg-mode
et intégré dans laorg-mode
est assez vieux.J'ai creusé le code source de
package-install
de Emacs 25.3.1. La fonction auto déjà de vérifier si un paquet est installé ou pas et refuse de l'installer si le paquet est déjà installé. Si la case à(unless (package-installed-p package) ...)
de réponse Dix million quatre vingt treize mille trois cent douze est en fait injustifiés.Le haut-
org-mode
est aussi installé etpackage-install
refuse d'installer la version la plus récente de ELPA. Après avoir passé quelque temps à la lecture de package.el, je suis venu avec la solution suivante.La raison pour laquelle cela fonctionne est que
package-*
la famille de fonctions gérer les arguments de façon différente selon que si c'est un symbole ou unpackage-desc
objet. Vous ne pouvez spécifier des informations de version pourpackage-install
via unpackage-desc
objet.Voici la mienne, c'est plus court 🙂