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.
This commit is contained in:
Elías Gabriel Pérez 2025-06-23 12:50:28 -06:00 committed by Eli Zaretskii
parent 34dad30e49
commit 7e56ffd51b
3 changed files with 44 additions and 0 deletions

View file

@ -1826,6 +1826,14 @@ further ``compress'' the mode line, you may customize the
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)

View file

@ -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
---

View file

@ -56,6 +56,37 @@ corresponding to the mode line clicked."
(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]