Obsługa ligatury OTF w Emacsie

46

PragmataPro to krój pisma z wieloma ligaturami programującymi . Rozumiem, że są to ligatury twarzy OpenType (OTF).

Wiem, że Emacs obsługuje programowe zastępowanie kombinacji znaków (na przykład ->do lub lambdado λ). Są to jednak fałszywe ligatury unicode, ponieważ mają własne punkty kodowe, których nie mają prawdziwe ligatury.

Czy mam rację, że Emacs (od 25) nie obsługuje automatycznie ligatur OTF? Czy na niższym poziomie są dostępne opcje ręcznego określania mapowań glifów?

Jeśli ligatury nie są obsługiwane, to co należy zrobić, aby Emacs wspierał ligatury?

Matthew Piziak
źródło
3
Wygląda na to, że nie jest jeszcze obsługiwany: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi
Z ciekawości, jakie są „liczby użytecznych ulepszeń”, które masz na myśli?
Dan
3
Ulepszone renderowanie o zmiennej szerokości w trybie tekstowym, programowanie ligatur, które sprawiają, że kod źródłowy jest bardziej atrakcyjny bez wpływu na kształt kodu, oraz ligatury diagramów dla pól i strzałek. Z perspektywy czasu „atrakcyjny” jest prawdopodobnie lepszym deskryptorem niż „użyteczny”.
Matthew Piziak
github.com/i-tu/Hasklig/issues/10 śledzi wsparcie Emacsa dla Hasklig. Częściowe rozwiązanie, które działa specjalnie dla Haskliga i haskell-modejest szczegółowo opisane w tej treści .
Matthew Piziak,
3
Ostatni post R / emacs napisali obejścia przy użyciu prettify-symbols-mode, i to działa dobrze z bardzo PragmataPro 0,822.
Kaushal Modi

Odpowiedzi:

9

emacs na razie nie obsługuje ligatur (w OSX jest pewne wsparcie, ale nie na innych platformach). Jednak obsługuje emacs 24.4+, prettify-symbols-modeco jest pod pewnymi względami lepsze niż normalne wsparcie ligatur.

Ten tryb pozwala zastąpić wyświetlanie dowolnego wyrażenia regularnego dowolnym glifem. Osobiście używam tego fragmentu kodu, aby ligatury kodu Fira działały w emacsie na systemie Linux. (EDYCJA: niestety link jest już martwy, polityka nakładania stosów, aby zawsze kopiować w toku, jest oczywiście dobra ...)

Link, który pierwotnie umieściłem, jest martwy i nie jestem pewien, co dokładnie zawierał, ale myślę, że te linki powinny być dobre: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols i https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Biorąc pod uwagę problem z martwym linkiem, tym razem wstawiam kod:

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

Powiedziałem, że pod pewnymi względami jest to lepsze niż normalne ligatury. To dlatego, że jest to „a la carte”. Możesz mieszać i łączyć ze sobą, brać tylko te symbole, które lubisz. Możesz powiedzieć: chcę „;;” ligatura, Z WYJĄTKIEM, jeśli kolejnym znakiem jest ponownie „;” w takim razie nie chcę tego ... A jeśli chodzi o mieszanie i dopasowywanie ... Używam czcionki „Fira Mono” wraz z ligaturami „Fira Code”. Nie musisz kupować całą czcionką.

Jest gorszy niż czyste ligatury, ponieważ nie działa po wyjęciu z pudełka i wymaga dostrojenia czcionki w określony sposób, aby było to możliwe.

Emmanuel Touzery
źródło
Cześć! Czy możesz udostępnić ten fragment kodu, aby ligatury kodu Fira działały? Gist wydaje się być usunięty.
xamenrax
huh przepraszam ... zaktualizowałem odpowiedź, mam nadzieję, że to pomoże
Emmanuel Touzery
1
Dziękuję Ci! Minęły prawie 3 lata, ale coś się nigdy nie zmienia - ludzie desperacko
chcą,
0

Jeśli korzystasz z systemu OS XI, port Carbon Mac Emacs obsługuje ligatury.

tgerdin
źródło