emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/pgtk 704b765: Merge branch 'master' of git.sv.gnu.org:/srv/git/e


From: Yuuki Harano
Subject: feature/pgtk 704b765: Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
Date: Mon, 3 May 2021 08:34:12 -0400 (EDT)

branch: feature/pgtk
commit 704b765eaaee82176e26ab084c26d65311fd46d3
Merge: 66a36f1 1dafab8
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Yuuki Harano <masm+github@masm11.me>

    Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
---
 admin/emake                             |   4 +-
 doc/emacs/help.texi                     |  43 +--
 doc/lispref/minibuf.texi                |  22 +-
 doc/lispref/variables.texi              |   3 +
 doc/misc/tramp.texi                     |  10 +-
 etc/NEWS                                |  10 +
 etc/tutorials/TUTORIAL                  |   6 +-
 etc/tutorials/TUTORIAL.es               |   6 +-
 etc/tutorials/TUTORIAL.he               |   4 +-
 etc/tutorials/TUTORIAL.it               |  34 +-
 etc/tutorials/TUTORIAL.sv               |   6 +-
 lisp/apropos.el                         |  94 +++---
 lisp/calc/calc.el                       |  14 +-
 lisp/cedet/semantic/grm-wy-boot.el      |  28 +-
 lisp/display-line-numbers.el            |  21 +-
 lisp/doc-view.el                        |   5 +
 lisp/emacs-lisp/avl-tree.el             |  61 ++--
 lisp/emacs-lisp/bytecomp.el             |   3 +-
 lisp/emacs-lisp/comp-cstr.el            |  23 +-
 lisp/emacs-lisp/comp.el                 |  45 +--
 lisp/emacs-lisp/lisp.el                 | 246 +++++++-------
 lisp/emacs-lisp/shortdoc.el             |  14 +-
 lisp/gnus/gnus-art.el                   |   4 +
 lisp/help-fns.el                        |  62 +++-
 lisp/help-macro.el                      |  20 +-
 lisp/help.el                            |   7 +-
 lisp/image.el                           |  18 +-
 lisp/ldefs-boot.el                      | 559 +++++++++++++++++++++++---------
 lisp/mail/supercite.el                  |   2 +
 lisp/menu-bar.el                        |   3 +
 lisp/minibuffer.el                      |  39 ++-
 lisp/net/tramp-archive.el               |   6 +-
 lisp/net/tramp-sh.el                    |  42 +--
 lisp/net/tramp.el                       |  66 ++--
 lisp/progmodes/cc-defs.el               |   2 +-
 lisp/progmodes/gdb-mi.el                |   2 +-
 lisp/progmodes/project.el               |   2 +-
 lisp/progmodes/ruby-mode.el             |  20 +-
 lisp/progmodes/xref.el                  |   2 +-
 lisp/replace.el                         |   3 +
 lisp/reposition.el                      | 232 ++++++-------
 lisp/simple.el                          | 112 ++++---
 lisp/startup.el                         |   4 +-
 lisp/subr.el                            |  12 +-
 lisp/textmodes/makeinfo.el              |   7 +
 lisp/textmodes/texinfo.el               | 192 +----------
 lisp/textmodes/texnfo-upd.el            |  14 +
 lisp/vc/add-log.el                      |   2 +-
 lisp/vc/ediff-util.el                   |   9 +-
 lisp/window.el                          |  44 ++-
 src/buffer.c                            |  11 +-
 src/comp.c                              |   6 +-
 src/dispextern.h                        |   2 -
 src/dispnew.c                           |  15 +-
 src/doc.c                               |   2 +-
 src/frame.c                             |  54 +--
 src/frame.h                             |   5 +
 src/gtkutil.c                           |  28 +-
 src/nsfns.m                             |   7 +-
 src/nsterm.m                            |  34 +-
 src/xterm.c                             |   5 +-
 test/lisp/calc/calc-tests.el            |  27 ++
 test/lisp/emacs-lisp/comp-cstr-tests.el |  20 +-
 test/lisp/progmodes/ruby-mode-tests.el  |  31 ++
 test/src/comp-tests.el                  |   8 +-
 65 files changed, 1372 insertions(+), 1072 deletions(-)

diff --git a/admin/emake b/admin/emake
index 834a184..29dc151 100755
--- a/admin/emake
+++ b/admin/emake
@@ -27,8 +27,7 @@ s#^Configuring local git # Configuring local git #
 s#^Installing git hooks...# Installing git hooks...#
 s#^Running # Running #
 s#^Configured for # Configured for #
-s#^./temacs # ./temacs #
-s#^Dumping under the name# Dumping under the name#
+s#^./temacs.*#  \\& #
 ' | \
 egrep --line-buffered -v "^make|\
 ^Loading|\
@@ -40,6 +39,7 @@ INFO.*Scraping.*[.]\$|\
 ^Adding name|\
 ^Dump mode|\
 ^Dumping finger|\
+^Dumping under the name|\
 ^Byte counts|\
 ^Reloc counts|\
 ^Pure-hashed|\
diff --git a/doc/emacs/help.texi b/doc/emacs/help.texi
index 81cdeb4..90a2ddc 100644
--- a/doc/emacs/help.texi
+++ b/doc/emacs/help.texi
@@ -107,8 +107,8 @@ Display the @file{*Messages*} buffer
 (@code{view-echo-area-messages}).  @xref{Misc Help}.
 @item C-h f @var{function} @key{RET}
 Display documentation on the Lisp function named @var{function}
-(@code{describe-function}).  Since commands are Lisp functions,
-this works for commands too.  @xref{Name Help}.
+(@code{describe-function}).  Since commands are Lisp functions, this
+works for commands too, but you can also use @code{C-h x}.  @xref{Name Help}.
 @item C-h h
 Display the @file{HELLO} file, which shows examples of various character
 sets.
@@ -154,6 +154,9 @@ Display the documentation of the Lisp variable @var{var}
 @item C-h w @var{command} @key{RET}
 Show which keys run the command named @var{command} (@code{where-is}).
 @xref{Key Help}.
+@item C-h x @var{command} @key{RET}
+Display documentation on the named @var{command}
+(@code{describe-command}).  @xref{Name Help}.
 @item C-h C @var{coding} @key{RET}
 Describe the coding system @var{coding}
 (@code{describe-coding-system}).  @xref{Coding Systems}.
@@ -233,31 +236,31 @@ the button.
 @node Name Help
 @section Help by Command or Variable Name
 
-@kindex C-h f
-@findex describe-function
-  @kbd{C-h f @var{function} @key{RET}} (@code{describe-function})
-displays the documentation of Lisp function @var{function}, in a
-window.  Since commands are Lisp functions, you can use this method to
-view the documentation of any command whose name you know.  For
-example,
+@kindex C-h x
+@findex describe-command
+  @kbd{C-h x @var{command} @key{RET}} (@code{describe-command})
+displays the documentation of the named @var{command}, in a
+window.  For example,
 
 @example
-C-h f auto-fill-mode @key{RET}
+C-h x auto-fill-mode @key{RET}
 @end example
 
 @noindent
-displays the documentation of @code{auto-fill-mode}.  This is the only
-way to get the documentation of a command that is not bound to any key
+displays the documentation of @code{auto-fill-mode}.  This is how you
+would get the documentation of a command that is not bound to any key
 (one which you would normally run using @kbd{M-x}).
 
-  @kbd{C-h f} is also useful for Lisp functions that you use in a Lisp
-program.  For example, if you have just written the expression
+@kindex C-h f
+@findex describe-function
+  @kbd{C-h f @var{function} @key{RET}} (@code{describe-function})
+displays the documentation of Lisp @var{function}.  This command is
+intended for Lisp functions that you use in a Lisp program.  For
+example, if you have just written the expression
 @code{(make-vector len)} and want to check that you are using
-@code{make-vector} properly, type @kbd{C-h f make-vector @key{RET}}.
-Because @kbd{C-h f} allows all function names, not just command names,
-you may find that some of your favorite completion abbreviations that
-work in @kbd{M-x} don't work in @kbd{C-h f}.  An abbreviation that is
-unique among command names may not be unique among all function names.
+@code{make-vector} properly, type @w{@kbd{C-h f make-vector @key{RET}}}.
+Additionally, since all commands are Lisp functions, you can also use
+this command to view the documentation of any command.
 
   If you type @kbd{C-h f @key{RET}}, it describes the function called
 by the innermost Lisp expression in the buffer around point,
@@ -265,7 +268,7 @@ by the innermost Lisp expression in the buffer around point,
 (That name appears as the default while you enter the argument.)  For
 example, if point is located following the text @samp{(make-vector
 (car x)}, the innermost list containing point is the one that starts
-with @samp{(make-vector}, so @kbd{C-h f @key{RET}} describes the
+with @samp{(make-vector}, so @w{@kbd{C-h f @key{RET}}} describes the
 function @code{make-vector}.
 
   @kbd{C-h f} is also useful just to verify that you spelled a
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index 72f0e58..145eee8 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -1188,9 +1188,9 @@ in the minibuffer to do completion.
 @defvar minibuffer-completion-table
 The value of this variable is the completion table (@pxref{Basic
 Completion}) used for completion in the minibuffer.  This is the
-global variable that contains what @code{completing-read} passes to
+buffer-local variable that contains what @code{completing-read} passes to
 @code{try-completion}.  It is used by minibuffer completion commands
-such as @code{minibuffer-complete-word}.
+such as @code{minibuffer-complete}.
 @end defvar
 
 @defvar minibuffer-completion-predicate
@@ -1201,7 +1201,7 @@ minibuffer completion functions.
 
 @defvar minibuffer-completion-confirm
 This variable determines whether Emacs asks for confirmation before
-exiting the minibuffer; @code{completing-read} binds this variable,
+exiting the minibuffer; @code{completing-read} sets this variable,
 and the function @code{minibuffer-complete-and-exit} checks the value
 before exiting.  If the value is @code{nil}, confirmation is not
 required.  If the value is @code{confirm}, the user may exit with an
@@ -1819,12 +1819,10 @@ default to that string.
 @item :affixation-function
 The value should be a function to add prefixes and suffixes to
 completions.  This function must accept one argument, a list of
-completions, and should return such a list of completions where
-each element contains a list of three elements: a completion,
-a prefix string, and a suffix string.  When this function
-returns a list of two elements, it is interpreted as a list
-of a completion and a suffix string like in @code{:annotation-function}.
-This function takes priority over @code{:annotation-function}.
+completions, and should return a list of annotated completions.  Each
+element of the returned list must be a three-element list, the
+completion, a prefix string, and a suffix string.  This function takes
+priority over @code{:annotation-function}.
 
 @item :exit-function
 The value should be a function to run after performing completion.
@@ -1942,10 +1940,8 @@ completions.  The function should take one argument,
 return such a list of @var{completions} where each element contains a list
 of three elements: a completion, a prefix which is displayed before
 the completion string in the @file{*Completions*} buffer, and
-a suffix displayed after the completion string.  When this function
-returns a list of two elements, it is interpreted as a list of
-a completion and a suffix string like in @code{annotation-function}.
-This function takes priority over @code{annotation-function}.
+a suffix displayed after the completion string.  This function
+takes priority over @code{annotation-function}.
 
 @item display-sort-function
 The value should be a function for sorting completions.  The function
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index 0ddf3e4..b25eea1 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -1010,6 +1010,9 @@ a dynamic local binding, Emacs records the contents of 
the value cell
 value cell.  When the binding construct finishes executing, Emacs pops
 the old value off the stack, and puts it in the value cell.
 
+  Note that when code using Dynamic Binding is native compiled the
+native compiler will not perform any Lisp specific optimization.
+
 @node Dynamic Binding Tips
 @subsection Proper Use of Dynamic Binding
 
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index e0f648f..ebfc14d 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -5100,12 +5100,12 @@ I get an error @samp{tramp-file-name-handler: Invalid 
function:
 tramp-compat-with-mutex}
 
 @value{tramp} comes with compatibility code for different Emacs
-versions.  When you see this warning, you don't use the Emacs built-in
-version of @value{tramp}.  In case you have installed @value{tramp}
-from GNU ELPA, see the package README file for instructions how to
-recompile it.
+versions.  When you see such a message (the text might differ), you
+don't use the Emacs built-in version of @value{tramp}.  In case you
+have installed @value{tramp} from GNU ELPA, see the package README
+file for instructions how to recompile it.
 @ifset installchapter
-In case you have installed it from its Git repository, @ref{Recompilation}.
+@xref{Recompilation}.
 @end ifset
 
 
diff --git a/etc/NEWS b/etc/NEWS
index 9bf232a..c2db98a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1008,6 +1008,11 @@ GTK toolkit, this is only true if 
'x-gtk-use-system-tooltips' is t.
 *** 'g' ('revert-buffer') in 'help-mode' no longer requires confirmation.
 
 +++
+*** New command 'describe-command' shows help for a command.
+This can be used instead of 'describe-function' for interactive
+commands and is globally bound to `C-h x'.
+
++++
 *** New command 'describe-keymap' describes keybindings in a keymap.
 
 ---
@@ -2450,6 +2455,11 @@ This is to keep the same behavior as Eshell.
 * Incompatible Lisp Changes in Emacs 28.1
 
 +++
+** 'completing-read-default' sets completion variables buffer-locally.
+'minibuffer-completion-table' and related variables are now set buffer-locally
+in the minibuffer instead of being set via a global let-binding.
+
++++
 ** The use of positional arguments in 'define-minor-mode' is obsolete.
 These were actually rendered obsolete in Emacs-21 but were never
 marked as such.
diff --git a/etc/tutorials/TUTORIAL b/etc/tutorials/TUTORIAL
index 6194e55..dcdb61f 100644
--- a/etc/tutorials/TUTORIAL
+++ b/etc/tutorials/TUTORIAL
@@ -1038,10 +1038,10 @@ then type C-x 1.
 
 Here are some other useful C-h options:
 
-   C-h f       Describe a function.  You type in the name of the
-               function.
+   C-h x       Describe a command.  You type in the name of the
+               command.
 
->> Try typing C-h f previous-line <Return>.
+>> Try typing C-h x previous-line <Return>.
    This displays all the information Emacs has about the
    function which implements the C-p command.
 
diff --git a/etc/tutorials/TUTORIAL.es b/etc/tutorials/TUTORIAL.es
index 786a9f4..0bd0614 100644
--- a/etc/tutorials/TUTORIAL.es
+++ b/etc/tutorials/TUTORIAL.es
@@ -1091,10 +1091,10 @@ ayuda, y entonces teclear C-x 1.
 
 Aquí hay algunas otras opciones útiles de C-h:
 
-   C-h f       Describe una función.  Usted teclea el nombre de la
-               función.
+   C-h x       Describe un comando.  Usted teclea el nombre de la
+               comando.
 
->> Intente teclear C-h f previous-line <Return>.
+>> Intente teclear C-h x previous-line <Return>.
    Esto muestra toda la información que Emacs tiene sobre la función
    que implementa el comando C-p
 
diff --git a/etc/tutorials/TUTORIAL.he b/etc/tutorials/TUTORIAL.he
index 5cd1cac..2ee4f74 100644
--- a/etc/tutorials/TUTORIAL.he
+++ b/etc/tutorials/TUTORIAL.he
@@ -931,9 +931,9 @@ M-x help <Return>‎ כתחליף.)
 
 הנה עוד כמה פקודות עזרה שימושיות:
 
-    ‏C-h f     תן הסבר על פונקציה. יש להקיש את שם הפונקציה.
+    ‏C-h x     תן הסבר על פקודה. יש להקיש את שם הפקודה.
 
->> נסו להקיש C-h f previous-line <Return>‎.
+>> נסו להקיש C-h x previous-line <Return>‎.
    כתוצאה, יוצג תיעוד מלא של הפונקציה המממשת את הפקודה C-p כפי שהוא
    ידוע ל־Emacs.
 
diff --git a/etc/tutorials/TUTORIAL.it b/etc/tutorials/TUTORIAL.it
index ac59379..68bf403 100644
--- a/etc/tutorials/TUTORIAL.it
+++ b/etc/tutorials/TUTORIAL.it
@@ -578,7 +578,7 @@ originale in modo da conservarlo.  Il nuovo nome è ottenuto
 aggiungendo un carattere "~" alla fine del nome originale.  Quando il
 salvataggio termina, Emacs mostra il nome del file scritto.
 
->> Premi C-x C-s TUTORIAL<Invio>.
+>> Premi C-x C-s TUTORIAL <Invio>.
    Questo dovrebbe salvare questa esercitazione in un file chiamato
    “TUTORIAL” e mostrare “Wrote ...TUTORIAL nella parte bassa dello
    schermo.
@@ -623,8 +623,8 @@ file, puoi farlo visitando di nuovo quel file usando C-x 
C-f.  Ma c'è
 un modo più semplice: usa il comando C-x b.  Questo comando richiede
 il nome del buffer.
 
->> Crea un file chiamato “pippo” con C-x C-f pippo<Invio>.
-   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
+>> Crea un file chiamato “pippo” con C-x C-f pippo <Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL <Invio>.
 
 La maggior parte delle volte, il nome del buffer corrisponde al nome
 del file (senza la parte relativa alla directory).  Questo non è
@@ -641,8 +641,8 @@ Anche il buffer chiamato “*Messages* non è associato ad 
alcun file.
 Quel buffer contiene tutti i messaggi che sono apparsi nella parte
 bassa dello schermo durante la sessione di Emacs.
 
->> Passa al buffer con i messaggi con C-x b *Messages*<Invio>.
-   Torna poi a questa esercitazione con C-x b TUTORIAL<Invio>.
+>> Passa al buffer con i messaggi con C-x b *Messages* <Invio>.
+   Torna poi a questa esercitazione con C-x b TUTORIAL <Invio>.
 
 Se si modifica in qualche modo il testo di un file e poi si visita un
 altro file questo non comporta il salvataggio del primo.  Le modifiche
@@ -752,7 +752,7 @@ salvataggio automatico.
 Se il computer si blocca si può recuperare il file salvato
 automaticamente aprendo il file in modo normale (il file che si stava
 scrivendo, non quello di salvataggio automatico) e usando poi M-x
-recover-this-file<Invio>.  Quando viene chiesta la conferma si risponda
+recover-this-file <Invio>.  Quando viene chiesta la conferma si risponda
 con yes<Invio> per procedere con il recupero dei dati salvati
 automaticamente.
 
@@ -818,7 +818,7 @@ fundamental-mode è il comando per attivare la modalità 
primaria
 Se si vuole inserire del testo in italiano, come questo file,
 probabilmente è più adeguata la modalità testo.
 
->> Inserisci M-x text-mode<Invio>.
+>> Inserisci M-x text-mode <Invio>.
 
 Non preoccuparti, nessuno dei comandi che hai imparato verrà
 modificato in modo sostanziale.  Tuttavia adesso puoi osservare come
@@ -853,14 +853,14 @@ testo, è la modalità “Auto Fill” (riempimento 
automatico).  Quando
 questa modalità è attiva, Emacs interrompe la riga tra due parole ogni
 volta che, nel corso dell'inserimento, essa diventa troppo lunga.
 
-Si può attivare il modo “Auto Fill” con M-x auto-fill-mode<Invio>.
+Si può attivare il modo “Auto Fill” con M-x auto-fill-mode <Invio>.
 Quando la modalità suddetta è attiva può essere disattivata eseguendo
-di nuovo M-x auto-fill-mode<Invio>.  Se la modalità è disattivata
+di nuovo M-x auto-fill-mode <Invio>.  Se la modalità è disattivata
 questo comando la attiva, viceversa se è già attiva.  Un comando che
 funziona così si comporta come un interruttore, attiva o disattiva
 qualcosa ogni volta che viene premuto.
 
->> Usa M-x auto fill mode<Invio> adesso.  Inserisci una riga di “asdf ”
+>> Usa M-x auto fill mode <Invio> adesso.  Inserisci una riga di “asdf ”
    ripetuti fino a quando non la vedi dividersi in due righe.  Devi
    interporre degli spazi perché la modalità Auto Fill spezza le righe
    solo in corrispondenza di uno spazio.
@@ -1021,13 +1021,13 @@ chiamano “finestra”, ed è possibile mostrarne più di uno
 contemporaneamente.  Su un terminale testuale, è possibile mostrare un
 solo frame alla volta.
 
->> Usa M-x make-frame<Invio>.
+>> Usa M-x make-frame <Invio>.
    Un nuovo frame dovrebbe apparire sullo schermo.
 
 In questo nuovo frame puoi svolgere qualsiasi cosa come nel frame
 originale.  Non c'è nulla di speciale nel primo frame.
 
->> Usa M-x delete-frame<Invio>.
+>> Usa M-x delete-frame <Invio>.
    Questo rimuove il frame selezionato.
 
 Puoi anche eliminare un frame usando i metodi offerti dal sistema
@@ -1076,7 +1076,7 @@ aiuto che può fornire.  Se si è attivato l'aiuto con C-h 
e si decide
 che non serve più si può annullare la richiesta con C-g.
 
 (Se C-h non mostra un messaggio relativo all'aiuto nella parte bassa
-dello schermo, prova ad usare il tasto F1 oppure con M-x help<Invio>.)
+dello schermo, prova ad usare il tasto F1 oppure con M-x help <Invio>.)
 
 La forma base di aiuto è data da C-h c.  Si inserisce C-h, il
 carattere c e poi un carattere o una sequenza di caratteri; Emacs
@@ -1110,9 +1110,9 @@ mentre fai riferimento al testo di aiuto e poi usare un 
C-x 1.
 
 Ecco altre utili opzioni di C-h:
 
-       C-h f   Descrive una funzione.  Inserisci il nome della funzione.
+       C-h x   Descrive un comando.  Inserisci il nome della comando.
 
->> Prova con C-h f previous-line<Invio>.
+>> Prova con C-h x previous-line <Invio>.
    Questo mostrerà tutte le informazioni che Emacs possiede sulla
    funzione che implementa il comando C-p.
 
@@ -1128,7 +1128,7 @@ variabile quando Emacs lo richiede.
                una sequenza di uno o due caratteri che serve a far
                partire il comando senza doverlo inserire per esteso.
 
->> Prova C-h a file<Invio>
+>> Prova C-h a file <Invio>
 
 Questo mostrerà in un'altra finestra una lista di tutti i comandi che
 contengono la parola “file” nel nome.  Nella lista si vedranno
@@ -1143,7 +1143,7 @@ esteso come find-file.
    C-h i       Leggi la documentazione.  Questo comando apre un
                buffer speciale chiamato “*info*” in cui puoi leggere
                i manuali on-line dei pacchetti installati sul tuo
-               sistema.  Batti m emacs<Invio> per leggere il manuale
+               sistema.  Batti m emacs <Invio> per leggere il manuale
                di Emacs.  Se non hai mai usato il sistema Info prima
                d'ora premi ? ed Emacs ti guiderà nell'uso delle
                opzioni del modo Info.  Una volta terminata questa
diff --git a/etc/tutorials/TUTORIAL.sv b/etc/tutorials/TUTORIAL.sv
index 1eab267..cbe9cfc 100644
--- a/etc/tutorials/TUTORIAL.sv
+++ b/etc/tutorials/TUTORIAL.sv
@@ -1056,10 +1056,10 @@ att först senare ta bort fönstret med C-x 1.
 
 Här är fler varianter på C-h:
 
-   C-h f        Beskriv en funktion. Du skriver in funktionsnamnet.
+   C-h f        Beskriv ett kommando. Du skriver in kommandots namn.
 
->> Prova att skriva C-h f previous-line<Return>.
-   Detta ger den information Emacs har om funktionen
+>> Prova att skriva C-h x previous-line <Return>.
+   Detta visar den information Emacs har om den funktion
    som implementerar kommandot C-p.
 
 Ett liknande kommando, C-h v, visar dokumentationen för de variabler
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 86cdf23..17665a7 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -145,11 +145,11 @@ If value is `verbose', the computed score is shown for 
each match."
     ;; Use `apropos-follow' instead of just using the button
     ;; definition of RET, so that users can use it anywhere in an
     ;; apropos item, not just on top of a button.
-    (define-key map "\C-m" 'apropos-follow)
+    (define-key map "\C-m" #'apropos-follow)
 
     ;; Movement keys
-    (define-key map "n" 'apropos-next-symbol)
-    (define-key map "p" 'apropos-previous-symbol)
+    (define-key map "n" #'apropos-next-symbol)
+    (define-key map "p" #'apropos-previous-symbol)
     map)
   "Keymap used in Apropos mode.")
 
@@ -347,7 +347,7 @@ WILD should be a subexpression matching wildcards between 
matches."
      (lambda (w)
        (concat "\\(?:" w "\\)" ;; parens for synonyms
                wild "\\(?:"
-               (mapconcat 'identity
+               (mapconcat #'identity
                          (delq w (copy-sequence words))
                          "\\|")
                "\\)"))
@@ -389,14 +389,14 @@ This updates variables `apropos-pattern', 
`apropos-pattern-quoted',
       ;; use a trick that would find a match even if the words are
       ;; on different lines.
       (let ((words pattern))
-       (setq apropos-pattern (mapconcat 'identity pattern " ")
+       (setq apropos-pattern (mapconcat #'identity pattern " ")
              apropos-pattern-quoted (regexp-quote apropos-pattern))
        (dolist (word words)
          (let ((syn apropos-synonyms) (s word) (a word))
            (while syn
              (if (member word (car syn))
                  (progn
-                   (setq a (mapconcat 'identity (car syn) "\\|"))
+                   (setq a (mapconcat #'identity (car syn) "\\|"))
                    (if (member word (cdr (car syn)))
                        (setq s a))
                    (setq syn nil))
@@ -513,7 +513,7 @@ variables, not just user options."
                       #'(lambda (symbol)
                           (and (boundp symbol)
                                (get symbol 'variable-documentation)))
-                    'custom-variable-p)))
+                    #'custom-variable-p)))
 
 ;;;###autoload
 (defun apropos-variable (pattern &optional do-not-all)
@@ -556,7 +556,7 @@ or a non-nil `apropos-do-all' argument."
 
 ;; For auld lang syne:
 ;;;###autoload
-(defalias 'command-apropos 'apropos-command)
+(defalias 'command-apropos #'apropos-command)
 ;;;###autoload
 (defun apropos-command (pattern &optional do-all var-predicate)
   "Show commands (interactively callable functions) that match PATTERN.
@@ -685,7 +685,7 @@ FILE should be one of the libraries currently loaded and 
should
 thus be found in `load-history'.  If `apropos-do-all' is non-nil,
 the output includes key-bindings of commands."
   (interactive
-   (let* ((libs (delq nil (mapcar 'car load-history)))
+   (let* ((libs (delq nil (mapcar #'car load-history)))
           (libs
            (nconc (delq nil
                         (mapcar
@@ -731,9 +731,9 @@ the output includes key-bindings of commands."
         (format-message
                 "Library `%s' provides: %s\nand requires: %s"
                 file
-                (mapconcat 'apropos-library-button
+                (mapconcat #'apropos-library-button
                            (or provides '(nil)) " and ")
-                (mapconcat 'apropos-library-button
+                (mapconcat #'apropos-library-button
                            (or requires '(nil)) " and ")))))))
 
 (defun apropos-symbols-internal (symbols keys &optional text)
@@ -809,34 +809,34 @@ Returns list of symbols and values found."
   (apropos-parse-pattern pattern t)
   (or do-all (setq do-all apropos-do-all))
   (setq apropos-accumulator ())
-   (let (f v p)
-     (mapatoms
-      (lambda (symbol)
-       (setq f nil v nil p nil)
-       (or (memq symbol '(apropos-regexp
-                          apropos-pattern apropos-all-words-regexp
-                          apropos-words apropos-all-words
-                          do-all apropos-accumulator
-                          symbol f v p))
-           (setq v (apropos-value-internal 'boundp symbol 'symbol-value)))
-       (if do-all
-           (setq f (apropos-value-internal 'fboundp symbol 'symbol-function)
-                 p (apropos-format-plist symbol "\n    " t)))
-       (if (apropos-false-hit-str v)
-           (setq v nil))
-       (if (apropos-false-hit-str f)
-           (setq f nil))
-       (if (apropos-false-hit-str p)
-           (setq p nil))
-       (if (or f v p)
-           (setq apropos-accumulator (cons (list symbol
-                                                 (+ (apropos-score-str f)
-                                                    (apropos-score-str v)
-                                                    (apropos-score-str p))
-                                                 f v p)
-                                           apropos-accumulator))))))
-   (let ((apropos-multi-type do-all))
-     (apropos-print nil "\n----------------\n")))
+  (let (f v p)
+    (mapatoms
+     (lambda (symbol)
+       (setq f nil v nil p nil)
+       (or (memq symbol '(apropos-regexp
+                          apropos--current apropos-pattern-quoted pattern
+                         apropos-pattern apropos-all-words-regexp
+                         apropos-words apropos-all-words
+                         apropos-accumulator))
+           (setq v (apropos-value-internal #'boundp symbol #'symbol-value)))
+       (if do-all
+           (setq f (apropos-value-internal #'fboundp symbol #'symbol-function)
+                p (apropos-format-plist symbol "\n    " t)))
+       (if (apropos-false-hit-str v)
+           (setq v nil))
+       (if (apropos-false-hit-str f)
+           (setq f nil))
+       (if (apropos-false-hit-str p)
+           (setq p nil))
+       (if (or f v p)
+           (setq apropos-accumulator (cons (list symbol
+                                                (+ (apropos-score-str f)
+                                                   (apropos-score-str v)
+                                                   (apropos-score-str p))
+                                                f v p)
+                                          apropos-accumulator))))))
+  (let ((apropos-multi-type do-all))
+    (apropos-print nil "\n----------------\n")))
 
 ;;;###autoload
 (defun apropos-local-value (pattern &optional buffer)
@@ -851,9 +851,11 @@ Optional arg BUFFER (default: current buffer) is the 
buffer to check."
   (let ((var             nil))
     (mapatoms
      (lambda (symb)
-       (unless (memq symb '(apropos-regexp apropos-pattern 
apropos-all-words-regexp
-                            apropos-words apropos-all-words 
apropos-accumulator symb var))
-         (setq var  (apropos-value-internal 'local-variable-if-set-p symb 
'symbol-value)))
+       (unless (memq symb '(apropos-regexp apropos-pattern
+                            apropos-all-words-regexp apropos-words
+                            apropos-all-words apropos-accumulator))
+         (setq var  (apropos-value-internal #'local-variable-if-set-p symb
+                                            #'symbol-value)))
        (when (and (fboundp 'apropos-false-hit-str)  (apropos-false-hit-str 
var))
          (setq var nil))
        (when var
@@ -928,7 +930,13 @@ Returns list of symbols and documentation found."
 
 (defun apropos-value-internal (predicate symbol function)
   (when (funcall predicate symbol)
-    (setq symbol (prin1-to-string (funcall function symbol)))
+    (setq symbol (prin1-to-string
+                  (if (memq symbol '(command-history minibuffer-history))
+                      ;; The value we're looking for will always be in
+                      ;; the first element of these two lists, so skip
+                      ;; that value.
+                      (cdr (funcall function symbol))
+                    (funcall function symbol))))
     (when (string-match apropos-regexp symbol)
       (if apropos-match-face
           (put-text-property (match-beginning 0) (match-end 0)
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index ec09abb..1e7d5e7 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -483,6 +483,11 @@ current precision are displayed in scientific notation in 
calc-mode.")
   "Floating-point numbers with this negative exponent or lower are displayed
 scientific notation in calc-mode.")
 
+(defvar calc-digit-after-point nil
+  "If t, display at least one digit after the decimal point, as in `12.0'.
+If nil, the decimal point may come last in a number, as in `12.'.
+This setting only applies to floats in normal display mode.")
+
 (defvar calc-other-modes nil
   "List of used-defined strings to append to Calculator mode line.")
 
@@ -3184,7 +3189,8 @@ the United States."
                      exp (- exp adj)))))
          (setq str (int-to-string mant))
          (let* ((len (length str))
-                (dpos (+ exp len)))
+                (dpos (+ exp len))
+                 (trailing-0 (and calc-digit-after-point "0")))
            (if (and (eq fmt 'float)
                     (<= dpos (+ calc-internal-prec calc-display-sci-high))
                     (>= dpos (+ calc-display-sci-low 2)))
@@ -3194,9 +3200,11 @@ the United States."
                    (setq str (concat "0" point str)))
                   ((and (<= exp 0) (> dpos 0))
                    (setq str (concat (substring str 0 dpos) point
-                                     (substring str dpos))))
+                                     (substring str dpos)
+                                      (and (>= dpos len) trailing-0))))
                   ((> exp 0)
-                   (setq str (concat str (make-string exp ?0) point)))
+                   (setq str (concat str (make-string exp ?0)
+                                      point trailing-0)))
                   (t   ; (< dpos 0)
                    (setq str (concat "0" point
                                      (make-string (- dpos) ?0) str))))
diff --git a/lisp/cedet/semantic/grm-wy-boot.el 
b/lisp/cedet/semantic/grm-wy-boot.el
index b301403..a6bf211 100644
--- a/lisp/cedet/semantic/grm-wy-boot.el
+++ b/lisp/cedet/semantic/grm-wy-boot.el
@@ -436,12 +436,6 @@
 
 ;;; Analyzers
 ;;
-(define-lex-regex-type-analyzer semantic-grammar-wy--<symbol>-regexp-analyzer
-  "regexp analyzer for <symbol> tokens."
-  ":?\\(\\sw\\|\\s_\\)+"
-  '((PERCENT_PERCENT . "\\`%%\\'"))
-  'SYMBOL)
-
 (define-lex-keyword-type-analyzer 
semantic-grammar-wy--<keyword>-keyword-analyzer
   "keyword analyzer for <keyword> tokens."
   "\\(\\sw\\|\\s_\\)+")
@@ -452,10 +446,10 @@
   nil
   'CHARACTER)
 
-(define-lex-sexp-type-analyzer semantic-grammar-wy--<qlist>-sexp-analyzer
-  "sexp analyzer for <qlist> tokens."
-  "\\s'\\s-*("
-  'PREFIXED_LIST)
+(define-lex-sexp-type-analyzer semantic-grammar-wy--<string>-sexp-analyzer
+  "sexp analyzer for <string> tokens."
+  "\\s\""
+  'STRING)
 
 (define-lex-block-type-analyzer semantic-grammar-wy--<block>-block-analyzer
   "block analyzer for <block> tokens."
@@ -476,10 +470,16 @@
     (COLON . ":"))
   'punctuation)
 
-(define-lex-sexp-type-analyzer semantic-grammar-wy--<string>-sexp-analyzer
-  "sexp analyzer for <string> tokens."
-  "\\s\""
-  'STRING)
+(define-lex-regex-type-analyzer semantic-grammar-wy--<symbol>-regexp-analyzer
+  "regexp analyzer for <symbol> tokens."
+  ":?\\(\\sw\\|\\s_\\)+"
+  '((PERCENT_PERCENT . "\\`%%\\'"))
+  'SYMBOL)
+
+(define-lex-sexp-type-analyzer semantic-grammar-wy--<qlist>-sexp-analyzer
+  "sexp analyzer for <qlist> tokens."
+  "\\s'\\s-*("
+  'PREFIXED_LIST)
 
 (define-lex-sexp-type-analyzer semantic-grammar-wy--<sexp>-sexp-analyzer
   "sexp analyzer for <sexp> tokens."
diff --git a/lisp/display-line-numbers.el b/lisp/display-line-numbers.el
index a6fa813..7292849 100644
--- a/lisp/display-line-numbers.el
+++ b/lisp/display-line-numbers.el
@@ -56,12 +56,17 @@ See `display-line-numbers' for value options."
 
 (defcustom display-line-numbers-width-start nil
   "If non-nil, count number of lines to use for line number width.
-When `display-line-numbers-mode' is turned on,
-`display-line-numbers-width' is set to the minimum width necessary
-to display all line numbers in the buffer."
+When `display-line-numbers-mode' is turned on, if this option is
+non-nil, `display-line-numbers-width' is set up front to a width
+necessary to display all line numbers in the buffer.  If the value
+is a positive number, it is interpreted as extra lines to account
+for when computing the required width; this should be set to the
+number of lines in the tallest window in which you want to prevent
+the line-number width from changing."
   :group 'display-line-numbers
-  :type 'boolean
-  :version "26.1")
+  :type '(choice (boolean :tag "Minimum width for buffer's line count")
+                 (integer :tag "Number of extra lines to account for"))
+  :version "28.1")
 
 (defun display-line-numbers-update-width ()
   "Prevent the line number width from shrinking."
@@ -83,7 +88,11 @@ the mode is on, set `display-line-numbers' directly."
         (when display-line-numbers-width-start
           (setq display-line-numbers-width
                 (length (number-to-string
-                         (count-lines (point-min) (point-max))))))
+                         (+ (count-lines (point-min) (point-max))
+                            (if (and (numberp display-line-numbers-width-start)
+                                     (> display-line-numbers-width-start 0))
+                                display-line-numbers-width-start
+                              0))))))
         (when display-line-numbers-grow-only
           (add-hook 'pre-command-hook #'display-line-numbers-update-width nil 
t))
         (setq display-line-numbers display-line-numbers-type))
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 0ae2293..a0ffcac 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -1913,6 +1913,11 @@ toggle between displaying the document or editing it as 
text.
     (unless (memq doc-view-doc-type '(ps))
       (setq-local require-final-newline nil))
 
+    ;; These modes will just display "1", so they're not very useful
+    ;; in this mode.
+    (setq-local global-linum-mode nil
+                display-line-numbers-mode nil)
+
     (doc-view-make-safe-dir doc-view-cache-directory)
     ;; Handle compressed files, remote files, files inside archives
     (setq-local doc-view--buffer-file-name
diff --git a/lisp/emacs-lisp/avl-tree.el b/lisp/emacs-lisp/avl-tree.el
index 75c7322..4382985 100644
--- a/lisp/emacs-lisp/avl-tree.el
+++ b/lisp/emacs-lisp/avl-tree.el
@@ -74,7 +74,7 @@
   cmpfun)
 
 (defmacro avl-tree--root (tree)
-  ;; Return the root node for an AVL tree.  INTERNAL USE ONLY.
+  "Return the root node for an AVL TREE.  INTERNAL USE ONLY."
   `(avl-tree--node-left (avl-tree--dummyroot ,tree)))
 
 ;; ----------------------------------------------------------------
@@ -117,11 +117,11 @@ NODE is the node, and BRANCH is the branch.
   `(- 1 ,dir))
 
 (defmacro avl-tree--dir-to-sign (dir)
-  "Convert direction (0,1) to sign factor (-1,+1)."
+  "Convert direction DIR (0,1) to sign factor (-1,+1)."
   `(1- (* 2 ,dir)))
 
 (defmacro avl-tree--sign-to-dir (dir)
-  "Convert sign factor (-x,+x) to direction (0,1)."
+  "Convert sign factor in DIR (-x,+x) to direction (0,1)."
   `(if (< ,dir 0) 0 1))
 
 
@@ -129,7 +129,7 @@ NODE is the node, and BRANCH is the branch.
 ;;                          Deleting data
 
 (defun avl-tree--del-balance (node branch dir)
-  "Rebalance a tree after deleting a node.
+  "Rebalance a tree after deleting a NODE.
 The deletion was done from the left (DIR=0) or right (DIR=1) sub-tree
 of the left (BRANCH=0) or right (BRANCH=1) child of NODE.
 Return t if the height of the tree has shrunk."
@@ -247,9 +247,9 @@ the related data."
 ;;                           Entering data
 
 (defun avl-tree--enter-balance (node branch dir)
-  "Rebalance tree after an insertion
-into the left (DIR=0) or right (DIR=1) sub-tree of the
-left (BRANCH=0) or right (BRANCH=1) child of NODE.
+  "Rebalance tree after insertion of NODE.
+NODE was inserted into the left (DIR=0) or right (DIR=1) sub-tree
+of the left (BRANCH=0) or right (BRANCH=1) child of NODE.
 Return t if the height of the tree has grown."
   (let ((br (avl-tree--node-branch node branch))
        ;; opposite direction: 0,1 -> 1,0
@@ -337,7 +337,7 @@ inserted data."
       ))))
 
 (defun avl-tree--check (tree)
-  "Check the tree's balance."
+  "Check the balance of TREE."
   (avl-tree--check-node (avl-tree--root tree)))
 (defun avl-tree--check-node (node)
   (if (null node) 0
@@ -379,7 +379,8 @@ itself."
 
 ;;; INTERNAL USE ONLY
 (defun avl-tree--do-copy (root)
-  "Copy the AVL tree with ROOT as root.  Highly recursive."
+  "Copy the AVL tree wiath ROOT as root.
+This function is highly recursive."
   (if (null root)
       nil
     (avl-tree--node-create
@@ -405,8 +406,9 @@ itself."
 \n(fn OBJ)")
 
 (defun avl-tree--stack-repopulate (stack)
-  ;; Recursively push children of the node at the head of STACK onto the
-  ;; front of the STACK, until a leaf is reached.
+  "Recursively push children of STACK onto the front.
+This pushes the children of the node at the head of STACK onto
+the front of STACK, until a leaf node is reached."
   (let ((node (car (avl-tree--stack-store stack)))
        (dir (if (avl-tree--stack-reverse stack) 1 0)))
     (when node  ; check for empty stack
@@ -429,7 +431,7 @@ and returns non-nil if A is less than B, and nil otherwise.
 \n(fn TREE)")
 
 (defun avl-tree-empty (tree)
-  "Return t if AVL tree TREE is empty, otherwise return nil."
+  "Return t if AVL TREE is empty, otherwise return nil."
   (null (avl-tree--root tree)))
 
 (defun avl-tree-enter (tree data &optional updatefun)
@@ -451,7 +453,7 @@ Returns the new data."
                           0 data updatefun)))
 
 (defun avl-tree-delete (tree data &optional test nilflag)
-  "Delete the element matching DATA from the AVL tree TREE.
+  "Delete the element matching DATA from the AVL TREE.
 Matching uses the comparison function previously specified in
 `avl-tree-create' when TREE was created.
 
@@ -473,7 +475,7 @@ value is non-nil."
 
 
 (defun avl-tree-member (tree data &optional nilflag)
-  "Return the element in the AVL tree TREE which matches DATA.
+  "Return the element in the AVL TREE which matches DATA.
 Matching uses the comparison function previously specified in
 `avl-tree-create' when TREE was created.
 
@@ -496,7 +498,7 @@ for you.)"
 
 
 (defun avl-tree-member-p (tree data)
-  "Return t if an element matching DATA exists in the AVL tree TREE.
+  "Return t if an element matching DATA exists in the AVL TREE.
 Otherwise return nil.  Matching uses the comparison function
 previously specified in `avl-tree-create' when TREE was created."
   (let ((flag '(nil)))
@@ -504,13 +506,13 @@ previously specified in `avl-tree-create' when TREE was 
created."
 
 
 (defun avl-tree-map (fun tree &optional reverse)
-  "Modify all elements in the AVL tree TREE by applying FUNCTION.
+  "Modify all elements in the AVL TREE by applying function FUN.
 
-Each element is replaced by the return value of FUNCTION applied
-to that element.
+Each element is replaced by the return value of FUN applied to
+that element.
 
-FUNCTION is applied to the elements in ascending order, or
-descending order if REVERSE is non-nil."
+FUN is applied to the elements in ascending order, or descending
+order if REVERSE is non-nil."
   (avl-tree--mapc
    (lambda (node)
      (setf (avl-tree--node-data node)
@@ -520,8 +522,7 @@ descending order if REVERSE is non-nil."
 
 
 (defun avl-tree-mapc (fun tree &optional reverse)
-  "Apply FUNCTION to all elements in AVL tree TREE,
-for side-effect only.
+  "Apply function FUN to all elements in AVL TREE, for side-effect only.
 
 FUNCTION is applied to the elements in ascending order, or
 descending order if REVERSE is non-nil."
@@ -534,8 +535,7 @@ descending order if REVERSE is non-nil."
 
 (defun avl-tree-mapf
   (fun combinator tree &optional reverse)
-  "Apply FUNCTION to all elements in AVL tree TREE,
-and combine the results using COMBINATOR.
+  "Apply FUN to all elements in AVL TREE, combine results using COMBINATOR.
 
 The FUNCTION is applied and the results are combined in ascending
 order, or descending order if REVERSE is non-nil."
@@ -553,8 +553,7 @@ order, or descending order if REVERSE is non-nil."
 
 
 (defun avl-tree-mapcar (fun tree &optional reverse)
-  "Apply function FUN to all elements in AVL tree TREE,
-and make a list of the results.
+  "Apply FUN to all elements in AVL TREE, and make a list of the results.
 
 The function is applied and the list constructed in ascending
 order, or descending order if REVERSE is non-nil.
@@ -586,7 +585,7 @@ is more efficient."
       (avl-tree--node-data node))))
 
 (defun avl-tree-copy (tree)
-  "Return a copy of the AVL tree TREE."
+  "Return a copy of the AVL TREE."
   (let ((new-tree (avl-tree-create (avl-tree--cmpfun tree))))
     (setf (avl-tree--root new-tree) (avl-tree--do-copy (avl-tree--root tree)))
     new-tree))
@@ -608,13 +607,12 @@ is more efficient."
     treesize))
 
 (defun avl-tree-clear (tree)
-  "Clear the AVL tree TREE."
+  "Clear the AVL TREE."
   (setf (avl-tree--root tree) nil))
 
 
 (defun avl-tree-stack (tree &optional reverse)
-  "Return an object that behaves like a sorted stack
-of all elements of TREE.
+  "Return an object that behaves like a sorted stack of all elements of TREE.
 
 If REVERSE is non-nil, the stack is sorted in reverse order.
 \(See also `avl-tree-stack-pop').
@@ -655,8 +653,7 @@ a null element stored in the AVL tree.)"
 
 
 (defun avl-tree-stack-first (avl-tree-stack &optional nilflag)
-  "Return the first element of AVL-TREE-STACK, without removing it
-from the stack.
+  "Return the first element of AVL-TREE-STACK, without removing it from stack.
 
 Returns nil if the stack is empty, or NILFLAG if specified.
 \(The latter allows an empty stack to be distinguished from
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 9be54ca..e93cee9 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -5311,7 +5311,8 @@ already up-to-date."
   "Reload any Lisp file that was changed since Emacs was dumped.
 Use with caution."
   (let* ((argv0 (car command-line-args))
-         (emacs-file (or (cdr (nth 2 (pdumper-stats)))
+         (emacs-file (or (and (fboundp 'pdumper-stats)
+                              (cdr (nth 2 (pdumper-stats))))
                          (executable-find argv0))))
     (if (not (and emacs-file (file-exists-p emacs-file)))
         (message "Can't find %s to refresh preloaded Lisp files" argv0)
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el
index 2a50ceb..3c55782 100644
--- a/lisp/emacs-lisp/comp-cstr.el
+++ b/lisp/emacs-lisp/comp-cstr.el
@@ -190,13 +190,18 @@ Return them as multiple value."
 
 (defun comp-normalize-valset (valset)
   "Sort and remove duplicates from VALSET then return it."
-  (cl-remove-duplicates
-   (cl-sort valset (lambda (x y)
-                     ;; We might want to use `sxhash-eql' for speed but
-                     ;; this is safer to keep tests stable.
-                     (< (sxhash-equal x)
-                       (sxhash-equal y))))
-   :test #'eq))
+  (cl-sort (cl-remove-duplicates valset :test #'eq)
+           (lambda (x y)
+             (cond
+              ((and (symbolp x) (symbolp y))
+               (string< x y))
+              ((and (symbolp x) (not (symbolp y)))
+               t)
+              ((and (not (symbolp x)) (symbolp y))
+               nil)
+              (t
+               (< (sxhash-equal x)
+                  (sxhash-equal y)))))))
 
 (defun comp-union-valsets (&rest valsets)
   "Union values present into VALSETS."
@@ -790,7 +795,9 @@ Non memoized version of `comp-cstr-intersection-no-mem'."
 
             (setf (range pos)
                   (comp-range-intersection (range pos)
-                                           (comp-range-negation (range neg))))
+                                           (comp-range-negation (range neg)))
+                  (valset pos)
+                  (cl-set-difference (valset pos) (valset neg)))
 
             ;; Return a non negated form.
             (setf (typeset dst) (typeset pos)
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 5b2dbe1..0ebaccb 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -162,7 +162,7 @@ if `confirm-kill-processes' is non-nil."
   :version "28.1")
 
 (defcustom comp-native-driver-options nil
-  "Options passed verbatim to the native compiler's backend driver.
+  "Options passed verbatim to the native compiler's back-end driver.
 Note that not all options are meaningful; typically only the options
 affecting the assembler and linker are likely to be useful.
 
@@ -189,7 +189,8 @@ compilation mechanism."
   "Non-nil to prevent native-compiling of Emacs Lisp code.
 Note that when `no-byte-compile' is set to non-nil it overrides the value of
 `no-native-compile'.
-This is normally set in local file variables at the end of the elisp file:
+This is normally set in local file variables at the end of the
+Emacs Lisp file:
 
 \;; Local Variables:\n;; no-native-compile: t\n;; End:")
 ;;;###autoload(put 'no-native-compile 'safe-local-variable 'booleanp)
@@ -236,7 +237,7 @@ Can be one of: 'd-default', 'd-impure' or 'd-ephemeral'.  
See `comp-ctxt'.")
 
 (defvar comp-disabled-passes '()
   "List of disabled passes.
-For internal use only by the testsuite.")
+For internal use by the test suite only.")
 
 (defvar comp-post-pass-hooks '()
   "Alist whose elements are of the form (PASS FUNCTIONS...).
@@ -248,7 +249,7 @@ Useful to hook into pass checkers.")
   `(
     ;; Functions we can trust not to be or if redefined should expose
     ;; the same type.  Vast majority of these is either pure or
-    ;; pritive, the original list is the union of pure +
+    ;; primitive, the original list is the union of pure +
     ;; side-effect-free-fns + side-effect-and-error-free-fns:
     (% (function ((or number marker) (or number marker)) number))
     (* (function (&rest (or number marker)) number))
@@ -639,7 +640,7 @@ Useful to hook into pass checkers.")
                             ,@comp-limple-assignments
                             ,@comp-limple-branches
                             return)
-  "All limple operators.")
+  "All Limple operators.")
 
 (defvar comp-func nil
   "Bound to the current function by most passes.")
@@ -925,7 +926,7 @@ CFG is mutated by a pass.")
 
 (defun comp-mvar-type-hint-match-p (mvar type-hint)
   "Match MVAR against TYPE-HINT.
-In use by the backend."
+In use by the back-end."
   (cl-ecase type-hint
     (cons (comp-cstr-cons-p mvar))
     (fixnum (comp-cstr-fixnum-p mvar))))
@@ -1225,7 +1226,7 @@ clashes."
                                                              'pure))))
       (when (byte-code-function-p f)
         (signal 'native-compiler-error
-                "can't native compile an already bytecompiled function"))
+                "can't native compile an already byte-compiled function"))
       (setf (comp-func-byte-func func)
             (byte-compile (comp-func-name func)))
       (let ((lap (byte-to-native-lambda-lap
@@ -1310,7 +1311,7 @@ clashes."
             (comp-func-speed func) (comp-spill-speed name)
             (comp-func-pure func) (comp-spill-decl-spec name 'pure))
 
-      ;; Store the c-name to have it retrivable from
+      ;; Store the c-name to have it retrievable from
       ;; `comp-ctxt-top-level-forms'.
       (when top-l-form
         (setf (byte-to-native-func-def-c-name top-l-form) c-name))
@@ -1501,7 +1502,7 @@ If SSA is non-nil, populate it with m-var in ssa form."
     (push insn (comp-block-insns bb))))
 
 (defun comp-emit-set-call (call)
-  "Emit CALL assigning the result the the current slot frame.
+  "Emit CALL assigning the result to the current slot frame.
 If the callee function is known to have a return type, propagate it."
   (cl-assert call)
   (comp-emit (list 'set (comp-slot) call)))
@@ -1655,7 +1656,7 @@ Return value is the fall-through block name."
    finally return t))
 
 (defun comp-emit-switch (var last-insn)
-  "Emit a limple for a lap jump table given VAR and LAST-INSN."
+  "Emit a Limple for a lap jump table given VAR and LAST-INSN."
   ;; FIXME this not efficient for big jump tables. We should have a second
   ;; strategy for this case.
   (pcase last-insn
@@ -1706,7 +1707,7 @@ SP-DELTA is the stack adjustment."
              (minarg (car arity))
              (maxarg (cdr arity)))
         (when (eq maxarg 'unevalled)
-          (signal 'native-ice (list "subr contains  unevalled args" 
subr-name)))
+          (signal 'native-ice (list "subr contains unevalled args" subr-name)))
         (if (eq maxarg 'many)
             ;; callref case.
             (comp-emit-set-call (comp-callref subr-name nargs (comp-sp)))
@@ -2026,7 +2027,7 @@ and the annotation emission."
           (make-comp-mvar :constant (comp-func-d-lambda-list function)))))
 
 (cl-defgeneric comp-emit-for-top-level (form for-late-load)
-  "Emit the limple code for top level FORM.")
+  "Emit the Limple code for top level FORM.")
 
 (cl-defmethod comp-emit-for-top-level ((form byte-to-native-func-def)
                                        for-late-load)
@@ -2102,7 +2103,7 @@ These are stored in the reloc data array."
                 (make-comp-mvar :slot 0)))))
 
 (defun comp-limplify-top-level (for-late-load)
-  "Create a limple function to modify the global environment at load.
+  "Create a Limple function to modify the global environment at load.
 When FOR-LATE-LOAD is non-nil, the emitted function modifies only
 function definition.
 
@@ -2606,7 +2607,7 @@ blocks."
   (maphash (lambda (_ f)
              (when (and (>= (comp-func-speed f) 1)
                         ;; No point to run this on dynamic scope as
-                        ;; this pass is effecive only on local
+                        ;; this pass is effective only on local
                         ;; variables.
                        (comp-func-l-p f)
                         (not (comp-func-has-non-local f)))
@@ -3013,8 +3014,8 @@ Return t when one or more block was removed, nil 
otherwise."
 ;; possible.
 
 (defconst comp-fwprop-max-insns-scan 4500
-  ;; Choosen as ~ the greatest required value for full convergence
-  ;; native compiling all Emacs codebase.
+  ;; Chosen as ~ the greatest required value for full convergence
+  ;; native compiling all Emacs code-base.
   "Max number of scanned insn before giving-up.")
 
 (defun comp-copy-insn (insn)
@@ -3053,7 +3054,7 @@ Return t when one or more block was removed, nil 
otherwise."
 (defun comp-fwprop-prologue ()
   "Prologue for the propagate pass.
 Here goes everything that can be done not iteratively (read once).
-Forward propagate immediate involed in assignments."
+Forward propagate immediate involed in assignments." ; FIXME: Typo.  Involved 
or invoked?
   (cl-loop
    for b being each hash-value of (comp-func-blocks comp-func)
    do (cl-loop
@@ -3116,7 +3117,7 @@ Fold the call in case."
     (when-let ((cstr-f (gethash f comp-known-func-cstr-h)))
       (let ((cstr (comp-cstr-f-ret cstr-f)))
         (when (comp-cstr-empty-p cstr)
-          ;; Store it to be rewrittein as non local exit.
+          ;; Store it to be rewritten as non local exit.
           (setf (comp-block-lap-non-ret-insn comp-block) insn))
         (setf (comp-mvar-range lval) (comp-cstr-range cstr)
               (comp-mvar-valset lval) (comp-cstr-valset cstr)
@@ -3191,7 +3192,7 @@ Return t if something was changed."
                with comp-block = b
                for insn in (comp-block-insns b)
                for orig-insn = (unless modified
-                                 ;; Save consing after 1th change.
+                                 ;; Save consing after 1st change.
                                  (comp-copy-insn insn))
                do
                (comp-fwprop-insn insn)
@@ -3791,7 +3792,7 @@ sharing the original source filename (including FILE)."
          for f in (when (file-exists-p dir)
                    (directory-files dir t regexp t))
          ;; We may not be able to delete the file if we have no write
-         ;; permisison.
+         ;; permission.
          do (ignore-error file-error
               (comp-delete-or-replace-file f))))))
 
@@ -3828,7 +3829,7 @@ session."
              (rename-file newfile oldfile)))))
 
 (defvar comp-files-queue ()
-  "List of Elisp files to be compiled.")
+  "List of Emacs Lisp files to be compiled.")
 
 (defvar comp-async-compilations (make-hash-table :test #'equal)
   "Hash table file-name -> async compilation process.")
@@ -4204,4 +4205,6 @@ of (commands) to run simultaneously."
 
 (provide 'comp)
 
+;; LocalWords: limplified limplified limplification limplify Limple LIMPLE 
libgccjit elc eln
+
 ;;; comp.el ends here
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 46ca948..2495277 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -503,7 +503,7 @@ If ARG is positive, that's the end of the buffer.
 Otherwise, that's the beginning of the buffer."
   (if (> arg 0) (point-max) (point-min)))
 
-(defun end-of-defun (&optional arg)
+(defun end-of-defun (&optional arg interactive)
   "Move forward to next end of defun.
 With argument, do it that many times.
 Negative argument -N means move back to Nth preceding end of defun.
@@ -513,129 +513,145 @@ matches the open-parenthesis that starts a defun; see 
function
 `beginning-of-defun'.
 
 If variable `end-of-defun-function' is non-nil, its value
-is called as a function to find the defun's end."
-  (interactive "^p")
-  (or (not (eq this-command 'end-of-defun))
-      (eq last-command 'end-of-defun)
-      (and transient-mark-mode mark-active)
-      (push-mark))
-  (if (or (null arg) (= arg 0)) (setq arg 1))
-  (let ((pos (point))
-        (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))
-       (skip (lambda ()
-               ;; When comparing point against pos, we want to consider that if
-               ;; point was right after the end of the function, it's still
-               ;; considered as "in that function".
-               ;; E.g. `eval-defun' from right after the last close-paren.
-               (unless (bolp)
-                 (skip-chars-forward " \t")
-                 (if (looking-at "\\s<\\|\n")
-                     (forward-line 1))))))
-    (funcall end-of-defun-function)
-    (when (<= arg 1)
-      (funcall skip))
-    (cond
-     ((> arg 0)
-      ;; Moving forward.
-      (if (> (point) pos)
-          ;; We already moved forward by one because we started from
-          ;; within a function.
-          (setq arg (1- arg))
-        ;; We started from after the end of the previous function.
-        (goto-char pos))
-      (unless (zerop arg)
-        (beginning-of-defun-raw (- arg))
-        (funcall end-of-defun-function)))
-     ((< arg 0)
-      ;; Moving backward.
-      (if (< (point) pos)
-          ;; We already moved backward because we started from between
-          ;; two functions.
-          (setq arg (1+ arg))
-        ;; We started from inside a function.
-        (goto-char beg))
-      (unless (zerop arg)
+is called as a function to find the defun's end.
+
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "^p\nd")
+  (if interactive
+      (condition-case e
+          (end-of-defun arg nil)
+        (scan-error (user-error (cadr e))))
+    (or (not (eq this-command 'end-of-defun))
+        (eq last-command 'end-of-defun)
+        (and transient-mark-mode mark-active)
+        (push-mark))
+    (if (or (null arg) (= arg 0)) (setq arg 1))
+    (let ((pos (point))
+          (beg (progn (end-of-line 1) (beginning-of-defun-raw 1) (point)))
+         (skip (lambda ()
+                 ;; When comparing point against pos, we want to consider that
+                 ;; if point was right after the end of the function, it's
+                 ;; still considered as "in that function".
+                 ;; E.g. `eval-defun' from right after the last close-paren.
+                 (unless (bolp)
+                   (skip-chars-forward " \t")
+                   (if (looking-at "\\s<\\|\n")
+                       (forward-line 1))))))
+      (funcall end-of-defun-function)
+      (when (<= arg 1)
+        (funcall skip))
+      (cond
+       ((> arg 0)
+        ;; Moving forward.
+        (if (> (point) pos)
+            ;; We already moved forward by one because we started from
+            ;; within a function.
+            (setq arg (1- arg))
+          ;; We started from after the end of the previous function.
+          (goto-char pos))
+        (unless (zerop arg)
+          (beginning-of-defun-raw (- arg))
+          (funcall end-of-defun-function)))
+       ((< arg 0)
+        ;; Moving backward.
+        (if (< (point) pos)
+            ;; We already moved backward because we started from between
+            ;; two functions.
+            (setq arg (1+ arg))
+          ;; We started from inside a function.
+          (goto-char beg))
+        (unless (zerop arg)
+          (beginning-of-defun-raw (- arg))
+         (setq beg (point))
+          (funcall end-of-defun-function))))
+      (funcall skip)
+      (while (and (< arg 0) (>= (point) pos))
+        ;; We intended to move backward, but this ended up not doing so:
+        ;; Try harder!
+        (goto-char beg)
         (beginning-of-defun-raw (- arg))
-       (setq beg (point))
-        (funcall end-of-defun-function))))
-    (funcall skip)
-    (while (and (< arg 0) (>= (point) pos))
-      ;; We intended to move backward, but this ended up not doing so:
-      ;; Try harder!
-      (goto-char beg)
-      (beginning-of-defun-raw (- arg))
-      (if (>= (point) beg)
-         (setq arg 0)
-       (setq beg (point))
-        (funcall end-of-defun-function)
-       (funcall skip)))))
-
-(defun mark-defun (&optional arg)
+        (if (>= (point) beg)
+           (setq arg 0)
+         (setq beg (point))
+          (funcall end-of-defun-function)
+         (funcall skip))))))
+
+(defun mark-defun (&optional arg interactive)
   "Put mark at end of this defun, point at beginning.
 The defun marked is the one that contains point or follows point.
 With positive ARG, mark this and that many next defuns; with negative
 ARG, change the direction of marking.
 
 If the mark is active, it marks the next or previous defun(s) after
-the one(s) already marked."
-  (interactive "p")
-  (setq arg (or arg 1))
-  ;; There is no `mark-defun-back' function - see
-  ;; https://lists.gnu.org/r/bug-gnu-emacs/2016-11/msg00079.html
-  ;; for explanation
-  (when (eq last-command 'mark-defun-back)
-    (setq arg (- arg)))
-  (when (< arg 0)
-    (setq this-command 'mark-defun-back))
-  (cond ((use-region-p)
-         (if (>= arg 0)
-             (set-mark
-              (save-excursion
-                (goto-char (mark))
-                ;; change the dotimes below to (end-of-defun arg) once bug 
#24427 is fixed
-                (dotimes (_ignore arg)
-                  (end-of-defun))
-                (point)))
-           (beginning-of-defun-comments (- arg))))
-        (t
-         (let ((opoint (point))
-               beg end)
-           (push-mark opoint)
-           ;; Try first in this order for the sake of languages with nested
-           ;; functions where several can end at the same place as with the
-           ;; offside rule, e.g. Python.
-           (beginning-of-defun-comments)
-           (setq beg (point))
-           (end-of-defun)
-           (setq end (point))
-           (when (or (and (<= (point) opoint)
-                          (> arg 0))
-                     (= beg (point-min))) ; we were before the first defun!
-             ;; beginning-of-defun moved back one defun so we got the wrong
-             ;; one.  If ARG < 0, however, we actually want to go back.
-             (goto-char opoint)
-             (end-of-defun)
-             (setq end (point))
-             (beginning-of-defun-comments)
-             (setq beg (point)))
-           (goto-char beg)
-           (cond ((> arg 0)
-                  ;; change the dotimes below to (end-of-defun arg) once bug 
#24427 is fixed
+the one(s) already marked.
+
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "p\nd")
+  (if interactive
+      (condition-case e
+          (mark-defun arg nil)
+        (scan-error (user-error (cadr e))))
+    (setq arg (or arg 1))
+    ;; There is no `mark-defun-back' function - see
+    ;; https://lists.gnu.org/r/bug-gnu-emacs/2016-11/msg00079.html
+    ;; for explanation
+    (when (eq last-command 'mark-defun-back)
+      (setq arg (- arg)))
+    (when (< arg 0)
+      (setq this-command 'mark-defun-back))
+    (cond ((use-region-p)
+           (if (>= arg 0)
+               (set-mark
+                (save-excursion
+                  (goto-char (mark))
+                  ;; change the dotimes below to (end-of-defun arg)
+                  ;; once bug #24427 is fixed
                   (dotimes (_ignore arg)
                     (end-of-defun))
-                  (setq end (point))
-                  (push-mark end nil t)
-                  (goto-char beg))
-                 (t
-                  (goto-char beg)
-                  (unless (= arg -1)    ; beginning-of-defun behaves
-                                        ; strange with zero arg - see
-                                        ; 
https://lists.gnu.org/r/bug-gnu-emacs/2017-02/msg00196.html
-                    (beginning-of-defun (1- (- arg))))
-                  (push-mark end nil t))))))
-  (skip-chars-backward "[:space:]\n")
-  (unless (bobp)
-    (forward-line 1)))
+                  (point)))
+             (beginning-of-defun-comments (- arg))))
+          (t
+           (let ((opoint (point))
+                 beg end)
+             (push-mark opoint)
+             ;; Try first in this order for the sake of languages with nested
+             ;; functions where several can end at the same place as with the
+             ;; offside rule, e.g. Python.
+             (beginning-of-defun-comments)
+             (setq beg (point))
+             (end-of-defun)
+             (setq end (point))
+             (when (or (and (<= (point) opoint)
+                            (> arg 0))
+                       (= beg (point-min))) ; we were before the first defun!
+               ;; beginning-of-defun moved back one defun so we got the wrong
+               ;; one.  If ARG < 0, however, we actually want to go back.
+               (goto-char opoint)
+               (end-of-defun)
+               (setq end (point))
+               (beginning-of-defun-comments)
+               (setq beg (point)))
+             (goto-char beg)
+             (cond ((> arg 0)
+                    ;; change the dotimes below to (end-of-defun arg)
+                    ;; once bug #24427 is fixed
+                    (dotimes (_ignore arg)
+                      (end-of-defun))
+                    (setq end (point))
+                    (push-mark end nil t)
+                    (goto-char beg))
+                   (t
+                    (goto-char beg)
+                    (unless (= arg -1)
+                      ;; beginning-of-defun behaves strange with zero arg - see
+                      ;; lists.gnu.org/r/bug-gnu-emacs/2017-02/msg00196.html
+                      (beginning-of-defun (1- (- arg))))
+                    (push-mark end nil t))))))
+    (skip-chars-backward "[:space:]\n")
+    (unless (bobp)
+      (forward-line 1))))
 
 (defvar narrow-to-defun-include-comments nil
   "If non-nil, `narrow-to-defun' will also show comments preceding the defun.")
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 86d5130..9b31d68 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -1252,7 +1252,7 @@ Example:
     (define-key map (kbd "C-c C-n") 'shortdoc-next-section)
     (define-key map (kbd "C-c C-p") 'shortdoc-previous-section)
     map)
-  "Keymap for `shortdoc-mode'")
+  "Keymap for `shortdoc-mode'.")
 
 (define-derived-mode shortdoc-mode special-mode "shortdoc"
   "Mode for shortdoc.")
@@ -1269,23 +1269,27 @@ Example:
        (setq ,arg (1- ,arg)))))
 
 (defun shortdoc-next (&optional arg)
-  "Move cursor to next function."
+  "Move cursor to the next function.
+With ARG, do it that many times."
   (interactive "p")
   (shortdoc--goto-section arg 'shortdoc-function))
 
 (defun shortdoc-previous (&optional arg)
-  "Move cursor to previous function."
+  "Move cursor to the previous function.
+With ARG, do it that many times."
   (interactive "p")
   (shortdoc--goto-section arg 'shortdoc-function t)
   (backward-char 1))
 
 (defun shortdoc-next-section (&optional arg)
-  "Move cursor to next section."
+  "Move cursor to the next section.
+With ARG, do it that many times."
   (interactive "p")
   (shortdoc--goto-section arg 'shortdoc-section))
 
 (defun shortdoc-previous-section (&optional arg)
-  "Move cursor to previous section."
+  "Move cursor to the previous section.
+With ARG, do it that many times."
   (interactive "p")
   (shortdoc--goto-section arg 'shortdoc-section t)
   (forward-line -2))
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index d989a4d..5ce03db 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -2221,6 +2221,10 @@ unfolded."
   "Show any images that are in the HTML-rendered article buffer.
 This only works if the article in question is HTML."
   (interactive nil gnus-article-mode gnus-summary-mode)
+  ;; Reselect for image display.
+  (let ((gnus-blocked-images nil)
+        (gnus-inhibit-images nil))
+    (gnus-summary-select-article))
   (gnus-with-article-buffer
     (save-restriction
       (widen)
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index e20a1a5..0b0ae43 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -174,26 +174,47 @@ with the current prefix.  The files are chosen according 
to
 Functions on `help-fns-describe-function-functions' can use this
 to get buffer-local values.")
 
+(defun help-fns--describe-function-or-command-prompt (&optional want-command)
+  "Prompt for a function from `describe-function' or `describe-command'.
+If optional argument WANT-COMMAND is non-nil, prompt for an
+interactive command."
+  (let* ((fn (if want-command
+                 (caar command-history)
+               (function-called-at-point)))
+         (prompt (format-prompt (if want-command
+                                    "Describe command"
+                                  "Describe function")
+                                fn))
+         (enable-recursive-minibuffers t)
+         (val (completing-read
+               prompt
+               #'help--symbol-completion-table
+               (lambda (f) (if want-command
+                          (commandp f)
+                        (or (fboundp f) (get f 'function-documentation))))
+               t nil nil
+               (and fn (symbol-name fn)))))
+    (unless (equal val "")
+      (setq fn (intern val)))
+    ;; These error messages are intended to be less technical for the
+    ;; `describe-command' case, as they are directed at users that are
+    ;; not necessarily ELisp programmers.
+    (unless (and fn (symbolp fn))
+      (user-error (if want-command
+                      "You didn't specify a command's symbol"
+                    "You didn't specify a function symbol")))
+    (unless (or (fboundp fn) (get fn 'function-documentation))
+      (user-error (if want-command
+                      "Symbol is not a command: %s"
+                    "Symbol's function definition is void: %s")
+                  fn))
+    (list fn)))
+
 ;;;###autoload
 (defun describe-function (function)
   "Display the full documentation of FUNCTION (a symbol).
 When called from lisp, FUNCTION may also be a function object."
-  (interactive
-   (let* ((fn (function-called-at-point))
-          (enable-recursive-minibuffers t)
-          (val (completing-read
-                (format-prompt "Describe function" fn)
-                #'help--symbol-completion-table
-                (lambda (f) (or (fboundp f) (get f 'function-documentation)))
-                t nil nil
-                (and fn (symbol-name fn)))))
-     (unless (equal val "")
-       (setq fn (intern val)))
-     (unless (and fn (symbolp fn))
-       (user-error "You didn't specify a function symbol"))
-     (unless (or (fboundp fn) (get fn 'function-documentation))
-       (user-error "Symbol's function definition is void: %s" fn))
-     (list fn)))
+  (interactive (help-fns--describe-function-or-command-prompt))
 
   ;; We save describe-function-orig-buffer on the help xref stack, so
   ;; it is restored by the back/forward buttons.  'help-buffer'
@@ -223,9 +244,14 @@ When called from lisp, FUNCTION may also be a function 
object."
         (describe-function-1 function)
         (with-current-buffer standard-output
           ;; Return the text we displayed.
-          (buffer-string))))
-    ))
+          (buffer-string))))))
 
+;;;###autoload
+(defun describe-command (command)
+  "Display the full documentation of COMMAND (a symbol).
+When called from lisp, COMMAND may also be a function object."
+  (interactive (help-fns--describe-function-or-command-prompt 'is-command))
+  (describe-function command))
 
 ;; Could be this, if we make symbol-file do the work below.
 ;; (defun help-C-file-name (subr-or-var kind)
diff --git a/lisp/help-macro.el b/lisp/help-macro.el
index 7fe1fb6..1fa9d82 100644
--- a/lisp/help-macro.el
+++ b/lisp/help-macro.el
@@ -25,11 +25,12 @@
 
 ;;; Commentary:
 
-;; This file supplies the macro make-help-screen which constructs
-;; single character dispatching with browsable help such as that provided
-;; by help-for-help. This can be used to make many modes easier to use; for
-;; example, the GNU Emacs Empire Tool uses this for every "nested" mode map
-;; called from the main mode map.
+;; This file supplies the macro `make-help-screen' which constructs
+;; single character dispatching with browsable help such as that
+;; provided by `help-for-help'.  This can be used to make many modes
+;; easier to use; for example, the (long-since defunct) GNU Emacs
+;; Empire Tool used this for every "nested" mode map called from the
+;; main mode map.
 
 ;;       The name of this package was changed from help-screen.el to
 ;; help-macro.el in order to fit in a 14-character limit.
@@ -142,7 +143,8 @@ and then returns."
                    (setq new-minor-mode-map-alist minor-mode-map-alist))
                  (goto-char (point-min))
                  (while (or (memq char (append help-event-list
-                                               (cons help-char '( ?? ?\C-v ?\s 
?\177 deletechar backspace vertical-scroll-bar ?\M-v
+                                               (cons help-char '( ?? ?\C-v ?\s 
?\177 ?\M-v ?\S-\s
+                                                                  deletechar 
backspace vertical-scroll-bar
                                                                   next prior 
up down))))
                             (eq (car-safe char) 'switch-frame)
                             (equal key "\M-v"))
@@ -152,7 +154,7 @@ and then returns."
                          (handle-switch-frame char))
                         ((memq char '(?\C-v ?\s next))
                          (scroll-up))
-                        ((or (memq char '(?\177 ?\M-v deletechar backspace 
prior))
+                        ((or (memq char '(?\177 ?\M-v ?\S-\s deletechar 
backspace prior))
                              (equal key "\M-v"))
                          (scroll-down))
                         ((memq char '(down))
@@ -168,9 +170,9 @@ and then returns."
                                              (point-max))
                                             ""
                                           (concat  ", or "
-                                                   
(help--key-description-fontified "\s") ; SPC
+                                                   
(help--key-description-fontified (kbd "<PageDown>"))
                                                    " or "
-                                                   
(help--key-description-fontified "\d") ; DEL
+                                                   
(help--key-description-fontified (kbd "<PageUp>"))
                                                    " to scroll"))))
                            char (aref key 0)))
 
diff --git a/lisp/help.el b/lisp/help.el
index 63f9974..6ba59ae 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -106,6 +106,7 @@
     (define-key map "t" 'help-with-tutorial)
     (define-key map "v" 'describe-variable)
     (define-key map "w" 'where-is)
+    (define-key map "x" 'describe-command)
     (define-key map "q" 'help-quit)
     map)
   "Keymap for characters following the Help key.")
@@ -210,6 +211,7 @@ Do not call this in the scope of `with-help-window'."
                 ;; "RET" so we can't use it here.
                 (propertize name 'face 'help-key-binding)
               (concat "\\[" name "]"))
+            " " ; ensure we have some whitespace before the description
             (propertize "\t" 'display '(space :align-to 8))
             desc))
        ""))
@@ -232,9 +234,9 @@ Do not call this in the scope of `with-help-window'."
   (purecopy "Type a help option: [abcCdefFgiIkKlLmnprstvw.] C-[cdefmnoptw] or 
?")
   (concat
    "\(Type "
-   (help--key-description-fontified "\s") ; SPC
+   (help--key-description-fontified (kbd "<PageDown>"))
    " or "
-   (help--key-description-fontified "\d") ; DEL
+   (help--key-description-fontified (kbd "<PageUp>"))
    " to scroll, "
    (help--key-description-fontified "\C-s")
    " to search, or \\<help-map>\\[help-quit] to exit.)"
@@ -251,6 +253,7 @@ Do not call this in the scope of `with-help-window'."
         "Search for commands (see also \\[apropos])")
        ("apropos-documentation"
         "Search documentation of functions, variables, and other items")
+       ("describe-command" "Show help for command")
        ("describe-function" "Show help for function")
        ("describe-variable" "Show help for variable")
        ("describe-symbol" "Show help for function or variable"))
diff --git a/lisp/image.el b/lisp/image.el
index 610d020..643f9dd 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -839,6 +839,9 @@ number, play until that number of seconds has elapsed."
          (cancel-timer timer))
       (plist-put (cdr image) :animate-buffer (current-buffer))
       (plist-put (cdr image) :animate-tardiness 0)
+      ;; Stash the data about the animation here so that we don't
+      ;; trigger image recomputation unnecessarily later.
+      (plist-put (cdr image) :animate-multi-frame-data animation)
       (run-with-timer 0.2 nil #'image-animate-timeout
                      image (or index 0) (car animation)
                      0 limit (+ (float-time) 0.2)))))
@@ -869,9 +872,12 @@ Frames are indexed from 0.  Optional argument NOCHECK 
non-nil means
 do not check N is within the range of frames present in the image."
   (unless nocheck
     (if (< n 0) (setq n 0)
-      (setq n (min n (1- (car (image-multi-frame-p image)))))))
+      (setq n (min n (1- (car (plist-get (cdr image)
+                                         :animate-multi-frame-data)))))))
   (plist-put (cdr image) :index n)
-  (force-window-update))
+  (when-let ((window
+              (get-buffer-window (plist-get (cdr image) :animate-buffer) t)))
+    (force-window-update window)))
 
 (defun image-animate-get-speed (image)
   "Return the speed factor for animating IMAGE."
@@ -917,11 +923,11 @@ for the animation speed.  A negative value means to 
animate in reverse."
     (image-show-frame image n t)
     (let* ((speed (image-animate-get-speed image))
           (time (current-time))
-          (animation (image-multi-frame-p image))
           (time-to-load-image (time-since time))
-          (stated-delay-time (/ (or (cdr animation)
-                                    image-default-frame-delay)
-                                (float (abs speed))))
+          (stated-delay-time
+            (/ (or (cdr (plist-get (cdr image) :animate-multi-frame-data))
+                  image-default-frame-delay)
+              (float (abs speed))))
           ;; Subtract off the time we took to load the image from the
           ;; stated delay time.
           (delay (max (float-time (time-subtract stated-delay-time
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 412751b..613223b3 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -1200,17 +1200,17 @@ in array mode may have different values assigned to the 
variables.
 The variables are:
 
 Variables you assign:
-     array-max-row:          The number of rows in the array.
-     array-max-column:       The number of columns in the array.
-     array-columns-per-line: The number of columns in the array
+     `array-max-row':          The number of rows in the array.
+     `array-max-column':       The number of columns in the array.
+     `array-columns-per-line': The number of columns in the array
                              per line of buffer.
-     array-field-width:      The width of each field, in characters.
-     array-rows-numbered:    A logical variable describing whether to ignore
+     `array-field-width':      The width of each field, in characters.
+     `array-rows-numbered':    A logical variable describing whether to ignore
                              row numbers in the buffer.
 
 Variables which are calculated:
-     array-line-length:      The number of characters in a buffer line.
-     array-lines-per-row:    The number of buffer lines used to
+     `array-line-length':      The number of characters in a buffer line.
+     `array-lines-per-row':    The number of buffer lines used to
                              display each row.
 
   The following commands are available (an asterisk indicates it may
@@ -4079,7 +4079,7 @@ in this way.
 If DONT-OVERRIDE is t, style variables that already have values (i.e., whose
 values are not the symbol `set-from-style') will not be overridden.  CC Mode
 calls c-set-style internally in this way whilst initializing a buffer; if
-cc-set-style is called like this from anywhere else, it will usually behave as
+c-set-style is called like this from anywhere else, it will usually behave as
 a null operation.
 
 \(fn STYLENAME &optional DONT-OVERRIDE)" t nil)
@@ -4891,7 +4891,7 @@ DEFAULT-BODY, if present, is used as the body of a 
default method.
 
 (autoload 'cl-defmethod "cl-generic" "\
 Define a new method for generic function NAME.
-This it defines an implementation of NAME to use for invocations
+This defines an implementation of NAME to use for invocations
 of specific types of arguments.
 
 ARGS is a list of dispatch arguments (see `cl-defun'), but where
@@ -5321,6 +5321,96 @@ REGEXP-GROUP is the regular expression group in REGEXP 
to use.
 
 ;;;***
 
+;;;### (autoloads nil "comp" "emacs-lisp/comp.el" (0 0 0 0))
+;;; Generated autoloads from emacs-lisp/comp.el
+(put 'no-native-compile 'safe-local-variable 'booleanp)
+
+(autoload 'comp-subr-trampoline-install "comp" "\
+Make SUBR-NAME effectively advice-able when called from native code.
+
+\(fn SUBR-NAME)" nil nil)
+
+(autoload 'comp-c-func-name "comp" "\
+Given NAME, return a name suitable for the native code.
+Add PREFIX in front of it.  If FIRST is not nil, pick the first
+available name ignoring compilation context and potential name
+clashes.
+
+\(fn NAME PREFIX &optional FIRST)" nil nil)
+
+(autoload 'comp-clean-up-stale-eln "comp" "\
+Given FILE remove all its *.eln files in `comp-eln-load-path'
+sharing the original source filename (including FILE).
+
+\(fn FILE)" nil nil)
+
+(autoload 'comp-lookup-eln "comp" "\
+Given a Lisp source FILENAME return the corresponding .eln file if found.
+Search happens in `comp-eln-load-path'.
+
+\(fn FILENAME)" nil nil)
+
+(autoload 'native-compile "comp" "\
+Compile FUNCTION-OR-FILE into native code.
+This is the synchronous entry-point for the Emacs Lisp native
+compiler.
+FUNCTION-OR-FILE is a function symbol, a form, or the filename of
+an Emacs Lisp source file.
+If OUTPUT is non-nil, use it as the filename for the compiled
+object.
+If FUNCTION-OR-FILE is a filename, return the filename of the
+compiled object.  If FUNCTION-OR-FILE is a function symbol or a
+form, return the compiled function.
+
+\(fn FUNCTION-OR-FILE &optional OUTPUT)" nil nil)
+
+(autoload 'batch-native-compile "comp" "\
+Perform native compilation on remaining command-line arguments.
+Use this from the command line, with ‘-batch’;
+it won’t work in an interactive Emacs.
+Native compilation equivalent to `batch-byte-compile'." nil nil)
+
+(autoload 'batch-byte-native-compile-for-bootstrap "comp" "\
+Like `batch-native-compile', but used for bootstrap.
+Generate .elc files in addition to the .eln files.
+Force the produced .eln to be outputted in the eln system
+directory (the last entry in `comp-eln-load-path').
+If the environment variable 'NATIVE_DISABLED' is set, only byte
+compile." nil nil)
+
+(autoload 'native-compile-async "comp" "\
+Compile FILES asynchronously.
+FILES is one file or a list of filenames or directories.
+
+If optional argument RECURSIVELY is non-nil, recurse into
+subdirectories of given directories.
+
+If optional argument LOAD is non-nil, request to load the file
+after compiling.
+
+The optional argument SELECTOR has the following valid values:
+
+nil -- Select all files.
+a string -- A regular expression selecting files with matching names.
+a function -- A function selecting files with matching names.
+
+The variable `comp-async-jobs-number' specifies the number
+of (commands) to run simultaneously.
+
+\(fn FILES &optional RECURSIVELY LOAD SELECTOR)" nil nil)
+
+(register-definition-prefixes "comp" '("comp-" "make-comp-edge" "native-" 
"no-native-compile"))
+
+;;;***
+
+;;;### (autoloads nil "comp-cstr" "emacs-lisp/comp-cstr.el" (0 0
+;;;;;;  0 0))
+;;; Generated autoloads from emacs-lisp/comp-cstr.el
+
+(register-definition-prefixes "comp-cstr" '("comp-" 
"with-comp-cstr-accessors"))
+
+;;;***
+
 ;;;### (autoloads nil "compare-w" "vc/compare-w.el" (0 0 0 0))
 ;;; Generated autoloads from vc/compare-w.el
 
@@ -8460,7 +8550,7 @@ Switch to *dungeon* buffer and start game." t nil)
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
-(defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
+(defalias 'easy-mmode-define-minor-mode #'define-minor-mode)
 
 (autoload 'define-minor-mode "easy-mmode" "\
 Define a new minor mode MODE.
@@ -8483,39 +8573,31 @@ documenting what its argument does.  If the word 
\"ARG\" does not
 appear in DOC, a paragraph is added to DOC explaining
 usage of the mode argument.
 
-Optional INIT-VALUE is the initial value of the mode's variable.
-  Note that the minor mode function won't be called by setting
-  this option, so the value *reflects* the minor mode's natural
-  initial state, rather than *setting* it.
-  In the vast majority of cases it should be nil.
-Optional LIGHTER is displayed in the mode line when the mode is on.
-Optional KEYMAP is the default keymap bound to the mode keymap.
-  If non-nil, it should be a variable name (whose value is a keymap),
-  or an expression that returns either a keymap or a list of
-  (KEY . BINDING) pairs where KEY and BINDING are suitable for
-  `define-key'.  If you supply a KEYMAP argument that is not a
-  symbol, this macro defines the variable MODE-map and gives it
-  the value that KEYMAP specifies.
-
 BODY contains code to execute each time the mode is enabled or disabled.
   It is executed after toggling the mode, and before running MODE-hook.
   Before the actual body code, you can write keyword arguments, i.e.
   alternating keywords and values.  If you provide BODY, then you must
-  provide (even if just nil) INIT-VALUE, LIGHTER, and KEYMAP, or provide
-  at least one keyword argument, or both; otherwise, BODY would be
-  misinterpreted as the first omitted argument.  The following special
-  keywords are supported (other keywords are passed to `defcustom' if
-  the minor mode is global):
+  provide at least one keyword argument (e.g. `:lighter nil`).
+  The following special keywords are supported (other keywords are passed
+  to `defcustom' if the minor mode is global):
 
-:group GROUP   Custom group name to use in all generated `defcustom' forms.
 :global GLOBAL If non-nil specifies that the minor mode is not meant to be
                buffer-local, so don't make the variable MODE buffer-local.
                By default, the mode is buffer-local.
-:init-value VAL        Same as the INIT-VALUE argument.
+:init-value VAL        the initial value of the mode's variable.
+               Note that the minor mode function won't be called by setting
+               this option, so the value *reflects* the minor mode's natural
+               initial state, rather than *setting* it.
+               In the vast majority of cases it should be nil.
                Not used if you also specify :variable.
-:lighter SPEC  Same as the LIGHTER argument.
-:keymap MAP    Same as the KEYMAP argument.
-:require SYM   Same as in `defcustom'.
+:lighter SPEC  Text displayed in the mode line when the mode is on.
+:keymap MAP    Keymap bound to the mode keymap.  Defaults to `MODE-map'.
+               If non-nil, it should be a variable name (whose value is
+               a keymap), or an expression that returns either a keymap or
+               a list of (KEY . BINDING) pairs where KEY and BINDING are
+               suitable for `define-key'.  If you supply a KEYMAP argument
+               that is not a symbol, this macro defines the variable MODE-map
+               and gives it the value that KEYMAP specifies.
 :interactive VAL  Whether this mode should be a command or not.  The default
                 is to make it one; use nil to avoid that.  If VAL is a list,
                 it's interpreted as a list of major modes this minor mode
@@ -8529,7 +8611,6 @@ BODY contains code to execute each time the mode is 
enabled or disabled.
                sets it.  If you specify a :variable, this function does
                not define a MODE variable (nor any of the terms used
                in :variable).
-
 :after-hook     A single lisp form which is evaluated after the mode hooks
                 have been run.  It should not be quoted.
 
@@ -8538,13 +8619,17 @@ For example, you could write
     :lighter \" Foo\" :require \\='foo :global t :group \\='hassle :version 
\"27.5\"
     ...BODY CODE...)
 
-\(fn MODE DOC &optional INIT-VALUE LIGHTER KEYMAP &rest BODY)" nil t)
+For backward compatibility with the Emacs<21 calling convention,
+the keywords can also be preceded by the obsolete triplet
+INIT-VALUE LIGHTER KEYMAP.
+
+\(fn MODE DOC [KEYWORD VAL ... &rest BODY])" nil t)
 
 (function-put 'define-minor-mode 'doc-string-elt '2)
 
-(defalias 'easy-mmode-define-global-mode 'define-globalized-minor-mode)
+(defalias 'easy-mmode-define-global-mode #'define-globalized-minor-mode)
 
-(defalias 'define-global-minor-mode 'define-globalized-minor-mode)
+(defalias 'define-global-minor-mode #'define-globalized-minor-mode)
 
 (autoload 'define-globalized-minor-mode "easy-mmode" "\
 Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
@@ -10617,32 +10702,66 @@ Prompt the user for values of nick, server, port, and 
password." nil nil)
 ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC.
 
-It permits you to select connection parameters, and then starts ERC.
+It allows selecting connection parameters, and then starts ERC.
 
 Non-interactively, it takes the keyword arguments
    (server (erc-compute-server))
    (port   (erc-compute-port))
    (nick   (erc-compute-nick))
    password
-   (full-name (erc-compute-full-name)))
+   (full-name (erc-compute-full-name))
 
 That is, if called with
 
    (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
 
-then the server and full-name will be set to those values, whereas
-`erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
-be invoked for the values of the other parameters.
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of the other parameters.
 
 \(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)))" t nil)
 
 (defalias 'erc-select #'erc)
 
 (autoload 'erc-tls "erc" "\
-Interactively select TLS connection parameters and run ERC.
-Arguments are the same as for `erc'.
+ERC is a powerful, modular, and extensible IRC client.
+This function is the main entry point for ERC over TLS.
+
+It allows selecting connection parameters, and then starts ERC
+over TLS.
+
+Non-interactively, it takes the keyword arguments
+   (server (erc-compute-server))
+   (port   (erc-compute-port))
+   (nick   (erc-compute-nick))
+   password
+   (full-name (erc-compute-full-name))
+   client-certificate
+
+That is, if called with
+
+   (erc-tls :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
 
-\(fn &rest R)" t nil)
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of their respective parameters.
+
+CLIENT-CERTIFICATE, if non-nil, should either be a list where the
+first element is the certificate key file name, and the second
+element is the certificate file name itself, or t, which means
+that `auth-source' will be queried for the key and the
+certificate.  Authenticating using a TLS client certificate is
+also refered to as \"CertFP\" (Certificate Fingerprint)
+authentication by various IRC networks.
+
+Example usage:
+
+    (erc-tls :server \"chat.freenode.net\" :port 6697
+             :client-certificate
+             '(\"/data/bandali/my-cert.key\"
+               \"/data/bandali/my-cert.crt\"))
+
+\(fn &key (SERVER (erc-compute-server)) (PORT (erc-compute-port)) (NICK 
(erc-compute-nick)) PASSWORD (FULL-NAME (erc-compute-full-name)) 
CLIENT-CERTIFICATE)" t nil)
 
 (autoload 'erc-handle-irc-url "erc" "\
 Use ERC to IRC on HOST:PORT in CHANNEL as USER with PASSWORD.
@@ -11973,6 +12092,23 @@ Besides the choice of face, it is the same as 
`buffer-face-mode'.
 ;;;### (autoloads nil "facemenu" "facemenu.el" (0 0 0 0))
 ;;; Generated autoloads from facemenu.el
 
+(autoload 'list-colors-display "facemenu" "\
+Display names of defined colors, and show what they look like.
+If the optional argument LIST is non-nil, it should be a list of
+colors to display.  Otherwise, this command computes a list of
+colors that the current display can handle.  Customize
+`list-colors-sort' to change the order in which colors are shown.
+Type `g' or \\[revert-buffer] after customizing `list-colors-sort'
+to redisplay colors in the new order.
+
+If the optional argument BUFFER-NAME is nil, it defaults to *Colors*.
+
+If the optional argument CALLBACK is non-nil, it should be a
+function to call each time the user types RET or clicks on a
+color.  The function should accept a single argument, the color name.
+
+\(fn &optional LIST BUFFER-NAME CALLBACK)" t nil)
+
 (register-definition-prefixes "facemenu" '("facemenu-" "list-colors-"))
 
 ;;;***
@@ -12440,7 +12576,7 @@ specifies what to use in place of \"-ls\" as the final 
argument.
 ;;;### (autoloads nil "find-file" "find-file.el" (0 0 0 0))
 ;;; Generated autoloads from find-file.el
 
-(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) 
(match-end 2)))) "\
+(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s 
+[<\"]\\(.*\\)[>\"]") \, (lambda nil (match-string 2)))) "\
 List of special constructs recognized by `ff-treat-as-special'.
 Each element, tried in order, has the form (REGEXP . EXTRACT).
 If REGEXP matches the current line (from the beginning of the line),
@@ -12458,7 +12594,7 @@ If optional IN-OTHER-WINDOW is non-nil, find the file 
in another window.
 
 \(fn &optional IN-OTHER-WINDOW)" t nil)
 
-(defalias 'ff-find-related-file 'ff-find-other-file)
+(defalias 'ff-find-related-file #'ff-find-other-file)
 
 (autoload 'ff-find-other-file "find-file" "\
 Find the header or source file corresponding to this file.
@@ -12513,15 +12649,14 @@ Variables of interest include:
  - `ff-file-created-hook'
    List of functions to be called if the other file has been created.
 
-\(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE)" t nil)
+\(fn &optional IN-OTHER-WINDOW IGNORE-INCLUDE EVENT)" t nil)
 
-(autoload 'ff-mouse-find-other-file "find-file" "\
-Visit the file you click on.
+(define-obsolete-function-alias 'ff-mouse-find-other-file #'ff-find-other-file 
"28.1")
 
-\(fn EVENT)" t nil)
+(define-obsolete-function-alias 'ff-mouse-find-other-file-other-window 
#'ff-find-other-file-other-window "28.1")
 
-(autoload 'ff-mouse-find-other-file-other-window "find-file" "\
-Visit the file you click on in another window.
+(autoload 'ff-find-other-file-other-window "find-file" "\
+Visit the file you point at in another window.
 
 \(fn EVENT)" t nil)
 
@@ -13794,7 +13929,7 @@ regular expression that can be used as an element of
 ;;;### (autoloads nil "generic-x" "generic-x.el" (0 0 0 0))
 ;;; Generated autoloads from generic-x.el
 
-(register-definition-prefixes "generic-x" '("alias-generic-mode" 
"ansible-inventory-generic-mode" "apache-" "astap-generic-mode" 
"default-generic-mode" "etc-" "fvwm-generic-mode" "generic-" 
"hosts-generic-mode" "ibis-generic-mode" "java-" "mail" "named-" 
"pkginfo-generic-mode" "prototype-generic-mode" "rc-generic-mode" "rul-" 
"samba-generic-mode" "show-tabs-generic-mode" "spice-generic-mode" 
"vrml-generic-mode" "x-resource-generic-mode" "xmodmap-generic-mode"))
+(register-definition-prefixes "generic-x" '("default-generic-mode" "generic-"))
 
 ;;;***
 
@@ -14629,6 +14764,8 @@ Both lists have to be sorted over <.
 
 \(fn LIST1 LIST2)" nil nil)
 
+(make-obsolete 'gnus-intersection 'seq-intersection '"28.1")
+
 (autoload 'gnus-sorted-intersection "gnus-range" "\
 Return intersection of LIST1 and LIST2.
 LIST1 and LIST2 have to be sorted over <.
@@ -16284,7 +16421,7 @@ whitespace.  Case does not matter.")
 (autoload 'hs-minor-mode "hideshow" "\
 Minor mode to selectively hide/show code and comment blocks.
 
-If called interactively, toggle `Hs minor mode'.  If the prefix
+If called interactively, toggle `hs minor mode'.  If the prefix
 argument is positive, enable the mode, and if it is zero or negative,
 disable the mode.
 
@@ -16503,7 +16640,7 @@ Construct a function similar to `hippie-expand'.
 Make it use the expansion functions in TRY-LIST.  An optional second
 argument VERBOSE non-nil makes the function verbose.
 
-\(fn TRY-LIST &optional VERBOSE)" nil t)
+\(fn TRY-LIST &optional VERBOSE)" nil nil)
 
 (register-definition-prefixes "hippie-exp" '("he-" "hippie-expand-" "try-"))
 
@@ -17023,6 +17160,36 @@ completions:
 \\{icomplete-minibuffer-map}
 
 \(fn &optional ARG)" t nil)
+
+(defvar icomplete-vertical-mode nil "\
+Non-nil if Icomplete-Vertical mode is enabled.
+See the `icomplete-vertical-mode' command
+for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `icomplete-vertical-mode'.")
+
+(custom-autoload 'icomplete-vertical-mode "icomplete" nil)
+
+(autoload 'icomplete-vertical-mode "icomplete" "\
+Toggle vertical candidate display in `icomplete-mode' or `fido-mode'.
+
+If called interactively, toggle `Icomplete-Vertical mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'.  Enable the
+mode if ARG is nil, omitted, or is a positive number.  Disable the
+mode if ARG is a negative number.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+As many completion candidates as possible are displayed, depending on
+the value of `max-mini-window-height', and the way the mini-window is
+resized depends on `resize-mini-windows'.
+
+\(fn &optional ARG)" t nil)
 (when (locate-library "obsolete/iswitchb")
  (autoload 'iswitchb-mode "iswitchb" "Toggle Iswitchb mode." t)
  (make-obsolete 'iswitchb-mode
@@ -17670,12 +17837,16 @@ means display it in the right marginal area.
 (autoload 'insert-image "image" "\
 Insert IMAGE into current buffer at point.
 IMAGE is displayed by inserting STRING into the current buffer
-with a `display' property whose value is the image.  STRING
-defaults to a single space if you omit it.
+with a `display' property whose value is the image.
+
+STRING defaults to a single space if you omit it, which means
+that the inserted image will behave as whitespace syntactically.
+
 AREA is where to display the image.  AREA nil or omitted means
 display it in the text area, a value of `left-margin' means
 display it in the left marginal area, a value of `right-margin'
 means display it in the right marginal area.
+
 SLICE specifies slice of IMAGE to insert.  SLICE nil or omitted
 means insert whole image.  SLICE is a list (X Y WIDTH HEIGHT)
 specifying the X and Y positions and WIDTH and HEIGHT of image area
@@ -20464,13 +20635,6 @@ An adapted `makefile-mode' that knows about imake.
 
 ;;;***
 
-;;;### (autoloads nil "makeinfo" "textmodes/makeinfo.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/makeinfo.el
-
-(register-definition-prefixes "makeinfo" '("makeinfo-"))
-
-;;;***
-
 ;;;### (autoloads nil "makesum" "makesum.el" (0 0 0 0))
 ;;; Generated autoloads from makesum.el
 
@@ -20663,7 +20827,7 @@ OTHER-HEADERS is an alist of header/value pairs.  
CONTINUE says whether
 to continue editing a message already being composed.  SWITCH-FUNCTION
 is a function used to switch to and display the mail buffer.
 
-\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest IGNORED)" t nil)
+\(fn &optional TO SUBJECT OTHER-HEADERS CONTINUE SWITCH-FUNCTION YANK-ACTION 
SEND-ACTIONS RETURN-ACTION &rest _)" t nil)
 
 (autoload 'message-news "message" "\
 Start editing a news article to be sent.
@@ -22104,7 +22268,7 @@ See the `mouse-wheel-mode' command
 for a description of this minor mode.
 Setting this variable directly does not take effect;
 either customize it (see the info node `Easy Customization')
-or call the function `mouse-wheel-mode'." :set #'custom-set-minor-mode 
:initialize 'custom-initialize-delay :group 'mouse :type 'boolean)
+or call the function `mouse-wheel-mode'." :set #'custom-set-minor-mode 
:initialize 'custom-initialize-delay :type 'boolean :group 'mouse)
 
 (custom-autoload 'mouse-wheel-mode "mwheel" nil)
 
@@ -25756,7 +25920,7 @@ Open profile FILENAME.
 
 ;;;### (autoloads nil "project" "progmodes/project.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/project.el
-(push (purecopy '(project 0 5 4)) package--builtin-versions)
+(push (purecopy '(project 0 6 0)) package--builtin-versions)
 
 (autoload 'project-current "project" "\
 Return the project instance in DIRECTORY, defaulting to `default-directory'.
@@ -27305,6 +27469,11 @@ recently executed command not bound to an input 
event\".
 
 \(fn REPEAT-ARG)" t nil)
 
+(defvar repeat-map nil "\
+The value of the repeating map for the next command.
+A command called from the map can set it again to the same map when
+the map can't be set on the command symbol property `repeat-map'.")
+
 (defvar repeat-mode nil "\
 Non-nil if Repeat mode is enabled.
 See the `repeat-mode' command
@@ -27391,8 +27560,10 @@ visible (if only part could otherwise be made so), to 
make the defun line
 visible (if point is in code and it could not be made so, or if only
 comments, including the first comment line, are visible), or to make the
 first comment line visible (if point is in a comment).
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage.
 
-\(fn &optional ARG)" t nil)
+\(fn &optional ARG INTERACTIVE)" t nil)
 
 (register-definition-prefixes "reposition" '("repos-count-screen-lines"))
 
@@ -28258,7 +28429,7 @@ unmatchable     Never match anything at all.
 CHARCLASS       Match a character from a character class.  One of:
  alpha, alphabetic, letter   Alphabetic characters (defined by Unicode).
  alnum, alphanumeric         Alphabetic or decimal digit chars (Unicode).
- digit numeric, num          0-9.
+ digit, numeric, num         0-9.
  xdigit, hex-digit, hex      0-9, A-F, a-f.
  cntrl, control              ASCII codes 0-31.
  blank                       Horizontal whitespace (Unicode).
@@ -29246,6 +29417,17 @@ Like `mail' command, but display mail buffer in 
another frame.
 ;;; Generated autoloads from emacs-lisp/seq.el
 (push (purecopy '(seq 2 22)) package--builtin-versions)
 
+(autoload 'seq-subseq "seq" "\
+Return the sequence of elements of SEQUENCE from START to END.
+END is exclusive.
+
+If END is omitted, it defaults to the length of the sequence.  If
+START or END is negative, it counts from the end.  Signal an
+error if START or END are outside of the sequence (i.e too large
+if positive or too small if negative).
+
+\(fn SEQUENCE START &optional END)" nil nil)
+
 (autoload 'seq-take "seq" "\
 Take the first N elements of SEQUENCE and return the result.
 The result is a sequence of the same type as SEQUENCE.
@@ -29313,12 +29495,24 @@ Equality is defined by TESTFN if non-nil or by 
`equal' if nil.
 
 \(fn SEQUENCE ELT &optional TESTFN)" nil nil)
 
+(autoload 'seq-uniq "seq" "\
+Return a list of the elements of SEQUENCE with duplicates removed.
+TESTFN is used to compare elements, or `equal' if TESTFN is nil.
+
+\(fn SEQUENCE &optional TESTFN)" nil nil)
+
 (autoload 'seq-intersection "seq" "\
 Return a list of the elements that appear in both SEQUENCE1 and SEQUENCE2.
 Equality is defined by TESTFN if non-nil or by `equal' if nil.
 
 \(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
 
+(autoload 'seq-difference "seq" "\
+Return a list of the elements that appear in SEQUENCE1 but not in SEQUENCE2.
+Equality is defined by TESTFN if non-nil or by `equal' if nil.
+
+\(fn SEQUENCE1 SEQUENCE2 &optional TESTFN)" nil nil)
+
 (autoload 'seq-group-by "seq" "\
 Apply FUNCTION to each element of SEQUENCE.
 Separate the elements of SEQUENCE into an alist using the results as
@@ -29426,7 +29620,7 @@ Major mode for Simple Emacs Spreadsheet.
 When you invoke SES in a new buffer, it is divided into cells
 that you can enter data into.  You can navigate the cells with
 the arrow keys and add more cells with the tab key.  The contents
-of these cells can be numbers, text, or Lisp expressions. (To
+of these cells can be numbers, text, or Lisp expressions.  (To
 enter text, enclose it in double quotes.)
 
 In an expression, you can use cell coordinates to refer to the
@@ -29825,9 +30019,6 @@ Turning on Sieve mode runs `sieve-mode-hook'.
 Major mode for editing SIMULA code.
 \\{simula-mode-map}
 Variables controlling indentation style:
- `simula-tab-always-indent'
-    Non-nil means TAB in SIMULA mode should always reindent the current line,
-    regardless of where in the line point is when the TAB command is used.
  `simula-indent-level'
     Indentation of SIMULA statements with respect to containing block.
  `simula-substatement-offset'
@@ -30020,7 +30211,7 @@ buffer names.
 (autoload 'smerge-mode "smerge-mode" "\
 Minor mode to simplify editing output from the diff3 program.
 
-If called interactively, toggle `Smerge mode'.  If the prefix argument
+If called interactively, toggle `SMerge mode'.  If the prefix argument
 is positive, enable the mode, and if it is zero or negative, disable
 the mode.
 
@@ -32965,14 +33156,6 @@ value of `texinfo-mode-hook'.
 
 ;;;***
 
-;;;### (autoloads nil "texnfo-upd" "textmodes/texnfo-upd.el" (0 0
-;;;;;;  0 0))
-;;; Generated autoloads from textmodes/texnfo-upd.el
-
-(register-definition-prefixes "texnfo-upd" '("texinfo-"))
-
-;;;***
-
 ;;;### (autoloads nil "text-property-search" 
"emacs-lisp/text-property-search.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/text-property-search.el
@@ -33922,6 +34105,8 @@ the output buffer or changing the window configuration.
 
 ;;;### (autoloads nil "tramp" "net/tramp.el" (0 0 0 0))
 ;;; Generated autoloads from net/tramp.el
+ (when (featurep 'tramp-compat)
+  (load "tramp-compat" 'noerror 'nomessage))
 
 (defvar tramp-mode t "\
 Whether Tramp is enabled.
@@ -34115,6 +34300,67 @@ Add archive file name handler to 
`file-name-handler-alist'." (when tramp-archive
 
 ;;;***
 
+;;;### (autoloads nil "transient" "transient.el" (0 0 0 0))
+;;; Generated autoloads from transient.el
+
+(autoload 'transient-insert-suffix "transient" "\
+Insert a SUFFIX into PREFIX before LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-insert-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-append-suffix "transient" "\
+Insert a SUFFIX into PREFIX after LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-append-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-replace-suffix "transient" "\
+Replace the suffix at LOC in PREFIX with SUFFIX.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC SUFFIX)" nil nil)
+
+(function-put 'transient-replace-suffix 'lisp-indent-function 'defun)
+
+(autoload 'transient-remove-suffix "transient" "\
+Remove the suffix or group at LOC in PREFIX.
+PREFIX is a prefix command, a symbol.
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'.
+
+\(fn PREFIX LOC)" nil nil)
+
+(function-put 'transient-remove-suffix 'lisp-indent-function 'defun)
+
+(register-definition-prefixes "transient" '("transient-"))
+
+;;;***
+
 ;;;### (autoloads nil "tree-widget" "tree-widget.el" (0 0 0 0))
 ;;; Generated autoloads from tree-widget.el
 
@@ -34178,11 +34424,13 @@ first and the associated buffer to its right.
 \(fn &optional BUFFER)" t nil)
 
 (autoload '2C-associate-buffer "two-column" "\
-Associate another buffer with this one in two-column minor mode.
+Associate another BUFFER with this one in two-column minor mode.
 Can also be used to associate a just previously visited file, by
 accepting the proposed default buffer.
 
-\(See  \\[describe-mode] .)" t nil)
+\(See  \\[describe-mode] .)
+
+\(fn BUFFER)" t nil)
 
 (autoload '2C-split "two-column" "\
 Split a two-column text at point, into two buffers in two-column minor mode.
@@ -34665,7 +34913,7 @@ added to this list, so most requests can just pass in 
nil.
 
 \(fn URL)" nil nil)
 
-(register-definition-prefixes "url-dav" '("url-"))
+(register-definition-prefixes "url-dav" '("url-dav-"))
 
 ;;;***
 
@@ -36062,7 +36310,7 @@ Key bindings:
 ;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/verilog-mode.el
-(push (purecopy '(verilog-mode 2021 3 30 243771231)) package--builtin-versions)
+(push (purecopy '(verilog-mode 2021 4 12 188864585)) package--builtin-versions)
 
 (autoload 'verilog-mode "verilog-mode" "\
 Major mode for editing Verilog code.
@@ -38166,7 +38414,7 @@ If LIMIT is non-nil, then do not consider characters 
beyond LIMIT.
 
 ;;;### (autoloads nil "xref" "progmodes/xref.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/xref.el
-(push (purecopy '(xref 1 0 4)) package--builtin-versions)
+(push (purecopy '(xref 1 1 0)) package--builtin-versions)
 
 (autoload 'xref-find-backend "xref" nil nil nil)
 
@@ -38377,14 +38625,15 @@ Zone out, completely." t nil)
 ;;;;;;  "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
 ;;;;;;  "cedet/semantic/dep.el" "cedet/semantic/doc.el" 
"cedet/semantic/edit.el"
 ;;;;;;  "cedet/semantic/find.el" "cedet/semantic/format.el" 
"cedet/semantic/grammar-wy.el"
-;;;;;;  "cedet/semantic/html.el" "cedet/semantic/ia-sb.el" 
"cedet/semantic/ia.el"
-;;;;;;  "cedet/semantic/idle.el" "cedet/semantic/imenu.el" 
"cedet/semantic/lex-spp.el"
-;;;;;;  "cedet/semantic/lex.el" "cedet/semantic/mru-bookmark.el"
-;;;;;;  "cedet/semantic/scope.el" "cedet/semantic/senator.el" 
"cedet/semantic/sort.el"
-;;;;;;  "cedet/semantic/symref.el" "cedet/semantic/symref/cscope.el"
-;;;;;;  "cedet/semantic/symref/global.el" "cedet/semantic/symref/grep.el"
-;;;;;;  "cedet/semantic/symref/idutils.el" "cedet/semantic/symref/list.el"
-;;;;;;  "cedet/semantic/tag-file.el" "cedet/semantic/tag-ls.el" 
"cedet/semantic/tag-write.el"
+;;;;;;  "cedet/semantic/grm-wy-boot.el" "cedet/semantic/html.el"
+;;;;;;  "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el" 
"cedet/semantic/idle.el"
+;;;;;;  "cedet/semantic/imenu.el" "cedet/semantic/lex-spp.el" 
"cedet/semantic/lex.el"
+;;;;;;  "cedet/semantic/mru-bookmark.el" "cedet/semantic/scope.el"
+;;;;;;  "cedet/semantic/senator.el" "cedet/semantic/sort.el" 
"cedet/semantic/symref.el"
+;;;;;;  "cedet/semantic/symref/cscope.el" "cedet/semantic/symref/global.el"
+;;;;;;  "cedet/semantic/symref/grep.el" "cedet/semantic/symref/idutils.el"
+;;;;;;  "cedet/semantic/symref/list.el" "cedet/semantic/tag-file.el"
+;;;;;;  "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
 ;;;;;;  "cedet/semantic/tag.el" "cedet/semantic/texi.el" 
"cedet/semantic/util-modes.el"
 ;;;;;;  "cedet/semantic/wisent/java-tags.el" 
"cedet/semantic/wisent/javascript.el"
 ;;;;;;  "cedet/semantic/wisent/javat-wy.el" "cedet/semantic/wisent/js-wy.el"
@@ -38418,72 +38667,64 @@ Zone out, completely." t nil)
 ;;;;;;  "eshell/em-term.el" "eshell/em-tramp.el" "eshell/em-unix.el"
 ;;;;;;  "eshell/em-xtra.el" "faces.el" "files.el" "font-core.el"
 ;;;;;;  "font-lock.el" "format.el" "frame.el" "help.el" "hfy-cmap.el"
-;;;;;;  "ibuf-ext.el" "indent.el" "international/characters.el" 
"international/charprop.el"
-;;;;;;  "international/charscript.el" "international/cp51932.el"
-;;;;;;  "international/eucjp-ms.el" "international/iso-transl.el"
+;;;;;;  "ibuf-ext.el" "indent.el" "international/characters.el" 
"international/charscript.el"
+;;;;;;  "international/cp51932.el" "international/eucjp-ms.el" 
"international/iso-transl.el"
 ;;;;;;  "international/mule-cmds.el" "international/mule-conf.el"
-;;;;;;  "international/mule.el" "international/uni-bidi.el" 
"international/uni-brackets.el"
-;;;;;;  "international/uni-category.el" "international/uni-combining.el"
-;;;;;;  "international/uni-comment.el" "international/uni-decimal.el"
-;;;;;;  "international/uni-decomposition.el" "international/uni-digit.el"
-;;;;;;  "international/uni-lowercase.el" "international/uni-mirrored.el"
-;;;;;;  "international/uni-name.el" "international/uni-numeric.el"
-;;;;;;  "international/uni-old-name.el" 
"international/uni-special-lowercase.el"
-;;;;;;  "international/uni-special-titlecase.el" 
"international/uni-special-uppercase.el"
-;;;;;;  "international/uni-titlecase.el" "international/uni-uppercase.el"
-;;;;;;  "isearch.el" "jit-lock.el" "jka-cmpr-hook.el" "language/burmese.el"
-;;;;;;  "language/cham.el" "language/chinese.el" "language/cyrillic.el"
-;;;;;;  "language/czech.el" "language/english.el" "language/ethiopic.el"
-;;;;;;  "language/european.el" "language/georgian.el" "language/greek.el"
-;;;;;;  "language/hebrew.el" "language/indian.el" "language/japanese.el"
-;;;;;;  "language/khmer.el" "language/korean.el" "language/lao.el"
-;;;;;;  "language/misc-lang.el" "language/romanian.el" "language/sinhala.el"
-;;;;;;  "language/slovak.el" "language/tai-viet.el" "language/thai.el"
-;;;;;;  "language/tibetan.el" "language/utf-8-lang.el" "language/vietnamese.el"
-;;;;;;  "ldefs-boot.el" "leim/ja-dic/ja-dic.el" "leim/leim-list.el"
-;;;;;;  "leim/quail/4Corner.el" "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el"
-;;;;;;  "leim/quail/CTLau-b5.el" "leim/quail/CTLau.el" "leim/quail/ECDICT.el"
-;;;;;;  "leim/quail/ETZY.el" "leim/quail/PY-b5.el" "leim/quail/PY.el"
-;;;;;;  "leim/quail/Punct-b5.el" "leim/quail/Punct.el" "leim/quail/QJ-b5.el"
-;;;;;;  "leim/quail/QJ.el" "leim/quail/SW.el" "leim/quail/TONEPY.el"
-;;;;;;  "leim/quail/ZIRANMA.el" "leim/quail/ZOZY.el" "leim/quail/arabic.el"
-;;;;;;  "leim/quail/cham.el" "leim/quail/compose.el" "leim/quail/croatian.el"
-;;;;;;  "leim/quail/cyril-jis.el" "leim/quail/cyrillic.el" 
"leim/quail/czech.el"
-;;;;;;  "leim/quail/georgian.el" "leim/quail/greek.el" 
"leim/quail/hanja-jis.el"
-;;;;;;  "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el"
-;;;;;;  "leim/quail/ipa-praat.el" "leim/quail/latin-alt.el" 
"leim/quail/latin-ltx.el"
-;;;;;;  "leim/quail/latin-post.el" "leim/quail/latin-pre.el" 
"leim/quail/persian.el"
-;;;;;;  "leim/quail/programmer-dvorak.el" "leim/quail/py-punct.el"
-;;;;;;  "leim/quail/pypunct-b5.el" "leim/quail/quick-b5.el" 
"leim/quail/quick-cns.el"
-;;;;;;  "leim/quail/rfc1345.el" "leim/quail/sami.el" "leim/quail/sgml-input.el"
-;;;;;;  "leim/quail/slovak.el" "leim/quail/symbol-ksc.el" 
"leim/quail/tamil-dvorak.el"
-;;;;;;  "leim/quail/tsang-b5.el" "leim/quail/tsang-cns.el" 
"leim/quail/vntelex.el"
-;;;;;;  "leim/quail/vnvni.el" "leim/quail/welsh.el" "loadup.el" 
"mail/blessmail.el"
-;;;;;;  "mail/rmailedit.el" "mail/rmailkwd.el" "mail/rmailmm.el"
-;;;;;;  "mail/rmailmsc.el" "mail/rmailsort.el" "mail/rmailsum.el"
-;;;;;;  "mail/undigest.el" "menu-bar.el" "mh-e/mh-gnus.el" 
"mh-e/mh-loaddefs.el"
-;;;;;;  "minibuffer.el" "mouse.el" "net/tramp-loaddefs.el" "newcomment.el"
-;;;;;;  "obarray.el" "org/ob-core.el" "org/ob-lob.el" "org/ob-matlab.el"
-;;;;;;  "org/ob-tangle.el" "org/ob.el" "org/ol-bbdb.el" "org/ol-irc.el"
-;;;;;;  "org/ol.el" "org/org-archive.el" "org/org-attach.el" "org/org-clock.el"
-;;;;;;  "org/org-colview.el" "org/org-compat.el" "org/org-datetree.el"
-;;;;;;  "org/org-duration.el" "org/org-element.el" "org/org-feed.el"
-;;;;;;  "org/org-footnote.el" "org/org-goto.el" "org/org-id.el" 
"org/org-indent.el"
-;;;;;;  "org/org-install.el" "org/org-keys.el" "org/org-lint.el"
-;;;;;;  "org/org-list.el" "org/org-macs.el" "org/org-mobile.el" 
"org/org-num.el"
-;;;;;;  "org/org-plot.el" "org/org-refile.el" "org/org-table.el"
-;;;;;;  "org/org-timer.el" "org/ox-ascii.el" "org/ox-beamer.el" 
"org/ox-html.el"
-;;;;;;  "org/ox-icalendar.el" "org/ox-latex.el" "org/ox-md.el" "org/ox-odt.el"
-;;;;;;  "org/ox-org.el" "org/ox-publish.el" "org/ox-texinfo.el" "org/ox.el"
-;;;;;;  "progmodes/elisp-mode.el" "progmodes/prog-mode.el" "ps-mule.el"
-;;;;;;  "register.el" "replace.el" "rfn-eshadow.el" "select.el" "simple.el"
-;;;;;;  "startup.el" "subdirs.el" "subr.el" "tab-bar.el" "textmodes/fill.el"
+;;;;;;  "international/mule.el" "isearch.el" "jit-lock.el" "jka-cmpr-hook.el"
+;;;;;;  "language/burmese.el" "language/cham.el" "language/chinese.el"
+;;;;;;  "language/cyrillic.el" "language/czech.el" "language/english.el"
+;;;;;;  "language/ethiopic.el" "language/european.el" "language/georgian.el"
+;;;;;;  "language/greek.el" "language/hebrew.el" "language/indian.el"
+;;;;;;  "language/japanese.el" "language/khmer.el" "language/korean.el"
+;;;;;;  "language/lao.el" "language/misc-lang.el" "language/romanian.el"
+;;;;;;  "language/sinhala.el" "language/slovak.el" "language/tai-viet.el"
+;;;;;;  "language/thai.el" "language/tibetan.el" "language/utf-8-lang.el"
+;;;;;;  "language/vietnamese.el" "ldefs-boot.el" "leim/ja-dic/ja-dic.el"
+;;;;;;  "leim/leim-list.el" "leim/quail/4Corner.el" "leim/quail/ARRAY30.el"
+;;;;;;  "leim/quail/CCDOSPY.el" "leim/quail/CTLau-b5.el" "leim/quail/CTLau.el"
+;;;;;;  "leim/quail/ECDICT.el" "leim/quail/ETZY.el" "leim/quail/PY-b5.el"
+;;;;;;  "leim/quail/PY.el" "leim/quail/Punct-b5.el" "leim/quail/Punct.el"
+;;;;;;  "leim/quail/QJ-b5.el" "leim/quail/QJ.el" "leim/quail/SW.el"
+;;;;;;  "leim/quail/TONEPY.el" "leim/quail/ZIRANMA.el" "leim/quail/ZOZY.el"
+;;;;;;  "leim/quail/arabic.el" "leim/quail/cham.el" "leim/quail/compose.el"
+;;;;;;  "leim/quail/croatian.el" "leim/quail/cyril-jis.el" 
"leim/quail/cyrillic.el"
+;;;;;;  "leim/quail/czech.el" "leim/quail/georgian.el" "leim/quail/greek.el"
+;;;;;;  "leim/quail/hanja-jis.el" "leim/quail/hanja.el" "leim/quail/hanja3.el"
+;;;;;;  "leim/quail/hebrew.el" "leim/quail/ipa-praat.el" 
"leim/quail/latin-alt.el"
+;;;;;;  "leim/quail/latin-ltx.el" "leim/quail/latin-post.el" 
"leim/quail/latin-pre.el"
+;;;;;;  "leim/quail/persian.el" "leim/quail/programmer-dvorak.el"
+;;;;;;  "leim/quail/py-punct.el" "leim/quail/pypunct-b5.el" 
"leim/quail/quick-b5.el"
+;;;;;;  "leim/quail/quick-cns.el" "leim/quail/rfc1345.el" "leim/quail/sami.el"
+;;;;;;  "leim/quail/sgml-input.el" "leim/quail/slovak.el" 
"leim/quail/symbol-ksc.el"
+;;;;;;  "leim/quail/tamil-dvorak.el" "leim/quail/tsang-b5.el" 
"leim/quail/tsang-cns.el"
+;;;;;;  "leim/quail/vntelex.el" "leim/quail/vnvni.el" "leim/quail/welsh.el"
+;;;;;;  "loadup.el" "mail/blessmail.el" "mail/rmailedit.el" "mail/rmailkwd.el"
+;;;;;;  "mail/rmailmm.el" "mail/rmailmsc.el" "mail/rmailsort.el"
+;;;;;;  "mail/rmailsum.el" "mail/undigest.el" "menu-bar.el" "mh-e/mh-gnus.el"
+;;;;;;  "mh-e/mh-loaddefs.el" "minibuffer.el" "mouse.el" 
"net/tramp-loaddefs.el"
+;;;;;;  "newcomment.el" "obarray.el" "org/ob-core.el" "org/ob-lob.el"
+;;;;;;  "org/ob-matlab.el" "org/ob-tangle.el" "org/ob.el" "org/ol-bbdb.el"
+;;;;;;  "org/ol-irc.el" "org/ol.el" "org/org-archive.el" "org/org-attach.el"
+;;;;;;  "org/org-clock.el" "org/org-colview.el" "org/org-compat.el"
+;;;;;;  "org/org-datetree.el" "org/org-duration.el" "org/org-element.el"
+;;;;;;  "org/org-feed.el" "org/org-footnote.el" "org/org-goto.el"
+;;;;;;  "org/org-id.el" "org/org-indent.el" "org/org-install.el"
+;;;;;;  "org/org-keys.el" "org/org-lint.el" "org/org-list.el" "org/org-macs.el"
+;;;;;;  "org/org-mobile.el" "org/org-num.el" "org/org-plot.el" 
"org/org-refile.el"
+;;;;;;  "org/org-table.el" "org/org-timer.el" "org/ox-ascii.el" 
"org/ox-beamer.el"
+;;;;;;  "org/ox-html.el" "org/ox-icalendar.el" "org/ox-latex.el"
+;;;;;;  "org/ox-md.el" "org/ox-odt.el" "org/ox-org.el" "org/ox-publish.el"
+;;;;;;  "org/ox-texinfo.el" "org/ox.el" "progmodes/elisp-mode.el"
+;;;;;;  "progmodes/prog-mode.el" "ps-mule.el" "register.el" "replace.el"
+;;;;;;  "rfn-eshadow.el" "select.el" "simple.el" "startup.el" "subdirs.el"
+;;;;;;  "subr.el" "tab-bar.el" "textmodes/fill.el" "textmodes/makeinfo.el"
 ;;;;;;  "textmodes/page.el" "textmodes/paragraphs.el" "textmodes/reftex-auc.el"
 ;;;;;;  "textmodes/reftex-cite.el" "textmodes/reftex-dcr.el" 
"textmodes/reftex-global.el"
 ;;;;;;  "textmodes/reftex-index.el" "textmodes/reftex-parse.el" 
"textmodes/reftex-ref.el"
-;;;;;;  "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" 
"textmodes/text-mode.el"
-;;;;;;  "uniquify.el" "vc/ediff-hook.el" "vc/vc-hooks.el" "version.el"
-;;;;;;  "widget.el" "window.el") (0 0 0 0))
+;;;;;;  "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" 
"textmodes/texnfo-upd.el"
+;;;;;;  "textmodes/text-mode.el" "uniquify.el" "vc/ediff-hook.el"
+;;;;;;  "vc/vc-hooks.el" "version.el" "widget.el" "window.el") (0
+;;;;;;  0 0 0))
 
 ;;;***
 
diff --git a/lisp/mail/supercite.el b/lisp/mail/supercite.el
index dc1c641..d545b0c 100644
--- a/lisp/mail/supercite.el
+++ b/lisp/mail/supercite.el
@@ -1128,6 +1128,8 @@ selection but before querying is performed.  During
 auto-selected citation string and the variable `attribution' is bound
 to the auto-selected attribution string."
   (run-hooks 'sc-attribs-preselect-hook)
+  (with-suppressed-warnings ((lexical citation attribution))
+    (defvar citation) (defvar attribution))
   (let ((query-p sc-confirm-always-p)
        attribution citation
        (attriblist sc-preferred-attribution-list))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 4042a80..bd981ea 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -1882,6 +1882,9 @@ they ran"))
     (bindings--define-key menu [describe-function]
       '(menu-item "Describe Function..." describe-function
                   :help "Display documentation of function/command"))
+    (bindings--define-key menu [describe-command]
+      '(menu-item "Describe Command..." describe-command
+                  :help "Display documentation of command"))
     (bindings--define-key menu [shortdoc-display-group]
       '(menu-item "Function Group Overview..." shortdoc-display-group
                   :help "Display a function overview for a specific topic"))
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 98691c2..caf06ec 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -122,10 +122,10 @@ This metadata is an alist.  Currently understood keys are:
    returns a string to append to STRING.
 - `affixation-function': function to prepend/append a prefix/suffix to
    entries.  Takes one argument (COMPLETIONS) and should return a list
-   of completions with a list of either two elements: completion
-   and suffix, or three elements: completion, its prefix
-   and suffix.  This function takes priority over `annotation-function'
-   when both are provided, so only this function is used.
+   of annotated completions.  The elements of the list must be
+   three-element lists: completion, its prefix and suffix.  This
+   function takes priority over `annotation-function' when both are
+   provided, so only this function is used.
 - `display-sort-function': function to sort entries in *Completions*.
    Takes one argument (COMPLETIONS) and should return a new list
    of completions.  Can operate destructively.
@@ -1972,11 +1972,11 @@ These include:
 
 `:affixation-function': Function to prepend/append a prefix/suffix to
    completions.  The function must accept one argument, a list of
-   completions, and return a list where each element is a list of
-   either two elements: a completion, and a suffix, or
-   three elements: a completion, a prefix and a suffix.
-   This function takes priority over `:annotation-function'
-   when both are provided, so only this function is used.
+   completions, and return a list of annotated completions.  The
+   elements of the list must be three-element lists: completion, its
+   prefix and suffix.  This function takes priority over
+   `:annotation-function' when both are provided, so only this
+   function is used.
 
 `:exit-function': Function to run after completion is performed.
 
@@ -3900,13 +3900,7 @@ See `completing-read' for the meaning of the arguments."
                 ;; `read-from-minibuffer' uses 1-based index.
                 (1+ (cdr initial-input)))))
 
-  (let* ((minibuffer-completion-table collection)
-         (minibuffer-completion-predicate predicate)
-         ;; FIXME: Remove/rename this var, see the next one.
-         (minibuffer-completion-confirm (unless (eq require-match t)
-                                          require-match))
-         (minibuffer--require-match require-match)
-         (base-keymap (if require-match
+  (let* ((base-keymap (if require-match
                          minibuffer-local-must-match-map
                         minibuffer-local-completion-map))
          (keymap (if (memq minibuffer-completing-file-name '(nil lambda))
@@ -3919,8 +3913,17 @@ See `completing-read' for the meaning of the arguments."
                     ;; in minibuffer-local-filename-completion-map can
                     ;; override bindings in base-keymap.
                     base-keymap)))
-         (result (read-from-minibuffer prompt initial-input keymap
-                                       nil hist def inherit-input-method)))
+         (result
+          (minibuffer-with-setup-hook
+              (lambda ()
+                (setq-local minibuffer-completion-table collection)
+                (setq-local minibuffer-completion-predicate predicate)
+                ;; FIXME: Remove/rename this var, see the next one.
+                (setq-local minibuffer-completion-confirm
+                            (unless (eq require-match t) require-match))
+                (setq-local minibuffer--require-match require-match))
+            (read-from-minibuffer prompt initial-input keymap
+                                  nil hist def inherit-input-method))))
     (when (and (equal result "") def)
       (setq result (if (consp def) (car def) def)))
     result))
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 0bbd927..61c40ff 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -628,10 +628,8 @@ offered."
   (let ((result
         (insert-file-contents
          (tramp-archive-gvfs-file-name filename) visit beg end replace)))
-    (prog1
-       (list (expand-file-name filename)
-             (cadr result))
-      (when visit (setq buffer-file-name filename)))))
+    (when visit (setq buffer-file-name filename))
+    (cons (expand-file-name filename) (cdr result))))
 
 (defun tramp-archive-handle-load
     (file &optional noerror nomessage nosuffix must-suffix)
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index dde92d8..b51ba11 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -3708,7 +3708,8 @@ Fall back to normal file name handler if no Tramp handler 
exists."
        (remote-prefix
         (with-current-buffer (process-buffer proc)
           (file-remote-p default-directory)))
-       (rest-string (process-get proc 'rest-string)))
+       (rest-string (process-get proc 'rest-string))
+       pos)
     (when rest-string
       (tramp-message proc 10 "Previous string:\n%s" rest-string))
     (tramp-message proc 6 "%S\n%s" proc string)
@@ -3730,28 +3731,27 @@ Fall back to normal file name handler if no Tramp 
handler exists."
 
       ;; Determine monitor name.
       (unless (tramp-connection-property-p proc "gio-file-monitor")
-        (cond
-         ;; We have seen this on cygwin gio and on emba.  Let's make some 
assumptions.
-         ((string-match
-           "Can't find module 'help' specified in GIO_USE_FILE_MONITOR" string)
-          (cond
-           ((getenv "EMACS_EMBA_CI")
-            (tramp-set-connection-property
-             proc "gio-file-monitor" 'GInotifyFileMonitor))
-           ((eq system-type 'cygwin)
-            (tramp-set-connection-property
-             proc "gio-file-monitor" 'GPollFileMonitor))
-           (t (tramp-error proc 'file-error "Cannot determine gio monitor"))))
-         ;; TODO: What happens, if several monitor names are reported?
-         ((string-match "\
+        (tramp-set-connection-property
+         proc "gio-file-monitor"
+         (cond
+          ;; We have seen this on cygwin gio and on emba.  Let's make
+          ;; some assumptions.
+          ((string-match
+            "Can't find module 'help' specified in GIO_USE_FILE_MONITOR" 
string)
+          (setq pos (match-end 0))
+           (cond
+            ((getenv "EMACS_EMBA_CI") 'GInotifyFileMonitor)
+            ((eq system-type 'cygwin) 'GPollFileMonitor)
+            (t nil)))
+          ;; TODO: What happens, if several monitor names are reported?
+          ((string-match "\
 Supported arguments for GIO_USE_FILE_MONITOR environment variable:
 \\s-*\\([[:alpha:]]+\\) - 20" string)
-          (tramp-set-connection-property
-           proc "gio-file-monitor"
+          (setq pos (match-end 0))
            (intern
-            (format "G%sFileMonitor" (capitalize (match-string 1 string))))))
-         (t (throw 'doesnt-work nil)))
-        (setq string (replace-match "" nil nil string)))
+           (format "G%sFileMonitor" (capitalize (match-string 1 string)))))
+          (t (setq pos (length string)) nil)))
+       (setq string (substring string pos)))
 
       ;; Delete empty lines.
       (setq string (tramp-compat-string-replace "\n\n" "\n" string))
@@ -3785,6 +3785,8 @@ Supported arguments for GIO_USE_FILE_MONITOR environment 
variable:
             `(file-notify ,object file-notify-callback))))))
 
     ;; Save rest of the string.
+    (while (string-match "^\n" string)
+      (setq string (replace-match "" nil nil string)))
     (when (zerop (length string)) (setq string nil))
     (when string (tramp-message proc 10 "Rest string:\n%s" string))
     (process-put proc 'rest-string string)))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index dc34b8f..015f458 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -64,6 +64,10 @@
 (declare-function netrc-parse "netrc")
 (defvar auto-save-file-name-transforms)
 
+;; Reload `tramp-compat' when we reload `tramp-autoloads' of the GNU ELPA 
package.
+;;;###autoload (when (featurep 'tramp-compat)
+;;;###autoload   (load "tramp-compat" 'noerror 'nomessage))
+
 ;;; User Customizable Internal Variables:
 
 (defgroup tramp nil
@@ -2188,14 +2192,15 @@ without a visible progress reporter."
 FILE must be a local file name on a connection identified via VEC."
   (declare (indent 3) (debug t))
   `(if (file-name-absolute-p ,file)
-      (let ((value (tramp-get-file-property ,vec ,file ,property 'undef)))
-       (when (eq value 'undef)
-         ;; We cannot pass @body as parameter to
-         ;; `tramp-set-file-property' because it mangles our
-         ;; debug messages.
-         (setq value (progn ,@body))
-         (tramp-set-file-property ,vec ,file ,property value))
-       value)
+       (let ((value (tramp-get-file-property
+                    ,vec ,file ,property tramp-cache-undefined)))
+        (when (eq value tramp-cache-undefined)
+          ;; We cannot pass @body as parameter to
+          ;; `tramp-set-file-property' because it mangles our debug
+          ;; messages.
+          (setq value (progn ,@body))
+          (tramp-set-file-property ,vec ,file ,property value))
+        value)
      ,@body))
 
 (font-lock-add-keywords 'emacs-lisp-mode '("\\<with-tramp-file-property\\>"))
@@ -2203,14 +2208,15 @@ FILE must be a local file name on a connection 
identified via VEC."
 (defmacro with-tramp-connection-property (key property &rest body)
   "Check in Tramp for property PROPERTY, otherwise execute BODY and set."
   (declare (indent 2) (debug t))
-  `(let ((value (tramp-get-connection-property ,key ,property 'undef)))
-    (when (eq value 'undef)
-      ;; We cannot pass ,@body as parameter to
-      ;; `tramp-set-connection-property' because it mangles our debug
-      ;; messages.
-      (setq value (progn ,@body))
-      (tramp-set-connection-property ,key ,property value))
-    value))
+  `(let ((value (tramp-get-connection-property
+                ,key ,property tramp-cache-undefined)))
+     (when (eq value tramp-cache-undefined)
+       ;; We cannot pass ,@body as parameter to
+       ;; `tramp-set-connection-property' because it mangles our debug
+       ;; messages.
+       (setq value (progn ,@body))
+       (tramp-set-connection-property ,key ,property value))
+     value))
 
 (font-lock-add-keywords
  'emacs-lisp-mode '("\\<with-tramp-connection-property\\>"))
@@ -2564,7 +2570,9 @@ Falls back to normal file name handler if no Tramp file 
name handler exists."
   (tramp-unload-file-name-handlers)
   (when tramp-mode
     ;; We cannot use `tramp-compat-temporary-file-directory' here due
-    ;; to autoload.
+    ;; to autoload.  When installing Tramp's GNU ELPA package, there
+    ;; might be an older, incompatible version active.  We try to
+    ;; overload this.
     (let ((default-directory temporary-file-directory))
       (load "tramp" 'noerror 'nomessage)))
   (apply operation args)))
@@ -3713,21 +3721,19 @@ User is always nil."
                 (signal (car err) (cdr err))))))
 
        ;; Save exit.
-       (progn
-         (when visit
-           (setq buffer-file-name filename
-                 buffer-read-only (not (file-writable-p filename)))
-           (set-visited-file-modtime)
-           (set-buffer-modified-p nil))
-         (when (and (stringp local-copy)
-                    (or remote-copy (null tramp-temp-buffer-file-name)))
-           (delete-file local-copy))
-         (when (stringp remote-copy)
-           (delete-file (tramp-make-tramp-file-name v remote-copy 'nohop)))))
+       (when visit
+         (setq buffer-file-name filename
+               buffer-read-only (not (file-writable-p filename)))
+         (set-visited-file-modtime)
+         (set-buffer-modified-p nil))
+       (when (and (stringp local-copy)
+                  (or remote-copy (null tramp-temp-buffer-file-name)))
+         (delete-file local-copy))
+       (when (stringp remote-copy)
+         (delete-file (tramp-make-tramp-file-name v remote-copy 'nohop))))
 
       ;; Result.
-      (list (expand-file-name filename)
-           (cadr result)))))
+      (cons (expand-file-name filename) (cdr result)))))
 
 (defun tramp-handle-load (file &optional noerror nomessage nosuffix 
must-suffix)
   "Like `load' for Tramp files."
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 4f79fa9..0229232 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -615,7 +615,7 @@ must not be within a `c-save-buffer-state', since the user 
then
 wouldn't be able to undo them.
 
 The return value is the value of the last form in BODY."
-  (declare (debug t) (indent 1))
+  (declare (debug let*) (indent 1))
   (if (fboundp 'with-silent-modifications)
       `(with-silent-modifications (let* ,varlist ,@body))
     `(let* ((modified (buffer-modified-p)) (buffer-undo-list t)
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 1a96755..8e6ce3d 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -4512,7 +4512,7 @@ overlay arrow in source buffer."
   (let ((frame (gdb-mi--field (gdb-mi--partial-output) 'frame)))
     (when frame
       (setq gdb-selected-frame (gdb-mi--field frame 'func))
-      (setq gdb-selected-file (gdb-mi--field frame 'fullname))
+      (setq gdb-selected-file (file-local-name (gdb-mi--field frame 
'fullname)))
       (setq gdb-frame-number (gdb-mi--field frame 'level))
       (setq gdb-frame-address (gdb-mi--field frame 'addr))
       (let ((line (gdb-mi--field frame 'line)))
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 914d7ce..d47d9d7 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -1,7 +1,7 @@
 ;;; project.el --- Operations on the current project  -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
-;; Version: 0.5.4
+;; Version: 0.6.0
 ;; Package-Requires: ((emacs "26.1") (xref "1.0.2"))
 
 ;; This is a GNU ELPA :core package.  Avoid using functionality that
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 84ac8fd..0c54a1d 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -291,6 +291,7 @@ Only has effect when `ruby-use-smie' is nil."
 
 (defcustom ruby-encoding-map
   '((us-ascii       . nil)       ;; Do not put coding: us-ascii
+    (utf-8          . nil)       ;; Default since Ruby 2.0
     (shift-jis      . cp932)     ;; Emacs charset name of Shift_JIS
     (shift_jis      . cp932)     ;; MIME charset name of Shift_JIS
     (japanese-cp932 . cp932))    ;; Emacs charset name of CP932
@@ -760,7 +761,7 @@ The style of the comment is controlled by 
`ruby-encoding-magic-comment-style'."
 
 (defun ruby--detect-encoding ()
   (if (eq ruby-insert-encoding-magic-comment 'always-utf8)
-      "utf-8"
+      'utf-8
     (let ((coding-system
            (or save-buffer-coding-system
                buffer-file-coding-system)))
@@ -769,12 +770,11 @@ The style of the comment is controlled by 
`ruby-encoding-magic-comment-style'."
                 (or (coding-system-get coding-system 'mime-charset)
                     (coding-system-change-eol-conversion coding-system nil))))
       (if coding-system
-          (symbol-name
-           (if ruby-use-encoding-map
-               (let ((elt (assq coding-system ruby-encoding-map)))
-                 (if elt (cdr elt) coding-system))
-             coding-system))
-        "ascii-8bit"))))
+          (if ruby-use-encoding-map
+              (let ((elt (assq coding-system ruby-encoding-map)))
+                (if elt (cdr elt) coding-system))
+            coding-system)
+        'ascii-8bit))))
 
 (defun ruby--encoding-comment-required-p ()
   (or (eq ruby-insert-encoding-magic-comment 'always-utf8)
@@ -796,7 +796,7 @@ The style of the comment is controlled by 
`ruby-encoding-magic-comment-style'."
                    (unless (string= (match-string 2) coding-system)
                      (goto-char (match-beginning 2))
                      (delete-region (point) (match-end 2))
-                     (insert coding-system)))
+                     (insert (symbol-name coding-system))))
                   ((looking-at "\\s *#.*coding\\s *[:=]"))
                   (t (when ruby-insert-encoding-magic-comment
                        (ruby--insert-coding-comment coding-system))))
@@ -2127,11 +2127,9 @@ It will be properly highlighted even when the call omits 
parens.")
           "loop"
           "open"
           "p"
-          "print"
           "printf"
           "proc"
           "putc"
-          "puts"
           "require"
           "require_relative"
           "spawn"
@@ -2180,9 +2178,11 @@ It will be properly highlighted even when the call omits 
parens.")
           "fork"
           "global_variables"
           "local_variables"
+          "print"
           "private"
           "protected"
           "public"
+          "puts"
           "raise"
           "rand"
           "readline"
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index e80603f..7fc7181 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -1,7 +1,7 @@
 ;;; xref.el --- Cross-referencing commands              -*-lexical-binding:t-*-
 
 ;; Copyright (C) 2014-2021 Free Software Foundation, Inc.
-;; Version: 1.0.4
+;; Version: 1.1.0
 ;; Package-Requires: ((emacs "26.1"))
 
 ;; This is a GNU ELPA :core package.  Avoid functionality that is not
diff --git a/lisp/replace.el b/lisp/replace.el
index b5dea61..fe2cbc4 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -432,6 +432,9 @@ In Transient Mark mode, if the mark is active, operate on 
the contents
 of the region.  Otherwise, operate from point to the end of the buffer's
 accessible portion.
 
+When invoked interactively, matching a newline with `\\n' will not work;
+use `C-q C-j' instead.  To match a tab character (`\\t'), just press `TAB'.
+
 Use \\<minibuffer-local-map>\\[next-history-element] \
 to pull the last incremental search regexp to the minibuffer
 that reads REGEXP, or invoke replacements from
diff --git a/lisp/reposition.el b/lisp/reposition.el
index 008fa00..02bee41 100644
--- a/lisp/reposition.el
+++ b/lisp/reposition.el
@@ -38,7 +38,7 @@
 ;;; Code:
 
 ;;;###autoload
-(defun reposition-window (&optional arg)
+(defun reposition-window (&optional arg interactive)
   "Make the current definition and/or comment visible.
 Further invocations move it to the top of the window or toggle the
 visibility of comments that precede it.
@@ -55,118 +55,124 @@ the comment lines.
 visible (if only part could otherwise be made so), to make the defun line
 visible (if point is in code and it could not be made so, or if only
 comments, including the first comment line, are visible), or to make the
-first comment line visible (if point is in a comment)."
-  (interactive "P")
-  (let* (;; (here (line-beginning-position))
-        (here (point))
-        ;; change this name once I've gotten rid of references to ht.
-        ;; this is actually the number of the last screen line
-        (ht (- (window-height) 2))
-        (line (repos-count-screen-lines (window-start) (point)))
-        (comment-height
-         ;; The call to max deals with the case of cursor between defuns.
-         (max 0
-              (repos-count-screen-lines-signed
-               ;; the beginning of the preceding comment
-               (save-excursion
-                 (if (not (eobp)) (forward-char 1))
-                 (end-of-defun -1)
-                 ;; Skip whitespace, newlines, and form feeds.
-                 (if (re-search-forward "[^ \t\n\f]" nil t)
-                     (backward-char 1))
-                 (point))
-               here)))
-        (defun-height
-          (repos-count-screen-lines-signed
-           (save-excursion
-             (end-of-defun 1) ; so comments associate with following defuns
-             (beginning-of-defun 1)
-             (point))
-           here))
-        ;; This must be positive, so don't use the signed version.
-        (defun-depth (repos-count-screen-lines here
-                                               (save-excursion
-                                                 (end-of-defun 1)
-                                                 (point))))
-        (defun-line-onscreen-p
-          (and (<= defun-height line)
-               (<= (- line defun-height) ht))))
-    (cond ((or (= comment-height line)
-              (and (= line ht)
-                   (> comment-height line)
-                   ;; if defun line offscreen, we should be in case 4
-                   defun-line-onscreen-p))
-          ;; Either first comment line is at top of screen or (point at
-          ;; bottom of screen, defun line onscreen, and first comment line
-          ;; off top of screen).  That is, it looks like we just did
-          ;; recenter-definition, trying to fit as much of the comment
-          ;; onscreen as possible.  Put defun line at top of screen; that
-          ;; is, show as much code, and as few comments, as possible.
-
-          (if (and arg (> defun-depth (1+ ht)))
-              ;; Can't fit whole defun onscreen without moving point.
-              (progn (end-of-defun) (beginning-of-defun) (recenter 0))
-            (recenter (max defun-height 0)))
-          ;;(repos-debug-macro "1")
-          )
-
-         ((or (= defun-height line)
-              (= line 0)
-              (and (< line comment-height)
-                   (< defun-height 0)))
-          ;; Defun line or cursor at top of screen, OR cursor in comment
-          ;; whose first line is offscreen.
-          ;; Avoid moving definition up even if defun runs offscreen;
-          ;; we care more about getting the comment onscreen.
-
-          (cond ((= line ht)
-                 ;; cursor on last screen line (and so in a comment)
-                 (if arg (progn (end-of-defun) (beginning-of-defun)))
-                 (recenter 0)
-                 ;;(repos-debug-macro "2a")
-                 )
-
-                ;; This condition, copied from case 4, may not be quite right
-
-                ((and arg (< ht comment-height))
-                 ;; Can't get first comment line onscreen.
-                 ;; Go there and try again.
-                 (forward-line (- comment-height))
-                 (beginning-of-line)
-                 ;; was (reposition-window)
-                 (recenter 0)
-                 ;;(repos-debug-macro "2b")
-                 )
-                (t
-                 (recenter (min ht comment-height))
-                 ;;(repos-debug-macro "2c")
-                 ))
-          ;; (recenter (min ht comment-height))
-          )
-
-         ((and (> (+ line defun-depth -1) ht)
-               defun-line-onscreen-p)
-          ;; Defun runs off the bottom of the screen and the defun line
-          ;; is onscreen.
-          ;; Move the defun up.
-          (recenter (max 0 (1+ (- ht defun-depth)) defun-height))
-          ;;(repos-debug-macro "3")
-          )
-
-         (t
-          ;; If on the bottom line and comment start is offscreen
-          ;; then just move all comments offscreen, or at least as
-          ;; far as they'll go.
-
-          ;; Try to get as much of the comments onscreen as possible.
-          (if (and arg (< ht comment-height))
-              ;; Can't get defun line onscreen; go there and try again.
-              (progn (forward-line (- defun-height))
-                     (beginning-of-line)
-                     (reposition-window))
-            (recenter (min ht comment-height)))
-          ;;(repos-debug-macro "4")
-          ))))
+first comment line visible (if point is in a comment).
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "P\nd")
+  (if interactive
+      (condition-case e
+          (reposition-window arg nil)
+        (scan-error (user-error (cadr e))))
+    (let* (;; (here (line-beginning-position))
+          (here (point))
+          ;; change this name once I've gotten rid of references to ht.
+          ;; this is actually the number of the last screen line
+          (ht (- (window-height) 2))
+          (line (repos-count-screen-lines (window-start) (point)))
+          (comment-height
+           ;; The call to max deals with the case of cursor between defuns.
+           (max 0
+                (repos-count-screen-lines-signed
+                 ;; the beginning of the preceding comment
+                 (save-excursion
+                   (if (not (eobp)) (forward-char 1))
+                   (end-of-defun -1)
+                   ;; Skip whitespace, newlines, and form feeds.
+                   (if (re-search-forward "[^ \t\n\f]" nil t)
+                       (backward-char 1))
+                   (point))
+                 here)))
+          (defun-height
+            (repos-count-screen-lines-signed
+             (save-excursion
+               (end-of-defun 1) ; so comments associate with following defuns
+               (beginning-of-defun 1)
+               (point))
+             here))
+          ;; This must be positive, so don't use the signed version.
+          (defun-depth (repos-count-screen-lines here
+                                                 (save-excursion
+                                                   (end-of-defun 1)
+                                                   (point))))
+          (defun-line-onscreen-p
+            (and (<= defun-height line)
+                 (<= (- line defun-height) ht))))
+      (cond ((or (= comment-height line)
+                (and (= line ht)
+                     (> comment-height line)
+                     ;; if defun line offscreen, we should be in case 4
+                     defun-line-onscreen-p))
+            ;; Either first comment line is at top of screen or (point at
+            ;; bottom of screen, defun line onscreen, and first comment line
+            ;; off top of screen).  That is, it looks like we just did
+            ;; recenter-definition, trying to fit as much of the comment
+            ;; onscreen as possible.  Put defun line at top of screen; that
+            ;; is, show as much code, and as few comments, as possible.
+
+            (if (and arg (> defun-depth (1+ ht)))
+                ;; Can't fit whole defun onscreen without moving point.
+                (progn (end-of-defun) (beginning-of-defun) (recenter 0))
+              (recenter (max defun-height 0)))
+            ;;(repos-debug-macro "1")
+            )
+
+           ((or (= defun-height line)
+                (= line 0)
+                (and (< line comment-height)
+                     (< defun-height 0)))
+            ;; Defun line or cursor at top of screen, OR cursor in comment
+            ;; whose first line is offscreen.
+            ;; Avoid moving definition up even if defun runs offscreen;
+            ;; we care more about getting the comment onscreen.
+
+            (cond ((= line ht)
+                   ;; cursor on last screen line (and so in a comment)
+                   (if arg (progn (end-of-defun) (beginning-of-defun)))
+                   (recenter 0)
+                   ;;(repos-debug-macro "2a")
+                   )
+
+                  ;; This condition, copied from case 4, may not be quite right
+
+                  ((and arg (< ht comment-height))
+                   ;; Can't get first comment line onscreen.
+                   ;; Go there and try again.
+                   (forward-line (- comment-height))
+                   (beginning-of-line)
+                   ;; was (reposition-window)
+                   (recenter 0)
+                   ;;(repos-debug-macro "2b")
+                   )
+                  (t
+                   (recenter (min ht comment-height))
+                   ;;(repos-debug-macro "2c")
+                   ))
+            ;; (recenter (min ht comment-height))
+            )
+
+           ((and (> (+ line defun-depth -1) ht)
+                 defun-line-onscreen-p)
+            ;; Defun runs off the bottom of the screen and the defun line
+            ;; is onscreen.
+            ;; Move the defun up.
+            (recenter (max 0 (1+ (- ht defun-depth)) defun-height))
+            ;;(repos-debug-macro "3")
+            )
+
+           (t
+            ;; If on the bottom line and comment start is offscreen
+            ;; then just move all comments offscreen, or at least as
+            ;; far as they'll go.
+
+            ;; Try to get as much of the comments onscreen as possible.
+            (if (and arg (< ht comment-height))
+                ;; Can't get defun line onscreen; go there and try again.
+                (progn (forward-line (- defun-height))
+                       (beginning-of-line)
+                       (reposition-window))
+              (recenter (min ht comment-height)))
+            ;;(repos-debug-macro "4")
+            )))))
 
 ;;; Auxiliary functions
 
diff --git a/lisp/simple.el b/lisp/simple.el
index 6a964cd0..6053506 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -190,7 +190,7 @@ to navigate in it.")
 It takes two arguments, a buffer position in the error buffer
 and a buffer position in the error locus buffer.
 The buffer for the error locus should already be current.
-nil means use goto-char using the second argument position.")
+nil means use `goto-char' using the second argument position.")
 
 (defsubst next-error-buffer-p (buffer
                               &optional avoid-current
@@ -389,7 +389,7 @@ Intended to be used in `next-error-found-function'."
 (defcustom next-error-found-function #'ignore
   "Function called when a next locus is found and displayed.
 Function is called with two arguments: a FROM-BUFFER buffer
-from which next-error navigated, and a target buffer TO-BUFFER."
+from which `next-error' navigated, and a target buffer TO-BUFFER."
   :type '(choice (const :tag "No default" ignore)
                  (const :tag "Quit previous window with M-0"
                         next-error-quit-window)
@@ -399,7 +399,7 @@ from which next-error navigated, and a target buffer 
TO-BUFFER."
 
 (defun next-error-found (&optional from-buffer to-buffer)
   "Function to call when the next locus is found and displayed.
-FROM-BUFFER is a buffer from which next-error navigated,
+FROM-BUFFER is a buffer from which `next-error' navigated,
 and TO-BUFFER is a target buffer."
   (setq next-error-last-buffer (or from-buffer (current-buffer)))
   (when to-buffer
@@ -597,10 +597,12 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
          ;; Don't auto-fill if we have a prefix argument.
          (auto-fill-function (if arg nil auto-fill-function))
          (arg (prefix-numeric-value arg))
+         (procsym (make-symbol "newline-postproc")) ;(bug#46326)
          (postproc
           ;; Do the rest in post-self-insert-hook, because we want to do it
           ;; *before* other functions on that hook.
           (lambda ()
+            (remove-hook 'post-self-insert-hook procsym t)
             ;; Mark the newline(s) `hard'.
             (if use-hard-newlines
                 (set-hard-newline-properties
@@ -619,6 +621,7 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
             ;; starts a page.
             (or was-page-start
                 (move-to-left-margin nil t)))))
+    (fset procsym postproc)
     (if (not interactive)
        ;; FIXME: For non-interactive uses, many calls actually
        ;; just want (insert "\n"), so maybe we should do just
@@ -628,13 +631,13 @@ A non-nil INTERACTIVE argument means to run the 
`post-self-insert-hook'."
          (self-insert-command arg))
       (unwind-protect
          (progn
-           (add-hook 'post-self-insert-hook postproc nil t)
+           (add-hook 'post-self-insert-hook procsym nil t)
            (self-insert-command arg))
        ;; We first used let-binding to protect the hook, but that
        ;; was naive since add-hook affects the symbol-default
        ;; value of the variable, whereas the let-binding might
        ;; protect only the buffer-local value.
-       (remove-hook 'post-self-insert-hook postproc t))))
+       (remove-hook 'post-self-insert-hook procsym t))))
   nil)
 
 (defun set-hard-newline-properties (from to)
@@ -1800,8 +1803,8 @@ moving point."
 
 (defun eval-expression-get-print-arguments (prefix-argument)
   "Get arguments for commands that print an expression result.
-Returns a list (INSERT-VALUE NO-TRUNCATE CHAR-PRINT-LIMIT)
-based on PREFIX-ARG.  This function determines the interpretation
+Returns a list (INSERT-VALUE NO-TRUNCATE CHAR-PRINT-LIMIT) based
+on PREFIX-ARGUMENT.  This function determines the interpretation
 of the prefix argument for `eval-expression' and
 `eval-last-sexp'."
   (let ((num (prefix-numeric-value prefix-argument)))
@@ -1982,7 +1985,8 @@ This function uses the `read-extended-command-predicate' 
user option."
        (concat (cond
                ((eq current-prefix-arg '-) "- ")
                ((and (consp current-prefix-arg)
-                     (eq (car current-prefix-arg) 4)) "C-u ")
+                     (eq (car current-prefix-arg) 4))
+                "C-u ")
                ((and (consp current-prefix-arg)
                      (integerp (car current-prefix-arg)))
                 (format "%d " (car current-prefix-arg)))
@@ -2080,8 +2084,11 @@ or (if one of MODES is a minor mode), if it is switched 
on in BUFFER."
                             (obsolete
                              (format " (%s)" (car obsolete)))
                             ((and binding (not (stringp binding)))
-                             (format " (%s)" (key-description binding))))))
-         (if suffix (list command-name suffix) command-name)))
+                             (format " (%s)" (key-description binding)))
+                            (t ""))))
+         (put-text-property 0 (length suffix)
+                            'face 'completions-annotations suffix)
+         (list command-name "" suffix)))
      command-names)))
 
 (defcustom suggest-key-bindings t
@@ -3373,8 +3380,7 @@ is not *inside* the region START...END."
              (> (cdr undo-elt) start)))))
 
 (defun undo-adjust-elt (elt deltas)
-  "Return adjustment of undo element ELT by the undo DELTAS
-list."
+  "Return adjustment of undo element ELT by the undo DELTAS list."
   (pcase elt
     ;; POSITION
     ((pred integerp)
@@ -3418,8 +3424,7 @@ list."
 ;; There was no strong reason to prefer one or the other, except that
 ;; the first is more consistent with prior undo in region behavior.
 (defun undo-adjust-beg-end (beg end deltas)
-  "Return cons of adjustments to BEG and END by the undo DELTAS
-list."
+  "Return cons of adjustments to BEG and END by the undo DELTAS list."
   (let ((adj-beg (undo-adjust-pos beg deltas)))
     ;; Note: option 2 above would be like (cons (min ...) adj-end)
     (cons adj-beg
@@ -5241,8 +5246,7 @@ region instead.
 This command's old key binding has been given to `kill-ring-save'."
   ;; Pass mark first, then point, because the order matters when
   ;; calling `kill-append'.
-  (interactive (list (mark) (point)
-                    (prefix-numeric-value current-prefix-arg)))
+  (interactive (list (mark) (point) 'region))
   (let ((str (if region
                  (funcall region-extract-function nil)
                (filter-buffer-substring beg end))))
@@ -5274,8 +5278,7 @@ This command is similar to `copy-region-as-kill', except 
that it gives
 visual feedback indicating the extent of the region being copied."
   ;; Pass mark first, then point, because the order matters when
   ;; calling `kill-append'.
-  (interactive (list (mark) (point)
-                    (prefix-numeric-value current-prefix-arg)))
+  (interactive (list (mark) (point) 'region))
   (copy-region-as-kill beg end region)
   ;; This use of called-interactively-p is correct because the code it
   ;; controls just gives the user visual feedback.
@@ -7688,44 +7691,53 @@ are interchanged."
   (interactive "*p")
   (transpose-subr 'forward-word arg))
 
-(defun transpose-sexps (arg)
+(defun transpose-sexps (arg &optional interactive)
   "Like \\[transpose-chars] (`transpose-chars'), but applies to sexps.
 Unlike `transpose-words', point must be between the two sexps and not
 in the middle of a sexp to be transposed.
 With non-zero prefix arg ARG, effect is to take the sexp before point
 and drag it forward past ARG other sexps (backward if ARG is negative).
 If ARG is zero, the sexps ending at or after point and at or after mark
-are interchanged."
-  (interactive "*p")
-  (transpose-subr
-   (lambda (arg)
-     ;; Here we should try to simulate the behavior of
-     ;; (cons (progn (forward-sexp x) (point))
-     ;;       (progn (forward-sexp (- x)) (point)))
-     ;; Except that we don't want to rely on the second forward-sexp
-     ;; putting us back to where we want to be, since forward-sexp-function
-     ;; might do funny things like infix-precedence.
-     (if (if (> arg 0)
-            (looking-at "\\sw\\|\\s_")
-          (and (not (bobp))
-               (save-excursion (forward-char -1) (looking-at "\\sw\\|\\s_"))))
-        ;; Jumping over a symbol.  We might be inside it, mind you.
-        (progn (funcall (if (> arg 0)
-                            'skip-syntax-backward 'skip-syntax-forward)
-                        "w_")
-               (cons (save-excursion (forward-sexp arg) (point)) (point)))
-       ;; Otherwise, we're between sexps.  Take a step back before jumping
-       ;; to make sure we'll obey the same precedence no matter which direction
-       ;; we're going.
-       (funcall (if (> arg 0) 'skip-syntax-backward 'skip-syntax-forward) " .")
-       (cons (save-excursion (forward-sexp arg) (point))
-            (progn (while (or (forward-comment (if (> arg 0) 1 -1))
-                              (not (zerop (funcall (if (> arg 0)
-                                                       'skip-syntax-forward
-                                                     'skip-syntax-backward)
-                                                   ".")))))
-                   (point)))))
-   arg 'special))
+are interchanged.
+If INTERACTIVE is non-nil, as it is interactively,
+report errors as appropriate for this kind of usage."
+  (interactive "*p\nd")
+  (if interactive
+      (condition-case nil
+          (transpose-sexps arg nil)
+        (scan-error (user-error "Not between two complete sexps")))
+    (transpose-subr
+     (lambda (arg)
+       ;; Here we should try to simulate the behavior of
+       ;; (cons (progn (forward-sexp x) (point))
+       ;;       (progn (forward-sexp (- x)) (point)))
+       ;; Except that we don't want to rely on the second forward-sexp
+       ;; putting us back to where we want to be, since forward-sexp-function
+       ;; might do funny things like infix-precedence.
+       (if (if (> arg 0)
+              (looking-at "\\sw\\|\\s_")
+            (and (not (bobp))
+                 (save-excursion
+                    (forward-char -1)
+                    (looking-at "\\sw\\|\\s_"))))
+          ;; Jumping over a symbol.  We might be inside it, mind you.
+          (progn (funcall (if (> arg 0)
+                              'skip-syntax-backward 'skip-syntax-forward)
+                          "w_")
+                 (cons (save-excursion (forward-sexp arg) (point)) (point)))
+         ;; Otherwise, we're between sexps.  Take a step back before jumping
+         ;; to make sure we'll obey the same precedence no matter which
+         ;; direction we're going.
+         (funcall (if (> arg 0) 'skip-syntax-backward 'skip-syntax-forward)
+                  " .")
+         (cons (save-excursion (forward-sexp arg) (point))
+              (progn (while (or (forward-comment (if (> arg 0) 1 -1))
+                                (not (zerop (funcall (if (> arg 0)
+                                                         'skip-syntax-forward
+                                                       'skip-syntax-backward)
+                                                     ".")))))
+                     (point)))))
+     arg 'special)))
 
 (defun transpose-lines (arg)
   "Exchange current line and previous line, leaving point after both.
diff --git a/lisp/startup.el b/lisp/startup.el
index 65d50d8..9b4dde5 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -550,7 +550,9 @@ It is the default value of the variable `top-level'."
       ;; testsuite, add a temporary folder in front to produce there
       ;; new compilations.
       (when (equal (getenv "HOME") "/nonexistent")
-        (push (make-temp-file "emacs-testsuite-" t) comp-eln-load-path)))
+        (let ((tmp-dir (make-temp-file "emacs-testsuite-" t)))
+          (add-hook 'kill-emacs-hook (lambda () (delete-directory tmp-dir t)))
+          (push tmp-dir comp-eln-load-path))))
     ;; Look in each dir in load-path for a subdirs.el file.  If we
     ;; find one, load it, which will add the appropriate subdirs of
     ;; that dir into load-path.  This needs to be done before setting
diff --git a/lisp/subr.el b/lisp/subr.el
index 964eb8f..7a055f2 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1815,9 +1815,15 @@ This makes the hook buffer-local, and it makes t a 
member of the
 buffer-local value.  That acts as a flag to run the hook
 functions of the global value as well as in the local value.
 
-HOOK should be a symbol, and FUNCTION may be any valid function.  If
-HOOK is void, it is first set to nil.  If HOOK's value is a single
-function, it is changed to a list of functions."
+HOOK should be a symbol.  If HOOK is void, it is first set to
+nil.  If HOOK's value is a single function, it is changed to a
+list of functions.
+
+FUNCTION may be any valid function, but it's recommended to use a
+function symbol and not a lambda form.  Using a symbol will
+ensure that the function is not re-added if the function is
+edited, and using lambda forms may also have a negative
+performance impact when running `add-hook' and `remove-hook'."
   (or (boundp hook) (set hook nil))
   (or (default-boundp hook) (set-default hook nil))
   (unless (numberp depth) (setq depth (if depth 90 0)))
diff --git a/lisp/textmodes/makeinfo.el b/lisp/textmodes/makeinfo.el
index 653540a..13367a0 100644
--- a/lisp/textmodes/makeinfo.el
+++ b/lisp/textmodes/makeinfo.el
@@ -85,6 +85,7 @@ the proper way to specify those is with the Texinfo commands
 
 ;;; The `makeinfo' function definitions
 
+;;;###autoload
 (defun makeinfo-region (region-beginning region-end)
   "Make Info file from region of current Texinfo file, and switch to it.
 
@@ -222,6 +223,7 @@ nonsensical results."
         (match-string 1)
       "Top")))
 
+;;;###autoload
 (defun makeinfo-buffer ()
   "Make Info file from current buffer.
 
@@ -266,6 +268,7 @@ Use the \\[next-error] command to move to the next error
       (Info-revert-find-node
        makeinfo-output-file-name makeinfo-output-node-name))))
 
+;;;###autoload
 (defun makeinfo-recenter-compilation-buffer (linenum)
   "Redisplay `*compilation*' buffer so most recent output can be seen.
 The last line of the buffer is displayed on
@@ -286,4 +289,8 @@ line LINE of the window, or centered if LINE is nil."
 
 (provide 'makeinfo)
 
+;; Local Variables:
+;; generated-autoload-file: "texinfo-loaddefs.el"
+;; End:
+
 ;;; makeinfo.el ends here
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index 750a33d..11d60e1 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -69,202 +69,12 @@
 
 ;;; Autoloads:
 
-(autoload 'makeinfo-region
-  "makeinfo"
-  "Make Info file from region of current Texinfo file, and switch to it.
-
-This command does not offer the `next-error' feature since it would
-apply to a temporary file, not the original; use the `makeinfo-buffer'
-command to gain use of `next-error'."
-  t nil)
-
-(autoload 'makeinfo-buffer
-  "makeinfo"
-  "Make Info file from current buffer.
-
-Use the \\[next-error] command to move to the next error
-\(if there are errors)."
-  t nil)
-
 (autoload 'kill-compilation
   "compile"
   "Kill the process made by the \\[compile] command."
   t nil)
 
-(autoload 'makeinfo-recenter-compilation-buffer
-  "makeinfo"
-  "Redisplay `*compilation*' buffer so most recent output can be seen.
-The last line of the buffer is displayed on
-line LINE of the window, or centered if LINE is nil."
-  t nil)
-
-(autoload 'texinfo-update-node
-  "texnfo-upd"
-  "Without any prefix argument, update the node in which point is located.
-Non-nil argument (prefix, if interactive) means update the nodes in the
-marked region.
-
-The functions for creating or updating nodes and menus, and their
-keybindings, are:
-
-    `texinfo-update-node' (&optional region-p)    \\[texinfo-update-node]
-    `texinfo-every-node-update' ()                \\[texinfo-every-node-update]
-    `texinfo-sequential-node-update' (&optional region-p)
-
-    `texinfo-make-menu' (&optional region-p)      \\[texinfo-make-menu]
-    `texinfo-all-menus-update' ()                 \\[texinfo-all-menus-update]
-    `texinfo-master-menu' ()
-
-    `texinfo-indent-menu-description' (column &optional region-p)
-
-The `texinfo-column-for-description' variable specifies the column to
-which menu descriptions are indented. Its default value is 32."
-  t nil)
-
-(autoload 'texinfo-every-node-update
-  "texnfo-upd"
-  "Update every node in a Texinfo file."
-  t nil)
-
-(autoload 'texinfo-sequential-node-update
-  "texnfo-upd"
-  "Update one node (or many) in a Texinfo file with sequential pointers.
-
-This function causes the `Next' or `Previous' pointer to point to the
-immediately preceding or following node, even if it is at a higher or
-lower hierarchical level in the document.  Continually pressing `n' or
-`p' takes you straight through the file.
-
-Without any prefix argument, update the node in which point is located.
-Non-nil argument (prefix, if interactive) means update the nodes in the
-marked region.
-
-This command makes it awkward to navigate among sections and
-subsections; it should be used only for those documents that are meant
-to be read like a novel rather than a reference, and for which the
-Info `g*' command is inadequate."
-  t nil)
-
-(autoload 'texinfo-make-menu
-  "texnfo-upd"
-  "Without any prefix argument, make or update a menu.
-Make the menu for the section enclosing the node found following point.
-
-Non-nil argument (prefix, if interactive) means make or update menus
-for nodes within or part of the marked region.
-
-Whenever a menu exists, and is being updated, the descriptions that
-are associated with node names in the pre-existing menu are
-incorporated into the new menu.  Otherwise, the nodes' section titles
-are inserted as descriptions."
-  t nil)
-
-(autoload 'texinfo-all-menus-update
-  "texnfo-upd"
-  "Update every regular menu in a Texinfo file.
-Remove pre-existing master menu, if there is one.
-
-If called with a non-nil argument, this function first updates all the
-nodes in the buffer before updating the menus."
-  t nil)
-
-(autoload 'texinfo-master-menu
-  "texnfo-upd"
-  "Make a master menu for a whole Texinfo file.
-Non-nil argument (prefix, if interactive) means first update all
-existing nodes and menus.  Remove pre-existing master menu, if there is one.
-
-This function creates a master menu that follows the top node.  The
-master menu includes every entry from all the other menus.  It
-replaces any existing ordinary menu that follows the top node.
-
-If called with a non-nil argument, this function first updates all the
-menus in the buffer (incorporating descriptions from pre-existing
-menus) before it constructs the master menu.
-
-The function removes the detailed part of an already existing master
-menu.  This action depends on the pre-existing master menu using the
-standard `texinfo-master-menu-header'.
-
-The master menu has the following format, which is adapted from the
-recommendation in the Texinfo Manual:
-
-   * The first part contains the major nodes in the Texinfo file: the
-     nodes for the chapters, chapter-like sections, and the major
-     appendices.  This includes the indices, so long as they are in
-     chapter-like sections, such as unnumbered sections.
-
-   * The second and subsequent parts contain a listing of the other,
-     lower level menus, in order.  This way, an inquirer can go
-     directly to a particular node if he or she is searching for
-     specific information.
-
-Each of the menus in the detailed node listing is introduced by the
-title of the section containing the menu."
-  t nil)
-
-(autoload 'texinfo-indent-menu-description
-  "texnfo-upd"
-  "Indent every description in menu following point to COLUMN.
-Non-nil argument (prefix, if interactive) means indent every
-description in every menu in the region.  Does not indent second and
-subsequent lines of a multi-line description."
-  t nil)
-
-(autoload 'texinfo-insert-node-lines
-  "texnfo-upd"
-  "Insert missing `@node' lines in region of Texinfo file.
-Non-nil argument (prefix, if interactive) means also to insert the
-section titles as node names; and also to insert the section titles as
-node names in pre-existing @node lines that lack names."
-  t nil)
-
-(autoload 'texinfo-start-menu-description
-  "texnfo-upd"
-  "In this menu entry, insert the node's section title as a description.
-Position point at beginning of description ready for editing.
-Do not insert a title if the line contains an existing description.
-
-You will need to edit the inserted text since a useful description
-complements the node name rather than repeats it as a title does."
-  t nil)
-
-(autoload 'texinfo-multiple-files-update
-  "texnfo-upd"
-  "Update first node pointers in each file included in OUTER-FILE;
-create or update main menu in the outer file that refers to such nodes.
-This does not create or update menus or pointers within the included files.
-
-With optional MAKE-MASTER-MENU argument (prefix arg, if interactive),
-insert a master menu in OUTER-FILE.  This does not create or update
-menus or pointers within the included files.
-
-With optional UPDATE-EVERYTHING argument (numeric prefix arg, if
-interactive), update all the menus and all the `Next', `Previous', and
-`Up' pointers of all the files included in OUTER-FILE before inserting
-a master menu in OUTER-FILE.
-
-The command also updates the `Top' level node pointers of OUTER-FILE.
-
-Notes:
-
-  * this command does NOT save any files--you must save the
-    outer file and any modified, included files.
-
-  * except for the `Top' node, this command does NOT handle any
-    pre-existing nodes in the outer file; hence, indices must be
-    enclosed in an included file.
-
-Requirements:
-
-  * each of the included files must contain exactly one highest
-    hierarchical level node,
-  * this highest node must be the first node in the included file,
-  * each highest hierarchical level node must be of the same type.
-
-Thus, normally, each included file contains one, and only one,
-chapter."
-  t nil)
+(require 'texinfo-loaddefs)
 
 
 ;;; Code:
diff --git a/lisp/textmodes/texnfo-upd.el b/lisp/textmodes/texnfo-upd.el
index 0300454..f56f197 100644
--- a/lisp/textmodes/texnfo-upd.el
+++ b/lisp/textmodes/texnfo-upd.el
@@ -275,6 +275,7 @@ The keys are strings specifying the general hierarchical 
level in the
 document; the values are regular expressions.")
 
 
+;;;###autoload
 (defun texinfo-make-menu (&optional beginning end)
   "Without any prefix argument, make or update a menu.
 Make the menu for the section enclosing the node found following point.
@@ -351,6 +352,7 @@ at the level specified by LEVEL.  Point is left at the end 
of menu."
       (texinfo-delete-old-menu beginning first))
     (texinfo-insert-menu new-menu-list node-name)))
 
+;;;###autoload
 (defun texinfo-all-menus-update (&optional update-all-nodes-p)
   "Update every regular menu in a Texinfo file.
 Update pre-existing master menu, if there is one.
@@ -733,6 +735,7 @@ is the menu entry name, and the cdr of P is the node name."
 
 ;;; Starting menu descriptions by inserting titles
 
+;;;###autoload
 (defun texinfo-start-menu-description ()
   "In this menu entry, insert the node's section title as a description.
 Position point at beginning of description ready for editing.
@@ -817,6 +820,7 @@ complements the node name rather than repeats it as a title 
does."
 ;; Since the make-menu functions indent descriptions, these functions
 ;; are useful primarily for indenting a single menu specially.
 
+;;;###autoload
 (defun texinfo-indent-menu-description (column &optional region-p)
   "Indent every description in menu following point to COLUMN.
 Non-nil argument (prefix, if interactive) means indent every
@@ -872,6 +876,7 @@ second and subsequent lines of a multi-line description."
 
 ;;; Making the master menu
 
+;;;###autoload
 (defun texinfo-master-menu (update-all-nodes-menus-p)
   "Make a master menu for a whole Texinfo file.
 Remove pre-existing master menu, if there is one.
@@ -1266,6 +1271,7 @@ end of that region; it limits the search."
 
 ;;; Updating a node
 
+;;;###autoload
 (defun texinfo-update-node (&optional beginning end)
   "Without any prefix argument, update the node in which point is located.
 Interactively, a prefix argument means to operate on the region.
@@ -1313,6 +1319,7 @@ which menu descriptions are indented. Its default value 
is 32."
          (goto-char (point-max))
          (message "Done...nodes updated in region.  You may save the 
buffer."))))))
 
+;;;###autoload
 (defun texinfo-every-node-update ()
   "Update every node in a Texinfo file.
 
@@ -1553,6 +1560,7 @@ towards which the pointer is directed, one of `next', 
`previous', or `up'."
 ;; (The subsection to which `Next' points will most likely be the first
 ;; item on the section's menu.)
 
+;;;###autoload
 (defun texinfo-sequential-node-update (&optional region-p)
   "Update one node (or many) in a Texinfo file with sequential pointers.
 
@@ -1676,6 +1684,7 @@ or `Up' pointer."
 ;; before the `@chapter', `@section', and such like lines of a region
 ;; in a Texinfo file.
 
+;;;###autoload
 (defun texinfo-insert-node-lines (beginning end &optional title-p)
   "Insert missing `@node' lines in region of Texinfo file.
 Non-nil argument (prefix, if interactive) means also to insert the
@@ -1989,6 +1998,7 @@ be the files included within it.  A main menu must 
already exist."
 
 ;;; The multiple-file update function
 
+;;;###autoload
 (defun texinfo-multiple-files-update
   (outer-file &optional make-master-menu update-everything)
   "Update first node pointers in each file included in OUTER-FILE;
@@ -2114,4 +2124,8 @@ chapter."
 
 (provide 'texnfo-upd)
 
+;; Local Variables:
+;; generated-autoload-file: "texinfo-loaddefs.el"
+;; End:
+
 ;;; texnfo-upd.el ends here
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index 6b38806..2e20284 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -1194,7 +1194,7 @@ file were isearch was started."
     (forward-paragraph n)))
 
 (defcustom add-log-current-defun-header-regexp
-  "^\\([[:upper:]][[:upper:]_ ]*[[:upper:]_]\\|[-_[:alpha:]]+\\)[ \t]*[:=]"
+  "^\\([[:upper:]][[:upper:]_ 
]*[[:upper:]_]\\|[-_[:alnum:]]*[[:alpha:]][-_[:alnum:]]*\\)[ \t]*[:=]"
   "Heuristic regexp used by `add-log-current-defun' for unknown major modes.
 The regexp's first submatch is placed in the ChangeLog entry, in
 parentheses."
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 1c78490..b2b92b1 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -2002,9 +2002,8 @@ ARG is a prefix argument.  If nil, copy the current 
difference region."
                    (goto-char reg-to-delete-end)
                    (insert reg-to-copy)
 
-                   (if (> reg-to-delete-end reg-to-delete-beg)
-                       (kill-region reg-to-delete-beg reg-to-delete-end))
-                   ))
+                   (when (> reg-to-delete-end reg-to-delete-beg)
+                     (delete-region reg-to-delete-beg reg-to-delete-end))))
                (or batch-invocation
                    (setq
                     messg
@@ -2105,8 +2104,8 @@ ARG is a prefix argument.  If nil, copy the current 
difference region."
            (goto-char reg-end)
            (insert saved-diff)
 
-           (if (> reg-end reg-beg)
-               (kill-region reg-beg reg-end))
+           (when (> reg-end reg-beg)
+             (delete-region reg-beg reg-end))
 
            (setq recovered t)
            ))
diff --git a/lisp/window.el b/lisp/window.el
index 036eb27..cf57521 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -6133,29 +6133,27 @@ value can be also stored on disk and read back in a new 
session."
                ;; Select window if it's the selected one.
                (when (cdr (assq 'selected state))
                  (select-window window))
-                (when next-buffers
-                  (set-window-next-buffers
-                   window
-                   (delq nil (mapcar (lambda (buffer)
-                                       (setq buffer (get-buffer buffer))
-                                       (when (buffer-live-p buffer) buffer))
-                                     next-buffers))))
-                (when prev-buffers
-                  (set-window-prev-buffers
-                   window
-                   (delq nil (mapcar (lambda (entry)
-                                       (let ((buffer (get-buffer (nth 0 
entry)))
-                                             (m1 (nth 1 entry))
-                                             (m2 (nth 2 entry)))
-                                         (when (buffer-live-p buffer)
-                                           (list buffer
-                                                 (if (markerp m1) m1
-                                                   (set-marker (make-marker) m1
-                                                               buffer))
-                                                 (if (markerp m2) m2
-                                                   (set-marker (make-marker) m2
-                                                               buffer))))))
-                                     prev-buffers)))))
+                (set-window-next-buffers
+                 window
+                 (delq nil (mapcar (lambda (buffer)
+                                     (setq buffer (get-buffer buffer))
+                                     (when (buffer-live-p buffer) buffer))
+                                   next-buffers)))
+                (set-window-prev-buffers
+                 window
+                 (delq nil (mapcar (lambda (entry)
+                                     (let ((buffer (get-buffer (nth 0 entry)))
+                                           (m1 (nth 1 entry))
+                                           (m2 (nth 2 entry)))
+                                       (when (buffer-live-p buffer)
+                                         (list buffer
+                                               (if (markerp m1) m1
+                                                 (set-marker (make-marker) m1
+                                                             buffer))
+                                               (if (markerp m2) m2
+                                                 (set-marker (make-marker) m2
+                                                             buffer))))))
+                                   prev-buffers))))
            ;; We don't want to raise an error in case the buffer does
            ;; not exist anymore, so we switch to a previous one and
            ;; save the window with the intention of deleting it later
diff --git a/src/buffer.c b/src/buffer.c
index 8e33162..9e417bf 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5390,17 +5390,24 @@ init_buffer (void)
         recorded by temacs, that cannot be used by the dumped Emacs.
         We map new memory for their text here.
 
-        Implementation note: the buffers we carry from temacs are:
+        Implementation notes: the buffers we carry from temacs are:
         " prin1", "*scratch*", " *Minibuf-0*", "*Messages*", and
         " *code-conversion-work*".  They are created by
         init_buffer_once and init_window_once (which are not called
-        in the dumped Emacs), and by the first call to coding.c routines.  */
+        in the dumped Emacs), and by the first call to coding.c
+        routines.  Since FOR_EACH_LIVE_BUFFER only walks the buffers
+        in Vbuffer_alist, any buffer we carry from temacs that is
+        not in the alist (a.k.a. "magic invisible buffers") should
+        be handled here explicitly.  */
       FOR_EACH_LIVE_BUFFER (tail, buffer)
         {
          struct buffer *b = XBUFFER (buffer);
          b->text->beg = NULL;
          enlarge_buffer_text (b, 0);
        }
+      /* The " prin1" buffer is not in Vbuffer_alist.  */
+      XBUFFER (Vprin1_to_string_buffer)->text->beg = NULL;
+      enlarge_buffer_text (XBUFFER (Vprin1_to_string_buffer), 0);
     }
 #endif /* USE_MMAP_FOR_BUFFERS */
 
diff --git a/src/comp.c b/src/comp.c
index 5309be4..a4dba43 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -1,4 +1,4 @@
-/* Compile elisp into native code.
+/* Compile Emacs Lisp into native code.
    Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
 Author: Andrea Corallo <akrl@sdf.org>
@@ -4716,7 +4716,7 @@ maybe_defer_native_compilation (Lisp_Object function_name,
        return;
     }
 
-  /* This is to have deferred compilaiton able to compile comp
+  /* This is so deferred compilation is able to compile comp
      dependencies breaking circularity.  */
   if (!NILP (Ffeaturep (Qcomp, Qnil)))
     {
@@ -4949,7 +4949,7 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, 
bool loading_dump,
       /* In case another load of the same CU is active on the stack
         all ephemeral data is hold by that frame.  Re-writing
         'data_ephemeral_vec' would be not only a waste of cycles but
-        more importanly would lead to crashed if the contained data
+        more importantly would lead to crashes if the contained data
         is not cons hashed.  */
       if (!recursive_load)
        {
diff --git a/src/dispextern.h b/src/dispextern.h
index baf9212..c8cefec 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -1270,8 +1270,6 @@ extern struct glyph space_glyph;
 /* True means last display completed.  False means it was preempted.  */
 
 extern bool display_completed;
-extern bool delayed_size_change;
-
 
 /************************************************************************
                          Glyph Strings
diff --git a/src/dispnew.c b/src/dispnew.c
index 2760366..ab420bc 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -102,7 +102,7 @@ bool display_completed;
 
 /* True means SIGWINCH happened when not safe.  */
 
-bool delayed_size_change;
+static bool delayed_size_change;
 
 /* A glyph for a space.  */
 
@@ -5815,7 +5815,6 @@ deliver_window_change_signal (int sig)
 void
 do_pending_window_change (bool safe)
 {
-  /* If window change signal handler should have run before, run it now.  */
   if (redisplaying_p && !safe)
     return;
 
@@ -5830,8 +5829,11 @@ do_pending_window_change (bool safe)
          struct frame *f = XFRAME (frame);
 
          /* Negative new_width or new_height values mean no change is
-            required (a native size can never drop below zero).  */
-         if (f->new_height >= 0 || f->new_width >= 0)
+            required (a native size can never drop below zero).  If
+            new_size_p is not set, this means the size change was
+            requested by adjust_frame_size but has not been honored by
+            the window manager yet.  */
+         if (f->new_size_p && (f->new_height >= 0 || f->new_width >= 0))
            change_frame_size (f, f->new_width, f->new_height,
                               false, false, safe);
        }
@@ -5858,14 +5860,17 @@ change_frame_size_1 (struct frame *f, int new_width, 
int new_height,
       /* We can't deal with the change now, queue it for later.  */
       f->new_width = new_width;
       f->new_height = new_height;
+      f->new_size_p = true;
       delayed_size_change = true;
     }
   else
     {
       /* Storing -1 in the new_width/new_height slots means that no size
-        change is pending.  Native sizes are always non-negative.  */
+        change is pending.  Native sizes are always non-negative.
+        Reset the new_size_p slot as well.  */
       f->new_height = -1;
       f->new_width = -1;
+      f->new_size_p = false;
       /* adjust_frame_size wants its arguments in terms of text_width
         and text_height, so convert them here.  For pathologically
         small frames, the resulting values may be negative though.  */
diff --git a/src/doc.c b/src/doc.c
index 01f4368..e179a12 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -550,7 +550,7 @@ the same file name is found in the `doc-directory'.  */)
   Lisp_Object delayed_init =
     find_symbol_value (intern ("custom-delayed-init-variables"));
 
-  if (EQ (delayed_init, Qunbound)) delayed_init = Qnil;
+  if (!CONSP (delayed_init)) delayed_init = Qnil;
 
   CHECK_STRING (filename);
 
diff --git a/src/frame.c b/src/frame.c
index baa0e47..177022f 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -621,12 +621,8 @@ frame_size_history_extra (struct frame *f, Lisp_Object 
parameter,
  *   must be preserved.  The code for setting up window dividers and
  *   that responsible for wrapping the (internal) tool bar use this.
  *
- * 5 means to never call set_window_size_hook.  change_frame_size uses
- *   this.
- *
- * Note that even when set_window_size_hook is not called, individual
- * windows may have to be resized (via `window--sanitize-window-sizes')
- * in order to support minimum size constraints.
+ * 5 means to never call set_window_size_hook.  Usually this means to
+ *   call resize_frame_windows.  change_frame_size uses this.
  *
  * PRETEND is as for change_frame_size.  PARAMETER, if non-nil, is the
  * symbol of the parameter changed (like `menu-bar-lines', `font', ...).
@@ -718,6 +714,9 @@ adjust_frame_size (struct frame *f, int new_text_width, int 
new_text_height,
 
   if (FRAME_WINDOW_P (f)
       && f->can_set_window_size
+      /* For inhibit == 1 call the window_size_hook only if a native
+        size changes.  For inhibit == 0 or inhibit == 2 always call
+        it.  */
       && ((!inhibit_horizontal
           && (new_native_width != old_native_width
               || inhibit == 0 || inhibit == 2))
@@ -725,29 +724,25 @@ adjust_frame_size (struct frame *f, int new_text_width, 
int new_text_height,
              && (new_native_height != old_native_height
                  || inhibit == 0 || inhibit == 2))))
     {
-      /* Make sure we respect fullheight and fullwidth.  */
-      if (inhibit_horizontal)
-       new_native_width = old_native_width;
-      else if (inhibit_vertical)
-       new_native_height = old_native_height;
-
-      if (inhibit == 2 && f->new_width > 0 && f->new_height > 0)
+      if (inhibit == 2
+#ifdef USE_MOTIF
+         && !EQ (parameter, Qmenu_bar_lines)
+#endif
+         && (f->new_width >= 0 || f->new_height >= 0))
        /* For implied resizes with inhibit 2 (external menu and tool
           bar) pick up any new sizes the display engine has not
           processed yet.  Otherwsie, we would request the old sizes
           which will make this request appear as a request to set new
-          sizes and have the WM react accordingly which is not TRT.  */
+          sizes and have the WM react accordingly which is not TRT.
+
+          We don't that for the external menu bar on Motif.
+          Otherwise, switching off the menu bar will shrink the frame
+          and switching it on will not enlarge it.  */
        {
-         /* But don't that for the external menu bar on Motif.
-            Otherwise, switching off the menu bar will shrink the frame
-            and switching it on will not enlarge it.  */
-#ifdef USE_MOTIF
-         if (!EQ (parameter, Qmenu_bar_lines))
-#endif
-           {
-             new_native_width = f->new_width;
-             new_native_height = f->new_height;
-           }
+         if (f->new_width >= 0)
+           new_native_width = f->new_width;
+         if (f->new_height >= 0)
+           new_native_height = f->new_height;
        }
 
       if (CONSP (frame_size_history))
@@ -763,6 +758,17 @@ adjust_frame_size (struct frame *f, int new_text_width, 
int new_text_height,
                                   min_inner_width, min_inner_height,
                                   inhibit_horizontal, inhibit_vertical);
 
+      if (inhibit == 0 || inhibit == 1)
+       {
+         f->new_width = new_native_width;
+         f->new_height = new_native_height;
+         /* Resetting f->new_size_p is controversial: It might cause
+            do_pending_window_change drop a previous request and we are
+            in troubles when the window manager does not honor the
+            request we issue here.  */
+         f->new_size_p = false;
+       }
+
       if (FRAME_TERMINAL (f)->set_window_size_hook)
         FRAME_TERMINAL (f)->set_window_size_hook
          (f, 0, new_native_width, new_native_height);
diff --git a/src/frame.h b/src/frame.h
index f89151c..399948f 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -453,6 +453,11 @@ struct frame
      frame is in the process of being redisplayed.  */
   bool_bf inhibit_clear_image_cache : 1;
 
+  /* True when new_width or new_height were set by change_frame_size,
+     false when they were set by adjust_frame_size internally or not
+     set.  */
+  bool_bf new_size_p;
+
   /* Bitfield area ends here.  */
 
   /* This frame's change stamp, set the last time window change
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 897eade..81033b2 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -1004,16 +1004,18 @@ void
 xg_frame_resized (struct frame *f, int width, int height)
 {
   /* Ignore case where size of native rectangle didn't change.  */
-  if (width != FRAME_PIXEL_WIDTH (f) || height != FRAME_PIXEL_HEIGHT (f)
-      || (delayed_size_change
-         && (width != f->new_width || height != f->new_height)))
+  if (width != FRAME_PIXEL_WIDTH (f)
+      || height != FRAME_PIXEL_HEIGHT (f)
+      || (f->new_size_p
+         && ((f->new_width >= 0 && width != f->new_width)
+             || (f->new_height >= 0 && height != f->new_height))))
     {
       if (CONSP (frame_size_history))
        frame_size_history_extra
          (f, build_string ("xg_frame_resized, changed"),
           FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
-          delayed_size_change ? f->new_width : -1,
-          delayed_size_change ? f->new_height : -1);
+          f->new_size_p ? f->new_width : -1,
+          f->new_size_p ? f->new_height : -1);
 
       FRAME_RIF (f)->clear_under_internal_border (f);
       change_frame_size (f, width, height, false, true, false);
@@ -1024,8 +1026,8 @@ xg_frame_resized (struct frame *f, int width, int height)
     frame_size_history_extra
       (f, build_string ("xg_frame_resized, unchanged"),
        FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
-       delayed_size_change ? f->new_width : -1,
-       delayed_size_change ? f->new_height : -1);
+       f->new_size_p ? f->new_width : -1,
+       f->new_size_p ? f->new_height : -1);
 
 }
 
@@ -1180,6 +1182,12 @@ xg_frame_set_char_size (struct frame *f, int width, int 
height)
      the frame is mapped again we will (hopefully) get the correct size.  */
   if (FRAME_VISIBLE_P (f) && !was_visible)
     {
+      if (CONSP (frame_size_history))
+       frame_size_history_extra
+         (f, build_string ("xg_frame_set_char_size, visible"),
+          FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
+          f->new_width, f->new_height);
+
       /* Must call this to flush out events */
       (void)gtk_events_pending ();
       gdk_flush ();
@@ -1187,12 +1195,6 @@ xg_frame_set_char_size (struct frame *f, int width, int 
height)
       x_wait_for_event (f, ConfigureNotify);
 #endif
 
-      if (CONSP (frame_size_history))
-       frame_size_history_extra
-         (f, build_string ("xg_frame_set_char_size, visible"),
-          FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f), width, height,
-          f->new_width, f->new_height);
-
       if (!NILP (fullscreen))
        /* Try to restore fullscreen state.  */
        {
diff --git a/src/nsfns.m b/src/nsfns.m
index 054777a..1f281f7 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -668,11 +668,7 @@ ns_set_tool_bar_lines (struct frame *f, Lisp_Object value, 
Lisp_Object oldval)
        }
     }
 
-  {
-    NSTRACE_MSG ("inhibit:%d", inhibit);
-
-    adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines);
-  }
+  adjust_frame_size (f, -1, -1, 2, false, Qtool_bar_lines);
 }
 
 static void
@@ -1070,7 +1066,6 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
   Lisp_Object parent, parent_frame;
   struct kboard *kb;
   static int desc_ctr = 1;
-  int x_width = 0, x_height = 0;
 
   /* gui_display_get_arg modifies parms.  */
   parms = Fcopy_alist (parms);
diff --git a/src/nsterm.m b/src/nsterm.m
index b135e35..6e7ab12 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -7296,7 +7296,7 @@ not_in_argv (NSString *arg)
 - (void)viewDidResize:(NSNotification *)notification
 {
   NSRect frame = [self frame];
-  int neww, newh;
+  int neww, newh, oldw, oldh;
 
   if (! FRAME_LIVE_P (emacsframe))
     return;
@@ -7305,25 +7305,25 @@ not_in_argv (NSString *arg)
 
   neww = (int)NSWidth (frame);
   newh = (int)NSHeight (frame);
+  oldw = FRAME_PIXEL_WIDTH (emacsframe);
+  oldh = FRAME_PIXEL_HEIGHT (emacsframe);
+
+  /* Don't want to do anything when the view size hasn't changed. */
+  if ((oldh == newh && oldw == neww)
+      || (emacsframe->new_size_p
+          && newh == emacsframe->new_height
+          && neww == emacsframe->new_width))
+    {
+      NSTRACE_MSG ("No change");
+      return;
+    }
+
   NSTRACE_SIZE ("New size", NSMakeSize (neww, newh));
+  NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
 
 #ifdef NS_DRAW_TO_BUFFER
   if ([self wantsUpdateLayer])
     {
-      CGFloat scale = [[self window] backingScaleFactor];
-      NSSize size = [surface getSize];
-      int oldw = size.width / scale;
-      int oldh = size.height / scale;
-
-      NSTRACE_SIZE ("Original size", NSMakeSize (oldw, oldh));
-
-      /* Don't want to do anything when the view size hasn't changed. */
-      if ((oldh == newh && oldw == neww))
-        {
-          NSTRACE_MSG ("No change");
-          return;
-        }
-
       [surface release];
       surface = nil;
 
@@ -7331,10 +7331,6 @@ not_in_argv (NSString *arg)
     }
 #endif
 
-  /* I'm not sure if it's safe to call this every time the view
-     changes size, as Emacs may already know about the change.
-     Unfortunately there doesn't seem to be a bullet-proof method of
-     determining whether we need to call it or not.  */
   change_frame_size (emacsframe, neww, newh, false, YES, false);
 
   SET_FRAME_GARBAGED (emacsframe);
diff --git a/src/xterm.c b/src/xterm.c
index 5049f72..189e3a4 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -9071,8 +9071,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              to check the pixel dimensions as well.  */
           if (width != FRAME_PIXEL_WIDTH (f)
               || height != FRAME_PIXEL_HEIGHT (f)
-             || (delayed_size_change
-                 && (width != f->new_width || height != f->new_height)))
+             || (f->new_size_p
+                 && ((f->new_width >= 0 && width != f->new_width)
+                     || (f->new_height >= 0 && height != f->new_height))))
             {
               change_frame_size (f, width, height, false, true, false);
               x_clear_under_internal_border (f);
diff --git a/test/lisp/calc/calc-tests.el b/test/lisp/calc/calc-tests.el
index c5aa5a3..13dd228 100644
--- a/test/lisp/calc/calc-tests.el
+++ b/test/lisp/calc/calc-tests.el
@@ -191,6 +191,33 @@ An existing calc stack is reused, otherwise a new one is 
created."
     (let ((calc-number-radix 36))
       (should (equal (math-format-number 12345678901) "36#5,O6A,QT1")))))
 
+(ert-deftest calc-digit-after-point ()
+  "Test display of trailing 0 after decimal point (bug#47302)."
+  (let ((calc-digit-after-point nil))
+    ;; Integral floats have no digits after the decimal point (default).
+    (should (equal (math-format-number '(float 0 0)) "0."))
+    (should (equal (math-format-number '(float 5 0)) "5."))
+    (should (equal (math-format-number '(float 3 1)) "30."))
+    (should (equal (math-format-number '(float 23 0)) "23."))
+    (should (equal (math-format-number '(float 123 0)) "123."))
+    (should (equal (math-format-number '(float 1 -1)) "0.1"))
+    (should (equal (math-format-number '(float 54 -1)) "5.4"))
+    (should (equal (math-format-number '(float 1 -4)) "1e-4"))
+    (should (equal (math-format-number '(float 1 14)) "1e14"))
+    (should (equal (math-format-number 12) "12")))
+  (let ((calc-digit-after-point t))
+    ;; Integral floats have at least one digit after the decimal point.
+    (should (equal (math-format-number '(float 0 0)) "0.0"))
+    (should (equal (math-format-number '(float 5 0)) "5.0"))
+    (should (equal (math-format-number '(float 3 1)) "30.0"))
+    (should (equal (math-format-number '(float 23 0)) "23.0"))
+    (should (equal (math-format-number '(float 123 0)) "123.0"))
+    (should (equal (math-format-number '(float 1 -1)) "0.1"))
+    (should (equal (math-format-number '(float 54 -1)) "5.4"))
+    (should (equal (math-format-number '(float 1 -4)) "1e-4"))
+    (should (equal (math-format-number '(float 1 14)) "1e14"))
+    (should (equal (math-format-number 12) "12"))))
+
 (ert-deftest calc-calendar ()
   "Test calendar conversions (bug#36822)."
   (should (equal (calcFunc-julian (math-parse-date "2019-07-27")) 2458692))
diff --git a/test/lisp/emacs-lisp/comp-cstr-tests.el 
b/test/lisp/emacs-lisp/comp-cstr-tests.el
index 2e46285..59e1b69 100644
--- a/test/lisp/emacs-lisp/comp-cstr-tests.el
+++ b/test/lisp/emacs-lisp/comp-cstr-tests.el
@@ -198,22 +198,26 @@
       ((and (or symbol string) (or number marker)) . nil)
       ;; 78
       ((and t t) . t)
-      ;; 80
+      ;; 79
       ((and (or marker number) (integer 0 0)) . (integer 0 0))
-      ;; 81
+      ;; 80
       ((and t (not t)) . nil)
-      ;; 82
+      ;; 81
       ((or (integer 1 1) (not (integer 1 1))) . t)
-      ;; 83
+      ;; 82
       ((not t) . nil)
-      ;; 84
+      ;; 83
       ((not nil) . t)
-      ;; 85
+      ;; 84
       ((or (not string) t) . t)
-      ;; 86
+      ;; 85
       ((or (not vector) sequence) . sequence)
+      ;; 86
+      ((or (not symbol) null) . t)
       ;; 87
-      ((or (not symbol) null) . t))
+      ((and (or null integer) (not (or null integer))) . nil)
+      ;; 88
+      ((and (or (member a b c)) (not (or (member a b)))) . (member c)))
     "Alist type specifier -> expected type specifier."))
 
 (defmacro comp-cstr-synthesize-tests ()
diff --git a/test/lisp/progmodes/ruby-mode-tests.el 
b/test/lisp/progmodes/ruby-mode-tests.el
index 42a011c..e2ea0d9 100644
--- a/test/lisp/progmodes/ruby-mode-tests.el
+++ b/test/lisp/progmodes/ruby-mode-tests.el
@@ -32,6 +32,13 @@
      (ruby-mode)
      ,@body))
 
+(defmacro ruby-with-temp-file (contents &rest body)
+  `(ruby-with-temp-buffer ,contents
+     (set-visited-file-name "ruby-mode-tests")
+     ,@body
+     (set-buffer-modified-p nil)
+     (delete-file buffer-file-name)))
+
 (defun ruby-should-indent (content column)
   "Assert indentation COLUMN on the last line of CONTENT."
   (ruby-with-temp-buffer content
@@ -844,6 +851,30 @@ VALUES-PLIST is a list with alternating index and value 
elements."
       (ruby--insert-coding-comment "utf-8")
       (should (string= "# encoding: utf-8\n\n" (buffer-string))))))
 
+(ert-deftest ruby--set-encoding-when-ascii ()
+  (ruby-with-temp-file "ascii"
+    (let ((ruby-encoding-magic-comment-style 'ruby)
+          (ruby-insert-encoding-magic-comment t))
+      (setq save-buffer-coding-system 'us-ascii)
+      (ruby-mode-set-encoding)
+      (should (string= "ascii" (buffer-string))))))
+
+(ert-deftest ruby--set-encoding-when-utf8 ()
+  (ruby-with-temp-file "💎"
+    (let ((ruby-encoding-magic-comment-style 'ruby)
+          (ruby-insert-encoding-magic-comment t))
+      (setq save-buffer-coding-system 'utf-8)
+      (ruby-mode-set-encoding)
+      (should (string= "💎" (buffer-string))))))
+
+(ert-deftest ruby--set-encoding-when-latin-15 ()
+  (ruby-with-temp-file "Ⓡ"
+    (let ((ruby-encoding-magic-comment-style 'ruby)
+          (ruby-insert-encoding-magic-comment t))
+      (setq save-buffer-coding-system 'iso-8859-15)
+      (ruby-mode-set-encoding)
+      (should (string= "# coding: iso-8859-15\nⓇ" (buffer-string))))))
+
 (ert-deftest ruby--indent/converted-from-manual-test ()
   :tags '(:expensive-test)
   ;; Converted from manual test.
diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el
index a1893fd..ba8b8b0 100644
--- a/test/src/comp-tests.el
+++ b/test/src/comp-tests.el
@@ -293,7 +293,7 @@ Check that the resulting binaries do not differ."
                (comp-tests-throw-f 3)))))
 
 (comp-deftest gc ()
-  "Try to do some longer computation to let the gc kick in."
+  "Try to do some longer computation to let the GC kick in."
   (dotimes (_ 100000)
     (comp-tests-cons-cdr-f 3))
   (should (= (comp-tests-cons-cdr-f 3) 3)))
@@ -317,7 +317,7 @@ Check that the resulting binaries do not differ."
   (should (string= (comp-tests-string-trim-f "dsaf ") "dsaf")))
 
 (comp-deftest trampoline-removal ()
-  ;; This tests that we can can call primitives with no dedicated bytecode.
+  ;; This tests that we can call primitives with no dedicated bytecode.
   ;; At speed >= 2 the trampoline will not be used.
   (should (hash-table-p (comp-tests-trampoline-removal-f))))
 
@@ -399,7 +399,7 @@ 
https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html.";
   (should (string= " ➊" (comp-test-45342-f 1))))
 
 (comp-deftest assume-double-neg ()
-  "In fwprop assumtions (not (not (member x))) /= (member x)."
+  "In fwprop assumptions (not (not (member x))) /= (member x)."
   (should-not (comp-test-assume-double-neg-f "bar" "foo")))
 
 (comp-deftest assume-in-loop-1 ()
@@ -416,7 +416,7 @@ 
https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html.";
 
 (defvar comp-test-primitive-advice)
 (comp-deftest primitive-advice ()
-  "Test effectiveness of primitive advicing."
+  "Test effectiveness of primitive advising."
   (let (comp-test-primitive-advice
         (f (lambda (&rest args)
              (setq comp-test-primitive-advice args))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]