emacs na razie nie obsługuje ligatur (w OSX jest pewne wsparcie, ale nie na innych platformach). Jednak obsługuje emacs 24.4+, prettify-symbols-mode
co jest pod pewnymi względami lepsze niż normalne wsparcie ligatur.
Ten tryb pozwala zastąpić wyświetlanie dowolnego wyrażenia regularnego dowolnym glifem. Osobiście używam tego fragmentu kodu, aby ligatury kodu Fira działały w emacsie na systemie Linux. (EDYCJA: niestety link jest już martwy, polityka nakładania stosów, aby zawsze kopiować w toku, jest oczywiście dobra ...)
Link, który pierwotnie umieściłem, jest martwy i nie jestem pewien, co dokładnie zawierał, ale myślę, że te linki powinny być dobre:
https://github.com/tonsky/FiraCode/wiki/Emacs-instructions#using-prettify-symbols i https://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734
Biorąc pod uwagę problem z martwym linkiem, tym razem wstawiam kod:
(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)
Powiedziałem, że pod pewnymi względami jest to lepsze niż normalne ligatury. To dlatego, że jest to „a la carte”. Możesz mieszać i łączyć ze sobą, brać tylko te symbole, które lubisz. Możesz powiedzieć: chcę „;;” ligatura, Z WYJĄTKIEM, jeśli kolejnym znakiem jest ponownie „;” w takim razie nie chcę tego ... A jeśli chodzi o mieszanie i dopasowywanie ... Używam czcionki „Fira Mono” wraz z ligaturami „Fira Code”. Nie musisz kupować całą czcionką.
Jest gorszy niż czyste ligatury, ponieważ nie działa po wyjęciu z pudełka i wymaga dostrojenia czcionki w określony sposób, aby było to możliwe.