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 autre autoloads 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.