Emacs'ta OTF ligature desteği


46

PragmataPro , birkaç programlama bitişiğiyle birlikte gelen bir yazı tipidir . Anladığım kadarıyla bunlar OpenType yüz (OTF) bitişik harfler.

Ben Emacs (örneğin karakter kombinasyonlarının programatik değiştirilmesini desteklediğini farkındayım ->için ya lambdakadar λ). Bununla birlikte, bunlar unicode sahte bitişik harflerdir, çünkü gerçek bitişik harflerin sahip olmadığı kendi kod noktaları vardır.

Emacs'in (25'ten itibaren) OTF bitişik harfleri otomatik olarak desteklememesi doğru muyum? Daha düşük bir seviyede, glif eşlemelerini manuel olarak belirtmek için seçenekler var mı?

Eğer bitişik harfler desteklenmiyorsa, Emacs'ın bitişik harfleri desteklemesi için ne yapılması gerekiyor?



Meraktan, aklınızdaki "faydalı donanımların sayısı" nın bazıları nelerdir?
Dan

3
Metin modunda geliştirilmiş değişken genişlikli oluşturma, kaynak kodunu kodun şeklini etkilemeden daha çekici hale getiren bitişik harfler programlama ve kutular ve oklar için diyagramsal bitişik harfler oluşturma. Gezinti yerinde, "çekici" muhtemelen "faydalı" olmaktan daha iyi bir tanımlayıcıdır.
Matthew Piziak

github.com/i-tu/Hasklig/issues/10 , Hasklig için Emacs desteğini takip ediyor. Özellikle Hasklig için çalışan ve bu özlemde haskell-modedetaylandırılan kısmi bir çözüm .
Matthew Piziak

3
Bir Son gönderileri r / Emacs'ta kullanarak geçici bir çözüm yayınlanmıştır prettify-symbols-modeve PragmataPro 0.822 ile oldukça iyi çalışır.
Kaushal Modi

Yanıtlar:


9

Şimdilik emacs bitişik harfleri desteklemiyor (OSX'te bir miktar destek var, ancak diğer platformlarda değil). Bununla birlikte, emacs 24.4+ destekler prettify-symbols-mode, bazı yönlerden normal bitişiklerden daha iyidir.

Bu mod, herhangi bir regex'in herhangi bir glifle görüntülenmesini sağlar. Kişisel olarak bu snippet'i Fira Code bitişiklerinin linux'taki emacs'larda çalışmasını sağlamak için kullanıyorum . (EDIT: Maalesef bağlantı artık bitti, her zaman satır içi kopyalamak için stackoverflow politikası açıkça iyi ...

Aslen koyduğum bağlantı öldü ve tam olarak ne içerdiğinden emin değilim ama bu bağlantıların iyi olması gerektiğini düşünüyorum: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols ve https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Ölü bağlantı sorunu göz önüne alındığında, bu sefer kodu satır içi ekliyorum:

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

Bazı yönlerden normal bitişiklerden daha iyi olduğunu söyledim .. Bunun nedeni "alakart". Karıştırıp eşleştirebilir, yalnızca istediğiniz sembolleri alabilirsiniz. Söyleyebilirsiniz, ben ";;" bitişik, sonraki karakter tekrar ";" ise, HARİCİ Bu durumda istemiyorum ... Ve eşleştirme ile ilgili ... 'Fira Mono' fontunu, 'Fira Code' bitişik harfleriyle birlikte kullanıyorum. Yazı tipinin tamamını satın almak zorunda değilsiniz.

Saf bitişik harflerden daha kötü çünkü kutudan dışarı çıkmıyor ve fontun bunu mümkün kılacak şekilde ayarlanması gerekiyor.


Selam! Fira Code bitişik harflerin çalışması için bu snippet'i paylaşabilir misiniz? Gist silinmiş görünüyor.
xamenrax

huh üzgünüm ... cevabı güncelledi, yardımcı olur umarım
Emmanuel Touzery

1
Teşekkür ederim! Neredeyse 3 yıl geçti, ancak hiçbir şey değişmedi - insanlar
Emacs'ta

0

OS XI kullanıyorsanız, Carbon Mac Emacs portunun bitişik harfleri desteklediğine inanıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.