]> git.eshelyaron.com Git - emacs.git/commitdiff
Various improvements to auto-narrow mode.
authorGregory Heytings <gregory@heytings.org>
Wed, 6 Jul 2022 10:04:38 +0000 (10:04 +0000)
committerGregory Heytings <gregory@heytings.org>
Wed, 6 Jul 2022 10:06:53 +0000 (12:06 +0200)
* lisp/files.el (auto-narrow-display-length): Improve docstring.
(auto-narrow-widen-automatically): Add 'undo' to the command list.
(auto-narrow-hook): New defcustom.
(auto-narrow-pre-command-function, auto-narrow-post-command-function):
Move initialization code.
(auto-narrow-mode): Do not make the 'auto-narrow-mode' permanent local
anymore.

* lisp/font-lock.el (turn-off-font-lock-mode): New convenience function.

* src/xdisp.c (set_vertical_scroll_bar): Fix typo.
(redisplay_window): Use the new convenience function.

* src/buffer.h (BUFFER_NEEDS_AUTO_NARROWING_P,
BUFFER_AUTO_NARROWED_NON_NARROWED_P): Two new convenience functions.

* src/window.c (Frecenter): Do not recenter auto-narrowed buffers that
are not actually narrowed.

* etc/NEWS: Improvement.

* doc/emacs/display.texi (Auto-Narrowing): Improvement.

doc/emacs/display.texi
etc/NEWS
lisp/files.el
lisp/font-lock.el
src/buffer.h
src/window.c
src/xdisp.c

index 9fe9533e88c23b39386ba1c4a30ef9491ee34379..feb4675b32d946be23477f28ec1dd0b599ce8b48 100644 (file)
@@ -474,9 +474,10 @@ it.  @xref{Disabling}.
 @vindex auto-narrow-long-line-threshold
 @vindex auto-narrow-display-length
 @vindex auto-narrow-widen-automatically
+@vindex auto-narrow-hook
 
   When a file with extremely long lines is opened or inserted in a
-buffer, Emacs automatically enters auto-narrow mode, and the word
+buffer, Emacs automatically enters Auto-Narrow mode, and the word
 @samp{Auto-Narrow} appears in the mode line.  This means that Emacs
 restricts display, but not editing, to a portion of the buffer above
 and below point.  All editing commands, including narrowing commands,
@@ -485,12 +486,21 @@ remain available, and they act on the whole buffer.  For example,
 happen with ordinary narrowing, to the end of the portion of the
 buffer to which display is currently restricted.
 
-  The behavior of auto-narrow mode is controlled by three variables:
+  The behavior of Auto-Narrow mode is controlled by four variables:
 @code{auto-narrow-long-line-threshold} is the line length above which
-auto-narrow move is entered, @code{auto-narrow-display-length} is the
-number of characters to which display is restricted, and
+Auto-Narrow move is entered, @code{auto-narrow-display-length} is the
+number of characters to which display is restricted,
 @code{auto-narrow-widen-automatically} is a list of commands for which
-display is widened before they are executed.
+display is widened before they are executed, and
+@code{auto-narrow-hook} is a list of functions that are called when
+Auto-Narrow mode is entered.  By default, Font Lock mode is disabled
+in Auto-Narrow mode.
+
+  If you still experience slowdowns while editing a file when
+Auto-Narrow mode is enabled, this is not due to Emacs itself, but to
+the current major mode or one of the enabled minor modes, and you
+should open the file with @kbd{M-x find-file-literally} instead of
+@kbd{C-x C-f}.
 
 @node View Mode
 @section View Mode
index 51d31bcf1734ff62f42ff2069b9ca2d3d0b90bd6..3df1fb9c4e7baabef7fce816dca88e5aed0dfcaa 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -905,10 +905,15 @@ automatically enters auto-narrow mode.  This means that Emacs
 restricts display, but not editing, to a portion of the buffer above
 and below point.  All editing commands, including narrowing commands,
 remain available, and they act on the whole buffer.  The behavior of
-that mode is controlled by three variables:
-auto-narrow-long-line-threshold, auto-narrow-display-length and
-auto-narrow-widen-automatically.  To disable that feature, set
-auto-narrow-long-line-threshold to nil in your init file.
+that mode is controlled by four variables:
+auto-narrow-long-line-threshold, auto-narrow-display-length,
+auto-narrow-widen-automatically and auto-narrow-hook (which by default
+disables font-lock-mode).  To disable that feature, set
+auto-narrow-long-line-threshold to nil in your init file.  If you
+still experience slowdowns while editing a file in auto-narrow mode,
+this is due to the current major mode or one of the enabled minor
+modes: you should open the file with M-x find-file-literally instead
+of C-x C-f.
 
 ---
 ** 'zap-to-char' and 'zap-up-to-char' are case-sensitive for upper-case chars.
index 0e6f1a935db4c9dcb10fcb2a2c92149203e86172..8d6ecb66bc688027fac37f8c908157d6f7d223f3 100644 (file)
@@ -2692,9 +2692,9 @@ the file contents into it using `insert-file-contents-literally'."
   "Number of characters to which display is restricted in `auto-narrow-mode'.
 
 When `auto-narrow-mode' is in effect, the number of characters
-displayed above and below point is one third of
-`auto-narrow-display-line-length', except at the beginning and
-end of the buffer."
+displayed above and below point is at least one third and at most
+two thirds of `auto-narrow-display-line-length', except at the
+beginning and end of the buffer."
   :group 'files
   :group 'find-file
   :version "29.1"
@@ -2706,13 +2706,20 @@ end of the buffer."
      beginning-of-buffer end-of-buffer goto-char goto-line
      mark-sexp mark-defun mark-paragraph mark-whole-buffer mark-page
      exchange-point-and-mark pop-global-mark set-mark-command jump-to-register
-     bookmark-jump)
+     bookmark-jump undo)
   "Commands for which display is automatically widened in `auto-narrow-mode'."
   :group 'files
   :group 'find-file
   :version "29.1"
   :type '(repeat function))
 
+(defcustom auto-narrow-hook '(turn-off-font-lock-mode)
+  "List of functions to be called when `auto-narrow-mode' is entered."
+  :group 'find-file
+  :type 'hook
+  :version "29.1"
+  :type '(repeat function))
+
 (defvar-local auto-narrow--widen-automatically nil
   "Internal variable used by `auto-narrow-mode'.")
 
@@ -2725,11 +2732,6 @@ end of the buffer."
 (defun auto-narrow-pre-command-function ()
   "Conditionally widen display when `auto-narrow-mode' is in effect."
   (when auto-narrow-mode
-    (unless auto-narrow--initialized
-      (setq auto-narrow--widen-automatically widen-automatically
-            auto-narrow--isearch-widen-automatically isearch-widen-automatically
-            auto-narrow--narrowing-state 'auto
-            auto-narrow--initialized t))
     (setq-local widen-automatically t
                 isearch-widen-automatically t)
     (if (memq this-command '(narrow-to-region narrow-to-defun narrow-to-page))
@@ -2747,7 +2749,11 @@ end of the buffer."
   (when (and auto-narrow-mode
              (not (eq auto-narrow--narrowing-state 'explicit)))
     (unless auto-narrow--initialized
-      (setq auto-narrow--narrowing-state 'auto))
+      (run-hooks 'auto-narrow-hook)
+      (setq auto-narrow--widen-automatically widen-automatically
+            auto-narrow--isearch-widen-automatically isearch-widen-automatically
+            auto-narrow--narrowing-state 'auto
+            auto-narrow--initialized t))
     (let (point cur-point-min buf-point-min buf-point-max size)
       (setq point (point) cur-point-min (point-min)
             size (/ auto-narrow-display-length 3))
@@ -2777,7 +2783,6 @@ in a buffer.  It restricts display, but not editing, to
 executing any of the commands listed in `auto-narrow-widen-automatically'."
   :group 'files
   :version "29.1"
-  :after-hook (progn (put 'auto-narrow-mode 'permanent-local t))
   (if auto-narrow-mode
       (auto-narrow-post-command-function)
     (when (not (eq auto-narrow--narrowing-state 'explicit))
index 206879b169493e391fdcca2264698c61ef49513b..0c30173d9ae258b73011445997177be3c434bea5 100644 (file)
@@ -2045,6 +2045,11 @@ Sets various variables using `font-lock-defaults' and
        (setq font-lock-keywords
               (font-lock-compile-keywords font-lock-keywords))))
     (font-lock-flush)))
+
+(defun turn-off-font-lock-mode ()
+  "Unconditionally turn off `font-lock-mode'."
+  (interactive)
+  (font-lock-mode -1))
 \f
 ;;; Color etc. support.
 
index 19faa844e02c028a359f073c28afe16c4e280463..84492737b0ecc46d44dac4ed0acdea2fd5b4fc35 100644 (file)
@@ -1120,12 +1120,28 @@ BUFFER_CHECK_INDIRECTION (struct buffer *b)
     }
 }
 
+/* Check the state of auto-narrowed buffers.  */
+
+INLINE bool
+BUFFER_NEEDS_AUTO_NARROWING_P (struct buffer *b)
+{
+  return EQ (BVAR (b, auto_narrow__narrowing_state), Qneeded);
+}
+
 INLINE bool
 BUFFER_AUTO_NARROWED_P (struct buffer *b)
 {
   return EQ (BVAR (b, auto_narrow__narrowing_state), Qauto);
 }
 
+INLINE bool
+BUFFER_AUTO_NARROWED_NON_NARROWED_P (struct buffer *b)
+{
+  return BUFFER_AUTO_NARROWED_P (b)
+    && BUF_BEG (b) == BUF_BEGV (b)
+    && BUF_Z (b) == BUF_ZV (b);
+}
+
 /* This structure holds the default values of the buffer-local variables
    that have special slots in each buffer.
    The default value occupies the same slot in this structure
index af463b90ce6ffc4198e7805d3eebccb87ad423a0..218b3e6a4f8049ff51644210a62ac8a3e664d987 100644 (file)
@@ -6557,6 +6557,11 @@ and redisplay normally--don't erase and redraw the frame.  */)
   if (buf != current_buffer)
     error ("`recenter'ing a window that does not display current-buffer.");
 
+  /* Refuse to recenter auto-narrowed buffers that are not actually narrowed,
+     as this can be very slow.  */
+  if (BUFFER_AUTO_NARROWED_NON_NARROWED_P (buf))
+    return Qnil;
+
   /* If redisplay is suppressed due to an error, try again.  */
   buf->display_error_modiff = 0;
 
index be51a0eb13665a28ca611b41753a7d3b7619286d..7821c120ca0cfe66f8965cb50abe3a340cc029a2 100644 (file)
@@ -18872,7 +18872,7 @@ set_vertical_scroll_bar (struct window *w)
          && NILP (echo_area_buffer[0])))
     {
       struct buffer *buf = XBUFFER (w->contents);
-      if (! BUFFER_AUTO_NARROWED_P (current_buffer))
+      if (! BUFFER_AUTO_NARROWED_P (buf))
        {
          whole = BUF_ZV (buf) - BUF_BEGV (buf);
          start = marker_position (w->start) - BUF_BEGV (buf);
@@ -19142,7 +19142,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
      variables.  */
   set_buffer_internal_1 (XBUFFER (w->contents));
 
-  if (EQ (BVAR (current_buffer, auto_narrow__narrowing_state), Qneeded))
+  if (BUFFER_NEEDS_AUTO_NARROWING_P (current_buffer))
     {
       safe_call (1, Qauto_narrow_mode);
       /* Normally set by auto-narrow-mode, set it here anyway as a safety measure.  */