EmacsでのOTF合字のサポート


46

PragmataProは、多くのプログラミング合字が付属する書体です。私の理解では、これらはOpenTypeフェイス(OTF)の合字です。

私はEmacsが(例えば文字の組み合わせのプログラム交換をサポートしていることを認識しています->たりlambdaしますλ)。ただし、これらは独自のコードポイントを持っているため、実際の合字にはないユニコードの偽合字です。

Emacs(25現在)がOTFの合字を自動的にサポートしないことを修正できますか?下位レベルでは、グリフマッピングを手動で指定するために使用できるオプションはありますか?

合字がサポートされていない場合、Emacsが合字をサポートするには何をする必要がありますか?


3
まだサポートされていないようです。lists.gnu.org
Kaushal Modi

好奇心から、あなたが念頭に置いている「有用な強化の数」のいくつかは何ですか?
ダン

3
テキストモードでの可変幅レンダリングの改善、コードの形状に影響を与えずにソースコードをより魅力的にするプログラミング合字、およびボックスと矢印の図式合字。後知恵では、「魅力的」はおそらく「有用」よりも優れた記述子です。
マシューピジアック

github.com/i-tu/Hasklig/issues/10は、HaskligのEmacsサポートを追跡しています。Hasklig専用に機能する部分的なソリューションで、この要点でhaskell-mode詳しく説明されています。
マシューピジアック

3
上の最近のポストR / emacsのは、使用して回避策を掲載prettify-symbols-modeし、それがPragmataPro 0.822とかなり良い動作します。
カウシャルモディ

回答:


9

emacsは現在、合字をサポートしていません(OSXではサポートがありますが、他のプラットフォームではサポートされていません)。ただし、emacs 24.4+はprettify-symbols-mode、通常の合字のサポートよりもいくつかの点で優れています。

このモードでは、グリフを含む正規表現を表示するために置き換えることができます。私は個人的にこのスニペットを使用し、LinuxのemacsでFira Codeの合字を機能させています。(編集:残念ながらリンクは現在無効です。常にインラインでコピーするstackoverflowのポリシーは明らかに良いものです...)

私が最初に置いたリンクは死んでいて、何が含まれているのか正確にはわかりませんが、これらのリンクは良いはずだと思います: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年が経過したことで何かが変わることはありません- Emacsで合字の作業を行うことについて絶望的な人々を...
xamenrax

0

OS XIを使用している場合は、Carbon Mac Emacsポートが合字をサポートしていると考えています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.