Support de ligature OTF dans Emacs

46

PragmataPro est une fonte livrée avec un certain nombre de ligatures de programmation . D'après ce que j'ai compris, il s'agit de ligatures OpenType Face (OTF).

Je suis conscient qu'Emacs prend en charge le remplacement par programme des combinaisons de caractères (par exemple ->to ou lambdato λ). Cependant, ce sont des fausses ligatures unicode, car elles ont leurs propres points de code, ce que ne font pas les vraies ligatures.

Ai-je raison de dire qu'Emacs (à la date du 25) ne prend pas automatiquement en charge les ligatures FTO? À un niveau inférieur, existe-t-il des options permettant de spécifier manuellement les mappages de glyphes?

Si les ligatures ne sont pas supportées, que doit-on faire pour qu'Emacs prenne en charge les ligatures?

Matthew Piziak
la source
3
On dirait que ce n'est pas encore supporté: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi
Par curiosité, quels sont quelques-uns des "nombres d'améliorations utiles" que vous avez en tête?
Dan
3
Amélioration du rendu de largeur variable en mode texte, programmation des ligatures qui rendent le code source plus attrayant sans affecter la forme du code, et ligatures schématiques pour les boîtes et les flèches. Avec le recul, "attractif" est probablement un meilleur descripteur que "utile".
Matthew Piziak
github.com/i-tu/Hasklig/issues/10 suit le support Emacs pour Hasklig. Une solution partielle, qui fonctionne spécifiquement pour Hasklig et haskell-modeest détaillée dans cet article .
Matthew Piziak
3
Un post récent sur r / emacs a publié une solution de contournement utilisant prettify-symbols-mode, et cela fonctionne plutôt bien avec PragmataPro 0.822.
Kaushal Modi

Réponses:

9

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-modeen 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.

Emmanuel Touzery
la source
Salut! Pourriez-vous partager cet extrait pour que les ligatures Fira Code fonctionnent? Gist semble être supprimé.
xamenrax
désolé ... mis à jour la réponse, j'espère que cela aidera
Emmanuel Touzery
1
Je vous remercie! Presque 3 ans se sont écoulés mais quelque chose ne change jamais - des personnes désespérées
veulent
0

Si vous utilisez OS XI, croyez que le port Carbon Mac Emacs prend en charge les ligatures.

Tgerdin
la source