Suporte de ligadura OTF no Emacs

46

O PragmataPro é um tipo de letra que vem com várias ligaduras de programação . Meu entendimento é que essas são ligaduras de rosto OpenType (OTF).

Estou ciente de que o Emacs suporta a substituição programática de combinações de caracteres (por exemplo, ->para ou lambdapara λ). No entanto, essas são ligaduras falsas unicode, pois possuem seus próprios pontos de código, as quais não são verdadeiras ligaduras.

Estou correto que o Emacs (a partir de 25) não suporta ligaduras OTF automaticamente? Em um nível inferior, existem opções disponíveis para especificar manualmente os mapeamentos de glifos?

Se as ligaduras não são suportadas, o que precisa ser feito para o Emacs suportar as ligaduras?

Matthew Piziak
fonte
3
Parece que ainda não é suportado: lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi
Por curiosidade, quais são algumas das "melhorias úteis" que você tem em mente?
Dan
3
Renderização de largura variável aprimorada no modo de texto, ligaduras de programação que tornam o código-fonte mais atraente sem afetar a forma do código e ligaduras diagramáticas para caixas e setas. Em retrospectiva, "atraente" é provavelmente um descritor melhor do que "útil".
Matthew Piziak
O github.com/i-tu/Hasklig/issues/10 está rastreando o suporte do Emacs ao Hasklig. Uma solução parcial, que funciona especificamente para Hasklig e haskell-modeé detalhada nesta essência .
Matthew Piziak
3
Uma publicação recente no r / emacs publicou uma solução alternativa usando prettify-symbols-mode, e funciona muito bem com o PragmataPro 0.822.
Kaushal Modi

Respostas:

9

O emacs, por enquanto, não suporta ligaduras (no OSX há suporte, mas não em outras plataformas). No entanto, o emacs 24.4+ suporta, prettify-symbols-modeque de certa forma é melhor do que o suporte normal de ligaduras.

Esse modo permite substituir para exibir qualquer regex com qualquer glifo. Pessoalmente, estou usando esse trecho para obter as ligaduras do código Fira para trabalhar no emacs no linux. (EDIT: infelizmente o link agora está inoperante, a política do stackoverflow para sempre copiar inline é obviamente a boa ...)

O link que eu coloquei originalmente está morto e não tenho certeza exatamente o que ele continha, mas acho que esses links devem ser bons: https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols e https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Dado o problema do link morto, estou colocando o código em linha desta vez:

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

Eu disse que, de certa forma, isso é melhor do que as ligaduras normais. Isso é porque é "a la carte". Você pode misturar e combinar, pegue apenas os símbolos que desejar. Você pode dizer, eu quero o ";;" ligadura, EXCETO se o próximo caractere for novamente ";" nesse caso, eu não quero ... E sobre misturar e combinar ... Estou usando a fonte 'Fira Mono', junto com as ligaduras 'Fira Code'. Você não precisa comprar a fonte inteira.

É pior do que as ligaduras puras, porque não funciona imediatamente e exige que a fonte seja ajustada de uma certa maneira para torná-la possível.

Emmanuel Touzery
fonte
Oi! Você poderia compartilhar esse trecho para que as ligaduras do Código Fira funcionassem? A essência parece ter sido excluída.
xamenrax 25/03
huh desculpe ... atualizou a resposta, espero que ajude
Emmanuel Touzery 25/03
1
Obrigado! Quase 3 anos se passaram, mas algo nunca muda - pessoas desesperadas por fazer as ligaduras funcionarem no Emacs ...
xamenrax
0

Se você estiver no OS XI, acredite que a porta do Carbon Mac Emacs suporta ligaduras.

tgerdin
fonte