Merge remote-tracking branch 'origin/master' into feature/android

This commit is contained in:
Po Lu 2023-06-06 21:01:56 +08:00
commit 1263531b9a
9 changed files with 95 additions and 6 deletions

View file

@ -2597,6 +2597,15 @@ It is normally @code{nil}, so that ordinary buffers have no header
line.
@end defvar
Emacs displays the header line for a window unless
@code{header-line-format} is either @code{nil}, or it's a list whose
@sc{car} is a symbol, and either that symbol is @code{:eval} and the
second list element evaluates to @code{nil} or the symbol's value as a
variable is @code{nil} or void. Note that there are other possible
values @code{header-line-format} that result in an empty header line
(for example, @code{""}), but all other values tell Emacs to display a
header line, whether or not it is empty.
If @code{display-line-numbers-mode} is turned on in a buffer
(@pxref{Display Custom, display-line-numbers-mode,, emacs, The GNU
Emacs Manual}), the buffer text is indented on display by the amount

View file

@ -6181,6 +6181,17 @@ would expect. Non-nested use of change groups for the same buffer
will get Emacs confused, so don't let it happen; the first change
group you start for any given buffer should be the last one finished.
Emacs keeps track of change groups by assuming that by following
each cdr in @code{buffer-undo-list}, it will eventually arrive at the
cons it was set to at the time @code{prepare-change-group} was called.
If @code{buffer-undo-list} no longer contains that cons, Emacs will
lose track of any change groups, resulting in an error when the change
group is cancelled. To avoid this, do not call any functions which
may edit the undo list in such a manner, when a change group is
active: notably, ``amalgamating'' commands such as @code{delete-char},
which call @code{undo-auto-amalgamate}.
@node Change Hooks
@section Change Hooks
@cindex change hooks

View file

@ -469,6 +469,14 @@ hooks named after the feature name, like 'esh-mode-unload-hook'.
+++
** 'copy-tree' now copies records when its optional 2nd argument is non-nil.
+++
** Certain values of 'header-line-format' now inhibit empty header line.
Emacs now avoids displaying a header line, instead of displaying an
empty one, when 'header-line-format' is a list whose 'car' is a
symbol, and either that symbol is ':eval' and the second element of
the list evaluates to 'nil' or the symbol's value as a variable is
'nil' or void.
* Lisp Changes in Emacs 30.1

View file

@ -453,7 +453,9 @@ happened."
;; position some markers. The real fix would be to compute the
;; result without having to modify the buffer at all.
(atomic-change-group
(delete-char -1)
;; Don't use `delete-char'; that may modify the head of the
;; undo list.
(delete-region (point) (1- (point)))
(throw
'done
(cond ((eq ?\( syntax)

View file

@ -507,9 +507,7 @@ Used by `emacs-authors-mode' and `emacs-news-mode'."
(defun eval-command-interactive-spec (command)
"Evaluate COMMAND's interactive form and return resultant list.
If COMMAND has no interactive form, return nil."
(advice-eval-interactive-spec
(cadr (or (and (symbolp command) (get command 'interactive-form))
(interactive-form command)))))
(advice-eval-interactive-spec (cadr (interactive-form command))))
(provide 'subr-x)

View file

@ -3811,6 +3811,9 @@ This means that if BODY exits abnormally,
all of its changes to the current buffer are undone.
This works regardless of whether undo is enabled in the buffer.
Do not call functions which edit the undo list within BODY; see
`prepare-change-group'.
This mechanism is transparent to ordinary use of undo;
if undo is enabled in the buffer and BODY succeeds, the
user can undo the change normally."
@ -3877,6 +3880,12 @@ Once you finish the group, don't use the handle again--don't try to
finish the same group twice. For a simple example of correct use, see
the source code of `atomic-change-group'.
As long as this handle is still in use, do not call functions
which edit the undo list: if it no longer contains its current
value, Emacs will not be able to cancel the change group. This
includes any \"amalgamating\" commands, such as `delete-char',
which call `undo-auto-amalgamate'.
The handle records only the specified buffer. To make a multibuffer
change group, call this function once for each buffer you want to
cover, then use `nconc' to combine the returned values, like this:

View file

@ -4179,6 +4179,7 @@ void set_frame_cursor_types (struct frame *, Lisp_Object);
extern void syms_of_xdisp (void);
extern void init_xdisp (void);
extern Lisp_Object safe_eval (Lisp_Object);
extern Lisp_Object safe_eval_inhibit_quit (Lisp_Object);
extern bool pos_visible_p (struct window *, ptrdiff_t, int *,
int *, int *, int *, int *, int *);

View file

@ -5474,6 +5474,48 @@ window_wants_mode_line (struct window *w)
}
/**
* null_header_line_format:
*
* Return non-zero when header line format FMT indicates that the
* header line should not be displayed at all, for windows on frame F.
*
* This is when FMT is nil, or if FMT is a cons cell and either its
* car is a symbol whose value as a variable is nil or void, or its
* car is the symbol ':eval' and its cadr evaluates to nil.
*/
static bool
null_header_line_format (Lisp_Object fmt, struct frame *f)
{
Lisp_Object car;
Lisp_Object val;
if (NILP (fmt))
return true;
if (CONSP (fmt))
{
car = XCAR (fmt);
if (SYMBOLP (car))
{
if (EQ (car, QCeval))
{
val = safe_eval_inhibit_quit (XCAR (XCDR (fmt)));
if (!FRAME_LIVE_P (f))
signal_error (":eval deleted the frame being displayed", fmt);
return NILP (val);
}
val = find_symbol_value (car);
return (SYMBOLP (car)
&& (EQ (val, Qunbound)
|| NILP (val)));
}
}
return false;
}
/**
* window_wants_header_line:
*
@ -5494,12 +5536,15 @@ window_wants_header_line (struct window *w)
Lisp_Object window_header_line_format =
window_parameter (w, Qheader_line_format);
struct frame *f = WINDOW_XFRAME(w);
return (WINDOW_LEAF_P (w)
&& !MINI_WINDOW_P (w)
&& !WINDOW_PSEUDO_P (w)
&& !EQ (window_header_line_format, Qnone)
&& (!NILP (window_header_line_format)
|| !NILP (BVAR (XBUFFER (WINDOW_BUFFER (w)), header_line_format)))
&& (!null_header_line_format (window_header_line_format, f)
|| !null_header_line_format (BVAR (XBUFFER (WINDOW_BUFFER (w)),
header_line_format), f))
&& (WINDOW_PIXEL_HEIGHT (w)
> (window_wants_mode_line (w)
? 2 * WINDOW_FRAME_LINE_HEIGHT (w)

View file

@ -3074,6 +3074,12 @@ safe__eval (bool inhibit_quit, Lisp_Object sexpr)
return safe__call1 (inhibit_quit, Qeval, sexpr);
}
Lisp_Object
safe_eval_inhibit_quit (Lisp_Object sexpr)
{
return safe__eval (true, sexpr);
}
/* Call function FN with two arguments ARG1 and ARG2.
Return the result, or nil if something went wrong. */