Si vous ne saviez pas qu'Emacs possède un système d'extensions, il est temps de vous mettre à la page et de vous créer une config aux petits oignons !

1 Utilisation

Si vous avez Emacs 24.1 ou supérieur, vous avez déjà package.el et vous pouvez de suite essayer les quelques commandes suivantes (et pour toutes les versions, nous avons el-get):

  • M-x package-refresh-content pour le "apt-get update",
  • M-x package-list-packages pour tout lister: paquets disponibles, installés ou pas,
  • M-x package-install RET nom-d'un-paquet RET pour faire ce que de doit, avec TAB-completion (par exemple, magit ou evil),
  • M-x list-packages (un petit raccourci) pour tout lister, C-s (comme d'hab) pour chercher un paquet, d pour le marquer à désinstaller, i pour le marquer à installer, U pour tout marquer à mettre à jour, u pour "unmark" le paquet, et x pour tout exécuter.
  • il est conseillé de tout initialiser au démarrage avec la ligne (package-initialize) dans votre fichier de démarrage.

Maintenant, comme avec apt, il faut prendre en compte les sources de paquets. Par défaut on a accès à la base de GNU ELPA (Emacs Lisp Package Archive) mais il y en a bien plus dans MELPA et Marmalade, qu'on va donc ajouter:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

Notez qu'on les a ajoutées après "require package" et avant l'initialisation.

C'est tout ce que vous avez besoin de savoir.

Liens:

2 Lister les paquets et les synchroniser

Maintenant voyons comment sauvegarder la liste des paquets qu'on installe. Ça nous servira d'abord à garder une trace, et à partager facilement sa configuration entre plusieurs PCs, par exemple entre maison et bureau, dès lors qu'on a placé son fichier d'init sous gestion de version (et créé un dépôt public où vous voulez, ou privé sur gitlab).

Certains ne font pas la fine bouche mais s'assurent une reproductibilité à 100% en commitant intégralement le répertoire ~/.emacs.d/elpa/, où sont installés les paquets.

Sinon, on écrit un petit peu d'elisp:

;; Rafraichir la liste
(when (not package-archive-contents)
  (package-refresh-contents))

;; Ma liste de paquets
(defvar my-packages '(
   org
   evil
   un-autre-paquet
  )
  "A list of packages to ensure are installed at launch.")

;; Tout installer
(dolist (p my-packages)
  (when (not (package-installed-p p))
    (package-install p)))

Petites notes de lisp: l'apostrophe ='(un deux)= est un raccourci pour créer une liste: (list un deux). Le reste se comprend non ? Dans package-installed-p, le -p final veut dire "predicate", donc cette fonction va retourner true ou false (t ou nil). dolist est pour boucler sur la liste… ce n'est pas trop fonctionnel, on aurait pu utiliser map, ok.

3 Cask et Pallet

Une autre possibilité est d'utiliser Cask et Pallet (équivalents de bundler pour Ruby?) pour écrire la liste dans un fichier à part, et pour mettre à jour automatiquement ce fichier quand on manipule des paquets dans Emacs.

4 Use-package

Le but de use-package est de regrouper la configuration d'un paquet dans une seule déclaration, et de gagner en performances (le chargement et la config du paquet se fera en asynchrone).

Cette fonction est de John Wiegley, l'auteur également de eshell, le système de compta ledger et plein d'autres choses. Il est le nouveau maintainer d'Emacs depuis quelques semaines.

5 Limitations

Malgré toutes les bonnes choses, package.el n'est pas encore un apt-get pour Emacs. Melpa contient les dernières versions des paquets (melpa utilise leur branche master), ce qui peut créer des problèmes d'incompatibilité. Pour remédier à ce problème on peut maintenant se baser sur melpa-stable, qui utilise les tags des paquets:

(add-to-list 'package-archives
             '("melpa-stable" . "https://stable.melpa.org/packages/"))

Mais tous les paquets ne sont pas dans le dépôt stable, et il arrive que certains dépendent sur des versions récentes qu'on ne trouve pas dans melpa-stable… Ceci dit, au quotidien, ça va, mais… on peut avoir un peu de config à faire quand on n'en a pas envie. Personnellement je mets peu souvent mes extensions à jour, et quand je le fais je dois renommer un ou deux paquets et en installer un ou deux manuellement. Ça va.

Certains font autrement.

6 Conclusion

En conclusion: utilisez package.el :)

Et si vous ne savez pas quoi installer (à part org, magit, evil, ido, smex, projectile, helm, helm-projectile, move-text et elscreen n'est-ce pas ?), restez dans le coin on en discute une prochaine fois !