Present your Emacs sessions with readable text across all buffers, featuring a quick toggle and hooks for tailoring your UI during live demos.
Tip
The scaling engine was significantly updated on 2026-02-01. See PR #4 for details and rollback instructions. Your feedback is very welcome!
- Global Scaling: A global minor mode (
presentation-mode) that scales text across all windows for crystal-clear screen sharing. - UI Automation: Use hooks (
presentation-on-hook/off-hook) to automatically adjust your environment (e.g., hide line numbers, switch themes). - Emacs 29+ Ready: Optionally delegates to native
global-text-scale-adjustwhile maintaining toggle and hook support. - Persistence: Automatically remembers and restores your last used scale.
- Execute
M-x presentation-modeto start your session. - Adjust the scale using
C-x C-+orC-x C--. (Reference: Emacs Manual: Text Scale) - Toggle
M-x presentation-modeagain to stop and restore your original UI. - When re-enabled, the mode automatically reproduces your last used scale.
- To set a permanent starting scale, customize
presentation-default-text-scale.
This mode is NOT intended for permanent font size changes. For global font configuration, refer to:
Emacs 29 introduced global-text-scale-adjust. This package can delegate to it while providing the extra benefit of hooks and persistence.
- Control delegation via
presentation-use-global-text-scale-adjust:auto(default): uses global adjust when available and no buffers are ignored.always: forces global adjust.never: always uses the legacy buffer-localtext-scale-mode.
Use hooks to define a “Presentation Theme” that triggers automatically.
(defun my-presentation-on ()
"Setup UI for presentations."
(vertico-flat-mode -1)
;; (global-display-line-numbers-mode -1)
(modus-themes-select 'modus-vivendi))
(defun my-presentation-off ()
"Restore UI after presentations."
(vertico-flat-mode 1)
;; (global-display-line-numbers-mode 1)
(modus-themes-select 'modus-operandi))
(add-hook 'presentation-on-hook #'my-presentation-on)
(add-hook 'presentation-off-hook #'my-presentation-off)Typically it is on/off of display-line-numbers-mode (or linum-mode) (although I do not use it).
I normally use Vertico; with vertico-flat-mode candidates stay on one horizontal line, minimizing vertical space during live demos. IDO / fido-mode is another compact built-in UI option.
- Emacs 29 added
global-text-scale-adjustinface-remap.el. When available,presentation-modedelegates scaling to it so all frames/windows stay in sync. - Control delegation with
presentation-use-global-text-scale-adjust:auto(default): use global adjust when available and no ignored buffers need protection.always: force global adjust when available (no fallback for ignored buffers).never: always use the legacy buffer-localtext-scale-modebehavior.
- If any buffer should be excluded (e.g., matches
presentation-mode-ignore-minor-modesor haspresentation-disableset), delegation is disabled inautomode and buffer-local scaling is used to keep those buffers unchanged.
vs GlobalTextScaleMode (Emacs Wiki)
Although the content of this article is simple, it does not provide a way to recover buffers.
vs moom
moom package has flexible frame control and font size change function.
Its font size change function is controlled by a mechanism different from presentation.el.
default-text-scale package is an implementation that replaces text-scale-mode.
This package is probably not compatible with presentation.el, but please use this whenever you want to synchronize font size at all times, not only for presentation use.
vs Org Tree Slide and org-present
These packages are simple presentations using org-mode. By using these with org-babel, it may be possible to perform live coding of arbitrary languages.
- If you only want to synchronize text scale across all windows, a simple remap can suffice:
(define-key global-map [remap text-scale-adjust] #'global-text-scale-adjust)
presentation-modeadds value when you need explicit on/off toggling via a minor mode and custom hooks (presentation-on-hook,presentation-off-hook) to adjust UI (e.g., hide line numbers, switch completion UI) during presentations.
| Feature | presentation.el | global-text-scale | default-text-scale |
|---|---|---|---|
| Global Scaling | Yes | Yes | Yes |
| UI Hooks (On/Off) | Yes | No | No |
| Scale Persistence | Yes | No | Yes |
| Buffer Exclusion | Yes | No | No |
- vs Org-specific tools (
org-tree-slide,org-present): These are for slide decks.presentation.elis for general live-coding and demoing any buffer. - vs default-text-scale: Use
default-text-scalefor permanent global scaling. Usepresentation.elfor temporary presentation mode with environment tweaks.

