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 '("DejaVu Sans Mono-10" "DejaVu Sans-10"))
        $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.

(defcustom xah-font-list nil "A list of fonts for `xah-cycle-font' to cycle from." :group 'font)
(set-default 'xah-font-list
             (cond
              ((string-equal system-type "windows-nt") ; Windows
               '(
                 "Courier New-10"
                 "DejaVu Sans Mono-9"
                 "Lucida Console-10"
                 "Segoe UI Symbol-12"
                 "DejaVu Sans-10"
                 "Lucida Sans Unicode-10"
                 ))
              ((string-equal system-type "gnu/linux")
               '(
                 "DejaVu Sans Mono-9"
                 "DejaVu Sans-9"
                 "Symbola-13"
                 ))
              ((string-equal system-type "darwin") ; Mac
               '(
                 "DejaVu Sans Mono-9"
                 "DejaVu Sans-9"
                 "Symbola-13"
                 ))))
(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 Configuration.

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 Configuration
  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 it? Buy Xah Emacs Tutorial. Thanks.