;;; Everything related to the look of Emacs ;;; The Ef (εὖ) themes ;; The themes are customisable. Read the manual: ;; <https://protesilaos.com/emacs/ef-themes>. (use-package ef-themes :ensure t :demand t :bind (("<f5>" . ef-themes-rotate) ("C-<f5>" . ef-themes-select)) :config (setq ef-themes-to-toggle '(ef-elea-light ef-elea-dark)) (setq ef-themes-variable-pitch-ui t) (setq ef-themes-mixed-fonts t) (setq ef-themes-rotate ef-themes-items) (setq ef-themes-headings ; read the manual's entry of the doc string '((0 . (variable-pitch light 1.9)) (1 . (variable-pitch light 1.8)) (2 . (variable-pitch regular 1.7)) (3 . (variable-pitch regular 1.6)) (4 . (variable-pitch regular 1.5)) (5 . (variable-pitch 1.4)) ; absence of weight means `bold' (6 . (variable-pitch 1.3)) (7 . (variable-pitch 1.2)) (agenda-date . (semilight 1.5)) (agenda-structure . (variable-pitch light 1.9)) (t . (variable-pitch 1.1)))) (setq ef-themes-disable-other-themes t) (mapc #'disable-theme custom-enabled-themes)) ;;;; Lin ;; Read the lin manual: <https://protesilaos.com/emacs/lin>. (use-package lin :ensure t :hook (elpaca-after-init . lin-global-mode) ; applies to all `lin-mode-hooks' :config (setopt lin-face 'lin-cyan)) ;;;; Increase padding of windows/frames ;; <https://protesilaos.com/codelog/2023-06-03-emacs-spacious-padding/>. (use-package spacious-padding :ensure t :if (display-graphic-p) :hook (elpaca-after-init . spacious-padding-mode) :init ;; These are the defaults, but I keep it here for visiibility. (setq spacious-padding-widths '(:internal-border-width 30 :header-line-width 4 :mode-line-width 6 :tab-width 4 :right-divider-width 30 :scroll-bar-width 8 :left-fringe-width 20 :right-fringe-width 20)) ;; Read the doc string of `spacious-padding-subtle-mode-line' as ;; it is very flexible. (setq spacious-padding-subtle-mode-line t)) ;;;; Rainbow mode for colour previewing (rainbow-mode.el) (use-package rainbow-mode :ensure t :init (setq rainbow-ansi-colors nil) (setq rainbow-x-colors nil) (defun prot/rainbow-mode-in-themes () (when-let* ((file (buffer-file-name)) ((derived-mode-p 'emacs-lisp-mode)) ((string-match-p "-theme" file))) (rainbow-mode 1))) :bind ( :map ctl-x-x-map ("c" . rainbow-mode)) ; C-x x c :hook (emacs-lisp-mode . prot/rainbow-mode-in-themes)) ;;; Cursor appearance (cursory) ;; Read the manual: <https://protesilaos.com/emacs/cursory>. (use-package cursory :ensure t :demand t :if (display-graphic-p) :config (setq cursory-presets '((box :blink-cursor-interval 1.2) (box-no-blink :blink-cursor-mode -1) (bar :cursor-type (bar . 2) :blink-cursor-interval 0.8) (bar-no-other-window :inherit bar :cursor-in-non-selected-windows nil) (bar-no-blink :cursor-type (bar . 2) :blink-cursor-mode -1) (underscore :cursor-type (hbar . 3) :blink-cursor-interval 0.3 :blink-cursor-blinks 50) (underscore-no-other-window :inherit underscore :cursor-in-non-selected-windows nil) (underscore-thick :cursor-type (hbar . 8) :blink-cursor-interval 0.3 :blink-cursor-blinks 50 :cursor-in-non-selected-windows (hbar . 3)) (underscore-thick-no-blink :blink-cursor-mode -1 :cursor-type (hbar . 8) :cursor-in-non-selected-windows (hbar . 3)) (t ; the default values :cursor-type box :cursor-in-non-selected-windows hollow :blink-cursor-mode 1 :blink-cursor-blinks 10 :blink-cursor-interval 0.2 :blink-cursor-delay 0.2))) ;; I am using the default values of `cursory-latest-state-file'. ;; Set last preset or fall back to desired style from `cursory-presets'. (cursory-set-preset (or (cursory-restore-latest-preset) 'box-no-blink)) (cursory-mode 1)) ;;;; Theme buffet ;; <https://git.sr.ht/~bboal/theme-buffet> (use-package theme-buffet :ensure t :after (:any modus-themes ef-themes) :config (let ((modus-themes-p (featurep 'modus-themes)) (ef-themes-p (featurep 'ef-themes))) (setq theme-buffet-menu 'end-user) (setq theme-buffet-time-offset 0) (setq theme-buffet-end-user '( :night (ef-dark ef-winter ef-autumn ef-night ef-duo-dark ef-symbiosis ef-owl) :morning (ef-light ef-cyprus ef-spring ef-frost ef-duo-light ef-eagle) :afternoon (ef-arbutus ef-day ef-kassio ef-summer ef-elea-light ef-maris-light ef-melissa-light ef-trio-light ef-reverie) :evening (ef-rosa ef-elea-dark ef-maris-dark ef-melissa-dark ef-trio-dark ef-dream))) (when (or modus-themes-p ef-themes-p) (theme-buffet-timer-hours 2) (theme-buffet-a-la-carte)))) ;;;; Fontaine (font configurations) ;; Read the manual: <https://protesilaos.com/emacs/fontaine> (use-package fontaine :ensure t :if (display-graphic-p) :hook ;; Persist the latest font preset when closing/starting Emacs and ;; while switching between themes. ((elpaca-after-init . fontaine-mode) (elpaca-after-init . (lambda () ;; Set last preset or fall back to desired style from `fontaine-presets'. (fontaine-set-preset (or (fontaine-restore-latest-preset) 'regular)))) (enable-theme-functions . fontaine-apply-current-preset) (ef-themes-post-load . fontaine-apply-current-preset)) :config ;; This is defined in Emacs C code: it belongs to font settings. (setq x-underline-at-descent-line nil) ;; And this is for Emacs28. (setq-default text-scale-remap-header-line t) ;; This is the default value. Just including it here for ;; completeness. (setq fontaine-latest-state-file (locate-user-emacs-file "fontaine-latest-state.eld")) (setq fontaine-presets '((small :default-family "Iosevka" :default-height 130) (regular :default-height 150) (medium :default-weight semilight :default-height 170 :bold-weight extrabold) (large :inherit medium :default-height 190) (presentation :inherit medium :default-height 250) (jumbo :inherit medium :default-height 330) (t ;; I keep all properties for didactic purposes, but most can be ;; omitted. See the fontaine manual for the technicalities: ;; <https://protesilaos.com/emacs/fontaine>. :default-family "Iosevka" :default-weight regular :default-slant normal :default-width normal :default-height 150 :fixed-pitch-family nil ; falls back to :default-family :fixed-pitch-weight nil ; falls back to :default-weight :fixed-pitch-slant nil :fixed-pitch-width nil :fixed-pitch-height 1.0 :fixed-pitch-serif-family nil :fixed-pitch-serif-weight nil :fixed-pitch-serif-slant nil :fixed-pitch-serif-width nil :fixed-pitch-serif-height 1.0 :variable-pitch-family "Iosevka" :variable-pitch-weight nil :variable-pitch-slant nil :variable-pitch-width nil :variable-pitch-height 1.0 :mode-line-active-family nil :mode-line-active-weight nil :mode-line-active-slant nil :mode-line-active-width nil :mode-line-active-height 1.0 :mode-line-inactive-family nil :mode-line-inactive-weight nil :mode-line-inactive-slant nil :mode-line-inactive-width nil :mode-line-inactive-height 1.0 :header-line-family nil :header-line-weight nil :header-line-slant nil :header-line-width nil :header-line-height 1.0 :line-number-family nil :line-number-weight nil :line-number-slant nil :line-number-width nil :line-number-height 1.0 :tab-bar-family nil :tab-bar-weight nil :tab-bar-slant nil :tab-bar-width nil :tab-bar-height 1.0 :tab-line-family nil :tab-line-weight nil :tab-line-slant nil :tab-line-width nil :tab-line-height 1.0 :bold-family nil :bold-slant nil :bold-weight bold :bold-width nil :bold-height 1.0 :italic-family nil :italic-weight nil :italic-slant italic :italic-width nil :italic-height 1.0 :line-spacing nil)))) ;;;; Show Font (preview fonts) ;; Read the manual: <https://protesilaos.com/emacs/show-font> (use-package show-font :ensure t :commands (show-font-select-preview show-font-list) :config ;; These are the defaults, but I keep them here for easier access. (setq show-font-pangram 'prot) (setq show-font-character-sample " ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 !@#$¢%^&*~| `'\"‘’“”.,;: ()[]{}—-_+=<> ()[]{}<>«»‹› 6bB8&0ODdoa 1tiIlL|\/ !ij c¢ 5$Ss 7Z2z 9gqp nmMNNMW uvvwWuuw x×X .,·°;:¡!¿?`'‘’ ÄAÃÀ TODO ")) ;;;;; `variable-pitch-mode' setup (use-package face-remap :ensure nil :functions prot/enable-variable-pitch :bind ( :map ctl-x-x-map ("v" . variable-pitch-mode)) :hook ((text-mode notmuch-show-mode elfeed-show-mode) . prot/enable-variable-pitch) :config ;; NOTE 2022-11-20: This may not cover every case, though it works ;; fine in my workflow. I am still undecided by EWW. (defun prot/enable-variable-pitch () (unless (derived-mode-p 'mhtml-mode 'nxml-mode 'yaml-mode) (variable-pitch-mode 1))) ;;;;; Resize keys with global effect :bind ;; Emacs 29 introduces commands that resize the font across all ;; buffers (including the minibuffer), which is what I want, as ;; opposed to doing it only in the current buffer. The keys are the ;; same as the defaults. (("C-x C-=" . global-text-scale-adjust) ("C-x C-+" . global-text-scale-adjust) ("C-x C-0" . global-text-scale-adjust))) (provide 'unravel-theme)