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 @@ 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) diff --git a/etc/NEWS b/etc/NEWS index bd0c951eab9..2067069abe0 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 @@ 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]