# change-font.el -rw-r--r-- 2.0 KiB View raw
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
;;; change-font

(require 'ivy)

(defun modify-frame-parameter (parameter value)
  (if (null (assoc parameter default-frame-alist))
      (add-to-list 'default-frame-alist `(,parameter . ,value))
    (setf (cdr (assoc parameter default-frame-alist)) value)))

(defvar zyd/font-history ())

(defvar zyd/fonts
  '(("TX-02 Berkeley Mono" . "TX-02-13")
    ("JetBrains Mono" . "JetBrains Mono NL-13")
    ("PragmataPro Mono" . "PragmataPro Mono-13")
    ("Liberation Mono" . "Liberation Mono-13")
    ("Source Code Pro" . "Source Code Pro-13")
    ("UM Typewriter" . "UM Typewriter-14")
    ("JMH Typewriter" . "JMH Typewriter-13")
    ("Luxi Mono" . "Luxi Mono-11")))

(defun zyd/lookup-font (font)
  (cdr (assoc font zyd/fonts)))

(defun zyd/update-frame-font (font)
  (modify-frame-parameter 'font font)
  (set-frame-font font))

(defun zyd/change-font ()
  (interactive)
  (let ((current-font
         (symbol-name (font-get (face-attribute 'default :font) :family))))
    (ivy-read "Font: " zyd/fonts
              :preselect current-font
              :require-match t
              :history 'zyd/font-history
              :action (lambda (font) (zyd/update-frame-font (cdr font)))
              :caller 'zyd/change-font)))

(defun zyd/font-with-sample (font-name)
  (format "%-75s%s" font-name
          (propertize
           "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 {}[]()!@#$%^&*-_=+;:'\",./<>?`~"
           'face (list :family font-name))))

(ivy-configure 'zyd/change-font
  :display-transformer-fn #'zyd/font-with-sample)

(defmacro define-font (symbol font-name)
  `(defvar ,symbol (zyd/lookup-font ,font-name)))

(defun zyd/default-font (font)
  (zyd/update-frame-font font))

;;; What I have in my init, defining some fonts (with a defvar wrapper) and
;;; setting the default font. Also convenient alias for `M-x'ing:

(defalias '/font 'zyd/change-font)

(define-font tx02 "TX-02 Berkeley Mono")
(define-font pragmata "PragmataPro Mono")
(define-font typewriter "UM Typewriter")

(zyd/default-font tx02)