Emacs: Cycle Fonts by Command

By Xah Lee. Date: . Last updated: .

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"))
        $fontToUse
        $stateBefore
        $stateAfter)

    (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 a elisp code that lets you quickly 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
      (cond
       ((string-equal system-type "windows-nt")
        '(
          "Courier-10"
          "Lucida Console-10"
          "Segoe UI Symbol-12"
          "Lucida Sans Unicode-10"
          ))
       ((string-equal system-type "gnu/linux")
        '(
          "DejaVu Sans Mono-10"
          "DejaVu Sans-10"
          "Symbola-13"
          ))
       ((string-equal system-type "darwin") ; Mac
        '("Courier-14"
          "Menlo-14"))))
(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'."
  (interactive)
  (xah-cycle-font 1))

(defun xah-cycle-font-previous ()
  "Switch to the previous font, in current window.
See `xah-cycle-font'."
  (interactive)
  (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]

Proportional Font

Emacs: Proportional Font

Change Line Spacing

Note: different font have different line spacing.

Emacs: Set Line Spacing

toggle-word-wrap

Emacs: toggle-word-wrap

Font/Unicode Topic

  1. Emacs: Unicode Tutorial
  2. Emacs File Encoding FAQ
  3. Unicode Basics: What's Character Set, Character Encoding, UTF-8?
  4. Emacs: Xah Math Input Mode
  5. Emacs: Xah Unicode Browser Mode

  1. Best Unicode Fonts for Programer
  2. Emacs: Font Setup
  3. Emacs: Proportional Font
  4. Emacs: Cycle Fonts by Command
  5. Emacs: Set Line Spacing
  6. Emacs: toggle-word-wrap
  7. Elisp: Unicode Representation in String
Like my tutorial? Put $5 at patreon

Or Buy Xah Emacs Tutorial

Or buy a nice keyboard: Best Keyboard for Emacs