Emacs: Cycle Fonts by Command

By Xah Lee. Date: . Last updated: .

These commands lets you quickly switch fonts for comparison.

Cycle between 2 Fonts

This command cycles between 2 fonts.

(defun xah-cycle-font-2 (@n)
  "Change font in current window between 2 fonts.

URL `http://ergoemacs.org/emacs/emacs_switching_fonts.html'
Version 2015-09-21"
  (interactive "p")
  ;; this function sets a property “state”. It is a integer. Possible values are 0 to length of $fontList
  (let (
        ($fontList '("Courier-14" "Menlo-14"))

    (setq $stateBefore (if (get 'xah-cycle-font-2 'state) (get 'xah-cycle-font-2 'state) 0))
    (setq $stateAfter (% (+ $stateBefore (length $fontList) @n) (length $fontList)))
    (put 'xah-cycle-font-2 'state $stateAfter)

    (setq $fontToUse (nth $stateAfter $fontList))
    (set-frame-parameter nil 'font $fontToUse)
    (message "Font set to: %s" $fontToUse)))

Cycle Multiple Fonts

Here's commands that switch among your choice fonts for current window.

(defvar xah-font-list nil "A list of fonts for `xah-cycle-font' to cycle from.")

(setq xah-font-list
       ((string-equal system-type "windows-nt")
          "Lucida Console-10"
          "Segoe UI Symbol-12"
          "Lucida Sans Unicode-10"
       ((string-equal system-type "gnu/linux")
          "DejaVu Sans Mono-10"
          "DejaVu Sans-10"
       ((string-equal system-type "darwin") ; Mac

(defun xah-cycle-font (@n)
  "Change font in current frame.
Each time this is called, font cycles thru a predefined list of fonts in the variable `xah-font-list' .
If @n is 1, cycle forward.
If @n is -1, cycle backward.
See also `xah-cycle-font-next', `xah-cycle-font-previous'.

URL `http://ergoemacs.org/emacs/emacs_switching_fonts.html'
Version 2015-09-21"
  (interactive "p")
  ;; this function sets a property “state”. It is a integer. Possible values are any index to the fontList.
  (let ($fontToUse $stateBefore $stateAfter )
    (setq $stateBefore (if (get 'xah-cycle-font 'state) (get 'xah-cycle-font 'state) 0))
    (setq $stateAfter (% (+ $stateBefore (length xah-font-list) @n) (length xah-font-list)))
    (setq $fontToUse (nth $stateAfter xah-font-list))
    (set-frame-font $fontToUse t)
    ;; (set-frame-parameter nil 'font $fontToUse)
    (message "Current font is: %s" $fontToUse )
    (put 'xah-cycle-font 'state $stateAfter)))

(defun xah-cycle-font-next ()
  "Switch to the next font, in current window.
See `xah-cycle-font'."
  (xah-cycle-font 1))

(defun xah-cycle-font-previous ()
  "Switch to the previous font, in current window.
See `xah-cycle-font'."
  (xah-cycle-font -1))

Modify the variable list “xah-font-list” above, so that you can use this function to cycle among the fonts of your choice.

To get a list of fonts in emacs, see Emacs: Font Setup.

You can set Ctrl+F7 and Ctrl+F8 to switch to the prev/next font. [see Emacs: How to Define Keys]

If you have a question, put $5 at patreon and message me.
Or Buy Xah Emacs Tutorial
Or buy a nice keyboard: Best Keyboards for Emacs

Emacs Tutorial

Emacs Init

Emacs Keys


ELisp Examples

ELisp Write Major Mode

Emacs Tutorial

Quick Start

Manage Windows




On Current File

Find Replace





Rectangle Edit

Line Wrap


View Things

Working with Brackets

Power Editing

Org Mode


Emacs Efficiency