Subject: Re: bug#78881: [PATCH] New command 'toggle-mode-line-visibility'

From: Elijah Gabe Pérez <[email-masked]>
Date: Sat, 28 Jun 2025 12:36:47 -0600

Eli Zaretskii <[email-masked]> writes:

[...]

> Why "temporarily"?
>
> I would rephrase this:
>
>   This command toggles the mode-line visibility of the current buffer:
>   hides it if it is shown, and shows it if it's hidden.

Thanks, sending fixed patch:

>From ac44abc17b9211feac4f3b99f9fb7fb6cd273fbe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?El=C3=ADas=20Gabriel=20P=C3=A9rez?= <[email-masked]>
Date: Mon, 23 Jun 2025 12:50:28 -0600
Subject: [PATCH] New command 'mode-line-invisible-mode'

This new command allows hide the mode line in the current
buffer.  (Bug#78881)

* doc/emacs/display.texi (Optional Mode Line): Document feature.
* etc/NEWS: Announce changes.
* lisp/bindings.el (mode-line-invisible--buf-state): New buffer
local variable.
(mode-line-invisible-mode): New minor mode.
---
 doc/emacs/display.texi |  8 ++++++++
 etc/NEWS               |  5 +++++
 lisp/bindings.el       | 31 +++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
index ad496b5b1cd..fca9aebe927 100644
--- a/doc/emacs/display.texi
+++ b/doc/emacs/display.texi
@@ -1826,6 +1826,14 @@ Optional Mode Line
 and Emacs will hide some minor mode indicators on the mode line by
 collapsing them into a single clickable button.
 
+@findex mode-line-invisible-mode
+  By default, most buffers display a mode line, but if the mode line is
+not useful in a buffer, you can use the command @w{@kbd{M-x
+mode-line-invisible-mode}} to hide the mode line in the current buffer,
+the mode line remains hidden until this command is called again.  To
+always hide the mode line when entering to a major mode, add
+@code{mode-line-invisible-mode} to a hook @pxref{Hooks}.
+
 @node Text Display
 @section How Text Is Displayed
 @cindex characters (in text)
diff --git a/etc/NEWS b/etc/NEWS
index eb85baae341..32e5d2d2f01 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -353,6 +353,11 @@ This option allows changing or removing the delimiters shown around
 the major mode and list of minor modes in the mode line.  The default
 retains the existing behavior of inserting parentheses.
 
++++
+*** New minor mode 'mode-line-invisible-mode'.
+This command toggles the mode-line visibility of the current buffer:
+hides it if it is shown, and shows it if it's hidden.
+
 ** Tab Bars and Tab Lines
 
 ---
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 8b021a05ce2..d7ec11ca323 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -56,6 +56,37 @@ mode-line-widen
     (widen)
     (force-mode-line-update)))
 
+;; Variable used by `mode-line-invisible-mode' for
+;; store mode-line value in current buffer.
+(defvar-local mode-line-invisible--buf-state)
+
+(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
+  (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)))
+
+    ;; Display a mode line if buffer does not have one by default
+    (unless mode-line-format
+      (setq-local mode-line-format (default-value 'mode-line-format)))
+
+    ;; Update mode line
+    (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)
+
 (defvar mode-line-input-method-map
   (let ((map (make-sparse-keymap)))
     (define-key map [mode-line mouse-2]
-- 
2.50.0

-- 
                                          - E.G via GNU Emacs and Org.