From bead7a77483d4b11404f408c4b218f6dc7c220ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 May 2026 15:49:01 -0400 Subject: [PATCH] refactor!: backport mode-line-invisible-mode & drop hide-mode-line BREAKING CHANGE: If you are using the `hide-mode-line` package, use `mode-line-invisible-mode` instead. This mode was introduced in Emacs 31, but has been backported since it is so widely used in Doom (and so we can drop another core dependency). There is no replacement for `global-hide-mode-line`, however. You'll have to install `hide-mode-line` if you were using it. --- lisp/doom-compat.el | 25 ++++++++++++++++++++ lisp/doom-ui.el | 12 +++++----- lisp/packages.el | 1 - modules/app/calendar/config.el | 2 +- modules/emacs/undo/config.el | 2 +- modules/email/notmuch/config.el | 2 +- modules/lang/org/autoload/contrib-present.el | 2 +- modules/term/eshell/config.el | 2 +- modules/term/shell/config.el | 2 +- modules/term/term/config.el | 2 +- modules/term/vterm/config.el | 2 +- modules/tools/debugger/config.el | 2 +- modules/tools/magit/config.el | 2 +- modules/tools/pdf/config.el | 2 +- modules/ui/minimap/config.el | 2 +- modules/ui/modeline/+light.el | 2 +- modules/ui/modeline/README.org | 7 +----- modules/ui/modeline/config.el | 2 +- modules/ui/popup/autoload/popup.el | 18 ++++++-------- 19 files changed, 53 insertions(+), 38 deletions(-) diff --git a/lisp/doom-compat.el b/lisp/doom-compat.el index 1e8f847c0..e16eeb065 100644 --- a/lisp/doom-compat.el +++ b/lisp/doom-compat.el @@ -243,5 +243,30 @@ the value of the last one, or nil if there are none." (macroexp-warn-and-return (format-message "`static-unless' with empty body") (list 'progn nil nil) '(empty-body static-unless) t)))) + +;;; From Emacs 31+ +(unless (fboundp 'mode-line-invisible-mode) + (defvar-local mode-line-invisible--buf-state nil) + (define-minor-mode mode-line-invisible-mode + "Toggle the mode-line visibility of the current buffer. +Hide the mode line if it is shown, and show it if it's hidden." + :global nil + :group 'mode-line + (if mode-line-invisible-mode + (progn + (add-hook 'after-change-major-mode-hook #'mode-line-invisible-mode nil t) + (setq mode-line-invisible--buf-state + (buffer-local-set-state mode-line-format nil))) + (remove-hook 'after-change-major-mode-hook #'mode-line-invisible-mode t) + (when mode-line-invisible--buf-state + (setq mode-line-invisible--buf-state + (buffer-local-restore-state mode-line-invisible--buf-state))) + (unless mode-line-format + (setq-local mode-line-format (default-value 'mode-line-format))) + (when (called-interactively-p 'any) + (force-mode-line-update)))) + (put 'mode-line-invisible--buf-state 'permanent-local t) + (put 'mode-line-invisible-mode 'permanent-local-hook t)) + (provide 'doom-compat) ;;; doom-compat.el ends here diff --git a/lisp/doom-ui.el b/lisp/doom-ui.el index 07b3d808d..1441e8b7e 100644 --- a/lisp/doom-ui.el +++ b/lisp/doom-ui.el @@ -557,6 +557,12 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original show-paren-when-point-in-periphery t)) +;; Hide the mode line in completion popups and MAN pages because they serve +;; little purpose there, and is better hidden. +(add-hook 'completion-list-mode-hook #'mode-line-invisible-mode) +(add-hook 'Man-mode-hook #'mode-line-invisible-mode) + + ;; ;;; Third party packages @@ -572,12 +578,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original nerd-icons-pomicon nerd-icons-powerline)) -;; Hide the mode line in completion popups and MAN pages because they serve -;; little purpose there, and is better hidden. -;;;###package hide-mode-line-mode -(add-hook! '(completion-list-mode-hook Man-mode-hook) - #'hide-mode-line-mode) - ;;;###package image (setq image-animate-loop t) diff --git a/lisp/packages.el b/lisp/packages.el index 1a65b9f47..f03e28816 100644 --- a/lisp/packages.el +++ b/lisp/packages.el @@ -23,7 +23,6 @@ ;; doom-ui.el (package! nerd-icons :pin "ae1b85c487c2b0bb1efb8bc0edc23af74282eec2") -(package! hide-mode-line :pin "ddd154f1e04d666cd004bf8212ead8684429350d") ;; doom-editor.el (package! better-jumper :pin "b1bf7a3c8cb820d942a0305e0e6412ef369f819c") diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index e4c370a57..e43941358 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -67,7 +67,7 @@ :m "C-j" #'calfw-details-navi-next-item-command))) (add-hook 'calfw-calendar-mode-hook #'doom-mark-buffer-as-real-h) - (add-hook 'calfw-calendar-mode-hook #'hide-mode-line-mode) + (add-hook 'calfw-calendar-mode-hook #'mode-line-invisible-mode) (advice-add #'calfw-render-button :override #'+calendar-calfw-render-button-a)) diff --git a/modules/emacs/undo/config.el b/modules/emacs/undo/config.el index cc06e8f63..a87a6da27 100644 --- a/modules/emacs/undo/config.el +++ b/modules/emacs/undo/config.el @@ -116,7 +116,7 @@ (display-buffer-mark-dedicated 'soft) (win (split-window (get-buffer-window undo-tree-visualizer-parent-buffer)))) (with-current-buffer buff - (hide-mode-line-mode +1)) + (mode-line-invisible-mode +1)) (set-window-buffer win buff) (shrink-window-if-larger-than-buffer win))) diff --git a/modules/email/notmuch/config.el b/modules/email/notmuch/config.el index 024bc60c2..a5043d67d 100644 --- a/modules/email/notmuch/config.el +++ b/modules/email/notmuch/config.el @@ -106,7 +106,7 @@ to update the notmuch-saved-searches variable accordingly." (add-hook! '(notmuch-show-mode-hook notmuch-tree-mode-hook notmuch-search-mode-hook) - #'hide-mode-line-mode) + #'mode-line-invisible-mode) (map! :localleader :map (notmuch-hello-mode-map notmuch-search-mode-map notmuch-tree-mode-map notmuch-show-mode-map) diff --git a/modules/lang/org/autoload/contrib-present.el b/modules/lang/org/autoload/contrib-present.el index 4f72551cf..06a3280f5 100644 --- a/modules/lang/org/autoload/contrib-present.el +++ b/modules/lang/org/autoload/contrib-present.el @@ -66,7 +66,7 @@ (setq-local cwm-left-fringe-ratio -10) (setq-local cwm-centered-window-width 300) (centered-window-mode arg)) - (hide-mode-line-mode arg) + (mode-line-invisible-mode arg) (+org-pretty-mode arg) (cond (org-tree-slide-mode (set-window-fringes nil 0 0) diff --git a/modules/term/eshell/config.el b/modules/term/eshell/config.el index ace2bac78..976a2d0fc 100644 --- a/modules/term/eshell/config.el +++ b/modules/term/eshell/config.el @@ -125,7 +125,7 @@ You should use `set-eshell-alias!' to change this.") (visual-line-mode +1) (set-display-table-slot standard-display-table 0 ?\ ))) - (add-hook 'eshell-mode-hook #'hide-mode-line-mode) + (add-hook 'eshell-mode-hook #'mode-line-invisible-mode) ;; Remove hscroll-margin in shells, otherwise you get jumpiness when the ;; cursor comes close to the left/right edges of the window. diff --git a/modules/term/shell/config.el b/modules/term/shell/config.el index 738a5faf2..4a4c8adb8 100644 --- a/modules/term/shell/config.el +++ b/modules/term/shell/config.el @@ -1,4 +1,4 @@ ;;; term/shell/config.el -*- lexical-binding: t; -*- ;;;###package shell -(add-hook 'shell-mode-hook #'hide-mode-line-mode) +(add-hook 'shell-mode-hook #'mode-line-invisible-mode) diff --git a/modules/term/term/config.el b/modules/term/term/config.el index 1a0c14e13..df5d3065b 100644 --- a/modules/term/term/config.el +++ b/modules/term/term/config.el @@ -1,7 +1,7 @@ ;;; term/term/config.el -*- lexical-binding: t; -*- ;;;###package term -(add-hook 'term-mode-hook #'hide-mode-line-mode) +(add-hook 'term-mode-hook #'mode-line-invisible-mode) ;;;###package multi-term diff --git a/modules/term/vterm/config.el b/modules/term/vterm/config.el index 52acc5a5d..23ee27dac 100644 --- a/modules/term/vterm/config.el +++ b/modules/term/vterm/config.el @@ -3,7 +3,7 @@ (use-package! vterm :when (bound-and-true-p module-file-suffix) ; requires dynamic-modules support :commands vterm-mode - :hook (vterm-mode . hide-mode-line-mode) ; modeline serves no purpose in vterm + :hook (vterm-mode . mode-line-invisible-mode) ; modeline serves no purpose in vterm :preface ;; HACK: Because vterm clusmily forces vterm-module.so's compilation on us ;; when the package is loaded, this is necessary to prevent it when diff --git a/modules/tools/debugger/config.el b/modules/tools/debugger/config.el index b7d5d384d..10d2042a7 100644 --- a/modules/tools/debugger/config.el +++ b/modules/tools/debugger/config.el @@ -20,7 +20,7 @@ (dape--default-cwd))) ;; Mode-line serves no purpose in REPL window. - (add-hook 'dape-repl-mode-hook #'hide-mode-line-mode) + (add-hook 'dape-repl-mode-hook #'mode-line-invisible-mode) ;; Persist breakpoints after closing DAPE. (dape-breakpoint-global-mode +1) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index cd6ef5349..a79c57fbd 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -141,7 +141,7 @@ FUNCTION ;; The mode-line isn't useful in these popups and take up valuable screen ;; estate, so free it up. - (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) + (add-hook 'magit-popup-mode-hook #'mode-line-invisible-mode) ;; Add additional switches that seem common enough (transient-append-suffix 'magit-fetch "-p" diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 6ab63769b..34a5e546c 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -57,7 +57,7 @@ ("\\(?:^\\*Contents\\|'s annots\\*$\\)" :ignore t))) ;; The mode-line does serve any useful purpose is annotation windows - (add-hook 'pdf-annot-list-mode-hook #'hide-mode-line-mode) + (add-hook 'pdf-annot-list-mode-hook #'mode-line-invisible-mode) ;; HACK: Fix #1107: flickering pdfs when evil-mode is enabled (setq-hook! 'pdf-view-mode-hook evil-normal-state-cursor (list nil)) diff --git a/modules/ui/minimap/config.el b/modules/ui/minimap/config.el index e884d38c4..68827da62 100644 --- a/modules/ui/minimap/config.el +++ b/modules/ui/minimap/config.el @@ -1,4 +1,4 @@ ;;; ui/minimap/config.el -*- lexical-binding: t; -*- (use-package! demap - :hook (demap-minimap-window-set-hook . hide-mode-line-mode)) + :hook (demap-minimap-window-set-hook . mode-line-invisible-mode)) diff --git a/modules/ui/modeline/+light.el b/modules/ui/modeline/+light.el index 7e3022c68..fbb991cc7 100644 --- a/modules/ui/modeline/+light.el +++ b/modules/ui/modeline/+light.el @@ -579,7 +579,7 @@ lines are selected, or the NxM dimensions of a block selection.") (defun +modeline-init-project-or-hide-h () (if (eq major-mode 'magit-status-mode) (set-modeline! 'project) - (hide-mode-line-mode +1)))) + (mode-line-invisible-mode +1)))) ;; diff --git a/modules/ui/modeline/README.org b/modules/ui/modeline/README.org index 0c492c1f8..de69abd40 100644 --- a/modules/ui/modeline/README.org +++ b/modules/ui/modeline/README.org @@ -40,13 +40,8 @@ powered by the [[doom-package:doom-modeline]] package (where you can find screen #+end_quote ** Hiding the modeline -- You can use ~M-x hide-mode-line-mode RET~ to hide modeline for the current +- You can use ~M-x mode-line-invisible-mode RET~ to hide modeline for the current buffer. -- Also, there is ~global-hide-mode-line-mode~ for globally hiding modeline. You - can just add =(global-hide-mode-line-mode)= into =~/.doom.d/config.el~. -- ~hide-mode-line-excluded-modes~ can be set for preventing - ~global-hide-mode-line-mode~ hiding modeline for buffers with the - corresponding major modes. ** TODO Switching the modeline and header line diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index f95313d61..32b9d0f74 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -41,7 +41,7 @@ "Show minimal modeline in magit-status buffer, no modeline elsewhere." (if (eq major-mode 'magit-status-mode) (doom-modeline-set-modeline 'magit) - (hide-mode-line-mode)))) + (mode-line-invisible-mode)))) ;; diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 533c90860..b1587fd62 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -270,7 +270,6 @@ restoring it if `+popup-buffer-mode' is disabled." (let ((m (if (bound-and-true-p +popup-buffer-mode) +popup-margin-width))) (set-window-margins nil m m))))) -(defvar hide-mode-line-format) ;;;###autoload (defun +popup-set-modeline-on-enable-h () "Don't show modeline in popup windows without a `modeline' window-parameter. @@ -286,22 +285,19 @@ Any non-nil value besides the above will be used as the raw value for (let ((modeline (+popup-parameter 'modeline))) (cond ((eq modeline 't)) ((null modeline) - ;; TODO use `mode-line-format' window parameter instead (emacs 26+) - (hide-mode-line-mode +1)) - ((let ((hide-mode-line-format - (if (functionp modeline) - (funcall modeline) - modeline))) - (hide-mode-line-mode +1))))))) + (mode-line-invisible-mode +1)) + ((setq-local mode-line-format + (if (functionp modeline) + (funcall modeline) + modeline))))))) (put '+popup-set-modeline-on-enable-h 'permanent-local-hook t) ;;;###autoload (defun +popup-unset-modeline-on-disable-h () "Restore the modeline when `+popup-buffer-mode' is deactivated." (when (and (not (bound-and-true-p +popup-buffer-mode)) - (bound-and-true-p hide-mode-line-mode) - (not (bound-and-true-p global-hide-mode-line-mode))) - (hide-mode-line-mode -1))) + (bound-and-true-p mode-line-invisible-mode)) + (mode-line-invisible-mode -1))) ;;;###autoload (defun +popup-close-on-escape-h ()