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)