Emacs: Novel Reading Mode 🚀

By Xah Lee. Date: . Last updated: .

Here's a command to make current window suitable for reading long text.

emacs novel reading mode after 2019-01-30 snc93
after calling emacs novel reading mode
emacs novel reading mode 2019-01-30 xrp4v
before calling novel reading mode

Here's the code:

(defun xah-toggle-read-novel-mode ()
  "Setup current frame to be suitable for reading long novel/article text.
• Set frame width to 70
• Line wrap at word boundaries.
• Line spacing is increased.
• Proportional width font is used.
Call again to toggle back.
URL `http://xahlee.info/emacs/emacs/emacs_novel_reading_mode.html'
Version 2019-01-30 2021-01-16"
  (if (eq (frame-parameter (selected-frame) 'width) 70)
        (set-frame-parameter (selected-frame) 'width 106)
        (variable-pitch-mode 0)
        (setq line-spacing nil)
        (setq word-wrap nil))
      (set-frame-parameter (selected-frame) 'width 70)
      (variable-pitch-mode 1)
      (setq line-spacing 0.5)
      (setq word-wrap t)))
  (redraw-frame (selected-frame)))


Here's a command that just toggles the margin.

emacs toggle margin right 2020-04-10 5h24m
emacs Alt + x xah-toggle-margin-right
(defun xah-toggle-margin-right ()
  "Toggle the right margin between `fill-column' or window width.
This command is convenient when reading novel, documentation.
URL `http://xahlee.info/emacs/emacs/emacs_novel_reading_mode.html'
Version 2020-04-10"
  (if (cdr (window-margins))
      (set-window-margins nil 0 0)
    (set-window-margins nil 0 (- (window-body-width) fill-column))))

Line Wrap