Un des aspects parfois fastidieux d'Emacs est la gestion de tous les scripts et extensions non inclus dans la distribution de base, qu'on récupère deci-delà et dont il faut gérer les version, les mises à jour, l'inclusion dans son .emacs
, etc.
Pour remédier à ce problème, différents scripts existent, comme Auto Install, plutôt centré sur les scripts hébergés sur EmacsWiki, ELPA et l'extension package, et bien d'autres…
Or je viens de découvrir grâce à un retweet de Julien Danjou un projet que je ne connaissais pas : el-get. Et il s'avère que ce système est tout simplement génial, et que j'y ai du coup migré dans la foulée la gestion de la totalité de mes scripts Emacs.
Pour le dire vite, el-get
permet d'installer des scripts et extensions depuis quasiment toutes les sources imaginables (git, url, fichier, emacswiki, elpa, etc.), automatise leur installation, ajoute automatiquement les require
et autres directives qui vont bien, et permet une mise à jour et une synchronisation très simple des extensions installées.
Installation
L'installation d'el-get
se fait en ajoutant les lignes suivantes dans son .emacs
et en les exécutant :
(add-to-list 'load-path "~/.emacs.d/el-get/el-get") (unless (require 'el-get nil t) (url-retrieve "https://raw.github.com/dimitri/el-get/master/el-get-install.el" (lambda (s) (end-of-buffer) (eval-print-last-sexp))))
Ces instructions vérifient qu'el-get
est déjà installé et, sinon, le télécharge via git et l'installe dans ~/.emacs.d/el-get/el-get
.
Note : en cas de message d'erreur lié à la variable
el-get-verbose
, ajouter la ligne(setq el-get-verbose t)
dans son.emacs
peut suffire à résoudre le problème.
Utilisation interactive
el-get
est fourni avec un certain nombre de «recettes» (recipes) qui décrivent l'installation d'un grand nombre d'extensions.
Imaginons que nous souhaitons installer rainbow-mode par exemple. Rien de plus simple. Il suffit de faire M-x el-get-install
, de saisir rainbow-mode
au prompt, et de laisser el-get
faire le boulot, c'est à dire :
- télécharger les fichiers nécessaires
- les installer dans
~/.emacs/el-get
- byte-compiler les fichiers
- installer et exécuter automatiquement les
require
et autreautoloads
nécessaires à l'utilisation de l'extension - et, en cadeau bonux, il fait tout ça de manière asynchrone (vous pouvez continuer à utiliser Emacs pendant ce temps) et vous prévient qu'il a fini avec une jolie notification !
Une fois l'opération effectuée, même pas besoin d'éditer son .emacs
, l'extension est immédiatement disponible et un M-x rainbow-mode
marche immédiatement.
Le plus fort, c'est que ça fonctionne pour des extensions de petite taille, mais aussi pour des mastodontes nécessitant dépendances et compilations, comme org-mode ou nXhtml !
Vous avez testé une extension et vous ne souhaitez pas la conserver ? Hop, el-get-remove
. Vous souhaitez mettre à jour l'une d'entre elles ? Hop, el-get-update
. Etc., etc.
Installation depuis EmacsWiki
Vous souhaitez installer un fichier hébergé sur EmacsWiki ? Pas de problème, il suffit de faire un petit M-x el-get-emacswiki-refresh
, d'attendre la jolie notification, et à partir de là l'intégralité des fichiers hébergés sur EmacsWiki sont automatiquement disponibles et installables avec el-get-install
!
Sauvegarde et synchronisation de la liste des extensions
Jusqu'à présent je gérais mes différents fichiers de configuration emacs dans un dépôt git, qui me permettait à la fois de garder l'historique et de synchroniser entre différentes machines. Là où ça devient plus compliqué, c'est quand on installe des extensions elles-mêmes sous git (problèmes de conflits pour des dépôts inclus dans des dépôts, même si git sait gérer ça très bien) ou sous d'autres gestionnaires de version.
el-get
permet de gérer cela de manière très élégantes : il suffit de déclarer dans son .emacs
la liste des extensions utilisées pour qu'elles soient automatiquement vérifiées au démarrage et installées si nécessaire.
Par exemple, voici ce que j'ai dans mon .emacs
:
(setq my:el-get-packages '(xml-rpc-el yasnippet org-mode anything auto-dictionnary autopair calfw coffee-mode color-theme dired+ edit-server fixme-mode flymake-ruby gist google-maps js2-mode nxhtml org2blog rainbow-mode r-autoyas rvm switch-window sr-speedbar typopunct )) (el-get 'sync my:el-get-packages)
La variable my:el-get-packages
contient la liste des extensions utilisées, et la fonction (el get 'sync)
va automatiquement vérifier que toutes les extensions spécifiées sont installées sur le système. Et si ça n'est pas le cas, elle les installe.
Donc, plus besoin d'enregistrer les fichiers des extensions proprement dites dans le dépôt git de sa config emacs, il suffit de spécifier leur liste dans son .emacs
et el-get
se charge du reste.
Ajouter ses propres recettes
Il peut arriver qu'une extension ne soit disponible ni sur EmacsWiki ni parmi les recettes fournies. Dans ce cas il est possible et assez simple de créer sa propre recette.
Prenons par exemple le fichier pwsafe.el
, qui est une interface entre Emacs et pwsafe. Celui-ci n'est disponible qu'en téléchargement direct depuis le site de son auteur.
La «recette» d'installation correspondante est très simple :
(:name pwsafe :description "Emacs interface to pwsafe, by Stefan Reichoer" :type http :url "http://www.xsteve.at/prg/emacs/pwsafe.el")
Dans le cas du thème color-theme-tangotango, hébergé sur GtiHub, c'est pas plus compliqué :
(:name color-theme-tangotango :description "Another color theme based on the Tango palette." :type git :url "https://github.com/juba/color-theme-tangotango.git")
Pour ajouter une recette à el-get
, on peut l'ajouter directement dans son .emacs
:
(setq my:el-get-packages '(xml-rpc-el yasnippet org-mode […] )) (setq el-get-sources '((:name pwsafe :description "Emacs interface to pwsafe, by Stefan Reichoer" :type http :url "http://www.xsteve.at/prg/emacs/pwsafe.el"))) (setq my-packages (append my:el-get-packages (mapcar 'el-get-source-name el-get-sources))) (el-get 'sync my-packages)
Aller plus loin
Pour avoir un aperçu plus complet des fonctionnalités d'el-get
, l'idéal est de consulter le README sur GitHub.