Emacs में OTF लिगचर सपोर्ट


46

PragmataPro एक टाइपफेस है जो कई प्रोग्रामिंग लैगिंग्स के साथ आता है । मेरी समझ यह है कि ये ओपन टाइप चेहरा (ओटीएफ) लिगचर हैं।

मुझे पता है कि Emacs (उदाहरण के लिए चरित्र संयोजनों की कार्यक्रम संबंधी प्रतिस्थापन का समर्थन करता है हूँ ->करने के लिए या lambdaकरने के लिए λ)। हालांकि, ये यूनिकोड फॉक्‍स लिग्रेन्‍स हैं, क्‍योंकि इनके अपने कोड प्‍वाइंट्स होते हैं, जो असली लिगोज नहीं करते हैं।

क्या मैं सही हूं कि Emacs (25 के रूप में) स्वचालित रूप से OTF लिगमेंट्स का समर्थन नहीं करता है? निचले स्तर पर, क्या ग्लिफ़ मैपिंग को मैन्युअल रूप से निर्दिष्ट करने के लिए विकल्प उपलब्ध हैं?

यदि लिगुरेट्स असमर्थित हैं, तो लिगर्स का समर्थन करने के लिए Emacs के लिए क्या करने की आवश्यकता है?


3
ऐसा लगता है कि यह अभी तक समर्थित नहीं है: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
कौशल मोदी

जिज्ञासा से बाहर, आपके पास कुछ "उपयोगी एन्हांसमेंट की संख्या" क्या है?
दान

3
टेक्स्ट मोड में बेहतर वैरिएबल-चौड़ाई रेंडरिंग, प्रोग्रामिंग लिगॉरेट्स जो सोर्स कोड को कोड के आकार को प्रभावित किए बिना अधिक आकर्षक बनाते हैं, और बक्से और तीर के लिए आरेखीय लिगचर। दृष्टिहीनता में, "आकर्षक" संभवतः "उपयोगी" की तुलना में बेहतर विवरणक है।
मैथ्यू पिज़ियाक

github.com/i-tu/Hasklig/issues/10 हास्कलिग के लिए Emacs समर्थन पर नज़र रख रहा है। एक आंशिक समाधान, जो विशेष रूप से हास्क्लिग के लिए काम करता है और इस जिस्ट haskell-modeमें विस्तृत है ।
मैथ्यू पिज़िक

3
R / emacs पर एक हालिया पोस्ट ने वर्कअराउंड का उपयोग करके पोस्ट किया prettify-symbols-mode, और यह PragmataPro 0.822 के साथ बहुत अच्छा काम करता है।
कौशल मोदी

जवाबों:


9

अब के लिए emacs ligatures का समर्थन नहीं करता है (OSX पर कुछ समर्थन है, लेकिन अन्य प्लेटफार्मों पर नहीं)। हालांकि, एमएसीएस 24.4+ का समर्थन करता है prettify-symbols-modeजो कि कुछ तरीकों से सामान्य लिगर्स के समर्थन से बेहतर है।

यह मोड किसी भी ग्लिफ़ के साथ किसी भी रेगेक्स को प्रदर्शित करने की अनुमति देता है। मैं व्यक्तिगत रूप से इस स्निपेट का उपयोग कर रहा हूं ताकि लिनक्स पर ईमेक में काम करने के लिए Fira Code ligatures मिल सके। (संपादित करें: दुर्भाग्य से यह लिंक अब मृत हो गया है, इनलाइन को हमेशा कॉपी इनलाइन करने की नीति स्पष्ट रूप से अच्छी है ...)

जो लिंक मैंने मूल रूप से डाला है वह मर चुका है और मैं निश्चित नहीं हूँ कि इसमें क्या निहित है लेकिन मुझे लगता है कि ये लिंक अच्छे होने चाहिए: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-nymbols और 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)

मैंने कहा कि कुछ मायनों में यह सामान्य लिगुरिंग से बेहतर है .. ऐसा इसलिए है क्योंकि यह "ला कार्टे" है। आप मिक्स-एंड-मैच कर सकते हैं, केवल उन प्रतीकों को ले सकते हैं जिन्हें आप पसंद करते हैं। आप कह सकते हैं, मैं चाहता हूं ";;; संयुक्ताक्षर, अगर अगला चरित्र फिर से है, तो ""; उस स्थिति में मैं यह नहीं चाहता ... और मिक्स-एंड-मैचिंग के बारे में ... मैं 'फिरा मोनो' फॉन्ट का उपयोग कर रहा हूं, साथ में 'फिरा कोड' लिगचर भी। आपको पूरे फ़ॉन्ट में खरीदारी करने की आवश्यकता नहीं है।

यह शुद्ध लिगमेंट्स से भी बदतर है क्योंकि यह बॉक्स से बाहर काम नहीं करता है और इसे संभव बनाने के लिए फ़ॉन्ट को एक निश्चित तरीके से ट्यून करने की आवश्यकता होती है।


नमस्ते! क्या आप इस स्निपेट को फिरा कोड लिगमेंट्स काम करने के लिए साझा कर सकते हैं? Gist डिलीट होती दिख रही है।
xamenrax

हुह सॉरी ... जवाब अपडेट किया, मुझे आशा है कि यह मदद करता है
इमैनुएल टाउज़री

1
धन्यवाद! लगभग 3 साल बीत चुके हैं, लेकिन कुछ कभी नहीं बदलता है - लोग Emacs में काम करने के बारे में बेताब हैं ...
xamenrax

0

यदि आप OS XI पर विश्वास करते हैं तो कार्बन मैक Emacs पोर्ट लिगमेंट्स का समर्थन करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.