Поддержка лигатур 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 поддерживает лигатуры.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.