Add doom/{increase,decrease,reset}-font commands
Borrows the idea from zoom-frm (see #1389).
This commit is contained in:
parent
ef4106dae8
commit
0f0fdbc00c
8 changed files with 124 additions and 51 deletions
100
core/autoload/fonts.el
Normal file
100
core/autoload/fonts.el
Normal 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))))
|
|
@ -5,9 +5,9 @@
|
||||||
"
|
"
|
||||||
Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset
|
Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset
|
||||||
"
|
"
|
||||||
("j" text-scale-increase "in")
|
("j" doom/increase-font-size "in")
|
||||||
("k" text-scale-decrease "out")
|
("k" doom/decrease-font-size "out")
|
||||||
("0" (text-scale-set 0) "reset"))
|
("0" doom/reset-font-size "reset"))
|
||||||
|
|
||||||
;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil t)
|
;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil t)
|
||||||
(defhydra doom-window-nav-hydra (:hint nil)
|
(defhydra doom-window-nav-hydra (:hint nil)
|
||||||
|
|
|
@ -183,30 +183,3 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/"
|
||||||
(setq doom--buffer-narrowed-origin nil))
|
(setq doom--buffer-narrowed-origin nil))
|
||||||
(t
|
(t
|
||||||
(widen))))
|
(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)))
|
|
||||||
|
|
|
@ -20,10 +20,6 @@ Examples:
|
||||||
(setq doom-font (font-spec :family \"Fira Mono\" :size 12))
|
(setq doom-font (font-spec :family \"Fira Mono\" :size 12))
|
||||||
(setq doom-font \"Terminus (TTF):pixelsize=12:antialias=off\")")
|
(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
|
(defvar doom-variable-pitch-font nil
|
||||||
"The font to use for variable-pitch text.
|
"The font to use for variable-pitch text.
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
"<C-mouse-4>" #'text-scale-increase
|
"<C-mouse-4>" #'text-scale-increase
|
||||||
"<C-mouse-5>" #'text-scale-decrease
|
"<C-mouse-5>" #'text-scale-decrease
|
||||||
"<C-down-mouse-2>" (λ! (text-scale-set 0))
|
"<C-down-mouse-2>" (λ! (text-scale-set 0))
|
||||||
"M-+" (λ! (text-scale-set 0))
|
"M-+" #'doom/reset-font-size
|
||||||
"M-=" #'text-scale-increase
|
"M-=" #'doom/increase-font-size
|
||||||
"M--" #'text-scale-decrease
|
"M--" #'doom/decrease-font-size
|
||||||
;; Editor related bindings
|
;; Editor related bindings
|
||||||
[remap newline] #'newline-and-indent
|
[remap newline] #'newline-and-indent
|
||||||
"C-j" #'+default/newline
|
"C-j" #'+default/newline
|
||||||
|
|
|
@ -162,9 +162,9 @@
|
||||||
"s-v" #'yank
|
"s-v" #'yank
|
||||||
"s-s" #'save-buffer
|
"s-s" #'save-buffer
|
||||||
;; Buffer-local font scaling
|
;; Buffer-local font scaling
|
||||||
"s-+" (λ! (text-scale-set 0))
|
"s-+" #'doom/reset-font-size
|
||||||
"s-=" #'text-scale-increase
|
"s-=" #'doom/increase-font-size
|
||||||
"s--" #'text-scale-decrease
|
"s--" #'doom/decrease-font-size
|
||||||
;; Conventional text-editing keys & motions
|
;; Conventional text-editing keys & motions
|
||||||
"s-a" #'mark-whole-buffer
|
"s-a" #'mark-whole-buffer
|
||||||
:g "s-/" (λ! (save-excursion (comment-line 1)))
|
:g "s-/" (λ! (save-excursion (comment-line 1)))
|
||||||
|
|
|
@ -11,18 +11,22 @@
|
||||||
|
|
||||||
|
|
||||||
(defvar +modeline--old-bar-height nil)
|
(defvar +modeline--old-bar-height nil)
|
||||||
;;;###autoload
|
(defun +modeline|resize-for-font ()
|
||||||
(defun +modeline|resize-for-big-font ()
|
"Adjust the modeline's height when the font size is changed by
|
||||||
"Adjust the modeline's height when `doom-big-font-mode' is enabled. This was
|
`doom/increase-font-size' or `doom/decrease-font-size'.
|
||||||
made to be added to `doom-big-font-mode-hook'."
|
|
||||||
|
Meant for `doom-change-font-size-hook'."
|
||||||
(unless +modeline--old-bar-height
|
(unless +modeline--old-bar-height
|
||||||
(setq +modeline--old-bar-height doom-modeline-height))
|
(setq +modeline--old-bar-height doom-modeline-height))
|
||||||
(let ((default-height +modeline--old-bar-height))
|
(let ((default-height +modeline--old-bar-height)
|
||||||
(if doom-big-font-mode
|
(scale (or (frame-parameter nil 'font-scale) 0)))
|
||||||
(let* ((font-size (font-get doom-font :size))
|
(if (> scale 0)
|
||||||
(big-size (font-get doom-big-font :size))
|
(let* ((font-size (string-to-number
|
||||||
(ratio (/ (float big-size) font-size)))
|
(aref (doom--font-name (frame-parameter nil 'font)
|
||||||
(setq doom-modeline-height (ceiling (* default-height ratio 0.75))))
|
(selected-frame))
|
||||||
|
xlfd-regexp-pixelsize-subnum)))
|
||||||
|
(scale (frame-parameter nil 'font-scale)))
|
||||||
|
(setq doom-modeline-height (+ default-height (* scale doom-font-increment))))
|
||||||
(setq doom-modeline-height default-height))
|
(setq doom-modeline-height default-height))
|
||||||
;; already has a variable watcher in Emacs 26+
|
;; already has a variable watcher in Emacs 26+
|
||||||
(unless EMACS26+ (doom-modeline-refresh-bars))))
|
(unless EMACS26+ (doom-modeline-refresh-bars))))
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
(add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline
|
(add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline
|
||||||
(add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline
|
(add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline
|
||||||
|
|
||||||
(add-hook 'doom-big-font-mode-hook #'+modeline|resize-for-big-font)
|
(add-hook 'doom-change-font-size-hook #'+modeline|resize-for-font)
|
||||||
(add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars)
|
(add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars)
|
||||||
|
|
||||||
(add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline)
|
(add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue