Emacs의 OTF 합자 지원


46

PragmataPro 는 많은 프로그래밍 합자 가 제공되는 서체입니다 . 나는 이것이 OpenType face (OTF) 합자라는 것을 이해합니다.

Emacs가 문자 조합의 프로그래밍 방식 대체 (예 ->: 또는 lambdato λ) 를 지원한다는 것을 알고 있습니다. 그러나 이들은 고유 코드 포인트가 있기 때문에 유니 코드 가짜 합자입니다. 실제 합자는 그렇지 않습니다.

Emacs (25 기준)가 OTF 합자를 자동으로 지원하지 않는 것이 맞습니까? 낮은 수준에서 글리프 매핑을 수동으로 지정할 수있는 옵션이 있습니까?

합자가 지원되지 않는 경우 이맥스가 합자를 지원하려면 어떻게해야합니까?


3
아직 지원되지 않는 것 같습니다 : lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi

호기심으로, 당신이 염두에두고있는 "유용한 개선의 수"는 무엇입니까?
Dan

3
텍스트 모드에서 가변 폭 렌더링, 코드 모양에 영향을주지 않고 소스 코드를보다 매력적으로 만드는 프로그래밍 합자 및 상자와 화살표의 다이어그램 합자 개선. 뒤늦은 관점에서 "매력적인"은 아마도 "유용한"보다 더 나은 설명 자일 것입니다.
Matthew Piziak 2016 년

github.com/i-tu/Hasklig/issues/10Hasklig 에 대한 Emacs 지원을 추적하고 있습니다. Hasklig를 위해 특별히 작동 하고이 요지haskell-mode 에서 자세히 설명 하는 부분 솔루션 입니다.
Matthew Piziak

3
r / emacs 대한 최근 게시물은을 사용하여 해결 방법을 게시 prettify-symbols-mode했으며 PragmataPro 0.822와 매우 잘 작동합니다.
Kaushal Modi

답변:


9

현재 emacs는 합자를 지원하지 않습니다 (OSX에서는 지원이 있지만 다른 플랫폼에서는 지원되지 않습니다). 그러나 emacs 24.4+는 prettify-symbols-mode어떤 방식으로 일반 합자 지원보다 낫습니다.

이 모드에서는 글리프가있는 정규식을 표시하기 위해 대체 할 수 있습니다. 나는 개인적 으로이 스 니펫 을 사용하여 Fira Code 합자가 Linux의 emacs에서 작동하도록합니다. (편집 : 불행히도 링크가 이제 죽었습니다. 항상 인라인을 복사하는 stackoverflow 정책은 분명히 좋은 것입니다 ...)

처음에 넣은 링크는 죽었고 포함 된 내용이 확실하지 않지만 다음 링크가 좋을 것이라고 생각합니다. https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols and 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 Code'합자와 함께 'Fira Mono'글꼴을 사용하고 있습니다. 전체 글꼴로 구매할 필요는 없습니다.

기본적으로 작동하지 않기 때문에 글꼴을 특정 방식으로 조정해야하기 때문에 순수한 합자보다 더 나쁩니다.


안녕하세요! 이 스 니펫을 공유하여 Fira Code 합자가 작동하도록 할 수 있습니까? 요지가 삭제 된 것 같습니다.
xamenrax

허 죄송합니다 ... 답변을 업데이트, 그것이 도움이되기를 바랍니다
Emmanuel Touzery

1
감사합니다! 거의 3 년이 지났지 만 어떤 변화도 없었습니다. 사람들은 Emacs에서 합자가 작동하는 것에 대해 절망적입니다 ...
xamenrax

0

OS XI에있는 경우 Carbon Mac Emacs 포트가 합자를 지원한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.