Merge branch 'scratch/bug64391' into emacs-29

This commit is contained in:
Gregory Heytings 2023-07-08 19:30:17 +00:00
commit 8e06809fcc
2 changed files with 19 additions and 32 deletions

View file

@ -3980,8 +3980,9 @@ same LABEL argument.
(defun internal--with-restriction (start end body &optional label) (defun internal--with-restriction (start end body &optional label)
"Helper function for `with-restriction', which see." "Helper function for `with-restriction', which see."
(save-restriction (save-restriction
(narrow-to-region start end) (if label
(if label (internal--label-restriction label)) (internal--labeled-narrow-to-region start end label)
(narrow-to-region start end))
(funcall body))) (funcall body)))
(defmacro without-restriction (&rest rest) (defmacro without-restriction (&rest rest)

View file

@ -2682,11 +2682,12 @@ DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
records the restriction bounds that were current when the first records the restriction bounds that were current when the first
labeled restriction was entered (which may be a narrowing that was labeled restriction was entered (which may be a narrowing that was
set by the user and is visible on display). This alist is used set by the user and is visible on display). This alist is used
internally by narrow-to-region, widen, internal--label-restriction, internally by narrow-to-region, internal--labeled-narrow-to-region,
internal--unlabel-restriction and save-restriction. For efficiency widen, internal--unlabel-restriction and save-restriction. For
reasons, an alist is used instead of a buffer-local variable: efficiency reasons, an alist is used instead of a buffer-local
otherwise reset_outermost_restrictions, which is called during each variable: otherwise reset_outermost_restrictions, which is called
redisplay cycle, would have to loop through all live buffers. */ during each redisplay cycle, would have to loop through all live
buffers. */
static Lisp_Object labeled_restrictions; static Lisp_Object labeled_restrictions;
/* Add BUF with its list of labeled RESTRICTIONS in the /* Add BUF with its list of labeled RESTRICTIONS in the
@ -2868,8 +2869,7 @@ void
labeled_narrow_to_region (Lisp_Object begv, Lisp_Object zv, labeled_narrow_to_region (Lisp_Object begv, Lisp_Object zv,
Lisp_Object label) Lisp_Object label)
{ {
Fnarrow_to_region (begv, zv); Finternal__labeled_narrow_to_region (begv, zv, label);
Finternal__label_restriction (label);
record_unwind_protect (restore_point_unwind, Fpoint_marker ()); record_unwind_protect (restore_point_unwind, Fpoint_marker ());
record_unwind_protect (unwind_labeled_narrow_to_region, label); record_unwind_protect (unwind_labeled_narrow_to_region, label);
} }
@ -2885,7 +2885,6 @@ To gain access to other portions of the buffer, use
`without-restriction' with the same label. */) `without-restriction' with the same label. */)
(void) (void)
{ {
Fset (Qoutermost_restriction, Qnil);
Lisp_Object buf = Fcurrent_buffer (); Lisp_Object buf = Fcurrent_buffer ();
Lisp_Object label = labeled_restrictions_peek_label (buf); Lisp_Object label = labeled_restrictions_peek_label (buf);
@ -2967,13 +2966,6 @@ argument. To gain access to other portions of the buffer, use
if (e > zv_charpos) e = zv_charpos; if (e > zv_charpos) e = zv_charpos;
} }
/* Record the accessible range of the buffer when narrow-to-region
is called, that is, before applying the narrowing. That
information is used only by internal--label-restriction. */
Fset (Qoutermost_restriction, list3 (Qoutermost_restriction,
Fpoint_min_marker (),
Fpoint_max_marker ()));
if (BEGV != s || ZV != e) if (BEGV != s || ZV != e)
current_buffer->clip_changed = 1; current_buffer->clip_changed = 1;
@ -2989,20 +2981,18 @@ argument. To gain access to other portions of the buffer, use
return Qnil; return Qnil;
} }
DEFUN ("internal--label-restriction", Finternal__label_restriction, DEFUN ("internal--labeled-narrow-to-region", Finternal__labeled_narrow_to_region,
Sinternal__label_restriction, 1, 1, 0, Sinternal__labeled_narrow_to_region, 3, 3, 0,
doc: /* Label the current restriction with LABEL. doc: /* Restrict editing in this buffer to START-END, and label the restriction with LABEL.
This is an internal function used by `with-restriction'. */) This is an internal function used by `with-restriction'. */)
(Lisp_Object label) (Lisp_Object start, Lisp_Object end, Lisp_Object label)
{ {
Lisp_Object buf = Fcurrent_buffer (); Lisp_Object buf = Fcurrent_buffer ();
Lisp_Object outermost_restriction Lisp_Object outermost_restriction = list3 (Qoutermost_restriction,
= buffer_local_value (Qoutermost_restriction, buf); Fpoint_min_marker (),
/* If internal--label-restriction is ever called without being Fpoint_max_marker ());
preceded by narrow-to-region, do nothing. */ Fnarrow_to_region (start, end);
if (NILP (outermost_restriction))
return Qnil;
if (NILP (labeled_restrictions_peek_label (buf))) if (NILP (labeled_restrictions_peek_label (buf)))
labeled_restrictions_push (buf, outermost_restriction); labeled_restrictions_push (buf, outermost_restriction);
labeled_restrictions_push (buf, list3 (label, labeled_restrictions_push (buf, list3 (label,
@ -4865,10 +4855,6 @@ This variable is experimental; email 32252@debbugs.gnu.org if you need
it to be non-nil. */); it to be non-nil. */);
binary_as_unsigned = false; binary_as_unsigned = false;
DEFVAR_LISP ("outermost-restriction", Voutermost_restriction,
doc: /* Outermost narrowing bounds, if any. Internal use only. */);
Voutermost_restriction = Qnil;
Fmake_variable_buffer_local (Qoutermost_restriction);
DEFSYM (Qoutermost_restriction, "outermost-restriction"); DEFSYM (Qoutermost_restriction, "outermost-restriction");
Funintern (Qoutermost_restriction, Qnil); Funintern (Qoutermost_restriction, Qnil);
@ -4963,7 +4949,7 @@ it to be non-nil. */);
defsubr (&Sdelete_and_extract_region); defsubr (&Sdelete_and_extract_region);
defsubr (&Swiden); defsubr (&Swiden);
defsubr (&Snarrow_to_region); defsubr (&Snarrow_to_region);
defsubr (&Sinternal__label_restriction); defsubr (&Sinternal__labeled_narrow_to_region);
defsubr (&Sinternal__unlabel_restriction); defsubr (&Sinternal__unlabel_restriction);
defsubr (&Ssave_restriction); defsubr (&Ssave_restriction);
defsubr (&Stranspose_regions); defsubr (&Stranspose_regions);