 (setq custom-safe-themes
   (quote
    ("e11569fd7e31321a33358ee4b232c2d3cf05caccd90f896e1df6cab228191109" default)))
+
+(use-package diminish
+  :ensure t)
 
 (use-package zenburn-theme
   :if window-system


(eval-when-compile
  (require 'use-package))
(require 'diminish)
(require 'bind-key)

(setq use-package-verbose t) ; verbose init debug & profiling

    (progn
      (setq TeX-view-program-selection '((output-pdf "PDF Viewer")))
      (setq TeX-view-program-list
            '(("PDF Viewer" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")))
    ;;; Fira code
      (when window-system
        ;; 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)
                    ("\\(/=\\)"                    #Xe10e) ;; For Fortran, will mess up some languages
                    ("\\(!==\\)"                   #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)
        )
      )
  )

