(define-minor-mode pretty-symbols-mode "A font-lock extension to draw multi-character codes in programming buffers as Unicode glyphs. For example, in C \"!=\" would be drawn as the not-equals symbol." nil "lambda" nil (if pretty-symbols-mode (pretty-symbols-enable) (pretty-symbols-disable))) (defgroup pretty-symbols nil "A font-lock extension to draw multi-character codes in programming buffers as Unicode glyphs. For example, in C \"!=\" would be drawn as the not-equals symbol." :group 'font-lock) (defcustom pretty-symbol-names '( ;; arrows (:left-arrow . 8592) (:up-arrow . 8593) (:right-arrow . 8594) (:down-arrow . 8595) ;; boxes (:double-vertical-bar . #x2551) ;; relations operators (:equal . #x003d) (:not-equal . #x2260) (:identical . #x2261) (:not-identical . #x2262) (:less-than . #x003c) (:greater-than . #x003e) (:less-than-or-equal-to . #x2264) (:greater-than-or-equal-to . #x2265) ;; logical operators (:logical-and . #x2227) (:logical-or . #x2228) (:logical-neg . #x00AC) ;; misc (:nil . #x2205) (:horizontal-ellipsis . #x2026) (:double-exclamation . #x203C) (:prime . #x2032) (:double-prime . #x2033) (:for-all . #x2200) (:there-exists . #x2203) (:element-of . #x2208) ;; mathematical operators (:square-root . #x221A) (:squared . #x00B2) (:cubed . #x00B3) ;; letters (:lambda . #x03BB) (:alpha . #x03B1) (:beta . #x03B2) (:gamma . #x03B3) (:delta . #x03B4)) "A mapping of internal names to unicode glyph numbers." :group 'pretty-symbols) (defcustom pretty-symbol-patterns '(("&&" :logical-and c-mode) ("->" :right-arrow c-mode) ("<=" :less-than-or-equal-to c-mode emacs-lisp-mode) ("==" :identical c-mode) ("\\" :identical emacs-lisp-mode) (">=" :greater-than-or-equal-to c-mode emacs-lisp-mode) ("\\!=" :not-equal c-mode) ("\\" :nil c-mode) ("||" :logical-or c-mode)) "A structure ((pattern symbol major-modes*)*)." :group 'pretty-symbols) (defun unicode-symbol (name) "Translate a symbolic name for a Unicode character -- e.g., :left-arrow or :greater-than into an actual Unicode character code." (decode-char 'ucs (cdr (assoc name pretty-symbol-names)))) (defun pretty-symbols-enable/disable (font-lock-add/remove-keywords) (dolist (x pretty-symbol-patterns) (if (find major-mode (cddr x)) (funcall font-lock-add/remove-keywords nil `((,(car x) (0 (prog1 nil (compose-region (match-beginning 0) (match-end 0) ,(unicode-symbol (cadr x))))))))))) (defun pretty-symbols-enable () (pretty-symbols-enable/disable #'font-lock-add-keywords)) (defun pretty-symbols-disable () (pretty-symbols-enable/disable #'font-lock-remove-keywords)) (provide 'pretty-symbols)