Pour le moment, emacs ne prend pas en charge les ligatures (sous OSX, il existe un support, mais pas sur d'autres plates-formes). Cependant, emacs 24.4+ prend prettify-symbols-mode
en charge, à certains égards, un support supérieur à celui des ligatures normales.
Ce mode permet de substituer à l’affichage de toute expression rationnelle n’importe quel glyphe. J'utilise personnellement cet extrait pour que les ligatures Fira Code fonctionnent dans emacs sous linux. (EDIT: malheureusement, le lien est maintenant mort, la politique de stackoverflow pour toujours copier en ligne est évidemment la bonne ...)
Le lien que j'ai mis à l'origine est mort et je ne sais pas exactement ce qu'il contient, mais je pense que ces liens doivent être bons:
https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols et https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734
Compte tenu du problème des liens morts, je mets le code en ligne cette fois-ci:
(defun fira-code-mode--make-alist (list)
"Generate prettify-symbols alist from LIST."
(let ((idx -1))
(mapcar
(lambda (s)
(setq idx (1+ idx))
(let* ((code (+ #Xe100 idx))
(width (string-width s))
(prefix ())
(suffix '(?\s (Br . Br)))
(n 1))
(while (< n width)
(setq prefix (append prefix '(?\s (Br . Bl))))
(setq n (1+ n)))
(cons s (append prefix suffix (list (decode-char 'ucs code))))))
list)))
(defconst fira-code-mode--ligatures
'("www" "**" "***" "**/" "*>" "*/" "\\\\" "\\\\\\"
"{-" "[]" "::" ":::" ":=" "!!" "!=" "!==" "-}"
"--" "---" "-->" "->" "->>" "-<" "-<<" "-~"
"#{" "#[" "##" "###" "####" "#(" "#?" "#_" "#_("
".-" ".=" ".." "..<" "..." "?=" "??" ";;" "/*"
"/**" "/=" "/==" "/>" "//" "///" "&&" "||" "||="
"|=" "|>" "^=" "$>" "++" "+++" "+>" "=:=" "=="
"===" "==>" "=>" "=>>" "<=" "=<<" "=/=" ">-" ">="
">=>" ">>" ">>-" ">>=" ">>>" "<*" "<*>" "<|" "<|>"
"<$" "<$>" "<!--" "<-" "<--" "<->" "<+" "<+>" "<="
"<==" "<=>" "<=<" "<>" "<<" "<<-" "<<=" "<<<" "<~"
"<~~" "</" "</>" "~@" "~-" "~=" "~>" "~~" "~~>" "%%"
"x" ":" "+" "+" "*"))
(defvar fira-code-mode--old-prettify-alist)
(defun fira-code-mode--enable ()
"Enable Fira Code ligatures in current buffer."
(setq-local fira-code-mode--old-prettify-alist prettify-symbols-alist)
(setq-local prettify-symbols-alist (append (fira-code-mode--make-alist fira-code-mode--ligatures) fira-code-mode--old-prettify-alist))
(prettify-symbols-mode t))
(defun fira-code-mode--disable ()
"Disable Fira Code ligatures in current buffer."
(setq-local prettify-symbols-alist fira-code-mode--old-prettify-alist)
(prettify-symbols-mode -1))
(define-minor-mode fira-code-mode
"Fira Code ligatures minor mode"
:lighter " Fira Code"
(setq-local prettify-symbols-unprettify-at-point 'right-edge)
(if fira-code-mode
(fira-code-mode--enable)
(fira-code-mode--disable)))
(defun fira-code-mode--setup ()
"Setup Fira Code Symbols"
(set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol"))
(provide 'fira-code-mode)
J'ai dit qu'à certains égards, c'est mieux que des ligatures normales ... C'est parce que c'est "à la carte". Vous pouvez mélanger et assortir, ne prenez que les symboles que vous aimez. Vous pouvez dire, je veux le ";;" ligature, SAUF si le caractère suivant est à nouveau ";" dans ce cas, je ne le veux pas ... Et pour mélanger et assortir ... J'utilise la police "Fira Mono", ainsi que les ligatures "Fira Code". Vous n'avez pas à acheter dans la police entière.
C'est pire que les ligatures pures parce que cela ne fonctionne pas immédiatement et que la police doit être ajustée d'une certaine manière pour que cela soit possible.