Dukungan ligatur OTF di Emacs

46

PragmataPro adalah jenis huruf yang dilengkapi dengan sejumlah ikatan pemrograman . Pemahaman saya adalah ini adalah pengikat OpenType face (OTF).

Saya menyadari bahwa Emacs mendukung penggantian kombinasi karakter terprogram (misalnya ->ke atau lambdake λ). Namun, ini adalah ligatur unik unicode, karena mereka memiliki poin kode mereka sendiri, yang ligatur nyata tidak.

Apakah saya benar bahwa Emacs (per 25) tidak mendukung ligatur OTF secara otomatis? Pada level yang lebih rendah, apakah ada opsi yang tersedia untuk menentukan pemetaan mesin terbang secara manual?

Jika ligatur tidak didukung, lalu apa yang perlu dilakukan agar Emacs mendukung ligatur?

Matthew Piziak
sumber
3
Sepertinya belum didukung: lists.gnu.org/archive/html/emacs-devel/2015-01-01/msg00024.html
Kaushal Modi
Karena penasaran, apa sajakah dari "jumlah perangkat tambahan bermanfaat" yang ada dalam pikiran Anda?
Dan
3
Peningkatan rendering lebar variabel dalam mode teks, ligatur pemrograman yang membuat kode sumber lebih menarik tanpa mempengaruhi bentuk kode, dan ligatur diagram untuk kotak dan panah. Kalau dipikir-pikir, "atraktif" mungkin merupakan deskripsi yang lebih baik daripada "berguna".
Matthew Piziak
github.com/i-tu/Hasklig/issues/10 sedang melacak dukungan Emacs untuk Hasklig. Solusi parsial, yang bekerja secara khusus untuk Hasklig dan haskell-modedirinci dalam inti ini .
Matius Piziak
3
Sebuah posting baru - baru ini di r / emacs memposting pemecahan masalah menggunakan prettify-symbols-mode, dan itu bekerja cukup baik dengan PragmataPro 0.822.
Kaushal Modi

Jawaban:

9

emacs untuk saat ini tidak mendukung ligatur (pada OSX ada beberapa dukungan, tetapi tidak pada platform lain). Namun, dukungan emacs 24.4+ prettify-symbols-modeyang dalam beberapa hal lebih baik daripada dukungan ligatures normal.

Mode itu memungkinkan untuk menggantikan tampilan regex apa pun dengan mesin terbang apa pun. Saya secara pribadi menggunakan cuplikan ini untuk mendapatkan ligatur Kode Fira untuk bekerja di emacs di linux. (EDIT: sayangnya tautannya sudah mati, kebijakan stackoverflow untuk selalu menyalin inline jelas yang bagus ...)

Tautan yang semula saya masukkan sudah mati dan saya tidak yakin persis apa yang terkandung di dalamnya, tetapi saya pikir tautan ini harus baik: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols dan https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Mengingat masalah tautan mati, saya menempatkan kode sebaris saat ini:

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

Saya mengatakan bahwa dalam beberapa hal ini lebih baik daripada ligatur normal .. Itu karena itu "a la carte". Anda dapat mencampur dan mencocokkan, hanya mengambil simbol yang Anda suka. Anda dapat mengatakan, saya ingin ";" ligatur, KECUALI jika karakter berikutnya lagi ";" dalam hal ini saya tidak menginginkannya ... Dan tentang pencocokan-dan-pencocokan ... Saya menggunakan font 'Fira Mono', bersama dengan ligatur 'Kode Fira'. Anda tidak perlu membeli di seluruh font.

Ini lebih buruk daripada ligatur murni karena tidak bekerja di luar kotak dan memerlukan font yang akan disetel dengan cara tertentu untuk memungkinkannya.

Emmanuel Touzery
sumber
Hai! Bisakah Anda membagikan cuplikan ini untuk membuat ligatur Kode Fira berfungsi? Intisari sepertinya dihapus.
xamenrax
ya maaf ... memperbarui jawabannya, saya harap ini membantu
Emmanuel Touzery
1
Terima kasih! Hampir 3 tahun telah berlalu tetapi sesuatu tidak pernah berubah - orang-orang putus asa membuat pengikat bekerja di Emacs ...
xamenrax
0

Jika Anda menggunakan OS XI yakin port Carbon Mac Emacs mendukung ligatur.

tgerdin
sumber