Hỗ trợ dây chằng OTF trong Emacs


46

PragmataPro là một kiểu chữ đi kèm với một số chữ ghép lập trình . Hiểu biết của tôi là đây là các chữ ghép mặt OpenType (OTF).

Tôi biết rằng Emacs hỗ trợ thay thế chương trình kết hợp ký tự (ví dụ ->để hoặc lambdađể λ). Tuy nhiên, đây là các chữ ghép giả unicode, vì chúng có các điểm mã riêng, điều mà các chữ số thật không có.

Tôi có đúng không khi Emacs (tính đến 25) không tự động hỗ trợ chữ ghép OTF? Ở cấp độ thấp hơn, có các tùy chọn có sẵn để chỉ định thủ công ánh xạ glyph không?

Nếu dây chằng không được hỗ trợ, vậy thì cần phải làm gì để Emacs hỗ trợ dây chằng?


3
Có vẻ như nó chưa được hỗ trợ : lists.gnu.org/archive/html/emacs-devel/2015-01/msg00024.html
Kaushal Modi

Vì tò mò, một số "số cải tiến hữu ích" bạn có trong đầu là gì?
Dân

3
Cải thiện kết xuất độ rộng biến trong chế độ văn bản, lập trình các chữ số làm cho mã nguồn hấp dẫn hơn mà không ảnh hưởng đến hình dạng của mã và các chữ viết sơ đồ cho các hộp và mũi tên. Nhìn chung, "hấp dẫn" có lẽ là một mô tả tốt hơn "hữu ích".
Matthew Piziak

github.com/i-tu/Hasklig/issues/10 đang theo dõi hỗ trợ Emacs cho Hasklig. Một giải pháp một phần, hoạt động đặc biệt cho Hasklig và haskell-modeđược trình bày chi tiết trong ý chính này .
Matthew Piziak

3
Một bài đăng gần đây trên r / emacs đã đăng một cách giải quyết bằng cách sử dụng prettify-symbols-modevà nó hoạt động khá tốt với PragmataPro 0.822.
Kaushal Modi

Câu trả lời:


9

emacs bây giờ không hỗ trợ chữ ghép (trên OSX có một số hỗ trợ, nhưng không phải trên các nền tảng khác). Tuy nhiên, emacs 24.4+ hỗ trợ prettify-symbols-modemà theo một số cách là tốt hơn so với hỗ trợ dây chằng bình thường.

Chế độ đó cho phép đăng ký để hiển thị bất kỳ biểu thức chính quy nào với bất kỳ glyph nào. Tôi đang sử dụng đoạn mã này một cách cá nhân để có được các chữ số Fira Code để hoạt động trong các emacs trên linux. (EDIT: không may là liên kết hiện đã chết, chính sách stackoverflow để luôn sao chép nội tuyến rõ ràng là một điều tốt ...)

Liên kết tôi đặt ban đầu đã chết và tôi không chắc chắn chính xác những gì nó chứa nhưng tôi nghĩ các liên kết này sẽ tốt: https://github.com/tonsky/FiraCode/wiki/Emacs-inemony#USE-prettify-symbolshttps://github.com/tonsky/FiraCode/issues/312#issuecomment-262878734

Do vấn đề liên kết chết, lần này tôi sẽ đặt mã nội tuyến:

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

Tôi đã nói rằng trong một số cách, điều này tốt hơn so với chữ ghép bình thường .. Đó là vì đó là "a la carte". Bạn có thể trộn và kết hợp, chỉ lấy các biểu tượng bạn thích. Bạn có thể nói, tôi muốn ";;" chữ ghép, NGOẠI TRỪ nếu ký tự tiếp theo lại ";" trong trường hợp đó tôi không muốn điều đó ... Và về kết hợp và kết hợp ... Tôi đang sử dụng phông chữ 'Fira Mono', cùng với chữ ghép 'Mã Fira'. Bạn không phải mua trong toàn bộ phông chữ.

Nó tệ hơn chữ ghép thuần túy vì nó không hoạt động được và nó yêu cầu phông chữ phải được điều chỉnh theo một cách nhất định để làm cho nó có thể.


Chào! Bạn có thể chia sẻ đoạn trích này để làm cho dây chằng Fira Code hoạt động không? Gist dường như bị xóa.
xamenrax

huh xin lỗi ... đã cập nhật câu trả lời, tôi hy vọng nó có ích
Emmanuel Touzery

1
Cảm ơn bạn! Đã gần 3 năm trôi qua nhưng điều gì đó không bao giờ thay đổi - mọi người tuyệt vọng về việc làm cho dây chằng hoạt động trong Emacs ...
xamenrax

0

Nếu bạn đang dùng OS XI, hãy tin rằng cổng Carbon Mac Emacs hỗ trợ chữ ghép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.