OTF-Ligaturunterstützung in Emacs


46

PragmataPro ist eine Schriftart, die eine Reihe von Programmierligaturen enthält . Nach meinem Verständnis handelt es sich hierbei um OTF-Ligaturen (OpenType Face).

Mir ist bekannt, dass Emacs das programmgesteuerte Ersetzen von Zeichenkombinationen (z. B. ->nach oder lambdanach λ) unterstützt. Dies sind jedoch Unicode-Imitationen, da sie ihre eigenen Codepunkte haben, was bei echten Ligaturen nicht der Fall ist.

Stimmt es, dass Emacs (ab 25) OTF-Ligaturen nicht automatisch unterstützt? Gibt es auf einer niedrigeren Ebene Optionen zum manuellen Festlegen von Glyphenzuordnungen?

Wenn Ligaturen nicht unterstützt werden, was muss Emacs dann tun, um Ligaturen zu unterstützen?



Welche "Anzahl nützlicher Verbesserungen" haben Sie aus Neugier im Sinn?
Dan

3
Verbessertes Rendering mit variabler Breite im Textmodus, Programmieren von Ligaturen, die den Quellcode attraktiver machen, ohne die Form des Codes zu beeinflussen, und grafische Ligaturen für Felder und Pfeile. Im Nachhinein ist "attraktiv" wahrscheinlich ein besserer Deskriptor als "nützlich".
Matthew Piziak

github.com/i-tu/Hasklig/issues/10 verfolgt die Emacs-Unterstützung für Hasklig. Eine Teillösung, die speziell für Hasklig funktioniert und haskell-modein dieser Übersicht beschrieben wird .
Matthew Piziak

3
In einem kürzlich veröffentlichten Beitrag zu r / emacs wurde eine Problemumgehung mit veröffentlicht prettify-symbols-mode, die mit PragmataPro 0.822 ziemlich gut funktioniert.
Kaushal Modi

Antworten:


9

emacs unterstützt derzeit keine Ligaturen (unter OSX gibt es eine gewisse Unterstützung, aber nicht auf anderen Plattformen). Allerdings unterstützt Emacs 24.4+, prettify-symbols-modewas in gewisser Hinsicht besser ist als die Unterstützung normaler Ligaturen.

In diesem Modus können Sie beliebige reguläre Ausdrücke mit beliebigen Glyphen ersetzen. Ich persönlich verwende dieses Snippet , um Fira-Code-Ligaturen in Emacs unter Linux zum Laufen zu bringen. (EDIT: leider ist der link jetzt tot, die politik von stackoverflow immer inline zu kopieren ist offensichtlich die gute ...)

Der Link, den ich ursprünglich gesetzt habe, ist tot und ich bin nicht sicher, was er genau enthielt, aber ich denke, diese Links sollten gut sein: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols and https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

In Anbetracht des Problems mit toten Links setze ich den Code diesmal in die Zeile:

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

Ich sagte, dass dies in gewisser Hinsicht besser ist als normale Ligaturen. Das liegt daran, dass es "a la carte" ist. Sie können mischen und anpassen, nur die Symbole, die Sie mögen. Man kann sagen, ich möchte das ";;" Ligatur, AUSSER wenn das nächste Zeichen wieder ";" ist In diesem Fall möchte ich es nicht ... Und was das Mischen und Zuordnen betrifft ... Ich verwende die Schriftart 'Fira Mono' zusammen mit den Ligaturen 'Fira Code'. Sie müssen nicht die gesamte Schrift einkaufen.

Es ist schlimmer als reine Ligaturen, weil es nicht sofort funktioniert und die Schriftart auf eine bestimmte Weise optimiert werden muss, um dies zu ermöglichen.


Hallo! Können Sie dieses Snippet weitergeben, damit Fira-Code-Ligaturen funktionieren? Gist scheint gelöscht zu sein.
Xamenrax

huh sorry ... hat die Antwort aktualisiert, ich hoffe es hilft
Emmanuel Touzery

1
Danke! Fast 3 Jahre sind vergangen, aber etwas ändert sich nie - die Leute sind verzweifelt daran
interessiert,

0

Wenn Sie mit OS X arbeiten, unterstützt der Carbon Mac Emacs-Port Ligaturen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.