Поддержка лигатур OTF в Emacs

46

PragmataPro - это гарнитура, которая поставляется с рядом программных лигатур . Насколько я понимаю, это лигатуры OpenType face (OTF).

Я знаю , что Emacs поддерживает программную замену комбинации символов (например , ->для или lambdaв λ). Тем не менее, это ложные лигатуры Юникода, так как они имеют свои собственные кодовые точки, чего нет у реальных лигатур.

Верно ли, что Emacs (по состоянию на 25) не поддерживает OTF-лигатуры автоматически? На более низком уровне доступны ли варианты для ручного указания сопоставлений глифов?

Если лигатуры не поддерживаются, то что нужно сделать, чтобы Emacs поддерживал лигатуры?

Мэтью Пизиак
источник
3
Похоже, что это еще не поддерживается: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Modi
Из любопытства, что вы думаете о «количестве полезных улучшений»?
Дан
3
Улучшенный рендеринг с переменной шириной в текстовом режиме, программирование лигатур, делающих исходный код более привлекательным без влияния на форму кода, и схематические лигатуры для прямоугольников и стрелок. Оглядываясь назад, «привлекательный», вероятно, лучший дескриптор, чем «полезный».
Мэттью Пизиак
github.com/i-tu/Hasklig/issues/10 отслеживает поддержку Emacs для Hasklig. Частичное решение, которое работает специально для Hasklig и haskell-modeподробно описано в этой сущности .
Мэтью Пизиак
3
В недавнем сообщении о r / emacs был опубликован обходной путь prettify-symbols-mode, и он довольно хорошо работает с PragmataPro 0.822.
Каушал Моди

Ответы:

9

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

Этот режим позволяет заменить любое регулярное выражение на любой глиф. Я лично использую этот фрагмент, чтобы заставить лигатуры Fira Code работать в emacs на linux. (РЕДАКТИРОВАТЬ: к сожалению, ссылка сейчас мертва, политика stackoverflow всегда копировать inline, очевидно, хорошая ...)

Ссылка, которую я первоначально поместил, мертва, и я не уверен, что именно она содержала, но я думаю, что эти ссылки должны быть хорошими: 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". Вам не нужно покупать весь шрифт.

Это хуже, чем чистые лигатуры, потому что это не работает из коробки и требует, чтобы шрифт был настроен определенным образом, чтобы сделать это возможным.

Эммануэль Тузери
источник
Здравствуй! Не могли бы вы поделиться этим фрагментом, чтобы заставить работать лигатуры Fira Code? Гист, кажется, удален.
xamenrax
да извините ... обновил ответ, надеюсь, это поможет
Эммануэль Тузери
1
Спасибо! Прошло почти 3 года, но что-то никогда не меняется - люди отчаянно
пытаются
0

Если вы работаете в OS XI, вы уверены, что порт Carbon Mac Emacs поддерживает лигатуры.

tgerdin
источник