Підтримка лігатур OTF в Emacs


46

PragmataPro - це шрифт, який постачається з низкою лігатур програмування . Я розумію, що це обличчя OpenType (OTF).

Мені відомо, що Emacs підтримує програмну заміну символьних комбінацій (наприклад, ->до або lambdaна λ). Однак це штучні лігатури unicode, оскільки вони мають власні кодові точки, а справжні лігатури - ні.

Чи правильно я вважаю, що Emacs (станом на 25 років) не підтримує лігатури OTF автоматично? На нижчому рівні чи доступні варіанти ручного визначення відображення гліфів?

Якщо лігатури не підтримуються, то що потрібно зробити, щоб Emacs підтримував лігатури?


3
Схоже, це ще не підтримується: list.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi

З цікавості, які ви маєте на увазі деякі "корисні вдосконалення"?
Дан

3
Покращене візуалізація змінної ширини в текстовому режимі, програмування лігатур, які роблять вихідний код більш привабливим, не впливаючи на форму коду, та діаграматичні лігатури для полів та стрілок. Заздалегідь "привабливий", мабуть, кращий дескриптор, ніж "корисний".
Матвій Пізіак

github.com/i-tu/Hasklig/isissue/10 відстежує підтримку Emacs для Hasklig. Часткове рішення, яке працює спеціально для Hasklig і haskell-modeдетально описане в цій суті .
Матвій Пізяк

3
Останній пост на р / Emacs відправив обхідний шлях , використовуючи prettify-symbols-mode, і він працює досить добре з PragmataPro 0,822.
Каушал Моді

Відповіді:


9

emacs поки не підтримує лігатури (на OSX є деяка підтримка, але не на інших платформах). Однак, підтримує emacs 24.4+, prettify-symbols-modeщо в чомусь краще, ніж звичайна підтримка лігатур.

Цей режим дозволяє підставити для відображення будь-якого регулярного вираження з будь-яким гліфом. Я особисто використовую цей фрагмент, щоб отримати лігатури Fira Code для роботи в emacs на Linux. (EDIT: на жаль, посилання тепер мертве; політика stackoverflow завжди копіювати inline очевидно є хорошою).

Посилання, яке я поклав спочатку, є мертвим, і я не впевнений, що саме він містив, але я думаю, що ці посилання повинні бути хорошими: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols та https://github.com/tonsky/FiraCode/isissue/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" разом із лігатурами "Code Fira". Не потрібно купувати цілим шрифтом.

Це гірше, ніж чисті лігатури, тому що він не виходить з коробки, і він вимагає налаштування шрифту певним чином, щоб зробити це можливим.


Привіт! Не могли б ви поділитися цим фрагментом для роботи лігатур Fira Code? Здається, Gist видалено.
xamenrax

так вибачте ... оновив відповідь, сподіваюся, що це допоможе
Еммануель Тузері

1
Дякую! Майже 3 роки минуло, але щось ніколи не змінюється - люди відчайдушно змушують лігатури працювати в Emacs ...
xamenrax

0

Якщо ви перебуваєте на OS XI, вважайте, що порт Carbon Mac Emacs підтримує лігатури.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.