Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

Remplacement automatisé de caractères en Emacs

Première rédaction de cet article le 18 septembre 2008
Dernière mise à jour le 19 septembre 2008


Un petit exercice de programmation en Emacs Lisp. Comment remplacer facilement un ensemble de caractères par un autre ?

Beaucoup de pages Web aujourd'hui utilisent tout le jeu de caractères Unicode et elles ont bien raison, le Web étant certainement un des services d'Internet le mieux « unicodisé ». Ainsi, on trouvera sur une page Web comme http://morris.blogs.nytimes.com/2008/08/11/photography-as-a-weapon/, pourtant en anglais, des caractères Unicode comme les jolis guillemets (“this information that you heard? It's wrong.”, utilisant les caractères U+0201c et U+0201d. Mais ces caractères ne sont pas présents dans ASCII ni même dans Latin-1. Comme je ne suis pas encore pas encore passé à UTF-8, ces caractères me gênent lorsque je veux copier-coller une partie d'une page Web dans, par exemple, un courrier. Emacs accepte le texte mais, à l'enregistrement, proteste que :

These default coding systems were tried to encode text
in the buffer `toto':
  (iso-latin-1 (15 . 342396) (51 . 342393) (60 . 342397) (185
  . 342393))
However, each of them encountered characters it couldn't encode:
  iso-latin-1 cannot encode these: “ ”

Comment les convertir sans procéder à un rechercher/remplacer par caractère (car il n'y a pas que les guillemets) ? Une des forces d'Emacs est d'être programmable, dans son langage dédié, un dialecte de Lisp. On peut donc écrire :

(defun to-latin1 ()
  (interactive "*")
  (goto-char (point-min))
  (replace-string "something" "other thing")
  (goto-char (point-min))
  (replace-string "some other thing" "yet another thing")
...
)

On peut alors appeler cette fonction (avec M-x to-latin1 ou bien en l'attachant à une touche) et la conversion est faite.

Bon, il reste à mettre les caractères à changer. Le moyen le plus simple est de convertir le code en chaîne. La syntaxe Emacs Lisp pour cela est :

"\x53979"

Comment ai-je trouvé le chiffre (hexadécimal) 53979 ? Emacs n'utilise pas les points de code de la norme Unicode, malheureusement. Ce code 53979 est donc spécifique à Emacs. Pour le trouver, le plus simple est donc de mettre le curseur sur le caractère problématique et de faire C-x =. Le code est alors affiché en bas dans la mini-fenêtre.

Voici donc le résultat final :

(defun to-latin1 ()
  (interactive "*")
  (goto-char (point-min))
  (replace-string "\x53979" "'")
  (goto-char (point-min))
  (replace-string "\x5397c" "\"")
  (goto-char (point-min))
  (replace-string "\x5397d" "\"")
)

Merci à Christopher J. Madsen (cjm) pour son aide sur la syntaxe.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)