emacs-diffs
[Top][All Lists]
Advanced

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

feature/native-comp f7e7ff4 1/2: Merge remote-tracking branch 'savannah/


From: Andrea Corallo
Subject: feature/native-comp f7e7ff4 1/2: Merge remote-tracking branch 'savannah/master' into HEAD
Date: Sat, 10 Oct 2020 06:21:41 -0400 (EDT)

branch: feature/native-comp
commit f7e7ff4fb16bf8fc8e7662f21cd9843e9eb648e8
Merge: 138990b 5824c20
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Merge remote-tracking branch 'savannah/master' into HEAD
---
 ChangeLog.1                                        |   2 +-
 ChangeLog.3                                        | 236 ++++++++---------
 doc/emacs/msdos-xtra.texi                          |   2 +-
 doc/emacs/search.texi                              |  20 +-
 doc/lispintro/emacs-lisp-intro.texi                |   2 +-
 doc/lispref/commands.texi                          |   7 +-
 doc/lispref/display.texi                           |  59 +++--
 doc/lispref/edebug.texi                            |  15 +-
 doc/lispref/files.texi                             |   2 +-
 doc/lispref/modes.texi                             |   3 +-
 doc/lispref/nonascii.texi                          |   2 +-
 doc/lispref/processes.texi                         |   2 +-
 doc/misc/dbus.texi                                 |  35 +--
 doc/misc/gnus.texi                                 |   6 -
 doc/misc/texinfo.tex                               |   2 +-
 doc/misc/tramp.texi                                |   4 +-
 etc/NEWS                                           |  24 +-
 etc/PROBLEMS                                       |   2 +-
 etc/TODO                                           |   4 +-
 lisp/ChangeLog.12                                  |   4 +-
 lisp/ChangeLog.17                                  |   4 +-
 lisp/calc/calc-bin.el                              |   2 +-
 lisp/cedet/semantic.el                             |  10 +-
 lisp/comint.el                                     |   3 +-
 lisp/cus-edit.el                                   | 289 ++++++++++++++-------
 lisp/doc-view.el                                   |  30 ++-
 lisp/emacs-lisp/bytecomp.el                        |   2 +-
 lisp/frame.el                                      |   7 +-
 lisp/gnus/gnus-agent.el                            |   1 -
 lisp/gnus/gnus-art.el                              |   5 +-
 lisp/gnus/gnus-async.el                            |   6 +
 lisp/gnus/gnus-sum.el                              |   4 +-
 lisp/gnus/message.el                               |   3 +-
 lisp/ibuffer.el                                    |   2 +-
 lisp/info.el                                       |   6 +-
 lisp/international/ja-dic-cnv.el                   |   6 +-
 lisp/international/mule-util.el                    |  21 +-
 lisp/international/mule.el                         |   6 +-
 lisp/isearch.el                                    |  63 +++--
 lisp/leim/quail/latin-post.el                      |  35 ++-
 lisp/mouse.el                                      |   2 +-
 lisp/net/dbus.el                                   |  12 +-
 lisp/progmodes/cc-engine.el                        |  71 ++---
 lisp/progmodes/cc-langs.el                         |  18 +-
 lisp/progmodes/grep.el                             |  13 +-
 lisp/progmodes/project.el                          |   3 +
 lisp/replace.el                                    |   3 +-
 lisp/subr.el                                       |  13 +-
 lisp/tab-bar.el                                    |  10 +-
 lisp/tab-line.el                                   |   3 +-
 lisp/textmodes/artist.el                           |  22 +-
 lisp/tmm.el                                        |  24 +-
 lisp/vc/vc-git.el                                  |   4 +-
 lisp/vc/vc.el                                      |  38 ++-
 src/ChangeLog.11                                   |   2 +-
 src/alloc.c                                        |   2 +-
 src/bidi.c                                         |   4 +-
 src/bignum.c                                       |   4 +-
 src/callint.c                                      |   2 +-
 src/coding.c                                       |  60 ++---
 src/coding.h                                       |   6 +-
 src/dbusbind.c                                     |  28 +-
 src/dired.c                                        |   2 +-
 src/dispextern.h                                   |   2 +-
 src/dispnew.c                                      |  17 +-
 src/doc.c                                          |   2 +-
 src/doprnt.c                                       |   4 +-
 src/editfns.c                                      |   2 +-
 src/emacs.c                                        |   2 +-
 src/fileio.c                                       |   2 +-
 src/filelock.c                                     |   2 +-
 src/fns.c                                          |   2 +-
 src/font.c                                         |  12 +-
 src/frame.c                                        |  12 +-
 src/ftcrfont.c                                     |   6 +-
 src/insdel.c                                       |   2 +-
 src/json.c                                         |  18 +-
 src/keyboard.c                                     |   7 +-
 src/lisp.h                                         |  14 +-
 src/module-env-25.h                                |   4 +-
 src/nsterm.m                                       |   2 +-
 src/sysdep.c                                       |   6 +-
 src/termcap.c                                      |   8 +-
 src/timefns.c                                      |   6 +-
 src/unexmacosx.c                                   |   2 +-
 src/w16select.c                                    |  16 +-
 src/w32.c                                          |  12 +-
 src/w32fns.c                                       |   4 +-
 src/w32proc.c                                      |  10 +-
 src/w32select.c                                    |   2 +-
 src/xdisp.c                                        |  23 +-
 src/xfont.c                                        |   2 +-
 test/lisp/calc/calc-tests.el                       |  62 +++++
 test/lisp/comint-tests.el                          |   1 +
 test/lisp/emacs-lisp/rx-tests.el                   |   5 +-
 test/lisp/international/mule-util-tests.el         |   5 +-
 test/lisp/net/dbus-tests.el                        |  83 +++++-
 test/lisp/play/animate-tests.el                    |   4 +-
 .../cperl-mode-resources/cperl-indent-exp.pl       |   4 +-
 test/lisp/progmodes/cperl-mode-tests.el            |   2 +
 test/lisp/progmodes/ruby-mode-tests.el             |  24 +-
 test/lisp/so-long-tests/so-long-tests.el           |   2 +-
 test/manual/etags/CTAGS.good                       |   2 +-
 test/manual/etags/cp-src/functions.cpp             |   2 +-
 test/manual/etags/prol-src/ordsets.prolog          |   4 +-
 test/manual/etags/tex-src/texinfo.tex              |   4 +-
 test/src/xdisp-tests.el                            |  24 +-
 107 files changed, 1076 insertions(+), 639 deletions(-)

diff --git a/ChangeLog.1 b/ChangeLog.1
index 1fb7b78..b01a316 100644
--- a/ChangeLog.1
+++ b/ChangeLog.1
@@ -3528,7 +3528,7 @@
        Port to Solaris 8.
        Without this change, 'configure' fails because the recently-added
        wait3 prototype in config.h messes up later 'configure' tests.
-       Fix this problem by droping wait3 and WRETCODE, as they're
+       Fix this problem by dropping wait3 and WRETCODE, as they're
        no longer needed on hosts that are current porting targets.
        * configure.ac (wait3, WRETCODE): Remove, fixing a FIXME.
        All uses changed to waitpid and WEXITSTATUS.
diff --git a/ChangeLog.3 b/ChangeLog.3
index 16e74f4..ec2d3f8 100644
--- a/ChangeLog.3
+++ b/ChangeLog.3
@@ -315,7 +315,7 @@
        * lisp/net/gnutls.el (gnutls-trustfiles): Update the names of the
        systems in the comments.  Reported by Richard Stallman <rms@gnu.org>
        in
-       https://lists.gnu.org/archive/html/emacs-devel/2020-07/msg00455.html.
+       https://lists.gnu.org/r/emacs-devel/2020-07/msg00455.html.
 
 2020-07-17  Eli Zaretskii  <eliz@gnu.org>
 
@@ -611,8 +611,8 @@
        of 2019-10-13T15:36:02Z!contovob@tcd.ie.
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00550.html
-       https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00473.html
+       https://lists.gnu.org/r/emacs-devel/2019-10/msg00550.html
+       https://lists.gnu.org/r/emacs-devel/2020-06/msg00473.html
 
        * doc/lispref/nonascii.texi (Specifying Coding Systems): Use more
        specific cross-reference to progn even if info.el displays it
@@ -727,8 +727,8 @@
        Minor improvements to EDE and EIEIO manuals
 
        For discussion, see the following threads:
-       https://lists.gnu.org/archive/html/emacs-devel/2020-05/msg00630.html
-       https://lists.gnu.org/archive/html/emacs-devel/2020-06/msg00099.html
+       https://lists.gnu.org/r/emacs-devel/2020-05/msg00630.html
+       https://lists.gnu.org/r/emacs-devel/2020-06/msg00099.html
 
        * doc/misc/ede.texi (ede-generic-project): Clean up example.
        * doc/misc/eieio.texi (Accessing Slots): Document slot-value as a
@@ -1573,7 +1573,7 @@
 
        * etc/NEWS: Rearrange image sections.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg01315.html
+       https://lists.gnu.org/r/emacs-devel/2020-04/msg01315.html
 
 2020-04-22  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -1616,7 +1616,7 @@
        * doc/emacs/files.texi (Image Mode): Mention image-auto-resize and
        image-auto-resize-on-window-resize.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg01160.html
+       https://lists.gnu.org/r/emacs-devel/2020-04/msg01160.html
 
 2020-04-21  Juri Linkov  <juri@linkov.net>
 
@@ -1944,7 +1944,7 @@
 
        These changes fix actual or latent bugs in regexps that match
        file names, such as PATTERN arguments to 'directory-files'.  See
-       https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg00265.html
+       https://lists.gnu.org/r/emacs-devel/2020-04/msg00265.html
 
        * admin/authors.el (authors-obsolete-files-regexps)
        (authors-renamed-files-regexps):
@@ -2036,7 +2036,7 @@
        Clarify documentation on inhibit-modification-hooks intended usage
 
        Cf. bug#40332 and the discussion at
-       https://lists.gnu.org/archive/html/emacs-devel/2020-03/msg00921.html
+       https://lists.gnu.org/r/emacs-devel/2020-03/msg00921.html
 
        * doc/lispref/text.texi (Change Hooks):
        * src/insdel.c (syms_of_insdel): Clarify the intended usage of
@@ -2173,9 +2173,9 @@
        LENGTH (i).  This happens when delete_interval is called from
        set_intervals_multibyte_1, because the caller zeroes out the
        total_length field of the interval to be deleted.  See
-       https://lists.gnu.org/archive/html/emacs-devel/2020-04/msg00131.html
+       https://lists.gnu.org/r/emacs-devel/2020-04/msg00131.html
        for more details.  See also a related old discussion at
-       https://lists.gnu.org/archive/html/emacs-devel/2012-07/msg00399.html.
+       https://lists.gnu.org/r/emacs-devel/2012-07/msg00399.html.
 
 2020-04-08  Eli Zaretskii  <eliz@gnu.org>
 
@@ -2212,7 +2212,7 @@
        like GNOME shell that use invisible outer frame borders.
 
        For further information see the thread starting with
-       https://lists.gnu.org/archive/html/emacs-devel/2020-01/msg00343.html
+       https://lists.gnu.org/r/emacs-devel/2020-01/msg00343.html
 
        * src/frame.c (syms_of_frame): New symbol Qxg_frame_set_char_size_4.
        * src/gtkutil.c (xg_frame_set_char_size): Hide child frame
@@ -2771,7 +2771,7 @@
        and will be *the* mailing list for discussions and announcements about
        ERC going forward.  The other two lists, erc-announce and erc-commit,
        are now retired.  For more details, see the announcement at
-       <https://lists.gnu.org/archive/html/emacs-erc/2020-03/msg00001.html>.
+       <https://lists.gnu.org/r/emacs-erc/2020-03/msg00001.html>.
 
 2020-03-06  Roland Winkler  <winkler@gnu.org>
 
@@ -5120,7 +5120,7 @@
        * lisp/progmodes/xref.el (xref--find-buffer-visiting):
        Speed up by using get-file-buffer.
        (xref--collect-matches): Remove the condition on remote-id.
-       (https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00753.html)
+       (https://lists.gnu.org/r/emacs-devel/2019-12/msg00753.html)
 
 2019-12-27  Dmitry Gutov  <dgutov@yandex.ru>
 
@@ -5634,7 +5634,7 @@
        Speed up vc-dir-update
 
        * lisp/vc/vc-dir.el (vc-dir-update): Speed up.
-       (https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00568.html)
+       (https://lists.gnu.org/r/emacs-devel/2019-12/msg00568.html)
 
 2019-12-20  Alan Mackenzie  <acm@muc.de>
 
@@ -6779,7 +6779,7 @@
        frame-monitor-workarea (and display-monitor-attributes-list).
 
        For details on why some GTK menus were empty please see thread
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg01061.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg01061.html
 
        * src/gtkutil.c (menubar_map_cb, xg_update_frame_menubar): Scale up
        req.height so that the menu bar's height is in device pixels as
@@ -6900,7 +6900,7 @@
        so in case of the active minibuffer, calling minibuffer-message will 
allow
        sit-for to wait the complete timeout, because discard-input will discard
        all initial events that prevent sit-for from waiting during startup.
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg00581.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg00581.html
 
 2019-11-30  Alan Mackenzie  <acm@muc.de>
 
@@ -6939,7 +6939,7 @@
        Use run-with-idle-timer instead of debounce for responsive image 
scaling.
 
        * lisp/emacs-lisp/timer.el (debounce, debounce-reduce): Revert macro 
addition.
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg01133.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg01133.html
 
        * lisp/image.el (image-increase-size, image-decrease-size):
        Use run-with-idle-timer.
@@ -8251,7 +8251,7 @@
 
        (do-after-load-evaluation): Replace run-with-timer with 
run-with-idle-timer
        to give a chance for the minibuffer to handle initial events before 
sit-for.
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg00581.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg00581.html
 
 2019-11-17  Juri Linkov  <juri@linkov.net>
 
@@ -8342,7 +8342,7 @@
 
        * lisp/simple.el (eval-expression-print-maximum-character): Use choice 
type.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg00433.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg00433.html
 
 2019-11-16  Juri Linkov  <juri@linkov.net>
 
@@ -8589,7 +8589,7 @@
        changing point-min.  It wasn't necessary for vertical-motion to
        work, and it had some adverse effects on how font-lock rules were
        applied
-       (https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg00522.html).
+       (https://lists.gnu.org/r/emacs-devel/2019-11/msg00522.html).
        This can also be an alternative fix for bug#38049.
 
 2019-11-14  Alan Mackenzie  <acm@muc.de>
@@ -9194,7 +9194,7 @@
        Use read-char-from-minibuffer instead of read-char-choice.
        Remove special handling of original window scrolling
        that is now supported in the minibuffer.  This fixes
-       https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg01020.html
+       https://lists.gnu.org/r/emacs-devel/2019-10/msg01020.html
        (files--ask-user-about-large-file): Use read-char-from-minibuffer
        instead of read-char-choice.
 
@@ -9585,7 +9585,7 @@
        Call vc-file-clearprops on new file too for the case when
        old and new files were renamed to each other back and forth.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2019-11/msg00069.html
+       https://lists.gnu.org/r/emacs-devel/2019-11/msg00069.html
 
 2019-11-06  Juri Linkov  <juri@linkov.net>
 
@@ -11092,7 +11092,7 @@
        (tab-line-mode--turn-on): New function.
        (tab-line-exclude-modes): New defcustom.
        (tab-line-exclude): New buffer-local variable.
-       https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00988.html
+       https://lists.gnu.org/r/emacs-devel/2019-10/msg00988.html
 
        * lisp/dired.el (dired-mark-pop-up): Set tab-line-exclude to nil.
        Don't set tab-line-format.   (Bug#37699)
@@ -15340,7 +15340,7 @@
        Implementation for VC projects that uses 'git ls-files' or 'hg
        status --all' for listing.  With gratitude to Tassilo Horn who has
        done most of the legwork and wrote the first version of the code
-       (https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00069.html).
+       (https://lists.gnu.org/r/emacs-devel/2019-10/msg00069.html).
        (project--vc-list-files): New function, to be used by the above.
        (project--find-regexp-in-files):
        Silence warnings about nonexistent files.
@@ -17981,7 +17981,7 @@
        'query-replace-regexp undo: Update next-replacement after undo'
        (30c4f35a6fc8a6507930923766c3126ac1c2063f)
 
-       See https://lists.gnu.org/archive/html/emacs-devel/2019-09/msg00364.html
+       See https://lists.gnu.org/r/emacs-devel/2019-09/msg00364.html
        * lisp/replace.el(perform-replace): Rename variable
        to next-replacement-replaced.
 
@@ -19170,7 +19170,7 @@
        * lisp/net/nsm.el (nsm-protocol-check--renegotiation-info-ext): Don't
        check when using TLS1.3, renegotiation has been removed from TLS.
        Reported in
-       
<https://lists.gnu.org/archive/html/help-gnu-emacs/2019-09/msg00005.html>
+       <https://lists.gnu.org/r/help-gnu-emacs/2019-09/msg00005.html>
 
 2019-09-04  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -19320,7 +19320,7 @@
        Avoid macros in pdumper.c when it’s easy
 
        Problem with DUMP_SET_REFERRER mentioned by Pip Cet at end of:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00548.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00548.html
        * src/pdumper.c (DANGEROUS, EMACS_RELOC_TYPE_BITS)
        (EMACS_RELOC_LENGTH_BITS, DUMP_RELOC_TYPE_BITS)
        (DUMP_RELOC_ALIGNMENT_BITS, DUMP_RELOC_OFFSET_BITS)
@@ -21681,7 +21681,7 @@
        method.  Set up any user-defined fringe bitmaps in addition to
        the standard bitmaps.
        Suggested by Liam Quinlan <liamkquinlan@gmail.com> in
-       https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00259.html.
+       https://lists.gnu.org/r/emacs-devel/2019-08/msg00259.html.
 
        (w32_reset_fringes) [HAVE_NTGUI]: Do nothing if the frame's
        redisplay_interface doesn't implement the
@@ -22067,7 +22067,7 @@
 
        Suggested by Oleh Krehel and implemented by Basil Contovounesios in
        the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00547.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00547.html
 
        * lisp/array.el (xor): Move unused function from here...
        * lisp/subr.el: ...to here, and improve.
@@ -22947,7 +22947,7 @@
        Make gravatar.el more configurable
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00528.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00528.html
 
        * etc/NEWS: Announce changes in gravatar.el user options.
 
@@ -22973,7 +22973,7 @@
        Fix some minor gravatar.el issues
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00528.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00528.html
        * lisp/image/gravatar.el (gravatar-hash): Trim leading and trailing
        whitespace in given address, as per the Gravatar docs.
        (gravatar-retrieve-synchronously): Silence call to
@@ -22986,7 +22986,7 @@
        DRY in gravatar.el
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00528.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00528.html
        * lisp/image/gravatar.el (gravatar-data->image): Remove.
        (gravatar-retrieve, gravatar-retrieve-synchronously): Reuse
        url-fetch-from-cache and gravatar-retrieved to reduce duplication.
@@ -22999,7 +22999,7 @@
        Use lexical-binding for Gravatar support
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00528.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00528.html
        * lisp/gnus/gnus-gravatar.el: Use lexical-binding.  Link custom
        group 'gnus-gravatar' to 'gravatar'.
        (gnus-gravatar-size, gnus-gravatar-too-ugly): Doc fix.
@@ -23177,7 +23177,7 @@
        Fix property stripping in image-file-yank-handler
 
        Fix proposed by Martin Rudalics <rudalics@gmx.at> in:
-       https://lists.gnu.org/archive/html/emacs-devel/2008-12/msg00945.html
+       https://lists.gnu.org/r/emacs-devel/2008-12/msg00945.html
        * lisp/image-file.el (image-file-yank-handler): Handle case when
        yank-excluded-properties is t.
 
@@ -28310,7 +28310,7 @@
        This changeset also rearranges native image transform code
        for other platforms to make it cleaner, and also removes
        the support for native cropping.  For the discussions, see
-       https://lists.gnu.org/archive/html/emacs-devel/2019-06/msg00242.html
+       https://lists.gnu.org/r/emacs-devel/2019-06/msg00242.html
 
        * src/w32term.c (w32_image_rotations_p, transform): New functions.
        (w32_draw_image_foreground): If image rotation is requested
@@ -28832,8 +28832,8 @@
        Remove gnus-bug from report-emacs-bug TODO entry
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg01196.html
-       https://lists.gnu.org/archive/html/emacs-devel/2019-06/msg00967.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg01196.html
+       https://lists.gnu.org/r/emacs-devel/2019-06/msg00967.html
 
        * etc/TODO: Remove gnus-bug from list of obsolete bug-reporting
        commands now that it is implemented in terms of report-emacs-bug.
@@ -35048,7 +35048,7 @@
        Fix url-copy-file argument handling
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00500.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00500.html
        * lisp/url/url-handlers.el: Update autoloaded docstrings.
        Quote function symbols as such.
        (url-handler-regexp): Make grouping construct shy.
@@ -35208,7 +35208,7 @@
        Use lexical-binding in tempo.el and add tests
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00395.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00395.html
        * lisp/tempo.el: Use lexical-binding.
        (tempo-define-template): Expand documentation to mention
        `tempo-user-elements'.
@@ -35265,8 +35265,8 @@
        Improve C and Elisp Git diff hunk headers
 
        For discussion, see the following threads:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00457.html
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00369.html
+       https://lists.gnu.org/r/emacs-devel/2019-03/msg00457.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00369.html
 
        * autogen.sh: Extend the built-in Git xfuncname pattern 'cpp' to
        match preprocessor and DEFUN macros, and the 'elisp' pattern to
@@ -35278,7 +35278,7 @@
 
        Thanks to Basil L. Contovounesios for additional cleanups.
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00177.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00177.html
 
        * lisp/delim-col.el: Use lexical-binding.
 
@@ -35798,8 +35798,8 @@
        Remove XEmacs audio checks from mm-decode.el
 
        For discussion, see the following threads:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg01087.html
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00584.html
+       https://lists.gnu.org/r/emacs-devel/2019-03/msg01087.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00584.html
        * lisp/gnus/mm-decode.el (mm-inline-media-tests): Remove no-op media
        tests for XEmacs features.
 
@@ -36178,7 +36178,7 @@
        Add docstring to project--read-file-cpd-relative
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00460.html
+       https://lists.gnu.org/r/emacs-devel/2019-05/msg00460.html
        * lisp/progmodes/project.el (project--read-file-cpd-relative):
        Describe arglist as promised by user option
        project-read-file-name-function.
@@ -36457,7 +36457,7 @@
        Allow customizing the display of project file names when reading
 
        To hopefully resolve a long-running discussion
-       (https://lists.gnu.org/archive/html/emacs-devel/2019-05/msg00162.html).
+       (https://lists.gnu.org/r/emacs-devel/2019-05/msg00162.html).
 
        * lisp/progmodes/project.el (project-read-file-name-function):
        New variable.
@@ -37629,7 +37629,7 @@
 
        * lisp/progmodes/xref.el (xref--read-identifier): Abort on empty
        input if there is no default
-       
(https://lists.gnu.org/archive/html/help-gnu-emacs/2019-05/msg00012.html).
+       (https://lists.gnu.org/r/help-gnu-emacs/2019-05/msg00012.html).
 
 2019-05-02  Alan Mackenzie  <acm@muc.de>
 
@@ -38137,7 +38137,7 @@
 
        This should not be necessary, and is merely a precaution. For
        background, see:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00639.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg00639.html
 
        * src/frame.c:
        * src/xdisp.c: Check for existence of terminal hooks before use.
@@ -39037,7 +39037,7 @@
        Improve pure and side-effect-free docs
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00316.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg00316.html
        * doc/lispref/customize.texi (Composite Types): Do not overspecify
        :match-alternatives predicates.
        * doc/lispref/eval.texi (Intro Eval): Anchor definition of "side
@@ -40266,7 +40266,7 @@
        Optimize byte-compilation of proper-list-p
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00316.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg00316.html
        * lisp/emacs-lisp/byte-opt.el: Optimize proper-list-p as a
        predicate.
        * lisp/subr.el: Mark proper-list-p as pure, and side-effect and
@@ -41453,7 +41453,7 @@
        Fix more regexp oddities
 
        Problems reported by Mattias Engdegård in:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00178.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg00178.html
        * lisp/progmodes/sh-script.el (sh-get-indent-info):
        Reorder skip-chars-forward arg so that it does not look like a regexp.
        * lisp/progmodes/verilog-mode.el (verilog-sk-define-signal):
@@ -41479,7 +41479,7 @@
        * lisp/frame.el (display-planes): Use logb over truncate + log
 
        Suggested by Basil L. Contovounesios:
-       https://lists.gnu.org/archive/html/bug-gnu-emacs/2019-03/msg01052.html
+       https://lists.gnu.org/r/bug-gnu-emacs/2019-03/msg01052.html
 
 2019-04-06  Alexander Gramiak  <agrambot@gmail.com>
 
@@ -41786,7 +41786,7 @@
        (gnus-dup-suppress-articles): DRY.
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00974.html
+       https://lists.gnu.org/r/emacs-devel/2019-03/msg00974.html
 
 2019-04-02  Wilson Snyder  <wsnyder@wsnyder.org>
 
@@ -41980,7 +41980,7 @@
        Do not set indent-line-function in text-mode
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg01012.html
+       https://lists.gnu.org/r/emacs-devel/2019-03/msg01012.html
        * lisp/textmodes/text-mode.el (text-mode): Do not reset
        indent-line-function to its global default value of indent-relative.
        * doc/lispref/modes.texi (Example Major Modes):
@@ -42626,7 +42626,7 @@
        i18n: Add function ngettext for pluralization.
 
        * lisp/international/mule-cmds.el (ngettext): New function.
-       https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00586.html
+       https://lists.gnu.org/r/emacs-devel/2019-03/msg00586.html
 
        * lisp/replace.el (flush-lines, how-many, occur-1, occur-engine)
        (perform-replace): Use ngettext.
@@ -42909,7 +42909,7 @@
        This reverts commit 3eb93c07f7a60ac9ce8a16f10c3afd5a3a31243a.
 
        There was no consensus for that commit, see
-       https://lists.gnu.org/archive/html/emacs-devel/2016-01/msg00150.html.
+       https://lists.gnu.org/r/emacs-devel/2016-01/msg00150.html.
        Also, reverting this commit should fix Bug#31238.
 
 2019-03-21  Eli Zaretskii  <eliz@gnu.org>
@@ -46161,7 +46161,7 @@
        Rename multifile.el to fileloop.el
 
        * lisp/multifile.el: Rename to fileloop.el as discussed in
-       https://lists.gnu.org/archive/html/emacs-devel/2018-12/msg00475.html.
+       https://lists.gnu.org/r/emacs-devel/2018-12/msg00475.html.
        Update symbol prefixes and all callers
 
 2019-02-07  Aurelien Aptel  <aaptel@suse.com>
@@ -47560,7 +47560,7 @@
        but that only affects a small corner case of c-toggle-auto-newline,
        which is not turned on by default.
 
-       See https://lists.gnu.org/archive/html/emacs-devel/2019-01/msg00360.html
+       See https://lists.gnu.org/r/emacs-devel/2019-01/msg00360.html
        for more information.
 
        * lisp/progmodes/cc-cmds.el (c--disable-fix-of-bug-33794): New
@@ -49008,7 +49008,7 @@
 
        * lisp/progmodes/project.el (project--completing-read-strict):
        Extract the common parent directory of all files first
-       (https://lists.gnu.org/archive/html/emacs-devel/2018-12/msg00444.html).
+       (https://lists.gnu.org/r/emacs-devel/2018-12/msg00444.html).
 
 2018-12-28  Michael Albinus  <michael.albinus@gmx.de>
 
@@ -52604,7 +52604,7 @@
 
        Advertise new hi-lock 'M-s h' key prefix in lisp/bindings.el
 
-       https://lists.gnu.org/archive/html/emacs-devel/2015-07/msg00104.html
+       https://lists.gnu.org/r/emacs-devel/2015-07/msg00104.html
 
 2018-11-07  Juri Linkov  <juri@linkov.net>
 
@@ -54667,7 +54667,7 @@
        Fix a previous commit
 
        Suggested by Stefan Monnier here:
-       https://lists.gnu.org/archive/html/emacs-devel/2018-09/msg00783.html
+       https://lists.gnu.org/r/emacs-devel/2018-09/msg00783.html
        * lisp/replace.el (occur--parse-occur-buffer): Since point is at the
        beginning of the buffer, use `point'.
 
@@ -57449,7 +57449,7 @@
        * lisp/calendar/todo-mode.el (todo-jump-to-category): Improve code
        by using bound-and-true-p.  This leaves a byte-compiler warning
        unsilenced, but ideally, there shouldn't be a warning here (see
-       https://lists.gnu.org/archive/html/emacs-devel/2018-08/msg00131.html).
+       https://lists.gnu.org/r/emacs-devel/2018-08/msg00131.html).
        (todo--fifiles-history): New variable.
        (todo-find-filtered-items-file): Use it to fix the filtered items
        files history list for completing-read.
@@ -59294,7 +59294,7 @@
        Fix custom-available-themes file expansion
 
        For discussion, see thread starting at
-       https://lists.gnu.org/archive/html/emacs-devel/2018-05/msg00222.html.
+       https://lists.gnu.org/r/emacs-devel/2018-05/msg00222.html.
        * lisp/custom.el: (custom-available-themes): Use directory-files
        instead of performing arbitrary wildcard expansion in file names.
        (custom-theme--load-path): Document return value.
@@ -59320,8 +59320,8 @@
        * etc/themes/whiteboard-theme.el:
        * etc/themes/wombat-theme.el: Disable no-byte-compile.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00614.html
-       https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00060.html
+       https://lists.gnu.org/r/emacs-devel/2018-01/msg00614.html
+       https://lists.gnu.org/r/emacs-devel/2018-02/msg00060.html
 
 2018-07-13  Basil L. Contovounesios  <contovob@tcd.ie>
 
@@ -59330,8 +59330,8 @@
        * lisp/custom.el (load-theme):
        Load byte-compiled file of safe themes when available.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00614.html
-       https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00060.html
+       https://lists.gnu.org/r/emacs-devel/2018-01/msg00614.html
+       https://lists.gnu.org/r/emacs-devel/2018-02/msg00060.html
 
 2018-07-13  Robert Pluim  <rpluim@gmail.com>
 
@@ -59629,11 +59629,11 @@
        Add predicate proper-list-p
 
        For discussion, see emacs-devel thread starting at
-       https://lists.gnu.org/archive/html/emacs-devel/2018-04/msg00460.html.
+       https://lists.gnu.org/r/emacs-devel/2018-04/msg00460.html.
 
        * lisp/subr.el (proper-list-p): New function.
        Implementation suggested by Paul Eggert <eggert@cs.ucla.edu> in
-       https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00138.html.
+       https://lists.gnu.org/r/emacs-devel/2018-06/msg00138.html.
        * doc/lispref/lists.texi (List Elements):
        * etc/NEWS: Document proper-list-p.
        * lisp/org/ob-core.el (org-babel-insert-result):
@@ -60559,7 +60559,7 @@
 
        Mark a specific electric-pair-mode test as an expected failure
 
-       See https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00535.html
+       See https://lists.gnu.org/r/emacs-devel/2018-06/msg00535.html
 
        * test/lisp/electric-tests.el
        (electric-pair-whitespace-chomping-2-at-point-4-in-c++-mode-in-strings):
@@ -62491,7 +62491,7 @@
        with C sources.  The green light for this change had already been
        given some time ago in
 
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00385.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00385.html
 
        * src/Makefile.in (check-syntax): New target.
        (.PHONY): Add check-syntax.
@@ -64326,7 +64326,7 @@
 
        Use next-error-found to set next-error-last-buffer.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-04/msg00207.html
+       https://lists.gnu.org/r/emacs-devel/2018-04/msg00207.html
 
        * lisp/simple.el (next-error-buffer): New buffer-local variable
        instead of making buffer-local next-error-last-buffer.  (Bug#20489)
@@ -65735,7 +65735,7 @@
 
 2018-04-05  Tino Calancha  <tino.calancha@gmail.com>
 
-       Require secrets.el iif Emacs has dbusbind support
+       Require secrets.el if Emacs has dbusbind support
 
        * test/lisp/net/secrets-tests.el: Require secrets.el if
        and only if, Emacs has been compiled with dbusbind support.
@@ -65794,7 +65794,7 @@
        and disabled by `disabled'.
        (search-exit-option): Doc fix.
        (isearch-post-command-hook): Check for isearch-forward.
-       https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00438.html
+       https://lists.gnu.org/r/emacs-devel/2018-03/msg00438.html
 
 2018-04-04  Juri Linkov  <juri@linkov.net>
 
@@ -66167,7 +66167,7 @@
        Don't wait for visible frames to become visible
 
        For discussion, see thread starting at
-       https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00807.html.
+       https://lists.gnu.org/r/emacs-devel/2018-03/msg00807.html.
        * src/xterm.c (x_make_frame_visible): Check FRAME_VISIBLE_P before
        calling x_wait_for_event.
 
@@ -67190,22 +67190,22 @@
        * lisp/emacs-lisp/package.el (package-enable-at-startup): Update
        docstring to note that packages are now made available before loading
        the init file, rather than afterwards.  See
-       https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00632.html
+       https://lists.gnu.org/r/emacs-devel/2018-02/msg00632.html
        (package-load-list): Refer to "making available" rather than "loading"
        for packages.  See
-       https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00298.html
+       https://lists.gnu.org/r/emacs-devel/2018-02/msg00298.html
 
        * lisp/startup.el (command-line): Call `custom-reevaluate-setting' on
        predefined variables before loading the early init file and before
        `package-initialize' is called.  This prevents
        `Info-default-directory-list' from being unbound when
        `package-initialize' tries to access it during startup.  See
-       https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00545.html
+       https://lists.gnu.org/r/emacs-devel/2018-02/msg00545.html
 
        * lisp/emacs-lisp/package.el (package-initialize): Issue a warning
        if called twice.
-       See: 
https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00626.html
-            
https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00301.html
+       See: https://lists.gnu.org/r/emacs-devel/2018-02/msg00626.html
+            https://lists.gnu.org/r/emacs-devel/2018-03/msg00301.html
 
 2018-03-18  Glenn Morris  <rgm@gnu.org>
 
@@ -67236,7 +67236,7 @@
          Date: Fri, 16 Mar 2018 10:23:31 -0500
          Message-ID: <87po44jb7w.fsf@red-bean.com>
 
-         https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00555.html
+         https://lists.gnu.org/r/emacs-devel/2018-03/msg00555.html
 
 2018-03-18  Nicolas Petton  <nicolas@petton.fr>
 
@@ -67885,7 +67885,7 @@
 
        * doc/emacs/search.texi: Replace search-exit-option option nil with 
append.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00202.html
+       https://lists.gnu.org/r/emacs-devel/2018-03/msg00202.html
 
 2018-03-08  Charles A. Roelli  <charles@aurox.ch>
 
@@ -68097,7 +68097,7 @@
        * doc/emacs/search.texi (Not Exiting Isearch): Document new
        values ‘shift-move’ and ‘move’ of search-exit-option.
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00013.html
+       https://lists.gnu.org/r/emacs-devel/2018-03/msg00013.html
 
 2018-03-03  Glenn Morris  <rgm@gnu.org>
 
@@ -68177,7 +68177,7 @@
        but the Emacs 24 byte compiler doesn't recognize that
        define-obsolete-variable-alias defines a variable).
 
-       [1]: 
https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00826.html
+       [1]: https://lists.gnu.org/r/emacs-devel/2018-02/msg00826.html
 
 2018-03-01  Glenn Morris  <rgm@gnu.org>
 
@@ -68976,11 +68976,11 @@
        Discussion on emacs-devel leading up to this change (approximately 150
        messages):
 
-       - https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
-       - https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
-       - https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
-       - https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
-       - https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
+       - https://lists.gnu.org/r/emacs-devel/2017-08/msg00154.html
+       - https://lists.gnu.org/r/emacs-devel/2017-08/msg00433.html
+       - https://lists.gnu.org/r/emacs-devel/2017-09/msg00023.html
+       - https://lists.gnu.org/r/emacs-devel/2017-09/msg00599.html
+       - https://lists.gnu.org/r/emacs-devel/2017-10/msg00332.html
 
        * lisp/startup.el (early-init-file): New variable.
        (load-user-init-file): New function.
@@ -71454,7 +71454,7 @@
        In the macro expansion of the example above, right after:
        (setq k (+ k 1))
 
-       evaluate the rest of the body forms iif the condition
+       evaluate the rest of the body forms if the condition
        (< k 2)
        is still valid.
 
@@ -73761,7 +73761,7 @@
 
        Merge from origin/emacs-26
 
-       a89f0b6f33 maint: shorten https://lists.gnu.org/archive/html/... links
+       a89f0b6f33 maint: shorten https://lists.gnu.org/r/... links
        8be3aee281 Merge from Gnulib
        265cee553f Work around GCC bug 80776 on Fedora 27 x86
        dc7a97fb84 Tweak copy-file, rename-file doc
@@ -74031,7 +74031,7 @@
 
        * lisp/emacs-lisp/copyright.el (copyright-update-year): Enlarge the
        scope of save-excursion. Reported in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-04/msg00271.html
+       https://lists.gnu.org/r/emacs-devel/2017-04/msg00271.html
 
 2017-11-19  Vibhav Pant  <vibhavp@gmail.com>
 
@@ -76193,7 +76193,7 @@
        Clarify Gravatar docs
 
        For discussion, see the following thread:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00528.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00528.html
        * doc/misc/gnus.texi (X-Face): Fix cross-reference.
        (Gravatars):
        * lisp/gnus/gnus-gravatar.el (gnus-gravatar-too-ugly):
@@ -76247,7 +76247,7 @@
 
        This explanation was given by Eli Zaretskii on emacs-devel.
        For discussion, see:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-07/msg00294.html
+       https://lists.gnu.org/r/emacs-devel/2019-07/msg00294.html
 
        * src/buffer.c (syms_of_buffer): Add warning to doc string of
        bidi-display-reordering to explain that it should only be used for
@@ -77164,7 +77164,7 @@
        Backport: Improve pure and side-effect-free docs
 
        For discussion, see thread starting at:
-       https://lists.gnu.org/archive/html/emacs-devel/2019-04/msg00316.html
+       https://lists.gnu.org/r/emacs-devel/2019-04/msg00316.html
        * doc/lispref/customize.texi (Composite Types): Do not overspecify
        :match-alternatives predicates.
        * doc/lispref/eval.texi (Intro Eval): Anchor definition of "side
@@ -78845,7 +78845,7 @@
        * doc/misc/ediff.texi (Major Entry Points): Update and clarify
        the documentation of 'ediff-windows-wordwise' and
        'ediff-regions-wordwise'.  See the discussion starting at
-       https://lists.gnu.org/archive/html/help-gnu-emacs/2018-11/msg00197.html
+       https://lists.gnu.org/r/help-gnu-emacs/2018-11/msg00197.html
        for the details.
 
 2019-01-07  Eli Zaretskii  <eliz@gnu.org>
@@ -80362,7 +80362,7 @@
        Fix math-imaginary-i check
 
        Reported by Bastian Erdnüß at
-       <https://lists.gnu.org/archive/html/emacs-devel/2018-08/msg00300.html>.
+       <https://lists.gnu.org/r/emacs-devel/2018-08/msg00300.html>.
        * lisp/calc/calc-cplx.el (math-imaginary-i): Check for a value
        of (polar 1 <quarter-circle>).
 
@@ -81058,7 +81058,7 @@
        reject :server and :nowait (Bug#31903)", the sense of the SERVER check
        was accidentally reversed so that we ended up looking for the wrong
        ADDRESS.  Reported by T.V Raman in
-       <https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00437.html>.
+       <https://lists.gnu.org/r/emacs-devel/2018-07/msg00437.html>.
 
 2018-07-12  Eli Zaretskii  <eliz@gnu.org>
 
@@ -81111,8 +81111,8 @@
        lists.
 
        For discussion, see the following emacs-devel subthreads:
-       https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00112.html
-       https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00138.html
+       https://lists.gnu.org/r/emacs-devel/2018-06/msg00112.html
+       https://lists.gnu.org/r/emacs-devel/2018-06/msg00138.html
 
 2018-07-10  John Shahid  <jvshahid@gmail.com>
 
@@ -81220,8 +81220,8 @@
        Fix (length NON-SEQUENCE) documentation
 
        Suggested by Eli Zaretskii <eliz@gnu.org> in the following threads:
-       https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00171.html
-       https://lists.gnu.org/archive/html/emacs-devel/2018-07/msg00206.html
+       https://lists.gnu.org/r/emacs-devel/2018-07/msg00171.html
+       https://lists.gnu.org/r/emacs-devel/2018-07/msg00206.html
 
        * doc/lispref/sequences.texi (Sequence Functions): Mention that
        'length' signals a 'wrong-type-argument' also when given a
@@ -81400,7 +81400,7 @@
 
        * lisp/vc/vc-git.el (vc-git-dir-status-goto-stage): Call 'git
        ls-files -u' for the ls-files-conflict stage
-       (https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00885.html).
+       (https://lists.gnu.org/r/emacs-devel/2018-06/msg00885.html).
 
 2018-06-27  Eli Zaretskii  <eliz@gnu.org>
 
@@ -81461,7 +81461,7 @@
 
        See discussion:
 
-         https://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00826.html
+         https://lists.gnu.org/r/emacs-devel/2018-06/msg00826.html
          From: Eli Zaretskii
          Subject: Re: [Emacs-diffs] \
                   emacs-26 9a53b6d: Say how to override a primitive 
interactive spec
@@ -81508,7 +81508,7 @@
 
        From this thread on Emacs Devel:
 
-         https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00923.html
+         https://lists.gnu.org/r/emacs-devel/2018-03/msg00923.html
          From: Eli Zaretskii
          To: Karl Fogel
          CC: Juri Linkov, Emacs Devel
@@ -82175,7 +82175,7 @@
        Don't wait for visible frames to become visible
 
        For discussion, see thread starting at
-       https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00807.html.
+       https://lists.gnu.org/r/emacs-devel/2018-03/msg00807.html.
        * src/xterm.c (x_make_frame_visible): Check FRAME_VISIBLE_P before
        calling x_wait_for_event.
 
@@ -85543,7 +85543,7 @@
        * doc/lispref/customize.texi (Custom Themes): Clarify .el preference.
 
 
-       https://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00824.html.
+       https://lists.gnu.org/r/emacs-devel/2018-01/msg00824.html.
 
 2018-02-02  Eli Zaretskii  <eliz@gnu.org>
 
@@ -88280,7 +88280,7 @@
 
 2017-11-26  Paul Eggert  <eggert@cs.ucla.edu>
 
-       maint: shorten https://lists.gnu.org/archive/html/... links
+       maint: shorten https://lists.gnu.org/r/... links
 
 2017-11-26  Paul Eggert  <eggert@cs.ucla.edu>
 
@@ -88288,7 +88288,7 @@
 
        This incorporates:
        2017-11-23 stat: work around Solaris bug with tv_nsec < 0
-       2017-11-12 maint: shorten https://lists.gnu.org/archive/html/... links
+       2017-11-12 maint: shorten https://lists.gnu.org/r/... links
        * build-aux/config.sub, doc/misc/texinfo.tex, lib/allocator.h:
        * lib/fstatat.c, lib/intprops.h, lib/lstat.c, lib/signal.in.h:
        * lib/stat-time.h, lib/stdio-impl.h, lib/stdio.in.h:
@@ -89542,7 +89542,7 @@
        arbitrary buffers where this variable's value doesn't make sense.
 
        For a way to trigger a problem due to this, see discussion starting in
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00645.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00645.html
 
        * lisp/textmodes/tex-mode.el (tex-chktex): Use
        with-current-buffer.
@@ -90150,7 +90150,7 @@
 
        * configure.ac (CYGWIN_OBJ): Leave empty on QNX.
        Problem reported by Elad Lahav in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00750.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00750.html
 
 2017-10-26  Dmitry Gutov  <dgutov@yandex.ru>
 
@@ -90242,9 +90242,9 @@
        Port to QNX
 
        Simplified version of a patch proposed by Elad Lahav in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00716.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00716.html
        which is based on a previous patch I proposed in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00707.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00707.html
        * configure.ac (opsys, CFLAGS, LIBS_SYSTEM, hybrid_malloc)
        (system_alloc, FIRST_PTY_LETTER, CYGWIN_OBJ):
        Set appropriately for QNX.
@@ -90637,7 +90637,7 @@
        Augment Flymake API for third-party extensions
 
        See
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00619.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00619.html
 
        * doc/misc/flymake.texi (Flymake error types): Rewrite
        example.
@@ -91060,9 +91060,9 @@
        Do not under-align pseudovectors
 
        Problem reported by Fabrice Popineau in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00357.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00357.html
        Also see diagnosis by Eli Zaretskii in:
-       https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00476.html
+       https://lists.gnu.org/r/emacs-devel/2017-10/msg00476.html
        * src/alloc.c (vector_alignment):
        Now a multiple of alignof (max_align_t).
 
@@ -114927,7 +114927,7 @@
 
 2017-01-28  Yuri D'Elia  <wavexx@thregr.org>
 
-       Subject: Check Bcc after the Messag hook has run
+       Subject: Check Bcc after the Message hook has run
 
        * lisp/gnus/message.el (message-send): If the hook modifies
        the message (mml tags or headers), we should check bcc on the
diff --git a/doc/emacs/msdos-xtra.texi b/doc/emacs/msdos-xtra.texi
index 230e918..045ac6c 100644
--- a/doc/emacs/msdos-xtra.texi
+++ b/doc/emacs/msdos-xtra.texi
@@ -563,7 +563,7 @@ finishes.
 
   Spell checking also works, by means of special support for synchronous
 invocation of the @code{ispell} program.  This is slower than the
-asynchronous invocation on other platforms
+asynchronous invocation on other platforms.
 
   Instead of the Shell mode, which doesn't work on MS-DOS, you can use
 the @kbd{M-x eshell} command.  This invokes the Eshell package that
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index d982a9e..2169a41 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -1984,11 +1984,21 @@ the @code{search-highlight-submatches} variable.  If 
this variable's
 value is @code{nil}, no special highlighting is done, but if the value
 is non-@code{nil}, text that matches @samp{\( @dots{} \)} constructs
 (a.k.a.@: ``subexpressions'') in the regular expression will be
-highlighted with distinct faces, named @code{isearch-group-odd}
-for the odd group matches, and @code{isearch-group-even}
-for the even group matches.  For instance, when searching for
-@samp{foo-\([0-9]+\)}, the part matched by @samp{[0-9]+} will be
-highlighted with the @code{isearch-group-odd} face.
+highlighted with distinct faces.  By default, two distinct faces are
+defined, named @code{isearch-group-1} and @code{isearch-group-2}.
+With these two faces, odd-numbered subexpressions will be highlighted
+using the @code{isearch-group-1} face and even-numbered subexpressions
+will be highlighted using the @code{isearch-group-2} face.  For
+instance, when searching for @samp{foo-\([0-9]+\)\([a-z]+\)}, the part
+matched by @samp{[0-9]+} will be highlighted with the
+@code{isearch-group-1} face, and the part matched by @samp{[a-z]+}
+will be highlighted using @code{isearch-group-2}.  If you define
+additional faces using the same numbering scheme, i.e.@:
+@code{isearch-group-3}, @code{isearch-group-4}, @dots{}, then the face
+@code{isearch-group-@var{M}} will be used to highlight the @var{M}'th,
+@code{@var{N}+@var{M}}'th, @code{2@var{N}+@var{M}}'th, @dots{}
+subexpressions, where @var{N} is the total number of faces of the form
+@code{isearch-group-@var{M}}.
 
 @cindex lazy highlighting customizations
 @vindex isearch-lazy-highlight
diff --git a/doc/lispintro/emacs-lisp-intro.texi 
b/doc/lispintro/emacs-lisp-intro.texi
index 9aefe1d..1bd2849 100644
--- a/doc/lispintro/emacs-lisp-intro.texi
+++ b/doc/lispintro/emacs-lisp-intro.texi
@@ -227,7 +227,7 @@ supports it in developing GNU and promoting software 
freedom.''
 @c learn Emacs Lisp starting with the Emacs Lisp Reference Manual.
 @c
 @c        Richard Stallman <rms@gnu.org>,
-@c        https://lists.gnu.org/archive/html/emacs-devel/2018-05/msg00374.html
+@c        https://lists.gnu.org/r/emacs-devel/2018-05/msg00374.html
 
 @shortcontents
 @contents
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 25f6574..1467854 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -930,9 +930,8 @@ was specified to run but remapped into another command.
 
 @defun this-command-keys
 This function returns a string or vector containing the key sequence
-that invoked the present command, plus any previous commands that
-generated the prefix argument for this command.  Any events read by the
-command using @code{read-event} without a timeout get tacked on to the end.
+that invoked the present command.  Any events read by the command
+using @code{read-event} without a timeout get tacked on to the end.
 
 However, if the command has called @code{read-key-sequence}, it
 returns the last read key sequence.  @xref{Key Sequence Input}.  The
@@ -943,7 +942,7 @@ fit in a string.  @xref{Input Events}.
 @group
 (this-command-keys)
 ;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.}
-     @result{} "^U^X^E"
+     @result{} "^X^E"
 @end group
 @end example
 @end defun
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 7d1c14c..d2e6cad 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -1970,36 +1970,45 @@ This function returns the width in columns of the 
string @var{string},
 if it were displayed in the current buffer and the selected window.
 @end defun
 
-@defun truncate-string-to-width string width &optional start-column padding 
ellipsis
-This function returns the part of @var{string} that fits within
-@var{width} columns, as a new string.
+@defun truncate-string-to-width string width &optional start-column padding 
ellipsis ellipsis-text-property
+This function returns a new string that is a truncation of @var{string}
+which fits within @var{width} columns on display.
 
-If @var{string} does not reach @var{width}, then the result ends where
-@var{string} ends.  If one multi-column character in @var{string}
-extends across the column @var{width}, that character is not included in
-the result.  Thus, the result can fall short of @var{width} but cannot
-go beyond it.
+If @var{string} is narrower than @var{width}, the result is equal to
+@var{string}; otherwise excess characters are omitted from the result.
+If a multi-column character in @var{string} exceeds the goal
+@var{width}, that character is omitted from the result.  Thus, the
+result can sometimes fall short of @var{width}, but cannot go beyond
+it.
 
 The optional argument @var{start-column} specifies the starting column.
 If this is non-@code{nil}, then the first @var{start-column} columns of
-the string are omitted from the value.  If one multi-column character in
+the string are omitted from the result.  If one multi-column character in
 @var{string} extends across the column @var{start-column}, that
-character is not included.
+character is omitted.
 
 The optional argument @var{padding}, if non-@code{nil}, is a padding
-character added at the beginning and end of the result string, to extend
-it to exactly @var{width} columns.  The padding character is used at the
-end of the result if it falls short of @var{width}.  It is also used at
-the beginning of the result if one multi-column character in
+character added at the beginning and end of the result string, to
+extend it to exactly @var{width} columns.  The padding character is
+appended at the end of the result if it falls short of @var{width}, as
+many times as needed to reach @var{width}.  It is also prepended at
+the beginning of the result if a multi-column character in
 @var{string} extends across the column @var{start-column}.
 
-@vindex truncate-string-ellipsis
 If @var{ellipsis} is non-@code{nil}, it should be a string which will
-replace the end of @var{string} (including any padding) if it extends
-beyond @var{width}, unless the display width of @var{string} is equal
-to or less than the display width of @var{ellipsis}.  If
-@var{ellipsis} is non-@code{nil} and not a string, it stands for
-the value of the variable @code{truncate-string-ellipsis}.
+replace the end of @var{string} when it is truncated.  In this case,
+more charcaters will be removed from @var{string} to free enough space
+for @var{ellipsis} to fit within @var{width} columns.  However, if
+the display width of @var{string} is less than the display width of
+@var{ellipsis}, @var{ellipsis} will not be appended to the result.  If
+@var{ellipsis} is non-@code{nil} and not a string, it stands for the
+value returned by the function @code{truncate-string-ellipsis},
+described below.
+
+The optional argument @var{ellipsis-text-property}, if non-@code{nil},
+means hide the excess parts of @var{string} with a @code{display} text
+property (@pxref{Display Property}) showing the ellipsis, instead of
+actually truncating the string.
 
 @example
 (truncate-string-to-width "\tab\t" 12 4)
@@ -2009,6 +2018,16 @@ the value of the variable 
@code{truncate-string-ellipsis}.
 @end example
 @end defun
 
+@defun truncate-string-ellipsis
+This function returns the string to be used as an ellipses in
+@code{truncate-string-to-width} and other similar contexts.  The value
+is that of the variable @code{truncate-string-ellipsis}, if it's
+non-@code{nil}, the string with the single character @sc{U+2026
+HORIZONTAL ELLIPSIS} if that character can be displayed on the
+selected frame, and the string @samp{...} otherwise.
+@end defun
+
+
 The following function returns the size in pixels of text as if it were
 displayed in a given window.  This function is used by
 @code{fit-window-to-buffer} and @code{fit-frame-to-buffer}
diff --git a/doc/lispref/edebug.texi b/doc/lispref/edebug.texi
index 6404e06..6e9ec47 100644
--- a/doc/lispref/edebug.texi
+++ b/doc/lispref/edebug.texi
@@ -863,19 +863,20 @@ to a non-@code{nil} value.
 @end example
 
 @noindent
-Custom printing prints this as @samp{Result: #1=(#1# y)}.  The
-@samp{#1=} notation labels the structure that follows it with the label
-@samp{1}, and the @samp{#1#} notation references the previously labeled
-structure.  This notation is used for any shared elements of lists or
-vectors.
+If @code{print-circle} is non-@code{nil}, printing functions (e.g.,
+@code{prin1}) will print @code{a} as @samp{#1=(#1# y)}.  The
+@samp{#1=} notation labels the structure that follows it with the
+label @samp{1}, and the @samp{#1#} notation references the previously
+labeled structure.  This notation is used for any shared elements of
+lists or vectors.
 
 @defopt edebug-print-circle
 If non-@code{nil}, Edebug binds @code{print-circle} to this value while
 printing results.  The default value is @code{t}.
 @end defopt
 
-  Other programs can also use custom printing; see @file{cust-print.el}
-for details.
+  See @xref{Output Functions} for further details about how printing
+can be customized.
 
 @node Trace Buffer
 @subsection Trace Buffer
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 92cbc2a..3b8b4fb 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -548,7 +548,7 @@ the functions in the list 
@code{after-insert-file-functions}.
 (@pxref{Coding Systems}) used for decoding the file's contents,
 including end-of-line conversion.  However, if the file contains null
 bytes, it is by default visited without any code conversions.
-@xref{Lisp and Coding Systems, inhibit-nul-byte-detection}.
+@xref{Lisp and Coding Systems, inhibit-null-byte-detection}.
 
 If @var{visit} is non-@code{nil}, this function additionally marks the
 buffer as unmodified and sets up various fields in the buffer so that it
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index be2ee57..41c86d6 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -1729,7 +1729,8 @@ The command named @var{mode} first performs the standard 
actions such as
 setting the variable named @var{mode} and then executes the @var{body}
 forms, if any.  It then runs the mode hook variable
 @code{@var{mode}-hook} and finishes by evaluating any form in
-@code{:after-hook}.
+@code{:after-hook}.  (Note that all of this, including running the
+hook, is done both when the mode is enabled and disabled.)
 @end defmac
 
   The initial value must be @code{nil} except in cases where (1) the
diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi
index c6c78ec..8e9d624 100644
--- a/doc/lispref/nonascii.texi
+++ b/doc/lispref/nonascii.texi
@@ -1379,7 +1379,7 @@ operates on the contents of @var{string} instead of bytes 
in the buffer.
 @end defun
 
 @cindex null bytes, and decoding text
-@defvar inhibit-nul-byte-detection
+@defvar inhibit-null-byte-detection
 If this variable has a non-@code{nil} value, null bytes are ignored
 when detecting the encoding of a region or a string.  This allows the
 encoding of text that contains null bytes to be correctly detected,
diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 855df4b..5fefab9 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -1839,7 +1839,7 @@ system comes from @code{coding-system-for-read}, if that 
is
 non-@code{nil}; or else from the defaulting mechanism (@pxref{Default
 Coding Systems}).  If the text output by a process contains null
 bytes, Emacs by default uses @code{no-conversion} for it; see
-@ref{Lisp and Coding Systems, inhibit-nul-byte-detection}, for how to
+@ref{Lisp and Coding Systems, inhibit-null-byte-detection}, for how to
 control this behavior.
 
   @strong{Warning:} Coding systems such as @code{undecided}, which
diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi
index 4b2eab4..5a1dd55 100644
--- a/doc/misc/dbus.texi
+++ b/doc/misc/dbus.texi
@@ -63,7 +63,7 @@ another.  An overview of D-Bus can be found at
 * Signals::                     Sending and receiving signals.
 * Alternative Buses::           Alternative buses and environments.
 * Errors and Events::           Errors and events.
-* Monitoring Events::           Monitoring events.
+* Monitoring Messages::         Monitoring messages.
 * Index::                       Index including concepts, functions, variables.
 
 * GNU Free Documentation License:: The license for this documentation.
@@ -1622,7 +1622,9 @@ are constructed incrementally by adding single methods or 
properties
 at a time, @var{dont-register-service} can be used to prevent other
 clients from discovering the still incomplete interface.
 
-@noindent Example:
+@code{dbus-register-property} returns a Lisp object, which can be used
+as argument in @code{dbus-unregister-object} for removing the
+registration for @var{property}.  Example:
 
 @lisp
 (dbus-register-property
@@ -1687,9 +1689,9 @@ It is also possible to apply the @code{dbus-get-property},
 @defun dbus-unregister-object object
 This function unregisters @var{object} from the D-Bus.  @var{object}
 must be the result of a preceding @code{dbus-register-method},
-@code{dbus-register-property} or @code{dbus-register-signal} call
-(@pxref{Signals}).  It returns @code{t} if @var{object} has been
-unregistered, @code{nil} otherwise.
+@code{dbus-register-property}, @code{dbus-register-signal}
+(@pxref{Signals}) or @code{dbus-register-monitor} call.  It returns
+@code{t} if @var{object} has been unregistered, @code{nil} otherwise.
 
 When @var{object} identifies the last method or property, which is
 registered for the respective service, Emacs releases its association
@@ -2099,24 +2101,24 @@ D-Bus applications running.  They should therefore 
check carefully,
 whether a given D-Bus error is related to them.
 
 
-@node Monitoring Events
-@chapter Monitoring events.
+@node Monitoring Messages
+@chapter Monitoring messages.
 @cindex monitoring
 
 @defun dbus-register-monitor bus &optional handler &key type sender 
destination path interface member
-This function registers @var{handler} for monitor events on the D-Bus
-@var{bus}.
+This function registers @var{handler} for monitoring messages on the
+D-Bus @var{bus}.
 
 @var{bus} is either a Lisp keyword, @code{:system} or @code{:session},
 or a string denoting the bus address.
 
 @findex dbus-monitor-handler
-@var{handler} is the function to be called when a monitor event
-arrives.  It is called with the `args' slot of the monitor event,
-which are stripped off the type keywords.  If @var{handler} is
-@code{nil}, the default handler @code{dbus-monitor-handler} is
-applied.  This default handler behaves similar to the
-@command{dbus-monitor} program.
+@var{handler} is the function to be called when a D-Bus event to be
+monitored arrives.  It is called with the @var{args} slot of the D-Bus
+event (@pxref{Errors and Events}), which are stripped off the type
+keywords.  If @var{handler} is @code{nil}, the default handler
+@code{dbus-monitor-handler} is applied.  This default handler behaves
+similar to the @command{dbus-monitor} program.
 
 The other arguments are keyword-value pairs.  @code{:type @var{type}}
 defines the message type to be monitored.  If given, it must be equal
@@ -2132,6 +2134,9 @@ names.
 @code{:member @var{member}} is either a method name, a signal name, or
 an error name.
 
+@code{dbus-register-monitor} returns a Lisp object, which can be used
+as argument in @code{dbus-unregister-object} for removing the monitor.
+
 The following form shows all D-Bus events on the session bus in buffer
 @samp{*D-Bus Monitor*}:
 
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index ee20d28..f356dfe 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -1737,12 +1737,6 @@ of doing your job.  Note that this variable is used 
before
 @vindex gnus-no-groups-message
 Message displayed by Gnus when no groups are available.
 
-@item gnus-use-backend-marks
-@vindex gnus-use-backend-marks
-If non-@code{nil}, Gnus will store article marks both in the
-@file{.newsrc.eld} file and in the backends.  This will slow down
-group operation some.
-
 @end table
 
 
diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex
index 0d2a1fd..0a26e9f 100644
--- a/doc/misc/texinfo.tex
+++ b/doc/misc/texinfo.tex
@@ -1088,7 +1088,7 @@ where each line of input produces a line of output.}
     }
     % The -2 in the arguments here gives all the input to TeX catcode 12
     % (other) or 10 (space), preventing undefined control sequence errors. See
-    % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
+    % https://lists.gnu.org/r/bug-texinfo/2019-08/msg00031.html
     %
   \endgroup
   \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 1b5339b..0e397f4 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -4280,8 +4280,8 @@ first saving to a temporary file.
 
 @vindex tramp-local-host-regexp
 When connecting to a local host, @value{tramp} uses some internal
-optimizations.  They fail, when there is a chrooted environment.  In
-order to disable those optimizations, set user option
+optimizations.  They fail when Emacs runs in a chrooted environment.
+In order to disable those optimizations, set user option
 @code{tramp-local-host-regexp} to @code{nil}.
 
 
diff --git a/etc/NEWS b/etc/NEWS
index 88957fb..e1f9382 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -85,6 +85,10 @@ useful on systems such as FreeBSD which ships only with 
"etc/termcap".
 
 * Changes in Emacs 28.1
 
+*** New var 'redisplay-skip-initial-frame' to enable batch redisplay tests.
+Setting it to nil forces the redisplay to do its job even in the
+initial frame used in batch mode.
+
 ---
 ** Support for the 'strike-through' face attribute on TTY frames.
 If your terminal's termcap or terminfo database entry has the 'smxx'
@@ -541,6 +545,11 @@ grep emits SGR ANSI escape sequences to color its output.  
The new variable
 markers in order to provide highlighting in the source buffer.  The variable
 can be customized to accommodate other grep-like tools.
 
+---
+*** The 'lgrep' command now ignores directories.
+On systems where the grep command supports it, directories will be
+skipped.
+
 ** Help
 
 +++
@@ -1102,9 +1111,12 @@ keystrokes.
 
 +++
 *** Interactive regular expression search now uses faces for sub-groups.
-E.g., 'C-M-s foo-\([0-9]+\)' will now use the 'isearch-group-odd' face
+E.g., 'C-M-s foo-\([0-9]+\)' will now use the 'isearch-group-1' face
 on the part of the regexp that matches the sub-expression "[0-9]+".
-The even group matches are highlighted with the 'isearch-group-even' face.
+By default, there are two faces for sub-group highlighting, but you
+can define more faces whose names are of the form 'isearch-group-N',
+where N are successive numbers above 2.
+
 This is controlled by the 'search-highlight-submatches' user option.
 This feature is available only on terminals that have enough colors to
 distinguish between sub-expression highlighting.
@@ -1475,6 +1487,12 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 * Lisp Changes in Emacs 28.1
 
 +++
+** 'truncate-string-ellipsis' now uses '…' by default.
+Modes that use 'truncate-string-to-width' with non-nil, non-string
+argument 'ellipsis', will now indicate truncation using '…' when
+the selected frame can display it, and using "..." otherwise.
+
++++
 *** New command 'make-directory-autoloads'.
 This does the same as the old command 'update-directory-autoloads',
 but has different semantics: Instead of passing in the output file via
@@ -1611,6 +1629,8 @@ convert them to a list '(R G B)' of primary color values.
 This user option can be one of the predefined styles or a function to
 personalize the uniquified buffer name.
 
++++
+** 'inhibit-nul-byte-detection' is renamed to 'inhibit-null-byte-detection'.
 
 
 * Changes in Emacs 28.1 on Non-Free Operating Systems
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index dada27f..41d5ea1 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -786,7 +786,7 @@ build emacs with Cairo enabled ("configure --with-cairo" 
and have the
 appropriate Cairo development packages installed) as this
 configuration does not suffer from this problem.  See
 <https://github.com/googlefonts/Inconsolata/issues/42> and
-<https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-01/msg00456.html>
+<https://lists.gnu.org/r/bug-gnu-emacs/2020-01/msg00456.html>
 for more discussion.
 
 ** Under X, an unexpected monospace font is used as the default font.
diff --git a/etc/TODO b/etc/TODO
index 467b08e..4f9ea7e 100644
--- a/etc/TODO
+++ b/etc/TODO
@@ -525,7 +525,7 @@ Save backtraces when errors happen during specified 
filters, specified
 timers, and specified hooks.
 
 ** Install mmc@maruska.dyndns.org's no-flicker change
-https://lists.gnu.org/archive/html/emacs-devel/2005-12/msg00699.html
+https://lists.gnu.org/r/emacs-devel/2005-12/msg00699.html
 
 I don't know if this is still relevant.  I can't reach the URLs in
 the above message thread and double-buffering may have solved some
@@ -849,7 +849,7 @@ designed to be compatible with multiple Emacs ports.
 
 (See the scratch/nsxwidget branch, and the discussion around
 Objective-C code and GCC at
-https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00072.html)
+https://lists.gnu.org/r/emacs-devel/2019-08/msg00072.html )
 
 **** Respect 'frame-inhibit-implied-resize'
 When the variable 'frame-inhibit-implied-resize' is non-nil, frames
diff --git a/lisp/ChangeLog.12 b/lisp/ChangeLog.12
index a9d0067..40aa8c4 100644
--- a/lisp/ChangeLog.12
+++ b/lisp/ChangeLog.12
@@ -16274,7 +16274,7 @@
 
        (c-guess-basic-syntax): Adapt case 5B for the new
        `c-just-after-func-arglist-p'.  Merge cases 5B.1 and 5B.3.
-       Remove cases 5D.1 and 5D.2 since they aren't trigged anymore (case 5B.1
+       Remove cases 5D.1 and 5D.2 since they aren't triggered anymore (case 
5B.1
        covers all cases now).
 
        * progmodes/cc-defs.el (c-point): Add `bosws' and `eosws'.
@@ -32889,7 +32889,7 @@
 
 2005-01-14  Nick Roberts  <nickrob@snap.net.nz>
 
-       * xt-mouse.el (xterm-mouse-event): Compute window co-ordinates
+       * xt-mouse.el (xterm-mouse-event): Compute window coordinates
        more carefully.
 
 2005-01-13  Stefan Monnier  <monnier@iro.umontreal.ca>
diff --git a/lisp/ChangeLog.17 b/lisp/ChangeLog.17
index 1869f4e..8039e3f 100644
--- a/lisp/ChangeLog.17
+++ b/lisp/ChangeLog.17
@@ -6540,8 +6540,8 @@
        (newsticker--image-get): New arguments FILENAME and DIRECTORY.
        Use `url-retrieve' if `newsticker-retrieval-method' is 'intern.
        (newsticker--image-download-by-wget): New.  Use process properties
-       for storing informations.
-       (newsticker--image-sentinel): Read informations from process properties.
+       for storing information.
+       (newsticker--image-sentinel): Read information from process properties.
        (newsticker--image-save)
        (newsticker--image-remove)
        (newsticker--image-download-by-url)
diff --git a/lisp/calc/calc-bin.el b/lisp/calc/calc-bin.el
index 33fd1af..aa10d55 100644
--- a/lisp/calc/calc-bin.el
+++ b/lisp/calc/calc-bin.el
@@ -403,7 +403,7 @@
            (setq a (math-clip a w)))
        (let ((two-to-sizem1 (math-power-of-2 (1- w)))
              (sh (calcFunc-lsh a n w)))
-         (cond ((Math-natnum-lessp a two-to-sizem1)
+         (cond ((zerop (logand a two-to-sizem1))
                 sh)
                ((Math-lessp n (- 1 w))
                 (math-add (math-mul two-to-sizem1 2) -1))
diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el
index 71321e1..94bb7fa 100644
--- a/lisp/cedet/semantic.el
+++ b/lisp/cedet/semantic.el
@@ -195,13 +195,13 @@ during a flush when the cache is given a new value of 
nil.")
 (make-variable-buffer-local 'semantic-parse-tree-state)
 
 (defmacro semantic-parse-tree-unparseable ()
-  "Indicate that the current buffer is unparseable.
+  "Indicate that the current buffer is unparsable.
 It is also true that the parse tree will need either updating or
 a rebuild.  This state will be changed when the user edits the buffer."
   '(setq semantic-parse-tree-state 'unparseable))
 
 (defmacro semantic-parse-tree-unparseable-p ()
-  "Return non-nil if the current buffer has been marked unparseable."
+  "Return non-nil if the current buffer has been marked unparsable."
   '(eq semantic-parse-tree-state 'unparseable))
 
 (defmacro semantic-parse-tree-set-needs-update ()
@@ -539,14 +539,14 @@ If the buffer cache is out of date, attempt an 
incremental reparse.
 If the buffer has not been parsed before, or if the incremental reparse
 fails, then parse the entire buffer.
 If a lexical error had been previously discovered and the buffer
-was marked unparseable, then do nothing, and return the cache."
+was marked unparsable, then do nothing, and return the cache."
   (and
    ;; Is this a semantic enabled buffer?
    (semantic-active-p)
    ;; Application hooks say the buffer is safe for parsing
    (run-hook-with-args-until-failure
     'semantic--before-fetch-tags-hook)
-   ;; If the buffer was previously marked unparseable,
+   ;; If the buffer was previously marked unparsable,
    ;; then don't waste our time.
    (not (semantic-parse-tree-unparseable-p))
    ;; The parse tree actually needs to be refreshed
@@ -617,7 +617,7 @@ Does nothing if the current buffer doesn't need reparsing."
   ;; do them here, then all the bovination hooks are not run, and
   ;; we save lots of time.
   (cond
-   ;; If the buffer was previously marked unparseable,
+   ;; If the buffer was previously marked unparsable,
    ;; then don't waste our time.
    ((semantic-parse-tree-unparseable-p)
     nil)
diff --git a/lisp/comint.el b/lisp/comint.el
index 6119476..944e1ae 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -362,6 +362,7 @@ This variable is buffer-local."
 ;; Some implementations of passwd use "Password (again)" as the 2nd prompt.
 ;; Something called "perforce" uses "Enter password:".
 ;; OpenVPN prints a prompt like: "Enter Auth Password:".
+;; OpenBSD doas prints "doas (user@host) password:".
 ;; See ert test `comint-test-password-regexp'.
 (defcustom comint-password-prompt-regexp
   (concat
@@ -370,7 +371,7 @@ This variable is buffer-local."
     '("Enter" "enter" "Enter same" "enter same" "Enter the" "enter the"
       "Enter Auth" "enter auth" "Old" "old" "New" "new" "'s" "login"
       "Kerberos" "CVS" "UNIX" " SMB" "LDAP" "PEM" "SUDO"
-      "[sudo]" "Repeat" "Bad" "Retype")
+      "[sudo]" "doas" "Repeat" "Bad" "Retype")
     t)
    ;; Allow for user name to precede password equivalent (Bug#31075).
    " +.*\\)"
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index a62b623..9c5d89f 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -487,6 +487,14 @@ Return a list suitable for use in `interactive'."
               (if (symbolp v) v nil)
             (intern val)))))
 
+(defvar custom-actioned-widget nil
+  "Widget for which to show the menu of available actions.
+
+When showing a menu for a custom-variable, custom-face or custom-group widget,
+the respective custom-*-action functions bind this variable to that widget, and
+the respective custom-*-menu menus use the binding in their :enable and
+:selected forms.")
+
 (defun custom-menu-filter (menu widget)
   "Convert MENU to the form used by `widget-choose'.
 MENU should be in the same format as `custom-variable-menu'.
@@ -2851,53 +2859,81 @@ otherwise."
 (defun custom-variable-standard-value (widget)
   (get (widget-value widget) 'standard-value))
 
-(defvar custom-variable-menu
-  `(("Set for Current Session" custom-variable-set
-     (lambda (widget)
-       (eq (widget-get widget :custom-state) 'modified)))
-    ;; Note that in all the backquoted code in this file, we test
-    ;; init-file-user rather than user-init-file.  This is in case
-    ;; cus-edit is loaded by something in site-start.el, because
-    ;; user-init-file is not set at that stage.
-    ;; https://lists.gnu.org/r/emacs-devel/2007-10/msg00310.html
-    ,@(when (or custom-file init-file-user)
-       '(("Save for Future Sessions" custom-variable-save
-          (lambda (widget)
-            (memq (widget-get widget :custom-state)
-                  '(modified set changed rogue))))))
-    ("Undo Edits" custom-redraw
-     (lambda (widget)
-       (and (default-boundp (widget-value widget))
-           (memq (widget-get widget :custom-state) '(modified changed)))))
-    ("Revert This Session's Customization" custom-variable-reset-saved
-     (lambda (widget)
-       (memq (widget-get widget :custom-state)
-            '(modified set changed rogue))))
-    ,@(when (or custom-file init-file-user)
-       '(("Erase Customization" custom-variable-reset-standard
-          (lambda (widget)
-            (and (get (widget-value widget) 'standard-value)
-                 (memq (widget-get widget :custom-state)
-                       '(modified set changed saved rogue)))))))
-    ("Set to Backup Value" custom-variable-reset-backup
-     (lambda (widget)
-       (get (widget-value widget) 'backup-value)))
-    ("---" ignore ignore)
-    ("Add Comment" custom-comment-show custom-comment-invisible-p)
-    ("---" ignore ignore)
-    ("Show Current Value" custom-variable-edit
-     (lambda (widget)
-       (eq (widget-get widget :custom-form) 'lisp)))
-    ("Show Saved Lisp Expression" custom-variable-edit-lisp
-     (lambda (widget)
-       (eq (widget-get widget :custom-form) 'edit))))
-  "Alist of actions for the `custom-variable' widget.
+(defvar custom-variable-menu nil
+  "If non-nil, an alist of actions for the `custom-variable' widget.
+
+This variable is kept for backward compatibility reasons, please use
+`custom-variable-extended-menu' instead.
+
 Each entry has the form (NAME ACTION FILTER) where NAME is the name of
 the menu entry, ACTION is the function to call on the widget when the
 menu is selected, and FILTER is a predicate which takes a `custom-variable'
 widget as an argument, and returns non-nil if ACTION is valid on that
 widget.  If FILTER is nil, ACTION is always valid.")
 
+(defvar custom-variable-extended-menu
+  ;; No need to give the keymap a prompt, `widget-choose' takes care of it.
+  (let ((map (make-sparse-keymap)))
+    (define-key-after map [custom-variable-set]
+      '(menu-item "Set for Current Session" custom-variable-set
+                  :enable (eq (widget-get custom-actioned-widget :custom-state)
+                              'modified)))
+    ;; Conditionally add items that depend on having loaded the custom-file,
+    ;; rather than giving it a :visible form, because we used to conditionally
+    ;; add this item when using simplified menus.
+    ;; Note that we test init-file-user rather than user-init-file.  This is
+    ;; in case cus-edit is loaded by something in site-start.el, because
+    ;; user-init-file is not set at that stage.
+    ;; https://lists.gnu.org/r/emacs-devel/2007-10/msg00310.html
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-variable-save]
+        '(menu-item "Save for Future Sessions" custom-variable-save
+                    :enable (memq
+                             (widget-get custom-actioned-widget :custom-state)
+                             '(modified set changed rogue)))))
+    (define-key-after map [custom-redraw]
+      '(menu-item "Undo Edits" custom-redraw
+                  :enable (memq
+                           (widget-get custom-actioned-widget :custom-state)
+                           '(modified changed))))
+    (define-key-after map [custom-variable-reset-saved]
+      '(menu-item "Revert This Session's Customization"
+                  custom-variable-reset-saved
+                  :enable (memq
+                           (widget-get custom-actioned-widget :custom-state)
+                           '(modified set changed rogue))))
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-variable-reset-standard]
+        '(menu-item "Erase Customization" custom-variable-reset-standard
+                    :enable (memq
+                             (widget-get custom-actioned-widget :custom-state)
+                             '(modified set changed saved rogue)))))
+    (define-key-after map [custom-variable-reset-backup]
+      '(menu-item "Set to Backup Value" custom-variable-reset-backup
+                  :enable (get
+                           (widget-value custom-actioned-widget)
+                           'backup-value)))
+    (define-key-after map [sep0]
+      '(menu-item "---"))
+    (define-key-after map [custom-comment-show]
+      '(menu-item "Add Comment" custom-comment-show
+                  :enable (custom-comment-invisible-p custom-actioned-widget)))
+    (define-key-after map [sep1]
+      '(menu-item "---"))
+    (define-key-after map [custom-variable-edit]
+      '(menu-item "Show Current Value" custom-variable-edit
+                  :button (:radio . (eq (widget-get custom-actioned-widget
+                                                    :custom-form)
+                                        'edit))))
+    (define-key-after map [custom-variable-edit-lisp]
+      '(menu-item "Show Saved Lisp Expression" custom-variable-edit-lisp
+                  :button (:radio . (eq (widget-get custom-actioned-widget
+                                                    :custom-form)
+                                        'lisp))))
+    map)
+  "A menu for `custom-variable' widgets.
+Used in `custom-variable-action' to show a menu to the user.")
+
 (defun custom-variable-action (widget &optional event)
   "Show the menu for `custom-variable' WIDGET.
 Optional EVENT is the location for the menu."
@@ -2907,12 +2943,17 @@ Optional EVENT is the location for the menu."
       (custom-variable-state-set widget))
     (custom-redraw-magic widget)
     (let* ((completion-ignore-case t)
+           (custom-actioned-widget widget)
           (answer (widget-choose (concat "Operation on "
-                                         (custom-unlispify-tag-name
-                                          (widget-get widget :value)))
-                                 (custom-menu-filter custom-variable-menu
-                                                     widget)
-                                 event)))
+                                          (custom-unlispify-tag-name
+                                           (widget-get widget :value)))
+                                  ;; Get rid of checks like this one if we ever
+                                  ;; remove the simplified menus.
+                                  (if custom-variable-menu
+                                      (custom-menu-filter custom-variable-menu
+                                                          widget)
+                                    custom-variable-extended-menu)
+                                  event)))
       (if answer
          (funcall answer widget)))))
 
@@ -3676,39 +3717,66 @@ the present value is saved to its :shown-value property 
instead."
           (widget-put widget :children children)
          (custom-face-state-set widget))))))
 
-(defvar custom-face-menu
-  `(("Set for Current Session" custom-face-set)
-    ,@(when (or custom-file init-file-user)
-       '(("Save for Future Sessions" custom-face-save)))
-    ("Undo Edits" custom-redraw
-     (lambda (widget)
-       (memq (widget-get widget :custom-state) '(modified changed))))
-    ("Revert This Session's Customization" custom-face-reset-saved
-     (lambda (widget)
-       (memq (widget-get widget :custom-state) '(modified set changed))))
-    ,@(when (or custom-file init-file-user)
-       '(("Erase Customization" custom-face-reset-standard
-          (lambda (widget)
-            (get (widget-value widget) 'face-defface-spec)))))
-    ("---" ignore ignore)
-    ("Add Comment" custom-comment-show custom-comment-invisible-p)
-    ("---" ignore ignore)
-    ("For Current Display" custom-face-edit-selected
-     (lambda (widget)
-       (not (eq (widget-get widget :custom-form) 'selected))))
-    ("For All Kinds of Displays" custom-face-edit-all
-     (lambda (widget)
-       (not (eq (widget-get widget :custom-form) 'all))))
-    ("Show Lisp Expression" custom-face-edit-lisp
-     (lambda (widget)
-       (not (eq (widget-get widget :custom-form) 'lisp)))))
-  "Alist of actions for the `custom-face' widget.
+(defvar custom-face-menu nil
+  "If non-nil, an alist of actions for the `custom-face' widget.
+
+This variable is kept for backward compatibility reasons, please use
+`custom-face-extended-menu' instead.
+
 Each entry has the form (NAME ACTION FILTER) where NAME is the name of
 the menu entry, ACTION is the function to call on the widget when the
 menu is selected, and FILTER is a predicate which takes a `custom-face'
 widget as an argument, and returns non-nil if ACTION is valid on that
 widget.  If FILTER is nil, ACTION is always valid.")
 
+(defvar custom-face-extended-menu
+  (let ((map (make-sparse-keymap)))
+    (define-key-after map [custom-face-set]
+      '(menu-item "Set for Current Session" custom-face-set))
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-face-save]
+        '(menu-item "Save for Future Sessions" custom-face-save)))
+    (define-key-after map [custom-redraw]
+      '(menu-item "Undo Edits" custom-redraw
+                  :enable (memq
+                           (widget-get custom-actioned-widget :custom-state)
+                           '(modified changed))))
+    (define-key-after map [custom-face-reset-saved]
+      '(menu-item "Revert This Session's Customization" custom-face-reset-saved
+                  :enable (memq
+                           (widget-get custom-actioned-widget :custom-state)
+                           '(modified set changed))))
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-face-reset-standard]
+        '(menu-item "Erase Customization" custom-face-reset-standard
+                    :enable (get (widget-value custom-actioned-widget)
+                                 'face-defface-spec))))
+    (define-key-after map [sep0]
+      '(menu-item "---"))
+    (define-key-after map [custom-comment-show]
+      '(menu-item "Add Comment" custom-comment-show
+                  :enable (custom-comment-invisible-p custom-actioned-widget)))
+    (define-key-after map [sep1]
+      '(menu-item "---"))
+    (define-key-after map [custom-face-edit-selected]
+      '(menu-item "For Current Display" custom-face-edit-selected
+                  :button (:radio . (eq (widget-get custom-actioned-widget
+                                                    :custom-form)
+                                        'selected))))
+    (define-key-after map [custom-face-edit-all]
+      '(menu-item "For All Kinds of Displays" custom-face-edit-all
+                  :button (:radio . (eq (widget-get custom-actioned-widget
+                                                    :custom-form)
+                                        'all))))
+    (define-key-after map [custom-face-edit-lisp]
+      '(menu-item "Show Lisp Expression" custom-face-edit-lisp
+                  :button (:radio . (eq (widget-get custom-actioned-widget
+                                                    :custom-form)
+                                        'lisp))))
+    map)
+  "A menu for `custom-face' widgets.
+Used in `custom-face-action' to show a menu to the user.")
+
 (defun custom-face-edit-selected (widget)
   "Edit selected attributes of the value of WIDGET."
   (widget-put widget :custom-state 'unknown)
@@ -3775,12 +3843,15 @@ Optional EVENT is the location for the menu."
   (if (eq (widget-get widget :custom-state) 'hidden)
       (custom-toggle-hide widget)
     (let* ((completion-ignore-case t)
+           (custom-actioned-widget widget)
           (symbol (widget-get widget :value))
           (answer (widget-choose (concat "Operation on "
                                          (custom-unlispify-tag-name symbol))
-                                 (custom-menu-filter custom-face-menu
-                                                     widget)
-                                 event)))
+                                  (if custom-face-menu
+                                      (custom-menu-filter custom-face-menu
+                                                          widget)
+                                    custom-face-extended-menu)
+                                  event)))
       (if answer
          (funcall answer widget)))))
 
@@ -4310,43 +4381,65 @@ This works for both graphical and text displays."
            (insert "\n")
            (custom-group--draw-horizontal-line)))))
 
-(defvar custom-group-menu
-  `(("Set for Current Session" custom-group-set
-     (lambda (widget)
-       (eq (widget-get widget :custom-state) 'modified)))
-    ,@(when (or custom-file init-file-user)
-       '(("Save for Future Sessions" custom-group-save
-          (lambda (widget)
-            (memq (widget-get widget :custom-state) '(modified set))))))
-    ("Undo Edits" custom-group-reset-current
-     (lambda (widget)
-       (memq (widget-get widget :custom-state) '(modified))))
-    ("Revert This Session's Customizations" custom-group-reset-saved
-     (lambda (widget)
-       (memq (widget-get widget :custom-state) '(modified set))))
-    ,@(when (or custom-file init-file-user)
-       '(("Erase Customization" custom-group-reset-standard
-          (lambda (widget)
-            (memq (widget-get widget :custom-state) '(modified set saved)))))))
-  "Alist of actions for the `custom-group' widget.
+(defvar custom-group-menu nil
+  "If non-nil, an alist of actions for the `custom-group' widget.
+
+This variable is kept for backward compatibility reasons, please use
+`custom-group-extended-menu' instead.
+
 Each entry has the form (NAME ACTION FILTER) where NAME is the name of
 the menu entry, ACTION is the function to call on the widget when the
 menu is selected, and FILTER is a predicate which takes a `custom-group'
 widget as an argument, and returns non-nil if ACTION is valid on that
 widget.  If FILTER is nil, ACTION is always valid.")
 
+(defvar custom-group-extended-menu
+  (let ((map (make-sparse-keymap)))
+    (define-key-after map [custom-group-set]
+      '(menu-item "Set for Current Session" custom-group-set
+                  :enable (eq (widget-get custom-actioned-widget :custom-state)
+                              'modified)))
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-group-save]
+        '(menu-item "Save for Future Sessions" custom-group-save
+                    :enable (memq
+                             (widget-get custom-actioned-widget :custom-state)
+                             '(modified set)))))
+    (define-key-after map [custom-group-reset-current]
+      '(menu-item "Undo Edits" custom-group-reset-current
+                  :enable (eq (widget-get custom-actioned-widget :custom-state)
+                              'modified)))
+    (define-key-after map [custom-group-reset-saved]
+      '(menu-item "Revert This Session's Customizations"
+                  custom-group-reset-saved
+                  :enable (memq
+                           (widget-get custom-actioned-widget :custom-state)
+                           '(modified set))))
+    (when (or custom-file init-file-user)
+      (define-key-after map [custom-group-reset-standard]
+        '(menu-item "Erase Customization" custom-group-reset-standard
+                    :enable (memq
+                             (widget-get custom-actioned-widget :custom-state)
+                             '(modified set saved)))))
+    map)
+    "A menu for `custom-group' widgets.
+Used in `custom-group-action' to show a menu to the user.")
+
 (defun custom-group-action (widget &optional event)
   "Show the menu for `custom-group' WIDGET.
 Optional EVENT is the location for the menu."
   (if (eq (widget-get widget :custom-state) 'hidden)
       (custom-toggle-hide widget)
     (let* ((completion-ignore-case t)
+           (custom-actioned-widget widget)
           (answer (widget-choose (concat "Operation on "
                                          (custom-unlispify-tag-name
                                           (widget-get widget :value)))
-                                 (custom-menu-filter custom-group-menu
-                                                     widget)
-                                 event)))
+                                  (if custom-group-menu
+                                      (custom-menu-filter custom-group-menu
+                                                          widget)
+                                    custom-group-extended-menu)
+                                  event)))
       (if answer
          (funcall answer widget)))))
 
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 8aaf38a..02d8965 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -910,17 +910,27 @@ Resize the containing frame if needed."
          (width-diff  (- img-width  win-width))
          (height-diff (- img-height win-height))
          (new-frame-params
+          ;; If we can't resize the window, try and resize the frame.
+          ;; We used to compare the `window-width/height` and the
+          ;; `frame-width/height` instead of catching the errors, but
+          ;; it's too fiddly (e.g. in the presence of the miniwindow,
+          ;; the height the frame should be equal to the height of the
+          ;; root window +1).
           (append
-           (if (= (window-width) (frame-width))
-               `((width  . (text-pixels
-                            . ,(+ (frame-text-width) width-diff))))
-             (enlarge-window (/ width-diff (frame-char-width)) 'horiz)
-             nil)
-           (if (= (window-height) (frame-height))
-               `((height  . (text-pixels
-                             . ,(+ (frame-text-height) height-diff))))
-             (enlarge-window (/ height-diff (frame-char-height)) nil)
-             nil))))
+           (condition-case nil
+               (progn
+                 (enlarge-window (/ width-diff (frame-char-width)) 'horiz)
+                 nil)
+             (error
+              `((width  . (text-pixels
+                           . ,(+ (frame-text-width) width-diff))))))
+           (condition-case nil
+               (progn
+                 (enlarge-window (/ height-diff (frame-char-height)) nil)
+                 nil)
+             (error
+              `((height  . (text-pixels
+                            . ,(+ (frame-text-height) height-diff)))))))))
     (when new-frame-params
       (modify-frame-parameters (selected-frame) new-frame-params))))
 
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index b1e27a4..1320501 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -284,7 +284,7 @@ The information is logged to `byte-compile-log-buffer'."
 ;; This needs to be autoloaded because it needs to be available to
 ;; Emacs before the byte compiler is loaded, otherwise Emacs will not
 ;; know that this variable is marked as safe until it is too late.
-;; (See https://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00261.html )
+;; (See https://lists.gnu.org/r/emacs-devel/2018-01/msg00261.html )
 ;;;###autoload(put 'byte-compile-error-on-warn 'safe-local-variable 'booleanp)
 
 (defconst byte-compile-warning-types
diff --git a/lisp/frame.el b/lisp/frame.el
index 7751ae1..29ac862 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -1244,13 +1244,10 @@ face specs for the new background mode."
                          ;; during startup with -rv on the command
                          ;; line for the initial frame, because frames
                          ;; are not recorded in the pdump file.
-                         (assq face (frame-face-alist))
+                         (assq face (frame-face-alist frame))
                          (face-spec-match-p face
                                             (face-user-default-spec face)
-                                            ;; FIXME: why selected-frame and
-                                            ;; not the frame that is the
-                                            ;; argument to this function?
-                                            (selected-frame))))
+                                            frame)))
                   (push face locally-modified-faces)))
            ;; Now change to the new frame parameters
            (modify-frame-parameters frame params)
diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el
index f748996..6a7e81b 100644
--- a/lisp/gnus/gnus-agent.el
+++ b/lisp/gnus/gnus-agent.el
@@ -3812,7 +3812,6 @@ has been fetched."
         t))))
 
 (defun gnus-agent-store-article (article group)
-  (declare (obsolete nil "28.1"))
   (let* ((gnus-command-method (gnus-find-method-for-group group))
         (file (gnus-agent-article-name (number-to-string article) group))
         (file-name-coding-system nnmail-pathname-coding-system)
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index b114792..2d9d5ec 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -7092,7 +7092,10 @@ If given a prefix, show the hidden text instead."
                                              gnus-summary-buffer)
                    (when gnus-keep-backlog
                      (gnus-backlog-enter-article
-                      group article (current-buffer))))
+                      group article (current-buffer)))
+                   (when (and gnus-agent
+                              (gnus-agent-group-covered-p group))
+                     (gnus-agent-store-article article group)))
                  (setq result 'article))
                 (methods
                  (setq gnus-override-method (pop methods)))
diff --git a/lisp/gnus/gnus-async.el b/lisp/gnus/gnus-async.el
index 9bcb6c3..e3e81c8 100644
--- a/lisp/gnus/gnus-async.el
+++ b/lisp/gnus/gnus-async.el
@@ -225,6 +225,12 @@ that was fetched."
       (save-excursion
        (save-restriction
          (narrow-to-region mark (point-max))
+         ;; Put the articles into the agent, if they aren't already.
+         (when (and gnus-agent
+                    (gnus-agent-group-covered-p group))
+           (save-restriction
+             (narrow-to-region mark (point-max))
+             (gnus-agent-store-article article group)))
          ;; Prefetch images for the groups that want that.
          (when (fboundp 'gnus-html-prefetch-images)
            (gnus-html-prefetch-images summary))
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index b3ed5cb..561f199 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -6240,8 +6240,8 @@ If WHERE is `summary', the summary mode line format will 
be used."
          ;; We might have to chop a bit of the string off...
          (when (> (length mode-string) max-len)
            (setq mode-string
-                 (concat (truncate-string-to-width mode-string (- max-len 3))
-                         "...")))))
+                 (truncate-string-to-width
+                  mode-string (- max-len 3) nil nil t)))))
       ;; Update the mode line.
       (setq mode-line-buffer-identification
            (gnus-mode-line-buffer-identification (list mode-string)))
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 77856ae..a906e56 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -1106,7 +1106,8 @@ point and mark around the citation text as modified."
 If nil, don't insert a signature.
 If t, insert `message-signature-file'.
 If a function or form, insert its result.
-See `mail-signature' for the recommended format of a signature."
+See `mail-signature' for the recommended format of a signature.
+Also see `message-signature-insert-empty-line'."
   :version "23.2"
   :type '(choice string
                  (const :tag "None" nil)
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index c9a7488..8ff3b56 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -1597,7 +1597,7 @@ If point is on a group name, this function operates on 
that group."
 (defun ibuffer-compile-make-substring-form (strvar maxvar from-end-p)
   (if from-end-p
       ;; FIXME: not sure if this case is correct (Bug#24972)
-      `(truncate-string-to-width str strlen (- strlen ,maxvar) nil ?\s)
+      `(truncate-string-to-width str strlen (- strlen ,maxvar) ?\s)
     `(truncate-string-to-width ,strvar ,maxvar nil ?\s)))
 
 (defun ibuffer-compile-make-format-form (strvar widthform alignment)
diff --git a/lisp/info.el b/lisp/info.el
index 20633fd..6dffb39 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -638,14 +638,14 @@ Do the right thing if the file has been compressed or 
zipped."
          (insert-file-contents-literally fullname visit)
          (let ((inhibit-read-only t)
                (coding-system-for-write 'no-conversion)
-               (inhibit-nul-byte-detection t) ; Index nodes include null bytes
+               (inhibit-null-byte-detection t) ; Index nodes include null bytes
                (default-directory (or (file-name-directory fullname)
                                       default-directory)))
            (or (consp decoder)
                (setq decoder (list decoder)))
            (apply #'call-process-region (point-min) (point-max)
                   (car decoder) t t nil (cdr decoder))))
-      (let ((inhibit-nul-byte-detection t)) ; Index nodes include null bytes
+      (let ((inhibit-null-byte-detection t)) ; Index nodes include null bytes
        (insert-file-contents fullname visit)))
 
     ;; Clear the caches of modified Info files.
@@ -1375,7 +1375,7 @@ is non-nil)."
                          ;; Index nodes include null bytes.  DIR
                          ;; files should not have indices, but who
                          ;; knows...
-                         (let ((inhibit-nul-byte-detection t))
+                         (let ((inhibit-null-byte-detection t))
                            (insert-file-contents file)
                            (setq Info-dir-file-name file)
                            (push (current-buffer) buffers)
diff --git a/lisp/international/ja-dic-cnv.el b/lisp/international/ja-dic-cnv.el
index f5e70ce..5f645b6 100644
--- a/lisp/international/ja-dic-cnv.el
+++ b/lisp/international/ja-dic-cnv.el
@@ -329,12 +329,12 @@ Optional argument DIRNAME if specified is the directory 
name under which
 the generated Emacs Lisp is saved.
 The name of generated file is specified by the variable `ja-dic-filename'."
   (interactive "FSKK dictionary file: ")
-  (let* ((coding-system-for-read 'euc-japan)
-        (skkbuf (get-buffer-create " *skkdic-unannotated*"))
+  (let* ((skkbuf (get-buffer-create " *skkdic-unannotated*"))
         (buf (get-buffer-create "*skkdic-work*")))
     ;; Set skkbuf to an unannotated copy of the dictionary.
     (with-current-buffer skkbuf
-      (insert-file-contents (expand-file-name filename))
+      (let ((coding-system-for-read 'euc-japan))
+        (insert-file-contents (expand-file-name filename)))
       (re-search-forward "^[^;]")
       (while (re-search-forward ";[^\n/]*/" nil t)
        (replace-match "/")))
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index 660ac58..8f31633 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -44,9 +44,22 @@
        (setq i (1+ i)))))
   string)
 
-(defvar truncate-string-ellipsis "..."  ;"…"
+(defvar truncate-string-ellipsis nil
   "String to use to indicate truncation.
-Serves as default value of ELLIPSIS argument to `truncate-string-to-width'.")
+Serves as default value of ELLIPSIS argument to `truncate-string-to-width'
+returned by the function `truncate-string-ellipsis'.")
+
+(defun truncate-string-ellipsis ()
+  "Return the string used to indicate truncation.
+Use the value of the variable `truncate-string-ellipsis' when it's non-nil.
+Otherwise, return the Unicode character U+2026 \"HORIZONTAL ELLIPSIS\"
+when it's displayable on the selected frame, or `...'.  This function
+needs to be called on every use of `truncate-string-to-width' to
+decide whether the selected frame can display that Unicode character."
+  (cond
+   (truncate-string-ellipsis)
+   ((char-displayable-p ?…) "…")
+   ("...")))
 
 ;;;###autoload
 (defun truncate-string-to-width (str end-column
@@ -73,7 +86,7 @@ If ELLIPSIS is non-nil, it should be a string which will 
replace the
 end of STR (including any padding) if it extends beyond END-COLUMN,
 unless the display width of STR is equal to or less than the display
 width of ELLIPSIS.  If it is non-nil and not a string, then ELLIPSIS
-defaults to `truncate-string-ellipsis'.
+defaults to `truncate-string-ellipsis', or to three dots when it's nil.
 
 If ELLIPSIS-TEXT-PROPERTY is non-nil, a too-long string will not
 be truncated, but instead the elided parts will be covered by a
@@ -81,7 +94,7 @@ be truncated, but instead the elided parts will be covered by 
a
   (or start-column
       (setq start-column 0))
   (when (and ellipsis (not (stringp ellipsis)))
-    (setq ellipsis truncate-string-ellipsis))
+    (setq ellipsis (truncate-string-ellipsis)))
   (let ((str-len (length str))
        (str-width (string-width str))
        (ellipsis-width (if ellipsis (string-width ellipsis) 0))
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 3edea7e..607287f 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -856,10 +856,10 @@ VALUE is a CCL program name defined by 
`define-ccl-program'.  The
 CCL program reads a character sequence and writes a byte sequence
 as an encoding result.
 
-`:inhibit-nul-byte-detection'
+`:inhibit-null-byte-detection'
 
 VALUE non-nil means Emacs ignore null bytes on code detection.
-See the variable `inhibit-nul-byte-detection'.  This attribute
+See the variable `inhibit-null-byte-detection'.  This attribute
 is meaningful only when `:coding-type' is `undecided'.
 
 `:inhibit-iso-escape-detection'
@@ -904,7 +904,7 @@ non-ASCII files.  This attribute is meaningful only when
                                      :ccl-encoder
                                      :valids))
                                   ((eq coding-type 'undecided)
-                                   '(:inhibit-nul-byte-detection
+                                   '(:inhibit-null-byte-detection
                                      :inhibit-iso-escape-detection
                                      :prefer-utf-8))))))
 
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 781a8c5..f39de79 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -271,8 +271,12 @@ are `word-search-regexp' \(`\\[isearch-toggle-word]'), 
`isearch-symbol-regexp'
 
 (defcustom search-highlight-submatches t
   "Whether to highlight regexp subexpressions of the current regexp match.
-The faces used to do the highlights are named `isearch-group-odd' and
-`isearch-group-even'."
+The faces used to do the highlights are named `isearch-group-1',
+`isearch-group-2', etc.  (By default, only these 2 are defined.)
+When there are more matches than faces, then faces are reused from the
+beginning, in a cyclical manner, so the `isearch-group-1' face is
+isreused for the third match.  If you want to use more distinctive colors,
+you can define more of these faces using the same numbering scheme."
   :type 'boolean
   :version "28.1")
 
@@ -887,7 +891,7 @@ variable by the command `isearch-toggle-lax-whitespace'.")
   "Stack of search status elements.
 Each element is an `isearch--state' struct where the slots are
  [STRING MESSAGE POINT SUCCESS FORWARD OTHER-END WORD/REGEXP-FUNCTION
-  ERROR WRAPPED BARRIER CASE-FOLD-SEARCH POP-FUN]")
+  ERROR WRAPPED BARRIER CASE-FOLD-SEARCH POP-FUN MATCH-DATA]")
 
 (defvar isearch-string "")  ; The current search string.
 (defvar isearch-message "") ; text-char-description version of isearch-string
@@ -903,6 +907,7 @@ Each element is an `isearch--state' struct where the slots 
are
   "Recorded minimum/maximal point for the current search.")
 (defvar isearch-just-started nil)
 (defvar isearch-start-hscroll 0)       ; hscroll when starting the search.
+(defvar isearch-match-data nil)         ; match-data of regexp-based search
 
 ;; case-fold-search while searching.
 ;;   either nil, t, or 'yes.  'yes means the same as t except that mixed
@@ -1221,6 +1226,7 @@ used to set the value of `isearch-regexp-function'."
        isearch-small-window nil
        isearch-just-started t
        isearch-start-hscroll (window-hscroll)
+       isearch-match-data nil
 
        isearch-opoint (point)
        search-ring-yank-pointer nil
@@ -1349,8 +1355,8 @@ The last thing is to trigger a new round of lazy 
highlighting."
                (set-window-hscroll (selected-window) current-scroll))))
        (if isearch-other-end
             (if (< isearch-other-end (point)) ; isearch-forward?
-                (isearch-highlight isearch-other-end (point))
-              (isearch-highlight (point) isearch-other-end))
+                (isearch-highlight isearch-other-end (point) 
isearch-match-data)
+              (isearch-highlight (point) isearch-other-end isearch-match-data))
           (isearch-dehighlight))))
   (setq ;; quit-flag nil  not for isearch-mode
    isearch-adjusted nil
@@ -1508,7 +1514,8 @@ REGEXP if non-nil says use the regexp search ring."
                  (barrier isearch-barrier)
                  (case-fold-search isearch-case-fold-search)
                  (pop-fun (if isearch-push-state-function
-                              (funcall isearch-push-state-function))))))
+                              (funcall isearch-push-state-function)))
+                 (match-data isearch-match-data))))
   (string nil :read-only t)
   (message nil :read-only t)
   (point nil :read-only t)
@@ -1520,7 +1527,8 @@ REGEXP if non-nil says use the regexp search ring."
   (wrapped nil :read-only t)
   (barrier nil :read-only t)
   (case-fold-search nil :read-only t)
-  (pop-fun nil :read-only t))
+  (pop-fun nil :read-only t)
+  (match-data nil :read-only t))
 
 (defun isearch--set-state (cmd)
   (setq isearch-string (isearch--state-string cmd)
@@ -1532,7 +1540,8 @@ REGEXP if non-nil says use the regexp search ring."
        isearch-error (isearch--state-error cmd)
        isearch-wrapped (isearch--state-wrapped cmd)
        isearch-barrier (isearch--state-barrier cmd)
-       isearch-case-fold-search (isearch--state-case-fold-search cmd))
+       isearch-case-fold-search (isearch--state-case-fold-search cmd)
+       isearch-match-data (isearch--state-match-data cmd))
   (if (functionp (isearch--state-pop-fun cmd))
       (funcall (isearch--state-pop-fun cmd) cmd))
   (goto-char (isearch--state-point cmd)))
@@ -1624,6 +1633,7 @@ You can update the global isearch variables by setting 
new values to
              (isearch-adjusted isearch-adjusted)
              (isearch-yank-flag isearch-yank-flag)
              (isearch-error isearch-error)
+             (isearch-match-data isearch-match-data)
 
              (multi-isearch-file-list-new multi-isearch-file-list)
              (multi-isearch-buffer-list-new multi-isearch-buffer-list)
@@ -3432,6 +3442,7 @@ Optional third argument, if t, means if fail just return 
nil (no error).
                           (match-beginning 0) (match-end 0)))
              (setq retry nil)))
        (setq isearch-just-started nil)
+       (setq isearch-match-data (match-data t))
        (if isearch-success
            (setq isearch-other-end
                  (if isearch-forward (match-beginning 0) (match-end 0)))))
@@ -3663,27 +3674,27 @@ since they have special meaning in a regexp."
 (defvar isearch-overlay nil)
 (defvar isearch-submatches-overlays nil)
 
-(defface isearch-group-odd
+(defface isearch-group-1
   '((((class color) (min-colors 88) (background light))
-     (:background "#ff00ff" :foreground "lightskyblue1"))
+     (:background "#f000f0" :foreground "lightskyblue1"))
     (((class color) (min-colors 88) (background dark))
-     (:background "palevioletred3" :foreground "brown4"))
+     (:background "palevioletred1" :foreground "brown4"))
     (t (:inherit isearch)))
   "Face for highlighting Isearch the odd group matches."
   :group 'isearch
   :version "28.1")
 
-(defface isearch-group-even
+(defface isearch-group-2
   '((((class color) (min-colors 88) (background light))
-     (:background "#800080" :foreground "lightskyblue1"))
+     (:background "#a000a0" :foreground "lightskyblue1"))
     (((class color) (min-colors 88) (background dark))
-     (:background "#905070" :foreground "brown4"))
+     (:background "palevioletred3" :foreground "brown4"))
     (t (:inherit isearch)))
   "Face for highlighting Isearch the even group matches."
   :group 'isearch
   :version "28.1")
 
-(defun isearch-highlight (beg end)
+(defun isearch-highlight (beg end &optional match-data)
   (if search-highlight
       (if isearch-overlay
          ;; Overlay already exists, just move it.
@@ -3693,18 +3704,24 @@ since they have special meaning in a regexp."
        ;; 1001 is higher than lazy's 1000 and ediff's 100+
        (overlay-put isearch-overlay 'priority 1001)
        (overlay-put isearch-overlay 'face isearch-face)))
+
   (when (and search-highlight-submatches
             isearch-regexp)
     (mapc 'delete-overlay isearch-submatches-overlays)
     (setq isearch-submatches-overlays nil)
-    (dotimes (i (/ (length (match-data)) 2))
-      (unless (zerop i)
-       (let ((ov (make-overlay (match-beginning i) (match-end i))))
-         (overlay-put ov 'face (if (zerop (mod i 2))
-                                   'isearch-group-even
-                                 'isearch-group-odd))
-         (overlay-put ov 'priority 1002)
-         (push ov isearch-submatches-overlays))))))
+    (let ((submatch-data (cddr (butlast match-data)))
+          (group 0)
+          ov face)
+      (while submatch-data
+        (setq group (1+ group))
+        (setq ov (make-overlay (pop submatch-data) (pop submatch-data))
+              face (intern-soft (format "isearch-group-%d" group)))
+        ;; Recycle faces from beginning.
+        (unless (facep face)
+          (setq group 1 face 'isearch-group-1))
+        (overlay-put ov 'face face)
+        (overlay-put ov 'priority 1002)
+        (push ov isearch-submatches-overlays)))))
 
 (defun isearch-dehighlight ()
   (when isearch-overlay
diff --git a/lisp/leim/quail/latin-post.el b/lisp/leim/quail/latin-post.el
index a033739..1d6aedd 100644
--- a/lisp/leim/quail/latin-post.el
+++ b/lisp/leim/quail/latin-post.el
@@ -937,7 +937,7 @@ Doubling the postfix separates the letter and postfix: e.g. 
a\\='\\=' -> a\\='
 
 (quail-define-package
  "danish-postfix" "Latin-1" "DA<" t
- "Danish input method (rule: AE -> Æ, OE -> Ø, AA -> Å, E\\=' -> É)
+ "Danish input method (rule: AE -> Æ, OE -> Ø, AA -> Å, E\\=' -> É, E= -> €)
 
 Doubling the postfix separates the letter and postfix: e.g. aee -> ae
 "
@@ -951,6 +951,7 @@ Doubling the postfix separates the letter and postfix: e.g. 
aee -> ae
  ("AA" ?Å)
  ("aa" ?å)
  ("E'" ?É)
+ ("E=" ?€)
  ("e'" ?é)
 
  ("AEE" ["AE"])
@@ -960,6 +961,7 @@ Doubling the postfix separates the letter and postfix: e.g. 
aee -> ae
  ("AAA" ["AA"])
  ("aaa" ["aa"])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e''" ["e'"])
  )
 
@@ -1034,6 +1036,7 @@ AE  -> Ä
 AEE -> AE
 OE  -> Ö
 OEE -> OE
+E= -> €
 "
  nil t nil nil nil nil nil nil nil nil t)
 
@@ -1042,11 +1045,13 @@ OEE -> OE
  ("ae" ?ä)
  ("OE" ?Ö)
  ("oe" ?ö)
+ ("E=" ?€)
 
  ("AEE" ["AE"])
  ("aee" ["ae"])
  ("OEE" ["OE"])
  ("oee" ["oe"])
+ ("E==" ["E="])
  )
 
 (quail-define-package
@@ -1061,6 +1066,8 @@ Par exemple: a\\=` -> à   e\\=' -> é.
 En doublant la frappe des diacritiques, ils s'isoleront de la lettre.
 Par exemple: e\\='\\=' -> e\\='
 
+€ est produit par E=.
+
 Πest produit par O/."
  nil t nil nil nil nil nil nil nil nil t)
 
@@ -1073,6 +1080,7 @@ Par exemple: e\\='\\=' -> e\\='
  ("E'" ?É)
  ("E^" ?Ê)
  ("E\"" ?Ë)
+ ("E=" ?€)
  ("e`" ?è)
  ("e'" ?é)
  ("e^" ?ê)
@@ -1104,6 +1112,7 @@ Par exemple: e\\='\\=' -> e\\='
  ("E''" ["E'"])
  ("E^^" ["E^"])
  ("E\"\"" ["E\""])
+ ("E==" ["E="])
  ("e``" ["e`"])
  ("e''" ["e'"])
  ("e^^" ["e^"])
@@ -1140,6 +1149,7 @@ ue  -> ü (not after a/e/q)
 uee -> ue
 sz  -> ß
 szz -> sz
+E= -> €
 "
  nil t nil nil nil nil nil nil nil nil t)
 
@@ -1152,6 +1162,7 @@ szz -> sz
  ("ue" ?ü)
  ("sz" ?ß)
  ("SZ" ?ẞ)
+ ("E=" ?€)
 
  ("AEE" ["AE"])
  ("aee" ["ae"])
@@ -1168,6 +1179,7 @@ szz -> sz
  ("Aue" ["Aue"])
  ("que" ["que"])
  ("Que" ["Que"])
+ ("E==" ["E="])
 )
 
 (quail-define-package
@@ -1184,6 +1196,7 @@ AE -> Æ
 OE -> Ö
 D/ -> Ð (eth)
 T/ -> Þ (thorn)
+E= -> €
 
 Doubling the postfix separates the letter and postfix: e.g. a\\='\\=' -> a\\='
 " nil t nil nil nil nil nil nil nil nil t)
@@ -1238,7 +1251,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\='\\=' -> a\\='
 
 a\\=` -> à    A\\=` -> À    e\\=' -> é    << -> «
 e\\=` -> è    E\\=` -> È    E\\=' -> É    >> -> »
-i\\=` -> ì    I\\=` -> Ì               o_ -> º
+i\\=` -> ì    I\\=` -> Ì    E= -> €       o_ -> º
 o\\=` -> ò    O\\=` -> Ò               a_ -> ª
 u\\=` -> ù    U\\=` -> Ù
 
@@ -1252,6 +1265,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\=`\\=` -> a\\=`
  ("a`" ?à)
  ("E`" ?È)
  ("E'" ?É)
+ ("E=" ?€)
  ("e`" ?è)
  ("e'" ?é)
  ("I`" ?Ì)
@@ -1269,6 +1283,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\=`\\=` -> a\\=`
  ("a``" ["a`"])
  ("E``" ["E`"])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e``" ["e`"])
  ("e''" ["e'"])
  ("I``" ["I`"])
@@ -1285,7 +1300,8 @@ Doubling the postfix separates the letter and postfix: 
e.g. a\\=`\\=` -> a\\=`
 
 (quail-define-package
  "norwegian-postfix" "Latin-1" "NO<" t
- "Norwegian (Norsk) input method (rule: AE->Æ   OE->Ø   AA->Å   E\\='->É)
+ "Norwegian (Norsk) input method (rule: AE->Æ   OE->Ø   AA->Å   E\\='->É
+  E= -> €)
 
 Doubling the postfix separates the letter and postfix: e.g. aee -> ae
 "
@@ -1299,6 +1315,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. aee -> ae
  ("AA" ?Å)
  ("aa" ?å)
  ("E'" ?É)
+ ("E=" ?€)
  ("e'" ?é)
 
  ("AEE" ["AE"])
@@ -1308,6 +1325,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. aee -> ae
  ("AAA" ["AA"])
  ("aaa" ["aa"])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e''" ["e'"])
  )
 
@@ -1322,6 +1340,7 @@ aa -> å
 a\" -> ä
 o\" -> ö
 e\\=' -> é
+E= -> €
 
 Doubling the postfix separates the letter and postfix:
 aee -> ae   o\"\" -> o\"   etc.
@@ -1339,6 +1358,7 @@ aee -> ae   o\"\" -> o\"   etc.
  ("O\"" ?Ö)
  ("o\"" ?ö)
  ("E'" ?É)
+ ("E=" ?€)
  ("e'" ?é)
 
  ("AEE" ["AE"])
@@ -1352,6 +1372,7 @@ aee -> ae   o\"\" -> o\"   etc.
  ("O\"\"" ["O\""])
  ("o\"\"" ["o\""])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e''" ["e'"])
  )
 
@@ -1361,6 +1382,7 @@ aee -> ae   o\"\" -> o\"   etc.
 
 A\\=' -> Á
 E\\=' -> É
+E= -> €
 I\\=' -> Í
 O\\=' -> Ó
 U\\=' -> Ú
@@ -1376,6 +1398,7 @@ a\\='\\=' -> a\\='   n~~ -> n~, etc.
  ("A'" ?Á)
  ("a'" ?á)
  ("E'" ?É)
+ ("E=" ?€)
  ("e'" ?é)
  ("I'" ?Í)
  ("i'" ?í)
@@ -1393,6 +1416,7 @@ a\\='\\=' -> a\\='   n~~ -> n~, etc.
  ("A''" ["A'"])
  ("a''" ["a'"])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e''" ["e'"])
  ("I''" ["I'"])
  ("i''" ["i'"])
@@ -1410,7 +1434,8 @@ a\\='\\=' -> a\\='   n~~ -> n~, etc.
 
 (quail-define-package
  "swedish-postfix" "Latin-1" "SV<" t
- "Swedish (Svenska) input method (rule: AA -> Å   AE -> Ä   OE -> Ö   E\\=' -> 
É)
+ "Swedish (Svenska) input method
+(rule: AA -> Å   AE -> Ä   OE -> Ö   E\\=' -> É  E= -> €)
 
 Doubling the postfix separates the letter and postfix: e.g. aee -> ae
 " nil t nil nil nil nil nil nil nil nil t)
@@ -1423,6 +1448,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. aee -> ae
  ("OE" ?Ö)
  ("oe" ?ö)
  ("E'" ?É)
+ ("E=" ?€)
  ("e'" ?é)
 
  ("AAA" ["AA"])
@@ -1432,6 +1458,7 @@ Doubling the postfix separates the letter and postfix: 
e.g. aee -> ae
  ("OEE" ["OE"])
  ("oee" ["oe"])
  ("E''" ["E'"])
+ ("E==" ["E="])
  ("e''" ["e'"])
  )
 
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 9e7eee6..9d4492f 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -2622,7 +2622,7 @@ is copied instead of being cut."
     ;; this for all windows on all visible frames.  In addition we save
     ;; also the cursor type for the window's buffer so we can restore it
     ;; in case we modified it.
-    ;; https://lists.gnu.org/archive/html/emacs-devel/2017-12/msg00090.html
+    ;; https://lists.gnu.org/r/emacs-devel/2017-12/msg00090.html
     (walk-window-tree
      (lambda (window)
        (setq states
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
index 48712a9..77ba526 100644
--- a/lisp/net/dbus.el
+++ b/lisp/net/dbus.el
@@ -912,8 +912,9 @@ discovering the still incomplete interface."
 (defun dbus-unregister-object (object)
   "Unregister OBJECT from D-Bus.
 OBJECT must be the result of a preceding `dbus-register-method',
-`dbus-register-property' or `dbus-register-signal' call.  It
-returns t if OBJECT has been unregistered, nil otherwise.
+`dbus-register-signal', `dbus-register-property' or
+`dbus-register-monitor' call.  The function returns t if OBJECT
+has been unregistered, nil otherwise.
 
 When OBJECT identifies the last method or property, which is
 registered for the respective service, Emacs releases its
@@ -951,7 +952,10 @@ association to the service from D-Bus."
        (when (eq type :signal)
          (dbus-call-method
           bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus
-          "RemoveMatch" (nth 4 elt)))))
+          "RemoveMatch" (nth 4 elt)))
+        ;; Delete monitor connection by reestablishing private bus.
+        (when (eq type :monitor)
+          (dbus-init-bus bus 'private))))
 
     ;; Check, whether there is still a registered function or property
     ;; for the given service.  If not, unregister the service from the
@@ -2037,7 +2041,7 @@ either a method name, a signal name, or an error name."
     (when dbus-debug (message "%s" dbus-registered-objects-table))
 
     ;; Return the object.
-    (list key key1)))
+    (list key (list nil nil handler))))
 
 (defconst dbus-monitor-method-call
   (propertize "method-call" 'face 'font-lock-function-name-face)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 4e336c0..1649f50 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -8426,6 +8426,7 @@ comment at the start of cc-engine.el for more info."
   ;;   o - 'found if it's a type that matches one in `c-found-types';
   ;;   o - 'maybe if it's an identifier that might be a type;
   ;;   o - 'decltype if it's a decltype(variable) declaration; - or
+  ;;   o - 'no-id if "auto" precluded parsing a type identifier.
   ;;   o -  nil if it can't be a type (the point isn't moved then).
   ;;
   ;; The point is assumed to be at the beginning of a token.
@@ -8450,9 +8451,12 @@ comment at the start of cc-engine.el for more info."
     ;; prefix of a type.
     (when c-opt-type-modifier-prefix-key ; e.g. "const" "volatile", but NOT 
"typedef"
       (while (looking-at c-opt-type-modifier-prefix-key)
+       (when (looking-at c-no-type-key)
+         (setq res 'no-id))
        (goto-char (match-end 1))
        (c-forward-syntactic-ws)
-       (setq res 'prefix)))
+       (or (eq res 'no-id)
+           (setq res 'prefix))))
 
     (cond
      ((looking-at c-typeof-key) ; e.g. C++'s "decltype".
@@ -8503,28 +8507,30 @@ comment at the start of cc-engine.el for more info."
        (setq res t))
       (unless res (goto-char start)))  ; invalid syntax
 
-     ((progn
-       (setq pos nil)
-       (if (looking-at c-identifier-start)
-           (save-excursion
-             (setq id-start (point)
-                   name-res (c-forward-name))
-             (when name-res
-               (setq id-end (point)
-                     id-range c-last-identifier-range))))
-       (and (cond ((looking-at c-primitive-type-key)
-                   (setq res t))
-                  ((c-with-syntax-table c-identifier-syntax-table
-                     (looking-at c-known-type-key))
-                   (setq res 'known)))
-            (or (not id-end)
-                (>= (save-excursion
-                      (save-match-data
-                        (goto-char (match-end 1))
-                        (c-forward-syntactic-ws)
-                        (setq pos (point))))
-                    id-end)
-                (setq res nil))))
+     ((and
+       (not (eq res 'no-id))
+       (progn
+        (setq pos nil)
+        (if (looking-at c-identifier-start)
+            (save-excursion
+              (setq id-start (point)
+                    name-res (c-forward-name))
+              (when name-res
+                (setq id-end (point)
+                      id-range c-last-identifier-range))))
+        (and (cond ((looking-at c-primitive-type-key)
+                    (setq res t))
+                   ((c-with-syntax-table c-identifier-syntax-table
+                      (looking-at c-known-type-key))
+                    (setq res 'known)))
+             (or (not id-end)
+                 (>= (save-excursion
+                       (save-match-data
+                         (goto-char (match-end 1))
+                         (c-forward-syntactic-ws)
+                         (setq pos (point))))
+                     id-end)
+                 (setq res nil)))))
       ;; Looking at a primitive or known type identifier.  We've
       ;; checked for a name first so that we don't go here if the
       ;; known type match only is a prefix of another name.
@@ -8599,7 +8605,7 @@ comment at the start of cc-engine.el for more info."
             (goto-char start)
             (setq res nil)))))
 
-    (when res
+    (when (not (memq res '(nil no-id)))
       ;; Skip trailing type modifiers.  If any are found we know it's
       ;; a type.
       (when c-opt-type-modifier-key
@@ -9452,12 +9458,11 @@ This function might do hidden buffer changes."
 
          (when (setq found-type (c-forward-type t)) ; brace-block-too
            ;; Found a known or possible type or a prefix of a known type.
-           (when (and (c-major-mode-is 'c++-mode) ; C++11 style "auto"?
-                      (eq prev-kwd-sym (c-keyword-sym "auto"))
-                      (looking-at "[=(]")) ; FIXME!!! proper regexp.
-             (setq new-style-auto t)
-             (setq found-type nil)
-             (goto-char start))        ; position of foo in "auto foo"
+           (when (and (eq found-type 'no-id)
+                      (save-excursion
+                        (and (c-forward-name) ; over the identifier
+                      (looking-at "[=(]")))) ; FIXME!!! proper regexp.
+             (setq new-style-auto t))  ; position of foo in "auto foo"
 
            (when at-type
              ;; Got two identifiers with nothing but whitespace
@@ -9540,7 +9545,7 @@ This function might do hidden buffer changes."
            ;; over all specifiers and type identifiers.  The reason
            ;; to do this for a known type prefix is to make things
            ;; like "unsigned INT16" work.
-           (and found-type (not (eq found-type t))))))
+           (and found-type (not (memq found-type '(t no-id)))))))
 
     (cond
      ((eq at-type t)
@@ -9560,6 +9565,10 @@ This function might do hidden buffer changes."
       ;; followed by another type.
       (setq at-type t))
 
+     ((eq at-type 'no-id)
+      ;; For an auto type, we assume we definitely have a type construct.
+      (setq at-type t))
+
      ((not at-type)
       ;; Got no type but set things up to continue anyway to handle
       ;; the various cases when a declaration doesn't start with a
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index eee8e30..7e36e1f 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -2122,7 +2122,9 @@ fontified with the keyword face and not the type face."
   t    nil
   c    '("const" "restrict" "volatile")
   c++  '("const" "noexcept" "volatile")
-  objc '("const" "volatile"))
+  objc '("const" "volatile")
+  t    (append (c-lang-const c-no-type-kwds)
+              (c-lang-const c-type-modifier-prefix-kwds)))
 
 (c-lang-defconst c-opt-type-modifier-prefix-key
   ;; Adorned regexp matching `c-type-modifier-prefix-kwds', or nil in
@@ -2349,6 +2351,16 @@ will be handled."
   t (c-make-keywords-re t (c-lang-const c-using-kwds)))
 (c-lang-defvar c-using-key (c-lang-const c-using-key))
 
+(c-lang-defconst c-no-type-kwds
+  "Keywords which remove the need to specify a type in declarations"
+  t nil
+  c++ '("auto"))
+
+(c-lang-defconst c-no-type-key
+  ;; Regexp matching an entry from `c-no-type-kwds'
+  t (c-make-keywords-re t (c-lang-const c-no-type-kwds)))
+(c-lang-defvar c-no-type-key (c-lang-const c-no-type-key))
+
 (c-lang-defconst c-typeless-decl-kwds
   "Keywords introducing declarations where the (first) identifier
 \(declarator) follows directly after the keyword, without any type.
@@ -2362,7 +2374,6 @@ will be handled."
   ;; {...}").
   t    (append (c-lang-const c-class-decl-kwds)
               (c-lang-const c-brace-list-decl-kwds))
-  c++  (append (c-lang-const c-typeless-decl-kwds) '("auto")) ; C++11.
   ;; Note: "manages" for CORBA CIDL clashes with its presence on
   ;; `c-type-list-kwds' for IDL.
   idl  (append (c-lang-const c-typeless-decl-kwds)
@@ -2397,7 +2408,8 @@ If any of these also are on `c-type-list-kwds', 
`c-ref-list-kwds',
 `c-<>-type-kwds', or `c-<>-arglist-kwds' then the associated clauses
 will be handled."
   t    nil
-  (c c++) '("auto" "extern" "inline" "register" "static")
+  (c c++) '("extern" "inline" "register" "static")
+  c    (append '("auto") (c-lang-const c-modifier-kwds))
   c++  (append '("constexpr" "explicit" "friend" "mutable" "template"
                 "thread_local" "virtual")
               ;; "using" is now handled specially (2020-09-14).
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index 279eb4d..f028a42 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -703,10 +703,10 @@ The value depends on `grep-command', `grep-template',
       (let ((grep-options
             (concat (if grep-use-null-device "-n" "-nH")
                      (if grep-use-null-filename-separator " --null")
-                    (if (grep-probe grep-program
-                                    `(nil nil nil "-e" "foo" ,null-device)
-                                    nil 1)
-                        " -e"))))
+                     (when (grep-probe grep-program
+                                       `(nil nil nil "-e" "foo" ,null-device)
+                                       nil 1)
+                       " -e"))))
        (unless grep-command
          (setq grep-command
                (format "%s %s %s " grep-program
@@ -1121,6 +1121,11 @@ command before it's run."
                                     grep-find-ignored-files
                                     " --exclude=")))))
        (when command
+          (when (grep-probe grep-program
+                            `(nil nil nil "--directories=skip" "foo"
+                                  ,null-device)
+                            nil 1)
+            (setq command (concat command " --directories=skip")))
          (if confirm
              (setq command
                    (read-from-minibuffer "Confirm: "
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 8c550b5..40a804b 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -66,6 +66,9 @@
 ;; `project-combine-directories' and `project-subtract-directories',
 ;; mainly for use in the abovementioned generics' implementations.
 ;;
+;; `project-known-project-roots' and `project-remember-project' to
+;; interact with the "known projects" list.
+;;
 ;; Commands:
 ;;
 ;; `project-prefix-map' contains the full list of commands defined in
diff --git a/lisp/replace.el b/lisp/replace.el
index 2d17ec9..e363924 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -1576,7 +1576,8 @@ is not modified."
   (concat
    "Next buffer to search "
    (cond
-    ((eq read-buffer-function #'ido-read-buffer)
+    ((or (eq read-buffer-function #'ido-read-buffer)
+         (bound-and-true-p ido-everywhere))
      (substitute-command-keys
       "(\\<ido-completion-map>\\[ido-select-text] to end): "))
     ((bound-and-true-p fido-mode)
diff --git a/lisp/subr.el b/lisp/subr.el
index b1e382b..bd8dd07 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -837,10 +837,11 @@ Elements of ALIST that are not conses are ignored."
 If KEY is not found in ALIST, return DEFAULT.
 Equality with KEY is tested by TESTFN, defaulting to `eq'.
 
-You can use `alist-get' in PLACE expressions.  This will modify
-an existing association (more precisely, the first one if
-multiple exist), or add a new element to the beginning of ALIST,
-destructively modifying the list stored in ALIST.
+You can use `alist-get' in \"place expressions\"; i.e., as a
+generalized variable.  Doing this will modify an existing
+association (more precisely, the first one if multiple exist), or
+add a new element to the beginning of ALIST, destructively
+modifying the list stored in ALIST.
 
 Example:
 
@@ -1627,8 +1628,8 @@ be a list of the form returned by `event-start' and 
`event-end'."
 (make-obsolete-variable 'x-gtk-use-window-move nil "26.1")
 
 (defvaralias 'messages-buffer-max-lines 'message-log-max)
-(define-obsolete-variable-alias 'inhibit-null-byte-detection
-  'inhibit-nul-byte-detection "27.1")
+(define-obsolete-variable-alias 'inhibit-nul-byte-detection
+  'inhibit-null-byte-detection "28.1")
 (make-obsolete-variable 'load-dangerous-libraries
                         "no longer used." "27.1")
 
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 9c6b9cb..2604955 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -363,22 +363,18 @@ to `tab-bar-tab-name-truncated'."
   :group 'tab-bar
   :version "27.1")
 
-(defvar tab-bar-tab-name-ellipsis nil)
+(defvar tab-bar-tab-name-ellipsis t)
 
 (defun tab-bar-tab-name-truncated ()
   "Generate tab name from the buffer of the selected window.
 Truncate it to the length specified by `tab-bar-tab-name-truncated-max'.
 Append ellipsis `tab-bar-tab-name-ellipsis' in this case."
-  (let ((tab-name (buffer-name (window-buffer (minibuffer-selected-window))))
-        (ellipsis (cond
-                   (tab-bar-tab-name-ellipsis)
-                   ((char-displayable-p ?…) "…")
-                   ("..."))))
+  (let ((tab-name (buffer-name (window-buffer (minibuffer-selected-window)))))
     (if (< (length tab-name) tab-bar-tab-name-truncated-max)
         tab-name
       (propertize (truncate-string-to-width
                    tab-name tab-bar-tab-name-truncated-max nil nil
-                   ellipsis)
+                   tab-bar-tab-name-ellipsis)
                   'help-echo tab-name))))
 
 
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 8da554a..46bf89f 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -240,8 +240,7 @@ to `tab-line-tab-name-truncated-buffer'."
   :group 'tab-line
   :version "27.1")
 
-(defvar tab-line-tab-name-ellipsis
-  (if (char-displayable-p ?…) "…" "..."))
+(defvar tab-line-tab-name-ellipsis t)
 
 (defun tab-line-tab-name-truncated-buffer (buffer &optional _buffers)
   "Generate tab name from BUFFER.
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index 8068288..7196692 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -4943,6 +4943,12 @@ If optional argument STATE is positive, turn borders on."
       (cons (+ window-x window-start-x)
            (+ window-y window-start-y))))
 
+(defun artist--adjust-x (x)
+  "Adjust the X position wrt. `display-line-numbers-mode'."
+  (let ((adjust (line-number-display-width)))
+    (if (= adjust 0)
+        x
+      (- x adjust 2))))
 
 (defun artist-mouse-draw-continously (ev)
   "Generic function for shapes that require 1 point as input.
@@ -4964,7 +4970,7 @@ The event, EV, is the mouse event."
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
         (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
-        (x1           (car ev-start-pos))
+        (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr ev-start-pos))
         (shape)
         (timer))
@@ -4981,7 +4987,7 @@ The event, EV, is the mouse event."
                      (member 'down (event-modifiers ev)))
             (setq ev-start-pos (artist-coord-win-to-buf
                                 (posn-col-row (event-start ev))))
-            (setq x1 (car ev-start-pos))
+            (setq x1 (artist--adjust-x (car ev-start-pos)))
             (setq y1 (cdr ev-start-pos))
 
             ;; Cancel previous timer
@@ -5061,7 +5067,7 @@ The event, EV, is the mouse event."
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
         (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
-        (x1-last      (car ev-start-pos))
+        (x1-last      (artist--adjust-x (car ev-start-pos)))
         (y1-last      (cdr ev-start-pos))
         (x2           x1-last)
         (y2           y1-last)
@@ -5153,7 +5159,7 @@ The event, EV, is the mouse event."
              ;;
              (setq ev-start-pos (artist-coord-win-to-buf
                                  (posn-col-row (event-start ev))))
-             (setq x2 (car ev-start-pos))
+             (setq x2 (artist--adjust-x (car ev-start-pos)))
              (setq y2 (cdr ev-start-pos))
 
              ;; Draw the new shape (if not rubber-banding, place both marks)
@@ -5180,7 +5186,7 @@ The event, EV, is the mouse event."
          ;; set x2 and y2
          (setq ev-start-pos (artist-coord-win-to-buf
                              (posn-col-row (event-start ev))))
-         (setq x2 (car ev-start-pos))
+         (setq x2 (artist--adjust-x (car ev-start-pos)))
          (setq y2 (cdr ev-start-pos))
 
          ;; First undraw last shape
@@ -5265,7 +5271,7 @@ Operation is done once.  The event, EV, is the mouse 
event."
         (arrow-set-fn (artist-go-get-arrow-set-fn-from-symbol op))
         (ev-start     (event-start ev))
         (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
-        (x1           (car ev-start-pos))
+        (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr  ev-start-pos)))
     (select-window (posn-window ev-start))
     (artist-funcall init-fn x1 y1)
@@ -5299,7 +5305,7 @@ The event, EV, is the mouse event."
         (ev-start     (event-start ev))
         (initial-win  (posn-window ev-start))
         (ev-start-pos (artist-coord-win-to-buf (posn-col-row ev-start)))
-        (x1           (car ev-start-pos))
+        (x1           (artist--adjust-x (car ev-start-pos)))
         (y1           (cdr ev-start-pos))
         (x2)
         (y2)
@@ -5313,7 +5319,7 @@ The event, EV, is the mouse event."
                 (member 'down (event-modifiers ev)))
        (setq ev-start-pos (artist-coord-win-to-buf
                            (posn-col-row (event-start ev))))
-       (setq x2 (car ev-start-pos))
+       (setq x2 (artist--adjust-x (car ev-start-pos)))
        (setq y2 (cdr ev-start-pos))
 
        (if (not (eq initial-win (posn-window (event-start ev))))
diff --git a/lisp/tmm.el b/lisp/tmm.el
index e9f3f5b..0e83f42 100644
--- a/lisp/tmm.el
+++ b/lisp/tmm.el
@@ -50,14 +50,19 @@ The ordering of the return value respects 
`menu-bar-final-items'."
         (menu-end '()))
     (map-keymap
      (lambda (key binding)
-       (push (cons key binding)
-             ;; If KEY is the name of an item that we want to put last,
-             ;; move it to the end.
-             (if (memq key menu-bar-final-items)
-                 menu-end
-               menu-bar)))
+       (let ((pos (seq-position menu-bar-final-items key))
+             (menu-item (cons key binding)))
+         (if pos
+             ;; If KEY is the name of an item that we want to put
+             ;; last, store it separately with explicit ordering for
+             ;; sorting.
+             (push (cons pos menu-item) menu-end)
+           (push menu-item menu-bar))))
      (tmm-get-keybind [menu-bar]))
-    `(keymap ,@(nreverse menu-bar) ,@(nreverse menu-end))))
+    `(keymap ,@(nreverse menu-bar)
+             ,@(mapcar #'cdr (sort menu-end
+                                   (lambda (a b)
+                                     (< (car a) (car b))))))))
 
 ;;;###autoload (define-key global-map "\M-`" 'tmm-menubar)
 ;;;###autoload (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
@@ -96,7 +101,10 @@ to invoke `tmm-menubar' instead, customize the variable
                                          (or (null visible)
                                              (eval visible)))))))
                   (setq column (+ column (length name) 1)))))
-             menu-bar))))
+             menu-bar)
+            ;; Check the last menu item.
+            (when (> column x-position)
+              (setq menu-bar-item prev-key)))))
     (tmm-prompt menu-bar nil menu-bar-item)))
 
 ;;;###autoload
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index 6ff6951..b1880c0 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -1795,9 +1795,9 @@ The difference to vc-do-command is that this function 
always invokes
 (defun vc-git--call (buffer command &rest args)
   ;; We don't need to care the arguments.  If there is a file name, it
   ;; is always a relative one.  This works also for remote
-  ;; directories.  We enable `inhibit-nul-byte-detection', otherwise
+  ;; directories.  We enable `inhibit-null-byte-detection', otherwise
   ;; Tramp's eol conversion might be confused.
-  (let ((inhibit-nul-byte-detection t)
+  (let ((inhibit-null-byte-detection t)
        (coding-system-for-read
          (or coding-system-for-read vc-git-log-output-coding-system))
        (coding-system-for-write
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 3852a64..46c44fa 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -1038,7 +1038,9 @@ If the current buffer is in `vc-dir' or Dired mode, 
FILESET is the
 list of marked files, or the current directory if no files are
 marked.
 Otherwise, if the current buffer is visiting a version-controlled
-file, FILESET is a single-file list containing that file's name.
+file or is an indirect buffer whose base buffer visits a
+version-controlled file, FILESET is a single-file list containing
+that file's name.
 Otherwise, if ALLOW-UNREGISTERED is non-nil and the visited file
 is unregistered, FILESET is a single-file list containing the
 name of the visited file.
@@ -1052,6 +1054,14 @@ possible values of STATE are explained in `vc-state', 
and MODEL in
 the returned list.
 
 BEWARE: this function may change the current buffer."
+  (with-current-buffer (or (buffer-base-buffer) (current-buffer))
+    (vc-deduce-fileset-1 not-state-changing
+                         allow-unregistered
+                         state-model-only-files)))
+
+(defun vc-deduce-fileset-1 (not-state-changing
+                            allow-unregistered
+                            state-model-only-files)
   (let (backend)
     (cond
      ((derived-mode-p 'vc-dir-mode)
@@ -1073,7 +1083,7 @@ BEWARE: this function may change the current buffer."
                                      (derived-mode-p 'dired-mode)))))
       (progn                  ;FIXME: Why not `with-current-buffer'? --Stef.
        (set-buffer vc-parent-buffer)
-       (vc-deduce-fileset not-state-changing allow-unregistered 
state-model-only-files)))
+       (vc-deduce-fileset-1 not-state-changing allow-unregistered 
state-model-only-files)))
      ((and (not buffer-file-name)
           (setq backend (vc-responsible-backend default-directory)))
       (list backend nil))
@@ -1883,6 +1893,10 @@ state of each file in the fileset."
        t (list backend (list rootdir)) rev1 rev2
        (called-interactively-p 'interactive)))))
 
+(defun vc-maybe-buffer-sync (not-urgent)
+  (with-current-buffer (or (buffer-base-buffer) (current-buffer))
+    (when buffer-file-name (vc-buffer-sync not-urgent))))
+
 ;;;###autoload
 (defun vc-diff (&optional historic not-urgent)
   "Display diffs between file revisions.
@@ -1895,6 +1909,7 @@ saving the buffer."
   (interactive (list current-prefix-arg t))
   (if historic
       (call-interactively 'vc-version-diff)
+    (vc-maybe-buffer-sync not-urgent)
     (let ((fileset (vc-deduce-fileset t)))
       (vc-buffer-sync-fileset fileset not-urgent)
       (vc-diff-internal t fileset nil nil
@@ -1981,7 +1996,7 @@ saving the buffer."
   (interactive (list current-prefix-arg t))
   (if historic
       (call-interactively 'vc-version-ediff)
-    (when buffer-file-name (vc-buffer-sync not-urgent))
+    (vc-maybe-buffer-sync not-urgent)
     (vc-version-ediff (cadr (vc-deduce-fileset t)) nil nil)))
 
 ;;;###autoload
@@ -1998,7 +2013,7 @@ saving the buffer."
   (if historic
       ;; We want the diff for the VC root dir.
       (call-interactively 'vc-root-version-diff)
-    (when buffer-file-name (vc-buffer-sync not-urgent))
+    (vc-maybe-buffer-sync not-urgent)
     (let ((backend (vc-deduce-backend))
          (default-directory default-directory)
          rootdir working-revision)
@@ -2038,17 +2053,18 @@ Return nil if the root directory cannot be identified."
 If the current file is named `F', the revision is named `F.~REV~'.
 If `F.~REV~' already exists, use it instead of checking it out again."
   (interactive
-   (save-current-buffer
+   (with-current-buffer (or (buffer-base-buffer) (current-buffer))
      (vc-ensure-vc-buffer)
      (list
       (vc-read-revision "Revision to visit (default is working revision): "
                         (list buffer-file-name)))))
-  (vc-ensure-vc-buffer)
-  (let* ((file buffer-file-name)
-        (revision (if (string-equal rev "")
-                     (vc-working-revision file)
-                   rev)))
-    (switch-to-buffer-other-window (vc-find-revision file revision))))
+  (with-current-buffer (or (buffer-base-buffer) (current-buffer))
+    (vc-ensure-vc-buffer)
+    (let* ((file buffer-file-name)
+          (revision (if (string-equal rev "")
+                        (vc-working-revision file)
+                      rev)))
+      (switch-to-buffer-other-window (vc-find-revision file revision)))))
 
 (defun vc-find-revision (file revision &optional backend)
   "Read REVISION of FILE into a buffer and return the buffer.
diff --git a/src/ChangeLog.11 b/src/ChangeLog.11
index 1086d11..cf9e87a 100644
--- a/src/ChangeLog.11
+++ b/src/ChangeLog.11
@@ -10126,7 +10126,7 @@
 
 2010-01-06  Jan Djärv  <jan.h.d@swipnet.se>
 
-       * font.c (font_open_entity): Enable chache and call cached_font_ok
+       * font.c (font_open_entity): Enable cache and call cached_font_ok
        for the driver if defined.
        (QCuser_spec): New symbol.
        (font_spec_from_name): Save name as user-spec.
diff --git a/src/alloc.c b/src/alloc.c
index bde0a16..fbfa814 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1658,7 +1658,7 @@ sdata_size (ptrdiff_t n)
 #define GC_STRING_EXTRA GC_STRING_OVERRUN_COOKIE_SIZE
 
 /* Exact bound on the number of bytes in a string, not counting the
-   terminating NUL.  A string cannot contain more bytes than
+   terminating null.  A string cannot contain more bytes than
    STRING_BYTES_BOUND, nor can it be so long that the size_t
    arithmetic in allocate_string_data would overflow while it is
    calculating a value to be passed to malloc.  */
diff --git a/src/bidi.c b/src/bidi.c
index 1017bd2..225b27b 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -2338,7 +2338,7 @@ bidi_resolve_weak (struct bidi_it *bidi_it)
                      and make it L right away, to avoid the
                      potentially costly loop below.  This is
                      important when the buffer has a long series of
-                     control characters, like binary NULs, and no
+                     control characters, like binary nulls, and no
                      R2L characters at all.  */
                   && new_level == 0
                   && !bidi_explicit_dir_char (bidi_it->ch)
@@ -2996,7 +2996,7 @@ bidi_resolve_neutral (struct bidi_it *bidi_it)
        }
       /* The next two "else if" clauses are shortcuts for the
         important special case when we have a long sequence of
-        neutral or WEAK_BN characters, such as whitespace or NULs or
+        neutral or WEAK_BN characters, such as whitespace or nulls or
         other control characters, on the base embedding level of the
         paragraph, and that sequence goes all the way to the end of
         the paragraph and follows a character whose resolved
diff --git a/src/bignum.c b/src/bignum.c
index 669df4d..dce5908 100644
--- a/src/bignum.c
+++ b/src/bignum.c
@@ -353,7 +353,7 @@ emacs_mpz_pow_ui (mpz_t rop, mpz_t const base, unsigned 
long exp)
 
 /* Yield an upper bound on the buffer size needed to contain a C
    string representing the NUM in base BASE.  This includes any
-   preceding '-' and the terminating NUL.  */
+   preceding '-' and the terminating null.  */
 static ptrdiff_t
 mpz_bufsize (mpz_t const num, int base)
 {
@@ -418,7 +418,7 @@ bignum_to_string (Lisp_Object num, int base)
 
 /* Create a bignum by scanning NUM, with digits in BASE.
    NUM must consist of an optional '-', a nonempty sequence
-   of base-BASE digits, and a terminating NUL byte, and
+   of base-BASE digits, and a terminating null byte, and
    the represented number must not be in fixnum range.  */
 
 Lisp_Object
diff --git a/src/callint.c b/src/callint.c
index f609c96..f80436f 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -712,7 +712,7 @@ invoke it (via an `interactive' spec that contains, for 
instance, an
        default:
          {
            /* How many bytes are left unprocessed in the specs string?
-              (Note that this excludes the trailing NUL byte.)  */
+              (Note that this excludes the trailing null byte.)  */
            ptrdiff_t bytes_left = string_len - (tem - string);
            unsigned letter;
 
diff --git a/src/coding.c b/src/coding.c
index 221a9ca..2142e7f 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -5707,7 +5707,7 @@ setup_coding_system (Lisp_Object coding_system, struct 
coding_system *coding)
       coding->common_flags |= CODING_REQUIRE_DETECTION_MASK;
       coding->spec.undecided.inhibit_nbd
        = (encode_inhibit_flag
-          (AREF (attrs, coding_attr_undecided_inhibit_nul_byte_detection)));
+          (AREF (attrs, coding_attr_undecided_inhibit_null_byte_detection)));
       coding->spec.undecided.inhibit_ied
        = (encode_inhibit_flag
           (AREF (attrs, coding_attr_undecided_inhibit_iso_escape_detection)));
@@ -6535,9 +6535,9 @@ detect_coding (struct coding_system *coding)
     {
       int c, i;
       struct coding_detection_info detect_info;
-      bool nul_byte_found = 0, eight_bit_found = 0;
+      bool null_byte_found = 0, eight_bit_found = 0;
       bool inhibit_nbd = inhibit_flag (coding->spec.undecided.inhibit_nbd,
-                                      inhibit_nul_byte_detection);
+                                      inhibit_null_byte_detection);
       bool inhibit_ied = inhibit_flag (coding->spec.undecided.inhibit_ied,
                                       inhibit_iso_escape_detection);
       bool prefer_utf_8 = coding->spec.undecided.prefer_utf_8;
@@ -6550,7 +6550,7 @@ detect_coding (struct coding_system *coding)
          if (c & 0x80)
            {
              eight_bit_found = 1;
-             if (nul_byte_found)
+             if (null_byte_found)
                break;
            }
          else if (c < 0x20)
@@ -6565,7 +6565,7 @@ detect_coding (struct coding_system *coding)
                      if (! (detect_info.rejected & CATEGORY_MASK_ISO_7_ELSE))
                        {
                          /* We didn't find an 8-bit code.  We may
-                            have found a NUL-byte, but it's very
+                            have found a null-byte, but it's very
                             rare that a binary file conforms to
                             ISO-2022.  */
                          src = src_end;
@@ -6577,7 +6577,7 @@ detect_coding (struct coding_system *coding)
                }
              else if (! c && !inhibit_nbd)
                {
-                 nul_byte_found = 1;
+                 null_byte_found = 1;
                  if (eight_bit_found)
                    break;
                }
@@ -6609,7 +6609,7 @@ detect_coding (struct coding_system *coding)
            coding->head_ascii++;
        }
 
-      if (nul_byte_found || eight_bit_found
+      if (null_byte_found || eight_bit_found
          || coding->head_ascii < coding->src_bytes
          || detect_info.found)
        {
@@ -6627,7 +6627,7 @@ detect_coding (struct coding_system *coding)
              }
          else
            {
-             if (nul_byte_found)
+             if (null_byte_found)
                {
                  detect_info.checked |= ~CATEGORY_MASK_UTF_16;
                  detect_info.rejected |= ~CATEGORY_MASK_UTF_16;
@@ -6700,7 +6700,7 @@ detect_coding (struct coding_system *coding)
              else
                found = CODING_ID_NAME (this->id);
            }
-         else if (nul_byte_found)
+         else if (null_byte_found)
            found = Qno_conversion;
          else if ((detect_info.rejected & CATEGORY_MASK_ANY)
                   == CATEGORY_MASK_ANY)
@@ -8476,7 +8476,7 @@ from_unicode (Lisp_Object str)
 Lisp_Object
 from_unicode_buffer (const wchar_t *wstr)
 {
-  /* We get one of the two final NUL bytes for free.  */
+  /* We get one of the two final null bytes for free.  */
   ptrdiff_t len = 1 + sizeof (wchar_t) * wcslen (wstr);
   AUTO_STRING_WITH_LEN (str, (char *) wstr, len);
   return from_unicode (str);
@@ -8489,7 +8489,7 @@ to_unicode (Lisp_Object str, Lisp_Object *buf)
   /* We need to make another copy (in addition to the one made by
      code_convert_string_norecord) to ensure that the final string is
      _doubly_ zero terminated --- that is, that the string is
-     terminated by two zero bytes and one utf-16le NUL character.
+     terminated by two zero bytes and one utf-16le null character.
      Because strings are already terminated with a single zero byte,
      we just add one additional zero. */
   str = make_uninit_string (SBYTES (*buf) + 1);
@@ -8605,7 +8605,7 @@ detect_coding_system (const unsigned char *src,
   ptrdiff_t id;
   struct coding_detection_info detect_info;
   enum coding_category base_category;
-  bool nul_byte_found = 0, eight_bit_found = 0;
+  bool null_byte_found = 0, eight_bit_found = 0;
 
   if (NILP (coding_system))
     coding_system = Qundecided;
@@ -8632,7 +8632,7 @@ detect_coding_system (const unsigned char *src,
       struct coding_system *this UNINIT;
       int c, i;
       bool inhibit_nbd = inhibit_flag (coding.spec.undecided.inhibit_nbd,
-                                      inhibit_nul_byte_detection);
+                                      inhibit_null_byte_detection);
       bool inhibit_ied = inhibit_flag (coding.spec.undecided.inhibit_ied,
                                       inhibit_iso_escape_detection);
       bool prefer_utf_8 = coding.spec.undecided.prefer_utf_8;
@@ -8644,7 +8644,7 @@ detect_coding_system (const unsigned char *src,
          if (c & 0x80)
            {
              eight_bit_found = 1;
-             if (nul_byte_found)
+             if (null_byte_found)
                break;
            }
          else if (c < 0x20)
@@ -8659,7 +8659,7 @@ detect_coding_system (const unsigned char *src,
                      if (! (detect_info.rejected & CATEGORY_MASK_ISO_7_ELSE))
                        {
                          /* We didn't find an 8-bit code.  We may
-                            have found a NUL-byte, but it's very
+                            have found a null-byte, but it's very
                             rare that a binary file confirm to
                             ISO-2022.  */
                          src = src_end;
@@ -8671,7 +8671,7 @@ detect_coding_system (const unsigned char *src,
                }
              else if (! c && !inhibit_nbd)
                {
-                 nul_byte_found = 1;
+                 null_byte_found = 1;
                  if (eight_bit_found)
                    break;
                }
@@ -8682,7 +8682,7 @@ detect_coding_system (const unsigned char *src,
            coding.head_ascii++;
        }
 
-      if (nul_byte_found || eight_bit_found
+      if (null_byte_found || eight_bit_found
          || coding.head_ascii < coding.src_bytes
          || detect_info.found)
        {
@@ -8697,7 +8697,7 @@ detect_coding_system (const unsigned char *src,
              }
          else
            {
-             if (nul_byte_found)
+             if (null_byte_found)
                {
                  detect_info.checked |= ~CATEGORY_MASK_UTF_16;
                  detect_info.rejected |= ~CATEGORY_MASK_UTF_16;
@@ -8744,7 +8744,7 @@ detect_coding_system (const unsigned char *src,
        }
 
       if ((detect_info.rejected & CATEGORY_MASK_ANY) == CATEGORY_MASK_ANY
-         || nul_byte_found)
+         || null_byte_found)
        {
          detect_info.found = CATEGORY_MASK_RAW_TEXT;
          id = CODING_SYSTEM_ID (Qno_conversion);
@@ -8846,7 +8846,7 @@ detect_coding_system (const unsigned char *src,
       {
        if (detect_info.found & ~CATEGORY_MASK_UTF_16)
          {
-           if (nul_byte_found)
+           if (null_byte_found)
              normal_eol = EOL_SEEN_LF;
            else
              normal_eol = detect_eol (coding.source, src_bytes,
@@ -11320,8 +11320,8 @@ usage: (define-coding-system-internal ...)  */)
     {
       if (nargs < coding_arg_undecided_max)
        goto short_args;
-      ASET (attrs, coding_attr_undecided_inhibit_nul_byte_detection,
-           args[coding_arg_undecided_inhibit_nul_byte_detection]);
+      ASET (attrs, coding_attr_undecided_inhibit_null_byte_detection,
+           args[coding_arg_undecided_inhibit_null_byte_detection]);
       ASET (attrs, coding_attr_undecided_inhibit_iso_escape_detection,
            args[coding_arg_undecided_inhibit_iso_escape_detection]);
       ASET (attrs, coding_attr_undecided_prefer_utf_8,
@@ -12086,18 +12086,18 @@ to explicitly specify some coding system that doesn't 
use ISO-2022
 escape sequence (e.g., `latin-1') on reading by 
\\[universal-coding-system-argument].  */);
   inhibit_iso_escape_detection = 0;
 
-  DEFVAR_BOOL ("inhibit-nul-byte-detection",
-              inhibit_nul_byte_detection,
-              doc: /* If non-nil, Emacs ignores NUL bytes on code detection.
+  DEFVAR_BOOL ("inhibit-null-byte-detection",
+              inhibit_null_byte_detection,
+              doc: /* If non-nil, Emacs ignores null bytes on code detection.
 By default, Emacs treats it as binary data, and does not attempt to
 decode it.  The effect is as if you specified `no-conversion' for
 reading that text.
 
-Set this to non-nil when a regular text happens to include NUL bytes.
-Examples are Index nodes of Info files and NUL-byte delimited output
-from GNU Find and GNU Grep.  Emacs will then ignore the NUL bytes and
+Set this to non-nil when a regular text happens to include null bytes.
+Examples are Index nodes of Info files and null-byte delimited output
+from GNU Find and GNU Grep.  Emacs will then ignore the null bytes and
 decode text as usual.  */);
-  inhibit_nul_byte_detection = 0;
+  inhibit_null_byte_detection = 0;
 
   DEFVAR_BOOL ("disable-ascii-optimization", disable_ascii_optimization,
               doc: /* If non-nil, Emacs does not optimize code decoder for 
ASCII files.
@@ -12156,7 +12156,7 @@ internal character representation.  */);
                                   "automatic conversion on decoding.");
   plist[15] = args[coding_arg_eol_type] = Qnil;
   args[coding_arg_plist] = CALLMANY (Flist, plist);
-  args[coding_arg_undecided_inhibit_nul_byte_detection] = make_fixnum (0);
+  args[coding_arg_undecided_inhibit_null_byte_detection] = make_fixnum (0);
   args[coding_arg_undecided_inhibit_iso_escape_detection] = make_fixnum (0);
   Fdefine_coding_system_internal (coding_arg_undecided_max, args);
 
diff --git a/src/coding.h b/src/coding.h
index c2a7b2a..4973cf8 100644
--- a/src/coding.h
+++ b/src/coding.h
@@ -82,7 +82,7 @@ enum define_coding_ccl_arg_index
 
 enum define_coding_undecided_arg_index
   {
-    coding_arg_undecided_inhibit_nul_byte_detection = coding_arg_max,
+    coding_arg_undecided_inhibit_null_byte_detection = coding_arg_max,
     coding_arg_undecided_inhibit_iso_escape_detection,
     coding_arg_undecided_prefer_utf_8,
     coding_arg_undecided_max
@@ -139,7 +139,7 @@ enum coding_attr_index
 
     coding_attr_emacs_mule_full,
 
-    coding_attr_undecided_inhibit_nul_byte_detection,
+    coding_attr_undecided_inhibit_null_byte_detection,
     coding_attr_undecided_inhibit_iso_escape_detection,
     coding_attr_undecided_prefer_utf_8,
 
@@ -353,7 +353,7 @@ struct emacs_mule_spec
 
 struct undecided_spec
 {
-  /* Inhibit NUL byte detection.  1 means always inhibit,
+  /* Inhibit null byte detection.  1 means always inhibit,
      -1 means do not inhibit, 0 means rely on user variable.  */
   int inhibit_nbd;
 
diff --git a/src/dbusbind.c b/src/dbusbind.c
index cca5f13..7904606 100644
--- a/src/dbusbind.c
+++ b/src/dbusbind.c
@@ -446,12 +446,18 @@ xd_signature (char *signature, int dtype, int 
parent_type, Lisp_Object object)
        {
          Lisp_Object elt1 = XD_NEXT_VALUE (elt);
          if (CONSP (elt1) && STRINGP (XCAR (elt1)) && NILP (XCDR (elt1)))
-           subsig = SSDATA (XCAR (elt1));
+           {
+             subsig = SSDATA (XCAR (elt1));
+             elt = Qnil;
+           }
        }
 
       while (!NILP (elt))
        {
-         if (subtype != XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (elt)))
+         char x[DBUS_MAXIMUM_SIGNATURE_LENGTH];
+         subtype = XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (elt));
+         xd_signature (x, subtype, dtype, CAR_SAFE (XD_NEXT_VALUE (elt)));
+         if (strcmp (subsig, x) != 0)
            wrong_type_argument (intern ("D-Bus"), CAR_SAFE (elt));
          elt = CDR_SAFE (XD_NEXT_VALUE (elt));
        }
@@ -1937,11 +1943,12 @@ syms_of_dbusbind (void)
     doc: /* Hash table of registered functions for D-Bus.
 
 There are two different uses of the hash table: for accessing
-registered interfaces properties, targeted by signals or method calls,
-and for calling handlers in case of non-blocking method call returns.
+registered interfaces properties, targeted by signals, method calls or
+monitors, and for calling handlers in case of non-blocking method call
+returns.
 
 In the first case, the key in the hash table is the list (TYPE BUS
-INTERFACE MEMBER).  TYPE is one of the Lisp symbols `:method',
+[INTERFACE MEMBER]).  TYPE is one of the Lisp symbols `:method',
 `:signal', `:property' or `:monitor'.  BUS is either a Lisp symbol,
 `:system', `:session', `:system-private' or `:session-private', or a
 string denoting the bus address.  INTERFACE is a string which denotes
@@ -1951,17 +1958,18 @@ signal or a property INTERFACE is offering.  All 
arguments can be nil.
 The value in the hash table is a list of quadruple lists ((UNAME
 SERVICE PATH OBJECT [RULE]) ...).  SERVICE is the service name as
 registered, UNAME is the corresponding unique name.  In case of
-registered methods and properties, UNAME is nil.  PATH is the object
-path of the sending object.  All of them can be nil, which means a
-wildcard then.
+registered methods, properties and monitors, UNAME is nil.  PATH is
+the object path of the sending object.  All of them can be nil, which
+means a wildcard then.
 
 OBJECT is either the handler to be called when a D-Bus message, which
 matches the key criteria, arrives (TYPE `:method', `:signal' and
 `:monitor'), or a list (ACCESS EMITS-SIGNAL VALUE) for TYPE
 `:property'.
 
-For entries of type `:signal', there is also a fifth element RULE,
-which keeps the match string the signal is registered with.
+For entries of type `:signal' or `:monitor', there is also a fifth
+element RULE, which keeps the match string the signal or monitor is
+registered with.
 
 In the second case, the key in the hash table is the list (:serial BUS
 SERIAL).  BUS is either a Lisp symbol, `:system' or `:session', or a
diff --git a/src/dired.c b/src/dired.c
index f013a4c..1584b6a 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -929,7 +929,7 @@ file_attributes (int fd, char const *name,
   struct stat s;
 
   /* An array to hold the mode string generated by filemodestring,
-     including its terminating space and NUL byte.  */
+     including its terminating space and null byte.  */
   char modes[sizeof "-rwxr-xr-x "];
 
   char *uname = NULL, *gname = NULL;
diff --git a/src/dispextern.h b/src/dispextern.h
index 0d982f7..848d3bc 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -1996,7 +1996,7 @@ struct bidi_string_data {
   Lisp_Object lstring;         /* Lisp string to reorder, or nil */
   const unsigned char *s;      /* string data, or NULL if reordering buffer */
   ptrdiff_t schars;            /* the number of characters in the string,
-                                  excluding the terminating NUL */
+                                  excluding the terminating null */
   ptrdiff_t bufpos;            /* buffer position of lstring, or 0 if N/A */
   bool_bf from_disp_str : 1;   /* True means the string comes from a
                                   display property */
diff --git a/src/dispnew.c b/src/dispnew.c
index d318e26..3f2ae3e 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -1830,7 +1830,7 @@ adjust_frame_glyphs (struct frame *f)
   /* Don't forget the buffer for decode_mode_spec.  */
   adjust_decode_mode_spec_buffer (f);
 
-  f->glyphs_initialized_p = 1;
+  f->glyphs_initialized_p = true;
 
   unblock_input ();
 }
@@ -2251,7 +2251,7 @@ free_glyphs (struct frame *f)
       /* Block interrupt input so that we don't get surprised by an X
          event while we're in an inconsistent state.  */
       block_input ();
-      f->glyphs_initialized_p = 0;
+      f->glyphs_initialized_p = false;
 
       /* Release window sub-matrices.  */
       if (!NILP (f->root_window))
@@ -3236,9 +3236,16 @@ update_frame (struct frame *f, bool force_p, bool 
inhibit_hairy_id_p)
       build_frame_matrix (f);
 
       /* Update the display.  */
-      update_begin (f);
-      paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p, 1, false);
-      update_end (f);
+      if (FRAME_INITIAL_P (f))
+        /* No actual display to update so the "update" is a nop and
+           obviously isn't interrupted by pending input.  */
+        paused_p = false;
+      else
+        {
+          update_begin (f);
+          paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p, 1, false);
+          update_end (f);
+        }
 
       if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
         {
diff --git a/src/doc.c b/src/doc.c
index 31ccee8..8a4f885 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -233,7 +233,7 @@ get_doc_string (Lisp_Object filepos, bool unibyte, bool 
definition)
     }
 
   /* Scan the text and perform quoting with ^A (char code 1).
-     ^A^A becomes ^A, ^A0 becomes a NUL char, and ^A_ becomes a ^_.  */
+     ^A^A becomes ^A, ^A0 becomes a null char, and ^A_ becomes a ^_.  */
   from = get_doc_string_buffer + offset;
   to = get_doc_string_buffer + offset;
   while (from != p)
diff --git a/src/doprnt.c b/src/doprnt.c
index b0ba125..ceadf3b 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -35,7 +35,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
      sequence.
 
    . It accepts a pointer to the end of the format string, so the format string
-     could include embedded NUL characters.
+     could include embedded null characters.
 
    . It signals an error if the length of the formatted string is about to
      overflow ptrdiff_t or size_t, to avoid producing strings longer than what
@@ -123,7 +123,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
    to fit and return BUFSIZE - 1; if this truncates a multibyte
    sequence, store '\0' into the sequence's first byte.
    Returns the number of bytes stored into BUFFER, excluding
-   the terminating NUL byte.  Output is always NUL-terminated.
+   the terminating null byte.  Output is always null-terminated.
    String arguments are passed as C strings.
    Integers are passed as C integers.  */
 
diff --git a/src/editfns.c b/src/editfns.c
index 7e1e24e..ca6b898 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -3069,7 +3069,7 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool 
message)
                              : FLT_RADIX == 16 ? 4
                              : -1)),
 
-   /* Maximum number of bytes (including terminating NUL) generated
+   /* Maximum number of bytes (including terminating null) generated
       by any format, if precision is no more than USEFUL_PRECISION_MAX.
       On all practical hosts, %Lf is the worst case.  */
    SPRINTF_BUFSIZE = (sizeof "-." + (LDBL_MAX_10_EXP + 1)
diff --git a/src/emacs.c b/src/emacs.c
index 1f7f5ea..a45842b 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2772,7 +2772,7 @@ decode_env_path (const char *evarname, const char 
*defalt, bool empty)
              }
          }
        else if (cnv_result != 0 && d > path_utf8)
-         d[-1] = '\0'; /* remove last semi-colon and NUL-terminate PATH */
+         d[-1] = '\0'; /* remove last semi-colon and null-terminate PATH */
       } while (q);
       path_copy = path_utf8;
 #else  /* MSDOS */
diff --git a/src/fileio.c b/src/fileio.c
index 6d0bafa..283813f 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -1710,7 +1710,7 @@ See also the function `substitute-in-file-name'.")
 #endif
 
 /* Put into BUF the concatenation of DIR and FILE, with an intervening
-   directory separator if needed.  Return a pointer to the NUL byte
+   directory separator if needed.  Return a pointer to the null byte
    at the end of the concatenated string.  */
 char *
 splice_dir_file (char *buf, char const *dir, char const *file)
diff --git a/src/filelock.c b/src/filelock.c
index ee46e0e..39febd3 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -296,7 +296,7 @@ typedef struct
 
 /* Write the name of the lock file for FNAME into LOCKNAME.  Length
    will be that of FNAME plus two more for the leading ".#", plus one
-   for the NUL.  */
+   for the null.  */
 #define MAKE_LOCK_NAME(lockname, fname) \
   (lockname = SAFE_ALLOCA (SBYTES (fname) + 2 + 1), \
    fill_in_lock_file_name (lockname, fname))
diff --git a/src/fns.c b/src/fns.c
index f626fe1..4003fe8 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -406,7 +406,7 @@ string_version_cmp (Lisp_Object string1, Lisp_Object 
string2)
 
   while ((cmp = filevercmp (p1, p2)) == 0)
     {
-      /* If the strings are identical through their first NUL bytes,
+      /* If the strings are identical through their first null bytes,
         skip past identical prefixes and try again.  */
       ptrdiff_t size = strlen (p1) + 1;
       eassert (size == strlen (p2) + 1);
diff --git a/src/font.c b/src/font.c
index beaa7be..fe257f4 100644
--- a/src/font.c
+++ b/src/font.c
@@ -188,6 +188,9 @@ font_make_object (int size, Lisp_Object entity, int 
pixelsize)
                                             FONT_OBJECT_MAX, PVEC_FONT);
   int i;
 
+  /* Poison the max_width, so we can detect when it hasn't been set.  */
+  eassert (font->max_width = 1024 * 1024 * 1024);
+
   /* GC can happen before the driver is set up,
      so avoid dangling pointer here (Bug#17771).  */
   font->driver = NULL;
@@ -1011,7 +1014,7 @@ font_expand_wildcards (Lisp_Object *field, int n)
 }
 
 
-/* Parse NAME (NUL terminated) as XLFD and store information in FONT
+/* Parse NAME (null terminated) as XLFD and store information in FONT
    (font-spec or font-entity).  Size property of FONT is set as
    follows:
        specified XLFD fields           FONT property
@@ -1355,7 +1358,7 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char 
*name, int nbytes)
   return len < nbytes ? len : -1;
 }
 
-/* Parse NAME (NUL terminated) and store information in FONT
+/* Parse NAME (null terminated) and store information in FONT
    (font-spec or font-entity).  NAME is supplied in either the
    Fontconfig or GTK font name format.  If NAME is successfully
    parsed, return 0.  Otherwise return -1.
@@ -1727,7 +1730,7 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, 
char *name, int nbytes)
 
 #endif
 
-/* Parse NAME (NUL terminated) and store information in FONT
+/* Parse NAME (null terminated) and store information in FONT
    (font-spec or font-entity).  If NAME is successfully parsed, return
    0.  Otherwise return -1.  */
 
@@ -5171,6 +5174,9 @@ If the named font cannot be opened and loaded, return 
nil.  */)
     return Qnil;
   font = XFONT_OBJECT (font_object);
 
+  /* Sanity check to make sure we have initialized max_width.  */
+  eassert (XFONT_OBJECT (font_object)->max_width < 1024 * 1024 * 1024);
+
   info = CALLN (Fvector,
                AREF (font_object, FONT_NAME_INDEX),
                AREF (font_object, FONT_FULLNAME_INDEX),
diff --git a/src/frame.c b/src/frame.c
index 3f93450..0b707c2 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -931,18 +931,18 @@ make_frame (bool mini_p)
 
   wset_frame (rw, frame);
 
-  /* 10 is arbitrary,
+  /* 80/25 is arbitrary,
      just so that there is "something there."
      Correct size will be set up later with adjust_frame_size.  */
 
-  SET_FRAME_COLS (f, 10);
-  SET_FRAME_LINES (f, 10);
+  SET_FRAME_COLS (f, 80);
+  SET_FRAME_LINES (f, 25);
   SET_FRAME_WIDTH (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f));
   SET_FRAME_HEIGHT (f, FRAME_LINES (f) * FRAME_LINE_HEIGHT (f));
 
-  rw->total_cols = 10;
+  rw->total_cols = FRAME_COLS (f);
   rw->pixel_width = rw->total_cols * FRAME_COLUMN_WIDTH (f);
-  rw->total_lines = mini_p ? 9 : 10;
+  rw->total_lines = FRAME_LINES (f) - (mini_p ? 1 : 0);
   rw->pixel_height = rw->total_lines * FRAME_LINE_HEIGHT (f);
 
   if (mini_p)
@@ -1101,7 +1101,7 @@ make_initial_frame (void)
 
   terminal = init_initial_terminal ();
 
-  f = make_frame (1);
+  f = make_frame (true);
   XSETFRAME (frame, f);
 
   Vframe_list = Fcons (frame, Vframe_list);
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 7832d4f..4892a34 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -187,7 +187,8 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int 
pixel_size)
 
   block_input ();
   cairo_glyph_t stack_glyph;
-  font->min_width = font->average_width = font->space_width = 0;
+  font->min_width = font->max_width = 0;
+  font->average_width = font->space_width = 0;
   for (char c = 32; c < 127; c++)
     {
       cairo_glyph_t *glyphs = &stack_glyph;
@@ -211,6 +212,8 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int 
pixel_size)
          && (! font->min_width
              || font->min_width > this_width))
        font->min_width = this_width;
+      if (this_width > font->max_width)
+       font->max_width = this_width;
       if (c == 32)
        font->space_width = this_width;
       font->average_width += this_width;
@@ -266,6 +269,7 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int 
pixel_size)
   font->relative_compose = 0;
   font->default_ascent = 0;
   font->vertical_centering = false;
+  eassert (font->max_width < 512 * 1024 * 1024);
 
   return font_object;
 }
diff --git a/src/insdel.c b/src/insdel.c
index c37b071..6e24597 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -714,7 +714,7 @@ insert_char (int c)
   insert ((char *) str, len);
 }
 
-/* Insert the NUL-terminated string S before point.  */
+/* Insert the null-terminated string S before point.  */
 
 void
 insert_string (const char *s)
diff --git a/src/json.c b/src/json.c
index 8c95836..744c40a 100644
--- a/src/json.c
+++ b/src/json.c
@@ -279,10 +279,10 @@ json_release_object (void *object)
 }
 
 /* Signal an error if OBJECT is not a string, or if OBJECT contains
-   embedded NUL characters.  */
+   embedded null characters.  */
 
 static void
-check_string_without_embedded_nuls (Lisp_Object object)
+check_string_without_embedded_nulls (Lisp_Object object)
 {
   CHECK_STRING (object);
   CHECK_TYPE (memchr (SDATA (object), '\0', SBYTES (object)) == NULL,
@@ -368,11 +368,11 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp,
               CHECK_STRING (key);
               Lisp_Object ekey = json_encode (key);
               /* We can't specify the length, so the string must be
-               NUL-terminated.  */
-              check_string_without_embedded_nuls (ekey);
+                null-terminated.  */
+              check_string_without_embedded_nulls (ekey);
               const char *key_str = SSDATA (ekey);
               /* Reject duplicate keys.  These are possible if the hash
-               table test is not `equal'.  */
+                table test is not `equal'.  */
               if (json_object_get (json, key_str) != NULL)
                 wrong_type_argument (Qjson_value_p, lisp);
               int status
@@ -419,8 +419,8 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp,
           CHECK_SYMBOL (key_symbol);
           Lisp_Object key = SYMBOL_NAME (key_symbol);
           /* We can't specify the length, so the string must be
-             NUL-terminated.  */
-          check_string_without_embedded_nuls (key);
+             null-terminated.  */
+          check_string_without_embedded_nulls (key);
           key_str = SSDATA (key);
           /* In plists, ensure leading ":" in keys is stripped.  It
              will be reconstructed later in `json_to_lisp'.*/
@@ -563,7 +563,7 @@ false values, t, numbers, strings, or other vectors 
hashtables, alists
 or plists.  t will be converted to the JSON true value.  Vectors will
 be converted to JSON arrays, whereas hashtables, alists and plists are
 converted to JSON objects.  Hashtable keys must be strings without
-embedded NUL characters and must be unique within each object.  Alist
+embedded null characters and must be unique within each object.  Alist
 and plist keys must be symbols; if a key is duplicate, the first
 instance is used.
 
@@ -976,7 +976,7 @@ usage: (json-parse-string STRING &rest ARGS) */)
   Lisp_Object string = args[0];
   CHECK_STRING (string);
   Lisp_Object encoded = json_encode (string);
-  check_string_without_embedded_nuls (encoded);
+  check_string_without_embedded_nulls (encoded);
   struct json_configuration conf =
     {json_object_hashtable, json_array_array, QCnull, QCfalse};
   json_parse_args (nargs - 1, args + 1, &conf, true);
diff --git a/src/keyboard.c b/src/keyboard.c
index af075a4..4d22c44 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -6234,7 +6234,7 @@ parse_modifiers_uncached (Lisp_Object symbol, ptrdiff_t 
*modifier_end)
 static Lisp_Object
 apply_modifiers_uncached (int modifiers, char *base, int base_len, int 
base_len_byte)
 {
-  /* Since BASE could contain NULs, we can't use intern here; we have
+  /* Since BASE could contain nulls, we can't use intern here; we have
      to use Fintern, which expects a genuine Lisp_String, and keeps a
      reference to it.  */
   char new_mods[sizeof "A-C-H-M-S-s-up-down-drag-double-triple-"];
@@ -10566,8 +10566,6 @@ DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,
        doc: /* Return the key sequence that invoked this command.
 More generally, it returns the last key sequence read, either by
 the command loop or by `read-key-sequence'.
-Unlike `this-command-keys', this function's value
-does not include prefix arguments.
 The value is always a vector.  */)
   (void)
 {
@@ -12106,7 +12104,8 @@ See also `pre-command-hook'.  */);
 
   DEFVAR_LISP ("menu-bar-final-items", Vmenu_bar_final_items,
               doc: /* List of menu bar items to move to the end of the menu 
bar.
-The elements of the list are event types that may have menu bar bindings.  */);
+The elements of the list are event types that may have menu bar
+bindings.  The order of this list controls the order of the items.  */);
   Vmenu_bar_final_items = Qnil;
 
   DEFVAR_LISP ("tab-bar-separator-image-expression", 
Vtab_bar_separator_image_expression,
diff --git a/src/lisp.h b/src/lisp.h
index a1bdfe8..4b0592e 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1519,11 +1519,11 @@ STRING_MULTIBYTE (Lisp_Object str)
 }
 
 /* An upper bound on the number of bytes in a Lisp string, not
-   counting the terminating NUL.  This a tight enough bound to
+   counting the terminating null.  This a tight enough bound to
    prevent integer overflow errors that would otherwise occur during
    string size calculations.  A string cannot contain more bytes than
    a fixnum can represent, nor can it be so long that C pointer
-   arithmetic stops working on the string plus its terminating NUL.
+   arithmetic stops working on the string plus its terminating null.
    Although the actual size limit (see STRING_BYTES_MAX in alloc.c)
    may be a bit smaller than STRING_BYTES_BOUND, calculating it here
    would expose alloc.c internal details that we'd rather keep
@@ -3005,7 +3005,7 @@ CHECK_SUBR (Lisp_Object x)
 
 /* Define a built-in function for calling from Lisp.
  `lname' should be the name to give the function in Lisp,
-    as a NUL-terminated C string.
+    as a null-terminated C string.
  `fnname' should be the name of the function in C.
     By convention, it starts with F.
  `sname' should be the name for the C constant structure
@@ -4794,7 +4794,7 @@ extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
 extern void dupstring (char **, char const *);
 
 /* Make DEST a copy of STRING's data.  Return a pointer to DEST's terminating
-   NUL byte.  This is like stpcpy, except the source is a Lisp string.  */
+   null byte.  This is like stpcpy, except the source is a Lisp string.  */
 
 INLINE char *
 lispstpcpy (char *dest, Lisp_Object string)
@@ -5012,7 +5012,7 @@ enum
         : list4 (a, b, c, d))
 
 /* Declare NAME as an auto Lisp string if possible, a GC-based one if not.
-   Take its unibyte value from the NUL-terminated string STR,
+   Take its unibyte value from the null-terminated string STR,
    an expression that should not have side effects.
    STR's value is not necessarily copied.  The resulting Lisp string
    should not be modified or given text properties or made visible to
@@ -5022,8 +5022,8 @@ enum
   AUTO_STRING_WITH_LEN (name, str, strlen (str))
 
 /* Declare NAME as an auto Lisp string if possible, a GC-based one if not.
-   Take its unibyte value from the NUL-terminated string STR with length LEN.
-   STR may have side effects and may contain NUL bytes.
+   Take its unibyte value from the null-terminated string STR with length LEN.
+   STR may have side effects and may contain null bytes.
    STR's value is not necessarily copied.  The resulting Lisp string
    should not be modified or given text properties or made visible to
    user code.  */
diff --git a/src/module-env-25.h b/src/module-env-25.h
index 01ce65e..97c7787 100644
--- a/src/module-env-25.h
+++ b/src/module-env-25.h
@@ -80,13 +80,13 @@
     EMACS_ATTRIBUTE_NONNULL(1);
 
   /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
-     NUL-terminated string.
+     null-terminated string.
 
      SIZE must point to the total size of the buffer.  If BUFFER is
      NULL or if SIZE is not big enough, write the required buffer size
      to SIZE and return true.
 
-     Note that SIZE must include the last NUL byte (e.g. "abc" needs
+     Note that SIZE must include the last null byte (e.g. "abc" needs
      a buffer of size 4).
 
      Return true if the string was successfully copied.  */
diff --git a/src/nsterm.m b/src/nsterm.m
index fdcd677..a702a05 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -3032,7 +3032,7 @@ ns_clear_under_internal_border (struct frame *f)
 {
   NSTRACE ("ns_clear_under_internal_border");
 
-  if (FRAME_INTERNAL_BORDER_WIDTH (f) > 0)
+  if (FRAME_LIVE_P (f) && FRAME_INTERNAL_BORDER_WIDTH (f) > 0)
     {
       int border_width = FRAME_INTERNAL_BORDER_WIDTH (f);
       NSView *view = FRAME_NS_VIEW (f);
diff --git a/src/sysdep.c b/src/sysdep.c
index e161172..f6c0dde 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -267,12 +267,12 @@ get_current_dir_name_or_unreachable (void)
 
   char *pwd;
 
-  /* The maximum size of a directory name, including the terminating NUL.
+  /* The maximum size of a directory name, including the terminating null.
      Leave room so that the caller can append a trailing slash.  */
   ptrdiff_t dirsize_max = min (PTRDIFF_MAX, SIZE_MAX) - 1;
 
   /* The maximum size of a buffer for a file name, including the
-     terminating NUL.  This is bounded by PATH_MAX, if available.  */
+     terminating null.  This is bounded by PATH_MAX, if available.  */
   ptrdiff_t bufsize_max = dirsize_max;
 #ifdef PATH_MAX
   bufsize_max = min (bufsize_max, PATH_MAX);
@@ -3331,7 +3331,7 @@ system_process_attributes (Lisp_Object pid)
 
       if (nread)
        {
-         /* We don't want trailing NUL characters.  */
+         /* We don't want trailing null characters.  */
          for (p = cmdline + nread; cmdline < p && !p[-1]; p--)
            continue;
 
diff --git a/src/termcap.c b/src/termcap.c
index cc6f2d1..1ace4c9 100644
--- a/src/termcap.c
+++ b/src/termcap.c
@@ -162,7 +162,7 @@ tgetst1 (char *ptr, char **area)
   else
     ret = *area;
 
-  /* Copy the string value, stopping at NUL or colon.
+  /* Copy the string value, stopping at null or colon.
      Also process ^ and \ abbreviations.  */
   p = ptr;
   r = ret;
@@ -424,7 +424,7 @@ tgetent (char *bp, const char *name)
     return -1;
 
   buf.size = BUFSIZE;
-  /* Add 1 to size to ensure room for terminating NUL.  */
+  /* Add 1 to size to ensure room for terminating null.  */
   buf.beg = xmalloc (buf.size + 1);
   term = indirect ? indirect : (char *)name;
 
@@ -480,7 +480,7 @@ tgetent (char *bp, const char *name)
       *bp1 = '\0';
 
       /* Does this entry refer to another terminal type's entry?
-        If something is found, copy it into heap and NUL-terminate it.  */
+        If something is found, copy it into heap and null-terminate it.  */
       tc_search_point = find_capability (tc_search_point, "tc");
       term = tgetst1 (tc_search_point, 0);
     }
@@ -618,7 +618,7 @@ gobble_line (int fd, register struct termcap_buffer *bufp, 
char *append_end)
            {
              ptrdiff_t ptr_offset = bufp->ptr - buf;
              ptrdiff_t append_end_offset = append_end - buf;
-             /* Add 1 to size to ensure room for terminating NUL.  */
+             /* Add 1 to size to ensure room for terminating null.  */
              ptrdiff_t size = bufp->size + 1;
              bufp->beg = buf = xpalloc (buf, &size, 1, -1, 1);
              bufp->size = size - 1;
diff --git a/src/timefns.c b/src/timefns.c
index 71d5e10..4a28f70 100644
--- a/src/timefns.c
+++ b/src/timefns.c
@@ -1311,7 +1311,7 @@ or (if you need time as a string) `format-time-string'.  
*/)
    determine how many bytes would be written, use NULL for S and
    ((size_t) -1) for MAXSIZE.
 
-   This function behaves like nstrftime, except it allows NUL
+   This function behaves like nstrftime, except it allows null
    bytes in FORMAT.  */
 static size_t
 emacs_nmemftime (char *s, size_t maxsize, const char *format,
@@ -1320,8 +1320,8 @@ emacs_nmemftime (char *s, size_t maxsize, const char 
*format,
   int saved_errno = errno;
   size_t total = 0;
 
-  /* Loop through all the NUL-terminated strings in the format
-     argument.  Normally there's just one NUL-terminated string, but
+  /* Loop through all the null-terminated strings in the format
+     argument.  Normally there's just one null-terminated string, but
      there can be arbitrarily many, concatenated together, if the
      format contains '\0' bytes.  nstrftime stops at the first
      '\0' byte so we must invoke it separately for each such string.  */
diff --git a/src/unexmacosx.c b/src/unexmacosx.c
index 59cbe3c..8cf68bb 100644
--- a/src/unexmacosx.c
+++ b/src/unexmacosx.c
@@ -447,7 +447,7 @@ unexec_regions_recorder (task_t task, void *rr, unsigned 
type,
 
   while (num && num_unexec_regions < MAX_UNEXEC_REGIONS)
     {
-      /* Subtract the size of trailing NUL bytes from filesize.  It
+      /* Subtract the size of trailing null bytes from filesize.  It
         can be smaller than vmsize in segment commands.  In such a
         case, trailing bytes are initialized with zeros.  */
       for (p = ranges->address + ranges->size; p > ranges->address; p--)
diff --git a/src/w16select.c b/src/w16select.c
index b56ced4..7593352 100644
--- a/src/w16select.c
+++ b/src/w16select.c
@@ -220,7 +220,7 @@ set_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
   /* need to know final size after '\r' chars are inserted (the
      standard CF_OEMTEXT clipboard format uses CRLF line endings,
      while Emacs uses just LF internally).  */
-  truelen = Size + 1;          /* +1 for the terminating NUL */
+  truelen = Size + 1;          /* +1 for the terminating null */
 
   if (!Raw)
     {
@@ -243,7 +243,7 @@ set_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
     {
       dosmemput (Data, Size, xbuf_addr);
 
-      /* Terminate with a NUL, otherwise Windows does strange things
+      /* Terminate with a null, otherwise Windows does strange things
         when the text size is an integral multiple of 32 bytes. */
       _farpokeb (_dos_ds, xbuf_addr + Size, '\0');
     }
@@ -255,7 +255,7 @@ set_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
       while (Size--)
        {
          /* Don't allow them to put binary data into the clipboard, since
-            it will cause yanked data to be truncated at the first NUL.  */
+            it will cause yanked data to be truncated at the first null.  */
          if (*dp == '\0')
            return 2;
          if (*dp == '\n')
@@ -263,7 +263,7 @@ set_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
          _farnspokeb (buf_offset++, *dp++);
        }
 
-      /* Terminate with a NUL, otherwise Windows does strange things
+      /* Terminate with a null, otherwise Windows does strange things
         when the text size is an integral multiple of 32 bytes. */
       _farnspokeb (buf_offset, '\0');
     }
@@ -354,13 +354,13 @@ get_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
   __dpmi_int (0x2f, &regs);
   if (regs.x.ax != 0)
     {
-      unsigned char nul_char = '\0';
+      unsigned char null_char = '\0';
       unsigned long xbuf_beg = xbuf_addr;
 
       /* If last_clipboard_text is NULL, we don't want to slow down
         the next loop by an additional test.  */
       register unsigned char *lcdp =
-       last_clipboard_text == NULL ? &nul_char : last_clipboard_text;
+       last_clipboard_text == NULL ? &null_char : last_clipboard_text;
 
       /* Copy data from low memory, remove CR
         characters before LF if needed.  */
@@ -383,7 +383,7 @@ get_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
          /* Windows reportedly rounds up the size of clipboard data
             (passed in SIZE) to a multiple of 32, and removes trailing
             spaces from each line without updating SIZE.  We therefore
-            bail out when we see the first NUL character.  */
+            bail out when we see the first null character.  */
          else if (c == '\0')
            break;
        }
@@ -392,7 +392,7 @@ get_clipboard_data (unsigned Format, void *Data, unsigned 
Size, int Raw)
         last time set_clipboard_data was called, pretend there's no
         data in the clipboard.  This is so we don't pass our own text
         from the clipboard (which might be troublesome if the killed
-        text includes NUL characters).  */
+        text includes null characters).  */
       if (last_clipboard_text &&
          xbuf_addr - xbuf_beg == (long)(lcdp - last_clipboard_text))
        dp = (unsigned char *)Data + 1;
diff --git a/src/w32.c b/src/w32.c
index d4a8d2e..0d38eae 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -6144,7 +6144,7 @@ is_symlink (const char *filename)
 
 /* If NAME identifies a symbolic link, copy into BUF the file name of
    the symlink's target.  Copy at most BUF_SIZE bytes, and do NOT
-   NUL-terminate the target name, even if it fits.  Return the number
+   null-terminate the target name, even if it fits.  Return the number
    of bytes copied, or -1 if NAME is not a symlink or any error was
    encountered while resolving it.  The file name copied into BUF is
    encoded in the current ANSI codepage.  */
@@ -6248,10 +6248,10 @@ readlink (const char *name, char *buf, size_t buf_size)
          size_t size_to_copy = buf_size;
 
          /* According to MSDN, PrintNameLength does not include the
-            terminating NUL character.  */
+            terminating null character.  */
          lwname = alloca ((lwname_len + 1) * sizeof(WCHAR));
          memcpy (lwname, lwname_src, lwname_len);
-         lwname[lwname_len/sizeof(WCHAR)] = 0; /* NUL-terminate */
+         lwname[lwname_len/sizeof(WCHAR)] = 0; /* null-terminate */
          filename_from_utf16 (lwname, resolved);
          dostounix_filename (resolved);
          lname_size = strlen (resolved) + 1;
@@ -9884,7 +9884,7 @@ w32_read_registry (HKEY rootkey, Lisp_Object lkey, 
Lisp_Object lname)
       /* Convert input strings to UTF-16.  */
       encoded_key = code_convert_string_norecord (lkey, Qutf_16le, 1);
       memcpy (key_w, SSDATA (encoded_key), SBYTES (encoded_key));
-      /* wchar_t strings need to be terminated by 2 NUL bytes.  */
+      /* wchar_t strings need to be terminated by 2 null bytes.  */
       key_w [SBYTES (encoded_key)/2] = L'\0';
       encoded_vname = code_convert_string_norecord (lname, Qutf_16le, 1);
       memcpy (value_w, SSDATA (encoded_vname), SBYTES (encoded_vname));
@@ -9976,7 +9976,7 @@ w32_read_registry (HKEY rootkey, Lisp_Object lkey, 
Lisp_Object lname)
       case REG_SZ:
        if (use_unicode)
          {
-           /* pvalue ends with 2 NUL bytes, but we need only one,
+           /* pvalue ends with 2 null bytes, but we need only one,
               and AUTO_STRING_WITH_LEN will add it.  */
            if (pvalue[vsize - 1] == '\0')
              vsize -= 2;
@@ -9985,7 +9985,7 @@ w32_read_registry (HKEY rootkey, Lisp_Object lkey, 
Lisp_Object lname)
          }
        else
          {
-           /* Don't waste a byte on the terminating NUL character,
+           /* Don't waste a byte on the terminating null character,
               since make_unibyte_string will add one anyway.  */
            if (pvalue[vsize - 1] == '\0')
              vsize--;
diff --git a/src/w32fns.c b/src/w32fns.c
index 3134f67..ef69f40 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -7960,7 +7960,7 @@ DEFUN ("system-move-file-to-trash", 
Fsystem_move_file_to_trash,
        {
          SHFILEOPSTRUCTW file_op_w;
          /* We need one more element beyond MAX_PATH because this is
-            a list of file names, with the last element double-NUL
+            a list of file names, with the last element double-null
             terminated. */
          wchar_t tmp_path_w[MAX_PATH + 1];
 
@@ -9732,7 +9732,7 @@ get_dll_version (const char *dll_name)
 /* Return the number of bytes in UTF-8 encoded string STR that
    corresponds to at most LIM characters.  If STR ends before LIM
    characters, return the number of bytes in STR including the
-   terminating NUL byte.  */
+   terminating null byte.  */
 static int
 utf8_mbslen_lim (const char *str, int lim)
 {
diff --git a/src/w32proc.c b/src/w32proc.c
index c50f246..0cf8201 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -2007,9 +2007,9 @@ sys_spawnve (int mode, char *cmdname, char **argv, char 
**envp)
     }
 
   /* we have to do some conjuring here to put argv and envp into the
-     form CreateProcess wants...  argv needs to be a space separated/NUL
-     terminated list of parameters, and envp is a NUL
-     separated/double-NUL terminated list of parameters.
+     form CreateProcess wants...  argv needs to be a space separated/null
+     terminated list of parameters, and envp is a null
+     separated/double-null terminated list of parameters.
 
      Additionally, zero-length args and args containing whitespace or
      quote chars need to be wrapped in double quotes - for this to work,
@@ -3398,10 +3398,10 @@ If LCID (a 16-bit number) is not a valid locale, the 
result is nil.  */)
       got_full = GetLocaleInfo (XFIXNUM (lcid),
                                XFIXNUM (longform),
                                full_name, sizeof (full_name));
-      /* GetLocaleInfo's return value includes the terminating NUL
+      /* GetLocaleInfo's return value includes the terminating null
         character, when the returned information is a string, whereas
         make_unibyte_string needs the string length without the
-        terminating NUL.  */
+        terminating null.  */
       if (got_full)
        return make_unibyte_string (full_name, got_full - 1);
     }
diff --git a/src/w32select.c b/src/w32select.c
index 4e5bd6a..e754e1f 100644
--- a/src/w32select.c
+++ b/src/w32select.c
@@ -803,7 +803,7 @@ DEFUN ("w32-get-clipboard-data", Fw32_get_clipboard_data,
   (void) ignored;
 
   /* Don't pass our own text from the clipboard (which might be
-     troublesome if the killed text includes NUL characters).  */
+     troublesome if the killed text includes null characters).  */
   if (!NILP (current_text))
     return ret;
 
diff --git a/src/xdisp.c b/src/xdisp.c
index d910159..9e8f4fc 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -11043,7 +11043,7 @@ message_log_check_duplicate (ptrdiff_t prev_bol_byte, 
ptrdiff_t this_bol_byte)
 
 
 /* Display an echo area message M with a specified length of NBYTES
-   bytes.  The string may include NUL characters.  If M is not a
+   bytes.  The string may include null characters.  If M is not a
    string, clear out any existing message, and let the mini-buffer
    text show through.
 
@@ -11146,7 +11146,7 @@ message3_nolog (Lisp_Object m)
 }
 
 
-/* Display a NUL-terminated echo area message M.  If M is 0, clear
+/* Display a null-terminated echo area message M.  If M is 0, clear
    out any existing message, and let the mini-buffer text show through.
 
    The buffer M must continue to exist until after the echo area gets
@@ -15464,7 +15464,8 @@ redisplay_internal (void)
   /* No redisplay if running in batch mode or frame is not yet fully
      initialized, or redisplay is explicitly turned off by setting
      Vinhibit_redisplay.  */
-  if (FRAME_INITIAL_P (SELECTED_FRAME ())
+  if ((FRAME_INITIAL_P (SELECTED_FRAME ())
+       && redisplay_skip_initial_frame)
       || !NILP (Vinhibit_redisplay))
     return;
 
@@ -26152,7 +26153,7 @@ are the selected window and the WINDOW's buffer).  */)
   return unbind_to (count, str);
 }
 
-/* Write a NUL-terminated, right justified decimal representation of
+/* Write a null-terminated, right justified decimal representation of
    the positive integer D to BUF using a minimal field width WIDTH.  */
 
 static void
@@ -26182,7 +26183,7 @@ pint2str (register char *buf, register int width, 
register ptrdiff_t d)
     }
 }
 
-/* Write a NUL-terminated, right justified decimal and "human
+/* Write a null-terminated, right justified decimal and "human
    readable" representation of the nonnegative integer D to BUF using
    a minimal field width WIDTH.  D should be smaller than 999.5e24. */
 
@@ -26405,7 +26406,7 @@ decode_mode_spec (struct window *w, register int c, int 
field_width,
      produce strings from numerical values, so limit preposterously
      large values of FIELD_WIDTH to avoid overrunning the buffer's
      end.  The size of the buffer is enough for FRAME_MESSAGE_BUF_SIZE
-     bytes plus the terminating NUL.  */
+     bytes plus the terminating null.  */
   int width = min (field_width, FRAME_MESSAGE_BUF_SIZE (f));
   struct buffer *b = current_buffer;
 
@@ -35452,6 +35453,12 @@ When nil, mouse-movement events will not be generated 
as long as the
 mouse stays within the extent of a single glyph (except for images).  */);
   mouse_fine_grained_tracking = false;
 
+  DEFVAR_BOOL ("redisplay-skip-initial-frame", redisplay_skip_initial_frame,
+    doc: /* Non-nil to skip redisplay in initial frame.
+The initial frame is not displayed anywhere, so skipping it is
+best except in special circumstances such as running redisplay tests
+in batch mode.   */);
+  redisplay_skip_initial_frame = true;
 }
 
 
@@ -35462,6 +35469,8 @@ init_xdisp (void)
 {
   CHARPOS (this_line_start_pos) = 0;
 
+  echo_area_window = minibuf_window;
+
   if (!noninteractive)
     {
       struct window *m = XWINDOW (minibuf_window);
@@ -35471,8 +35480,6 @@ init_xdisp (void)
       struct window *r = XWINDOW (root);
       int i;
 
-      echo_area_window = minibuf_window;
-
       r->top_line = FRAME_TOP_MARGIN (f);
       r->pixel_top = r->top_line * FRAME_LINE_HEIGHT (f);
       r->total_cols = FRAME_COLS (f);
diff --git a/src/xfont.c b/src/xfont.c
index 1563b43..32f63c3 100644
--- a/src/xfont.c
+++ b/src/xfont.c
@@ -133,7 +133,7 @@ compare_font_names (const void *name1, const void *name2)
 
 /* Decode XLFD as iso-8859-1 into OUTPUT, and return the byte length
    of the decoding result.  LEN is the byte length of XLFD, or -1 if
-   XLFD is NUL terminated.  The caller must assure that OUTPUT is at
+   XLFD is NULL terminated.  The caller must assure that OUTPUT is at
    least twice (plus 1) as large as XLFD.  */
 
 static ptrdiff_t
diff --git a/test/lisp/calc/calc-tests.el b/test/lisp/calc/calc-tests.el
index 0df96a0..4bced28 100644
--- a/test/lisp/calc/calc-tests.el
+++ b/test/lisp/calc/calc-tests.el
@@ -574,6 +574,68 @@ An existing calc stack is reused, otherwise a new one is 
created."
                                           86400))))
       (should (equal (math-format-date d-1991-01-09-0600) "663400800")))))
 
+;; Reference implementations of binary shift functions:
+
+(defun calc-tests--clip (x w)
+  "Clip X to W bits, signed if W is negative, otherwise unsigned."
+  (if (>= w 0)
+      (logand x (- (ash 1 w) 1))
+    (let ((y (calc-tests--clip x (- w)))
+          (msb (ash 1 (- (- w) 1))))
+      (- y (ash (logand y msb) 1)))))
+
+(defun calc-tests--lsh (x n w)
+  "Logical shift left X by N steps, word size W."
+  (if (< n 0)
+      (calc-tests--rsh x (- n) w)
+    (calc-tests--clip (ash x n) w)))
+
+(defun calc-tests--rsh (x n w)
+  "Logical shift right X by N steps, word size W."
+  (if (< n 0)
+      (calc-tests--lsh x (- n) w)
+    (ash (calc-tests--clip x w) (- n))))
+
+(defun calc-tests--ash (x n w)
+  "Arithmetic shift left X by N steps, word size W."
+  (if (< n 0)
+      (calc-tests--rash x (- n) w)
+    (calc-tests--clip (ash x n) w)))
+
+(defun calc-tests--rash (x n w)
+  "Arithmetic shift right X by N steps, word size W."
+  (if (< n 0)
+      (calc-tests--ash x (- n) w)
+    ;; First sign-extend, then shift.
+    (let ((x-sext (calc-tests--clip x (- (abs w)))))
+      (calc-tests--clip (ash x-sext (- n)) w))))
+
+(defun calc-tests--rot (x n w)
+  "Rotate X left by N steps, word size W."
+  (let* ((aw (abs w))
+         (y (calc-tests--clip x aw))
+         (steps (mod n aw)))
+    (calc-tests--clip (logior (ash y steps) (ash y (- steps aw)))
+                      w)))
+
+(ert-deftest calc-shift-binary ()
+  (dolist (w '(16 32))
+    (dolist (x '(0 1 #x1234 #x8000 #xabcd #xffff
+                 #x12345678 #xabcdef12 #x80000000 #xffffffff
+                 #x1234567890ab #x1234967890ab
+                 -1 -14))
+      (dolist (n '(0 1 4 16 32 -1 -4 -16 -32))
+        (should (equal (calcFunc-lsh x n w)
+                       (calc-tests--lsh x n w)))
+        (should (equal (calcFunc-rsh x n w)
+                       (calc-tests--rsh x n w)))
+        (should (equal (calcFunc-ash x n w)
+                       (calc-tests--ash x n w)))
+        (should (equal (calcFunc-rash x n w)
+                       (calc-tests--rash x n w)))
+        (should (equal (calcFunc-rot x n w)
+                       (calc-tests--rot x n w)))))))
+
 (provide 'calc-tests)
 ;;; calc-tests.el ends here
 
diff --git a/test/lisp/comint-tests.el b/test/lisp/comint-tests.el
index 5b59340..923f588 100644
--- a/test/lisp/comint-tests.el
+++ b/test/lisp/comint-tests.el
@@ -39,6 +39,7 @@
     "Passphrase for key root@GNU.ORG: " ; plink
     "[sudo] password for user:" ; Ubuntu sudo
     "[sudo] user 的密码:" ; localized
+    "doas (user@host) password:" ; OpenBSD doas
     "PIN for user:"        ; Bug#35523
     "Password (again):"
     "Enter password:"
diff --git a/test/lisp/emacs-lisp/rx-tests.el b/test/lisp/emacs-lisp/rx-tests.el
index 3b01d89..59d8c60 100644
--- a/test/lisp/emacs-lisp/rx-tests.el
+++ b/test/lisp/emacs-lisp/rx-tests.el
@@ -539,6 +539,9 @@
 
 (ert-deftest rx-compat ()
   "Test old symbol retained for compatibility (bug#37517)."
-  (should (equal (rx-submatch-n '(group-n 3 (+ nonl) eol)) "\\(?3:.+$\\)")))
+  (should (equal
+           (with-suppressed-warnings ((obsolete rx-submatch-n))
+             (rx-submatch-n '(group-n 3 (+ nonl) eol)))
+           "\\(?3:.+$\\)")))
 
 (provide 'rx-tests)
diff --git a/test/lisp/international/mule-util-tests.el 
b/test/lisp/international/mule-util-tests.el
index cc199bd..0524dad 100644
--- a/test/lisp/international/mule-util-tests.el
+++ b/test/lisp/international/mule-util-tests.el
@@ -75,8 +75,9 @@
     (eval
      `(ert-deftest ,testname ()
         ,testdoc
-        (should (equal (apply 'truncate-string-to-width ',(car testdata))
-                              ,(cdr testdata)))))))
+        (let ((truncate-string-ellipsis "..."))
+          (should (equal (apply 'truncate-string-to-width ',(car testdata))
+                         ,(cdr testdata))))))))
 
 (dotimes (i (length mule-util-test-truncate-data))
   (mule-util-test-truncate-create i))
diff --git a/test/lisp/net/dbus-tests.el b/test/lisp/net/dbus-tests.el
index 7ebef5d..cd2e166 100644
--- a/test/lisp/net/dbus-tests.el
+++ b/test/lisp/net/dbus-tests.el
@@ -131,7 +131,7 @@
   (should-error
    (dbus-check-arguments :session dbus--test-service :object-path)
    :type 'wrong-type-argument)
-  ;; Raises an error on stdin.
+  ;; Raises an error on stderr.
   (should-error
    (dbus-check-arguments :session dbus--test-service :object-path "string")
    :type 'dbus-error)
@@ -144,7 +144,7 @@
   (should-error
    (dbus-check-arguments :session dbus--test-service :signature)
    :type 'wrong-type-argument)
-  ;; Raises an error on stdin.
+  ;; Raises an error on stderr.
   (should-error
    (dbus-check-arguments :session dbus--test-service :signature "string")
    :type 'dbus-error)
@@ -348,8 +348,12 @@
   (should
    (dbus-check-arguments
     :session dbus--test-service '(:array :string "string1" "string2")))
+  (should
+   (dbus-check-arguments
+    :session dbus--test-service '(:array :signature "s" :signature "ao")))
   ;; Empty array (of strings).
   (should (dbus-check-arguments :session dbus--test-service '(:array)))
+  ;; Empty array (of object paths).
   (should
    (dbus-check-arguments :session dbus--test-service '(:array :signature "o")))
   ;; Different element types.
@@ -358,6 +362,13 @@
     :session dbus--test-service
     '(:array :string "string" :object-path "/object/path"))
    :type 'wrong-type-argument)
+  ;; Different variant types in array don't matter.
+  (should
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:variant :string "string1")
+      (:variant (:struct :string "string2" :object-path "/object/path")))))
 
   ;; `:variant'.  It contains exactly one element.
   (should
@@ -383,7 +394,7 @@
    (dbus-check-arguments
     :session dbus--test-service
     '(:array (:dict-entry :string "string" :boolean nil))))
-  ;; This is an alternative syntax.  FIXME: Shall this be supported?
+  ;; This is an alternative syntax.
   (should
    (dbus-check-arguments
     :session dbus--test-service
@@ -414,14 +425,14 @@
    (dbus-check-arguments
     :session dbus--test-service '(:dict-entry :string "string" :boolean t))
    :type 'wrong-type-argument)
-  ;; Different dict entry types are not ched.  FIXME: Add check.
-  ;; (should-error
-  ;;  (dbus-check-arguments
-  ;;   :session dbus--test-service
-  ;;   '(:array
-  ;;     (:dict-entry :string "string1" :boolean t)
-  ;;     (:dict-entry :string "string2" :object-path "/object/path")))
-  ;;  :type 'wrong-type-argument)
+  ;; Different dict entry types in array.
+  (should-error
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:dict-entry :string "string1" :boolean t)
+      (:dict-entry :string "string2" :object-path "/object/path")))
+   :type 'wrong-type-argument)
 
   ;; `:struct'.  There is no restriction what could be an element of a struct.
   (should
@@ -434,6 +445,14 @@
   ;; Empty struct.
   (should-error
    (dbus-check-arguments :session dbus--test-service '(:struct))
+   :type 'wrong-type-argument)
+  ;; Different struct types in array.
+  (should-error
+   (dbus-check-arguments
+    :session dbus--test-service
+    '(:array
+      (:struct :string "string1" :boolean t)
+      (:struct :object-path "/object/path")))
    :type 'wrong-type-argument))
 
 (defun dbus--test-register-service (bus)
@@ -697,7 +716,7 @@ is in progress."
   "Received signal value in `dbus--test-signal-handler'.")
 
 (defun dbus--test-signal-handler (&rest args)
-  "Signal handler for `dbus-test*-signal'."
+  "Signal handler for `dbus-test*-signal' and `dbus-test08-register-monitor'."
   (setq dbus--test-signal-received args))
 
 (defun dbus--test-timeout-handler (&rest _ignore)
@@ -1833,6 +1852,46 @@ The argument EXPECTED-ARGS is a list of expected 
arguments for the method."
     ;; Cleanup.
     (dbus-unregister-service :session dbus--test-service)))
 
+(ert-deftest dbus-test08-register-monitor ()
+  "Check monitor registration."
+  :tags '(:expensive-test)
+  (skip-unless dbus--test-enabled-session-bus)
+
+  (unwind-protect
+      (let (registered)
+        (should
+         (equal
+          (setq registered
+                (dbus-register-monitor :session #'dbus--test-signal-handler))
+          '((:monitor :session-private)
+           (nil nil dbus--test-signal-handler))))
+
+        ;; Send a signal, shall be traced.
+        (setq dbus--test-signal-received nil)
+        (dbus-send-signal
+         :session dbus--test-service dbus--test-path
+         dbus--test-interface "Foo" "foo")
+       (with-timeout (1 (dbus--test-timeout-handler))
+          (while (null dbus--test-signal-received)
+            (read-event nil nil 0.1)))
+
+        ;; Unregister monitor.
+        (should (dbus-unregister-object registered))
+        (should-not (dbus-unregister-object registered))
+
+        ;; Send a signal, shall not be traced.
+        (setq dbus--test-signal-received nil)
+        (dbus-send-signal
+         :session dbus--test-service dbus--test-path
+         dbus--test-interface "Foo" "foo")
+       (with-timeout (1 (ignore))
+          (while (null dbus--test-signal-received)
+            (read-event nil nil 0.1)))
+        (should-not dbus--test-signal-received))
+
+    ;; Cleanup.
+    (dbus-unregister-service :session dbus--test-service)))
+
 (defun dbus-test-all (&optional interactive)
   "Run all tests for \\[dbus]."
   (interactive "p")
diff --git a/test/lisp/play/animate-tests.el b/test/lisp/play/animate-tests.el
index 8af1517..7c41d3b 100644
--- a/test/lisp/play/animate-tests.el
+++ b/test/lisp/play/animate-tests.el
@@ -36,8 +36,8 @@
 
 
 
-Happy Birthday,
-   Foo
+                                Happy Birthday,
+                                      Foo
 
 
                               You are my sunshine,
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-indent-exp.pl 
b/test/lisp/progmodes/cperl-mode-resources/cperl-indent-exp.pl
index 4a9842f..8c1883a 100644
--- a/test/lisp/progmodes/cperl-mode-resources/cperl-indent-exp.pl
+++ b/test/lisp/progmodes/cperl-mode-resources/cperl-indent-exp.pl
@@ -26,7 +26,7 @@ say "boring loop";
 }
 continue
 {
-last; # no endless loop, though
+last;
 }
 }
 # -------- while loop: expected output --------
@@ -34,7 +34,7 @@ last; # no endless loop, though
   while (1) {
     say "boring loop";
   } continue {
-    last; # no endless loop, though
+    last;
   }
 }
 # -------- while loop: end --------
diff --git a/test/lisp/progmodes/cperl-mode-tests.el 
b/test/lisp/progmodes/cperl-mode-tests.el
index f0ff8e9..20be7ed 100644
--- a/test/lisp/progmodes/cperl-mode-tests.el
+++ b/test/lisp/progmodes/cperl-mode-tests.el
@@ -148,6 +148,7 @@ under timeout control."
 These exercise some standard blocks and also the special
 treatment for Perl expressions where a closing paren isn't the
 end of the statement."
+  (skip-unless (eq cperl-test-mode #'cperl-mode))
   (let ((file (expand-file-name "cperl-indent-exp.pl"
                                 cperl-mode-tests-data-directory)))
     (with-temp-buffer
@@ -166,6 +167,7 @@ end of the statement."
               got)
           (with-temp-buffer
             (insert code)
+           (cperl-mode)
             (goto-char (point-min))
             (cperl-indent-exp) ; here we go!
             (setq expected (concat "test case " name ":\n" expected))
diff --git a/test/lisp/progmodes/ruby-mode-tests.el 
b/test/lisp/progmodes/ruby-mode-tests.el
index 5988a49..6675fb2 100644
--- a/test/lisp/progmodes/ruby-mode-tests.el
+++ b/test/lisp/progmodes/ruby-mode-tests.el
@@ -717,7 +717,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
   (ruby-with-temp-buffer ruby-sexp-test-example
     (goto-char (point-min))
     (forward-line 1)
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (= 8 (line-number-at-pos)))))
 
 (ert-deftest ruby-backward-sexp-skips-method-calls-with-keyword-names ()
@@ -725,7 +725,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
     (goto-char (point-min))
     (forward-line 7)
     (end-of-line)
-    (ruby-backward-sexp)
+    (backward-sexp)
     (should (= 2 (line-number-at-pos)))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-no-args ()
@@ -734,7 +734,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do
      |end")
     (search-backward "do\n")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-backward-sexp-jumps-do-end-block-with-no-args ()
@@ -743,7 +743,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do
      |end")
     (goto-char (point-max))
-    (ruby-backward-sexp)
+    (backward-sexp)
     (should (looking-at "do$"))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-empty-args ()
@@ -752,7 +752,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do ||
      |end")
     (search-backward "do ")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-backward-sexp-jumps-do-end-block-with-empty-args ()
@@ -761,7 +761,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do ||
      |end")
     (goto-char (point-max))
-    (ruby-backward-sexp)
+    (backward-sexp)
     (should (looking-at "do "))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-args ()
@@ -770,7 +770,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |a,b|
      |end")
     (search-backward "do ")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-backward-sexp-jumps-do-end-block-with-args ()
@@ -779,7 +779,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |a,b|
      |end")
     (goto-char (point-max))
-    (ruby-backward-sexp)
+    (backward-sexp)
     (should (looking-at "do "))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-any-args ()
@@ -788,7 +788,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |*|
      |end")
     (search-backward "do ")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-expanded-one-arg ()
@@ -797,7 +797,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |a,|
      |end")
     (search-backward "do ")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-forward-sexp-jumps-do-end-block-with-one-and-any-args ()
@@ -806,7 +806,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |a,*|
      |end")
     (search-backward "do ")
-    (ruby-forward-sexp)
+    (forward-sexp)
     (should (eobp))))
 
 (ert-deftest ruby-backward-sexp-jumps-do-end-block-with-one-and-any-args ()
@@ -815,7 +815,7 @@ VALUES-PLIST is a list with alternating index and value 
elements."
      "proc do |a,*|
      |end")
     (goto-char (point-max))
-    (ruby-backward-sexp)
+    (backward-sexp)
     (should (looking-at "do "))))
 
 (ert-deftest ruby-toggle-string-quotes-quotes-correctly ()
diff --git a/test/lisp/so-long-tests/so-long-tests.el 
b/test/lisp/so-long-tests/so-long-tests.el
index ffffe07..b72ee2f 100644
--- a/test/lisp/so-long-tests/so-long-tests.el
+++ b/test/lisp/so-long-tests/so-long-tests.el
@@ -181,7 +181,7 @@
       ;; The various 'window change functions' are now invoked by the
       ;; redisplay, and redisplay does nothing at all in batch mode,
       ;; so we cannot test under this revised behavior.  Refer to:
-      ;; https://lists.gnu.org/archive/html/emacs-devel/2019-10/msg00971.html
+      ;; https://lists.gnu.org/r/emacs-devel/2019-10/msg00971.html
       ;; For interactive (non-batch) test runs, calling `redisplay'
       ;; does do the trick; so do that first.
       (redisplay)
diff --git a/test/manual/etags/CTAGS.good b/test/manual/etags/CTAGS.good
index 519315c..5e58243 100644
--- a/test/manual/etags/CTAGS.good
+++ b/test/manual/etags/CTAGS.good
@@ -1835,7 +1835,7 @@ Z c-src/h.h       100
 \Ealphaenumerate       tex-src/texinfo.tex     
/^\\def\\Ealphaenumerate{\\Eenumerate}$/
 \Ecapsenumerate        tex-src/texinfo.tex     
/^\\def\\Ecapsenumerate{\\Eenumerate}$/
 \Ecartouche    tex-src/texinfo.tex     /^\\def\\Ecartouche{%$/
-\Edescription  tex-src/texinfo.tex     /^\\def\\Edescription{\\Etable}% 
Neccessary kludge.$/
+\Edescription  tex-src/texinfo.tex     /^\\def\\Edescription{\\Etable}% 
Necessary kludge.$/
 \Edisplay      tex-src/texinfo.tex     
/^\\def\\Edisplay{\\endgroup\\afterenvbreak}%$/
 \Eexample      tex-src/texinfo.tex     /^\\def\\Eexample{\\Elisp}$/
 \Eflushleft    tex-src/texinfo.tex     
/^\\def\\Eflushleft{\\endgroup\\afterenvbreak}%$/
diff --git a/test/manual/etags/cp-src/functions.cpp 
b/test/manual/etags/cp-src/functions.cpp
index 7c353d1..ddd78f1 100644
--- a/test/manual/etags/cp-src/functions.cpp
+++ b/test/manual/etags/cp-src/functions.cpp
@@ -223,7 +223,7 @@ int WorkingDays(Date a, Date b){
        return(wdays);
 }
 
-Date StartDay(Date a,int days){//Function to calculate the apropriate start 
day to finish in days working days
+Date StartDay(Date a,int days){//Function to calculate the appropriate start 
day to finish in days working days
        Date tmp;
        int wdays=0;
        if ( ! a.set() )
diff --git a/test/manual/etags/prol-src/ordsets.prolog 
b/test/manual/etags/prol-src/ordsets.prolog
index 7192129..0fa70f9 100644
--- a/test/manual/etags/prol-src/ordsets.prolog
+++ b/test/manual/etags/prol-src/ordsets.prolog
@@ -120,7 +120,7 @@ ord_intersect(>, Head1, Tail1, _, [Head2|Tail2]) :-
 
 
 %   ord_intersection(+Set1, +Set2, ?Intersection)
-%   is true when Intersection is the intersecton of Set1
+%   is true when Intersection is the intersection of Set1
 %   and Set2, provided that Set1 and Set2 are ordered sets.
 
 ord_intersection([], _, []).
@@ -144,7 +144,7 @@ ord_intersection3([Head2|Tail2], Head1, Tail1, 
Intersection) :-
 
 %   ord_intersection(+Set1, +Set2, ?Intersection, ?Difference)
 %   is true when Intersection is the intersection of Set1 and Set2, 
-%   and Differens is Set2 \ Set1 (like in ord_union/4),
+%   and Difference is Set2 \ Set1 (like in ord_union/4),
 %    provided that Set1 and Set2 are ordered sets.
 
 ord_intersection([], Set2, [], Set2).
diff --git a/test/manual/etags/tex-src/texinfo.tex 
b/test/manual/etags/tex-src/texinfo.tex
index cece96f..8d84f51 100644
--- a/test/manual/etags/tex-src/texinfo.tex
+++ b/test/manual/etags/tex-src/texinfo.tex
@@ -1074,7 +1074,7 @@ July\or August\or September\or October\or November\or 
December\fi
 \def\tablez #1#2#3#4#5#6{%
 \aboveenvbreak %
 \begingroup %
-\def\Edescription{\Etable}% Neccessary kludge.
+\def\Edescription{\Etable}% Necessary kludge.
 \let\itemindex=#1%
 \ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
 \ifnum 0#4>0 \tableindent=#4\mil \fi %
@@ -2937,7 +2937,7 @@ July\or August\or September\or October\or November\or 
December\fi
 \setbox0=\hbox{\printednodename}%
 \ifdim \wd0=0pt%
 \def\printednodename{\ignorespaces #1}%
-%%% Uncommment the following line to make the actual chapter or section title
+%%% Uncomment the following line to make the actual chapter or section title
 %%% appear inside the square brackets.
 %\def\printednodename{#1-title}%
 \fi%
diff --git a/test/src/xdisp-tests.el b/test/src/xdisp-tests.el
index 3d0d0f5..95c39da 100644
--- a/test/src/xdisp-tests.el
+++ b/test/src/xdisp-tests.el
@@ -33,19 +33,21 @@
           (lambda ()
             (insert "hello")
             (let ((ol (make-overlay (point) (point)))
+                  (redisplay-skip-initial-frame nil)
                   (max-mini-window-height 1)
                   (text 
"askdjfhaklsjdfhlkasjdfhklasdhflkasdhflkajsdhflkashdfkljahsdlfkjahsdlfkjhasldkfhalskdjfhalskdfhlaksdhfklasdhflkasdhflkasdhflkajsdhklajsdgh"))
-             ;; (save-excursion (insert text))
-             ;; (sit-for 2)
-             ;; (delete-region (point) (point-max))
-             (put-text-property 0 1 'cursor t text)
-             (overlay-put ol 'after-string text)
-             (redisplay 'force)
-             (throw 'result
-                    ;; Make sure we do the see "hello" text.
-                    (prog1 (equal (window-start) (point-min))
-                      ;; (list (window-start) (window-end) (window-width))
-                      (delete-overlay ol)))))
+              ;; (save-excursion (insert text))
+              ;; (sit-for 2)
+              ;; (delete-region (point) (point-max))
+              (put-text-property 0 1 'cursor t text)
+              (overlay-put ol 'after-string text)
+              (let ((executing-kbd-macro nil)) ;Don't skip redisplay
+                (redisplay 'force))
+              (throw 'result
+                     ;; Make sure we do the see "hello" text.
+                     (prog1 (equal (window-start) (point-min))
+                       ;; (list (window-start) (window-end) (window-width))
+                       (delete-overlay ol)))))
         (let ((executing-kbd-macro t)) ;Force real minibuffer in `read-string'.
           (read-string "toto: ")))))))
 



reply via email to

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