Merge remote-tracking branch 'origin/master' into feature/android
This commit is contained in:
commit
1263531b9a
9 changed files with 95 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
8
etc/NEWS
8
etc/NEWS
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 *);
|
||||
|
||||
|
|
49
src/window.c
49
src/window.c
|
@ -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)
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue