การสนับสนุนมัด OTF ใน Emacs


46

PragmataProเป็นแบบอักษรที่มาพร้อมกับจำนวนของการเขียนโปรแกรมภาษา ความเข้าใจของฉันคือว่าสิ่งเหล่านี้เป็นหนังสติ๊ก OpenType (OTF)

ผมทราบว่า Emacs สนับสนุนการเปลี่ยนการเขียนโปรแกรมของชุดตัวอักษร (ตัวอย่างเช่น->ไปหรือlambdaไปλ) อย่างไรก็ตามสิ่งเหล่านี้เป็น Unicode faux ligatures เนื่องจากมีจุดรหัสของตัวเอง

ฉันถูกต้องหรือไม่ว่า Emacs (ณ วันที่ 25) ไม่สนับสนุนการผูก OTF โดยอัตโนมัติ? ในระดับที่ต่ำกว่ามีตัวเลือกให้ระบุการแม็พสัญลักษณ์ด้วยตนเองหรือไม่

หากไม่รองรับเส้นเอ็นแล้วจำเป็นต้องทำอะไรเพื่อให้ Emacs รองรับเส้นเอ็น?


3
ดูเหมือนว่ายังไม่ได้รับการสนับสนุน: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi

จากความอยากรู้คุณมี "จำนวนของการปรับปรุงที่มีประโยชน์" อะไรบ้างในใจ?
แดน

3
ปรับปรุงการเรนเดอร์แบบความกว้างของตัวแปรในโหมดข้อความ, การเขียนโปรแกรมภาษาอังกฤษที่ทำให้ซอร์สโค้ดน่าสนใจยิ่งขึ้นโดยไม่ส่งผลกระทบต่อรูปร่างของรหัส ในการเข้าใจย้อนหลัง "น่าสนใจ" น่าจะเป็นตัวบ่งชี้ที่ดีกว่า "มีประโยชน์"
Matthew Piziak

github.com/i-tu/Hasklig/issues/10กำลังติดตาม Emacs ที่รองรับ Hasklig การแก้ปัญหาบางส่วนซึ่งทำงานเฉพาะสำหรับ Hasklig และhaskell-modeมีรายละเอียดในส่วนสำคัญนี้
Matthew Piziak

3
โพสต์ล่าสุดบนR / emacsโพสต์วิธีแก้ปัญหาการใช้prettify-symbols-modeและการทำงานที่ดีงามกับ PragmataPro 0.822
Kaushal Modi

คำตอบ:


9

emacs ในตอนนี้ไม่สนับสนุนการเชื่อมโยง (บน OSX มีการสนับสนุนบางอย่าง แต่ไม่รองรับแพลตฟอร์มอื่น) อย่างไรก็ตาม emacs 24.4+ รองรับprettify-symbols-modeซึ่งในบางวิธีจะดีกว่าการสนับสนุนเอ็นปกติ

โหมดนั้นอนุญาตให้ subsitute สำหรับแสดง regex ด้วย glyph ใด ๆ ฉันใช้ตัวอย่างนี้เป็นการส่วนตัวเพื่อให้ได้รหัส Fira Code เพื่อทำงานกับ emacs บน linux (แก้ไข: น่าเสียดายที่ตอนนี้ลิงค์นั้นตายไปแล้วนโยบายของ stackoverflow ที่จะคัดลอกแบบอินไลน์มักจะเป็นสิ่งที่ดี ... )

ลิงค์ที่ฉันใส่ไว้ตอนแรกตายไปแล้วและฉันก็ไม่แน่ใจว่ามีอยู่จริง แต่ฉันคิดว่าลิงก์เหล่านี้น่าจะดี: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbolsและhttps://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

เมื่อได้รับปัญหาเกี่ยวกับลิงก์ตายฉันกำลังวางโค้ดไว้ในบรรทัดในเวลานี้:

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

ฉันบอกว่าในบางวิธีนี้ดีกว่าหนังสติ๊กปกติ .. นั่นเป็นเพราะมันเป็น "อาหารตามสั่ง" คุณสามารถมิกซ์แอนด์แมทช์รับเฉพาะสัญลักษณ์ที่คุณชอบ คุณสามารถพูดได้ว่าฉันต้องการ ";;" มัดยกเว้นถ้าตัวละครต่อไปเป็นอีกครั้ง ";" ในกรณีที่ฉันไม่ต้องการ ... และเกี่ยวกับการมิกซ์แอนด์แมชชิ่ง ... ฉันใช้ฟอนต์ 'Fira Mono' ร่วมกับการใช้รหัส 'Fira Code' คุณไม่จำเป็นต้องซื้อแบบอักษรทั้งหมด

มันเลวร้ายยิ่งกว่าหนังสติ๊กบริสุทธิ์เพราะมันไม่ได้ผลนอกกรอบและมันต้องมีการปรับแบบอักษรเพื่อให้มันเป็นไปได้


Hi! คุณสามารถแบ่งปันข้อมูลนี้เพื่อให้รหัส Fira Code ทำงานได้หรือไม่ ดูเหมือนว่าส่วนสำคัญจะถูกลบ
xamenrax

ขออภัย ... อัปเดตคำตอบฉันหวังว่ามันจะช่วยได้
Emmanuel Touzery

1
ขอขอบคุณ! เกือบ 3 ปีผ่านไปแล้ว แต่มีบางอย่างไม่เคยเปลี่ยนแปลง - ผู้คนหมดหวังในการสร้างหนังสติ๊กใน Emacs ...
xamenrax

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.