Administrivia
  1. Administrativia
  2. Utiliser et configurer XMonad
  3. Appeler Emacs depuis un navigateur, sous un Debian-like

Appeler Emacs depuis un navigateur, sous un Debian-like

(Gabriel Scherer (gasche) @ 2011-12-04 13:29:10)

Un petit billet dans la section administrativia pour me souvenir d’une astuce qui pourra resservir.

Aujourd’hui j’ai voulu reproduire sur un ordinateur une fonctionnalité que j’ai sur le mien et qui m’arrange bien : pouvoir facilement appeler Emacs depuis un navigateur web (en l’occurence Firefox) pour remplir un champ de texte.

Je ne prétends pas faire de la façon la plus efficace ou commode possible ; n’hésitez pas à le signaler si vous pensez qu’il y a une manière plus « propre » de faire.

L’idée d’ensemble est la suivante :

  1. J’utilise l’extension It's All Text qui permet d’appeler n’importe quel éditeur pour remplir un champ de texte ; si vous n’utilisez pas Firefox, il faudra trouver une extension correspondante.

  2. Je m’arrange pour que la commande editor, gérée par update-alternatives sous Debian (et Ubuntu), appelle Emacs, en utilisant emacsclient pour qu’il s’ouvre rapidement.

La première étape est simple, et marche sous toutes les versions de Firefox que j’ai testées. La seconde est un peu plus délicate, et détaillée ci-ensuite.

Pour commencer, le système update-alternatives n’accepte qu’un nom d’exécutable, sans qu’on puisse lui passer de paramètres. C’est dommage parce que pour que emacsclient soit agréable à utiliser, il faut passer l’option -c, ou --create-frame, pour qu’il crée une nouvelle fenêtre au lieu d’aller embêter une fenêtre existante.1 Il est donc nécessaire de se créer un petit script intermédiaire, à placer où vous voulez, chez moi c’est $HOME/etc/emacs.sh :

#!/bin/sh
emacsclient --create-frame $@

1 NdRZ : Personnellement, j’aime bien ouvrir ça dans une fenêtre existante. Two cents.

Ensuite il faut convaincre update-alternatives qu’on a envie d’utiliser ce script comme alternative préférée pour le programme editor — qui existe déjà et est géré par update-alternatives sur les Debian et Ubuntu récentes ; sur la machine cible il pointait vers nano par défaut. Il faut commencer par « installer » l’alternative, puis la choisir. La syntaxe d’installation est la suivante:

sudo update-alternatives --install <link> <name> <path> <priority>

<link> désigne le chemin de l’exécutable final, ici /usr/bin/editor, <name> son nom, editor, <path> le chemin du vrai programme à exécuter, donc votre script, et <priority> un nombre arbitraire, le plus grand est choisi par défaut. Chez moi les autres programmes étaient entre -100 et 20, donc j’ai mis 20, mais de toute façon ensuite je fais un choix manuel.

sudo update-alternatives --install /usr/bin/editor editor $HOME/etc/emacs.sh 20
sudo update-alternatives --set editor $HOME/etc/emacs.sh

Vous l’aurez compris, la dernière ligne désactive le choix automatique (par les priorités) pour forcer un choix manuel. Je ne sais pas pourquoi il faut répéter deux fois ce chemin, c’est un peu mal fichu, mais c’est la vie. On peut vérifier que tout a bien marché en lui demandant ce qu’il a en base pour editor :

% update-alternatives --display editor
editor - manual mode
  link currently points to /home/gabriel/etc/emacs.sh
/bin/ed - priority -100
  slave editor.1.gz: /usr/share/man/man1/ed.1.gz
/bin/nano - priority 40
  slave editor.1.gz: /usr/share/man/man1/nano.1.gz
/home/gabriel/etc/emacs.sh - priority 10
/usr/bin/emacs23 - priority 0
  slave editor.1.gz: /usr/share/man/man1/emacs.emacs23.1.gz
/usr/bin/emacsclient - priority 10
Current 'best' version is '/bin/nano'.

J’ai retiré quelques alternatives et quelques « esclaves » pour raccourcir la sortie, mais vous voyez l’idée. Maintenant il suffit de donner /usr/bin/editor à votre extension It’s All Text, et le tour est joué.

emacsclient s’utilise en ayant lancé au moins une fois, au démarrage de votre ordinateur, la commande emacs --daemon ; elle n’ouvre pas de fenêtre emacs mais lance un serveur en fond de tâche pour les clients suivants. Vous pouvez l’ajouter à vos scripts de démarrage de session X, ou ce que vous voulez. Si vous l’oubliez, It’s All Text se plaindra poliment d’une erreur à l’ouverture de l’éditeur (code de retour -1).

Avec cette configuration, emacs est facile et rapide à ouvrir depuis Firefox, et tout marche bien. Je m’en sers pour rédiger des messages un peu longs, en particulier tout ce qui est technique ; j’utilise beaucoup les facilités d’Emacs pour taper des caractères unicodes (M-x set-input-mode,2 TeX). C’est aussi utile quand on rédige un message avec des bouts de code : on peut tester dans un buffer, et facilement ouvrir des buffers déjà ouverts depuis une autre fenêtre.

2 NdRZ : M-x set-input-mode qui s’active aussi avec la commande C-x RET C-\. Une fois sélectionné, vous pouvez basculer entre le mode choisi et le mode normal par défaut avec C-\. Si votre disposition de touches ne permet pas un accès rapide et aisé à C-\, je vous conseille de vous créer un alias de touches, vers C-4 par exemple :

(define-key key-translation-map (kbd "C-4") (kbd "C-\\"))