Add doom/{increase,decrease,reset}-font commands

Borrows the idea from zoom-frm (see #1389).
This commit is contained in:
Henrik Lissner 2019-05-12 21:54:16 -04:00
parent ef4106dae8
commit 0f0fdbc00c
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
8 changed files with 124 additions and 51 deletions

100
core/autoload/fonts.el Normal file
View file

@ -0,0 +1,100 @@
;;; core/autoload/fonts.el -*- lexical-binding: t; -*-
(defvar doom-font-increment 2
"How many steps to increase the font size each time `doom/increase-font-size'
or `doom/decrease-font-size' are invoked.")
(defvar doom-big-font-increment 14
"How many steps to increase the font size (with `doom-font' as the base) when
`doom-big-font-mode' is enabled.")
(defvar doom-change-font-size-hook nil
"A hook run after adjusting the font size with `doom/increase-font-size',
`doom/decrease-font-size', or `doom/reset-font-size'.")
;;
;;; Library
(defun doom--font-name (fontname frame)
(when (query-fontset fontname)
(when-let* ((ascii (assq 'ascii (aref (fontset-info fontname frame) 2))))
(setq fontname (nth 2 ascii))))
(or (x-decompose-font-name fontname)
(error "Cannot decompose font name")))
;;;###autoload
(defun doom-adjust-font-size (increment &optional frame)
"Increase size of font in FRAME by INCREMENT.
Interactively, INCREMENT is given by the prefix argument.
Optional FRAME parameter defaults to current frame."
(interactive "p")
(let* ((frame (or frame (selected-frame)))
(font (frame-parameter frame 'font))
(font (doom--font-name font frame)))
(let ((new-size (+ (string-to-number (aref font xlfd-regexp-pixelsize-subnum))
increment)))
(unless (> new-size 0)
(error "Font is to small at %d" new-size))
(aset font xlfd-regexp-pixelsize-subnum (number-to-string new-size)))
;; Set point size & width to "*", so frame width will adjust to new font size
(aset font xlfd-regexp-pointsize-subnum "*")
(aset font xlfd-regexp-avgwidth-subnum "*")
(setq font (x-compose-font-name font))
(unless (x-list-fonts font)
(error "Cannot change font size"))
(modify-frame-parameters frame `((font . ,font)))))
;;
;;; Commands
;;;###autoload
(defun doom/increase-font-size (count)
"Enlargens the font size across the current frame."
(interactive "p")
(let ((zoom-factor (or (frame-parameter nil 'font-scale) 0))
(increment (* count doom-font-increment)))
(setq zoom-factor (+ zoom-factor increment))
(if (= zoom-factor 0)
(doom/reset-font-size)
(doom-adjust-font-size increment)
(modify-frame-parameters nil `((font-scale . ,zoom-factor)))
(run-hooks 'doom-change-font-size-hook))))
;;;###autoload
(defun doom/decrease-font-size (count)
"Shrinks the font size across the current frame."
(interactive "p")
(doom/increase-font-size (- count)))
;;;###autoload
(defun doom/reset-font-size ()
"Reset font size.
Assuming it has been adjusted via `doom/increase-font-size' and
`doom/decrease-font-size'."
(interactive)
(let ((zoom-factor (frame-parameter nil 'font-scale)))
(if (not zoom-factor)
(user-error "Font size hasn't been changed")
(set-frame-font doom-font t)
(modify-frame-parameters nil '((font-scale)))
(run-hooks 'doom-change-font-size-hook))))
;;;###autoload
(define-minor-mode doom-big-font-mode
"A global mode that resizes the font, for streams, screen-sharing and
presentations.
This uses `doom/increase-font-size' under the hood, and enlargens the font by
`doom-big-font-increment'."
:init-value nil
:lighter " BIG"
:global t
(unless doom-font
(user-error "`doom-font' must be set to a valid font"))
(let ((frame (selected-frame)))
(set-frame-font doom-font t (list frame))
(when doom-big-font-mode
(doom-adjust-font-size doom-big-font-increment frame))))

View file

@ -5,9 +5,9 @@
"
Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset
"
("j" text-scale-increase "in")
("k" text-scale-decrease "out")
("0" (text-scale-set 0) "reset"))
("j" doom/increase-font-size "in")
("k" doom/decrease-font-size "out")
("0" doom/reset-font-size "reset"))
;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil t)
(defhydra doom-window-nav-hydra (:hint nil)

View file

@ -183,30 +183,3 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/"
(setq doom--buffer-narrowed-origin nil))
(t
(widen))))
;;
;; Modes
;;;###autoload
(define-minor-mode doom-big-font-mode
"A global mode that resizes the font, for streams, screen-sharing and
presentations.
Uses `doom-big-font' when enabled."
:init-value nil
:lighter " BIG"
:global t
(unless doom-big-font
(user-error "`doom-big-font' must be set to a valid font"))
(unless doom-font
(user-error "`doom-font' must be set to a valid font"))
(let ((doom-font (if doom-big-font-mode
doom-big-font
doom-font)))
(setf (alist-get 'font default-frame-alist)
(cond ((null doom-font))
((stringp doom-font) doom-font)
((fontp doom-font) (font-xlfd-name doom-font))
((signal 'wrong-type-argument (list '(fontp stringp) doom-font)))))
(set-frame-font doom-font t t)))

View file

@ -20,10 +20,6 @@ Examples:
(setq doom-font (font-spec :family \"Fira Mono\" :size 12))
(setq doom-font \"Terminus (TTF):pixelsize=12:antialias=off\")")
(defvar doom-big-font nil
"The font to use when `doom-big-font-mode' is enabled. Expects either a
`font-spec' or a XFT font string. See `doom-font' for examples.")
(defvar doom-variable-pitch-font nil
"The font to use for variable-pitch text.