Last active
August 1, 2019 10:30
-
-
Save coproduto/2d9b28a74d6f9254586c2d58d54590f8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Fira code | |
(set-default-font "Fira Code") | |
(let ((alist '((33 . ".\\(?:\\(?:==\\|!!\\)\\|[!=]\\)") | |
(35 . ".\\(?:###\\|##\\|_(\\|[#(?[_{]\\)") | |
(36 . ".\\(?:>\\)") | |
(37 . ".\\(?:\\(?:%%\\)\\|%\\)") | |
(38 . ".\\(?:\\(?:&&\\)\\|&\\)") | |
(42 . ".\\(?:\\(?:\\*\\*/\\)\\|\\(?:\\*[*/]\\)\\|[*/>]\\)") | |
(43 . ".\\(?:\\(?:\\+\\+\\)\\|[+>]\\)") | |
(45 . ".\\(?:\\(?:-[>-]\\|<<\\|>>\\)\\|[<>}~-]\\)") | |
(46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)") | |
(47 . ".\\(?:\\(?:\\*\\*\\|//\\|==\\)\\|[*/=>]\\)") | |
(48 . ".\\(?:x[a-zA-Z]\\)") | |
(58 . ".\\(?:::\\|[:=]\\)") | |
(59 . ".\\(?:;;\\|;\\)") | |
(60 . ".\\(?:\\(?:!--\\)\\|\\(?:~~\\|->\\|\\$>\\|\\*>\\|\\+>\\|--\\|<[<=-]\\|=[<=>]\\||>\\)\\|[*$+~/<=>|-]\\)") | |
(61 . ".\\(?:\\(?:/=\\|:=\\|<<\\|=[=>]\\|>>\\)\\|[<=>~]\\)") | |
(62 . ".\\(?:\\(?:=>\\|>[=>-]\\)\\|[=>-]\\)") | |
(63 . ".\\(?:\\(\\?\\?\\)\\|[:=?]\\)") | |
(91 . ".\\(?:]\\)") | |
(92 . ".\\(?:\\(?:\\\\\\\\\\)\\|\\\\\\)") | |
(94 . ".\\(?:=\\)") | |
(119 . ".\\(?:ww\\)") | |
(123 . ".\\(?:-\\)") | |
(124 . ".\\(?:\\(?:|[=|]\\)\\|[=>|]\\)") | |
(126 . ".\\(?:~>\\|~~\\|[>=@~-]\\)") | |
) | |
)) | |
(dolist (char-regexp alist) | |
(set-char-table-range composition-function-table (car char-regexp) | |
`([,(cdr char-regexp) 0 font-shape-gstring])))) | |
;; This works when using emacs --daemon + emacsclient | |
(add-hook 'after-make-frame-functions (lambda (frame) (set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol"))) | |
;; This works when using emacs without server/client | |
(set-fontset-font t '(#Xe100 . #Xe16f) "Fira Code Symbol") | |
;; I haven't found one statement that makes both of the above situations work, so I use both for now | |
(defconst fira-code-font-lock-keywords-alist | |
(mapcar (lambda (regex-char-pair) | |
`(,(car regex-char-pair) | |
(0 (prog1 () | |
(compose-region (match-beginning 1) | |
(match-end 1) | |
;; The first argument to concat is a string containing a literal tab | |
,(concat " " (list (decode-char 'ucs (cadr regex-char-pair))))))))) | |
'(("\\(www\\)" #Xe100) | |
("[^/]\\(\\*\\*\\)[^/]" #Xe101) | |
("\\(\\*\\*\\*\\)" #Xe102) | |
("\\(\\*\\*/\\)" #Xe103) | |
("\\(\\*>\\)" #Xe104) | |
("[^*]\\(\\*/\\)" #Xe105) | |
("\\(\\\\\\\\\\)" #Xe106) | |
("\\(\\\\\\\\\\\\\\)" #Xe107) | |
("\\({-\\)" #Xe108) | |
("\\(\\[\\]\\)" #Xe109) | |
("\\(::\\)" #Xe10a) | |
("\\(:::\\)" #Xe10b) | |
("[^=]\\(:=\\)" #Xe10c) | |
("\\(!!\\)" #Xe10d) | |
("\\(!=\\)" #Xe10e) | |
("\\(!==\\)" #Xe10f) | |
("\\(-}\\)" #Xe110) | |
("\\(--\\)" #Xe111) | |
("\\(---\\)" #Xe112) | |
("\\(-->\\)" #Xe113) | |
("[^-]\\(->\\)" #Xe114) | |
("\\(->>\\)" #Xe115) | |
("\\(-<\\)" #Xe116) | |
("\\(-<<\\)" #Xe117) | |
("\\(-~\\)" #Xe118) | |
("\\(#{\\)" #Xe119) | |
("\\(#\\[\\)" #Xe11a) | |
("\\(##\\)" #Xe11b) | |
("\\(###\\)" #Xe11c) | |
("\\(####\\)" #Xe11d) | |
("\\(#(\\)" #Xe11e) | |
("\\(#\\?\\)" #Xe11f) | |
("\\(#_\\)" #Xe120) | |
("\\(#_(\\)" #Xe121) | |
("\\(\\.-\\)" #Xe122) | |
("\\(\\.=\\)" #Xe123) | |
("\\(\\.\\.\\)" #Xe124) | |
("\\(\\.\\.<\\)" #Xe125) | |
("\\(\\.\\.\\.\\)" #Xe126) | |
("\\(\\?=\\)" #Xe127) | |
("\\(\\?\\?\\)" #Xe128) | |
("\\(;;\\)" #Xe129) | |
("\\(/\\*\\)" #Xe12a) | |
("\\(/\\*\\*\\)" #Xe12b) | |
("\\(/=\\)" #Xe12c) | |
("\\(/==\\)" #Xe12d) | |
("\\(/>\\)" #Xe12e) | |
("\\(//\\)" #Xe12f) | |
("\\(///\\)" #Xe130) | |
("\\(&&\\)" #Xe131) | |
("\\(||\\)" #Xe132) | |
("\\(||=\\)" #Xe133) | |
("[^|]\\(|=\\)" #Xe134) | |
("\\(|>\\)" #Xe135) | |
("\\(\\^=\\)" #Xe136) | |
("\\(\\$>\\)" #Xe137) | |
("\\(\\+\\+\\)" #Xe138) | |
("\\(\\+\\+\\+\\)" #Xe139) | |
("\\(\\+>\\)" #Xe13a) | |
("\\(=:=\\)" #Xe13b) | |
("[^!/]\\(==\\)[^>]" #Xe13c) | |
("\\(===\\)" #Xe13d) | |
("\\(==>\\)" #Xe13e) | |
("[^=]\\(=>\\)" #Xe13f) | |
("\\(=>>\\)" #Xe140) | |
("\\(<=\\)" #Xe141) | |
("\\(=<<\\)" #Xe142) | |
("\\(=/=\\)" #Xe143) | |
("\\(>-\\)" #Xe144) | |
("\\(>=\\)" #Xe145) | |
("\\(>=>\\)" #Xe146) | |
("[^-=]\\(>>\\)" #Xe147) | |
("\\(>>-\\)" #Xe148) | |
("\\(>>=\\)" #Xe149) | |
("\\(>>>\\)" #Xe14a) | |
("\\(<\\*\\)" #Xe14b) | |
("\\(<\\*>\\)" #Xe14c) | |
("\\(<|\\)" #Xe14d) | |
("\\(<|>\\)" #Xe14e) | |
("\\(<\\$\\)" #Xe14f) | |
("\\(<\\$>\\)" #Xe150) | |
("\\(<!--\\)" #Xe151) | |
("\\(<-\\)" #Xe152) | |
("\\(<--\\)" #Xe153) | |
("\\(<->\\)" #Xe154) | |
("\\(<\\+\\)" #Xe155) | |
("\\(<\\+>\\)" #Xe156) | |
("\\(<=\\)" #Xe157) | |
("\\(<==\\)" #Xe158) | |
("\\(<=>\\)" #Xe159) | |
("\\(<=<\\)" #Xe15a) | |
("\\(<>\\)" #Xe15b) | |
("[^-=]\\(<<\\)" #Xe15c) | |
("\\(<<-\\)" #Xe15d) | |
("\\(<<=\\)" #Xe15e) | |
("\\(<<<\\)" #Xe15f) | |
("\\(<~\\)" #Xe160) | |
("\\(<~~\\)" #Xe161) | |
("\\(</\\)" #Xe162) | |
("\\(</>\\)" #Xe163) | |
("\\(~@\\)" #Xe164) | |
("\\(~-\\)" #Xe165) | |
("\\(~=\\)" #Xe166) | |
("\\(~>\\)" #Xe167) | |
("[^<]\\(~~\\)" #Xe168) | |
("\\(~~>\\)" #Xe169) | |
("\\(%%\\)" #Xe16a) | |
;; ("\\(x\\)" #Xe16b) This ended up being hard to do properly so i'm leaving it out. | |
("[^:=]\\(:\\)[^:=]" #Xe16c) | |
("[^\\+<>]\\(\\+\\)[^\\+<>]" #Xe16d) | |
("[^\\*/<>]\\(\\*\\)[^\\*/<>]" #Xe16f)))) | |
(defun add-fira-code-symbol-keywords () | |
(font-lock-add-keywords nil fira-code-font-lock-keywords-alist)) | |
(add-hook 'prog-mode-hook | |
#'add-fira-code-symbol-keywords) | |
(provide 'font-support) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment