Soporte de ligadura OTF en Emacs

46

PragmataPro es un tipo de letra que viene con una serie de ligaduras de programación . Tengo entendido que estas son ligaduras de cara OpenType (OTF).

Soy consciente de que Emacs soporta el reemplazo programática de combinaciones de caracteres (por ejemplo, ->a o lambdaa λ). Sin embargo, estas son ligaduras falsas unicode, ya que tienen sus propios puntos de código, que las ligaduras reales no tienen.

¿Estoy en lo cierto de que Emacs (a partir de 25) no admite ligaduras OTF automáticamente? En un nivel inferior, ¿hay opciones disponibles para especificar manualmente las asignaciones de glifos?

Si las ligaduras no son compatibles, ¿qué se debe hacer para que Emacs admita ligaduras?

Matthew Piziak
fuente
3
Parece que aún no es compatible: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi
Por curiosidad, ¿cuáles son algunas de las "numerosas mejoras útiles" que tiene en mente?
Dan
3
Representación mejorada de ancho variable en modo de texto, programando ligaduras que hacen que el código fuente sea más atractivo sin afectar la forma del código, y ligaduras esquemáticas para cuadros y flechas. En retrospectiva, "atractivo" es probablemente un mejor descriptor que "útil".
Matthew Piziak
github.com/i-tu/Hasklig/issues/10 está rastreando el soporte de Emacs para Hasklig. Una solución parcial, que funciona específicamente para Hasklig y haskell-modese detalla en esta esencia .
Matthew Piziak
3
Una publicación reciente en r / emacs publicó una solución alternativa prettify-symbols-mode, y funciona bastante bien con PragmataPro 0.822.
Kaushal Modi

Respuestas:

9

Por ahora, emacs no admite ligaduras (en OSX hay algún soporte, pero no en otras plataformas). Sin embargo, emacs 24.4+ admite, prettify-symbols-modeque en algunos aspectos es mejor que el soporte de ligaduras normales.

Ese modo permite sustituir para mostrar cualquier expresión regular con cualquier glifo. Personalmente estoy usando este fragmento para hacer que las ligaduras de Fira Code funcionen en emacs en Linux. (EDITAR: desafortunadamente el enlace ahora está muerto, la política de stackoverflow para copiar siempre en línea es obviamente la buena ...)

El enlace que coloqué originalmente está muerto y no estoy seguro de qué contiene exactamente, pero creo que estos enlaces deberían ser buenos: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols and https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Dado el problema del enlace muerto, esta vez pongo el código en línea:

(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)

Dije que de alguna manera esto es mejor que las ligaduras normales. Eso es porque es "a la carta". Puede mezclar y combinar, tome solo los símbolos que desee. Puedes decir, quiero el ";;" ligadura, EXCEPTO si el siguiente carácter es nuevamente ";" en ese caso no lo quiero ... Y sobre mezclar y combinar ... Estoy usando la fuente 'Fira Mono', junto con las ligaduras 'Fira Code'. No tiene que comprar toda la fuente.

Es peor que las ligaduras puras porque no funciona de fábrica y requiere que la fuente se sintonice de cierta manera para que sea posible.

Emmanuel Touzery
fuente
¡Hola! ¿Podría compartir este fragmento para que funcionen las ligaduras de Fira Code? Gist parece haber sido eliminado.
xamenrax
eh lo siento ... actualicé la respuesta, espero que ayude
Emmanuel Touzery
1
¡Gracias!
Han
0

Si está en OS X, creo que el puerto Carbon Mac Emacs admite ligaduras.

tgerdin
fuente