Site personnel d'Antoine Aubé


Espaces insécables

Comme j’écris pas mal pour le travail en ce moment, j’ai constaté dans mes textes des retours à la ligne parfois maladroits. Par exemple, considérons ces (très courtes) lignes :

Hé ! Salut toi
! Tu vas bien
?

Ici, j’ai borné mes lignes à 14 caractères, ce qui a fait mettre mon ! et mon ? à la ligne. Mais n’est-ce pas curieux ? Personnellement, je trouve plus harmonieux le découpage suivant :

Hé ! Salut
toi ! Tu vas
bien ?

Rien d’étonnant à ce sentiment, car nous sommes habitués à quelques règles typographiques qui demandent, par exemple, de ne pas passer la ligne avant un signe de ponctuation. Certains logiciels respectent ces règles d’eux-mêmes : par exemple, LibreOffice Writer surligne l’espace précédent un point d’interrogation, comme pour signifier que cet espace est spécial. Malheureusement, ce comportement n’est pas la norme.

Le secret pour éviter ces sauts à la ligne mal placés : l’espace insécable. C’est un caractère affiché comme un espace, mais qui ne signifie pas la fin d’un mot. Ainsi, deux mots reliés par un espace insécable ne peuvent pas être séparés par un retour à la ligne. Il n’y a pas de touche en AZERTY pour insérer un espace insécable. Avec BÉPO, il suffit de taper la combinaison « Shift + Espace ».

Pour gagner du temps, j’ai programmé une petite fonction pour Emacs qui place des espaces insécables (codage Unicode : U+00a0) là où il faut dans une région :

(defun my/replace-with-non-breaking-spaces (beginning end)
  "Replace simple space with non-breaking spaces when required in French in region.
BEGINNING and END are the boundary of the region.
If the region is inactive, then replace spaces in the whole buffer."
  (interactive "r")

  (if (not (use-region-p))
      (setq beginning (point-min)
            end (point-max)))

  (progn (replace-regexp-in-region "\\(?1:[«]\\) " "\\1\u00a0" beginning end)
         (replace-regexp-in-region " \\(?1:[%!:?;»]\\)" "\u00a0\\1" beginning end)))

Pour ne pas oublier d’utiliser cette fonction, je l’avais ajouté comme hook avant chaque sauvegarde, mais ce n’était pas très concluant car ça remplaçait tout de façon anarchique, y compris l’intérieur des blocs de code… Je suggère donc de simplement lui donner un raccourcis accessible :

(add-hook 'text-mode-hook
          (lambda ()
            (local-set-key (kbd "C-c !") #'my/replace-with-non-breaking-spaces)))