[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/fix-the-long-lines-display-bug eb6d2fb58d: Various improvements
From: |
Gregory Heytings |
Subject: |
feature/fix-the-long-lines-display-bug eb6d2fb58d: Various improvements to auto-narrow mode. |
Date: |
Wed, 6 Jul 2022 06:07:34 -0400 (EDT) |
branch: feature/fix-the-long-lines-display-bug
commit eb6d2fb58da56583490b18f4bfd705844b42180f
Author: Gregory Heytings <gregory@heytings.org>
Commit: Gregory Heytings <gregory@heytings.org>
Various improvements to auto-narrow mode.
* 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 | 20 +++++++++++++++-----
etc/NEWS | 13 +++++++++----
lisp/files.el | 27 ++++++++++++++++-----------
lisp/font-lock.el | 5 +++++
src/buffer.h | 16 ++++++++++++++++
src/window.c | 5 +++++
src/xdisp.c | 4 ++--
7 files changed, 68 insertions(+), 22 deletions(-)
diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
index 9fe9533e88..feb4675b32 100644
--- a/doc/emacs/display.texi
+++ b/doc/emacs/display.texi
@@ -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
diff --git a/etc/NEWS b/etc/NEWS
index 51d31bcf17..3df1fb9c4e 100644
--- 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.
diff --git a/lisp/files.el b/lisp/files.el
index 0e6f1a935d..8d6ecb66bc 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -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))
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 206879b169..0c30173d9a 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -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))
;;; Color etc. support.
diff --git a/src/buffer.h b/src/buffer.h
index 19faa844e0..84492737b0 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -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
diff --git a/src/window.c b/src/window.c
index af463b90ce..218b3e6a4f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -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;
diff --git a/src/xdisp.c b/src/xdisp.c
index be51a0eb13..7821c120ca 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -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. */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- feature/fix-the-long-lines-display-bug eb6d2fb58d: Various improvements to auto-narrow mode.,
Gregory Heytings <=