emacs-diffs
[Top][All Lists]
Advanced

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

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


From: Andrea Corallo
Subject: feature/native-comp 75e8ee7 1/2: Merge remote-tracking branch 'savannah/master' into HEAD
Date: Sat, 7 Nov 2020 10:23:00 -0500 (EST)

branch: feature/native-comp
commit 75e8ee728fdda91a9eca7f3db24b639e8036f7e4
Merge: 6c271ff e8f5657
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    Merge remote-tracking branch 'savannah/master' into HEAD
---
 admin/charsets/mule-charsets.el                    |    6 +-
 doc/emacs/building.texi                            |   13 +-
 doc/emacs/custom.texi                              |    7 +
 doc/emacs/frames.texi                              |    6 +-
 doc/emacs/mini.texi                                |   11 +
 doc/emacs/mule.texi                                |   20 +
 doc/emacs/search.texi                              |    7 +-
 doc/lispref/files.texi                             |   18 +-
 doc/lispref/functions.texi                         |    2 +
 doc/lispref/minibuf.texi                           |    8 +-
 doc/lispref/streams.texi                           |   14 +
 doc/lispref/tips.texi                              |    5 +-
 doc/misc/erc.texi                                  |   18 +-
 doc/misc/gnus-faq.texi                             |    2 +-
 doc/misc/gnus.texi                                 |  598 ++--
 doc/misc/rcirc.texi                                |    8 +-
 doc/misc/tramp.texi                                |   15 +
 etc/NEWS                                           |  150 +-
 etc/NEWS.27                                        |    8 +-
 etc/schema/schemas.xml                             |   58 +
 lisp/apropos.el                                    |    3 +-
 lisp/autoinsert.el                                 |    5 +-
 lisp/cedet/srecode.el                              |    2 +-
 lisp/cus-edit.el                                   |  155 +-
 lisp/cus-start.el                                  |    1 +
 lisp/custom.el                                     |   31 +-
 lisp/descr-text.el                                 |   13 +-
 lisp/dframe.el                                     |    3 +
 lisp/emacs-lisp/byte-opt.el                        |   22 +-
 lisp/emacs-lisp/cl-extra.el                        |    7 +-
 lisp/emacs-lisp/easy-mmode.el                      |   26 +-
 lisp/emacs-lisp/ert-x.el                           |   19 +-
 lisp/emacs-lisp/lisp-mode.el                       |   13 +-
 lisp/emacs-lisp/package.el                         |    3 +-
 lisp/emacs-lisp/tabulated-list.el                  |   32 +-
 lisp/emacs-lisp/timer-list.el                      |    6 +-
 lisp/emulation/edt-lk201.el                        |    2 +-
 lisp/emulation/edt-pc.el                           |    2 +-
 lisp/emulation/edt-vt100.el                        |    2 +-
 lisp/erc/erc-log.el                                |    2 +-
 lisp/erc/erc-networks.el                           |    6 +-
 lisp/erc/erc.el                                    |    4 +-
 lisp/eshell/em-hist.el                             |   40 +-
 lisp/eshell/em-pred.el                             |   26 +-
 lisp/eshell/em-unix.el                             |   11 +-
 lisp/faces.el                                      |    6 +-
 lisp/files.el                                      |   15 +-
 lisp/finder.el                                     |   16 +-
 lisp/gnus/gnus-group.el                            |   68 +-
 lisp/gnus/gnus-search.el                           | 2137 ++++++++++++++
 lisp/gnus/nnimap.el                                |    2 +-
 lisp/gnus/nnselect.el                              |   91 +-
 lisp/help.el                                       |   25 +-
 lisp/ielm.el                                       |    7 +-
 lisp/international/isearch-x.el                    |   12 +
 lisp/international/mule-cmds.el                    |   71 +-
 lisp/isearch.el                                    |    9 +
 lisp/ldefs-boot.el                                 | 2902 +++++++------------
 lisp/leim/quail/compose.el                         | 2926 ++++++++++++++++++++
 lisp/mail/feedmail.el                              |    2 +-
 lisp/mail/rmail.el                                 |    3 +-
 lisp/minibuffer.el                                 |    2 +-
 lisp/mwheel.el                                     |   32 +-
 lisp/net/ange-ftp.el                               |  131 +-
 lisp/net/eww.el                                    |   21 +-
 lisp/net/mailcap.el                                |   39 +-
 lisp/net/rcirc.el                                  |    2 +-
 lisp/net/secrets.el                                |    4 +-
 lisp/net/tramp-adb.el                              |   40 +-
 lisp/net/tramp-compat.el                           |   27 +
 lisp/net/tramp-crypt.el                            |   20 +-
 lisp/net/tramp-gvfs.el                             |   38 +-
 lisp/net/tramp-integration.el                      |    2 +-
 lisp/net/tramp-rclone.el                           |   14 +-
 lisp/net/tramp-sh.el                               |   33 +-
 lisp/net/tramp-smb.el                              |   76 +-
 lisp/net/tramp-sudoedit.el                         |   30 +-
 lisp/net/tramp.el                                  |   36 +-
 lisp/{gnus => obsolete}/nnir.el                    |    1 +
 lisp/pcmpl-cvs.el                                  |    8 +-
 lisp/pcmpl-rpm.el                                  |   10 +-
 lisp/pcomplete.el                                  |    2 +-
 lisp/play/solitaire.el                             |    8 +-
 lisp/progmodes/cc-engine.el                        |    5 +-
 lisp/progmodes/compile.el                          |   23 +-
 lisp/progmodes/cperl-mode.el                       |    3 +
 lisp/progmodes/elisp-mode.el                       |   13 +-
 lisp/progmodes/etags.el                            |   15 +-
 lisp/progmodes/gdb-mi.el                           |    2 +-
 lisp/progmodes/project.el                          |    4 +-
 lisp/progmodes/python.el                           |    4 +-
 lisp/progmodes/tcl.el                              |   71 +-
 lisp/simple.el                                     |   26 +-
 lisp/subr.el                                       |    4 +-
 lisp/textmodes/bibtex.el                           |  146 +-
 lisp/textmodes/ispell.el                           |   36 +-
 lisp/url/url-dired.el                              |    2 +-
 lisp/url/url-ftp.el                                |    2 +-
 lisp/url/url-irc.el                                |    6 +-
 lisp/vc/smerge-mode.el                             |   38 +-
 lisp/vc/vc-dispatcher.el                           |    4 +-
 lisp/wdired.el                                     |   44 +-
 src/buffer.c                                       |    3 +
 src/character.c                                    |   21 +
 src/character.h                                    |    1 +
 src/dired.c                                        |   45 +-
 src/emacs.c                                        |    2 +-
 src/frame.c                                        |    1 +
 src/ftcrfont.c                                     |    7 +-
 src/image.c                                        |    4 +-
 src/keyboard.c                                     |    8 +-
 src/kqueue.c                                       |    5 +-
 src/lisp.h                                         |    4 +-
 src/minibuf.c                                      |  164 +-
 src/print.c                                        |   54 +-
 src/sysdep.c                                       |    5 +-
 src/term.c                                         |   86 +-
 src/termhooks.h                                    |    2 +-
 src/window.c                                       |    6 +-
 src/xdisp.c                                        |   10 +-
 test/README                                        |    5 +
 test/lisp/custom-tests.el                          |    9 +
 test/lisp/dired-tests.el                           |   76 +
 test/lisp/emacs-lisp/easy-mmode-tests.el           |   16 +
 test/lisp/gnus/gnus-search-tests.el                |   96 +
 test/lisp/help-tests.el                            |   20 +
 test/lisp/net/tramp-tests.el                       |  102 +-
 test/lisp/progmodes/compile-tests.el               |    4 +-
 .../cperl-mode-resources/cperl-bug-30393.pl        |   19 +
 test/lisp/progmodes/cperl-mode-tests.el            |   33 +
 test/lisp/progmodes/gdb-mi-tests.el                |    6 +-
 test/src/keymap-tests.el                           |  141 +-
 test/src/print-tests.el                            |   23 +
 test/src/xdisp-tests.el                            |    4 +-
 134 files changed, 8466 insertions(+), 3242 deletions(-)

diff --git a/admin/charsets/mule-charsets.el b/admin/charsets/mule-charsets.el
index 8355af4..99a8c60 100644
--- a/admin/charsets/mule-charsets.el
+++ b/admin/charsets/mule-charsets.el
@@ -1,4 +1,4 @@
-;; mule-charsets.el -- Generate Mule-original charset maps.
+;; mule-charsets.el -- Generate Mule-original charset maps.  -*- 
lexical-binding: t -*-
 ;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
 ;;   Registration Number H13PRO009
@@ -55,14 +55,14 @@
     ("MULE-lviscii.map" . vietnamese-viscii-lower)
     ("MULE-uviscii.map" . vietnamese-viscii-upper)))
 
-(defconst header
+(defconst mule-charsets-header
   (format
    "# Generated by running admin/charsets/mule-charsets.el in Emacs %d.%d.\n"
    emacs-major-version emacs-minor-version))
 
 (dolist (elt charset-alist)
   (with-temp-buffer
-    (insert header)
+    (insert mule-charsets-header)
     (map-charset-chars 'func (cdr elt) (cdr elt))
     (sort-lines nil (point-min) (point-max))
     (let ((coding-system-for-write 'unix))
diff --git a/doc/emacs/building.texi b/doc/emacs/building.texi
index 3e09f24..91c749a 100644
--- a/doc/emacs/building.texi
+++ b/doc/emacs/building.texi
@@ -1092,13 +1092,12 @@ code that has already executed, in order to examine its 
execution in
 more detail.
 
 @vindex gdb-mi-decode-strings
-  If the file names of the source files are shown with octal escapes,
-set the variable @code{gdb-mi-decode-strings} to the appropriate
-coding-system, most probably @code{utf-8}.  (This is @code{nil} by
-default because GDB may emit octal escapes in situations where
-decoding is undesirable, and also because the program being debugged
-might use an encoding different from the one used to encode non-ASCII
-file names on your system.)
+  By default, source file names and non-ASCII strings in the program
+being debugged are decoded using the default coding-system.  If you
+prefer a different decoding, perhaps because the program being
+debugged uses a different character encoding, set the variable
+@code{gdb-mi-decode-strings} to the appropriate coding-system, or to
+@code{nil} to leave non-ASCII characters as undecoded octal escapes.
 
 @node Breakpoints Buffer
 @subsubsection Breakpoints Buffer
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index 81874a0..fb60caa 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -1582,6 +1582,13 @@ starts with @kbd{@key{ESC} [}.)  If Emacs understands 
your terminal
 type properly, it automatically handles such sequences as single input
 events.
 
+  Key sequences that consist of @kbd{C-c} followed by a letter (upper
+or lower case; @acronym{ASCII} or non-@acronym{ASCII}) are reserved
+for users.  Emacs itself will never bind those key sequences, and
+Emacs extensions should avoid binding them.  In other words, users can
+bind key sequences like @kbd{C-c a} or @kbd{C-c ç} and rely on these
+never being shadowed by other Emacs bindings.
+
 @node Prefix Keymaps
 @subsection Prefix Keymaps
 
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index 1a44d8d..f5e2e8d 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -214,7 +214,11 @@ speed is linked to how fast you move the wheel.  This mode 
also
 supports increasing or decreasing the height of the default face, by
 default bound to scrolling with the @key{Ctrl} modifier.
 
-Emacs also supports horizontal scrolling with the @key{Shift} modifier.
+@vindex mouse-wheel-scroll-amount-horizontal
+Emacs also supports horizontal scrolling with the @key{Shift}
+modifier.  Typing a numeric prefix arg (e.g., @kbd{M-5}) before
+starting horizontal scrolling changes its step value defined
+by the user option @code{mouse-wheel-scroll-amount-horizontal}.
 
 @vindex mouse-wheel-tilt-scroll
 @vindex mouse-wheel-flip-direction
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index 54f046a..ede95a2 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -69,6 +69,17 @@ the minibuffer for a few seconds, or until you type 
something; then
 the minibuffer comes back.  While the minibuffer is in use, Emacs does
 not echo keystrokes.
 
+@vindex minibuffer-follows-selected-frame
+  While using the minibuffer, you can switch to a different frame,
+perhaps to note text you need to enter (@pxref{Frame Commands}).  By
+default, the active minibuffer moves to this new frame.  If you set
+the user option @code{minibuffer-follows-selected-frame} to
+@code{nil}, then the minibuffer stays in the frame where you opened
+it, and you must switch back to that frame in order to complete (or
+abort) the current command.  Note that the effect of the command, when
+you finally finish using the minibuffer, always takes place in the
+frame where you first opened it.
+
 @node Minibuffer File
 @section Minibuffers for File Names
 
diff --git a/doc/emacs/mule.texi b/doc/emacs/mule.texi
index b780190..72ae769 100644
--- a/doc/emacs/mule.texi
+++ b/doc/emacs/mule.texi
@@ -578,6 +578,11 @@ Enable or disable use of the selected input method 
(@code{toggle-input-method}).
 @item C-x @key{RET} C-\ @var{method} @key{RET}
 Select a new input method for the current buffer (@code{set-input-method}).
 
+@item C-x \ @var{method} @key{RET}
+Temporarily enable the selected transient input method ; it will be
+automatically disabled after inserting a single character
+(@code{activate-transient-input-method}).
+
 @item C-h I @var{method} @key{RET}
 @itemx C-h C-\ @var{method} @key{RET}
 @findex describe-input-method
@@ -675,6 +680,21 @@ character.
 input methods.  The list gives information about each input method,
 including the string that stands for it in the mode line.
 
+@findex activate-transient-input-method
+@kindex C-x \
+@anchor{transient input method}
+  Sometimes it can be convenient to enable an input method
+@dfn{transiently}, for inserting only a single character.  Typing
+@kbd{C-x \} (@code{activate-transient-input-method}) will temporarily
+enable an input method, let you insert a single character using the input
+method rules, and then automatically disable the input method.  If no
+transient input method was selected yet, @kbd{C-x \} will prompt you
+for an input method; subsequent invocations of this command will
+enable the selected transient input method.  To select a different
+transient input method, type @kbd{C-u C-x \}.  You can select a
+transient method that is different from the input method which you
+selected using @kbd{C-u C-\}.
+
 @node Coding Systems
 @section Coding Systems
 @cindex coding systems
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
index 91b433f..0612c13 100644
--- a/doc/emacs/search.texi
+++ b/doc/emacs/search.texi
@@ -419,6 +419,7 @@ character into the search string, similar to the usual
 @kindex C-^ @r{(Incremental Search)}
 @findex isearch-toggle-input-method
 @findex isearch-toggle-specified-input-method
+@findex isearch-transient-input-method
 Use an input method (@pxref{Input Methods}).  If an input method is
 enabled in the current buffer when you start the search, the same
 method will be active in the minibuffer when you type the search
@@ -437,7 +438,11 @@ I-search [@var{im}]:
 @noindent
 where @var{im} is the mnemonic of the active input method.  Any input
 method you enable during incremental search remains enabled in the
-current buffer afterwards.
+current buffer afterwards.  Finally, you can temporarily enable a
+transient input method (@pxref{transient input method}) with
+@kbd{C-x \} (@code{isearch-transient-input-method}) to insert a single
+character to the search string using an input method, and
+automatically disable the input method afterwards.
 @end itemize
 
 @kindex M-s o @r{(Incremental Search)}
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index fc66d1c..d49ac42 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -2917,7 +2917,7 @@ or display the names in a buffer using the @code{ls} 
shell command.  In
 the latter case, it can optionally display information about each file,
 depending on the options passed to the @code{ls} command.
 
-@defun directory-files directory &optional full-name match-regexp nosort
+@defun directory-files directory &optional full-name match-regexp nosort count
 This function returns a list of the names of the files in the directory
 @var{directory}.  By default, the list is in alphabetical order.
 
@@ -2937,6 +2937,10 @@ you want the utmost possible speed and don't care what 
order the files
 are processed in.  If the order of processing is visible to the user,
 then the user will probably be happier if you do sort the names.
 
+If @var{count} is non-@code{nil}, the function will return names of
+first @var{count} number of files, or names of all files, whichever
+occurs first.  @var{count} has to be an integer greater than zero.
+
 @example
 @group
 (directory-files "~lewis")
@@ -2950,6 +2954,16 @@ An error is signaled if @var{directory} is not the name 
of a directory
 that can be read.
 @end defun
 
+@defun directory-empty-p directory
+This utility function returns @code{t} if given @var{directory} is an
+accessible directory and it does not contain any files, i.e., is an
+empty directory.  It will ignore @samp{.} and @samp{..} on systems
+that return them as files in a directory.
+
+Symbolic links to directories count as directories.
+See @var{file-symlink-p} to distinguish symlinks.
+@end defun
+
 @cindex recursive traverse of directory tree
 @defun directory-files-recursively directory regexp &optional 
include-directories predicate follow-symlinks
 Return all files under @var{directory} whose names match @var{regexp}.
@@ -2996,7 +3010,7 @@ is called with one argument (the file or directory) and 
should return
 non-@code{nil} if that directory is the one it is looking for.
 @end defun
 
-@defun directory-files-and-attributes directory &optional full-name 
match-regexp nosort id-format
+@defun directory-files-and-attributes directory &optional full-name 
match-regexp nosort id-format count
 This is similar to @code{directory-files} in deciding which files
 to report on and how to report their names.  However, instead
 of returning a list of file names, it returns for each file a
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index e8e2207..222a17f 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -2368,6 +2368,8 @@ argument @var{fileonly} non-@code{nil} means check only 
that
 @var{file} exists, not that it actually defines @var{function}.
 @end defmac
 
+@findex check-declare-file
+@findex check-declare-directory
   To verify that these functions really are declared where
 @code{declare-function} says they are, use @code{check-declare-file}
 to check all @code{declare-function} calls in one source file, or use
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index e5a0233..b6a3434 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -2586,10 +2586,12 @@ The minibuffer command 
@code{next-matching-history-element} (normally
 @node Minibuffer Misc
 @section Minibuffer Miscellany
 
-@defun minibufferp &optional buffer-or-name
+@defun minibufferp &optional buffer-or-name live
 This function returns non-@code{nil} if @var{buffer-or-name} is a
-minibuffer.  If @var{buffer-or-name} is omitted, it tests the current
-buffer.
+minibuffer.  If @var{buffer-or-name} is omitted or @code{nil}, it
+tests the current buffer.  When @var{live} is non-@code{nil}, the
+function returns non-@code{nil} only when @var{buffer-or-name} is an
+active minibuffer.
 @end defun
 
 @defvar minibuffer-setup-hook
diff --git a/doc/lispref/streams.texi b/doc/lispref/streams.texi
index 2cd61ad..0534afb 100644
--- a/doc/lispref/streams.texi
+++ b/doc/lispref/streams.texi
@@ -902,3 +902,17 @@ variable.  The string should hold a @samp{%}-specification 
to be used
 in the C function @code{sprintf}.  For further restrictions on what
 you can use, see the variable's documentation string.
 @end defvar
+
+@defvar print-integers-as-characters
+When this variable is non-@code{nil}, integers that represent
+graphic base characters will be printed using Lisp character syntax
+(@pxref{Basic Char Syntax}). Other numbers are printed the usual way.
+For example, the list @code{(4 65 -1 10)} would be printed as
+@samp{(4 ?A -1 ?\n)}.
+
+More precisely, values printed in character syntax are those
+representing characters belonging to the Unicode general categories
+Letter, Number, Punctuation, Symbol and Private-use
+(@pxref{Character Properties}), as well as the control characters
+having their own escape syntax such as newline.
+@end defvar
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index 3283663..40d01d4 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -283,8 +283,9 @@ implementing such clickable links.
 @cindex keys, reserved
 Don't define @kbd{C-c @var{letter}} as a key in Lisp programs.
 Sequences consisting of @kbd{C-c} and a letter (either upper or lower
-case) are reserved for users; they are the @strong{only} sequences
-reserved for users, so do not block them.
+case; @acronym{ASCII} or non-@acronym{ASCII}) are reserved for users;
+they are the @strong{only} sequences reserved for users, so do not
+block them.
 
 Changing all the Emacs major modes to respect this convention was a
 lot of work; abandoning this convention would make that work go to
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index a352252..cb2e832 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -140,12 +140,12 @@ out.
 
 @item Connect to Freenode
 
-Run @kbd{M-x erc}.  Use ``irc.freenode.net'' as the IRC server, ``6667''
-as the port, and choose a nickname.
+Run @kbd{M-x erc}.  Use ``chat.freenode.net'' as the IRC server,
+``6667'' as the port, and choose a nickname.
 
 @item Get used to the interface
 
-Switch to the ``irc.freenode.net:6667'' buffer, if you're not already
+Switch to the ``chat.freenode.net:6667'' buffer, if you're not already
 there.  You will see first some messages about checking for ident, and
 then a bunch of other messages that describe the current IRC server.
 
@@ -162,9 +162,10 @@ channel.
 
 If you would like to be able to talk with people privately on the
 Freenode network, you will have to ``register'' your nickname.  To do
-so, switch to the ``irc.freenode.net:6667'' buffer and type ``/msg
+so, switch to the ``chat.freenode.net:6667'' buffer and type ``/msg
 NickServ register <password>'', replacing ``<password>'' with your
-desired password.  It should tell you that the operation was successful.
+desired password.  It should tell you that the operation was
+successful.
 
 @item Talk to people in the channel
 
@@ -518,7 +519,7 @@ That is, if called with the following arguments, 
@var{server} and
 parameters.
 
 @example
-(erc :server "irc.freenode.net" :full-name "Harry S Truman")
+(erc :server "chat.freenode.net" :full-name "Harry S Truman")
 @end example
 @end defun
 
@@ -694,7 +695,8 @@ stuff, to the current ERC buffer."
 ;; This causes ERC to connect to the Freenode network upon hitting
 ;; C-c e f.  Replace MYNICK with your IRC nick.
 (global-set-key "\C-cef" (lambda () (interactive)
-                           (erc :server "irc.freenode.net" :port "6667"
+                           (erc :server "chat.freenode.net"
+                                :port "6667"
                                 :nick "MYNICK")))
 
 ;; This causes ERC to connect to the IRC server on your own machine (if
@@ -718,7 +720,7 @@ stuff, to the current ERC buffer."
 (setq erc-autojoin-channels-alist '(("freenode.net" "#emacs" "#erc")))
 
 ;; Rename server buffers to reflect the current network name instead
-;; of SERVER:PORT (e.g., "freenode" instead of "irc.freenode.net:6667").
+;; of SERVER:PORT (e.g., "freenode" instead of "chat.freenode.net:6667").
 ;; This is useful when using a bouncer like ZNC where you have multiple
 ;; connections to the same server.
 (setq erc-rename-buffers t)
diff --git a/doc/misc/gnus-faq.texi b/doc/misc/gnus-faq.texi
index 6e2aeda..adb812f 100644
--- a/doc/misc/gnus-faq.texi
+++ b/doc/misc/gnus-faq.texi
@@ -2144,7 +2144,7 @@ I need real-time help, where to find it?
 
 @subsubheading Answer
 
-Point your IRC client to irc.freenode.net, channel #gnus.
+Point your IRC client to chat.freenode.net, channel #gnus.
 
 @node FAQ 9 - Tuning Gnus
 @subsection Tuning Gnus
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 69ac05d..c6ce129 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -795,19 +795,11 @@ Advanced Scoring
 
 Searching
 
-* nnir::                        Searching with various engines.
+* Search Engines::              Selecting and configuring search engines.
+* Creating Search Groups::      Creating search groups.
+* Search Queries::              Gnus' built-in search syntax.
 * nnmairix::                    Searching with Mairix.
 
-nnir
-
-* What is nnir?::               What does nnir do.
-* Basic Usage::                 How to perform simple searches.
-* Setting up nnir::             How to set up nnir.
-
-Setting up nnir
-
-* Associating Engines::         How to associate engines.
-
 Various
 
 * Process/Prefix::              A convention used by many treatment commands.
@@ -17919,12 +17911,11 @@ Or we may wish to create a group from the results of 
a search query:
 
 @lisp
 (nnselect-specs
- (nnselect-function . nnir-run-query)
+ (nnselect-function . gnus-search-run-query)
  (nnselect-args
-  (nnir-query-spec
-   (query . "FLAGGED")
-   (criteria . ""))
-  (nnir-group-spec
+  (search-query-spec
+   (query . "mark:flag"))
+  (search-group-spec
    ("nnimap:home")
    ("nnimap:work"))))
 @end lisp
@@ -17945,9 +17936,8 @@ find all message that have been received recently from 
certain groups:
                                                    (days-to-time (car args)))))
           (cons 'criteria "")))
         (group-spec (cadr args)))
-    (nnir-run-query (cons 'nnir-specs
-                          (list (cons 'nnir-query-spec query-spec)
-                                (cons 'nnir-group-spec group-spec))))))
+    (gnus-search-run-query (list (cons 'search-query-spec query-spec)
+                                 (cons 'search-group-spec group-spec)))))
 @end lisp
 
 Then the following @code{nnselect-specs}:
@@ -17970,18 +17960,13 @@ parameter of @code{nnselect-rescan} will allow 
automatic refreshing.
 A refresh can always be invoked manually through
 @code{gnus-group-get-new-news-this-group}.
 
-The nnir interface (@pxref{nnir}) includes engines for searching a
-variety of backends.  While the details of each search engine vary,
-the result of an nnir search is always a vector of the sort used by
-the nnselect method, and the results of nnir queries are usually
-viewed using an nnselect group.  Indeed the standard search function
-@code{gnus-group-read-ephemeral-search-group} just creates an
-ephemeral nnselect group with the appropriate nnir query as the
-@code{nnselect-specs}.  nnir originally included both the search
-engines and the glue to connect search results to gnus.  Over time
-this glue evolved into the nnselect method.  The two had a mostly
-amicable parting so that nnselect could pursue its dream of becoming a
-fully functioning backend, but occasional conflicts may still linger.
+Gnus includes engines for searching a variety of backends.  While the
+details of each search engine vary, the result of a search is always a
+vector of the sort used by the nnselect method, and the results of
+queries are usually viewed using an nnselect group.  Indeed the
+standard search function @code{gnus-group-read-ephemeral-search-group}
+just creates an ephemeral nnselect group with the appropriate search
+query as the @code{nnselect-specs}.
 
 @node Combined Groups
 @subsection Combined Groups
@@ -21445,9 +21430,6 @@ four days, Gnus will decay the scores four times, for 
instance.
 @chapter Searching
 @cindex searching
 
-FIXME: A brief comparison of nnir, nnmairix, contrib/gnus-namazu would
-be nice.
-
 Gnus has various ways of finding articles that match certain criteria
 (from a particular author, on a certain subject, etc.).  The simplest
 method is to enter a group and then either "limit" the summary buffer
@@ -21455,50 +21437,166 @@ to the desired articles using the limiting commands 
(@pxref{Limiting}),
 or searching through messages in the summary buffer (@pxref{Searching
 for Articles}).
 
-Limiting commands and summary buffer searching work on subsets of the
-articles already fetched from the servers, and these commands won't
-query the server for additional articles.  While simple, these methods
-are therefore inadequate if the desired articles span multiple groups,
-or if the group is so large that fetching all articles is impractical.
-Many backends (such as imap, notmuch, namazu, etc.) provide their own
-facilities to search for articles directly on the server and Gnus can
-take advantage of these methods.  This chapter describes tools for
-searching groups and servers for articles matching a query.
+Limiting commands and summary buffer searching work on articles
+already fetched from the servers, and these commands won't query the
+server for additional articles.  While simple, these methods are
+therefore inadequate if the desired articles span multiple groups, or
+if the group is so large that fetching all articles is impractical.
+
+It's possible to search a backend more thoroughly using an associated
+search engine.  Some backends come with their own search engine: IMAP
+servers, for instance, do their own searching.  Other backends, for
+example a local @code{nnmaildir} installation, might require the user
+to manually set up some sort of search indexing.  Default associations
+between backends and engines can be defined in
+@code{gnus-search-default-engines}, and engines can also be defined on
+a per-backend basis (@pxref{Search Engines}).
+
+Once the search engines are set up, you can search for messages in
+groups from one or more backends, and show the results in a group.
+The groups that hold search results are created on the nnselect
+backend, and can be either ephemeral or persistent (@pxref{Creating
+Search Groups}).
+
+@vindex gnus-search-use-parsed-queries
+Search queries can be specified one of two ways: either using the
+syntax of the engine responsible for the group you're searching, or
+using Gnus' generalized search syntax.  Set the option
+@code{gnus-search-use-parsed-queries} to a non-nil value to used the
+generalized syntax.  The advantage of this syntax is that, if you have
+multiple backends indexed by different engines, you don't need to
+remember which one you're searching---it's also possible to issue the
+same query against multiple groups, indexed by different engines, at
+the same time.  It also provides a few other conveniences including
+relative date parsing and tie-ins into other Emacs packages.  For
+details on Gnus' query language, see @ref{Search Queries}.
 
 @menu
-* nnir::                     Searching with various engines.
-* nnmairix::                 Searching with Mairix.
+* Search Engines::             Selecting and configuring search engines.
+* Creating Search Groups::     How and where.
+* Search Queries::             Gnus' built-in search syntax.
+* nnmairix::                   Searching with Mairix.
 @end menu
 
-@node nnir
-@section nnir
-@cindex nnir
+@node Search Engines
+@section Search Engines
+@cindex search engines
+@cindex configuring search
+
+In order to search for messages from any given server, that server
+must have a search engine associated with it.  IMAP servers do their
+own searching (theoretically it is possible to use a different engine
+to search an IMAP store, but we don't recommend it), but in all other
+cases the user will have to manually specify an engine to use.  This
+can be done at two different levels: by server type, or on a
+per-server basis.
+
+@vindex gnus-search-default-engines
+The option @code{gnus-search-default-engines} assigns search engines
+by server type.  Its value is an alist mapping symbols indicating a
+server type (e.g.@: @code{nnmaildir} or @code{nnml}) to symbols
+indicating a search engine class.  The built-in search engine symbols
+are:
+
+@itemize
+@item
+@code{gnus-search-imap}
 
-This section describes how to use @code{nnir} to search for articles
-within gnus.
+@item
+@code{gnus-search-find-grep}
 
-@menu
-* What is nnir?::               What does @code{nnir} do?
-* Basic Usage::                 How to perform simple searches.
-* Setting up nnir::             How to set up @code{nnir}.
-@end menu
+@item
+@code{gnus-search-notmuch}
 
-@node What is nnir?
-@subsection What is nnir?
+@item
+@code{gnus-search-swish-e}
 
-@code{nnir} is a Gnus interface to a number of tools for searching
-through mail and news repositories.  Different backends (like
-@code{nnimap} and @code{nntp}) work with different tools (called
-@dfn{engines} in @code{nnir} lingo), but all use the same basic search
-interface.
+@item
+@code{gnus-search-swish++}
+
+@item
+@code{gnus-search-mairix}
+
+@item
+@code{gnus-search-namazu}
+@end itemize
+
+If you need more granularity, you can specify a search engine in the
+server definition, using the @code{gnus-search-engine} key, whether
+that be in your @file{.gnus.el} config file, or through Gnus' server
+buffer.  That might look like:
 
-The @code{nnimap} search engine should work with no configuration.
-Other engines may require a local index that needs to be created and
-maintained outside of Gnus.
+@example
+'(nnmaildir "My Mail"
+   (directory "/home/user/.mail")
+   (gnus-search-engine gnus-search-notmuch
+     (config-file "/home/user/.mail/.notmuch_config")))
+@end example
 
+Search engines like notmuch, namazu and mairix are similar in
+behavior: they use a local executable to create an index of a message
+store, and run command line search queries against those messages,
+and return a list of absolute file names of matching messages.
 
-@node Basic Usage
-@subsection Basic Usage
+These engines have a handful of configuration parameters in common.
+These common parameters are:
+
+@table @code
+@item program
+The name of the executable.  Defaults to the plain
+program name such as @command{notmuch} or @command{namazu}.
+
+@item config-file
+The absolute filename of the configuration file for this search
+engine.
+
+@item remove-prefix
+The directory part to be removed from the filenames returned by the
+search query.  This absolute path should include everything up to the
+top level of the message store.
+
+@item switches
+Additional command-line switches to be fed to the search program.  The
+value of this parameter must be a list of strings, one string per
+switch.
+@end table
+
+The options above can be set in one of two ways: using a customization
+option that is set for all engines of that type, or on a per-engine
+basis in your server configuration files.
+
+The customization options are formed on the pattern
+@code{gnus-search-@var{engine}-@var{parameter}}.  For instance, to use a
+non-standard notmuch program, you might set
+@code{gnus-search-notmuch-program} to @file{/usr/local/bin/notmuch}.
+This would apply to all notmuch engines.  The engines that use these
+options are: ``notmuch'', ``namazu'', ``mairix'', ``swish-e'' and
+``swish++''.
+
+Alternately, the options can be set directly on your Gnus server
+definitions, for instance, in the @code{nnmaildir} example above.
+Note that the server options are part of the @code{gnus-search-engine}
+sexp, and the option symbol and value form a two-element list, not a
+cons cell.
+
+The namazu and swish-e engines each have one additional option,
+specifying where to store their index files.  For namazu it is
+@code{index-directory}, and should be a single directory path.  For
+swish-e it is @code{index-files}, and should be a list of strings.
+
+All indexed search engines come with their own method of updating
+their search indexes to include newly-arrived messages.  Gnus
+currently provides no convenient interface for this, and you'll have
+to manage updates yourself, though this will likely change in the
+future.
+
+Lastly, all search engines accept a @code{raw-queries-p} option.  This
+indicates that engines of this type (or this particular engine) should
+always use raw queries, never parsed (@pxref{Search Queries}).
+
+@node Creating Search Groups
+@section Creating Search Groups
+@cindex creating search groups
 
 In the group buffer typing @kbd{G G} will search the group on the
 current line by calling @code{gnus-group-read-ephemeral-search-group}.
@@ -21525,297 +21623,133 @@ in their original group.  You can @emph{warp} 
(i.e., jump) to the
 original group for the article on the current line with @kbd{A W}, aka
 @code{gnus-warp-to-article}.
 
-You say you want to search more than just the group on the current line?
-No problem: just process-mark the groups you want to search.  You want
-even more?  Calling for an nnir search with the cursor on a topic heading
-will search all the groups under that heading.
+You say you want to search more than just the group on the current
+line?  No problem: just process-mark the groups you want to search.
+You want even more?  Initiating a search with the cursor on a topic
+heading will search all the groups under that topic.
 
+@vindex gnus-search-ignored-newsgroups
 Still not enough?  OK, in the server buffer
-@code{gnus-group-read-ephemeral-search-group} (now bound to @kbd{G})
+@code{gnus-group-read-ephemeral-search-group} (here bound to @kbd{G})
 will search all groups from the server on the current line.  Too much?
 Want to ignore certain groups when searching, like spam groups?  Just
-customize @code{nnir-ignored-newsgroups}.
-
-One more thing: individual search engines may have special search
-features.  You can access these special features by giving a
-prefix-arg to @code{gnus-group-read-ephemeral-search-group}.  If you
-are searching multiple groups with different search engines you will
-be prompted for the special search features for each engine
-separately.
-
-
-@node Setting up nnir
-@subsection Setting up nnir
-
-To set up nnir you may need to do some prep work.  Firstly, you may
-need to configure the search engines you plan to use.  Some of them,
-like @code{imap}, need no special configuration.  Others, like
-@code{namazu} and @code{swish}, require configuration as described
-below.  Secondly, you need to associate a search engine with a server
-or a backend.
-
-If you just want to use the @code{imap} engine to search @code{nnimap}
-servers then you don't have to do anything.  But you might want to
-read the details of the query language anyway.
-
-@menu
-* Associating Engines::                 How to associate engines.
-* The imap Engine::                     Imap configuration and usage.
-* The swish++ Engine::                  Swish++ configuration and usage.
-* The swish-e Engine::                  Swish-e configuration and usage.
-* The namazu Engine::                   Namazu configuration and usage.
-* The notmuch Engine::                  Notmuch configuration and usage.
-* The hyrex Engine::                    Hyrex configuration and usage.
-* Customizations::                      User customizable settings.
-@end menu
-
-@node Associating Engines
-@subsubsection Associating Engines
-
-
-When searching a group, @code{nnir} needs to know which search engine to
-use.  You can configure a given server to use a particular engine by
-setting the server variable @code{nnir-search-engine} to the engine
-name.  For example to use the @code{namazu} engine to search the server
-named @code{home} you can use
-
-@lisp
-(setq gnus-secondary-select-methods
-      '((nnml "home"
-         (nnimap-address "localhost")
-         (nnir-search-engine namazu))))
-@end lisp
-
-Alternatively you might want to use a particular engine for all servers
-with a given backend.  For example, you might want to use the @code{imap}
-engine for all servers using the @code{nnimap} backend.  In this case you
-can customize the variable @code{nnir-method-default-engines}.  This is
-an alist of pairs of the form @code{(backend . engine)}.  By default this
-variable is set to use the @code{imap} engine for all servers using the
-@code{nnimap} backend.  But if you wanted to use @code{namazu} for all
-your servers with an @code{nnimap} backend you could change this to
-
-@lisp
-'((nnimap . namazu))
-@end lisp
-
-@node The imap Engine
-@subsubsection The imap Engine
-
-The @code{imap} engine requires no configuration.
-
-Queries using the @code{imap} engine follow a simple query language.
-The search is always case-insensitive and supports the following
-features (inspired by the Google search input language):
-
-@table @samp
-
-@item Boolean query operators
-AND, OR, and NOT are supported, and parentheses can be used to control
-operator precedence, e.g., (emacs OR xemacs) AND linux.  Note that
-operators must be written with all capital letters to be
-recognized.  Also preceding a term with a @minus{} sign is equivalent
-to NOT term.
-
-@item Automatic AND queries
-If you specify multiple words then they will be treated as an AND
-expression intended to match all components.
-
-@item Phrase searches
-If you wrap your query in double-quotes then it will be treated as a
-literal string.
-
-@end table
-
-By default the whole message will be searched.  The query can be limited
-to a specific part of a message by using a prefix-arg.  After inputting
-the query this will prompt (with completion) for a message part.
-Choices include ``Whole message'', ``Subject'', ``From'', and
-``To''.  Any unrecognized input is interpreted as a header name.  For
-example, typing @kbd{Message-ID} in response to this prompt will limit
-the query to the Message-ID header.
-
-Finally selecting ``Imap'' will interpret the query as a raw
-@acronym{IMAP} search query.  The format of such queries can be found in
-RFC3501.
-
-If you don't like the default of searching whole messages you can
-customize @code{nnir-imap-default-search-key}.  For example to use
-@acronym{IMAP} queries by default
-
-@lisp
-(setq nnir-imap-default-search-key "Imap")
-@end lisp
-
-@node The swish++ Engine
-@subsubsection The swish++ Engine
-
-FIXME: Say something more here.
-
-Documentation for swish++ may be found at the swish++ sourceforge page:
-@uref{http://swishplusplus.sourceforge.net}
-
-@table @code
-
-@item nnir-swish++-program
-The name of the swish++ executable.  Defaults to @code{search}
-
-@item nnir-swish++-additional-switches
-A list of strings to be given as additional arguments to
-swish++.  @code{nil} by default.
-
-@item nnir-swish++-remove-prefix
-The prefix to remove from each file name returned by swish++ in order
-to get a group name.  By default this is @code{$HOME/Mail}.
-
-@end table
-
-@node The swish-e Engine
-@subsubsection The swish-e Engine
-
-FIXME: Say something more here.
-
-@table @code
-
-@item nnir-swish-e-program
-The name of the swish-e search program.  Defaults to @code{swish-e}.
-
-@item nnir-swish-e-additional-switches
-A list of strings to be given as additional arguments to
-swish-e.  @code{nil} by default.
-
-@item nnir-swish-e-remove-prefix
-The prefix to remove from each file name returned by swish-e in order
-to get a group name.  By default this is @code{$HOME/Mail}.
-
-@end table
-
-@node The namazu Engine
-@subsubsection The namazu Engine
-
-Using the namazu engine requires creating and maintaining index files.
-One directory should contain all the index files, and nnir must be told
-where to find them by setting the @code{nnir-namazu-index-directory}
-variable.
-
-To work correctly the @code{nnir-namazu-remove-prefix} variable must
-also be correct.  This is the prefix to remove from each file name
-returned by Namazu in order to get a proper group name (albeit with @samp{/}
-instead of @samp{.}).
-
-For example, suppose that Namazu returns file names such as
-@samp{/home/john/Mail/mail/misc/42}.  For this example, use the
-following setting: @code{(setq nnir-namazu-remove-prefix
-"/home/john/Mail/")} Note the trailing slash.  Removing this prefix from
-the directory gives @samp{mail/misc/42}.  @code{nnir} knows to remove
-the @samp{/42} and to replace @samp{/} with @samp{.} to arrive at the
-correct group name @samp{mail.misc}.
-
-Extra switches may be passed to the namazu search command by setting the
-variable @code{nnir-namazu-additional-switches}.  It is particularly
-important not to pass any switches to namazu that will change the
-output format.  Good switches to use include @option{--sort},
-@option{--ascending}, @option{--early} and @option{--late}.
-Refer to the Namazu documentation for further
-information on valid switches.
-
-Mail must first be indexed with the @command{mknmz} program.  Read the
-documentation for namazu to create a configuration file.  Here is an
-example:
-
-@cartouche
-@example
- package conf;  # Don't remove this line!
-
- # Paths which will not be indexed. Don't use '^' or '$' anchors.
- $EXCLUDE_PATH = "spam|sent";
-
- # Header fields which should be searchable. case-insensitive
- $REMAIN_HEADER = "from|date|message-id|subject";
-
- # Searchable fields. case-insensitive
- $SEARCH_FIELD = "from|date|message-id|subject";
-
- # The max length of a word.
- $WORD_LENG_MAX = 128;
-
- # The max length of a field.
- $MAX_FIELD_LENGTH = 256;
-@end example
-@end cartouche
-
-For this example, mail is stored in the directories @samp{~/Mail/mail/},
-@samp{~/Mail/lists/} and @samp{~/Mail/archive/}, so to index them go to
-the index directory set in @code{nnir-namazu-index-directory} and issue
-the following command:
+customize @code{gnus-search-ignored-newsgroups}: groups matching this
+regexp will not be searched.
+
+@node Search Queries
+@section Search Queries
+@cindex search queries
+@cindex search syntax
+
+Gnus provides an optional unified search syntax that can be used
+across all supported search engines.  This can be convenient in that
+you don't have to remember different search syntaxes; it's also
+possible to mark multiple groups indexed by different engines and
+issue a single search against them.
+
+@vindex gnus-search-use-parsed-queries
+Set the option @code{gnus-search-use-parsed-queries} to non-@code{nil}
+to enable this---it is @code{nil} by default.  Even if it is
+non-@code{nil}, it's still possible to turn off parsing for a class of
+engines or a single engine (@pxref{Search Engines}), or a single
+search by giving a prefix argument to any of the search commands.
+
+The search syntax is fairly simple: keys and values are separated by a
+colon, multi-word values must be quoted, ``and'' is implicit, ``or''
+is explicit, ``not'' will negate the following expression (or keys can
+be prefixed with a ``-''),and parentheses can be used to group logical
+sub-clauses.  For example:
 
 @example
-mknmz --mailnews ~/Mail/archive/ ~/Mail/mail/ ~/Mail/lists/
+(from:john or from:peter) subject:"lunch tomorrow" since:3d
 @end example
 
-For maximum searching efficiency you might want to have a cron job run
-this command periodically, say every four hours.
+The syntax is made to be accepted by a wide range of engines, and thus
+will happily accept most input, valid or not.  Some terms will only be
+meaningful to some engines; other engines will drop them silently.
 
+Key completion is offered on @key{TAB}, but it's also possible to
+enter the query with abbreviated keys, which will be expanded during
+parsing.  If a key is abbreviated to the point of ambiguity (for
+instance, ``s:'' could be ``subject:'' or ``since:''), an error will
+be raised.
 
-@node The notmuch Engine
-@subsubsection The notmuch Engine
-
-@table @code
-@item nnir-notmuch-program
-The name of the notmuch search executable.  Defaults to
-@samp{notmuch}.
-
-@item nnir-notmuch-additional-switches
-A list of strings, to be given as additional arguments to notmuch.
-
-@item nnir-notmuch-remove-prefix
-The prefix to remove from each file name returned by notmuch in order
-to get a group name (albeit with @samp{/} instead of @samp{.}).  This
-is a regular expression.
-
-@item nnir-notmuch-filter-group-names-function
-A function used to transform the names of groups being searched in,
-for use as a ``path:'' search keyword for notmuch.  If nil, the
-default, ``path:'' keywords are not used.  Otherwise, this should be a
-callable which accepts a single group name and returns a transformed
-name as notmuch expects to see it.  In many mail backends, for
-instance, dots in group names must be converted to forward slashes: to
-achieve this, set this option to
-@example
-(lambda (g) (replace-regexp-in-string "\\." "/" g))
-@end example
+Supported keys include all the usual mail headers: ``from'',
+``subject'', ``cc'', etc.  Other keys are:
 
+@table @samp
+@item body
+The body of the message.
+@item recipient
+Equivalent to @samp{to or cc or bcc}.
+@item address
+Equivalent to @samp{from or recipient}.
+@item id
+The keys @samp{message-id} and @samp{id} are equivalent.
+@item mark
+Accepts @samp{flag}, @samp{seen}, @samp{read} or @samp{replied}, or
+any of Gnus' single-letter representations of those marks, e.g.@:
+@samp{mark:R} for @samp{read}.
+@item tag
+This is interpreted as @samp{keyword} for IMAP and @samp{tag} for
+notmuch.
+@item attachment
+Matches the attachment file name.
+@item before
+Date is exclusive; see below for date parsing.
+@item after
+Date is inclusive; can also use @samp{since}.
+@item thread
+Return entire message threads, not just individual messages.
+@item raw
+Do not parse this particular search.
+@item limit
+Limit the results to this many messages.  When searching multiple
+groups this may give undesired results, as the limiting happens before
+sorting.
+@item grep
+Only applicable to ``local index'' engines such as mairix or notmuch.
+On systems with a grep command, additionally filter the results by
+using the value of this term as a grep regexp.
 @end table
 
+@vindex gnus-search-contact-tables
+Elisp-based contact management packages (e.g.@: BBDB or EBDB) can push
+completion tables onto the variable @code{gnus-search-contact-tables},
+allowing auto-completion of contact names and addresses for keys like
+@samp{from} or @samp{to}.
 
-@node The hyrex Engine
-@subsubsection The hyrex Engine
-This engine is obsolete.
+@subsection Date value parsing
 
-@node Customizations
-@subsubsection Customizations
+@vindex gnus-search-date-keys
+Date-type keys (see @code{gnus-search-date-keys}) will accept a wide
+variety of values.  First, anything that @code{parse-time-string} can
+parse is acceptable.  Dates with missing values will be interpreted as
+the most recent occurrence thereof: for instance ``march 03'' is the
+most recent March 3rd.  Lastly, it's possible to use relative
+specifications, such as ``3d'' (three days ago).  This format also accepts
+w, m and y.
 
-@table @code
+When creating persistent search groups, the search is saved unparsed,
+and re-parsed every time the group is updated.  So a permanent search
+group with a query like:
 
-@item nnir-method-default-engines
-Alist of pairs of server backends and search engines.  The default
-association is
 @example
-(nnimap . imap)
+from:"my boss" mark:flag since:1w
 @end example
 
-@item nnir-ignored-newsgroups
-A regexp to match newsgroups in the active file that should be skipped
-when searching all groups on a server.
-
-@end table
-
+would always contain only messages from the past seven days.
 
 @node nnmairix
 @section nnmairix
 
 @cindex mairix
 @cindex nnmairix
+
+This section is now mostly obsolete, as mairix can be used as a regular
+search engine, including persistent search groups, with
+@code{nnselect}.
+
 This paragraph describes how to set up mairix and the back end
 @code{nnmairix} for indexing and searching your mail from within
 Gnus.  Additionally, you can create permanent ``smart'' groups which are
diff --git a/doc/misc/rcirc.texi b/doc/misc/rcirc.texi
index 75f9cc6..2054ca5 100644
--- a/doc/misc/rcirc.texi
+++ b/doc/misc/rcirc.texi
@@ -126,7 +126,7 @@ Here's a typical example:
 @cindex redirection to random servers
 When you connect to the Freenode network
 (@code{http://freenode.net/}), you point your IRC client at the
-server @code{irc.freenode.net}.  That server will redirect your client
+server @code{chat.freenode.net}.  That server will redirect your client
 to a random server on the network, such as @code{zelazny.freenode.net}.
 
 @cindex channel name
@@ -176,7 +176,7 @@ using a different nick.  This will prompt you for four 
things:
 What server do you want to connect to? All the servers in a particular
 network are equivalent.  Some networks use a round-robin system where a
 single server redirects new connections to a random server in the
-network.  @code{irc.freenode.net} is such a server for the Freenode
+network.  @code{chat.freenode.net} is such a server for the Freenode
 network.  Freenode provides the network ``for the Free and Open Source
 Software communities, for not-for-profit organizations and for related
 communities and organizations.''
@@ -211,7 +211,7 @@ Emacs, or join @code{#rcirc}, the channel about 
@code{rcirc}.
 
 @cindex server buffer
 When you have answered these questions, @code{rcirc} will create a server
-buffer, which will be named something like @file{*irc.freenode.net*},
+buffer, which will be named something like @file{*chat.freenode.net*},
 and a channel buffer for each of the channels you wanted to join.
 
 @kindex RET
@@ -482,7 +482,7 @@ Here's an example of how to set it:
 @end example
 
 By default you will be connected to the @code{rcirc} support channel:
-@code{#rcirc} on @code{irc.freenode.net}.
+@code{#rcirc} on @code{chat.freenode.net}.
 
 @table @code
 @item :nick
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index a7339bf..6738ed5 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -4512,6 +4512,21 @@ HISTFILE=/dev/null
 
 
 @item
+Where are remote files trashed to?
+
+Emacs can trash file instead of deleting them, @ref{Misc File Ops,
+Trashing , , emacs}.  Remote files are always trashed to the local
+trash, except remote encrypted files (@pxref{Keeping files
+encrypted}), which are deleted anyway.
+
+If Emacs is configured to use the XDG conventions for the trash
+directory, remote files cannot be restored with the respective tools,
+because those conventions don't specify remote paths.  Such files must
+be restored by moving them manually from
+@file{$@{XDG_DATA_HOME@}/Trash/files/}, if needed.
+
+
+@item
 How to shorten long file names when typing in @value{tramp}?
 
 Adapt several of these approaches to reduce typing.  If the full name
diff --git a/etc/NEWS b/etc/NEWS
index a52122b..8b5acaf 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -89,13 +89,25 @@ useful on systems such as FreeBSD which ships only with 
"etc/termcap".
 This is controlled by the new variable 'scroll-minibuffer-conservatively'.
 
 +++
-** New system for displaying documentation for groups of function.
+** Improved handling of minibuffers on switching frames.
+By default, when you switch to another frame, an active minibuffer now
+moves to the newly selected frame.  Nevertheless, the effect of what
+you type in the minibuffer happens in the frame where the minibuffer
+was first activated, even if it moved to another frame.  An
+alternative behavior is available by customizing
+'minibuffer-follows-selected-frame' to nil.  Here, the minibuffer
+stays in the frame where you first opened it, and you must switch back
+to this frame to continue or abort its command.  The old, somewhat
+unsystematic behavior, which mixed these two is no longer available.
+
++++
+** New system for displaying documentation for groups of functions.
 This can either be used by saying 'M-x shortdoc-display-group' and
 choosing a group, or clicking a button in the *Help* buffers when
 looking at the doc string of a function that belongs to one of these
 groups.
 
-** New var 'redisplay-skip-initial-frame' to enable batch redisplay tests.
+** New variable '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.
 
@@ -133,11 +145,6 @@ characters.  In particular, this significantly improves 
word-wrapping
 for CJK text mixed with Latin text.
 
 ---
-** Improved language transliteration in Malayalam input methods.
-Added a new Mozhi scheme.  The inapplicable ITRANS scheme is now
-deprecated.  Errors in the Inscript method were corrected.
-
----
 ** Rudimentary support for the 'st' terminal emulator.
 Emacs now supports 256 color display on the 'st' terminal emulator.
 
@@ -153,7 +160,9 @@ displays.)
 
 +++
 ** Mouse wheel scrolling with Shift modifier now scrolls horizontally.
-This works in text buffers and over images.
+This works in text buffers and over images.  Typing a numeric prefix arg
+(e.g. 'M-5') before starting horizontal scrolling changes its step value.
+The value is saved in the user option 'mouse-wheel-scroll-amount-horizontal'.
 
 ---
 ** The default value of 'frame-title-format' and 'icon-title-format' has 
changed.
@@ -172,6 +181,12 @@ Previously, this was limited only to NO-BREAK-SPACE and 
hyphen
 characters.  Now it also covers the rest of the non-ASCII Unicode
 space characters.
 
+---
+** Prefer "chat.freenode.net" to "irc.freenode.net".
+"chat.freenode.net" has been the preferred address for connecting to the
+freenode IRC network for years now.  Occurrences of "irc.freenode.net"
+have been replaced with "chat.freenode.net" throughout Emacs.
+
 
 * Editing Changes in Emacs 28.1
 
@@ -326,7 +341,7 @@ and variables.
 ** Archive mode
 
 ---
-*** Archive Mode can now parse .squashfs files.
+*** Archive Mode can now parse ".squashfs" files.
 
 *** Can now modify members of 'ar' archives.
 
@@ -361,7 +376,7 @@ time zones will use a form like "+0100" instead of "CET".
 
 +++
 *** New user option 'dired-switches-in-mode-line'.
-This variable controls how 'ls' switches are displayed in the mode
+This user option controls how 'ls' switches are displayed in the mode
 line, and allows truncating them (to preserve space on the mode line)
 or showing them literally, either instead of, or in addition to,
 displaying "by name" or "by date" sort order.
@@ -451,6 +466,12 @@ tags to be considered as well.
 ** Gnus
 
 +++
+*** New gnus-search library
+A new unified search syntax which can be used across multiple
+supported search engines.  Set 'gnus-search-use-parsed-queries' to
+non-nil to enable.
+
++++
 *** New value for user option 'smiley-style'
 Smileys can now be rendered with emojis instead of small images when
 using the new 'emoji' value in 'smiley-style'.
@@ -587,11 +608,12 @@ authentication mechanism by setting a value for the key 
'smtp-auth'.
 ** Grep
 
 +++
-*** New variable 'grep-match-regexp' matches grep markers to highlight.
-grep emits SGR ANSI escape sequences to color its output.  The new variable
-'grep-match-regexp' holds the regular expression to match the appropriate
-markers in order to provide highlighting in the source buffer.  The variable
-can be customized to accommodate other grep-like tools.
+*** New user option 'grep-match-regexp' matches grep markers to highlight.
+Grep emits SGR ANSI escape sequences to color its output.  The new
+user option 'grep-match-regexp' holds the regular expression to match
+the appropriate markers in order to provide highlighting in the source
+buffer.  The user option can be customized to accommodate other
+grep-like tools.
 
 ---
 *** The 'lgrep' command now ignores directories.
@@ -616,9 +638,31 @@ recorded for the purpose of 'view-lossage'.
 
 ---
 *** The command 'view-lossage' can now be invoked from the menu bar.
-The menu-bar Help menu now has a "Show Recent Inputs" item under the
+The menu bar "Help" menu now has a "Show Recent Inputs" item under the
 "Describe" sub-menu.
 
+** Input methods
+
++++
+*** Emacs now supports "transient" input methods.
+A transient input method is enabled for inserting a single character,
+and is then automatically disabled.  'C-x \' temporarily enables the
+selected transient input method.  Use 'C-u C-x \' to select a
+transient input method (which can be different from the input method
+enabled by 'C-\').  For example, 'C-u C-x \ compose RET' selects the
+'compose' input method; then typing 'C-x \ 1 2' will insert the
+character '½', and disable the 'compose' input method afterwards.
+You can use 'C-x \' in incremental search to insert a single character
+to the search string.
+
+---
+*** New input method 'compose' based on X Multi_key sequences.
+
+---
+*** Improved language transliteration in Malayalam input methods.
+Added a new Mozhi scheme.  The inapplicable ITRANS scheme is now
+deprecated.  Errors in the Inscript method were corrected.
+
 ** Ispell
 
 +++
@@ -679,11 +723,11 @@ doc string functions are accessible to the user through 
the user
 option 'eldoc-documentation-strategy'.
 
 *** New hook 'eldoc-display-functions'.
-This hook is intended to be used for displaying doc string.  The
-functions receive the docstrings composed according to
-`eldoc-documentation-strategy' and are tasked with displaying it to
+This hook is intended to be used for displaying doc strings.  The
+functions receive the doc string composed according to
+'eldoc-documentation-strategy' and are tasked with displaying it to
 the user.  Examples of such functions would use the echo area, a
-separate buffer or a tooltip.
+separate buffer, or a tooltip.
 
 +++
 *** New user option 'eldoc-documentation-strategy'.
@@ -732,6 +776,11 @@ preferred over the eudcb-mab.el backend.
 like cell phones, tablets or cameras.
 
 +++
+*** Trashed remote files are moved to the local trash directory.
+All remote files, which are trashed, are moved to the local trash
+directory.  Except remote encrypted files, which are always deleted.
+
++++
 *** New command 'tramp-crypt-add-directory'.
 This command marks a remote directory to contain only encrypted files.
 See the "(tramp) Keeping files encrypted" node of the Tramp manual for
@@ -806,6 +855,11 @@ Now GDB only uses one source window to display source file 
by default.
 Customize 'gdb-max-source-window-count' to use more than one window.
 Control source file display by 'gdb-display-source-buffer-action'.
 
++++
+*** The default value of gdb-mi-decode-strings is now t.
+This means that the default coding-system is now used to decode strings
+and source file names from GDB.
+
 ** Gravatar
 
 ---
@@ -1207,27 +1261,26 @@ window after starting).  This variable defaults to nil.
 ---
 *** The 'editable-list' widget now supports moving items up and down.
 You can now move items up and down by deleting and then reinserting
-them, using the DEL and INS buttons respectively.  This is useful in
-Custom buffers, for example, to change the order of the elements in a
-list.
+them, using the 'DEL' and 'INS' buttons respectively.  This is useful
+in Custom buffers, for example, to change the order of the elements in
+a list.
 
 ** Diff
 
 ---
 *** New 'diff-mode' font locking face 'diff-error'.
-This face is used for error messages from diff.
+This face is used for error messages from 'diff'.
 
 +++
 *** New command 'diff-refresh-hunk'.
 This new command (bound to 'C-c C-l') regenerates the current hunk.
 
-
 ** Miscellaneous
 
 +++
 *** 'format-seconds' can now be used for sub-second times.
 The new optional "," parameter has been added, and
-(format-seconds "%mm %,1ss" 66.4) will now result in "1m 6.4s".
+'(format-seconds "%mm %,1ss" 66.4)' will now result in "1m 6.4s".
 
 ---
 *** 'global-display-fill-column-indicator-mode' skips some buffers.
@@ -1253,7 +1306,7 @@ visited errors, so you can have an overview what errors 
were already visited.
 
 +++
 *** New user option 'tab-first-completion'.
-If 'tab-always-indent' is 'complete', this new option can be used to
+If 'tab-always-indent' is 'complete', this new user option can be used to
 further tweak whether to complete or indent.
 
 ---
@@ -1383,10 +1436,10 @@ horizontal movements now stop at the edge of the board.
 
 ---
 *** TTY menu navigation is now supported in 'xterm-mouse-mode'.
-TTY menus support mouse navigation and selection when xterm-mouse-mode
+TTY menus support mouse navigation and selection when 'xterm-mouse-mode'
 is active.  When run on a terminal, clicking on the menu bar with the
 mouse now pops up a TTY menu by default instead of running the command
-'tmm-menubar'.  To restore the old behavior, set the variable
+'tmm-menubar'.  To restore the old behavior, set the user option
 'tty-menu-open-use-tmm' to non-nil.
 
 ** xwidget-webkit mode
@@ -1467,10 +1520,10 @@ type symbols.  Both functions propagate D-Bus errors.
 *** D-Bus errors, which have been converted from incoming D-Bus error
 messages, contain the error name of that message now.
 
----
++++
 *** D-Bus messages can be monitored with new function 'dbus-register-monitor'.
 
----
++++
 *** D-Bus events have changed their internal structure.
 They carry now the destination and the error-name of an event.  They
 also keep the type information of their arguments. Use the
@@ -1575,7 +1628,7 @@ This is no longer supported, and setting this variable 
has no effect.
 Use macro 'with-current-buffer-window' with action alist entry 'body-function'.
 
 +++
-** `byte-compile-file' optional argument LOAD is now obsolete.
+** 'byte-compile-file' optional argument LOAD is now obsolete.
 To load the file after byte-compiling, add a call to 'load' from Lisp
 or use 'M-x emacs-lisp-byte-compile-and-load' interactively.
 
@@ -1664,7 +1717,7 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 * Lisp Changes in Emacs 28.1
 
 +++
-** 'define-globalized-minor-mode' now takes a :predicate parameter.
+** 'define-globalized-minor-mode' now takes a ':predicate' parameter.
 This can be used to control which major modes the minor mode should be
 used in.
 
@@ -1675,38 +1728,50 @@ argument 'ellipsis', will now indicate truncation using 
'…' when
 the selected frame can display it, and using "..." otherwise.
 
 +++
-*** New command 'make-directory-autoloads'.
+** 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
 the dynamically bound 'generated-autoload-file' variable, the output
 file is now a explicit parameter.
 
 +++
-*** New function 'string-search'.
+** New function 'string-search'.
 This function takes two string parameters and returns the position of
 the first instance of the former string in the latter.
 
 +++
-*** New function 'string-replace'.
+** New function 'string-replace'.
 This function works along the line of 'replace-regexp-in-string', but
 matching on strings instead of regexps, and does not change the global
 match state.
 
 +++
-*** New function 'process-lines-ignore-status'.
+** New function 'process-lines-ignore-status'.
 This is like 'process-lines', but does not signal an error if the
 return status is non-zero.  'process-lines-handling-status' has also
 been added, and takes a callback to handle the return status.
 
 ---
-*** 'ascii' is now a coding system alias for 'us-ascii'.
+** 'ascii' is now a coding system alias for 'us-ascii'.
 
 +++
-*** New function 'file-backup-file-names'.
+** New function 'file-backup-file-names'.
 This function returns the list of file names of all the backup files
 of its file argument.
 
 +++
+** New utility function 'directory-empty-p'.
+This predicate tests whether a given filename is an accessible
+directory and whether it contains no other directories or files.
+
++++
+** 'directory-files' now takes an additional COUNT parameter.
+The parameter makes 'directory-files' return COUNT first file names
+from a directory.  If MATCH is also given, the function will return
+first COUNT file names that match the expression.  The same COUNT
+parameter has been added to 'directory-files-and-attributes'.
+
++++
 ** The 'count-lines' function now takes an optional parameter to
 ignore invisible lines.
 
@@ -1833,7 +1898,7 @@ menu handling.
 It is meant as an (experimental) aid for converting Emacs Lisp code
 to lexical binding, where dynamic (special) variables bound in one
 file can affect code in another.  For details, see the manual section
-'(Elisp) Converting to Lexical Binding'.
+"(Elisp) Converting to Lexical Binding".
 
 ---
 ** 'unload-feature' now also tries to undo additions to buffer-local hooks.
@@ -1843,6 +1908,11 @@ file can affect code in another.  For details, see the 
manual section
 'replace-regexp-in-string', 'catch', 'throw', 'error', 'signal'
 and 'play-sound-file'.
 
++++
+** New variable 'print-integers-as-characters' modifies integer printing.
+If this variable is non-nil, character syntax is used for printing
+numbers when this makes sense, such as '?A' for 65.
+
 
 * Changes in Emacs 28.1 on Non-Free Operating Systems
 
diff --git a/etc/NEWS.27 b/etc/NEWS.27
index f0b5dd0..61f9c0e 100644
--- a/etc/NEWS.27
+++ b/etc/NEWS.27
@@ -35,10 +35,10 @@ This is a bug-fix release with no new features.
 
 * Lisp Changes in Emacs 27.2
 
-*** The behavior of the user option 'resize-mini-frames' has changed.
-If set to non-nil, resize the mini frame using the new function
-'fit-mini-frame-to-buffer' which won't skip leading or trailing empty
-lines of the buffer.
+** The behavior of the user option 'resize-mini-frames' has changed.
+If set to a non-nil value which isn't a function, resize the mini
+frame using the new function 'fit-mini-frame-to-buffer' which won't
+skip leading or trailing empty lines of the buffer.
 
 
 * Editing Changes in Emacs 27.2
diff --git a/etc/schema/schemas.xml b/etc/schema/schemas.xml
index f1e0ed7..40175b0 100644
--- a/etc/schema/schemas.xml
+++ b/etc/schema/schemas.xml
@@ -1,7 +1,65 @@
 <?xml version="1.0"?>
+<!-- Copyright (C) 2003-2004, 2007-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>. -->
+
 <locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0";>
+  <transformURI fromPattern="*.xml" toPattern="*.rnc"/>
+
+  <uri pattern="*.xsl" typeId="XSLT"/>
+  <uri pattern="*.html" typeId="XHTML"/>
+  <uri pattern="*.rng" typeId="RELAX NG"/>
+  <uri pattern="*.rdf" typeId="RDF"/>
+  <uri pattern="*.dbk" typeId="DocBook"/>
+
+  <namespace ns="http://www.w3.org/1999/XSL/Transform"; typeId="XSLT"/>
+  <namespace ns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; typeId="RDF"/>
+  <namespace ns="http://www.w3.org/1999/xhtml"; typeId="XHTML"/>
+  <namespace ns="http://relaxng.org/ns/structure/1.0"; typeId="RELAX NG"/>
+  <namespace ns="http://thaiopensource.com/ns/locating-rules/1.0";
+            uri="locate.rnc"/>
+
+  <documentElement localName="stylesheet" typeId="XSLT"/>
+  <documentElement prefix="xsl" localName="transform" typeId="XSLT"/>
+
+  <documentElement localName="html" typeId="XHTML"/>
+
+  <documentElement localName="grammar" typeId="RELAX NG"/>
+
+  <documentElement prefix="" localName="article" typeId="DocBook"/>
+  <documentElement prefix="" localName="book" typeId="DocBook"/>
+  <documentElement prefix="" localName="chapter" typeId="DocBook"/>
+  <documentElement prefix="" localName="part" typeId="DocBook"/>
+  <documentElement prefix="" localName="refentry" typeId="DocBook"/>
+  <documentElement prefix="" localName="section" typeId="DocBook"/>
+
+  <documentElement localName="RDF" typeId="RDF"/>
+  <documentElement prefix="rdf" typeId="RDF"/>
+
+  <documentElement localName="locatingRules" uri="locate.rnc"/>
+
+  <typeId id="XSLT" uri="xslt.rnc"/>
+  <typeId id="RELAX NG" uri="relaxng.rnc"/>
+  <typeId id="XHTML" uri="xhtml.rnc"/>
+  <typeId id="DocBook" uri="docbook.rnc"/>
+  <typeId id="RDF" uri="rdfxml.rnc"/>
+
   <documentElement prefix="office" typeId="OpenDocument"/>
   <documentElement prefix="manifest" localName="manifest" typeId="OpenDocument 
Manifest"/>
   <typeId id="OpenDocument" uri="od-schema-v1.2-os.rnc"/>
   <typeId id="OpenDocument Manifest" uri="od-manifest-schema-v1.2-os.rnc"/>
+
 </locatingRules>
diff --git a/lisp/apropos.el b/lisp/apropos.el
index e7e8955..9debdfb 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -27,8 +27,7 @@
 
 ;; The ideas for this package were derived from the C code in
 ;; src/keymap.c and elsewhere.  The functions in this file should
-;; always be byte-compiled for speed.  Someone should rewrite this in
-;; C (as part of src/keymap.c) for speed.
+;; always be byte-compiled for speed.
 
 ;; The idea for super-apropos is based on the original implementation
 ;; by Lynn Slater <lrs@esl.com>.
diff --git a/lisp/autoinsert.el b/lisp/autoinsert.el
index 4af3d63..9bb485f 100644
--- a/lisp/autoinsert.el
+++ b/lisp/autoinsert.el
@@ -264,7 +264,7 @@ Foundation Web site at 
@url{https://www.gnu.org/licenses/fdl.html}.
 @end quotation
 
 The document was typeset with
-@uref{http://www.texinfo.org/, GNU Texinfo}.
+@uref{https://www.gnu.org/software/texinfo/, GNU Texinfo}.
 
 @end copying
 
@@ -315,8 +315,7 @@ The document was typeset with
 @printindex cp
 
 @bye
-
-@c " (file-name-nondirectory (buffer-file-name)) " ends here\n"))
+"))
   "A list specifying text to insert by default into a new file.
 Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . 
ACTION).
 CONDITION may be a regexp that must match the new file's name, or it may be
diff --git a/lisp/cedet/srecode.el b/lisp/cedet/srecode.el
index eb7af1c..79c8aff 100644
--- a/lisp/cedet/srecode.el
+++ b/lisp/cedet/srecode.el
@@ -1,4 +1,4 @@
-;;; srecode.el --- Semantic buffer evaluator.
+;;; srecode.el --- Semantic buffer evaluator.  -*- lexical-binding: t -*-
 
 ;;; Copyright (C) 2005, 2007-2020 Free Software Foundation, Inc.
 
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 769a69a..d1077d3 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -730,48 +730,86 @@ groups after non-groups, if nil do not order groups at 
all."
 ;; `custom-buffer-create-internal' if `custom-buffer-verbose-help' is non-nil.
 
 (defvar custom-commands
-  '((" Apply " Custom-set t
-     "Apply settings (for the current session only)."
-     "index"
-     "Apply")
-    (" Apply and Save " Custom-save
-     (or custom-file user-init-file)
-     "Apply settings and save for future sessions."
-     "save"
-     "Save")
+  '((" Apply " Custom-set t "Apply settings (for the current session only)."
+     "index" "Apply" (modified))
+    (" Apply and Save " Custom-save (or custom-file user-init-file)
+     "Apply settings and save for future sessions." "save" "Save"
+     (modified set changed rogue))
     (" Undo Edits " Custom-reset-current t
      "Restore customization buffer to reflect existing settings."
-     "refresh"
-     "Undo")
+     "refresh" "Undo" (modified))
     (" Reset Customizations " Custom-reset-saved t
-     "Undo any settings applied only for the current session."
-     "undo"
-     "Reset")
+     "Undo any settings applied only for the current session." "undo" "Reset"
+     (modified set changed rogue))
     (" Erase Customizations " Custom-reset-standard
      (or custom-file user-init-file)
-     "Un-customize settings in this and future sessions."
-     "delete"
-     "Uncustomize")
-    (" Help for Customize " Custom-help t
-     "Get help for using Customize."
-     "help"
-     "Help")
-    (" Exit " Custom-buffer-done t "Exit Customize." "exit" "Exit")))
+     "Un-customize settings in this and future sessions." "delete" 
"Uncustomize"
+     (modified set changed rogue saved))
+    (" Help for Customize " Custom-help t "Get help for using Customize."
+     "help" "Help" t)
+    (" Exit " Custom-buffer-done t "Exit Customize." "exit" "Exit" t))
+  "Alist of specifications for Customize menu items, tool bar icons and 
buttons.
+Each member has the format (TAG COMMAND VISIBLE HELP ICON LABEL ENABLE).
+TAG is a string, used as the :tag property of a widget.
+COMMAND is the command that the item or button runs.
+VISIBLE should be a form, suitable to pass as the :visible property for menu
+or tool bar items.
+HELP should be a string that can be used as the help echo property for tooltips
+and the like.
+ICON is a string that names the image to use for the tool bar item, like in the
+first argument of `tool-bar-local-item'.
+LABEL should be a string, used as the name of the menu items.
+ENABLE should be a list of custom states or t.  When ENABLE is t, the item is
+always enabled.  Otherwise, it is enabled only if at least one option displayed
+in the Custom buffer is in a state present in ENABLE.")
+
+(defvar-local custom-command-buttons nil
+  "A list that holds the buttons that act on all settings in a Custom buffer.
+`custom-buffer-create-internal' adds the buttons to this list.
+Changes in the state of the custom options should notify the buttons via the
+:notify property, so buttons can be enabled/disabled correctly at all times.")
 
 (defun Custom-help ()
   "Read the node on Easy Customization in the Emacs manual."
   (interactive)
   (info "(emacs)Easy Customization"))
 
-(defvar custom-reset-menu
-  '(("Undo Edits in Customization Buffer" . Custom-reset-current)
-    ("Revert This Session's Customizations" . Custom-reset-saved)
-    ("Erase Customizations" . Custom-reset-standard))
-  "Alist of actions for the `Reset' button.
+(defvar custom-reset-menu nil
+  "If non-nil, an alist of actions for the `Reset' button.
+
+This variable is kept for backward compatibility reasons, please use
+`custom-reset-extended-menu' instead.
+
 The key is a string containing the name of the action, the value is a
 Lisp function taking the widget as an element which will be called
 when the action is chosen.")
 
+(defvar custom-reset-extended-menu
+  (let ((map (make-sparse-keymap)))
+    (define-key-after map [Custom-reset-current]
+      '(menu-item "Undo Edits in Customization Buffer" Custom-reset-current
+                  :enable (seq-some (lambda (option)
+                                      (eq (widget-get option :custom-state)
+                                          'modified))
+                                    custom-options)))
+    (define-key-after map [Custom-reset-saved]
+      '(menu-item "Revert This Session's Customizations" Custom-reset-saved
+                  :enable (seq-some (lambda (option)
+                                      (memq (widget-get option :custom-state)
+                                          '(modified set changed rogue)))
+                                    custom-options)))
+    (when (or custom-file user-init-file)
+      (define-key-after map [Custom-reset-standard]
+        '(menu-item "Erase Customizations" Custom-reset-standard
+                    :enable (seq-some
+                             (lambda (option)
+                               (memq (widget-get option :custom-state)
+                                     '(modified set changed rogue saved)))
+                             custom-options))))
+    map)
+  "A menu for the \"Revert...\" button.
+Used in `custom-reset' to show a menu to the user.")
+
 (defvar custom-options nil
   "Customization widgets in the current buffer.")
 
@@ -821,7 +859,8 @@ setting was merely edited before, this sets it then saves 
it."
   "Select item from reset menu."
   (let* ((completion-ignore-case t)
         (answer (widget-choose "Reset settings"
-                               custom-reset-menu
+                                (or custom-reset-menu
+                                    custom-reset-extended-menu)
                                event)))
     (if answer
        (funcall answer))))
@@ -1555,7 +1594,10 @@ that option.
 DESCRIPTION is unused."
   (pop-to-buffer-same-window
    (custom-get-fresh-buffer (or name "*Customization*")))
-  (custom-buffer-create-internal options))
+  (custom-buffer-create-internal options)
+  ;; Notify the command buttons, to correctly enable/disable them.
+  (dolist (btn custom-command-buttons)
+    (widget-apply btn :notify)))
 
 ;;;###autoload
 (defun custom-buffer-create-other-window (options &optional name _description)
@@ -1672,11 +1714,24 @@ or a regular expression.")
     (if custom-buffer-verbose-help
        (widget-insert "
 Operate on all settings in this buffer:\n"))
-    (let ((button (lambda (tag action active help _icon _label)
+    (let ((button (lambda (tag action visible help _icon _label active)
                    (widget-insert " ")
-                   (if (eval active)
-                       (widget-create 'push-button :tag tag
-                                      :help-echo help :action action))))
+                    (if (eval visible)
+                        (push (widget-create
+                               'push-button :tag tag
+                               :help-echo help :action action
+                               :notify
+                               (lambda (widget)
+                                 (when (listp active)
+                                   (if (seq-some
+                                        (lambda (widget)
+                                          (memq
+                                           (widget-get widget :custom-state)
+                                           active))
+                                        custom-options)
+                                       (widget-apply widget :activate)
+                                     (widget-apply widget :deactivate)))))
+                              custom-command-buttons))))
          (commands custom-commands))
       (if custom-reset-button-menu
          (progn
@@ -2215,7 +2270,11 @@ and `face'."
   (let ((state (widget-get widget :custom-state)))
     (unless (eq state 'modified)
       (unless (memq state '(nil unknown hidden))
-       (widget-put widget :custom-state 'modified))
+       (widget-put widget :custom-state 'modified)
+        ;; Tell our buttons and the tool bar that we changed the widget's 
state.
+        (force-mode-line-update)
+        (dolist (btn custom-command-buttons)
+          (widget-apply btn :notify)))
       ;; Update the status text (usually from "STANDARD" to "EDITED
       ;; bla bla" in the buffer after the command has run.  Otherwise
       ;; commands like `M-u' (that work on a region in the buffer)
@@ -2254,7 +2313,10 @@ and `face'."
               (custom-group-state-update widget)))
            (t
             (setq widget nil)))))
-  (widget-setup))
+  (widget-setup)
+  (force-mode-line-update)
+  (dolist (btn custom-command-buttons)
+    (widget-apply btn :notify)))
 
 (defun custom-show (widget value)
   "Non-nil if WIDGET should be shown with VALUE by default."
@@ -3931,7 +3993,12 @@ Optional EVENT is the location for the menu."
         (custom-face-mark-to-save widget)
       ;; The user is working on only a selected terminal type;
       ;; make sure we save the entire spec to `custom-file'. (Bug #40866)
+      ;; If recreating a widget that may have been edited by the user, remember
+      ;; to always save the edited value into the :shown-value property, so
+      ;; we use that value for the recreated widget.  (Bug#44331)
+      (widget-put widget :shown-value (custom-face-widget-to-spec widget))
       (custom-face-edit-all widget)
+      (widget-put widget :shown-value nil) ; Reset it after we used it.
       (custom-face-mark-to-save widget)
       (if (eq form 'selected)
           (custom-face-edit-selected widget)
@@ -4016,7 +4083,7 @@ restoring it to the state of a face that has never been 
customized."
 
 (define-widget 'face 'symbol
   "A Lisp face name (with sample)."
-  :format "%f %{%t%}: (%{sample%}) %v"
+  :format "%{%t%}: %f (%{sample%}) %v"
   :tag "Face"
   :value 'default
   :sample-face-get 'widget-face-sample-face-get
@@ -4940,9 +5007,19 @@ The format is suitable for use with `easy-menu-define'."
         (mapcar (lambda (arg)
                   (let ((tag     (nth 0 arg))
                         (command (nth 1 arg))
-                        (active  (nth 2 arg))
-                        (help    (nth 3 arg)))
-                    (vector tag command :active (eval active) :help help)))
+                         (visible (nth 2 arg))
+                         (help    (nth 3 arg))
+                         (active  (nth 6 arg)))
+                     (vector tag command :visible (eval visible)
+                             :active
+                             `(or (eq t ',active)
+                                  (seq-some ,(lambda (widget)
+                                               (memq
+                                                (widget-get widget
+                                                            :custom-state)
+                                                active))
+                                            custom-options))
+                             :help help)))
                 custom-commands)))
 
 (defvar tool-bar-map)
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 6927b6d..04fb1dc 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -394,6 +394,7 @@ Leaving \"Default\" unchecked is equivalent with specifying 
a default of
             ;;                         (directory :format "%v"))))
             (load-prefer-newer lisp boolean "24.4")
             ;; minibuf.c
+             (minibuffer-follows-selected-frame minibuffer boolean "28.1")
             (enable-recursive-minibuffers minibuffer boolean)
             (history-length minibuffer
                             (choice (const :tag "Infinite" t) integer)
diff --git a/lisp/custom.el b/lisp/custom.el
index cc445fe..3f1e8ca 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -1010,7 +1010,10 @@ COMMENT is a comment string about SYMBOL."
               set)
          (when requests
            (put symbol 'custom-requests requests)
-            (mapc #'require requests))
+            ;; Load any libraries that the setting has specified as
+            ;; being required, but don't error out if the package has
+            ;; been removed.
+            (mapc (lambda (lib) (require lib nil t)) requests))
           (setq set (or (get symbol 'custom-set) #'custom-set-default))
          (put symbol 'saved-value (list value))
          (put symbol 'saved-variable-comment comment)
@@ -1382,8 +1385,30 @@ function runs.  To disable other themes, use 
`disable-theme'."
     ;; Loop through theme settings, recalculating vars/faces.
     (dolist (s settings)
       (let* ((prop (car s))
-            (symbol (cadr s)))
-        (custom-push-theme prop symbol theme 'set (nth 3 s))
+             (symbol (cadr s))
+             (spec-list (get symbol prop))
+             (sv (get symbol 'standard-value))
+             (val (and (boundp symbol) (symbol-value symbol))))
+        ;; We can't call `custom-push-theme' when enabling the theme: it's not
+        ;; that the theme settings have changed, it's just that we want to
+        ;; enable those settings.  But we might need to save a user setting
+        ;; outside of Customize, in order to get back to it when disabling
+        ;; the theme, just like in `custom-push-theme'.
+        (when (and (custom--should-apply-setting theme)
+                   ;; Only do it for variables; for faces, using
+                   ;; `face-new-frame-defaults' is enough.
+                   (eq prop 'theme-value)
+                   (boundp symbol)
+                   (not (or spec-list
+                            ;; Only if the current value is different from
+                            ;; the standard value.
+                            (and sv (equal (eval (car sv)) val))
+                            ;; And only if the changed value is different
+                            ;; from the new value under the user theme.
+                            (and (eq theme 'user)
+                                 (equal (custom-quote val) (nth 3 s))))))
+          (setq spec-list `((changed ,(custom-quote val)))))
+        (put symbol prop (cons (cddr s) (assq-delete-all theme spec-list)))
        (cond
         ((eq prop 'theme-face)
          (custom-theme-recalc-face symbol))
diff --git a/lisp/descr-text.el b/lisp/descr-text.el
index ec9a968..677db2f 100644
--- a/lisp/descr-text.el
+++ b/lisp/descr-text.el
@@ -54,10 +54,12 @@
             (<= (length pp) (- (window-width) (current-column))))
        (insert pp)
       (insert-text-button
-       "[Show]" 'action (lambda (&rest _ignore)
-                          (with-output-to-temp-buffer
-                              "*Pp Eval Output*"
-                            (princ pp)))
+       "[Show]"
+       'follow-link t
+       'action (lambda (&rest _ignore)
+                 (with-output-to-temp-buffer
+                     "*Pp Eval Output*"
+                   (princ pp)))
        'help-echo "mouse-2, RET: pretty print value in another buffer"))))
 
 (defun describe-property-list (properties)
@@ -687,7 +689,8 @@ The character information includes:
                                   (save-excursion (goto-char pos)
                                                   (looking-at-p "[ \t]+$")))
                              'trailing-whitespace)
-                            ((and nobreak-char-display char (eq char '#xa0))
+                            ((and nobreak-char-display char
+                                  (eq (get-char-code-property char 
'general-category) 'Zs))
                              'nobreak-space)
                             ((and nobreak-char-display char
                                  (memq char '(#xad #x2010 #x2011)))
diff --git a/lisp/dframe.el b/lisp/dframe.el
index efe2bc5..417477b 100644
--- a/lisp/dframe.el
+++ b/lisp/dframe.el
@@ -287,6 +287,9 @@ CREATE-HOOK is a hook to run after creating a frame."
       ;; Correct use of `temp-buffer-show-function': Bob Weiner
       (if (and (boundp 'temp-buffer-show-hook)
               (boundp 'temp-buffer-show-function))
+         ;; FIXME: Doesn't this get us into an inf-loop when the
+          ;; `temp-buffer-show-function' runs `temp-buffer-show-hook'
+          ;; (as is normally the case)?
          (progn (make-local-variable 'temp-buffer-show-hook)
                 (setq temp-buffer-show-hook temp-buffer-show-function)))
       (make-local-variable 'temp-buffer-show-function)
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 1dc83dd..530a086 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -1147,12 +1147,14 @@
 (let ((side-effect-free-fns
        '(% * + - / /= 1+ 1- < <= = > >= abs acos append aref ash asin atan
         assq
+         bool-vector-count-consecutive bool-vector-count-population
+         bool-vector-subsetp
         boundp buffer-file-name buffer-local-variables buffer-modified-p
         buffer-substring byte-code-function-p
         capitalize car-less-than-car car cdr ceiling char-after char-before
         char-equal char-to-string char-width compare-strings
         compare-window-configurations concat coordinates-in-window-p
-        copy-alist copy-sequence copy-marker cos count-lines
+        copy-alist copy-sequence copy-marker copysign cos count-lines
         current-time-string current-time-zone
         decode-char
         decode-time default-boundp default-value documentation downcase
@@ -1165,22 +1167,22 @@
         frame-visible-p fround ftruncate
         get gethash get-buffer get-buffer-window getenv get-file-buffer
         hash-table-count
-        int-to-string intern-soft
+        int-to-string intern-soft isnan
         keymap-parent
-        length line-beginning-position line-end-position
+         lax-plist-get ldexp length line-beginning-position line-end-position
         local-variable-if-set-p local-variable-p locale-info
         log log10 logand logb logcount logior lognot logxor lsh
         make-byte-code make-list make-string make-symbol marker-buffer max
-        member memq min minibuffer-selected-window minibuffer-window
+        member memq memql min minibuffer-selected-window minibuffer-window
         mod multibyte-char-to-unibyte next-window nth nthcdr number-to-string
         parse-colon-path plist-get plist-member
         prefix-numeric-value previous-window prin1-to-string propertize
         degrees-to-radians
-        radians-to-degrees rassq rassoc read-from-string regexp-quote
-        region-beginning region-end reverse round
+        radians-to-degrees rassq rassoc read-from-string regexp-opt
+         regexp-quote region-beginning region-end reverse round
         sin sqrt string string< string= string-equal string-lessp
          string-search string-to-char
-        string-to-number substring
+        string-to-number string-to-syntax substring
         sxhash sxhash-equal sxhash-eq sxhash-eql
         symbol-function symbol-name symbol-plist symbol-value 
string-make-unibyte
         string-make-multibyte string-as-multibyte string-as-unibyte
@@ -1230,7 +1232,7 @@
         standard-case-table standard-syntax-table stringp subrp symbolp
         syntax-table syntax-table-p
         this-command-keys this-command-keys-vector this-single-command-keys
-        this-single-command-raw-keys
+        this-single-command-raw-keys type-of
         user-real-login-name user-real-uid user-uid
         vector vectorp visible-frame-list
         wholenump window-configuration-p window-live-p
@@ -1262,7 +1264,7 @@
        '(concat regexp-opt regexp-quote
         string-to-char string-to-syntax symbol-name
          eq eql
-         = /= < <= => > min max
+         = /= < <= >= > min max
          + - * / % mod abs ash 1+ 1- sqrt
          logand logior lognot logxor logcount
          copysign isnan ldexp float logb
@@ -1270,7 +1272,7 @@
          ffloor fceiling fround ftruncate
          string= string-equal string< string-lessp
          string-search
-         consp atom listp nlistp propert-list-p
+         consp atom listp nlistp proper-list-p
          sequencep arrayp vectorp stringp bool-vector-p hash-table-p
          null not
          numberp integerp floatp natnump characterp
diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index 23c784f..d3159a3 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -201,8 +201,11 @@ the elements themselves.
 
 ;;;###autoload
 (defun cl-some (cl-pred cl-seq &rest cl-rest)
-  "Return true if PREDICATE is true of any element of SEQ or SEQs.
-If so, return the true (non-nil) value returned by PREDICATE.
+  "Say whether PREDICATE is true for any element in the SEQ sequences.
+More specifically, the return value of this function will be the
+same as the first return value of PREDICATE where PREDICATE has a
+non-nil value.
+
 \n(fn PREDICATE SEQ...)"
   (if (or cl-rest (nlistp cl-seq))
       (catch 'cl-some
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index a707d20..261f250 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -84,10 +84,13 @@ replacing its case-insensitive matches with the literal 
string in LIGHTER."
 (defconst easy-mmode--arg-docstring
   "
 
-If called interactively, enable %s if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp,
-also enable the mode if ARG is omitted or nil, and toggle it
-if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `%s'.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'.
+Enable the mode if ARG is nil, omitted, or is a positive number.
+Disable the mode if ARG is a negative number.
 
 The mode's hook is called both when the mode is enabled and when
 it is disabled.")
@@ -301,13 +304,18 @@ or call the function `%s'."))))
          ,(easy-mmode--mode-docstring doc pretty-name keymap-sym)
         ;; Use `toggle' rather than (if ,mode 0 1) so that using
         ;; repeat-command still does the toggling correctly.
-        (interactive (list (or current-prefix-arg 'toggle)))
+        (interactive (list (if current-prefix-arg
+                                (prefix-numeric-value current-prefix-arg)
+                              'toggle)))
         (let ((,last-message (current-message)))
            (,@setter
-            (if (eq arg 'toggle)
-                (not ,getter)
-              ;; A nil argument also means ON now.
-              (> (prefix-numeric-value arg) 0)))
+            (cond ((eq arg 'toggle)
+                   (not ,getter))
+                  ((and (numberp arg)
+                        (< arg 1))
+                   nil)
+                  (t
+                   t)))
            ,@body
            ;; The on/off hooks are here for backward compatibility only.
            (run-hooks ',hook (if ,getter ',hook-on ',hook-off))
diff --git a/lisp/emacs-lisp/ert-x.el b/lisp/emacs-lisp/ert-x.el
index abbff6d..a8da2c4 100644
--- a/lisp/emacs-lisp/ert-x.el
+++ b/lisp/emacs-lisp/ert-x.el
@@ -363,18 +363,19 @@ convert it to a string and pass it to COLLECTOR first."
 
 ;; Has to be a macro for `load-file-name'.
 (defmacro ert-resource-directory ()
-  "Return absolute file name of the resource directory for this file.
+  "Return absolute file name of the resource (test data) directory.
 
 The path to the resource directory is the \"resources\" directory
-in the same directory as the test file.
-
-If that directory doesn't exist, use the directory named like the
-test file but formatted by `ert-resource-directory-format' and trimmed
-using `string-trim' with arguments
+in the same directory as the test file this is called from.
+
+If that directory doesn't exist, find a directory based on the
+test file name.  If the file is named \"foo-tests.el\", return
+the absolute file name for \"foo-resources\".  If you want a
+different resource directory naming scheme, set the variable
+`ert-resource-directory-format'.  Before formatting, the file
+name will be trimmed using `string-trim' with arguments
 `ert-resource-directory-trim-left-regexp' and
-`ert-resource-directory-trim-right-regexp'.  The default values mean
-that if called from a test file named \"foo-tests.el\", return
-the absolute file name for \"foo-resources\"."
+`ert-resource-directory-trim-right-regexp'."
   `(let* ((testfile ,(or (bound-and-true-p byte-compile-current-file)
                          (and load-in-progress load-file-name)
                          buffer-file-name))
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 352210f..daf4967 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -178,13 +178,16 @@
 
 (defun lisp--match-hidden-arg (limit)
   (let ((res nil))
+    (forward-line 0)
     (while
-        (let ((ppss (parse-partial-sexp (line-beginning-position)
+        (let ((ppss (parse-partial-sexp (point)
                                         (line-end-position)
                                         -1)))
           (skip-syntax-forward " )")
           (if (or (>= (car ppss) 0)
-                  (looking-at ";\\|$"))
+                  (eolp)
+                  (looking-at ";")
+                  (nth 8 (syntax-ppss))) ;Within a string or comment.
               (progn
                 (forward-line 1)
                 (< (point) limit))
@@ -478,7 +481,8 @@ This will generate compile-time constants from BINDINGS."
            (3 'font-lock-regexp-grouping-construct prepend))
          (lisp--match-hidden-arg
           (0 '(face font-lock-warning-face
-                    help-echo "Hidden behind deeper element; move to another 
line?")))
+               help-echo "Hidden behind deeper element; move to another line?")
+             prepend))
          (lisp--match-confusable-symbol-character
           0 '(face font-lock-warning-face
                     help-echo "Confusable character"))
@@ -522,7 +526,8 @@ This will generate compile-time constants from BINDINGS."
            (1 font-lock-keyword-face))
          (lisp--match-hidden-arg
           (0 '(face font-lock-warning-face
-               help-echo "Hidden behind deeper element; move to another 
line?")))
+               help-echo "Hidden behind deeper element; move to another line?")
+             prepend))
          ))
       "Gaudy level highlighting for Lisp modes.")))
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index d58216b..a381ca0 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -982,7 +982,8 @@ untar into a directory named DIR; otherwise, signal an 
error."
       (write-region
        (concat
         ";;; Generated package description from "
-        (replace-regexp-in-string "-pkg\\.el\\'" ".el" pkg-file)
+        (replace-regexp-in-string "-pkg\\.el\\'" ".el"
+                                  (file-name-nondirectory pkg-file))
         "  -*- no-byte-compile: t -*-\n"
         (prin1-to-string
          (nconc
diff --git a/lisp/emacs-lisp/tabulated-list.el 
b/lisp/emacs-lisp/tabulated-list.el
index b13f609..3057767 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -269,42 +269,48 @@ Populated by `tabulated-list-init-header'.")
   ;; FIXME: Should share code with tabulated-list-print-col!
   (let ((x (max tabulated-list-padding 0))
        (button-props `(help-echo "Click to sort by column"
-                       mouse-face header-line-highlight
-                       keymap ,tabulated-list-sort-button-map))
+                                 mouse-face header-line-highlight
+                                 keymap ,tabulated-list-sort-button-map))
+        (len (length tabulated-list-format))
        (cols nil))
     (if display-line-numbers
         (setq x (+ x (tabulated-list-line-number-width))))
     (push (propertize " " 'display `(space :align-to ,x)) cols)
-    (dotimes (n (length tabulated-list-format))
+    (dotimes (n len)
       (let* ((col (aref tabulated-list-format n))
+             (not-last-col (< n (1- len)))
             (label (nth 0 col))
+             (lablen (length label))
+             (pname label)
             (width (nth 1 col))
             (props (nthcdr 3 col))
             (pad-right (or (plist-get props :pad-right) 1))
              (right-align (plist-get props :right-align))
              (next-x (+ x pad-right width)))
+        (when (and (>= lablen 3) (> lablen width) not-last-col)
+          (setq label (truncate-string-to-width label (- lablen 1) nil nil t)))
        (push
         (cond
          ;; An unsortable column
          ((not (nth 2 col))
-          (propertize label 'tabulated-list-column-name label))
+          (propertize label 'tabulated-list-column-name pname))
          ;; The selected sort column
          ((equal (car col) (car tabulated-list-sort-key))
           (apply 'propertize
-                 (concat label
-                         (cond
-                          ((> (+ 2 (length label)) width) "")
-                          ((cdr tabulated-list-sort-key)
+                  (concat label
+                          (cond
+                           ((and (< lablen 3) not-last-col) "")
+                           ((cdr tabulated-list-sort-key)
                             (format " %c"
                                     tabulated-list-gui-sort-indicator-desc))
-                          (t (format " %c"
+                           (t (format " %c"
                                       tabulated-list-gui-sort-indicator-asc))))
-                 'face 'bold
-                 'tabulated-list-column-name label
-                 button-props))
+                  'face 'bold
+                  'tabulated-list-column-name pname
+                  button-props))
          ;; Unselected sortable column.
          (t (apply 'propertize label
-                   'tabulated-list-column-name label
+                   'tabulated-list-column-name pname
                    button-props)))
         cols)
         (when right-align
diff --git a/lisp/emacs-lisp/timer-list.el b/lisp/emacs-lisp/timer-list.el
index 4bda9ac..024f003 100644
--- a/lisp/emacs-lisp/timer-list.el
+++ b/lisp/emacs-lisp/timer-list.el
@@ -95,8 +95,8 @@
   (setq-local revert-buffer-function #'list-timers)
   (setq tabulated-list-format
         '[("Idle" 6 timer-list--idle-predicate)
-          ("        Next" 12 timer-list--next-predicate)
-          ("      Repeat" 12 timer-list--repeat-predicate)
+          ("Next" 12 timer-list--next-predicate :right-align t :pad-right 1)
+          ("Repeat" 12 timer-list--repeat-predicate :right-align t :pad-right 
1)
           ("Function" 10 timer-list--function-predicate)]))
 
 (defun timer-list--idle-predicate (A B)
@@ -121,7 +121,7 @@
     (string< rA rB)))
 
 (defun timer-list--function-predicate (A B)
-  "Predicate to sort Timer-List by the Next column."
+  "Predicate to sort Timer-List by the Function column."
   (let ((fA (aref (cadr A) 3))
         (fB (aref (cadr B) 3)))
     (string< fA fB)))
diff --git a/lisp/emulation/edt-lk201.el b/lisp/emulation/edt-lk201.el
index c922e00..f7b2c0c 100644
--- a/lisp/emulation/edt-lk201.el
+++ b/lisp/emulation/edt-lk201.el
@@ -1,4 +1,4 @@
-;;; edt-lk201.el --- enhanced EDT keypad mode emulation for LK-201 keyboards
+;;; edt-lk201.el --- enhanced EDT keypad mode emulation for LK-201 keyboards  
-*- lexical-binding: t -*-
 
 ;; Copyright (C) 1986, 1992-1993, 1995, 2001-2020 Free Software
 ;; Foundation, Inc.
diff --git a/lisp/emulation/edt-pc.el b/lisp/emulation/edt-pc.el
index aa31d5b..53fc988 100644
--- a/lisp/emulation/edt-pc.el
+++ b/lisp/emulation/edt-pc.el
@@ -1,4 +1,4 @@
-;;; edt-pc.el --- enhanced EDT keypad mode emulation for PC 101 keyboards
+;;; edt-pc.el --- enhanced EDT keypad mode emulation for PC 101 keyboards  -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 1986, 1994-1995, 2001-2020 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/emulation/edt-vt100.el b/lisp/emulation/edt-vt100.el
index 199212d..420d29b 100644
--- a/lisp/emulation/edt-vt100.el
+++ b/lisp/emulation/edt-vt100.el
@@ -1,4 +1,4 @@
-;;; edt-vt100.el --- enhanced EDT keypad mode emulation for VT series terminals
+;;; edt-vt100.el --- enhanced EDT keypad mode emulation for VT series 
terminals  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1986, 1992-1993, 1995, 2002-2020 Free Software
 ;; Foundation, Inc.
diff --git a/lisp/erc/erc-log.el b/lisp/erc/erc-log.el
index 2166123..de0a16e 100644
--- a/lisp/erc/erc-log.el
+++ b/lisp/erc/erc-log.el
@@ -267,7 +267,7 @@ The current buffer is given by BUFFER."
     (with-current-buffer buffer
       (auto-save-mode -1)
       (setq buffer-file-name nil)
-      (set (make-local-variable 'write-file-functions) 
'(erc-save-buffer-in-logs))
+      (add-hook 'write-file-functions #'erc-save-buffer-in-logs nil t)
       (when erc-log-insert-log-on-open
        (ignore-errors
          (save-excursion
diff --git a/lisp/erc/erc-networks.el b/lisp/erc/erc-networks.el
index 309a788..d957fce 100644
--- a/lisp/erc/erc-networks.el
+++ b/lisp/erc/erc-networks.el
@@ -190,9 +190,9 @@
   ("Fraggers: Random server" Fraggers "irc.fraggers.co.uk" ((6661 6669) (7000 
7001) ))
   ("FreedomChat: Random server" FreedomChat "chat.freedomchat.net" 6667)
   ("FreedomIRC: Random server" FreedomIRC "irc.freedomirc.net" 6667)
-  ("Freenode: Random server" freenode "irc.freenode.net" 6667)
-  ("Freenode: Random EU server" freenode "irc.eu.freenode.net" 6667)
-  ("Freenode: Random US server" freenode "irc.us.freenode.net" 6667)
+  ("Freenode: Random server" freenode "chat.freenode.net" 6667)
+  ("Freenode: Random EU server" freenode "chat.eu.freenode.net" 6667)
+  ("Freenode: Random US server" freenode "chat.us.freenode.net" 6667)
   ("FunNet: Random server" FunNet "irc.funnet.org" 6667)
   ("Galaxynet: Random server" GalaxyNet "irc.galaxynet.org" ((6662 6668) 7000 
))
   ("Galaxynet: AU, NZ, Auckland" GalaxyNet "auckland.nz.galaxynet.org" ((6661 
6669)))
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 6481446..e35ae0c 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -1500,7 +1500,7 @@ Defaults to the server buffer."
 
 ;; activation
 
-(defconst erc-default-server "irc.freenode.net"
+(defconst erc-default-server "chat.freenode.net"
   "IRC server to use if it cannot be detected otherwise.")
 
 (defconst erc-default-port 6667
@@ -2244,7 +2244,7 @@ Non-interactively, it takes the keyword arguments
 
 That is, if called with
 
-   (erc :server \"irc.freenode.net\" :full-name \"Harry S Truman\")
+   (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
 
 then the server and full-name will be set to those values, whereas
 `erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el
index 5cee1ba..bdc21c9 100644
--- a/lisp/eshell/em-hist.el
+++ b/lisp/eshell/em-hist.el
@@ -75,8 +75,7 @@
 (defcustom eshell-hist-load-hook nil
   "A list of functions to call when loading `eshell-hist'."
   :version "24.1"                      ; removed eshell-hist-initialize
-  :type 'hook
-  :group 'eshell-hist)
+  :type 'hook)
 
 (defcustom eshell-hist-unload-hook
   (list
@@ -84,8 +83,7 @@
     (lambda ()
       (remove-hook 'kill-emacs-hook 'eshell-save-some-history))))
   "A hook that gets run when `eshell-hist' is unloaded."
-  :type 'hook
-  :group 'eshell-hist)
+  :type 'hook)
 
 (defcustom eshell-history-file-name
   (expand-file-name "history" eshell-directory-name)
@@ -93,20 +91,17 @@
 See also `eshell-read-history' and `eshell-write-history'.
 If it is nil, Eshell will use the value of HISTFILE."
   :type '(choice (const :tag "Use HISTFILE" nil)
-                file)
-  :group 'eshell-hist)
+                file))
 
 (defcustom eshell-history-size 128
   "Size of the input history ring.  If nil, use envvar HISTSIZE."
   :type '(choice (const :tag "Use HISTSIZE" nil)
-                integer)
-  :group 'eshell-hist)
+                integer))
 
 (defcustom eshell-hist-ignoredups nil
   "If non-nil, don't add input matching the last on the input ring.
 This mirrors the optional behavior of bash."
-  :type 'boolean
-  :group 'eshell-hist)
+  :type 'boolean)
 
 (defcustom eshell-save-history-on-exit t
   "Determine if history should be automatically saved.
@@ -118,8 +113,7 @@ If set to `ask', ask if any Eshell buffers are open at exit 
time.
 If set to t, history will always be saved, silently."
   :type '(choice (const :tag "Never" nil)
                 (const :tag "Ask" ask)
-                (const :tag "Always save" t))
-  :group 'eshell-hist)
+                (const :tag "Always save" t)))
 
 (defcustom eshell-input-filter 'eshell-input-filter-default
   "Predicate for filtering additions to input history.
@@ -128,8 +122,7 @@ the input history list.  Default is to save anything that 
isn't all
 whitespace."
   :type '(radio (function-item eshell-input-filter-default)
                 (function-item eshell-input-filter-initial-space)
-                (function :tag "Other function"))
-  :group 'eshell-hist)
+                (function :tag "Other function")))
 
 (put 'eshell-input-filter 'risky-local-variable t)
 
@@ -138,31 +131,26 @@ whitespace."
 Otherwise, typing <M-p> and <M-n> will always go to the next history
 element, regardless of any text on the command line.  In that case,
 <C-c M-r> and <C-c M-s> still offer that functionality."
-  :type 'boolean
-  :group 'eshell-hist)
+  :type 'boolean)
 
 (defcustom eshell-hist-move-to-end t
   "If non-nil, move to the end of the buffer before cycling history."
-  :type 'boolean
-  :group 'eshell-hist)
+  :type 'boolean)
 
 (defcustom eshell-hist-event-designator
   "^!\\(!\\|-?[0-9]+\\|\\??[^:^$%*?]+\\??\\|#\\)"
   "The regexp used to identifier history event designators."
-  :type 'regexp
-  :group 'eshell-hist)
+  :type 'regexp)
 
 (defcustom eshell-hist-word-designator
   "^:?\\([0-9]+\\|[$^%*]\\)?\\(-[0-9]*\\|[$^%*]\\)?"
   "The regexp used to identify history word designators."
-  :type 'regexp
-  :group 'eshell-hist)
+  :type 'regexp)
 
 (defcustom eshell-hist-modifier
   "^\\(:\\([hretpqx&g]\\|s/\\([^/]*\\)/\\([^/]*\\)/\\)\\)*"
   "The regexp used to identity history modifiers."
-  :type 'regexp
-  :group 'eshell-hist)
+  :type 'regexp)
 
 (defcustom eshell-hist-rebind-keys-alist
   '(([(control ?p)]   . eshell-previous-input)
@@ -180,8 +168,7 @@ element, regardless of any text on the command line.  In 
that case,
   "History keys to bind differently if point is in input text."
   :type '(repeat (cons (vector :tag "Keys to bind"
                               (repeat :inline t sexp))
-                      (function :tag "Command")))
-  :group 'eshell-hist)
+                      (function :tag "Command"))))
 
 ;;; Internal Variables:
 
@@ -308,7 +295,6 @@ Returns nil if INPUT is prepended by blank space, otherwise 
non-nil."
 
   (add-hook 'kill-emacs-hook #'eshell-save-some-history)
 
-  (make-local-variable 'eshell-input-filter-functions)
   (add-hook 'eshell-input-filter-functions #'eshell-add-to-history nil t))
 
 (defun eshell-save-some-history ()
diff --git a/lisp/eshell/em-pred.el b/lisp/eshell/em-pred.el
index c26f654..59139da 100644
--- a/lisp/eshell/em-pred.el
+++ b/lisp/eshell/em-pred.el
@@ -73,18 +73,18 @@ ordinary strings."
     (?p . (eshell-pred-file-type ?p))   ; named pipes
     (?@ . (eshell-pred-file-type ?l))   ; symbolic links
     (?% . (eshell-pred-file-type ?%))   ; allow user to specify (c def.)
-    (?r . (eshell-pred-file-mode 0400)) ; owner-readable
-    (?w . (eshell-pred-file-mode 0200)) ; owner-writable
-    (?x . (eshell-pred-file-mode 0100)) ; owner-executable
-    (?A . (eshell-pred-file-mode 0040)) ; group-readable
-    (?I . (eshell-pred-file-mode 0020)) ; group-writable
-    (?E . (eshell-pred-file-mode 0010)) ; group-executable
-    (?R . (eshell-pred-file-mode 0004)) ; world-readable
-    (?W . (eshell-pred-file-mode 0002)) ; world-writable
-    (?X . (eshell-pred-file-mode 0001)) ; world-executable
-    (?s . (eshell-pred-file-mode 4000)) ; setuid
-    (?S . (eshell-pred-file-mode 2000)) ; setgid
-    (?t . (eshell-pred-file-mode 1000)) ; sticky bit
+    (?r . (eshell-pred-file-mode #o0400)) ; owner-readable
+    (?w . (eshell-pred-file-mode #o0200)) ; owner-writable
+    (?x . (eshell-pred-file-mode #o0100)) ; owner-executable
+    (?A . (eshell-pred-file-mode #o0040)) ; group-readable
+    (?I . (eshell-pred-file-mode #o0020)) ; group-writable
+    (?E . (eshell-pred-file-mode #o0010)) ; group-executable
+    (?R . (eshell-pred-file-mode #o0004)) ; world-readable
+    (?W . (eshell-pred-file-mode #o0002)) ; world-writable
+    (?X . (eshell-pred-file-mode #o0001)) ; world-executable
+    (?s . (eshell-pred-file-mode #o4000)) ; setuid
+    (?S . (eshell-pred-file-mode #o2000)) ; setgid
+    (?t . (eshell-pred-file-mode #o1000)) ; sticky bit
     (?U . #'(lambda (file)                   ; owned by effective uid
               (if (file-exists-p file)
                   (= (file-attribute-user-id (file-attributes file))
@@ -478,7 +478,7 @@ that `ls -l' will show in the first column of its display."
   `(lambda (file)
      (let ((modes (file-modes file 'nofollow)))
        (if modes
-          (logand ,mode modes)))))
+          (not (zerop (logand ,mode modes)))))))
 
 (defun eshell-pred-file-links ()
   "Return a predicate to test whether a file has a given number of links."
diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el
index 68aa680..937b8bf 100644
--- a/lisp/eshell/em-unix.el
+++ b/lisp/eshell/em-unix.el
@@ -1007,18 +1007,17 @@ Show wall-clock time elapsed during execution of 
COMMAND.")
               (throw 'eshell-replace-command
                      (eshell-parse-command "*diff" orig-args))))
          (when (fboundp 'diff-mode)
-           (make-local-variable 'compilation-finish-functions)
            (add-hook
             'compilation-finish-functions
-            `(lambda (buff msg)
+            (lambda (buff _msg)
                (with-current-buffer buff
                  (diff-mode)
-                 (set (make-local-variable 'eshell-diff-window-config)
-                      ,config)
-                 (local-set-key [?q] 'eshell-diff-quit)
+                 (set (make-local-variable 'eshell-diff-window-config) config)
+                 (local-set-key [?q] #'eshell-diff-quit)
                  (if (fboundp 'turn-on-font-lock-if-enabled)
                      (turn-on-font-lock-if-enabled))
-                 (goto-char (point-min))))))
+                 (goto-char (point-min))))
+            nil t))
          (pop-to-buffer (current-buffer))))))
   nil)
 
diff --git a/lisp/faces.el b/lisp/faces.el
index 0ce9532..728f8b0 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -2716,9 +2716,11 @@ used to display the prompt text."
   :group 'frames
   :group 'basic-faces)
 
-(defface scroll-bar '((t nil))
+(defface scroll-bar
+  '((((background light)) :foreground "black")
+    (((background dark))  :foreground "white"))
   "Basic face for the scroll bar colors under X."
-  :version "21.1"
+  :version "28.1"
   :group 'frames
   :group 'basic-faces)
 
diff --git a/lisp/files.el b/lisp/files.el
index 67b3083..92c9a63 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -888,6 +888,16 @@ recursion."
            (push (concat dir "/" file) files)))))
     (nconc result (nreverse files))))
 
+(defun directory-empty-p (dir)
+  "Return t if DIR names an existing directory containing no other files.
+Return nil if DIR does not name a directory, or if there was
+trouble determining whether DIR is a directory or empty.
+
+Symbolic links to directories count as directories.
+See `file-symlink-p' to distinguish symlinks."
+  (and (file-directory-p dir)
+       (null (directory-files dir nil directory-files-no-dot-files-regexp t 
1))))
+
 (defvar module-file-suffix)
 
 (defun load-file (file)
@@ -5862,10 +5872,7 @@ RECURSIVE if DIRECTORY is nonempty."
       ;; case, where the operation fails in delete-directory-internal.
       ;; As `move-file-to-trash' trashes directories (empty or
       ;; otherwise) as a unit, we do not need to recurse here.
-      (if (and (not recursive)
-              ;; Check if directory is empty apart from "." and "..".
-              (directory-files
-               directory 'full directory-files-no-dot-files-regexp))
+      (if (not (or recursive (directory-empty-p directory)))
          (error "Directory is not empty, not moving to trash")
        (move-file-to-trash directory)))
      ;; Otherwise, call ourselves recursively if needed.
diff --git a/lisp/finder.el b/lisp/finder.el
index 820d6d0..a59a185 100644
--- a/lisp/finder.el
+++ b/lisp/finder.el
@@ -178,6 +178,9 @@ directory name and PACKAGE is the name of a package (a 
symbol).
 When generating `package--builtins', Emacs assumes any file in
 DIR is part of the package PACKAGE.")
 
+(defconst finder-buffer "*Finder*"
+  "Name of the Finder buffer.")
+
 (defun finder-compile-keywords (&rest dirs)
   "Regenerate list of built-in Emacs packages.
 This recomputes `package--builtins' and `finder-keywords-hash',
@@ -338,9 +341,9 @@ not `finder-known-keywords'."
 (defun finder-list-keywords ()
   "Display descriptions of the keywords in the Finder buffer."
   (interactive)
-  (if (get-buffer "*Finder*")
-      (pop-to-buffer "*Finder*")
-    (pop-to-buffer (get-buffer-create "*Finder*"))
+  (if (get-buffer finder-buffer)
+      (pop-to-buffer finder-buffer)
+    (pop-to-buffer (get-buffer-create finder-buffer))
     (finder-mode)
     (let ((inhibit-read-only t))
       (erase-buffer)
@@ -460,10 +463,9 @@ finder directory, \\[finder-exit] = quit, 
\\[finder-summary] = help")))
   "Exit Finder mode.
 Quit the window and kill all Finder-related buffers."
   (interactive)
-  (let ((buf "*Finder*"))
-    (if (equal (current-buffer) buf)
-        (quit-window t)
-      (and (get-buffer buf) (kill-buffer buf)))))
+  (quit-window t)
+  (dolist (buf (list finder-buffer "*Finder-package*"))
+    (and (get-buffer buf) (kill-buffer buf))))
 
 (defun finder-unload-function ()
   "Unload the Finder library."
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 1d614f8..c6f7e1c 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -3165,29 +3165,27 @@ mail messages or news articles in files that have 
numeric names."
      (gnus-group-real-name group)
      (list 'nndir (gnus-group-real-name group) (list 'nndir-directory dir)))))
 
-
-(autoload 'nnir-read-parms "nnir")
-(autoload 'nnir-server-to-search-engine "nnir")
 (autoload 'gnus-group-topic-name "gnus-topic")
+(autoload 'gnus-search-make-spec "gnus-search")
 
 ;; Temporary to make group creation easier
-(defun gnus-group-make-search-group (nnir-extra-parms &optional specs)
+(defun gnus-group-make-search-group (no-parse &optional specs)
   "Make a group based on a search.
 Prompt for a search query and determine the groups to search as
 follows: if called from the *Server* buffer search all groups
 belonging to the server on the current line; if called from the
 *Group* buffer search any marked groups, or the group on the
-current line, or all the groups under the current topic.  Calling
-with a prefix arg prompts for additional search-engine specific
-constraints.  A non-nil SPECS arg must be an alist with
-`nnir-query-spec' and `nnir-group-spec' keys, and skips all
-prompting."
+current line, or all the groups under the current topic.  A
+prefix arg NO-PARSE means that Gnus should not parse the search
+query before passing it to the underlying search engine.  A
+non-nil SPECS arg must be an alist with `search-query-spec' and
+`search-group-spec' keys, and skips all prompting."
   (interactive "P")
   (let ((name (gnus-read-group "Group name: ")))
     (with-current-buffer gnus-group-buffer
       (let* ((group-spec
              (or
-              (cdr (assq 'nnir-group-spec specs))
+              (cdr (assq 'search-group-spec specs))
               (if (gnus-server-server-name)
                   (list (list (gnus-server-server-name)))
                 (seq-group-by
@@ -3199,16 +3197,8 @@ prompting."
                         (assoc (gnus-group-topic-name) gnus-topic-alist))))))))
             (query-spec
              (or
-              (cdr (assq 'nnir-query-spec specs))
-              (apply
-               'append
-               (list (cons 'query
-                           (read-string "Query: " nil 'nnir-search-history)))
-               (when nnir-extra-parms
-                 (mapcar
-                  (lambda (x)
-                    (nnir-read-parms (nnir-server-to-search-engine (car x))))
-                  group-spec))))))
+              (cdr (assq 'search-query-spec specs))
+              (gnus-search-make-spec no-parse))))
        (gnus-group-make-group
         name
         (list 'nnselect "nnselect")
@@ -3216,29 +3206,29 @@ prompting."
         (list
          (cons 'nnselect-specs
                (list
-                (cons 'nnselect-function 'nnir-run-query)
+                (cons 'nnselect-function 'gnus-search-run-query)
                 (cons 'nnselect-args
-                      (list (cons 'nnir-query-spec query-spec)
-                            (cons 'nnir-group-spec group-spec)))))
+                      (list (cons 'search-query-spec query-spec)
+                            (cons 'search-group-spec group-spec)))))
          (cons 'nnselect-artlist nil)))))))
 
 (define-obsolete-function-alias 'gnus-group-make-nnir-group
   'gnus-group-read-ephemeral-search-group "28.1")
 
-(defun gnus-group-read-ephemeral-search-group (nnir-extra-parms &optional 
specs)
+(defun gnus-group-read-ephemeral-search-group (no-parse &optional specs)
   "Read an nnselect group based on a search.
 Prompt for a search query and determine the groups to search as
 follows: if called from the *Server* buffer search all groups
 belonging to the server on the current line; if called from the
 *Group* buffer search any marked groups, or the group on the
-current line, or all the groups under the current topic.  Calling
-with a prefix arg prompts for additional search-engine specific
-constraints.  A non-nil SPECS arg must be an alist with
-`nnir-query-spec' and `nnir-group-spec' keys, and skips all
-prompting."
+current line, or all the groups under the current topic.  A
+prefix arg NO-PARSE means that Gnus should not parse the search
+query before passing it to the underlying search engine.  A
+non-nil SPECS arg must be an alist with `search-query-spec' and
+`search-group-spec' keys, and skips all prompting."
   (interactive "P")
   (let* ((group-spec
-         (or (cdr (assq 'nnir-group-spec specs))
+         (or (cdr (assq 'search-group-spec specs))
              (if (gnus-server-server-name)
                  (list (list (gnus-server-server-name)))
                (seq-group-by
@@ -3249,16 +3239,8 @@ prompting."
                       (cdr
                        (assoc (gnus-group-topic-name) gnus-topic-alist))))))))
         (query-spec
-         (or (cdr (assq 'nnir-query-spec specs))
-             (apply
-              'append
-              (list (cons 'query
-                          (read-string "Query: " nil 'nnir-search-history)))
-              (when nnir-extra-parms
-                (mapcar
-                 (lambda (x)
-                   (nnir-read-parms (nnir-server-to-search-engine (car x))))
-                 group-spec))))))
+         (or (cdr (assq 'search-query-spec specs))
+             (gnus-search-make-spec no-parse))))
     (gnus-group-read-ephemeral-group
      (concat "nnselect-" (message-unique-id))
      (list 'nnselect "nnselect")
@@ -3268,10 +3250,10 @@ prompting."
      (list
       (cons 'nnselect-specs
            (list
-            (cons 'nnselect-function 'nnir-run-query)
+            (cons 'nnselect-function 'gnus-search-run-query)
             (cons 'nnselect-args
-                  (list (cons 'nnir-query-spec query-spec)
-                        (cons 'nnir-group-spec group-spec)))))
+                  (list (cons 'search-query-spec query-spec)
+                        (cons 'search-group-spec group-spec)))))
       (cons 'nnselect-artlist nil)))))
 
 (defun gnus-group-add-to-virtual (n vgroup)
diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
new file mode 100644
index 0000000..07bd2bc
--- /dev/null
+++ b/lisp/gnus/gnus-search.el
@@ -0,0 +1,2137 @@
+;;; gnus-search.el --- Search facilities for Gnus    -*- lexical-binding: t; 
-*-
+
+;; Copyright (C) 2020  Free Software Foundation, Inc.
+
+;; Author: Eric Abrahamsen <eric@ericabrahamsen.net>
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This file defines a generalized search language, and search engines
+;; that interface with various search programs.  It is responsible for
+;; parsing the user's search input, sending that query to the search
+;; engines, and collecting results.  Results are in the form of a
+;; vector of vectors, each vector representing a found article.  The
+;; nnselect backend interprets that value to create a group containing
+;; the search results.
+
+;; This file was formerly known as nnir.  Later, the backend parts of
+;; nnir became nnselect, and only the search functionality was left
+;; here.
+
+;; See the Gnus manual for details of the search language.  Tests are
+;; in tests/gnus-search-test.el.
+
+;; The search parsing routines are responsible for accepting the
+;; user's search query as a string and parsing it into a sexp
+;; structure.  The function `gnus-search-parse-query' is the entry
+;; point for that.  Once the query is in sexp form, it is passed to
+;; the search engines themselves, which are responsible for
+;; transforming the query into a form that the external program can
+;; understand, and then filtering the search results into a format
+;; that nnselect can understand.
+
+;; The general flow is:
+
+;; 1. The user calls one of `gnus-group-make-search-group' or
+;; `gnus-group-make-permanent-search-group' (or a few other entry
+;; points).  These functions prompt for a search query, and collect
+;; the groups to search, then create an nnselect group, setting an
+;; 'nnselect-specs group parameter where 'nnselect-function is
+;; `gnus-search-run-query', and 'nnselect-args is the search query and
+;; groups to search.
+
+;; 2. `gnus-search-run-query' is called with 'nnselect-args.  It looks
+;; at the groups to search, categorizes them by server, and for each
+;; server finds the search engine to use.  It calls each engine's
+;; `gnus-search-run-search' method with the query and groups passed as
+;; arguments, and the results are collected and handed off to the
+;; nnselect group.
+
+;; For information on writing new search engines, see the Gnus manual.
+
+;; TODO: Rewrite the query parser using syntax tables and
+;; `parse-partial-sexp'.
+
+;; TODO: Refactor IMAP search so we can move code that uses nnimap-*
+;; functions out into nnimap.el.
+
+;; TODO: Is there anything we can do about sorting results?
+
+;; TODO: Provide for returning a result count.  This would probably
+;; need a completely separate top-level command, since we wouldn't be
+;; creating a group at all.
+
+;;; Code:
+
+(require 'gnus-group)
+(require 'gnus-sum)
+(require 'message)
+(require 'gnus-util)
+(require 'eieio)
+(eval-when-compile (require 'cl-lib))
+(autoload 'eieio-build-class-alist "eieio-opt")
+(autoload 'nnmaildir-base-name-to-article-number "nnmaildir")
+
+(defvar gnus-inhibit-demon)
+(defvar gnus-english-month-names)
+
+;;; Internal Variables:
+
+(defvar gnus-search-memo-query nil
+  "Internal: stores current query.")
+
+(defvar gnus-search-memo-server nil
+  "Internal: stores current server.")
+
+(defvar gnus-search-history ()
+  "Internal history of Gnus searches.")
+
+(define-error 'gnus-search-parse-error "Gnus search parsing error")
+
+;;; User Customizable Variables:
+
+(defgroup gnus-search nil
+  "Search groups in Gnus with assorted search engines."
+  :group 'gnus)
+
+(defcustom gnus-search-use-parsed-queries nil
+  "When t, use Gnus' generalized search language.
+The generalized search language is a search language that can be
+used across all search engines that Gnus supports.  See the Gnus
+manual for details.
+
+If this option is set to nil, search queries will be passed
+directly to the search engines without being parsed or
+transformed."
+  :version "28.1"
+  :type 'boolean
+  :group 'gnus-search)
+
+(define-obsolete-variable-alias 'nnir-ignored-newsgroups
+  'gnus-search-ignored-newsgroups "28.1")
+
+(defcustom gnus-search-ignored-newsgroups ""
+  "A regexp to match newsgroups in the active file that should
+  be skipped when searching."
+  :version "24.1"
+  :type 'regexp
+  :group 'gnus-search)
+
+(make-obsolete-variable
+ 'nnir-imap-default-search-key
+ "specify imap search keys, or use parsed queries." "28.1")
+
+;; Engine-specific configuration options.
+
+(defcustom gnus-search-swish++-config-file
+  (expand-file-name "~/Mail/swish++.conf")
+  "Location of Swish++ configuration file.
+This variable can also be set per-server."
+  :type 'file
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish++-program "search"
+  "Name of swish++ search executable.
+This variable can also be set per-server."
+  :type 'string
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish++-switches '()
+  "A list of strings, to be given as additional arguments to swish++.
+Note that this should be a list.  I.e., do NOT use the following:
+    (setq gnus-search-swish++-switches \"-i -w\") ; wrong
+Instead, use this:
+    (setq gnus-search-swish++-switches \\='(\"-i\" \"-w\"))
+
+This variable can also be set per-server."
+  :type '(repeat string)
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish++-remove-prefix (concat (getenv "HOME") "/Mail/")
+  "The prefix to remove from each file name returned by swish++
+in order to get a group name (albeit with / instead of .).  This is a
+regular expression.
+
+This variable can also be set per-server."
+  :type 'regexp
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish++-raw-queries-p nil
+  "If t, all Swish++ engines will only accept raw search query
+  strings."
+  :type 'boolean
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-config-file
+  (expand-file-name "~/Mail/swish-e.conf")
+  "Configuration file for swish-e.
+This variable can also be set per-server."
+  :type 'file
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-program "search"
+  "Name of swish-e search executable.
+This variable can also be set per-server."
+  :type 'string
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-switches '()
+  "A list of strings, to be given as additional arguments to swish-e.
+Note that this should be a list.  I.e., do NOT use the following:
+    (setq gnus-search-swish-e-switches \"-i -w\") ; wrong
+Instead, use this:
+    (setq gnus-search-swish-e-switches \\='(\"-i\" \"-w\"))
+
+This variable can also be set per-server."
+  :type '(repeat string)
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-remove-prefix (concat (getenv "HOME") "/Mail/")
+  "The prefix to remove from each file name returned by swish-e
+in order to get a group name (albeit with / instead of .).  This is a
+regular expression.
+
+This variable can also be set per-server."
+  :type 'regexp
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-index-files '()
+  "A list of index files to use with this Swish-e instance.
+This variable can also be set per-server."
+  :type '(repeat file)
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-swish-e-raw-queries-p nil
+  "If t, all Swish-e engines will only accept raw search query
+  strings."
+  :type 'boolean
+  :version "28.1"
+  :group 'gnus-search)
+
+;; Namazu engine, see <URL:http://www.namazu.org/>
+
+(defcustom gnus-search-namazu-program "namazu"
+  "Name of Namazu search executable.
+This variable can also be set per-server."
+  :type 'string
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-namazu-index-directory (expand-file-name 
"~/Mail/namazu/")
+  "Index directory for Namazu.
+This variable can also be set per-server."
+  :type 'directory
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-namazu-switches '()
+  "A list of strings, to be given as additional arguments to namazu.
+The switches `-q', `-a', and `-s' are always used, very few other switches
+make any sense in this context.
+
+Note that this should be a list.  I.e., do NOT use the following:
+    (setq gnus-search-namazu-switches \"-i -w\") ; wrong
+Instead, use this:
+    (setq gnus-search-namazu-switches \\='(\"-i\" \"-w\"))
+
+This variable can also be set per-server."
+  :type '(repeat string)
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-namazu-remove-prefix (concat (getenv "HOME") "/Mail/")
+  "The prefix to remove from each file name returned by Namazu
+in order to get a group name (albeit with / instead of .).
+
+For example, suppose that Namazu returns file names such as
+\"/home/john/Mail/mail/misc/42\".  For this example, use the following
+setting:  (setq gnus-search-namazu-remove-prefix \"/home/john/Mail/\")
+Note the trailing slash.  Removing this prefix gives \"mail/misc/42\".
+Gnus knows to remove the \"/42\" and to replace \"/\" with \".\" to
+arrive at the correct group name, \"mail.misc\".
+
+This variable can also be set per-server."
+  :type 'directory
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-namazu-raw-queries-p nil
+  "If t, all Namazu engines will only accept raw search query
+  strings."
+  :type 'boolean
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-notmuch-program "notmuch"
+  "Name of notmuch search executable.
+This variable can also be set per-server."
+  :type '(string)
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-notmuch-config-file
+  (expand-file-name "~/.notmuch-config")
+  "Configuration file for notmuch.
+This variable can also be set per-server."
+  :type 'file
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-notmuch-switches '()
+  "A list of strings, to be given as additional arguments to notmuch.
+Note that this should be a list.  I.e., do NOT use the following:
+    (setq gnus-search-notmuch-switches \"-i -w\") ; wrong
+Instead, use this:
+    (setq gnus-search-notmuch-switches \\='(\"-i\" \"-w\"))
+
+This variable can also be set per-server."
+  :type '(repeat string)
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-notmuch-remove-prefix (concat (getenv "HOME") "/Mail/")
+  "The prefix to remove from each file name returned by notmuch
+in order to get a group name (albeit with / instead of .).  This is a
+regular expression.
+
+This variable can also be set per-server."
+  :type 'regexp
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-notmuch-raw-queries-p nil
+  "If t, all Notmuch engines will only accept raw search query
+  strings."
+  :type 'boolean
+  :version "28.1"
+  :group 'gnus-search)
+
+(defcustom gnus-search-imap-raw-queries-p nil
+  "If t, all IMAP engines will only accept raw search query
+  strings."
+  :version "28.1"
+  :type 'boolean
+  :group 'gnus-search)
+
+(defcustom gnus-search-mairix-program "mairix"
+  "Name of mairix search executable.
+This variable can also be set per-server."
+  :version "28.1"
+  :type 'string
+  :group 'gnus-search)
+
+(defcustom gnus-search-mairix-config-file
+  (expand-file-name "~/.mairixrc")
+  "Configuration file for mairix.
+This variable can also be set per-server."
+  :version "28.1"
+  :type 'file
+  :group 'gnus-search)
+
+(defcustom gnus-search-mairix-switches '()
+  "A list of strings, to be given as additional arguments to mairix.
+Note that this should be a list.  I.e., do NOT use the following:
+    (setq gnus-search-mairix-switches \"-i -w\") ; wrong
+Instead, use this:
+    (setq gnu-search-mairix-switches \\='(\"-i\" \"-w\"))
+
+This variable can also be set per-server."
+  :version "28.1"
+  :type '(repeat string)
+  :group 'gnus-search)
+
+(defcustom gnus-search-mairix-remove-prefix (concat (getenv "HOME") "/Mail/")
+  "The prefix to remove from each file name returned by mairix
+in order to get a group name (albeit with / instead of .).  This is a
+regular expression.
+
+This variable can also be set per-server."
+  :version "28.1"
+  :type 'regexp
+  :group 'gnus-search)
+
+(defcustom gnus-search-mairix-raw-queries-p nil
+  "If t, all Mairix engines will only accept raw search query
+  strings."
+  :version "28.1"
+  :type 'boolean
+  :group 'gnus-search)
+
+;; Options for search language parsing.
+
+(defcustom gnus-search-expandable-keys
+  '("from" "subject" "to" "cc" "bcc" "body" "recipient" "date"
+    "mark" "before" "after" "larger" "smaller" "attachment" "text"
+    "since" "thread" "sender" "address" "tag" "size" "grep" "limit"
+    "raw" "message-id" "id")
+  "A list of strings representing expandable search keys.
+\"Expandable\" simply means the key can be abbreviated while
+typing in search queries, ie \"subject\" could be entered as
+\"subj\" or even \"su\", though \"s\" is ambigous between
+\"subject\" and \"since\".
+
+Ambiguous abbreviations will raise an error."
+  :group 'gnus-search
+  :version "28.1"
+  :type '(repeat string))
+
+(defcustom gnus-search-date-keys
+  '("date" "before" "after" "on" "senton" "sentbefore" "sentsince" "since")
+  "A list of keywords whose value should be parsed as a date.
+See the docstring of `gnus-search-parse-query' for information on
+date parsing."
+  :group 'gnus-search
+  :version "26.1"
+  :type '(repeat string))
+
+(defcustom gnus-search-contact-tables '()
+  "A list of completion tables used to search for messages from contacts.
+Each list element should be a table or collection suitable to be
+returned by `completion-at-point-functions'.  That usually means
+a list of strings, a hash table, or an alist."
+  :group 'gnus-search
+  :version "28.1"
+  :type '(repeat sexp))
+
+;;; Search language
+
+;; This "language" was generalized from the original IMAP search query
+;; parsing routine.
+
+(defun gnus-search-parse-query (string)
+  "Turn STRING into an s-expression based query.
+The resulting query structure is passed to the various search
+backends, each of which adapts it as needed.
+
+The search \"language\" is essentially a series of key:value
+expressions.  Key is most often a mail header, but there are
+other keys.  Value is a string, quoted if it contains spaces.
+Key and value are separated by a colon, no space.  Expressions
+are implictly ANDed; the \"or\" keyword can be used to
+OR. \"not\" will negate the following expression, or keys can be
+prefixed with a \"-\".  The \"near\" operator will work for
+engines that understand it; other engines will convert it to
+\"or\".  Parenthetical groups work as expected.
+
+A key that matches the name of a mail header will search that
+header.
+
+Search keys can be expanded with TAB during entry, or left
+abbreviated so long as they remain unambiguous, ie \"f\" will
+search the \"from\" header. \"s\" will raise an error.
+
+Other keys:
+
+\"address\" will search all sender and recipient headers.
+
+\"recipient\" will search \"To\", \"Cc\", and \"Bcc\".
+
+\"before\" will search messages sent before the specified
+date (date specifications to come later).  Date is exclusive.
+
+\"after\" (or its synonym \"since\") will search messages sent
+after the specified date.  Date is inclusive.
+
+\"mark\" will search messages that have some sort of mark.
+Likely values include \"flag\", \"seen\", \"read\", \"replied\".
+It's also possible to use Gnus' internal marks, ie \"mark:R\"
+will be interpreted as mark:read.
+
+\"tag\" will search tags -- right now that's translated to
+\"keyword\" in IMAP, and left as \"tag\" for notmuch. At some
+point this should also be used to search marks in the Gnus
+registry.
+
+Other keys can be specified, provided that the search backends
+know how to interpret them.
+
+External contact-management packages can push completion tables
+onto the list variable `gnus-search-contact-tables', to provide
+auto-completion of contact names and addresses for keys like
+\"from\" and \"to\".
+
+Date values (any key in `gnus-search-date-keys') can be provided
+in any format that `parse-time-string' can parse (note that this
+can produce weird results).  Dates with missing bits will be
+interpreted as the most recent occurance thereof (ie \"march 03\"
+is the most recent March 3rd).  Lastly, relative specifications
+such as 1d (one day ago) are understood.  This also accepts w, m,
+and y.  m is assumed to be 30 days.
+
+This function will accept pretty much anything as input.  Its
+only job is to parse the query into a sexp, and pass that on --
+it is the job of the search backends to make sense of the
+structured query.  Malformed, unusable or invalid queries will
+typically be silently ignored."
+  (with-temp-buffer
+    ;; Set up the parsing environment.
+    (insert string)
+    (goto-char (point-min))
+    ;; Now, collect the output terms and return them.
+    (let (out)
+      (while (not (gnus-search-query-end-of-input))
+       (push (gnus-search-query-next-expr) out))
+      (reverse out))))
+
+(defun gnus-search-query-next-expr (&optional count halt)
+  "Return the next expression from the current buffer."
+  (let ((term (gnus-search-query-next-term count))
+       (next (gnus-search-query-peek-symbol)))
+    ;; Deal with top-level expressions.  And, or, not, near...  What
+    ;; else?  Notmuch also provides xor and adj.  It also provides a
+    ;; "nearness" parameter for near and adj.
+    (cond
+     ;; Handle 'expr or expr'
+     ((and (eq next 'or)
+          (null halt))
+      (list 'or term (gnus-search-query-next-expr 2)))
+     ;; Handle 'near operator.
+     ((eq next 'near)
+      (let ((near-next (gnus-search-query-next-expr 2)))
+       (if (and (stringp term)
+                (stringp near-next))
+           (list 'near term near-next)
+         (signal 'gnus-search-parse-error
+                 (list "\"Near\" keyword must appear between two plain 
strings.")))))
+     ;; Anything else
+     (t term))))
+
+(defun gnus-search-query-next-term (&optional count)
+  "Return the next TERM from the current buffer."
+  (let ((term (gnus-search-query-next-symbol count)))
+    ;; What sort of term is this?
+    (cond
+     ;; negated term
+     ((eq term 'not) (list 'not (gnus-search-query-next-expr nil 'halt)))
+     ;; generic term
+     (t term))))
+
+(defun gnus-search-query-peek-symbol ()
+  "Return the next symbol from the current buffer, but don't consume it."
+  (save-excursion
+    (gnus-search-query-next-symbol)))
+
+(defun gnus-search-query-next-symbol (&optional count)
+  "Return the next symbol from the current buffer, or nil if we are
+at the end of the buffer.  If supplied COUNT skips some symbols before
+returning the one at the supplied position."
+  (when (and (numberp count) (> count 1))
+    (gnus-search-query-next-symbol (1- count)))
+  (let ((case-fold-search t))
+    ;; end of input stream?
+    (unless (gnus-search-query-end-of-input)
+      ;; No, return the next symbol from the stream.
+      (cond
+       ;; Negated expression -- return it and advance one char.
+       ((looking-at "-") (forward-char 1) 'not)
+       ;; List expression -- we parse the content and return this as a list.
+       ((looking-at "(")
+       (gnus-search-parse-query (gnus-search-query-return-string ")" t)))
+       ;; Keyword input -- return a symbol version.
+       ((looking-at "\\band\\b") (forward-char 3) 'and)
+       ((looking-at "\\bor\\b")  (forward-char 2) 'or)
+       ((looking-at "\\bnot\\b") (forward-char 3) 'not)
+       ((looking-at "\\bnear\\b") (forward-char 4) 'near)
+       ;; Plain string, no keyword
+       ((looking-at "[\"/]?\\b[^:]+\\([[:blank:]]\\|\\'\\)")
+       (gnus-search-query-return-string
+        (when (looking-at-p "[\"/]") t)))
+       ;; Assume a K:V expression.
+       (t (let ((key (gnus-search-query-expand-key
+                     (buffer-substring
+                      (point)
+                      (progn
+                        (re-search-forward ":" (point-at-eol) t)
+                        (1- (point))))))
+               (value (gnus-search-query-return-string
+                       (when (looking-at-p "[\"/]") t))))
+           (gnus-search-query-parse-kv key value)))))))
+
+(defun gnus-search-query-parse-kv (key value)
+  "Handle KEY and VALUE, parsing and expanding as necessary.
+This may result in (key value) being turned into a larger query
+structure.
+
+In the simplest case, they are simply consed together.  String
+KEY is converted to a symbol."
+  (let (return)
+    (cond
+     ((member key gnus-search-date-keys)
+      (when (string= "after" key)
+       (setq key "since"))
+      (setq value (gnus-search-query-parse-date value)))
+     ((equal key "mark")
+      (setq value (gnus-search-query-parse-mark value)))
+     ((string= "message-id" key)
+      (setq key "id")))
+    (or return
+       (cons (intern key) value))))
+
+(defun gnus-search-query-parse-date (value &optional rel-date)
+  "Interpret VALUE as a date specification.
+See the docstring of `gnus-search-parse-query' for details.
+
+The result is a list of (dd mm yyyy); individual elements can be
+nil.
+
+If VALUE is a relative time, interpret it as relative to
+REL-DATE, or (current-time) if REL-DATE is nil."
+  ;; Time parsing doesn't seem to work with slashes.
+  (let ((value (replace-regexp-in-string "/" "-" value))
+       (now (append '(0 0 0)
+                    (seq-subseq (decode-time (or rel-date
+                                                 (current-time)))
+                                3))))
+    ;; Check for relative time parsing.
+    (if (string-match "\\([[:digit:]]+\\)\\([dwmy]\\)" value)
+       (seq-subseq
+        (decode-time
+         (time-subtract
+          (apply #'encode-time now)
+          (days-to-time
+           (* (string-to-number (match-string 1 value))
+              (cdr (assoc (match-string 2 value)
+                          '(("d" . 1)
+                            ("w" . 7)
+                            ("m" . 30)
+                            ("y" . 365))))))))
+        3 6)
+      ;; Otherwise check the value of `parse-time-string'.
+
+      ;; (SEC MIN HOUR DAY MON YEAR DOW DST TZ)
+      (let ((d-time (parse-time-string value)))
+       ;; Did parsing produce anything at all?
+       (if (seq-some #'integerp (seq-subseq d-time 3 7))
+           (seq-subseq
+            ;; If DOW is given, handle that specially.
+            (if (and (seq-elt d-time 6) (null (seq-elt d-time 3)))
+                (decode-time
+                 (time-subtract (apply #'encode-time now)
+                                (days-to-time
+                                 (+ (if (> (seq-elt d-time 6)
+                                           (seq-elt now 6))
+                                        7 0)
+                                    (- (seq-elt now 6) (seq-elt d-time 6))))))
+              d-time)
+            3 6)
+         ;; `parse-time-string' failed to produce anything, just
+         ;; return the string.
+         value)))))
+
+(defun gnus-search-query-parse-mark (mark)
+  "Possibly transform MARK.
+If MARK is a single character, assume it is one of the
+gnus-*-mark marks, and return an appropriate string."
+  (if (= 1 (length mark))
+      (let ((m (aref mark 0)))
+       ;; Neither pcase nor cl-case will work here.
+       (cond
+        ((eql m gnus-ticked-mark) "flag")
+        ((eql m gnus-read-mark) "read")
+        ((eql m gnus-replied-mark) "replied")
+        ((eql m gnus-recent-mark) "recent")
+        (t mark)))
+    mark))
+
+(defun gnus-search-query-expand-key (key)
+  (cond ((test-completion key gnus-search-expandable-keys)
+        ;; We're done!
+        key)
+       ;; There is more than one possible completion.
+       ((consp (cdr (completion-all-completions
+                     key gnus-search-expandable-keys #'stringp 0)))
+        (signal 'gnus-search-parse-error
+                (list (format "Ambiguous keyword: %s" key))))
+       ;; Return KEY, either completed or untouched.
+       ((car-safe (completion-try-completion
+                   key gnus-search-expandable-keys
+                   #'stringp 0)))))
+
+(defun gnus-search-query-return-string (&optional delimited trim)
+  "Return a string from the current buffer.
+If DELIMITED is non-nil, assume the next character is a delimiter
+character, and return everything between point and the next
+occurance of the delimiter, including the delimiters themselves.
+If TRIM is non-nil, do not return the delimiters. Otherwise,
+return one word."
+  ;; This function cannot handle nested delimiters, as it's not a
+  ;; proper parser.  Ie, you cannot parse "to:bob or (from:bob or
+  ;; (cc:bob or bcc:bob))".
+  (let ((start (point))
+       (delimiter (if (stringp delimited)
+                      delimited
+                    (when delimited
+                      (char-to-string (char-after)))))
+       end)
+    (if delimiter
+       (progn
+         (when trim
+           ;; Skip past first delimiter if we're trimming.
+           (forward-char 1))
+         (while (not end)
+           (unless (search-forward delimiter nil t (unless trim 2))
+             (signal 'gnus-search-parse-error
+                     (list (format "Unmatched delimited input with %s in 
query" delimiter))))
+           (let ((here (point)))
+             (unless (equal (buffer-substring (- here 2) (- here 1)) "\\")
+               (setq end (if trim (1- (point)) (point))
+                     start (if trim (1+ start) start))))))
+      (setq end (progn (re-search-forward "\\([[:blank:]]+\\|$\\)" (point-max) 
t)
+                      (match-beginning 0))))
+    (buffer-substring-no-properties start end)))
+
+(defun gnus-search-query-end-of-input ()
+  "Are we at the end of input?"
+  (skip-chars-forward "[:blank:]")
+  (looking-at "$"))
+
+;;; Search engines
+
+;; Search engines are implemented as classes.  This is good for two
+;; things: encapsulating things like indexes and search prefixes, and
+;; transforming search queries.
+
+(defclass gnus-search-engine ()
+  ((raw-queries-p
+    :initarg :raw-queries-p
+    :initform nil
+    :type boolean
+    :custom boolean
+    :documentation
+    "When t, searches through this engine will never be parsed or
+    transformed, and must be entered \"raw\"."))
+  :abstract t
+  :documentation "Abstract base class for Gnus search engines.")
+
+(defclass gnus-search-grep ()
+  ((grep-program
+    :initarg :grep-program
+    :initform "grep"
+    :type string
+    :documentation "Grep executable to use for second-pass grep
+    searches.")
+   (grep-options
+    :initarg :grep-options
+    :initform nil
+    :type list
+    :documentation "Additional options, in the form of a list,
+    passed to the second-pass grep search, when present."))
+  :abstract t
+  :documentation "An abstract mixin class that can be added to
+  local-filesystem search engines, providing an additional grep:
+  search key.  After the base engine returns a list of search
+  results (as local filenames), an external grep process is used
+  to further filter the results.")
+
+(cl-defgeneric gnus-search-grep-search (engine artlist criteria)
+  "Run a secondary grep search over a list of preliminary results.
+
+ARTLIST is a list of (filename score) pairs, produced by one of
+the other search engines.  CRITERIA is a grep-specific search
+key.  This method uses an external grep program to further filter
+the files in ARTLIST by that search key.")
+
+(cl-defmethod gnus-search-grep-search ((engine gnus-search-grep)
+                                      artlist criteria)
+  (with-slots (grep-program grep-options) engine
+    (if (executable-find grep-program)
+       ;; Don't catch errors -- allow them to propagate.
+       (let ((matched-files
+              (apply
+               #'process-lines
+               grep-program
+               `("-l" ,@grep-options
+                 "-e" ,(shell-quote-argument criteria)
+                 ,@(mapcar #'car artlist)))))
+         (seq-filter (lambda (a) (member (car a) matched-files))
+                     artlist))
+      (nnheader-report 'search "invalid grep program: %s" grep-program))))
+
+(defclass gnus-search-process ()
+  ((proc-buffer
+    :initarg :proc-buffer
+    :type buffer
+    :documentation "A temporary buffer this engine uses for its
+    search process, and for munging its search results."))
+  :abstract t
+  :documentation
+  "A mixin class for engines that do their searching in a single
+  process launched for this purpose, which returns at the end of
+  the search.  Subclass instances are safe to be run in
+  threads.")
+
+(cl-defmethod shared-initialize ((engine gnus-search-process)
+                                slots)
+  (setq slots (plist-put slots :proc-buffer
+                        (get-buffer-create
+                         (generate-new-buffer-name " *gnus-search-"))))
+  (cl-call-next-method engine slots))
+
+(defclass gnus-search-imap (gnus-search-engine)
+  ((literal-plus
+    :initarg :literal-plus
+    :initform nil
+    :type boolean
+    :documentation
+    "Can this search engine handle literal+ searches?  This slot
+    is set automatically by the imap server, and cannot be
+    set manually.  Only the LITERAL+ capability is handled.")
+   (multisearch
+    :initarg :multisearch
+    :initform nil
+    :type boolean
+    :documentation
+    "Can this search engine handle the MULTISEARCH capability?
+    This slot is set automatically by the imap server, and cannot
+    be set manually.  Currently unimplemented.")
+   (fuzzy
+    :initarg :fuzzy
+    :initform nil
+    :type boolean
+    :documentation
+    "Can this search engine handle the FUZZY search capability?
+    This slot is set automatically by the imap server, and cannot
+    be set manually.  Currently only partially implemented.")
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-imap-raw-queries-p)))
+    :documentation
+  "The base IMAP search engine, using an IMAP server's search capabilites.
+This backend may be subclassed to handle particular IMAP servers'
+quirks.")
+
+(defclass gnus-search-find-grep (gnus-search-engine
+                                gnus-search-process
+                                gnus-search-grep)
+  nil)
+
+;;; The "indexed" search engine.
+
+;; These are engines that use an external program, with indexes kept
+;; on disk, to search messages usually kept in some local directory.
+;; They have several slots in common, for instance program name or
+;; configuration file.  Many of the subclasses also allow
+;; distinguishing multiple databases or indexes.  These slots can be
+;; set using a global default, or on a per-server basis.
+
+(defclass gnus-search-indexed (gnus-search-engine
+                              gnus-search-process
+                              gnus-search-grep)
+  ((program
+    :initarg :program
+    :type string
+    :documentation
+    "The executable used for indexing and searching.")
+   (config-file
+    :init-arg :config-file
+    :type string
+    :custom file
+    :documentation "Location of the config file, if any.")
+   (remove-prefix
+    :initarg :remove-prefix
+    :initform (concat (getenv "HOME") "/Mail/")
+    :type string
+    :documentation
+    "The path to the directory where the indexed mails are
+    kept.  This path is removed from the search results.")
+   (switches
+    :initarg :switches
+    :type list
+    :documentation
+    "Additional switches passed to the search engine command-line
+    program."))
+  :abstract t
+  :allow-nil-initform t
+  :documentation "A base search engine class that assumes a local search index
+  accessed by a command line program.")
+
+(defclass gnus-search-swish-e (gnus-search-indexed)
+  ((index-files
+    :init-arg :index-files
+    :initform (symbol-value 'gnus-search-swish-e-index-files)
+    :type list)
+   (program
+    :initform (symbol-value 'gnus-search-swish-e-program))
+   (remove-prefix
+    :initform (symbol-value 'gnus-search-swish-e-remove-prefix))
+   (switches
+    :initform (symbol-value 'gnus-search-swish-e-switches))
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-swish-e-raw-queries-p))))
+
+(defclass gnus-search-swish++ (gnus-search-indexed)
+  ((program
+    :initform (symbol-value 'gnus-search-swish++-program))
+   (remove-prefix
+    :initform (symbol-value 'gnus-search-swish++-remove-prefix))
+   (switches
+    :initform (symbol-value 'gnus-search-swish++-switches))
+   (config-file
+    :initform (symbol-value 'gnus-search-swish++-config-file))
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-swish++-raw-queries-p))))
+
+(defclass gnus-search-mairix (gnus-search-indexed)
+  ((program
+    :initform (symbol-value 'gnus-search-mairix-program))
+   (remove-prefix
+    :initform (symbol-value 'gnus-search-mairix-remove-prefix))
+   (switches
+    :initform (symbol-value 'gnus-search-mairix-switches))
+   (config-file
+    :initform (symbol-value 'gnus-search-mairix-config-file))
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-mairix-raw-queries-p))))
+
+(defclass gnus-search-namazu (gnus-search-indexed)
+  ((index-directory
+    :initarg :index-directory
+    :type string
+    :custom directory)
+   (program
+    :initform (symbol-value 'gnus-search-namazu-program))
+   (remove-prefix
+    :initform (symbol-value 'gnus-search-namazu-remove-prefix))
+   (switches
+    :initform (symbol-value 'gnus-search-namazu-switches))
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-namazu-raw-queries-p))))
+
+(defclass gnus-search-notmuch (gnus-search-indexed)
+  ((program
+    :initform (symbol-value 'gnus-search-notmuch-program))
+   (remove-prefix
+    :initform (symbol-value 'gnus-search-notmuch-remove-prefix))
+   (switches
+    :initform (symbol-value 'gnus-search-notmuch-switches))
+   (config-file
+    :initform (symbol-value 'gnus-search-notmuch-config-file))
+   (raw-queries-p
+    :initform (symbol-value 'gnus-search-notmuch-raw-queries-p))))
+
+(define-obsolete-variable-alias 'nnir-method-default-engines
+  'gnus-search-default-engines "28.1")
+
+(defcustom gnus-search-default-engines '((nnimap . gnus-search-imap))
+  "Alist of default search engines keyed by server method."
+  :version "26.1"
+  :group 'gnus-search
+  :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool)
+                              (const nneething) (const nndir) (const nnmbox)
+                              (const nnml) (const nnmh) (const nndraft)
+                              (const nnfolder) (const nnmaildir))
+                      (choice
+                       ,@(mapcar
+                          (lambda (el) (list 'const (intern (car el))))
+                          (eieio-build-class-alist 'gnus-search-engine t))))))
+
+;;; Transforming and running search queries.
+
+(cl-defgeneric gnus-search-run-search (engine server query groups)
+  "Run QUERY in GROUPS against SERVER, using search ENGINE.
+Should return results as a vector of vectors.")
+
+(cl-defgeneric gnus-search-transform (engine expression)
+  "Transform sexp EXPRESSION into a string search query usable by ENGINE.
+Responsible for handling and, or, and parenthetical expressions.")
+
+(cl-defgeneric gnus-search-transform-expression (engine expression)
+  "Transform a basic EXPRESSION into a string usable by ENGINE.")
+
+(cl-defgeneric gnus-search-make-query-string (engine query-spec)
+  "Extract the actual query string to use from QUERY-SPEC.")
+
+;; Methods that are likely to be the same for all engines.
+
+(cl-defmethod gnus-search-make-query-string ((engine gnus-search-engine)
+                                            query-spec)
+  (if (and gnus-search-use-parsed-queries
+          (null (alist-get 'raw query-spec))
+          (null (slot-value engine 'raw-queries-p)))
+      (gnus-search-transform
+       engine (alist-get 'parsed-query query-spec))
+    (alist-get 'query query-spec)))
+
+(defsubst gnus-search-single-p (query)
+  "Return t if QUERY is a search for a single message."
+  (let ((q (alist-get 'parsed-query query)))
+    (and (= (length q ) 1)
+        (consp (car-safe q))
+        (eq (caar q) 'id))))
+
+(cl-defmethod gnus-search-transform ((engine gnus-search-engine)
+                                    (query list))
+  (let (clauses)
+    (mapc
+     (lambda (item)
+       (when-let ((expr (gnus-search-transform-expression engine item)))
+        (push expr clauses)))
+     query)
+    (mapconcat #'identity (reverse clauses) " ")))
+
+;; Most search engines just pass through plain strings.
+(cl-defmethod gnus-search-transform-expression ((_ gnus-search-engine)
+                                               (expr string))
+  expr)
+
+;; Most search engines use implicit ANDs.
+(cl-defmethod gnus-search-transform-expression ((_ gnus-search-engine)
+                                               (_expr (eql and)))
+  nil)
+
+;; Most search engines use explicit infixed ORs.
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-engine)
+                                               (expr (head or)))
+  (let ((left (gnus-search-transform-expression engine (nth 1 expr)))
+       (right (gnus-search-transform-expression engine (nth 2 expr))))
+    ;; Unhandled keywords return a nil; don't create an "or" expression
+    ;; unless both sub-expressions are non-nil.
+    (if (and left right)
+       (format "%s or %s" left right)
+      (or left right))))
+
+;; Most search engines just use the string "not"
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-engine)
+                                               (expr (head not)))
+  (let ((next (gnus-search-transform-expression engine (cadr expr))))
+    (when next
+     (format "not %s" next))))
+
+;;; Search Engine Interfaces:
+
+(autoload 'nnimap-change-group "nnimap")
+(declare-function nnimap-buffer "nnimap" ())
+(declare-function nnimap-command "nnimap" (&rest args))
+
+;; imap interface
+(cl-defmethod gnus-search-run-search ((engine gnus-search-imap)
+                                     srv query groups)
+  (save-excursion
+    (let ((server (cadr (gnus-server-to-method srv)))
+          (gnus-inhibit-demon t)
+         ;; We're using the message id to look for a single message.
+         (single-search (gnus-search-single-p query))
+         (grouplist (or groups (gnus-search-get-active srv)))
+         q-string artlist group)
+      (message "Opening server %s" server)
+      ;; We should only be doing this once, in
+      ;; `nnimap-open-connection', but it's too frustrating to try to
+      ;; get to the server from the process buffer.
+      (with-current-buffer (nnimap-buffer)
+       (setf (slot-value engine 'literal-plus)
+             (when (nnimap-capability "LITERAL+") t))
+       ;; MULTISEARCH not yet implemented.
+       (setf (slot-value engine 'multisearch)
+             (when (nnimap-capability "MULTISEARCH") t))
+       ;; FUZZY only partially supported: the command is sent to the
+       ;; server (and presumably acted upon), but we don't yet
+       ;; request a RELEVANCY score as part of the response.
+       (setf (slot-value engine 'fuzzy)
+             (when (nnimap-capability "SEARCH=FUZZY") t)))
+
+      (setq q-string
+           (gnus-search-make-query-string engine query))
+
+      ;; If it's a thread query, make sure that all message-id
+      ;; searches are also references searches.
+      (when (alist-get 'thread query)
+       (setq q-string
+             (replace-regexp-in-string
+              "HEADER Message-Id \\([^ )]+\\)"
+              "(OR HEADER Message-Id \\1 HEADER References \\1)"
+              q-string)))
+
+      (while (and (setq group (pop grouplist))
+                 (or (null single-search) (null artlist)))
+       (when (nnimap-change-group
+              (gnus-group-short-name group) server)
+         (with-current-buffer (nnimap-buffer)
+           (message "Searching %s..." group)
+           (let ((result
+                  (gnus-search-imap-search-command engine q-string)))
+             (when (car result)
+               (setq artlist
+                     (vconcat
+                      (mapcar
+                       (lambda (artnum)
+                         (let ((artn (string-to-number artnum)))
+                           (when (> artn 0)
+                             (vector group artn 100))))
+                       (cdr (assoc "SEARCH" (cdr result))))
+                      artlist))))
+           (message "Searching %s...done" group))))
+      (nreverse artlist))))
+
+(cl-defmethod gnus-search-imap-search-command ((engine gnus-search-imap)
+                                              (query string))
+  "Create the IMAP search command for QUERY.
+Currenly takes into account support for the LITERAL+ capability.
+Other capabilities could be tested here."
+  (with-slots (literal-plus) engine
+    (when literal-plus
+      (setq query (split-string query "\n")))
+    (cond
+     ((consp query)
+      ;; We're not really streaming, just need to prevent
+      ;; `nnimap-send-command' from waiting for a response.
+      (let* ((nnimap-streaming t)
+            (call
+             (nnimap-send-command
+              "UID SEARCH CHARSET UTF-8 %s"
+              (pop query))))
+       (dolist (l query)
+         (process-send-string (get-buffer-process (current-buffer)) l)
+         (process-send-string (get-buffer-process (current-buffer))
+                              (if (nnimap-newlinep nnimap-object)
+                                  "\n"
+                                "\r\n")))
+       (nnimap-get-response call)))
+     (t (nnimap-command "UID SEARCH %s" query)))))
+
+;; TODO: Don't exclude booleans and date keys, just check for them
+;; before checking for general keywords.
+(defvar gnus-search-imap-search-keys
+  '(body cc bcc from header keyword larger smaller subject text to uid)
+  "Known IMAP search keys, excluding booleans and date keys.")
+
+(cl-defmethod gnus-search-transform ((_ gnus-search-imap)
+                                    (_query null))
+  "ALL")
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-imap)
+                                               (expr string))
+  (unless (string-match-p "\\`/.+/\\'" expr)
+    ;; Also need to check for fuzzy here.  Or better, do some
+    ;; refactoring of this stuff.
+    (format "TEXT %s"
+           (gnus-search-imap-handle-string engine expr))))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-imap)
+                                               (expr (head or)))
+  (let ((left (gnus-search-transform-expression engine (nth 1 expr)))
+       (right (gnus-search-transform-expression engine (nth 2 expr))))
+    (if (and left right)
+       (format "(OR %s %s)"
+               left (format (if (eq 'or (car-safe (nth 2 expr)))
+                                "(%s)" "%s")
+                            right))
+      (or left right))))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-imap)
+                                               (expr (head near)))
+  "Imap searches interpret \"near\" as \"or\"."
+  (setcar expr 'or)
+  (gnus-search-transform-expression engine expr))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-imap)
+                                               (expr (head not)))
+  "Transform IMAP NOT.
+If the term to be negated is a flag, then use the appropriate UN*
+boolean instead."
+  (if (eql (caadr expr) 'mark)
+      (if (string= (cdadr expr) "new")
+         "OLD"
+       (format "UN%s" (gnus-search-imap-handle-flag (cdadr expr))))
+    (format "NOT %s"
+           (gnus-search-transform-expression engine (cadr expr)))))
+
+(cl-defmethod gnus-search-transform-expression ((_ gnus-search-imap)
+                                               (expr (head mark)))
+  (gnus-search-imap-handle-flag (cdr expr)))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-imap)
+                                               (expr list))
+  "Handle a search keyword for IMAP.
+All IMAP search keywords that take a value are supported
+directly.  Keywords that are boolean are supported through other
+means (usually the \"mark\" keyword)."
+  (let ((fuzzy-supported (slot-value engine 'fuzzy))
+       (fuzzy ""))
+    (cl-case (car expr)
+      (date (setcar expr 'on))
+      (tag (setcar expr 'keyword))
+      (sender (setcar expr 'from))
+      (attachment (setcar expr 'body)))
+    ;; Allow sizes specified as KB or MB.
+    (let ((case-fold-search t)
+         unit)
+      (when (and (memq (car expr) '(larger smaller))
+                (string-match "\\(kb?\\|mb?\\)\\'" (cdr expr)))
+       (setq unit (match-string 1 (cdr expr)))
+       (setcdr expr
+               (number-to-string
+                (* (string-to-number
+                    (string-replace unit "" (cdr expr)))
+                   (if (string-prefix-p "k" unit)
+                       1024
+                     1048576))))))
+    (cond
+     ((consp (car expr))
+      (format "(%s)" (gnus-search-transform engine expr)))
+     ((eq (car expr) 'recipient)
+      (gnus-search-transform
+       engine (gnus-search-parse-query
+              (format
+               "to:%s or cc:%s or bcc:%s"
+               (cdr expr) (cdr expr) (cdr expr)))))
+     ((eq (car expr) 'address)
+      (gnus-search-transform
+       engine (gnus-search-parse-query
+              (format
+               "from:%s or to:%s or cc:%s or bcc:%s"
+               (cdr expr) (cdr expr) (cdr expr) (cdr expr)))))
+     ((memq (car expr) '(before since on sentbefore senton sentsince))
+      ;; Ignore dates given as strings.
+      (when (listp (cdr expr))
+       (format "%s %s"
+               (upcase (symbol-name (car expr)))
+               (gnus-search-imap-handle-date engine (cdr expr)))))
+     ((stringp (cdr expr))
+      ;; If the search term starts or ends with "*", remove the
+      ;; asterisk.  If the engine supports FUZZY, then additionally make
+      ;; the search fuzzy.
+      (when (string-match "\\`\\*\\|\\*\\'" (cdr expr))
+       (setcdr expr (replace-regexp-in-string
+                     "\\`\\*\\|\\*\\'" "" (cdr expr)))
+       (when fuzzy-supported
+         (setq fuzzy "FUZZY ")))
+      ;; If the search term is a regexp, drop the expression altogether.
+      (unless (string-match-p "\\`/.+/\\'" (cdr expr))
+       (cond
+        ((memq (car expr) gnus-search-imap-search-keys)
+         (format "%s%s %s"
+                 fuzzy
+                 (upcase (symbol-name (car expr)))
+                 (gnus-search-imap-handle-string engine (cdr expr))))
+        ((eq (car expr) 'id)
+         (format "HEADER Message-ID \"%s\"" (cdr expr)))
+        ;; Treat what can't be handled as a HEADER search.  Probably a bad
+        ;; idea.
+        (t (format "%sHEADER %s %s"
+                   fuzzy
+                   (car expr)
+                   (gnus-search-imap-handle-string engine (cdr expr))))))))))
+
+(cl-defmethod gnus-search-imap-handle-date ((_engine gnus-search-imap)
+                                    (date list))
+  "Turn DATE into a date string recognizable by IMAP.
+While other search engines can interpret partially-qualified
+dates such as a plain \"January\", IMAP requires an absolute
+date.
+
+DATE is a list of (dd mm yyyy), any element of which could be
+nil.  Massage those numbers into the most recent past occurrence
+of whichever date elements are present."
+  (let ((now (decode-time (current-time))))
+    ;; Set nil values to 1, current-month, current-year, or else 1, 1,
+    ;; current-year, depending on what we think the user meant.
+    (unless (seq-elt date 1)
+      (setf (seq-elt date 1)
+           (if (seq-elt date 0)
+               (seq-elt now 4)
+             1)))
+    (unless (seq-elt date 0)
+      (setf (seq-elt date 0) 1))
+    (unless (seq-elt date 2)
+      (setf (seq-elt date 2)
+           (seq-elt now 5)))
+    ;; Fiddle with the date until it's in the past.  There
+    ;; must be a way to combine all these steps.
+    (unless (< (seq-elt date 2)
+              (seq-elt now 5))
+      (when (< (seq-elt now 3)
+              (seq-elt date 0))
+       (cl-decf (seq-elt date 1)))
+      (cond ((zerop (seq-elt date 1))
+            (setf (seq-elt date 1) 1)
+            (cl-decf (seq-elt date 2)))
+           ((< (seq-elt now 4)
+               (seq-elt date 1))
+            (cl-decf (seq-elt date 2))))))
+  (format-time-string "%e-%b-%Y" (apply #'encode-time
+                                       (append '(0 0 0)
+                                               date))))
+
+(cl-defmethod gnus-search-imap-handle-string ((engine gnus-search-imap)
+                                             (str string))
+  (with-slots (literal-plus) engine
+    (if (multibyte-string-p str)
+       ;; If LITERAL+ is available, use it and encode string as
+       ;; UTF-8.
+       (if literal-plus
+           (format "{%d+}\n%s"
+                   (string-bytes str)
+                   (encode-coding-string str 'utf-8))
+         ;; Otherwise, if the user hasn't already quoted the string,
+         ;; quote it for them.
+         (if (string-prefix-p "\"" str)
+             str
+           (format "\"%s\"" str)))
+      str)))
+
+(defun gnus-search-imap-handle-flag (flag)
+  "Make sure string FLAG is something IMAP will recognize."
+  ;; What else?  What about the KEYWORD search key?
+  (setq flag
+       (pcase flag
+         ("flag" "flagged")
+         ("read" "seen")
+         (_ flag)))
+  (if (member flag '("seen" "answered" "deleted" "draft" "flagged"))
+      (upcase flag)
+    ""))
+
+;;; Methods for the indexed search engines.
+
+;; First, some common methods.
+
+(cl-defgeneric gnus-search-indexed-parse-output (engine server &optional 
groups)
+  "Parse the results of ENGINE's query against SERVER in GROUPS.
+Locally-indexed search engines return results as a list of
+filenames, sometimes with additional information.  Returns a list
+of viable results, in the form of a list of [group article score]
+vectors.")
+
+(cl-defgeneric gnus-search-index-extract (engine)
+  "Extract a single article result from the current buffer.
+Returns a list of two values: a file name, and a relevancy score.
+Advances point to the beginning of the next result.")
+
+(cl-defmethod gnus-search-run-search ((engine gnus-search-indexed)
+                                     server query groups)
+  "Run QUERY against SERVER using ENGINE.
+This method is common to all indexed search engines.
+
+Returns a list of [group article score] vectors."
+
+  (save-excursion
+    (let* ((qstring (gnus-search-make-query-string engine query))
+          (program (slot-value engine 'program))
+          (buffer (slot-value engine 'proc-buffer))
+          (cp-list (gnus-search-indexed-search-command
+                    engine qstring query groups))
+           proc exitstatus)
+      (set-buffer buffer)
+      (erase-buffer)
+
+      (if groups
+         (message "Doing %s query on %s..." program groups)
+       (message "Doing %s query..." program))
+      (setq proc (apply #'start-process (format "search-%s" server)
+                       buffer program cp-list))
+      (while (process-live-p proc)
+       (accept-process-output proc))
+      (setq exitstatus (process-exit-status proc))
+      (if (zerop exitstatus)
+         ;; The search results have been put into the current buffer;
+         ;; `parse-output' finds them there and returns the article
+         ;; list.
+         (gnus-search-indexed-parse-output engine server query groups)
+       (nnheader-report 'search "%s error: %s" program exitstatus)
+       ;; Failure reason is in this buffer, show it if the user
+       ;; wants it.
+       (when (> gnus-verbose 6)
+         (display-buffer buffer))
+       nil))))
+
+(cl-defmethod gnus-search-indexed-parse-output ((engine gnus-search-indexed)
+                                               server query &optional groups)
+  (let ((prefix (slot-value engine 'remove-prefix))
+       (group-regexp (when groups
+                       (regexp-opt
+                        (mapcar
+                         (lambda (x) (gnus-group-real-name x))
+                         groups))))
+       artlist vectors article group)
+    (goto-char (point-min))
+    (while (not (eobp))
+      (pcase-let ((`(,f-name ,score) (gnus-search-indexed-extract engine)))
+       (when (and (file-readable-p f-name)
+                  (null (file-directory-p f-name))
+                  (or (null groups)
+                      (and (gnus-search-single-p query)
+                           (alist-get 'thread query))
+                      (string-match-p group-regexp f-name)))
+         (push (list f-name score) artlist))))
+    ;; Are we running an additional grep query?
+    (when-let ((grep-reg (alist-get 'grep query)))
+      (setq artlist (gnus-search-grep-search engine artlist grep-reg)))
+    ;; Turn (file-name score) into [group article score].
+    (pcase-dolist (`(,f-name ,score) artlist)
+      (setq article (file-name-nondirectory f-name))
+      ;; Remove prefix.
+      (when (and prefix
+                (file-name-absolute-p prefix)
+                (string-match (concat "^"
+                                      (file-name-as-directory prefix))
+                              f-name))
+       (setq group (replace-match "" t t (file-name-directory f-name))))
+      ;; Break the directory name down until it's something that
+      ;; (probably) can be used as a group name.
+      (setq group
+           (replace-regexp-in-string
+            "[/\\]" "."
+            (replace-regexp-in-string
+             "/?\\(cur\\|new\\|tmp\\)?/\\'" ""
+             (replace-regexp-in-string
+              "^[./\\]" ""
+              group nil t)
+             nil t)
+            nil t))
+
+      (push (vector (gnus-group-full-name group server)
+                   (if (string-match-p "\\`[[:digit:]]+\\'" article)
+                       (string-to-number article)
+                     (nnmaildir-base-name-to-article-number
+                      (substring article 0 (string-match ":" article))
+                      group nil))
+                   (if (numberp score)
+                       score
+                     (string-to-number score)))
+           vectors))
+    vectors))
+
+(cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-indexed))
+  "Base implementation treats the whole line as a filename, and
+fudges a relevancy score of 100."
+  (prog1
+      (list (buffer-substring-no-properties (line-beginning-position)
+                                           (line-end-position))
+           100)
+    (forward-line 1)))
+
+;; Swish++
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-swish++)
+                                               (expr (head near)))
+  (format "%s near %s"
+         (gnus-search-transform-expression engine (nth 1 expr))
+         (gnus-search-transform-expression engine (nth 2 expr))))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-swish++)
+                                               (expr list))
+  (cond
+   ((listp (car expr))
+    (format "(%s)" (gnus-search-transform engine expr)))
+   ;; Untested and likely wrong.
+   ((and (stringp (cdr expr))
+        (string-prefix-p "(" (cdr expr)))
+    (format "%s = %s" (car expr) (gnus-search-transform
+                                 engine
+                                 (gnus-search-parse-query (cdr expr)))))
+   (t (format "%s = %s" (car expr) (cdr expr)))))
+
+(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-swish++)
+                                                 (qstring string)
+                                                 _query &optional _groups)
+  (with-slots (config-file switches) engine
+   `("--config-file" ,config-file
+     ,@switches
+     ,qstring
+     )))
+
+(cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-swish++))
+  (when (re-search-forward
+         "\\(^[0-9]+\\) \\([^ ]+\\) [0-9]+ \\(.*\\)$" nil t)
+    (list (match-string 2)
+         (match-string 1))))
+
+;; Swish-e
+
+;; I didn't do the query transformation for Swish-e, because the
+;; program seems no longer to exist.
+
+(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-swish-e)
+                                                 (qstring string)
+                                                 _query &optional _groups)
+  (with-slots (index-files switches) engine
+    `("-f" ,@index-files
+      ,@switches
+      "-w"
+      ,qstring
+      )))
+
+(cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-swish-e))
+  (when (re-search-forward
+         "\\(^[0-9]+\\) \\([^ ]+\\) \"\\([^\"]+\\)\" [0-9]+$" nil t)
+    (list (match-string 3)
+          (match-string 1))))
+
+;; Namazu interface
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-namazu)
+                                               (expr list))
+  (cond
+   ((listp (car expr))
+    (format "(%s)" (gnus-search-transform engine expr)))
+   ((eql (car expr) 'body)
+    (cadr expr))
+   ;; I have no idea which fields namazu can handle.  Just do these
+   ;; for now.
+   ((memq (car expr) '(subject from to))
+    (format "+%s:%s" (car expr) (cdr expr)))
+   ((eql (car expr) 'address)
+    (gnus-search-transform engine `((or (from . ,(cdr expr))
+                                       (to . ,(cdr expr))))))
+   ((eq (car expr) 'id)
+    (format "+message-id:%s" (cdr expr)))
+   (t (ignore-errors (cl-call-next-method)))))
+
+;; I can't tell if this is actually necessary.
+(cl-defmethod gnus-search-run-search :around ((_e gnus-search-namazu)
+                                             _server _query _groups)
+  (let ((process-environment (copy-sequence process-environment)))
+    (setenv "LC_MESSAGES" "C")
+    (cl-call-next-method)))
+
+(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-namazu)
+                                                 (qstring string)
+                                                 query &optional _groups)
+  (let ((max (alist-get 'limit query)))
+    (with-slots (switches index-directory) engine
+      (append
+       (list "-q"                      ; don't be verbose
+            "-a"                       ; show all matches
+            "-s")                      ; use short format
+       (when max (list (format "--max=%d" max)))
+       switches
+       (list qstring index-directory)))))
+
+(cl-defmethod gnus-search-indexed-extract ((_engine gnus-search-namazu))
+  "Extract a single message result for Namazu.
+Namazu provides a little more information, for instance a score."
+
+  (when (re-search-forward
+        "^\\([0-9,]+\\.\\).*\\((score: \\([0-9]+\\)\\))\n\\([^ ]+\\)"
+        nil t)
+    (list (match-string 4)
+         (match-string 3))))
+
+;;; Notmuch interface
+
+(cl-defmethod gnus-search-transform ((_engine gnus-search-notmuch)
+                                    (_query null))
+  "*")
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-notmuch)
+                                               (expr (head near)))
+  (format "%s near %s"
+         (gnus-search-transform-expression engine (nth 1 expr))
+         (gnus-search-transform-expression engine (nth 2 expr))))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-notmuch)
+                                               (expr list))
+  ;; Swap keywords as necessary.
+  (cl-case (car expr)
+    (sender (setcar expr 'from))
+    ;; Notmuch's "to" is already equivalent to our "recipient".
+    (recipient (setcar expr 'to))
+    (mark (setcar expr 'tag)))
+  ;; Then actually format the results.
+  (cl-flet ((notmuch-date (date)
+                         (if (stringp date)
+                             date
+                           (pcase date
+                             (`(nil ,m nil)
+                              (nth (1- m) gnus-english-month-names))
+                             (`(nil nil ,y)
+                              (number-to-string y))
+                             (`(,d ,m nil)
+                              (format "%02d-%02d" d m))
+                             (`(nil ,m ,y)
+                              (format "%02d-%d" m y))
+                             (`(,d ,m ,y)
+                              (format "%d/%d/%d" m d y))))))
+    (cond
+     ((consp (car expr))
+       (format "(%s)" (gnus-search-transform engine expr)))
+     ((eql (car expr) 'address)
+      (gnus-search-transform engine `((or (from . ,(cdr expr))
+                                         (to . ,(cdr expr))))))
+     ((eql (car expr) 'body)
+      (cdr expr))
+     ((memq (car expr) '(from to subject attachment mimetype tag id
+                             thread folder path lastmod query property))
+      ;; Notmuch requires message-id with no angle brackets.
+      (when (eql (car expr) 'id)
+       (setcdr
+        expr (replace-regexp-in-string "\\`<\\|>\\'" "" (cdr expr))))
+      (format "%s:%s" (car expr)
+             (if (string-match "\\`\\*" (cdr expr))
+                 ;; Notmuch can only handle trailing asterisk
+                 ;; wildcards, so strip leading asterisks.
+                 (replace-match "" nil nil (cdr expr))
+               (cdr expr))))
+     ((eq (car expr) 'date)
+      (format "date:%s" (notmuch-date (cdr expr))))
+     ((eq (car expr) 'before)
+      (format "date:..%s" (notmuch-date (cdr expr))))
+     ((eq (car expr) 'since)
+      (format "date:%s.." (notmuch-date (cdr expr))))
+     (t (ignore-errors (cl-call-next-method))))))
+
+(cl-defmethod gnus-search-run-search :around ((engine gnus-search-notmuch)
+                                             server query groups)
+  "Handle notmuch's thread-search routine."
+  ;; Notmuch allows for searching threads, but only using its own
+  ;; thread ids.  That means a thread search is a \"double-bounce\":
+  ;; once to find the relevant thread ids, and again to find the
+  ;; actual messages.  This method performs the first \"bounce\".
+  (if (alist-get 'thread query)
+      (with-slots (program proc-buffer) engine
+       (let* ((qstring
+               (gnus-search-make-query-string engine query))
+              (cp-list (gnus-search-indexed-search-command
+                        engine qstring query groups))
+              thread-ids proc)
+         (set-buffer proc-buffer)
+         (erase-buffer)
+         (setq proc (apply #'start-process (format "search-%s" server)
+                           proc-buffer program cp-list))
+         (while (process-live-p proc)
+           (accept-process-output proc))
+         (while (re-search-forward "^thread:\\([^ ]+\\)" (point-max) t)
+           (push (match-string 1) thread-ids))
+         (cl-call-next-method
+          engine server
+          ;; Completely replace the query with our new thread-based one.
+          (mapconcat (lambda (thrd) (concat "thread:" thrd))
+                     thread-ids " or ")
+          nil)))
+    (cl-call-next-method engine server query groups)))
+
+(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-notmuch)
+                                                 (qstring string)
+                                                 query &optional _groups)
+  ;; Theoretically we could use the GROUPS parameter to pass a
+  ;; --folder switch to notmuch, but I'm not confident of getting the
+  ;; format right.
+  (let ((limit (alist-get 'limit query))
+       (thread (alist-get 'thread query)))
+    (with-slots (switches config-file) engine
+      `(,(format "--config=%s" config-file)
+       "search"
+       ,(if thread
+            "--output=threads"
+          "--output=files")
+       "--duplicate=1" ; I have found this necessary, I don't know why.
+       ,@switches
+       ,(if limit (format "--limit=%d" limit) "")
+       ,qstring
+       ))))
+
+;;; Mairix interface
+
+;; See the Gnus manual for why mairix searching is a bit weird.
+
+(cl-defmethod gnus-search-transform ((engine gnus-search-mairix)
+                                    (query list))
+  "Transform QUERY for a Mairix engine.
+Because Mairix doesn't accept parenthesized expressions, nor
+\"or\" statements between different keys, results may differ from
+other engines.  We unpeel parenthesized expressions, and just
+cross our fingers for the rest of it."
+  (let (clauses)
+    (mapc
+     (lambda (item)
+       (when-let ((expr (if (consp (car-safe item))
+                           (gnus-search-transform engine item)
+                         (gnus-search-transform-expression engine item))))
+        (push expr clauses)))
+     query)
+    (mapconcat #'identity (reverse clauses) " ")))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-mairix)
+                                               (expr (head not)))
+  "Transform Mairix \"not\".
+Mairix negation requires a \"~\" preceding string search terms,
+and \"-\" before marks."
+  (let ((next (gnus-search-transform-expression engine (cadr expr))))
+    (replace-regexp-in-string
+     ":"
+     (if (eql (caadr expr) 'mark)
+        ":-"
+       ":~")
+     next)))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-mairix)
+                                               (expr (head or)))
+  "Handle Mairix \"or\" statement.
+Mairix only accepts \"or\" expressions on homogenous keys.  We
+cast \"or\" expressions on heterogenous keys as \"and\", which
+isn't quite right, but it's the best we can do.  For date keys,
+only keep one of the terms."
+  (let ((term1 (caadr expr))
+       (term2 (caaddr expr))
+       (val1 (gnus-search-transform-expression engine (nth 1 expr)))
+       (val2 (gnus-search-transform-expression engine (nth 2 expr))))
+    (cond
+     ((or (listp term1) (listp term2))
+      (concat val1 " " val2))
+     ((and (member (symbol-name term1) gnus-search-date-keys)
+          (member (symbol-name term2) gnus-search-date-keys))
+      (or val1 val2))
+     ((eql term1 term2)
+      (if (and val1 val2)
+         (format "%s/%s"
+                 val1
+                 (nth 1 (split-string val2 ":")))
+       (or val1 val2)))
+     (t (concat val1 " " val2)))))
+
+
+(cl-defmethod gnus-search-transform-expression ((_ gnus-search-mairix)
+                                               (expr (head mark)))
+  (gnus-search-mairix-handle-mark (cdr expr)))
+
+(cl-defmethod gnus-search-transform-expression ((engine gnus-search-mairix)
+                                               (expr list))
+  (let ((key (cl-case (car expr)
+              (sender "f")
+              (from "f")
+              (to "t")
+              (cc "c")
+              (subject "s")
+              (id "m")
+              (body "b")
+              (address "a")
+              (recipient "tc")
+              (text "bs")
+              (attachment "n")
+              (t nil))))
+    (cond
+     ((consp (car expr))
+      (gnus-search-transform engine expr))
+     ((member (symbol-name (car expr)) gnus-search-date-keys)
+      (gnus-search-mairix-handle-date expr))
+     ((memq (car expr) '(size smaller larger))
+      (gnus-search-mairix-handle-size expr))
+     ;; Drop regular expressions.
+     ((string-match-p "\\`/" (cdr expr))
+      nil)
+     ;; Turn parenthesized phrases into multiple word terms.  Again,
+     ;; this isn't quite what the user is asking for, but better to
+     ;; return false positives.
+     ((and key (string-match-p "[[:blank:]]" (cdr expr)))
+      (mapconcat
+       (lambda (s) (format "%s:%s" key s))
+       (split-string (gnus-search-mairix-treat-string
+                     (cdr expr)))
+       " "))
+     (key (format "%s:%s" key
+                 (gnus-search-mairix-treat-string
+                  (cdr expr))))
+     (t nil))))
+
+(defun gnus-search-mairix-treat-string (str)
+  "Treat string for wildcards.
+Mairix accepts trailing wildcards, but not leading.  Also remove
+double quotes."
+  (replace-regexp-in-string
+   "\\`\\*\\|\"" ""
+   (replace-regexp-in-string "\\*\\'" "=" str)))
+
+(defun gnus-search-mairix-handle-size (expr)
+  "Format a mairix size search.
+Assume \"size\" key is equal to \"larger\"."
+  (format
+   (if (eql (car expr) 'smaller)
+       "z:-%s"
+     "z:%s-")
+   (cdr expr)))
+
+(defun gnus-search-mairix-handle-mark (expr)
+  "Format a mairix mark search."
+  (let ((mark
+        (pcase (cdr expr)
+          ("flag" "f")
+          ("read" "s")
+          ("seen" "s")
+          ("replied" "r")
+          (_ nil))))
+    (when mark
+      (format "F:%s" mark))))
+
+(defun gnus-search-mairix-handle-date (expr)
+  (let ((str
+        (pcase (cdr expr)
+          (`(nil ,m nil)
+           (substring
+            (nth (1- m) gnus-english-month-names)
+            0 3))
+          (`(nil nil ,y)
+           (number-to-string y))
+          (`(,d ,m nil)
+           (format "%s%02d"
+                   (substring
+                    (nth (1- m) gnus-english-month-names)
+                    0 3)
+                   d))
+          (`(nil ,m ,y)
+           (format "%d%s"
+                   y (substring
+                      (nth (1- m) gnus-english-month-names)
+                      0 3)))
+          (`(,d ,m ,y)
+           (format "%d%02d%02d" y m d)))))
+    (format
+     (pcase (car expr)
+       ('date "d:%s")
+       ('since "d:%s-")
+       ('after "d:%s-")
+       ('before "d:-%s"))
+     str)))
+
+(cl-defmethod gnus-search-indexed-search-command ((engine gnus-search-mairix)
+                                                 (qstring string)
+                                                 query &optional _groups)
+  (with-slots (switches config-file) engine
+    (append `("--rcfile" ,config-file "-r")
+          switches
+          (when (alist-get 'thread query) (list "-t"))
+          (list qstring))))
+
+;;; Find-grep interface
+
+(cl-defmethod gnus-search-transform-expression ((_engine gnus-search-find-grep)
+                                               (_ list))
+  ;; Drop everything that isn't a plain string.
+  nil)
+
+(cl-defmethod gnus-search-run-search ((engine gnus-search-find-grep)
+                                     server query
+                                     &optional groups)
+  "Run find and grep to obtain matching articles."
+  (let* ((method (gnus-server-to-method server))
+        (sym (intern
+              (concat (symbol-name (car method)) "-directory")))
+        (directory (cadr (assoc sym (cddr method))))
+        (regexp (alist-get 'grep query))
+        (grep-options (slot-value engine 'grep-options))
+        (grouplist (or groups (gnus-search-get-active server)))
+        (buffer (slot-value engine 'proc-buffer)))
+    (unless directory
+      (error "No directory found in method specification of server %s"
+            server))
+    (apply
+     'vconcat
+     (mapcar (lambda (x)
+              (let ((group x)
+                    artlist)
+                (message "Searching %s using find-grep..."
+                         (or group server))
+                (save-window-excursion
+                  (set-buffer buffer)
+                  (if (> gnus-verbose 6)
+                      (pop-to-buffer (current-buffer)))
+                  (cd directory)    ; Using relative paths simplifies
+                                       ; postprocessing.
+                  (let ((group
+                         (if (not group)
+                             "."
+                           ;; Try accessing the group literally as
+                           ;; well as interpreting dots as directory
+                           ;; separators so the engine works with
+                           ;; plain nnml as well as the Gnus Cache.
+                           (let ((group (gnus-group-real-name group)))
+                             ;; Replace cl-func find-if.
+                             (if (file-directory-p group)
+                                 group
+                               (if (file-directory-p
+                                    (setq group
+                                          (replace-regexp-in-string
+                                           "\\." "/"
+                                           group nil t)))
+                                   group))))))
+                    (unless group
+                      (error "Cannot locate directory for group"))
+                    (save-excursion
+                      (apply
+                       'call-process "find" nil t
+                       "find" group "-maxdepth" "1" "-type" "f"
+                       "-name" "[0-9]*" "-exec"
+                       (slot-value engine 'grep-program)
+                       `("-l" ,@(and grep-options
+                                     (split-string grep-options "\\s-" t))
+                         "-e" ,regexp "{}" "+"))))
+
+                  ;; Translate relative paths to group names.
+                  (while (not (eobp))
+                    (let* ((path (split-string
+                                  (buffer-substring
+                                   (point)
+                                   (line-end-position)) "/" t))
+                           (art (string-to-number (car (last path)))))
+                      (while (string= "." (car path))
+                        (setq path (cdr path)))
+                      (let ((group (mapconcat #'identity
+                                              (cl-subseq path 0 -1)
+                                              ".")))
+                        (push
+                         (vector (gnus-group-full-name group server) art 0)
+                         artlist))
+                      (forward-line 1)))
+                  (message "Searching %s using find-grep...done"
+                           (or group server))
+                  artlist)))
+            grouplist))))
+
+;;; Util Code:
+
+(defun gnus-search-run-query (specs)
+  "Invoke appropriate search engine function."
+  ;; For now, run the searches synchronously.  At some point
+  ;; multiple-server searches can each be run in their own thread,
+  ;; allowing concurrent searches of multiple backends.  At present
+  ;; this causes problems when searching more than one server that
+  ;; uses `nntp-server-buffer', as their return values are written
+  ;; interleaved into that buffer.  Anyway, that's the reason for the
+  ;; `mapc'.
+  (let* ((results [])
+        (prepared-query (gnus-search-prepare-query
+                         (alist-get 'search-query-spec specs)))
+        (limit (alist-get 'limit prepared-query)))
+    (mapc
+     (pcase-lambda (`(,server . ,groups))
+       (let ((search-engine (gnus-search-server-to-engine server)))
+        (setq results
+              (vconcat
+               (gnus-search-run-search
+                search-engine server prepared-query groups)
+               results))))
+     (alist-get 'search-group-spec specs))
+    ;; Some search engines do their own limiting, but some don't, so
+    ;; do it again here.  This is bad because, if the user is
+    ;; searching multiple groups, they would reasonably expect the
+    ;; limiting to apply to the search results *after sorting*.  Doing
+    ;; it this way is liable to, for instance, eliminate all results
+    ;; from a later group entirely.
+    (if limit
+       (seq-subseq results 0 (min limit (length results)))
+     results)))
+
+(defun gnus-search-prepare-query (query-spec)
+  "Accept a search query in raw format, and prepare it.
+QUERY-SPEC is an alist produced by functions such as
+`gnus-group-make-search-group', and contains at least a 'query
+key, and possibly some meta keys.  This function extracts any
+additional meta keys from the 'query string, and parses the
+remaining string, then adds all that to the top-level spec."
+  (let ((query (alist-get 'query query-spec))
+       val)
+    (when (stringp query)
+      ;; Look for these meta keys:
+      (while (string-match
+             "\\(thread\\|grep\\|limit\\|raw\\):\\([^ ]+\\)"
+             query)
+       (setq val (match-string 2 query))
+       (setf (alist-get (intern (match-string 1 query)) query-spec)
+             ;; This is stupid.
+             (cond
+              ((equal val "t"))
+              ((null (zerop (string-to-number val)))
+               (string-to-number val))
+              (t val)))
+       (setq query
+             (string-trim (replace-match "" t t query 0)))
+       (setf (alist-get 'query query-spec) query)))
+    (when gnus-search-use-parsed-queries
+      (setf (alist-get 'parsed-query query-spec)
+           (gnus-search-parse-query query)))
+    query-spec))
+
+;; This should be done once at Gnus startup time, when the servers are
+;; first opened, and the resulting engine instance attached to the
+;; server.
+(defun gnus-search-server-to-engine (srv)
+  (let* ((method (gnus-server-to-method srv))
+        (engine-config (assoc 'gnus-search-engine (cddr method)))
+        (server
+         (or (nth 1 engine-config)
+             (cdr-safe (assoc (car method) gnus-search-default-engines))
+             (when-let ((old (assoc 'nnir-search-engine
+                                    (cddr method))))
+               (nnheader-message
+                8 "\"nnir-search-engine\" is no longer a valid parameter")
+               (pcase (nth 1 old)
+                 ('notmuch 'gnus-search-notmuch)
+                 ('namazu 'gnus-search-namazu)
+                 ('find-grep 'gnus-search-find-grep)))))
+        (inst
+         (cond
+          ((null server) nil)
+          ((eieio-object-p server)
+           server)
+          ((class-p server)
+           (make-instance server))
+          (t nil))))
+    (if inst
+       (when (cddr engine-config)
+         ;; We're not being completely backward-compatible here,
+         ;; because we're not checking for nnir-specific config
+         ;; options in the server definition.
+         (pcase-dolist (`(,key ,value) (cddr engine-config))
+           (condition-case nil
+               (setf (slot-value inst key) value)
+             ((invalid-slot-name invalid-slot-type)
+              (nnheader-message
+               5 "Invalid search engine parameter: (%s %s)"
+               key value)))))
+      (nnheader-message 5 "No search engine defined for %s" srv))
+    inst))
+
+(declare-function gnus-registry-get-id-key "gnus-registry" (id key))
+
+(defun gnus-search-thread (header)
+  "Make an nnselect group based on the thread containing the article
+header. The current server will be searched. If the registry is
+installed, the server that the registry reports the current
+article came from is also searched."
+  (let* ((ids (cons (mail-header-id header)
+                   (split-string
+                    (or (mail-header-references header)
+                        ""))))
+        (query
+         (list (cons 'query (mapconcat (lambda (i)
+                                         (format "id:%s" i))
+                                       ids " or "))
+               (cons 'thread t)))
+        (server
+         (list (list (gnus-method-to-server
+                      (gnus-find-method-for-group gnus-newsgroup-name)))))
+        (registry-group (and
+                         (bound-and-true-p gnus-registry-enabled)
+                         (car (gnus-registry-get-id-key
+                               (mail-header-id header) 'group))))
+        (registry-server
+         (and registry-group
+              (gnus-method-to-server
+               (gnus-find-method-for-group registry-group)))))
+    (when registry-server
+      (cl-pushnew (list registry-server) server :test #'equal))
+    (gnus-group-make-search-group nil (list
+                                      (cons 'search-query-spec query)
+                                      (cons 'search-group-spec server)))
+    (gnus-summary-goto-subject (gnus-id-to-article (mail-header-id header)))))
+
+(defun gnus-search-get-active (srv)
+  (let ((method (gnus-server-to-method srv))
+       groups)
+    (gnus-request-list method)
+    (with-current-buffer nntp-server-buffer
+      (let ((cur (current-buffer)))
+       (goto-char (point-min))
+       (unless (or (null gnus-search-ignored-newsgroups)
+                   (string= gnus-search-ignored-newsgroups ""))
+         (delete-matching-lines gnus-search-ignored-newsgroups))
+       (if (eq (car method) 'nntp)
+           (while (not (eobp))
+             (ignore-errors
+               (push (gnus-group-decoded-name
+                      (gnus-group-full-name
+                       (buffer-substring
+                        (point)
+                        (progn
+                          (skip-chars-forward "^ \t")
+                          (point)))
+                       method))
+                     groups))
+             (forward-line))
+         (while (not (eobp))
+           (ignore-errors
+             (push (gnus-group-decoded-name
+                    (if (eq (char-after) ?\")
+                        (gnus-group-full-name (read cur) method)
+                      (let ((p (point)) (name ""))
+                        (skip-chars-forward "^ \t\\\\")
+                        (setq name (buffer-substring p (point)))
+                        (while (eq (char-after) ?\\)
+                          (setq p (1+ (point)))
+                          (forward-char 2)
+                          (skip-chars-forward "^ \t\\\\")
+                          (setq name (concat name (buffer-substring
+                                                   p (point)))))
+                        (gnus-group-full-name name method))))
+                   groups))
+           (forward-line)))))
+    groups))
+
+(defvar gnus-search-minibuffer-map
+  (let ((km (make-sparse-keymap)))
+    (set-keymap-parent km minibuffer-local-map)
+    (define-key km (kbd "TAB") #'completion-at-point)
+    km))
+
+(defun gnus-search--complete-key-data ()
+  "Potentially return completion data for a search key or value."
+  (let* ((key-start (save-excursion
+                     (if (re-search-backward " " (minibuffer-prompt-end) t)
+                         (1+ (point))
+                       (minibuffer-prompt-end))))
+        (after-colon (save-excursion
+                       (when (re-search-backward ":" key-start t)
+                         (1+ (point)))))
+        in-string)
+    (if after-colon
+       ;; We're in the value part of a key:value pair, which we
+       ;; only handle in a contact-completion context.
+       (when (and gnus-search-contact-tables
+                  (save-excursion
+                    (re-search-backward "\\<\\(\\w+\\):" key-start t)
+                    (member (match-string 1)
+                            '("from" "to" "cc"
+                              "bcc" "recipient" "address"))))
+         (setq in-string (nth 3 (syntax-ppss)))
+         (list (if in-string (1+ after-colon) after-colon)
+               (point) (apply #'completion-table-merge
+                              gnus-search-contact-tables)
+               :exit-function
+               (lambda (str status)
+                 ;; If the value contains spaces, make sure it's
+                 ;; quoted.
+                 (when (and (memql status '(exact finished))
+                            (string-match-p " " str))
+                   (unless (looking-at-p "\\s\"")
+                     (insert "\""))
+                   ;; Unless we already have an opening quote...
+                   (unless in-string
+                     (save-excursion
+                       (goto-char after-colon)
+                       (insert "\"")))))))
+      (list
+       key-start (point) gnus-search-expandable-keys
+       :exit-function (lambda (_s status)
+                       (when (memql status '(exact finished))
+                         (insert ":")))))))
+
+(defun gnus-search-make-spec (arg)
+  (list (cons 'query
+             (minibuffer-with-setup-hook
+                 (lambda ()
+                   (add-hook 'completion-at-point-functions
+                             #'gnus-search--complete-key-data))
+               (read-from-minibuffer
+                "Query: " nil gnus-search-minibuffer-map
+                nil 'gnus-search-history)))
+       (cons 'raw arg)))
+
+(provide 'gnus-search)
+;;; gnus-search.el ends here
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 8a88e0e..7984998 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -365,7 +365,7 @@ textual parts.")
     (mm-disable-multibyte)
     (buffer-disable-undo)
     (gnus-add-buffer)
-    (set (make-local-variable 'after-change-functions) nil)
+    (set (make-local-variable 'after-change-functions) nil) ;FIXME: Why?
     (set (make-local-variable 'nnimap-object)
         (make-nnimap :server (nnoo-current-server 'nnimap)
                      :initial-resync 0))
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index 21206b6..ce2e99d 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -36,10 +36,10 @@
 ;; sorting.  Most functions will just chose a fixed number, such as
 ;; 100, for this score.
 
-;; For example the search function `nnir-run-query' applied to
-;; arguments specifying a search query (see "nnir.el") can be used to
-;; return a list of articles from a search.  Or the function can be the
-;; identity and the args a vector of articles.
+;; For example the search function `gnus-search-run-query' applied to
+;; arguments specifying a search query (see "gnus-search.el") can be
+;; used to return a list of articles from a search.  Or the function
+;; can be the identity and the args a vector of articles.
 
 
 ;;; Code:
@@ -47,7 +47,7 @@
 ;;; Setup:
 
 (require 'gnus-art)
-(require 'nnir)
+(require 'gnus-search)
 
 (eval-when-compile (require 'cl-lib))
 
@@ -372,25 +372,25 @@ If this variable is nil, or if the provided function 
returns nil,
       ;; find the servers for a pseudo-article
       (if (eq 'nnselect (car (gnus-server-to-method server)))
          (with-current-buffer gnus-summary-buffer
-           (let ((thread  (gnus-id-to-thread article)))
+           (let ((thread (gnus-id-to-thread article)))
              (when thread
                (mapc
-                #'(lambda (x)
-                    (when (and x (> x 0))
-                      (cl-pushnew
-                       (list
-                        (gnus-method-to-server
-                         (gnus-find-method-for-group
-                          (nnselect-article-group x)))) servers :test 'equal)))
+                (lambda (x)
+                  (when (and x (> x 0))
+                    (cl-pushnew
+                     (list
+                      (gnus-method-to-server
+                       (gnus-find-method-for-group
+                        (nnselect-article-group x)))) servers :test 'equal)))
                 (gnus-articles-in-thread thread)))))
        (setq servers (list (list server))))
       (setq artlist
-           (nnir-run-query
+           (gnus-search-run-query
             (list
-             (cons 'nnir-query-spec
-                   (list (cons 'query  (format "HEADER Message-ID %s" article))
-                   (cons 'criteria "")  (cons 'shortcut t)))
-             (cons 'nnir-group-spec servers))))
+             (cons 'search-query-spec
+                   (list (cons 'query `((id . ,article)))
+                         (cons 'criteria "")  (cons 'shortcut t)))
+             (cons 'search-group-spec servers))))
       (unless (zerop (nnselect-artlist-length artlist))
        (setq
         group-art
@@ -603,26 +603,35 @@ If this variable is nil, or if the provided function 
returns nil,
                             (cl-some #'(lambda (x)
                                          (when (and x (> x 0)) x))
                                      (gnus-articles-in-thread thread)))))))))
-      ;; Check if we are dealing with an imap backend.
-      (if (eq 'nnimap
-             (car (gnus-find-method-for-group artgroup)))
+      ;; Check if search-based thread referral is permitted, and
+      ;; available.
+      (if (and gnus-refer-thread-use-search
+              (gnus-search-server-to-engine
+               (gnus-method-to-server
+                (gnus-find-method-for-group artgroup))))
          ;; If so we perform the query, massage the result, and return
          ;; the new headers back to the caller to incorporate into the
          ;; current summary buffer.
          (let* ((group-spec
                  (list (delq nil (list
                                   (or server (gnus-group-server artgroup))
-                                  (unless  gnus-refer-thread-use-search
+                                  (unless gnus-refer-thread-use-search
                                     artgroup)))))
+                (ids (cons (mail-header-id header)
+                           (split-string
+                            (or (mail-header-references header)
+                                ""))))
                 (query-spec
-                 (list (cons 'query (nnimap-make-thread-query header))
-                       (cons 'criteria "")))
+                 (list (cons 'query (mapconcat (lambda (i)
+                                                 (format "id:%s" i))
+                                               ids " or "))
+                       (cons 'thread t)))
                 (last (nnselect-artlist-length gnus-newsgroup-selection))
                 (first (1+ last))
                 (new-nnselect-artlist
-                 (nnir-run-query
-                  (list (cons 'nnir-query-spec query-spec)
-                        (cons 'nnir-group-spec group-spec))))
+                 (gnus-search-run-query
+                  (list (cons 'search-query-spec query-spec)
+                        (cons 'search-group-spec group-spec))))
                 old-arts seq
                 headers)
            (mapc
@@ -670,7 +679,7 @@ If this variable is nil, or if the provided function 
returns nil,
               group
               (cons 1 (nnselect-artlist-length gnus-newsgroup-selection))))
            headers)
-       ;; If not an imap backend just warp to the original article
+       ;; If we can't or won't use search, just warp to the original
        ;; group and punt back to gnus-summary-refer-thread.
        (and (gnus-warp-to-article) (gnus-summary-refer-thread))))))
 
@@ -768,9 +777,15 @@ Return an article list."
 The current server will be searched.  If the registry is
 installed, the server that the registry reports the current
 article came from is also searched."
-  (let* ((query
-         (list (cons 'query (nnimap-make-thread-query header))
-               (cons 'criteria "")))
+  (let* ((ids (cons (mail-header-id header)
+                   (split-string
+                    (or (mail-header-references header)
+                        ""))))
+        (query
+         (list (cons 'query (mapconcat (lambda (i)
+                                         (format "id:%s" i))
+                                       ids " or "))
+               (cons 'thread t)))
         (server
          (list (list (gnus-method-to-server
           (gnus-find-method-for-group gnus-newsgroup-name)))))
@@ -794,10 +809,10 @@ article came from is also searched."
      (list
       (cons 'nnselect-specs
            (list
-            (cons 'nnselect-function 'nnir-run-query)
+            (cons 'nnselect-function 'gnus-search-run-query)
             (cons 'nnselect-args
-                  (list (cons 'nnir-query-spec query)
-                        (cons 'nnir-group-spec server)))))
+                  (list (cons 'search-query-spec query)
+                        (cons 'search-group-spec server)))))
       (cons 'nnselect-artlist nil)))
     (gnus-summary-goto-subject (gnus-id-to-article (mail-header-id header)))))
 
@@ -929,18 +944,18 @@ article came from is also searched."
 
 (declare-function gnus-registry-get-id-key "gnus-registry" (id key))
 
-(defun gnus-summary-make-search-group (nnir-extra-parms)
+(defun gnus-summary-make-search-group (no-parse)
   "Search a group from the summary buffer.
-Pass NNIR-EXTRA-PARMS on to the search engine."
+Pass NO-PARSE on to the search engine."
   (interactive "P")
   (gnus-warp-to-article)
   (let ((spec
         (list
-         (cons 'nnir-group-spec
+         (cons 'search-group-spec
                (list (list
                       (gnus-group-server gnus-newsgroup-name)
                       gnus-newsgroup-name))))))
-    (gnus-group-make-search-group nnir-extra-parms spec)))
+    (gnus-group-make-search-group no-parse spec)))
 
 
 ;; The end.
diff --git a/lisp/help.el b/lisp/help.el
index c42e4b4..6399a12 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -1013,8 +1013,7 @@ Otherwise, return a new string (without any text 
properties)."
         (insert string)
         (goto-char (point-min))
         (while (< (point) (point-max))
-          (let ((standard-output (current-buffer))
-                (orig-point (point))
+          (let ((orig-point (point))
                 end-point active-maps
                 close generate-summary)
             (cond
@@ -1169,14 +1168,14 @@ Any inserted text ends in two newlines (used by
          (print-title (or maps always-title)))
     ;; Print title.
     (when print-title
-      (princ (concat (if title
-                         (concat title
-                                 (if prefix
-                                     (concat " Starting With "
-                                             (key-description prefix)))
-                                 ":\n"))
-                     "key             binding\n"
-                     "---             -------\n")))
+      (insert (concat (if title
+                          (concat title
+                                  (if prefix
+                                      (concat " Starting With "
+                                              (key-description prefix)))
+                                  ":\n"))
+                      "key             binding\n"
+                      "---             -------\n")))
     ;; Describe key bindings.
     (setq help--keymaps-seen nil)
     (while (consp maps)
@@ -1190,8 +1189,8 @@ Any inserted text ends in two newlines (used by
                 ;; map.
                 (or (keymapp sub-shadows)
                     (null sub-shadows)
-                    (consp sub-shadows)
-                    (not (keymapp (car sub-shadows)))))
+                    (and (consp sub-shadows)
+                         (keymapp (car sub-shadows)))))
           ;; Maps we have already listed in this loop shadow this map.
           (let ((tail orig-maps))
             (while (not (equal tail maps))
@@ -1202,7 +1201,7 @@ Any inserted text ends in two newlines (used by
                         sub-shadows no-menu mention-shadow)))
       (setq maps (cdr maps)))
     (when print-title
-      (princ "\n"))))
+      (insert "\n"))))
 
 (defun help--shadow-lookup (keymap key accept-default remap)
   "Like `lookup-key', but with command remapping.
diff --git a/lisp/ielm.el b/lisp/ielm.el
index b3654b9..91d025d 100644
--- a/lisp/ielm.el
+++ b/lisp/ielm.el
@@ -533,9 +533,10 @@ Customized bindings may be defined in `ielm-map', which 
currently contains:
   (set (make-local-variable 'paragraph-start) comint-prompt-regexp)
   (setq comint-input-sender 'ielm-input-sender)
   (setq comint-process-echoes nil)
-  (set (make-local-variable 'completion-at-point-functions)
-       '(comint-replace-by-expanded-history
-         ielm-complete-filename elisp-completion-at-point))
+  (dolist (f '(elisp-completion-at-point
+               ielm-complete-filename
+               comint-replace-by-expanded-history))
+    (add-hook 'completion-at-point-functions f nil t))
   (add-hook 'eldoc-documentation-functions
             #'elisp-eldoc-var-docstring nil t)
   (add-hook 'eldoc-documentation-functions
diff --git a/lisp/international/isearch-x.el b/lisp/international/isearch-x.el
index d77234e..f50f86a 100644
--- a/lisp/international/isearch-x.el
+++ b/lisp/international/isearch-x.el
@@ -51,6 +51,17 @@
   (setq input-method-function nil)
   (isearch-update))
 
+;;;###autoload
+(defun isearch-transient-input-method ()
+  "Activate transient input method in interactive search."
+  (interactive)
+  (let ((overriding-terminal-local-map nil))
+    (activate-transient-input-method))
+  (setq isearch-input-method-function input-method-function
+       isearch-input-method-local-p t)
+  (setq input-method-function nil)
+  (isearch-update))
+
 (defvar isearch-minibuffer-local-map
   (let ((map (copy-keymap minibuffer-local-map)))
     (define-key map [with-keyboard-coding] 'isearch-with-keyboard-coding)
@@ -117,6 +128,7 @@
                          (cons last-char unread-command-events))
                    ;; Inherit current-input-method in a minibuffer.
                    str (read-string prompt isearch-message 'junk-hist nil t))
+             (deactivate-transient-input-method)
              (if (or (not str) (< (length str) (length isearch-message)))
                  ;; All inputs were deleted while the input method
                  ;; was working.
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index e3155df..439843a 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -55,6 +55,7 @@
 
 ;; Keep "C-x C-m ..." for mule specific commands.
 (define-key ctl-x-map "\C-m" mule-keymap)
+(define-key ctl-x-map "\\" 'activate-transient-input-method)
 
 (defvar describe-language-environment-map
   (let ((map (make-sparse-keymap "Describe Language Environment")))
@@ -139,8 +140,8 @@
       `(menu-item "Set Coding Systems" ,set-coding-system-map))
 
     (bindings--define-key map [separator-input-method] menu-bar-separator)
-    (bindings--define-key map [describe-input-method]
-      '(menu-item "Describe Input Method"  describe-input-method))
+    (bindings--define-key map [activate-transient-input-method]
+      '(menu-item "Transient Input Method" activate-transient-input-method))
     (bindings--define-key map [set-input-method]
       '(menu-item "Select Input Method..." set-input-method))
     (bindings--define-key map [toggle-input-method]
@@ -1344,6 +1345,29 @@ This is the input method activated automatically by the 
command
                  mule-input-method-string)
   :set-after '(current-language-environment))
 
+(defcustom default-transient-input-method nil
+  "Default transient input method.
+This is the input method activated by the command
+`activate-transient-input-method' (\\[activate-transient-input-method])."
+  :link  '(custom-manual "(emacs)Input Methods")
+  :group 'mule
+  :type '(choice (const nil)
+                 mule-input-method-string)
+  :set-after '(current-language-environment)
+  :version "28.1")
+
+(defvar current-transient-input-method nil
+  "The current input method temporarily enabled by 
`activate-transient-input-method'.
+If nil, that means no transient input method is active now.")
+(make-variable-buffer-local 'current-transient-input-method)
+(put 'current-transient-input-method 'permanent-local t)
+
+(defvar previous-transient-input-method nil
+  "The input method that was active before enabling the transient input method.
+If nil, that means no previous input method was active.")
+(make-variable-buffer-local 'previous-transient-input-method)
+(put 'previous-transient-input-method 'permanent-local t)
+
 (put 'input-method-function 'permanent-local t)
 
 (defvar input-method-history nil
@@ -1478,7 +1502,8 @@ If INPUT-METHOD is nil, deactivate any current input 
method."
 (defun deactivate-input-method ()
   "Turn off the current input method."
   (when current-input-method
-    (add-to-history 'input-method-history current-input-method)
+    (unless current-transient-input-method
+      (add-to-history 'input-method-history current-input-method))
     (unwind-protect
        (progn
          (setq input-method-function nil
@@ -1540,7 +1565,9 @@ which marks the variable `default-input-method' as set 
for Custom buffers."
   (if toggle-input-method-active
       (error "Recursive use of `toggle-input-method'"))
   (if (and current-input-method (not arg))
-      (deactivate-input-method)
+      (if current-transient-input-method
+          (deactivate-transient-input-method)
+        (deactivate-input-method))
     (let ((toggle-input-method-active t)
          (default (or (car input-method-history) default-input-method)))
       (if (and arg default (equal current-input-method default)
@@ -1559,6 +1586,42 @@ which marks the variable `default-input-method' as set 
for Custom buffers."
          (when interactive
            (customize-mark-as-set 'default-input-method)))))))
 
+(defun activate-transient-input-method (&optional arg interactive)
+  "Select and enable a transient input method for the current buffer.
+If `default-transient-input-method' was not yet defined, prompt for it."
+  (interactive "P\np")
+  (when (or arg (not default-transient-input-method))
+    (let* ((default (or (car input-method-history) default-input-method))
+           (input-method
+            (read-input-method-name
+             (format-prompt "Transient input method" default)
+             default t)))
+      (setq default-transient-input-method input-method)
+      (when interactive
+        (customize-mark-as-set 'default-transient-input-method))))
+  (let* ((clearfun (make-symbol "clear-transient-input-method"))
+         (exitfun
+          (lambda ()
+            (deactivate-transient-input-method)
+            (remove-hook 'input-method-after-insert-chunk-hook clearfun))))
+    (fset clearfun (lambda () (funcall exitfun)))
+    (add-hook 'input-method-after-insert-chunk-hook clearfun)
+    (setq previous-transient-input-method current-input-method)
+    (when previous-transient-input-method
+      (deactivate-input-method))
+    (activate-input-method default-transient-input-method)
+    (setq current-transient-input-method default-transient-input-method)
+    exitfun))
+
+(defun deactivate-transient-input-method ()
+  "Disable currently active transient input method for the current buffer."
+  (when current-transient-input-method
+    (deactivate-input-method)
+    (when previous-transient-input-method
+      (activate-input-method previous-transient-input-method)
+      (setq previous-transient-input-method nil))
+    (setq current-transient-input-method nil)))
+
 (autoload 'help-buffer "help-mode")
 
 (defun describe-input-method (input-method)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index c3d5ff2..4fba437 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -565,6 +565,10 @@ This is like `describe-bindings', but displays only 
Isearch keys."
                   :help "Highlight all matches for current search string"))
     (define-key map [isearch-search-replace-separator]
       '(menu-item "--"))
+    (define-key map [isearch-transient-input-method]
+      '(menu-item "Turn on transient input method"
+                  isearch-transient-input-method
+                  :help "Turn on transient input method for search"))
     (define-key map [isearch-toggle-specified-input-method]
       '(menu-item "Turn on specific input method"
                   isearch-toggle-specified-input-method
@@ -747,6 +751,7 @@ This is like `describe-bindings', but displays only Isearch 
keys."
     ;; For searching multilingual text.
     (define-key map "\C-\\" 'isearch-toggle-input-method)
     (define-key map "\C-^" 'isearch-toggle-specified-input-method)
+    (define-key map "\C-x\\" 'isearch-transient-input-method)
 
     ;; People expect to be able to paste with the mouse.
     (define-key map [mouse-2] #'isearch-mouse-2)
@@ -1078,6 +1083,8 @@ To use a different input method for searching, type \
 \\[isearch-toggle-specified-input-method],
 and specify an input method you want to use.
 
+To activate a transient input method, type \\[isearch-transient-input-method].
+
 The above keys, bound in `isearch-mode-map', are often controlled by
  options; do \\[apropos] on search-.* to find them.
 Other control and meta characters terminate the search
@@ -3262,6 +3269,8 @@ the word mode."
                              (< (point) isearch-opoint)))
                       "over")
                   (if isearch-wrapped "wrapped ")
+                   (if (and (not isearch-success) (buffer-narrowed-p) 
widen-automatically)
+                       "narrowed " "")
                    (if (and (not isearch-success) (not 
isearch-case-fold-search))
                        "case-sensitive ")
                    (let ((prefix ""))
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index 3260b67..f5ae3ad 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -511,10 +511,13 @@ Return t if `allout-mode' is active in current buffer." 
nil t)
 (autoload 'allout-mode "allout" "\
 Toggle Allout outline mode.
 
-If called interactively, enable Allout mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Allout mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -829,10 +832,13 @@ See `allout-widgets-mode' for allout widgets mode 
features.")
 (autoload 'allout-widgets-mode "allout-widgets" "\
 Toggle Allout Widgets mode.
 
-If called interactively, enable Allout-Widgets mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Allout-Widgets mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1246,15 +1252,17 @@ Entering array mode calls the function 
`array-mode-hook'.
 
 ;;;### (autoloads nil "artist" "textmodes/artist.el" (0 0 0 0))
 ;;; Generated autoloads from textmodes/artist.el
-(push (purecopy '(artist 1 2 6)) package--builtin-versions)
 
 (autoload 'artist-mode "artist" "\
 Toggle Artist mode.
 
-If called interactively, enable Artist mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Artist mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1528,7 +1536,7 @@ ENTRY is the name of a password-store entry.
 The key used to retrieve the password is the symbol `secret'.
 
 The convention used as the format for a password-store file is
-the following (see https://www.passwordstore.org/#organization):
+the following (see http://www.passwordstore.org/#organization):
 
 secret
 key1: value1
@@ -1586,10 +1594,13 @@ or call the function `autoarg-kp-mode'.")
 (autoload 'autoarg-kp-mode "autoarg" "\
 Toggle Autoarg-KP mode, a global minor mode.
 
-If called interactively, enable Autoarg-Kp mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Autoarg-Kp mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1645,10 +1656,13 @@ or call the function `auto-insert-mode'.")
 (autoload 'auto-insert-mode "autoinsert" "\
 Toggle Auto-insert mode, a global minor mode.
 
-If called interactively, enable Auto-Insert mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Auto-Insert mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1696,14 +1710,29 @@ The function does NOT recursively descend into 
subdirectories of the
 directory or directories specified.
 
 In an interactive call, prompt for a default output file for the
-autoload definitions, and temporarily bind the variable
-`generated-autoload-file' to this value.  When called from Lisp,
-use the existing value of `generated-autoload-file'.  If any Lisp
-file binds `generated-autoload-file' as a file-local variable,
-write its autoloads into the specified file instead.
+autoload definitions.  When called from Lisp, use the existing
+value of `generated-autoload-file'.  If any Lisp file binds
+`generated-autoload-file' as a file-local variable, write its
+autoloads into the specified file instead.
 
 \(fn &rest DIRS)" t nil)
 
+(make-obsolete 'update-directory-autoloads 'make-directory-autoloads '"28.1")
+
+(autoload 'make-directory-autoloads "autoload" "\
+Update autoload definitions for Lisp files in the directories DIRS.
+DIR can be either a single directory or a list of
+directories.  (The latter usage is discouraged.)
+
+The autoloads will be written to OUTPUT-FILE.  If any Lisp file
+binds `generated-autoload-file' as a file-local variable, write
+its autoloads into the specified file instead.
+
+The function does NOT recursively descend into subdirectories of the
+directory or directories specified.
+
+\(fn DIR OUTPUT-FILE)" t nil)
+
 (autoload 'batch-update-autoloads "autoload" "\
 Update loaddefs.el autoloads in batch mode.
 Calls `update-directory-autoloads' on the command line arguments.
@@ -1720,10 +1749,13 @@ should be non-nil)." nil nil)
 (autoload 'auto-revert-mode "autorevert" "\
 Toggle reverting buffer when the file changes (Auto-Revert Mode).
 
-If called interactively, enable Auto-Revert mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Auto-Revert mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1750,10 +1782,13 @@ This function is designed to be added to hooks, for 
example:
 (autoload 'auto-revert-tail-mode "autorevert" "\
 Toggle reverting tail of buffer when the file grows.
 
-If called interactively, enable Auto-Revert-Tail mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Auto-Revert-Tail mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1794,10 +1829,13 @@ or call the function `global-auto-revert-mode'.")
 (autoload 'global-auto-revert-mode "autorevert" "\
 Toggle Global Auto-Revert Mode.
 
-If called interactively, enable Global Auto-Revert mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Auto-Revert mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -1928,10 +1966,13 @@ or call the function `display-battery-mode'.")
 (autoload 'display-battery-mode "battery" "\
 Toggle battery status display in mode line (Display Battery mode).
 
-If called interactively, enable Display-Battery mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Display-Battery mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -2907,10 +2948,13 @@ columns on its right towards the left.
 (autoload 'bug-reference-mode "bug-reference" "\
 Toggle hyperlinking bug references in the buffer (Bug Reference mode).
 
-If called interactively, enable Bug-Reference mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Bug-Reference mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -2920,10 +2964,13 @@ disabled.
 (autoload 'bug-reference-prog-mode "bug-reference" "\
 Like `bug-reference-mode', but only buttonize in comments and strings.
 
-If called interactively, enable Bug-Reference-Prog mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Bug-Reference-Prog mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -2998,11 +3045,14 @@ that already has a `.elc' file.
 Compile a file of Lisp code named FILENAME into a file of byte code.
 The output file's name is generated by passing FILENAME to the
 function `byte-compile-dest-file' (which see).
-With prefix arg (noninteractively: 2nd arg), LOAD the file after compiling.
 The value is non-nil if there were no errors, nil if errors.
 
+See also `emacs-lisp-byte-compile-and-load'.
+
 \(fn FILENAME &optional LOAD)" t nil)
 
+(set-advertised-calling-convention 'byte-compile-file '(filename) '"28.1")
+
 (autoload 'compile-defun "bytecomp" "\
 Compile and evaluate the current top-level form.
 Print the result in the echo area.
@@ -3295,14 +3345,6 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "calc-aent" 
"calc/calc-aent.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from calc/calc-aent.el
-
-(register-definition-prefixes "calc-aent" '("calc" "math-"))
-
-;;;***
-
 ;;;### (autoloads nil "calc-alg" "calc/calc-alg.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-alg.el
 
@@ -3338,14 +3380,6 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "calc-embed" 
"calc/calc-embed.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from calc/calc-embed.el
-
-(register-definition-prefixes "calc-embed" '("calc-"))
-
-;;;***
-
 ;;;### (autoloads nil "calc-ext" "calc/calc-ext.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-ext.el
 
@@ -3444,14 +3478,6 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "calc-misc" 
"calc/calc-misc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from calc/calc-misc.el
-
-(register-definition-prefixes "calc-misc" '("math-iipow"))
-
-;;;***
-
 ;;;### (autoloads nil "calc-mode" "calc/calc-mode.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calc-mode.el
 
@@ -3562,14 +3588,6 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "calc-yank" 
"calc/calc-yank.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from calc/calc-yank.el
-
-(register-definition-prefixes "calc-yank" '("calc-" "math-number-regexp"))
-
-;;;***
-
 ;;;### (autoloads nil "calcalg2" "calc/calcalg2.el" (0 0 0 0))
 ;;; Generated autoloads from calc/calcalg2.el
 
@@ -4499,7 +4517,6 @@ from which to start.
 
 ;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/chart.el
-(push (purecopy '(chart 0 2)) package--builtin-versions)
 
 (register-definition-prefixes "chart" '("chart"))
 
@@ -4692,10 +4709,13 @@ Prefix argument is the same as for `checkdoc-defun'." t 
nil)
 (autoload 'checkdoc-minor-mode "checkdoc" "\
 Toggle automatic docstring checking (Checkdoc minor mode).
 
-If called interactively, enable Checkdoc minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Checkdoc minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -4788,14 +4808,6 @@ and runs the normal hook `command-history-hook'." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "cl-extra" 
"emacs-lisp/cl-extra.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/cl-extra.el
-
-(register-definition-prefixes "cl-extra" '("cl-"))
-
-;;;***
-
 ;;;### (autoloads nil "cl-font-lock" "progmodes/cl-font-lock.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from progmodes/cl-font-lock.el
@@ -4813,10 +4825,13 @@ or call the function `cl-font-lock-built-in-mode'.")
 (autoload 'cl-font-lock-built-in-mode "cl-font-lock" "\
 Highlight built-in functions, variables, and types in `lisp-mode'.
 
-If called interactively, enable Cl-Font-Lock-Built-In mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Cl-Font-Lock-Built-In mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -5028,10 +5043,13 @@ This can be needed when using code byte-compiled using 
the old
 macro-expansion of `cl-defstruct' that used vectors objects instead
 of record objects.
 
-If called interactively, enable Cl-Old-Struct-Compat mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Cl-Old-Struct-Compat mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -5042,14 +5060,6 @@ disabled.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "cl-macs" 
"emacs-lisp/cl-macs.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/cl-macs.el
-
-(register-definition-prefixes "cl-macs" '("cl-"))
-
-;;;***
-
 ;;;### (autoloads nil "cl-print" "emacs-lisp/cl-print.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from emacs-lisp/cl-print.el
@@ -5106,14 +5116,6 @@ limit.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "cl-seq" 
"emacs-lisp/cl-seq.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/cl-seq.el
-
-(register-definition-prefixes "cl-seq" '("cl--"))
-
-;;;***
-
 ;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/cmacexp.el
 
@@ -5480,10 +5482,13 @@ Runs `compilation-mode-hook' with `run-mode-hooks' 
(which see).
 (autoload 'compilation-shell-minor-mode "compile" "\
 Toggle Compilation Shell minor mode.
 
-If called interactively, enable Compilation-Shell minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Compilation-Shell minor mode'.  If
+the prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -5498,10 +5503,13 @@ See `compilation-mode'.
 (autoload 'compilation-minor-mode "compile" "\
 Toggle Compilation minor mode.
 
-If called interactively, enable Compilation minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Compilation minor mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -5538,10 +5546,13 @@ or call the function `dynamic-completion-mode'.")
 (autoload 'dynamic-completion-mode "completion" "\
 Toggle dynamic word-completion on or off.
 
-If called interactively, enable Dynamic-Completion mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Dynamic-Completion mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6102,10 +6113,13 @@ or call the function `cua-mode'.")
 (autoload 'cua-mode "cua-base" "\
 Toggle Common User Access style editing (CUA mode).
 
-If called interactively, enable Cua mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Cua mode'.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6153,10 +6167,13 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v 
bindings.
 Toggle the region as rectangular.
 Activates the region if needed.  Only lasts until the region is deactivated.
 
-If called interactively, enable Cua-Rectangle-Mark mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Cua-Rectangle-Mark mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6179,10 +6196,13 @@ By convention, this is a list of symbols where each 
symbol stands for the
 (autoload 'cursor-intangible-mode "cursor-sensor" "\
 Keep cursor outside of any `cursor-intangible' text property.
 
-If called interactively, enable Cursor-Intangible mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Cursor-Intangible mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6197,10 +6217,13 @@ where WINDOW is the affected window, OLDPOS is the last 
known position of
 the cursor and DIR can be `entered' or `left' depending on whether the cursor
 is entering the area covered by the text-property property or leaving it.
 
-If called interactively, enable Cursor-Sensor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Cursor-Sensor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6523,7 +6546,7 @@ The format is suitable for use with `easy-menu-define'.
 
 \(fn SYMBOL &optional NAME)" nil nil)
 
-(register-definition-prefixes "cus-edit" '("Custom-" "custom" "widget-"))
+(register-definition-prefixes "cus-edit" '("Custom-" "cus" "widget-"))
 
 ;;;***
 
@@ -6580,10 +6603,13 @@ Mode used for cvs status output.
 (autoload 'cwarn-mode "cwarn" "\
 Minor mode that highlights suspicious C and C++ constructions.
 
-If called interactively, enable Cwarn mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Cwarn mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -6618,7 +6644,9 @@ ARG is omitted or nil.
 
 Cwarn mode is enabled in all buffers where
 `turn-on-cwarn-mode-if-enabled' would do it.
-See `cwarn-mode' for more information on Cwarn mode.
+
+See `cwarn-mode' for more information on
+Cwarn mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -6824,8 +6852,7 @@ Variables controlling indentation style and extra 
features:
  dcl-imenu-label-call
     Change the text that is used as sub-listing labels in imenu.
 
-Loading this package calls the value of the variable
-`dcl-mode-load-hook' with no args, if that value is non-nil.
+To run code after DCL mode has loaded, use `with-eval-after-load'.
 Turning on DCL mode calls the value of the variable `dcl-mode-hook'
 with no args, if that value is non-nil.
 
@@ -6971,7 +6998,6 @@ The most useful commands are:
 
 ;;;### (autoloads nil "delim-col" "delim-col.el" (0 0 0 0))
 ;;; Generated autoloads from delim-col.el
-(push (purecopy '(delim-col 2 1)) package--builtin-versions)
 
 (autoload 'delimit-columns-customize "delim-col" "\
 Customize the `columns' group." t nil)
@@ -7032,10 +7058,13 @@ or call the function `delete-selection-mode'.")
 (autoload 'delete-selection-mode "delsel" "\
 Toggle Delete Selection mode.
 
-If called interactively, enable Delete-Selection mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Delete-Selection mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -7204,10 +7233,13 @@ or call the function `desktop-save-mode'.")
 (autoload 'desktop-save-mode "desktop" "\
 Toggle desktop saving (Desktop Save mode).
 
-If called interactively, enable Desktop-Save mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Desktop-Save mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -7600,10 +7632,13 @@ a diff with \\[diff-reverse-direction].
 (autoload 'diff-minor-mode "diff-mode" "\
 Toggle Diff minor mode.
 
-If called interactively, enable Diff minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Diff minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -7783,32 +7818,19 @@ Like \\[dired-jump] (`dired-jump') but in other window.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "dired-aux" "dired-aux.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from dired-aux.el
-
-(register-definition-prefixes "dired-aux" '("dired-" 
"minibuffer-default-add-dired-shell-commands"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "dired-x" "dired-x.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from dired-x.el
-
-(register-definition-prefixes "dired-x" '("dired-" "virtual-dired"))
-
-;;;***
-
 ;;;### (autoloads nil "dirtrack" "dirtrack.el" (0 0 0 0))
 ;;; Generated autoloads from dirtrack.el
 
 (autoload 'dirtrack-mode "dirtrack" "\
 Toggle directory tracking in shell buffers (Dirtrack mode).
 
-If called interactively, enable Dirtrack mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Dirtrack mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -7979,10 +8001,13 @@ in `.emacs'.
 Toggle display of fill-column indicator.
 This uses `display-fill-column-indicator' internally.
 
-If called interactively, enable Display-Fill-Column-Indicator mode if
-ARG is positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and toggle
-it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Display-Fill-Column-Indicator mode'.
+If the prefix argument is positive, enable the mode, and if it is zero
+or negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -7990,6 +8015,8 @@ disabled.
 To change the position of the column displayed by default
 customize `display-fill-column-indicator-column'.  You can change the
 character for the indicator setting `display-fill-column-indicator-character'.
+The globalized version is `global-display-fill-column-indicator-mode',
+which see.
 See Info node `Displaying Boundaries' for details.
 
 \(fn &optional ARG)" t nil)
@@ -8014,10 +8041,31 @@ ARG is omitted or nil.
 
 Display-Fill-Column-Indicator mode is enabled in all buffers where
 `display-fill-column-indicator--turn-on' would do it.
-See `display-fill-column-indicator-mode' for more information on 
Display-Fill-Column-Indicator mode.
+
+See `display-fill-column-indicator-mode' for more information on
+Display-Fill-Column-Indicator mode.
+
+`global-display-fill-column-indicator-modes' is used to control which modes
+this minor mode is used in.
 
 \(fn &optional ARG)" t nil)
 
+(defvar global-display-fill-column-indicator-modes '((not special-mode) t) "\
+Which major modes `display-fill-column-indicator-mode' is switched on in.
+This variable can be either t (all major modes), nil (no major modes),
+or a list of modes and (not modes) to switch use this minor mode or
+not.  For instance
+
+  (c-mode (not message-mode mail-mode) text-mode)
+
+means \"use this mode in all modes derived from `c-mode', don't use in
+modes derived from `message-mode' or `mail-mode', but do use in other
+modes derived from `text-mode'\".  An element with value t means \"use\"
+and nil means \"don't use\".  There's an implicit nil at the end of the
+list.")
+
+(custom-autoload 'global-display-fill-column-indicator-modes 
"display-fill-column-indicator" t)
+
 (register-definition-prefixes "display-fill-column-indicator" 
'("display-fill-column-indicator--turn-on"))
 
 ;;;***
@@ -8030,10 +8078,13 @@ See `display-fill-column-indicator-mode' for more 
information on Display-Fill-Co
 Toggle display of line numbers in the buffer.
 This uses `display-line-numbers' internally.
 
-If called interactively, enable Display-Line-Numbers mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Display-Line-Numbers mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -8064,7 +8115,9 @@ ARG is omitted or nil.
 
 Display-Line-Numbers mode is enabled in all buffers where
 `display-line-numbers--turn-on' would do it.
-See `display-line-numbers-mode' for more information on Display-Line-Numbers 
mode.
+
+See `display-line-numbers-mode' for more information on
+Display-Line-Numbers mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -8168,10 +8221,13 @@ to the next best mode." nil nil)
 (autoload 'doc-view-minor-mode "doc-view" "\
 Toggle displaying buffer via Doc View (Doc View minor mode).
 
-If called interactively, enable Doc-View minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Doc-View minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -8233,10 +8289,13 @@ Switch to *doctor* buffer and start giving 
psychotherapy." t nil)
 (autoload 'double-mode "double" "\
 Toggle special insertion on double keypresses (Double mode).
 
-If called interactively, enable Double mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Double mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -8252,7 +8311,6 @@ strings when pressed twice.  See `double-map' for details.
 
 ;;;### (autoloads nil "dunnet" "play/dunnet.el" (0 0 0 0))
 ;;; Generated autoloads from play/dunnet.el
-(push (purecopy '(dunnet 2 2)) package--builtin-versions)
 
 (autoload 'dunnet "dunnet" "\
 Switch to *dungeon* buffer and start game." t nil)
@@ -8297,6 +8355,10 @@ appear in DOC, a paragraph is added to DOC explaining
 usage of the mode argument.
 
 Optional INIT-VALUE is the initial value of the mode's variable.
+  Note that the minor mode function won't be called by setting
+  this option, so the value *reflects* the minor mode's natural
+  initial state, rather than *setting* it.
+  In the vast majority of cases it should be nil.
 Optional LIGHTER is displayed in the mode line when the mode is on.
 Optional KEYMAP is the default keymap bound to the mode keymap.
   If non-nil, it should be a variable name (whose value is a keymap),
@@ -8354,18 +8416,21 @@ For example, you could write
 (autoload 'define-globalized-minor-mode "easy-mmode" "\
 Make a global mode GLOBAL-MODE corresponding to buffer-local minor MODE.
 TURN-ON is a function that will be called with no args in every buffer
-  and that should try to turn MODE on if applicable for that buffer.
-Each of KEY VALUE is a pair of CL-style keyword arguments.  As
-  the minor mode defined by this function is always global, any
-  :global keyword is ignored.  Other keywords have the same
-  meaning as in `define-minor-mode', which see.  In particular,
-  :group specifies the custom group.  The most useful keywords
-  are those that are passed on to the `defcustom'.  It normally
-  makes no sense to pass the :lighter or :keymap keywords to
-  `define-globalized-minor-mode', since these are usually passed
-  to the buffer-local version of the minor mode.
+and that should try to turn MODE on if applicable for that buffer.
+
+Each of KEY VALUE is a pair of CL-style keyword arguments.  :predicate
+specifies which major modes the globalized minor mode should be switched on
+in.  As the minor mode defined by this function is always global, any
+:global keyword is ignored.  Other keywords have the same meaning as in
+`define-minor-mode', which see.  In particular, :group specifies the custom
+group.  The most useful keywords are those that are passed on to the
+`defcustom'.  It normally makes no sense to pass the :lighter or :keymap
+keywords to `define-globalized-minor-mode', since these are usually passed
+to the buffer-local version of the minor mode.
+
 BODY contains code to execute each time the mode is enabled or disabled.
-  It is executed after toggling the mode, and before running GLOBAL-MODE-hook.
+It is executed after toggling the mode, and before running
+GLOBAL-MODE-hook.
 
 If MODE's set-up depends on the major mode in effect when it was
 enabled, then disabling and reenabling MODE should make MODE work
@@ -9074,10 +9139,13 @@ or call the function `global-ede-mode'.")
 (autoload 'global-ede-mode "ede" "\
 Toggle global EDE (Emacs Development Environment) mode.
 
-If called interactively, enable Global Ede mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Ede mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -9106,38 +9174,6 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ede/base" 
"cedet/ede/base.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/base.el
-
-(register-definition-prefixes "ede/base" '("ede-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/config" 
"cedet/ede/config.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/config.el
-
-(register-definition-prefixes "ede/config" '("ede-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/cpp-root"
-;;;;;;  "cedet/ede/cpp-root.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/cpp-root.el
-
-(register-definition-prefixes "ede/cpp-root" '("ede-cpp-root-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/custom" 
"cedet/ede/custom.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/custom.el
-
-(register-definition-prefixes "ede/custom" '("ede-" "eieio-ede-old-variables"))
-
-;;;***
-
 ;;;### (autoloads nil "ede/detect" "cedet/ede/detect.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/ede/detect.el
 
@@ -9145,62 +9181,6 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ede/dired" 
"cedet/ede/dired.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/dired.el
-
-(register-definition-prefixes "ede/dired" '("ede-dired-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/emacs" 
"cedet/ede/emacs.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/emacs.el
-
-(register-definition-prefixes "ede/emacs" '("ede-emacs-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/files" 
"cedet/ede/files.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/files.el
-
-(register-definition-prefixes "ede/files" '("ede-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/generic"
-;;;;;;  "cedet/ede/generic.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/generic.el
-
-(register-definition-prefixes "ede/generic" '("ede-generic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/linux" 
"cedet/ede/linux.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/linux.el
-
-(register-definition-prefixes "ede/linux" '("ede-linux-" "project-linux-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/locate" 
"cedet/ede/locate.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/locate.el
-
-(register-definition-prefixes "ede/locate" '("ede-locate-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ede/make" 
"cedet/ede/make.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/make.el
-
-(register-definition-prefixes "ede/make" '("ede-"))
-
-;;;***
-
 ;;;### (autoloads nil "ede/makefile-edit" "cedet/ede/makefile-edit.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/ede/makefile-edit.el
@@ -9318,14 +9298,6 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ede/shell" 
"cedet/ede/shell.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/shell.el
-
-(register-definition-prefixes "ede/shell" '("ede-shell-run-command"))
-
-;;;***
-
 ;;;### (autoloads nil "ede/simple" "cedet/ede/simple.el" (0 0 0 0))
 ;;; Generated autoloads from cedet/ede/simple.el
 
@@ -9340,14 +9312,6 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ede/speedbar"
-;;;;;;  "cedet/ede/speedbar.el" (0 0 0 0))
-;;; Generated autoloads from cedet/ede/speedbar.el
-
-(register-definition-prefixes "ede/speedbar" '("ede-"))
-
-;;;***
-
 ;;;### (autoloads nil "ede/srecode" "cedet/ede/srecode.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from cedet/ede/srecode.el
@@ -9356,14 +9320,6 @@ an EDE controlled project.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ede/util" 
"cedet/ede/util.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/ede/util.el
-
-(register-definition-prefixes "ede/util" '("ede-make-buffer-writable"))
-
-;;;***
-
 ;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
@@ -9829,7 +9785,6 @@ To change the default, set the variable 
`ediff-use-toolbar-p', which see." t nil
 
 ;;;### (autoloads nil "edmacro" "edmacro.el" (0 0 0 0))
 ;;; Generated autoloads from edmacro.el
-(push (purecopy '(edmacro 2 1)) package--builtin-versions)
 
 (autoload 'edit-kbd-macro "edmacro" "\
 Edit a keyboard macro.
@@ -9981,14 +9936,6 @@ BUFFER is put back into its original major mode.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "eieio-compat"
-;;;;;;  "emacs-lisp/eieio-compat.el" (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/eieio-compat.el
-
-(register-definition-prefixes "eieio-compat" 
'("eieio--generic-static-symbol-specializers" "generic-p" "next-method-p" 
"no-"))
-
-;;;***
-
 ;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio-core.el
@@ -10008,14 +9955,6 @@ It creates an autoload function for CNAME's constructor.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "eieio-custom"
-;;;;;;  "emacs-lisp/eieio-custom.el" (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/eieio-custom.el
-
-(register-definition-prefixes "eieio-custom" '("eieio-"))
-
-;;;***
-
 ;;;### (autoloads nil "eieio-datadebug" "emacs-lisp/eieio-datadebug.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio-datadebug.el
@@ -10024,14 +9963,6 @@ It creates an autoload function for CNAME's constructor.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "eieio-opt" 
"emacs-lisp/eieio-opt.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from emacs-lisp/eieio-opt.el
-
-(register-definition-prefixes "eieio-opt" '("eieio-"))
-
-;;;***
-
 ;;;### (autoloads nil "eieio-speedbar" "emacs-lisp/eieio-speedbar.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/eieio-speedbar.el
@@ -10042,7 +9973,7 @@ It creates an autoload function for CNAME's constructor.
 
 ;;;### (autoloads nil "eldoc" "emacs-lisp/eldoc.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/eldoc.el
-(push (purecopy '(eldoc 1 10 0)) package--builtin-versions)
+(push (purecopy '(eldoc 1 11 0)) package--builtin-versions)
 
 ;;;***
 
@@ -10062,10 +9993,13 @@ or call the function `electric-pair-mode'.")
 (autoload 'electric-pair-mode "elec-pair" "\
 Toggle automatic parens pairing (Electric Pair mode).
 
-If called interactively, enable Electric-Pair mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Electric-Pair mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -10083,10 +10017,13 @@ To toggle the mode in a single buffer, use 
`electric-pair-local-mode'.
 (autoload 'electric-pair-local-mode "elec-pair" "\
 Toggle `electric-pair-mode' only in this buffer.
 
-If called interactively, enable Electric-Pair-Local mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Electric-Pair-Local mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -10182,142 +10119,6 @@ displayed." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "em-alias" 
"eshell/em-alias.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-alias.el
-
-(register-definition-prefixes "em-alias" '("eshell" 
"pcomplete/eshell-mode/alias"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-banner" 
"eshell/em-banner.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-banner.el
-
-(register-definition-prefixes "em-banner" '("eshell-banner-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-basic" 
"eshell/em-basic.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-basic.el
-
-(register-definition-prefixes "em-basic" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-cmpl" 
"eshell/em-cmpl.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-cmpl.el
-
-(register-definition-prefixes "em-cmpl" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-dirs" 
"eshell/em-dirs.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-dirs.el
-
-(register-definition-prefixes "em-dirs" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-glob" 
"eshell/em-glob.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-glob.el
-
-(register-definition-prefixes "em-glob" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-hist" 
"eshell/em-hist.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-hist.el
-
-(register-definition-prefixes "em-hist" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-ls" "eshell/em-ls.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-ls.el
-
-(register-definition-prefixes "em-ls" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-pred" 
"eshell/em-pred.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-pred.el
-
-(register-definition-prefixes "em-pred" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-prompt" 
"eshell/em-prompt.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-prompt.el
-
-(register-definition-prefixes "em-prompt" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-rebind" 
"eshell/em-rebind.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-rebind.el
-
-(register-definition-prefixes "em-rebind" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-script" 
"eshell/em-script.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-script.el
-
-(register-definition-prefixes "em-script" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-smart" 
"eshell/em-smart.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-smart.el
-
-(register-definition-prefixes "em-smart" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-term" 
"eshell/em-term.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-term.el
-
-(register-definition-prefixes "em-term" '("eshell-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-tramp" 
"eshell/em-tramp.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-tramp.el
-
-(register-definition-prefixes "em-tramp" '("eshell"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-unix" 
"eshell/em-unix.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-unix.el
-
-(register-definition-prefixes "em-unix" '("eshell" "nil-blank-string"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "em-xtra" 
"eshell/em-xtra.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from eshell/em-xtra.el
-
-(register-definition-prefixes "em-xtra" '("eshell/"))
-
-;;;***
-
 ;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lock.el
 
@@ -10439,10 +10240,13 @@ Minor mode for editing text/enriched files.
 These are files with embedded formatting information in the MIME standard
 text/enriched format.
 
-If called interactively, enable Enriched mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Enriched mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -10701,10 +10505,13 @@ Encrypt marked files." t nil)
 (autoload 'epa-mail-mode "epa-mail" "\
 A minor-mode for composing encrypted/clearsigned mails.
 
-If called interactively, enable epa-mail mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `epa-mail mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -10768,10 +10575,13 @@ or call the function `epa-global-mail-mode'.")
 (autoload 'epa-global-mail-mode "epa-mail" "\
 Minor mode to hook EasyPG into Mail mode.
 
-If called interactively, enable Epa-Global-Mail mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Epa-Global-Mail mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -10857,7 +10667,7 @@ Non-interactively, it takes the keyword arguments
 
 That is, if called with
 
-   (erc :server \"irc.freenode.net\" :full-name \"Harry S Truman\")
+   (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
 
 then the server and full-name will be set to those values, whereas
 `erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
@@ -10884,14 +10694,6 @@ Otherwise, connect to HOST:PORT as USER and /join 
CHANNEL.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "erc-autoaway"
-;;;;;;  "erc/erc-autoaway.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-autoaway.el
-
-(register-definition-prefixes "erc-autoaway" '("erc-auto"))
-
-;;;***
-
 ;;;### (autoloads nil "erc-backend" "erc/erc-backend.el" (0 0 0 0))
 ;;; Generated autoloads from erc/erc-backend.el
 
@@ -10899,54 +10701,6 @@ Otherwise, connect to HOST:PORT as USER and /join 
CHANNEL.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "erc-button" 
"erc/erc-button.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-button.el
-
-(register-definition-prefixes "erc-button" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-capab" 
"erc/erc-capab.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-capab.el
-
-(register-definition-prefixes "erc-capab" '("erc-capab-identify-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-dcc" "erc/erc-dcc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-dcc.el
-
-(register-definition-prefixes "erc-dcc" '("erc-" "pcomplete/erc-mode/"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-desktop-notifications"
-;;;;;;  "erc/erc-desktop-notifications.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-desktop-notifications.el
-
-(register-definition-prefixes "erc-desktop-notifications" 
'("erc-notifications-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-ezbounce"
-;;;;;;  "erc/erc-ezbounce.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-ezbounce.el
-
-(register-definition-prefixes "erc-ezbounce" '("erc-ezb-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-fill" "erc/erc-fill.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-fill.el
-
-(register-definition-prefixes "erc-fill" '("erc-"))
-
-;;;***
-
 ;;;### (autoloads nil "erc-goodies" "erc/erc-goodies.el" (0 0 0 0))
 ;;; Generated autoloads from erc/erc-goodies.el
 
@@ -10961,30 +10715,6 @@ Otherwise, connect to HOST:PORT as USER and /join 
CHANNEL.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "erc-identd" 
"erc/erc-identd.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-identd.el
-
-(register-definition-prefixes "erc-identd" '("erc-identd-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-imenu" 
"erc/erc-imenu.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-imenu.el
-
-(register-definition-prefixes "erc-imenu" '("erc-unfill-notice"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-join" "erc/erc-join.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-join.el
-
-(register-definition-prefixes "erc-join" '("erc-"))
-
-;;;***
-
 ;;;### (autoloads nil "erc-lang" "erc/erc-lang.el" (0 0 0 0))
 ;;; Generated autoloads from erc/erc-lang.el
 
@@ -10992,46 +10722,6 @@ Otherwise, connect to HOST:PORT as USER and /join 
CHANNEL.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "erc-list" "erc/erc-list.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-list.el
-
-(register-definition-prefixes "erc-list" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-log" "erc/erc-log.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-log.el
-
-(register-definition-prefixes "erc-log" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-match" 
"erc/erc-match.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-match.el
-
-(register-definition-prefixes "erc-match" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-menu" "erc/erc-menu.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-menu.el
-
-(register-definition-prefixes "erc-menu" '("erc-menu-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-netsplit"
-;;;;;;  "erc/erc-netsplit.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-netsplit.el
-
-(register-definition-prefixes "erc-netsplit" '("erc-"))
-
-;;;***
-
 ;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from erc/erc-networks.el
@@ -11048,118 +10738,6 @@ Interactively select a server to connect to using 
`erc-server-alist'." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "erc-notify" 
"erc/erc-notify.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-notify.el
-
-(register-definition-prefixes "erc-notify" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-page" "erc/erc-page.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-page.el
-
-(register-definition-prefixes "erc-page" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-pcomplete"
-;;;;;;  "erc/erc-pcomplete.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-pcomplete.el
-
-(register-definition-prefixes "erc-pcomplete" '("erc-pcomplet" "pcomplete"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-replace"
-;;;;;;  "erc/erc-replace.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-replace.el
-
-(register-definition-prefixes "erc-replace" '("erc-replace-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-ring" "erc/erc-ring.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-ring.el
-
-(register-definition-prefixes "erc-ring" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-services"
-;;;;;;  "erc/erc-services.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-services.el
-
-(register-definition-prefixes "erc-services" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-sound" 
"erc/erc-sound.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-sound.el
-
-(register-definition-prefixes "erc-sound" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-speedbar"
-;;;;;;  "erc/erc-speedbar.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-speedbar.el
-
-(register-definition-prefixes "erc-speedbar" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-spelling"
-;;;;;;  "erc/erc-spelling.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-spelling.el
-
-(register-definition-prefixes "erc-spelling" '("erc-spelling-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-stamp" 
"erc/erc-stamp.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-stamp.el
-
-(register-definition-prefixes "erc-stamp" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-status-sidebar"
-;;;;;;  "erc/erc-status-sidebar.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-status-sidebar.el
-
-(register-definition-prefixes "erc-status-sidebar" '("erc-status-sidebar-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-track" 
"erc/erc-track.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-track.el
-
-(register-definition-prefixes "erc-track" '("erc-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-truncate"
-;;;;;;  "erc/erc-truncate.el" (0 0 0 0))
-;;; Generated autoloads from erc/erc-truncate.el
-
-(register-definition-prefixes "erc-truncate" '("erc-max-buffer-size"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "erc-xdcc" "erc/erc-xdcc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from erc/erc-xdcc.el
-
-(register-definition-prefixes "erc-xdcc" '("erc-"))
-
-;;;***
-
 ;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/ert.el
 
@@ -12067,11 +11645,11 @@ Render FILE using EWW.
 \(fn FILE)" t nil)
 
 (autoload 'eww-search-words "eww" "\
-Search the web for the text between BEG and END.
+Search the web for the text in the region.
 If region is active (and not whitespace), search the web for
-the text between BEG and END.  Else, prompt the user for a search
-string.  See the `eww-search-prefix' variable for the search
-engine used." t nil)
+the text between region beginning and end.  Else, prompt the
+user for a search string.  See the variable `eww-search-prefix'
+for the search engine used." t nil)
 
 (autoload 'eww-mode "eww" "\
 Mode for browsing the web.
@@ -12380,10 +11958,13 @@ a top-level keymap, `text-scale-increase' or
 (autoload 'buffer-face-mode "face-remap" "\
 Minor mode for a buffer-specific default face.
 
-If called interactively, enable Buffer-Face mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Buffer-Face mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -13299,10 +12880,13 @@ region is invalid.
 (autoload 'flymake-mode "flymake" "\
 Toggle Flymake mode on or off.
 
-If called interactively, enable Flymake mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Flymake mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -13384,10 +12968,13 @@ Turn on `flyspell-mode' for comments and strings." t 
nil)
 (autoload 'flyspell-mode "flyspell" "\
 Toggle on-the-fly spell checking (Flyspell mode).
 
-If called interactively, enable Flyspell mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Flyspell mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -13412,7 +12999,7 @@ invoking `ispell-change-dictionary'.
 
 Consider using the `ispell-parser' to check your text.  For instance
 consider adding:
-\(add-hook \\='tex-mode-hook (function (lambda () (setq ispell-parser 
\\='tex))))
+\(add-hook \\='tex-mode-hook (lambda () (setq ispell-parser \\='tex)))
 in your init file.
 
 \\[flyspell-region] checks all words inside a region.
@@ -13464,10 +13051,13 @@ Turn off Follow mode.  Please see the function 
`follow-mode'." nil nil)
 (autoload 'follow-mode "follow" "\
 Toggle Follow mode.
 
-If called interactively, enable Follow mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Follow mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -13587,15 +13177,17 @@ selected if the original window is the first one in 
the frame.
 
 ;;;### (autoloads nil "footnote" "mail/footnote.el" (0 0 0 0))
 ;;; Generated autoloads from mail/footnote.el
-(push (purecopy '(footnote 0 19)) package--builtin-versions)
 
 (autoload 'footnote-mode "footnote" "\
 Toggle Footnote mode.
 
-If called interactively, enable Footnote mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Footnote mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -14026,7 +13618,6 @@ Interactively, reads the register using 
`register-read-with-preview'.
 
 ;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (0 0 0 0))
 ;;; Generated autoloads from play/gamegrid.el
-(push (purecopy '(gamegrid 1 2)) package--builtin-versions)
 
 (register-definition-prefixes "gamegrid" '("gamegrid-"))
 
@@ -14057,10 +13648,13 @@ being transferred.  This list may grow up to a size of
 `gdb-debug-log-max' after which the oldest element (at the end of
 the list) is deleted every time a new one is added (at the front).
 
-If called interactively, enable Gdb-Enable-Debug mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Gdb-Enable-Debug mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -14238,10 +13832,13 @@ regular expression that can be used as an element of
 (autoload 'glasses-mode "glasses" "\
 Minor mode for making identifiers likeThis readable.
 
-If called interactively, enable Glasses mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Glasses mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -14850,10 +14447,13 @@ If FORCE is non-nil, replace the old ones.
 (autoload 'gnus-mailing-list-mode "gnus-ml" "\
 Minor mode for providing mailing-list commands.
 
-If called interactively, enable Gnus-Mailing-List mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and
-toggle it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Gnus-Mailing-List mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero
+or negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.
+Enable the mode if ARG is nil, omitted, or is a positive number.
+All other values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when
 it is disabled.
@@ -15304,10 +14904,13 @@ Also fontifies the buffer appropriately (see 
`goto-address-fontify-p' and
 (autoload 'goto-address-mode "goto-addr" "\
 Minor mode to buttonize URLs and e-mail addresses in the current buffer.
 
-If called interactively, enable Goto-Address mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Goto-Address mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -15334,17 +14937,22 @@ ARG is omitted or nil.
 
 Goto-Address mode is enabled in all buffers where
 `goto-addr-mode--turn-on' would do it.
-See `goto-address-mode' for more information on Goto-Address mode.
+
+See `goto-address-mode' for more information on
+Goto-Address mode.
 
 \(fn &optional ARG)" t nil)
 
 (autoload 'goto-address-prog-mode "goto-addr" "\
 Like `goto-address-mode', but only for comments and strings.
 
-If called interactively, enable Goto-Address-Prog mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Goto-Address-Prog mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -15678,10 +15286,13 @@ or call the function `gud-tooltip-mode'.")
 (autoload 'gud-tooltip-mode "gud" "\
 Toggle the display of GUD tooltips.
 
-If called interactively, enable Gud-Tooltip mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Gud-Tooltip mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16390,24 +16001,19 @@ This discards the buffer's undo information." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "hfy-cmap" "hfy-cmap.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from hfy-cmap.el
-
-(register-definition-prefixes "hfy-cmap" '("hfy-" 
"htmlfontify-unload-rgb-file"))
-
-;;;***
-
 ;;;### (autoloads nil "hi-lock" "hi-lock.el" (0 0 0 0))
 ;;; Generated autoloads from hi-lock.el
 
 (autoload 'hi-lock-mode "hi-lock" "\
 Toggle selective highlighting of patterns (Hi Lock mode).
 
-If called interactively, enable Hi-Lock mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Hi-Lock mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16494,7 +16100,9 @@ ARG is omitted or nil.
 
 Hi-Lock mode is enabled in all buffers where
 `turn-on-hi-lock-if-enabled' would do it.
-See `hi-lock-mode' for more information on Hi-Lock mode.
+
+See `hi-lock-mode' for more information on
+Hi-Lock mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -16598,6 +16206,9 @@ Interactively added patterns are those normally 
specified using
 `highlight-regexp' and `highlight-lines-matching-regexp'; they can
 be found in variable `hi-lock-interactive-patterns'." t nil)
 
+(autoload 'hi-lock-find-patterns "hi-lock" "\
+Add patterns from the current buffer to the list of hi-lock patterns." t nil)
+
 (register-definition-prefixes "hi-lock" '("hi-lock-" 
"turn-on-hi-lock-if-enabled"))
 
 ;;;***
@@ -16608,10 +16219,13 @@ be found in variable `hi-lock-interactive-patterns'." 
t nil)
 (autoload 'hide-ifdef-mode "hideif" "\
 Toggle features to hide/show #ifdef blocks (Hide-Ifdef mode).
 
-If called interactively, enable Hide-Ifdef mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Hide-Ifdef mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16659,7 +16273,7 @@ Several variables affect how the hiding is done:
 ;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/hideshow.el
 
-(defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil 
nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) 
(java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil))) "\
+(defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil 
nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) 
(java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil) (mhtml-mode 
"{\\|<[^/>]*?" "}\\|</[^/>]*[^/]>" "<!--" mhtml-forward nil))) "\
 Alist for initializing the hideshow variables for different modes.
 Each element has the form
   (MODE START END COMMENT-START FORWARD-SEXP-FUNC ADJUST-BEG-FUNC).
@@ -16690,10 +16304,13 @@ whitespace.  Case does not matter.")
 (autoload 'hs-minor-mode "hideshow" "\
 Minor mode to selectively hide/show code and comment blocks.
 
-If called interactively, enable Hs minor mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Hs minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16737,10 +16354,13 @@ Unconditionally turn off `hs-minor-mode'." nil nil)
 (autoload 'highlight-changes-mode "hilit-chg" "\
 Toggle highlighting changes in this buffer (Highlight Changes mode).
 
-If called interactively, enable Highlight-Changes mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Highlight-Changes mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16765,10 +16385,13 @@ buffer with the contents of a file
 (autoload 'highlight-changes-visible-mode "hilit-chg" "\
 Toggle visibility of highlighting due to Highlight Changes mode.
 
-If called interactively, enable Highlight-Changes-Visible mode if ARG
-is positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and toggle
-it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Highlight-Changes-Visible mode'.  If
+the prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16863,7 +16486,9 @@ ARG is omitted or nil.
 
 Highlight-Changes mode is enabled in all buffers where
 `highlight-changes-mode-turn-on' would do it.
-See `highlight-changes-mode' for more information on Highlight-Changes mode.
+
+See `highlight-changes-mode' for more information on
+Highlight-Changes mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -16910,10 +16535,13 @@ argument VERBOSE non-nil makes the function verbose.
 (autoload 'hl-line-mode "hl-line" "\
 Toggle highlighting of the current line (Hl-Line mode).
 
-If called interactively, enable Hl-Line mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Hl-Line mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -16945,10 +16573,13 @@ or call the function `global-hl-line-mode'.")
 (autoload 'global-hl-line-mode "hl-line" "\
 Toggle line highlighting in all buffers (Global Hl-Line mode).
 
-If called interactively, enable Global Hl-Line mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Hl-Line mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -17128,14 +16759,6 @@ You may also want to set `hfy-page-header' and 
`hfy-page-footer'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ibuf-ext" "ibuf-ext.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from ibuf-ext.el
-
-(register-definition-prefixes "ibuf-ext" '("alphabetic" "basename" "content" 
"derived-mode" "directory" "eval" "file" "ibuffer-" "major-mode" "mod" "name" 
"predicate" "print" "process" "query-replace" "rename-uniquely" 
"replace-regexp" "revert" "shell-command-" "size" "starred-name" "used-mode" 
"view-and-eval" "visiting-file"))
-
-;;;***
-
 ;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (0 0 0 0))
 ;;; Generated autoloads from ibuf-macs.el
 
@@ -17368,10 +16991,13 @@ or call the function `fido-mode'.")
 (autoload 'fido-mode "icomplete" "\
 An enhanced `icomplete-mode' that emulates `ido-mode'.
 
-If called interactively, enable Fido mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Fido mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -17394,10 +17020,13 @@ or call the function `icomplete-mode'.")
 (autoload 'icomplete-mode "icomplete" "\
 Toggle incremental minibuffer completion (Icomplete mode).
 
-If called interactively, enable Icomplete mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Icomplete mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -17939,10 +17568,13 @@ See `inferior-emacs-lisp-mode' for details.
 (autoload 'iimage-mode "iimage" "\
 Toggle Iimage mode on or off.
 
-If called interactively, enable Iimage mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Iimage mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -18250,10 +17882,13 @@ Setup easy-to-use keybindings for the commands to be 
used in dired mode.
 Note that n, p and <down> and <up> will be hijacked and bound to
 `image-dired-dired-x-line'.
 
-If called interactively, enable Image-Dired minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Image-Dired minor mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -18349,10 +17984,13 @@ or call the function `auto-image-file-mode'.")
 (autoload 'auto-image-file-mode "image-file" "\
 Toggle visiting of image files as images (Auto Image File mode).
 
-If called interactively, enable Auto-Image-File mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Auto-Image-File mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -18381,10 +18019,13 @@ Key bindings:
 (autoload 'image-minor-mode "image-mode" "\
 Toggle Image minor mode in this buffer.
 
-If called interactively, enable Image minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Image minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -18626,7 +18267,7 @@ the environment variable INFOPATH is set.
 
 Although this is a customizable variable, that is mainly for technical
 reasons.  Normally, you should either set INFOPATH or customize
-`Info-additional-directory-list', rather than changing this variable." 
:initialize 'custom-initialize-delay :type '(repeat directory) :group 'info)
+`Info-additional-directory-list', rather than changing this variable." 
:initialize 'custom-initialize-delay :type '(repeat directory))
 
 (autoload 'info-other-window "info" "\
 Like `info' but show the Info buffer in another window.
@@ -19339,10 +18980,13 @@ available on the net." t nil)
 (autoload 'ispell-minor-mode "ispell" "\
 Toggle last-word spell checking (Ispell minor mode).
 
-If called interactively, enable ISpell minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `ISpell minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -19378,7 +19022,7 @@ in your init file:
 
 You can bind this to the key C-c i in GNUS or mail by adding to
 `news-reply-mode-hook' or `mail-mode-hook' the following lambda expression:
-   (function (lambda () (local-set-key \"\\C-ci\" \\='ispell-message)))" t nil)
+   (lambda () (local-set-key \"\\C-ci\" \\='ispell-message))" t nil)
 
 (register-definition-prefixes "ispell" '("check-ispell-version" "ispell-"))
 
@@ -20031,10 +19675,13 @@ sleep in seconds.
 (autoload 'linum-mode "linum" "\
 Toggle display of line numbers in the left margin (Linum mode).
 
-If called interactively, enable Linum mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Linum mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -20063,7 +19710,9 @@ ARG is omitted or nil.
 
 Linum mode is enabled in all buffers where
 `linum-on' would do it.
-See `linum-mode' for more information on Linum mode.
+
+See `linum-mode' for more information on
+Linum mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -20088,11 +19737,10 @@ If the feature is required by any other loaded code, 
and prefix arg FORCE
 is nil, raise an error.
 
 Standard unloading activities include restoring old autoloads for
-functions defined by the library, undoing any additions that the
-library has made to hook variables or to `auto-mode-alist', undoing
-ELP profiling of functions in that library, unproviding any features
-provided by the library, and canceling timers held in variables
-defined by the library.
+functions defined by the library, removing such functions from
+hooks and `auto-mode-alist', undoing their ELP profiling,
+unproviding any features provided by the library, and canceling
+timers held in variables defined by the library.
 
 If a function `FEATURE-unload-function' is defined, this function
 calls it with no arguments, before doing anything else.  That function
@@ -20607,10 +20255,13 @@ or call the function `mail-abbrevs-mode'.")
 (autoload 'mail-abbrevs-mode "mailabbrev" "\
 Toggle abbrev expansion of mail aliases (Mail Abbrevs mode).
 
-If called interactively, enable Mail-Abbrevs mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Mail-Abbrevs mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -20946,10 +20597,13 @@ Default bookmark handler for Man buffers.
 (autoload 'master-mode "master" "\
 Toggle Master mode.
 
-If called interactively, enable Master mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Master mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -20985,10 +20639,13 @@ or call the function 
`minibuffer-depth-indicate-mode'.")
 (autoload 'minibuffer-depth-indicate-mode "mb-depth" "\
 Toggle Minibuffer Depth Indication mode.
 
-If called interactively, enable Minibuffer-Depth-Indicate mode if ARG
-is positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and toggle
-it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Minibuffer-Depth-Indicate mode'.  If
+the prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -21006,7 +20663,6 @@ recursion depth in the minibuffer prompt.  This is only 
useful if
 
 ;;;### (autoloads nil "md4" "md4.el" (0 0 0 0))
 ;;; Generated autoloads from md4.el
-(push (purecopy '(md4 1 0)) package--builtin-versions)
 
 (register-definition-prefixes "md4" '("md4"))
 
@@ -21530,10 +21186,13 @@ or call the function `midnight-mode'.")
 (autoload 'midnight-mode "midnight" "\
 Non-nil means run `midnight-hook' at midnight.
 
-If called interactively, enable Midnight mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Midnight mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -21579,10 +21238,13 @@ or call the function 
`minibuffer-electric-default-mode'.")
 (autoload 'minibuffer-electric-default-mode "minibuf-eldef" "\
 Toggle Minibuffer Electric Default mode.
 
-If called interactively, enable Minibuffer-Electric-Default mode if
-ARG is positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and toggle
-it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Minibuffer-Electric-Default mode'.
+If the prefix argument is positive, enable the mode, and if it is zero
+or negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -21758,7 +21420,7 @@ whose file names match the specified wildcard.
 ;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (0 0
 ;;;;;;  0 0))
 ;;; Generated autoloads from progmodes/mixal-mode.el
-(push (purecopy '(mixal-mode 0 1)) package--builtin-versions)
+(push (purecopy '(mixal-mode 0 4)) package--builtin-versions)
 
 (autoload 'mixal-mode "mixal-mode" "\
 Major mode for the mixal asm language.
@@ -22152,10 +21814,13 @@ or call the function `msb-mode'.")
 (autoload 'msb-mode "msb" "\
 Toggle Msb mode.
 
-If called interactively, enable Msb mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Msb mode'.  If the prefix argument is
+positive, enable the mode, and if it is zero or negative, disable the
+mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -22337,7 +22002,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
@@ -23263,14 +22928,6 @@ Many aspects this mode can be customized using
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ob-core" "org/ob-core.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ob-core.el
-
-(register-definition-prefixes "ob-core" '("org-"))
-
-;;;***
-
 ;;;### (autoloads nil "ob-css" "org/ob-css.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-css.el
 
@@ -23420,14 +23077,6 @@ Many aspects this mode can be customized using
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ob-lob" "org/ob-lob.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ob-lob.el
-
-(register-definition-prefixes "ob-lob" '("org-babel-"))
-
-;;;***
-
 ;;;### (autoloads nil "ob-lua" "org/ob-lua.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-lua.el
 
@@ -23598,14 +23247,6 @@ Many aspects this mode can be customized using
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ob-tangle" 
"org/ob-tangle.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ob-tangle.el
-
-(register-definition-prefixes "ob-tangle" '("org-babel-"))
-
-;;;***
-
 ;;;### (autoloads nil "ob-vala" "org/ob-vala.el" (0 0 0 0))
 ;;; Generated autoloads from org/ob-vala.el
 
@@ -23767,14 +23408,6 @@ Also refresh fontification if needed." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ol-bbdb" "org/ol-bbdb.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ol-bbdb.el
-
-(register-definition-prefixes "ol-bbdb" '("org-bbdb-"))
-
-;;;***
-
 ;;;### (autoloads nil "ol-bibtex" "org/ol-bibtex.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-bibtex.el
 
@@ -23817,14 +23450,6 @@ Also refresh fontification if needed." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ol-irc" "org/ol-irc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ol-irc.el
-
-(register-definition-prefixes "ol-irc" '("org-irc-"))
-
-;;;***
-
 ;;;### (autoloads nil "ol-mhe" "org/ol-mhe.el" (0 0 0 0))
 ;;; Generated autoloads from org/ol-mhe.el
 
@@ -24354,22 +23979,6 @@ to override `appt-message-warning-time'.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-archive"
-;;;;;;  "org/org-archive.el" (0 0 0 0))
-;;; Generated autoloads from org/org-archive.el
-
-(register-definition-prefixes "org-archive" '("org-a"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "org-attach" 
"org/org-attach.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-attach.el
-
-(register-definition-prefixes "org-attach" '("org-attach-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-attach-git" "org/org-attach-git.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from org/org-attach-git.el
@@ -24424,14 +24033,6 @@ Set `org-capture-templates' to be similar to 
`org-remember-templates'." t nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-clock" 
"org/org-clock.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-clock.el
-
-(register-definition-prefixes "org-clock" '("org-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-colview" "org/org-colview.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-colview.el
 
@@ -24547,14 +24148,6 @@ Try very hard to provide sensible version strings." 
nil t)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-datetree"
-;;;;;;  "org/org-datetree.el" (0 0 0 0))
-;;; Generated autoloads from org/org-datetree.el
-
-(register-definition-prefixes "org-datetree" '("org-datetree-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-duration" "org/org-duration.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from org/org-duration.el
@@ -24610,14 +24203,6 @@ with \"H:MM:SS\" format, return `h:mm:ss'.  Otherwise, 
return
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-element"
-;;;;;;  "org/org-element.el" (0 0 0 0))
-;;; Generated autoloads from org/org-element.el
-
-(register-definition-prefixes "org-element" '("org-element-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-entities" "org/org-entities.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from org/org-entities.el
@@ -24633,22 +24218,6 @@ with \"H:MM:SS\" format, return `h:mm:ss'.  Otherwise, 
return
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-feed" "org/org-feed.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-feed.el
-
-(register-definition-prefixes "org-feed" '("org-feed-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "org-footnote"
-;;;;;;  "org/org-footnote.el" (0 0 0 0))
-;;; Generated autoloads from org/org-footnote.el
-
-(register-definition-prefixes "org-footnote" '("org-footnote-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-goto" "org/org-goto.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-goto.el
 
@@ -24692,22 +24261,6 @@ With a prefix argument, use the alternative interface: 
e.g., if
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-id" "org/org-id.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-id.el
-
-(register-definition-prefixes "org-id" '("org-id-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "org-indent" 
"org/org-indent.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-indent.el
-
-(register-definition-prefixes "org-indent" '("org-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-inlinetask" "org/org-inlinetask.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from org/org-inlinetask.el
@@ -24770,14 +24323,6 @@ Load FILE with optional arguments NOERROR and 
MUSTSUFFIX.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-mobile" 
"org/org-mobile.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-mobile.el
-
-(register-definition-prefixes "org-mobile" '("org-mobile-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-mouse" "org/org-mouse.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-mouse.el
 
@@ -24797,10 +24342,13 @@ NUMBERING is a list of numbers.
 (autoload 'org-num-mode "org-num" "\
 Dynamic numbering of headlines in an Org buffer.
 
-If called interactively, enable Org-Num mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Org-Num mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -24819,14 +24367,6 @@ disabled.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-plot" "org/org-plot.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-plot.el
-
-(register-definition-prefixes "org-plot" '("org-plot"))
-
-;;;***
-
 ;;;### (autoloads nil "org-protocol" "org/org-protocol.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from org/org-protocol.el
@@ -24842,14 +24382,6 @@ disabled.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-table" 
"org/org-table.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-table.el
-
-(register-definition-prefixes "org-table" '("org"))
-
-;;;***
-
 ;;;### (autoloads nil "org-tempo" "org/org-tempo.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-tempo.el
 
@@ -24857,14 +24389,6 @@ disabled.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "org-timer" 
"org/org-timer.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/org-timer.el
-
-(register-definition-prefixes "org-timer" '("org-timer-"))
-
-;;;***
-
 ;;;### (autoloads nil "org-version" "org/org-version.el" (0 0 0 0))
 ;;; Generated autoloads from org/org-version.el
 
@@ -24882,6 +24406,7 @@ Inserted by installing Org or when a release is made." 
nil nil)
 ;;; Generated autoloads from outline.el
 (put 'outline-regexp 'safe-local-variable 'stringp)
 (put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
+(put 'outline-level 'risky-local-variable t)
 
 (autoload 'outline-mode "outline" "\
 Set major mode for editing outlines with selective display.
@@ -24911,10 +24436,13 @@ Turning on outline mode calls the value of 
`text-mode-hook' and then of
 (autoload 'outline-minor-mode "outline" "\
 Toggle Outline minor mode.
 
-If called interactively, enable Outline minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Outline minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -24922,108 +24450,11 @@ disabled.
 See the command `outline-mode' for more information on this mode.
 
 \(fn &optional ARG)" t nil)
-(put 'outline-level 'risky-local-variable t)
 
 (register-definition-prefixes "outline" '("outline-"))
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ox" "org/ox.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox.el
-
-(register-definition-prefixes "ox" '("org-export-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-ascii" "org/ox-ascii.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-ascii.el
-
-(register-definition-prefixes "ox-ascii" '("org-ascii-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-beamer" 
"org/ox-beamer.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-beamer.el
-
-(register-definition-prefixes "ox-beamer" '("org-beamer-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-html" "org/ox-html.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-html.el
-
-(register-definition-prefixes "ox-html" '("org-html-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-icalendar"
-;;;;;;  "org/ox-icalendar.el" (0 0 0 0))
-;;; Generated autoloads from org/ox-icalendar.el
-
-(register-definition-prefixes "ox-icalendar" '("org-icalendar-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-latex" "org/ox-latex.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-latex.el
-
-(register-definition-prefixes "ox-latex" '("org-latex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-man" "org/ox-man.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-man.el
-
-(register-definition-prefixes "ox-man" '("org-man-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-md" "org/ox-md.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-md.el
-
-(register-definition-prefixes "ox-md" '("org-md-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-odt" "org/ox-odt.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-odt.el
-
-(register-definition-prefixes "ox-odt" '("org-odt-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-org" "org/ox-org.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-org.el
-
-(register-definition-prefixes "ox-org" '("org-org-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-publish" 
"org/ox-publish.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-publish.el
-
-(register-definition-prefixes "ox-publish" '("org-publish-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "ox-texinfo" 
"org/ox-texinfo.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from org/ox-texinfo.el
-
-(register-definition-prefixes "ox-texinfo" '("org-texinfo-"))
-
-;;;***
-
 ;;;### (autoloads nil "package" "emacs-lisp/package.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/package.el
 (push (purecopy '(package 1 1 0)) package--builtin-versions)
@@ -25213,10 +24644,13 @@ or call the function `show-paren-mode'.")
 (autoload 'show-paren-mode "paren" "\
 Toggle visualization of matching parens (Show Paren mode).
 
-If called interactively, enable Show-Paren mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Show-Paren mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -25923,10 +25357,13 @@ or call the function `pixel-scroll-mode'.")
 (autoload 'pixel-scroll-mode "pixel-scroll" "\
 A minor mode to scroll text pixel-by-pixel.
 
-If called interactively, enable Pixel-Scroll mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Pixel-Scroll mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -26942,14 +26379,6 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when 
the cursor is at the number
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "ps-mule" "ps-mule.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from ps-mule.el
-
-(register-definition-prefixes "ps-mule" '("ps-mule-"))
-
-;;;***
-
 ;;;### (autoloads nil "ps-print" "ps-print.el" (0 0 0 0))
 ;;; Generated autoloads from ps-print.el
 (push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
@@ -27175,7 +26604,7 @@ Optional argument FACE specifies the face to do the 
highlighting.
 
 ;;;### (autoloads nil "python" "progmodes/python.el" (0 0 0 0))
 ;;; Generated autoloads from progmodes/python.el
-(push (purecopy '(python 0 26 1)) package--builtin-versions)
+(push (purecopy '(python 0 27)) package--builtin-versions)
 
 (add-to-list 'auto-mode-alist (cons (purecopy "\\.py[iw]?\\'") 'python-mode))
 
@@ -27679,10 +27108,13 @@ or call the function `rcirc-track-minor-mode'.")
 (autoload 'rcirc-track-minor-mode "rcirc" "\
 Global minor mode for tracking activity in rcirc buffers.
 
-If called interactively, enable Rcirc-Track minor mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Rcirc-Track minor mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -27728,10 +27160,13 @@ or call the function `recentf-mode'.")
 (autoload 'recentf-mode "recentf" "\
 Toggle \"Open Recent\" menu (Recentf mode).
 
-If called interactively, enable Recentf mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Recentf mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -27883,10 +27318,13 @@ with a prefix argument, prompt for START-AT and 
FORMAT.
 (autoload 'rectangle-mark-mode "rect" "\
 Toggle the region as rectangular.
 
-If called interactively, enable Rectangle-Mark mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Rectangle-Mark mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -27919,10 +27357,13 @@ Activates the region if needed.  Only lasts until the 
region is deactivated.
 (autoload 'refill-mode "refill" "\
 Toggle automatic refilling (Refill mode).
 
-If called interactively, enable Refill mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Refill mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -27953,10 +27394,13 @@ Turn on RefTeX mode." nil nil)
 (autoload 'reftex-mode "reftex" "\
 Minor mode with distinct support for \\label, \\ref and \\cite in LaTeX.
 
-If called interactively, enable Reftex mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Reftex mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -27999,78 +27443,6 @@ This enforces rescanning the buffer on next use." nil 
nil)
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-auc" 
"textmodes/reftex-auc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-auc.el
-
-(register-definition-prefixes "reftex-auc" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-cite"
-;;;;;;  "textmodes/reftex-cite.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-cite.el
-
-(register-definition-prefixes "reftex-cite" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-dcr" 
"textmodes/reftex-dcr.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-dcr.el
-
-(register-definition-prefixes "reftex-dcr" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-global"
-;;;;;;  "textmodes/reftex-global.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-global.el
-
-(register-definition-prefixes "reftex-global" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-index"
-;;;;;;  "textmodes/reftex-index.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-index.el
-
-(register-definition-prefixes "reftex-index" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-parse"
-;;;;;;  "textmodes/reftex-parse.el" (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-parse.el
-
-(register-definition-prefixes "reftex-parse" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-ref" 
"textmodes/reftex-ref.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-ref.el
-
-(register-definition-prefixes "reftex-ref" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-sel" 
"textmodes/reftex-sel.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-sel.el
-
-(register-definition-prefixes "reftex-sel" '("reftex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "reftex-toc" 
"textmodes/reftex-toc.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from textmodes/reftex-toc.el
-
-(register-definition-prefixes "reftex-toc" '("reftex-"))
-
-;;;***
-
 ;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from textmodes/reftex-vars.el
@@ -28149,7 +27521,6 @@ This means the number of non-shy regexp grouping 
constructs
 
 ;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/regi.el
-(push (purecopy '(regi 1 8)) package--builtin-versions)
 
 (register-definition-prefixes "regi" '("regi-"))
 
@@ -28304,10 +27675,13 @@ first comment line visible (if point is in a comment).
 (autoload 'reveal-mode "reveal" "\
 Toggle uncloaking of invisible text near point (Reveal mode).
 
-If called interactively, enable Reveal mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Reveal mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -28333,10 +27707,13 @@ or call the function `global-reveal-mode'.")
 Toggle Reveal mode in all buffers (Global Reveal mode).
 Reveal mode renders invisible text around point visible again.
 
-If called interactively, enable Global Reveal mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Reveal mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -28665,30 +28042,6 @@ Set PASSWORD to be used for retrieving mail from a POP 
or IMAP server.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "rmailedit" 
"mail/rmailedit.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/rmailedit.el
-
-(register-definition-prefixes "rmailedit" '("rmail-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "rmailkwd" 
"mail/rmailkwd.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/rmailkwd.el
-
-(register-definition-prefixes "rmailkwd" '("rmail-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "rmailmm" "mail/rmailmm.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/rmailmm.el
-
-(register-definition-prefixes "rmailmm" '("rmail-"))
-
-;;;***
-
 ;;;### (autoloads nil "rmailout" "mail/rmailout.el" (0 0 0 0))
 ;;; Generated autoloads from mail/rmailout.el
 (put 'rmail-output-file-alist 'risky-local-variable t)
@@ -28761,22 +28114,6 @@ than appending to it.  Deletes the message after 
writing if
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "rmailsort" 
"mail/rmailsort.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/rmailsort.el
-
-(register-definition-prefixes "rmailsort" '("rmail-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "rmailsum" 
"mail/rmailsum.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/rmailsum.el
-
-(register-definition-prefixes "rmailsum" '("rmail-"))
-
-;;;***
-
 ;;;### (autoloads nil "rmc" "emacs-lisp/rmc.el" (0 0 0 0))
 ;;; Generated autoloads from emacs-lisp/rmc.el
 
@@ -28904,10 +28241,13 @@ Validation will be enabled if 
`rng-nxml-auto-validate-flag' is non-nil." t nil)
 (autoload 'rng-validate-mode "rng-valid" "\
 Minor mode performing continual validation against a RELAX NG schema.
 
-If called interactively, enable Rng-Validate mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Rng-Validate mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -28941,7 +28281,7 @@ to use for finding the schema.
 ;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (0 0 0 0))
 ;;; Generated autoloads from nxml/rng-xsd.el
 
-(put 'https://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 
#'rng-xsd-compile)
+(put 'http://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 
#'rng-xsd-compile)
 
 (autoload 'rng-xsd-compile "rng-xsd" "\
 Provide W3C XML Schema as a RELAX NG datatypes library.
@@ -29058,10 +28398,13 @@ highlighting.
 (autoload 'rst-minor-mode "rst" "\
 Toggle ReST minor mode.
 
-If called interactively, enable Rst minor mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Rst minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29111,10 +28454,13 @@ Use the command `ruler-mode' to change this 
variable.")
 (autoload 'ruler-mode "ruler-mode" "\
 Toggle display of ruler in header line (Ruler mode).
 
-If called interactively, enable Ruler mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Ruler mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29342,7 +28688,6 @@ For more details, see Info node `(elisp) Extending Rx'.
 
 ;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (0 0 0 0))
 ;;; Generated autoloads from net/sasl-ntlm.el
-(push (purecopy '(sasl 1 0)) package--builtin-versions)
 
 (register-definition-prefixes "sasl-ntlm" '("sasl-ntlm-"))
 
@@ -29366,7 +28711,6 @@ For more details, see Info node `(elisp) Extending Rx'.
 
 ;;;### (autoloads nil "savehist" "savehist.el" (0 0 0 0))
 ;;; Generated autoloads from savehist.el
-(push (purecopy '(savehist 24)) package--builtin-versions)
 
 (defvar savehist-mode nil "\
 Non-nil if Savehist mode is enabled.
@@ -29381,10 +28725,13 @@ or call the function `savehist-mode'.")
 (autoload 'savehist-mode "savehist" "\
 Toggle saving of minibuffer history (Savehist mode).
 
-If called interactively, enable Savehist mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Savehist mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29439,10 +28786,13 @@ Non-nil means automatically save place in each file.
 This means when you visit a file, point goes to the last place
 where it was when you previously visited the same file.
 
-If called interactively, enable Save-Place mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Save-Place mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29455,10 +28805,13 @@ If this mode is enabled, point is recorded when you 
kill the buffer
 or exit Emacs.  Visiting this file again will go to that position,
 even in a later Emacs session.
 
-If called interactively, enable Save-Place-Local mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Save-Place-Local mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29546,10 +28899,13 @@ or call the function `scroll-all-mode'.")
 (autoload 'scroll-all-mode "scroll-all" "\
 Toggle shared scrolling in same-frame windows (Scroll-All mode).
 
-If called interactively, enable Scroll-All mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Scroll-All mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29576,10 +28932,13 @@ one window apply to all visible windows in the same 
frame.
 (autoload 'scroll-lock-mode "scroll-lock" "\
 Buffer-local minor mode for pager-like scrolling.
 
-If called interactively, enable Scroll-Lock mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Scroll-Lock mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29650,10 +29009,13 @@ or call the function `semantic-mode'.")
 (autoload 'semantic-mode "semantic" "\
 Toggle parser features (Semantic mode).
 
-If called interactively, enable Semantic mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Semantic mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -29672,22 +29034,6 @@ Semantic mode.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/analyze"
-;;;;;;  "cedet/semantic/analyze.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/analyze.el
-
-(register-definition-prefixes "semantic/analyze" '("semantic-a"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/analyze/complete"
-;;;;;;  "cedet/semantic/analyze/complete.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/analyze/complete.el
-
-(register-definition-prefixes "semantic/analyze/complete" 
'("semantic-analyze-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/analyze/debug" 
"cedet/semantic/analyze/debug.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/analyze/debug.el
@@ -29704,30 +29050,6 @@ Semantic mode.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/analyze/refs"
-;;;;;;  "cedet/semantic/analyze/refs.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/analyze/refs.el
-
-(register-definition-prefixes "semantic/analyze/refs" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine"
-;;;;;;  "cedet/semantic/bovine.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine.el
-
-(register-definition-prefixes "semantic/bovine" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine/c"
-;;;;;;  "cedet/semantic/bovine/c.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/c.el
-
-(register-definition-prefixes "semantic/bovine/c" '("c-mode" "semantic"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/bovine/debug" "cedet/semantic/bovine/debug.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/bovine/debug.el
@@ -29736,22 +29058,6 @@ Semantic mode.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine/el"
-;;;;;;  "cedet/semantic/bovine/el.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/el.el
-
-(register-definition-prefixes "semantic/bovine/el" '("emacs-lisp-mode" 
"semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine/gcc"
-;;;;;;  "cedet/semantic/bovine/gcc.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/gcc.el
-
-(register-definition-prefixes "semantic/bovine/gcc" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/bovine/grammar" 
"cedet/semantic/bovine/grammar.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/bovine/grammar.el
@@ -29765,22 +29071,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine/make"
-;;;;;;  "cedet/semantic/bovine/make.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/make.el
-
-(register-definition-prefixes "semantic/bovine/make" '("makefile-mode" 
"semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/bovine/scm"
-;;;;;;  "cedet/semantic/bovine/scm.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/bovine/scm.el
-
-(register-definition-prefixes "semantic/bovine/scm" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/chart" "cedet/semantic/chart.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/chart.el
@@ -29789,30 +29079,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/complete"
-;;;;;;  "cedet/semantic/complete.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/complete.el
-
-(register-definition-prefixes "semantic/complete" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/ctxt"
-;;;;;;  "cedet/semantic/ctxt.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/ctxt.el
-
-(register-definition-prefixes "semantic/ctxt" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db"
-;;;;;;  "cedet/semantic/db.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db.el
-
-(register-definition-prefixes "semantic/db" '("semanticdb-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/db-debug" "cedet/semantic/db-debug.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/db-debug.el
@@ -29837,30 +29103,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db-file"
-;;;;;;  "cedet/semantic/db-file.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-file.el
-
-(register-definition-prefixes "semantic/db-file" '("semanticdb-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db-find"
-;;;;;;  "cedet/semantic/db-find.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-find.el
-
-(register-definition-prefixes "semantic/db-find" '("semanticdb-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db-global"
-;;;;;;  "cedet/semantic/db-global.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-global.el
-
-(register-definition-prefixes "semantic/db-global" '("semanticdb-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/db-javascript" 
"cedet/semantic/db-javascript.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/db-javascript.el
@@ -29869,14 +29111,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db-mode"
-;;;;;;  "cedet/semantic/db-mode.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-mode.el
-
-(register-definition-prefixes "semantic/db-mode" '("semanticdb-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/db-ref" "cedet/semantic/db-ref.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/db-ref.el
@@ -29885,22 +29119,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/db-typecache"
-;;;;;;  "cedet/semantic/db-typecache.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/db-typecache.el
-
-(register-definition-prefixes "semantic/db-typecache" '("semanticdb-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/debug"
-;;;;;;  "cedet/semantic/debug.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/debug.el
-
-(register-definition-prefixes "semantic/debug" '("semantic-debug-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/decorate" "cedet/semantic/decorate.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/decorate.el
@@ -29909,38 +29127,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/decorate/include"
-;;;;;;  "cedet/semantic/decorate/include.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/decorate/include.el
-
-(register-definition-prefixes "semantic/decorate/include" 
'("semantic-decoration-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/decorate/mode"
-;;;;;;  "cedet/semantic/decorate/mode.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/decorate/mode.el
-
-(register-definition-prefixes "semantic/decorate/mode" 
'("define-semantic-decoration-style" "semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/dep"
-;;;;;;  "cedet/semantic/dep.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/dep.el
-
-(register-definition-prefixes "semantic/dep" 
'("defcustom-mode-local-semantic-dependency-system-include-path" "semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/doc"
-;;;;;;  "cedet/semantic/doc.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/doc.el
-
-(register-definition-prefixes "semantic/doc" '("semantic-doc"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/ede-grammar" "cedet/semantic/ede-grammar.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/ede-grammar.el
@@ -29949,30 +29135,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/edit"
-;;;;;;  "cedet/semantic/edit.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/edit.el
-
-(register-definition-prefixes "semantic/edit" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/find"
-;;;;;;  "cedet/semantic/find.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/find.el
-
-(register-definition-prefixes "semantic/find" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/format"
-;;;;;;  "cedet/semantic/format.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/format.el
-
-(register-definition-prefixes "semantic/format" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/fw" "cedet/semantic/fw.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from cedet/semantic/fw.el
@@ -29997,46 +29159,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/html"
-;;;;;;  "cedet/semantic/html.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/html.el
-
-(register-definition-prefixes "semantic/html" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/ia"
-;;;;;;  "cedet/semantic/ia.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/ia.el
-
-(register-definition-prefixes "semantic/ia" '("semantic-ia-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/ia-sb"
-;;;;;;  "cedet/semantic/ia-sb.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/ia-sb.el
-
-(register-definition-prefixes "semantic/ia-sb" '("semantic-ia-s"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/idle"
-;;;;;;  "cedet/semantic/idle.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/idle.el
-
-(register-definition-prefixes "semantic/idle" '("define-semantic-idle-service" 
"global-semantic-idle-summary-mode" "semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/imenu"
-;;;;;;  "cedet/semantic/imenu.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/imenu.el
-
-(register-definition-prefixes "semantic/imenu" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/java" "cedet/semantic/java.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from cedet/semantic/java.el
@@ -30045,30 +29167,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/lex"
-;;;;;;  "cedet/semantic/lex.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/lex.el
-
-(register-definition-prefixes "semantic/lex" '("define-lex" "semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/lex-spp"
-;;;;;;  "cedet/semantic/lex-spp.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/lex-spp.el
-
-(register-definition-prefixes "semantic/lex-spp" '("define-lex-spp-" 
"semantic-lex-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/mru-bookmark"
-;;;;;;  "cedet/semantic/mru-bookmark.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/mru-bookmark.el
-
-(register-definition-prefixes "semantic/mru-bookmark" 
'("global-semantic-mru-bookmark-mode" "semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/sb" "cedet/semantic/sb.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from cedet/semantic/sb.el
@@ -30077,46 +29175,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/scope"
-;;;;;;  "cedet/semantic/scope.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/scope.el
-
-(register-definition-prefixes "semantic/scope" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/senator"
-;;;;;;  "cedet/semantic/senator.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/senator.el
-
-(register-definition-prefixes "semantic/senator" '("semantic-up-reference" 
"senator-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/sort"
-;;;;;;  "cedet/semantic/sort.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/sort.el
-
-(register-definition-prefixes "semantic/sort" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref"
-;;;;;;  "cedet/semantic/symref.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref.el
-
-(register-definition-prefixes "semantic/symref" '("semantic-symref-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref/cscope"
-;;;;;;  "cedet/semantic/symref/cscope.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/cscope.el
-
-(register-definition-prefixes "semantic/symref/cscope" 
'("semantic-symref-cscope--line-re"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/symref/filter" 
"cedet/semantic/symref/filter.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/symref/filter.el
@@ -30125,78 +29183,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref/global"
-;;;;;;  "cedet/semantic/symref/global.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/global.el
-
-(register-definition-prefixes "semantic/symref/global" 
'("semantic-symref-global--line-re"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref/grep"
-;;;;;;  "cedet/semantic/symref/grep.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/grep.el
-
-(register-definition-prefixes "semantic/symref/grep" '("semantic-symref-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref/idutils"
-;;;;;;  "cedet/semantic/symref/idutils.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/idutils.el
-
-(register-definition-prefixes "semantic/symref/idutils" 
'("semantic-symref-idutils--line-re"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/symref/list"
-;;;;;;  "cedet/semantic/symref/list.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/symref/list.el
-
-(register-definition-prefixes "semantic/symref/list" '("semantic-symref-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/tag"
-;;;;;;  "cedet/semantic/tag.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/tag.el
-
-(register-definition-prefixes "semantic/tag" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/tag-file"
-;;;;;;  "cedet/semantic/tag-file.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/tag-file.el
-
-(register-definition-prefixes "semantic/tag-file" '("semantic-prototype-file"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/tag-ls"
-;;;;;;  "cedet/semantic/tag-ls.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/tag-ls.el
-
-(register-definition-prefixes "semantic/tag-ls" '("semantic-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/tag-write"
-;;;;;;  "cedet/semantic/tag-write.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/tag-write.el
-
-(register-definition-prefixes "semantic/tag-write" '("semantic-tag-write-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/texi"
-;;;;;;  "cedet/semantic/texi.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/texi.el
-
-(register-definition-prefixes "semantic/texi" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/util" "cedet/semantic/util.el" (0
 ;;;;;;  0 0 0))
 ;;; Generated autoloads from cedet/semantic/util.el
@@ -30205,14 +29191,6 @@ Major mode for editing Bovine grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/util-modes"
-;;;;;;  "cedet/semantic/util-modes.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/util-modes.el
-
-(register-definition-prefixes "semantic/util-modes" '("semantic-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/wisent" "cedet/semantic/wisent.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/wisent.el
@@ -30242,30 +29220,6 @@ Major mode for editing Wisent grammars.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/wisent/java-tags"
-;;;;;;  "cedet/semantic/wisent/java-tags.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/java-tags.el
-
-(register-definition-prefixes "semantic/wisent/java-tags" '("semantic-" 
"wisent-java-parse-error"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/wisent/javascript"
-;;;;;;  "cedet/semantic/wisent/javascript.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/javascript.el
-
-(register-definition-prefixes "semantic/wisent/javascript" '("semantic-" 
"wisent-javascript-jv-expand-tag"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "semantic/wisent/python"
-;;;;;;  "cedet/semantic/wisent/python.el" (0 0 0 0))
-;;; Generated autoloads from cedet/semantic/wisent/python.el
-
-(register-definition-prefixes "semantic/wisent/python" '("semantic-" 
"wisent-python-"))
-
-;;;***
-
 ;;;### (autoloads nil "semantic/wisent/wisent" 
"cedet/semantic/wisent/wisent.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/semantic/wisent/wisent.el
@@ -30590,9 +29544,11 @@ Return a list of all the elements for which (PRED 
element) is nil in SEQUENCE.
 Reduce the function FUNCTION across SEQUENCE, starting with INITIAL-VALUE.
 
 Return the result of calling FUNCTION with INITIAL-VALUE and the
-first element of SEQUENCE, then calling FUNCTION with that result and
-the second element of SEQUENCE, then with that result and the third
-element of SEQUENCE, etc.
+first element of SEQUENCE, then calling FUNCTION with that result
+and the second element of SEQUENCE, then with that result and the
+third element of SEQUENCE, etc.  FUNCTION will be called with
+INITIAL-VALUE (and then the accumulated value) as the first
+argument, and the elements from SEQUENCE as the second argument.
 
 If SEQUENCE is empty, return INITIAL-VALUE and FUNCTION is not called.
 
@@ -30625,6 +29581,13 @@ Equality is defined by TESTFN if non-nil or by `equal' 
if nil.
 
 \(fn SEQUENCE ELT &optional TESTFN)" nil nil)
 
+(autoload 'seq-group-by "seq" "\
+Apply FUNCTION to each element of SEQUENCE.
+Separate the elements of SEQUENCE into an alist using the results as
+keys.  Keys are compared using `equal'.
+
+\(fn FUNCTION SEQUENCE)" nil nil)
+
 (autoload 'seq-max "seq" "\
 Return the largest element of SEQUENCE.
 SEQUENCE must be a sequence of numbers or markers.
@@ -30686,10 +29649,13 @@ or call the function `server-mode'.")
 (autoload 'server-mode "server" "\
 Toggle Server mode.
 
-If called interactively, enable Server mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Server mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -30828,7 +29794,6 @@ To work around that, do:
 ;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from progmodes/sh-script.el
-(push (purecopy '(sh-script 2 0 6)) package--builtin-versions)
 (put 'sh-shell 'safe-local-variable 'symbolp)
 
 (autoload 'sh-mode "sh-script" "\
@@ -31028,6 +29993,19 @@ Make the shell buffer the current buffer, and return 
it.
 
 ;;;***
 
+;;;### (autoloads nil "shortdoc" "emacs-lisp/shortdoc.el" (0 0 0
+;;;;;;  0))
+;;; Generated autoloads from emacs-lisp/shortdoc.el
+
+(autoload 'shortdoc-display-group "shortdoc" "\
+Pop to a buffer with short documentation summary for functions in GROUP.
+
+\(fn GROUP)" t nil)
+
+(register-definition-prefixes "shortdoc" '("alist" "buffer" 
"define-short-documentation-group" "file" "hash-table" "list" "number" 
"process" "regexp" "sequence" "shortdoc-" "string" "vector"))
+
+;;;***
+
 ;;;### (autoloads nil "shr" "net/shr.el" (0 0 0 0))
 ;;; Generated autoloads from net/shr.el
 
@@ -31308,10 +30286,13 @@ buffer names.
 (autoload 'smerge-mode "smerge-mode" "\
 Minor mode to simplify editing output from the diff3 program.
 
-If called interactively, enable Smerge mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Smerge mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -31438,10 +30419,13 @@ Open the so-long `customize' group." t nil)
 (autoload 'so-long-minor-mode "so-long" "\
 This is the minor mode equivalent of `so-long-mode'.
 
-If called interactively, enable So-Long minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `So-Long minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -31517,10 +30501,13 @@ or call the function `global-so-long-mode'.")
 (autoload 'global-so-long-mode "so-long" "\
 Toggle automated performance mitigations for files with long lines.
 
-If called interactively, enable Global So-Long mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Global So-Long mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -32475,22 +31462,6 @@ Run vsql as an inferior process.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/compile"
-;;;;;;  "cedet/srecode/compile.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/compile.el
-
-(register-definition-prefixes "srecode/compile" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/cpp"
-;;;;;;  "cedet/srecode/cpp.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/cpp.el
-
-(register-definition-prefixes "srecode/cpp" '("srecode-"))
-
-;;;***
-
 ;;;### (autoloads nil "srecode/ctxt" "cedet/srecode/ctxt.el" (0 0
 ;;;;;;  0 0))
 ;;; Generated autoloads from cedet/srecode/ctxt.el
@@ -32507,30 +31478,6 @@ Run vsql as an inferior process.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/document"
-;;;;;;  "cedet/srecode/document.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/document.el
-
-(register-definition-prefixes "srecode/document" '("srecode-document-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/el" 
"cedet/srecode/el.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/el.el
-
-(register-definition-prefixes "srecode/el" 
'("srecode-semantic-apply-tag-to-dict"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/expandproto"
-;;;;;;  "cedet/srecode/expandproto.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/expandproto.el
-
-(register-definition-prefixes "srecode/expandproto" '("srecode-"))
-
-;;;***
-
 ;;;### (autoloads nil "srecode/extract" "cedet/srecode/extract.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/srecode/extract.el
@@ -32563,38 +31510,6 @@ Run vsql as an inferior process.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/getset"
-;;;;;;  "cedet/srecode/getset.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/getset.el
-
-(register-definition-prefixes "srecode/getset" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/insert"
-;;;;;;  "cedet/srecode/insert.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/insert.el
-
-(register-definition-prefixes "srecode/insert" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/map"
-;;;;;;  "cedet/srecode/map.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/map.el
-
-(register-definition-prefixes "srecode/map" '("srecode-"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/mode"
-;;;;;;  "cedet/srecode/mode.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/mode.el
-
-(register-definition-prefixes "srecode/mode" '("srecode-"))
-
-;;;***
-
 ;;;### (autoloads nil "srecode/semantic" "cedet/srecode/semantic.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/srecode/semantic.el
@@ -32603,14 +31518,6 @@ Run vsql as an inferior process.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/srt"
-;;;;;;  "cedet/srecode/srt.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/srt.el
-
-(register-definition-prefixes "srecode/srt" '("srecode-read-"))
-
-;;;***
-
 ;;;### (autoloads nil "srecode/srt-mode" "cedet/srecode/srt-mode.el"
 ;;;;;;  (0 0 0 0))
 ;;; Generated autoloads from cedet/srecode/srt-mode.el
@@ -32634,22 +31541,6 @@ Major-mode for writing SRecode macros.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/template"
-;;;;;;  "cedet/srecode/template.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/template.el
-
-(register-definition-prefixes "srecode/template" '("semantic-tag-components"))
-
-;;;***
-
-;;;### (autoloads "actual autoloads are elsewhere" "srecode/texi"
-;;;;;;  "cedet/srecode/texi.el" (0 0 0 0))
-;;; Generated autoloads from cedet/srecode/texi.el
-
-(register-definition-prefixes "srecode/texi" '("semantic-insert-foreign-tag" 
"srecode-texi-"))
-
-;;;***
-
 ;;;### (autoloads nil "strokes" "strokes.el" (0 0 0 0))
 ;;; Generated autoloads from strokes.el
 
@@ -32728,10 +31619,13 @@ or call the function `strokes-mode'.")
 (autoload 'strokes-mode "strokes" "\
 Toggle Strokes mode, a global minor mode.
 
-If called interactively, enable Strokes mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Strokes mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -32835,10 +31729,13 @@ Truncate STRING to LENGTH, replacing initial surplus 
with \"...\".
 (autoload 'subword-mode "subword" "\
 Toggle subword movement and editing (Subword mode).
 
-If called interactively, enable Subword mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Subword mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -32883,17 +31780,22 @@ ARG is omitted or nil.
 
 Subword mode is enabled in all buffers where
 `(lambda nil (subword-mode 1))' would do it.
-See `subword-mode' for more information on Subword mode.
+
+See `subword-mode' for more information on
+Subword mode.
 
 \(fn &optional ARG)" t nil)
 
 (autoload 'superword-mode "subword" "\
 Toggle superword movement and editing (Superword mode).
 
-If called interactively, enable Superword mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Superword mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -32927,7 +31829,9 @@ ARG is omitted or nil.
 
 Superword mode is enabled in all buffers where
 `(lambda nil (superword-mode 1))' would do it.
-See `superword-mode' for more information on Superword mode.
+
+See `superword-mode' for more information on
+Superword mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -32991,10 +31895,13 @@ or call the function `gpm-mouse-mode'.")
 (autoload 'gpm-mouse-mode "t-mouse" "\
 Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
 
-If called interactively, enable Gpm-Mouse mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Gpm-Mouse mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -33019,10 +31926,13 @@ GPM.  This is due to limitations in GPM and the Linux 
kernel.
 (autoload 'tab-line-mode "tab-line" "\
 Toggle display of window tab line in the buffer.
 
-If called interactively, enable Tab-Line mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Tab-Line mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -33053,7 +31963,9 @@ ARG is omitted or nil.
 
 Tab-Line mode is enabled in all buffers where
 `tab-line-mode--turn-on' would do it.
-See `tab-line-mode' for more information on Tab-Line mode.
+
+See `tab-line-mode' for more information on
+Tab-Line mode.
 
 \(fn &optional ARG)" t nil)
 
@@ -33430,10 +32342,13 @@ location is indicated by 
`table-word-continuation-char'.  This
 variable's value can be toggled by \\[table-fixed-width-mode] at
 run-time.
 
-If called interactively, enable Table-Fixed-Width mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Table-Fixed-Width mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -33752,7 +32667,7 @@ Prefix argument means invert sense of 
`tcl-use-smart-word-finder'.
 
 \(fn COMMAND &optional ARG)" t nil)
 
-(register-definition-prefixes "tcl" '("add-log-tcl-defun" 
"calculate-tcl-indent" "indent-tcl-exp" "inferior-tcl-" "run-tcl" 
"switch-to-tcl" "tcl-"))
+(register-definition-prefixes "tcl" '("inferior-tcl-" "run-tcl" 
"switch-to-tcl" "tcl-"))
 
 ;;;***
 
@@ -34618,10 +33533,13 @@ This function is meant to be used as a 
`post-self-insert-hook'." t nil)
 (autoload 'tildify-mode "tildify" "\
 Adds electric behavior to space character.
 
-If called interactively, enable Tildify mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Tildify mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -34670,10 +33588,13 @@ or call the function `display-time-mode'.")
 (autoload 'display-time-mode "time" "\
 Toggle display of time, load level, and mail flag in mode lines.
 
-If called interactively, enable Display-Time mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Display-Time mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -34791,6 +33712,10 @@ Lower-case specifiers return only the unit.
 optional leading \".\" for zero-padding.  For example, \"%.3Y\" will
 return something of the form \"001 year\".
 
+The \"%s\" spec takes an additional optional parameter,
+introduced by the \",\" character, to say how many decimals to
+use.  \"%,1s\" means \"use one decimal\".
+
 The \"%z\" specifier does not print anything.  When it is used, specifiers
 must be given in order of decreasing size.  To the left of \"%z\", nothing
 is output until the first non-zero unit is encountered.
@@ -34857,7 +33782,6 @@ With ARG, turn time stamping on if and only if arg is 
positive.
 ;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (0 0 0
 ;;;;;;  0))
 ;;; Generated autoloads from calendar/timeclock.el
-(push (purecopy '(timeclock 2 6 1)) package--builtin-versions)
 
 (defvar timeclock-mode-line-display nil "\
 Non-nil if Timeclock-Mode-Line-Display mode is enabled.
@@ -35012,7 +33936,6 @@ To get complete usage, invoke \"emacs -batch -f 
batch-titdic-convert -h\".
 ;;;### (autoloads nil "tmm" "tmm.el" (0 0 0 0))
 ;;; Generated autoloads from tmm.el
  (define-key global-map "\M-`" 'tmm-menubar)
- (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
 
 (autoload 'tmm-menubar "tmm" "\
 Text-mode emulation of looking and choosing from a menubar.
@@ -35557,10 +34480,13 @@ or call the function `type-break-mode'.")
 Enable or disable typing-break mode.
 This is a minor mode, but it is global to all buffers by default.
 
-If called interactively, enable Type-Break mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Type-Break mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -35780,14 +34706,6 @@ which specify the range to operate on.
 
 ;;;***
 
-;;;### (autoloads "actual autoloads are elsewhere" "undigest" 
"mail/undigest.el"
-;;;;;;  (0 0 0 0))
-;;; Generated autoloads from mail/undigest.el
-
-(register-definition-prefixes "undigest" '("rmail-"))
-
-;;;***
-
 ;;;### (autoloads nil "unrmail" "mail/unrmail.el" (0 0 0 0))
 ;;; Generated autoloads from mail/unrmail.el
 
@@ -36093,10 +35011,13 @@ or call the function `url-handler-mode'.")
 (autoload 'url-handler-mode "url-handlers" "\
 Toggle using `url' library for URL filenames (URL Handler mode).
 
-If called interactively, enable Url-Handler mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Url-Handler mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38251,10 +37172,13 @@ own View-like bindings.
 (autoload 'view-mode "view" "\
 Toggle View mode, a minor mode for viewing text but not editing it.
 
-If called interactively, enable View mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `View mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38627,10 +37551,13 @@ or call the function `which-function-mode'.")
 (autoload 'which-function-mode "which-func" "\
 Toggle mode line display of current function (Which Function mode).
 
-If called interactively, enable Which-Function mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Which-Function mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38652,10 +37579,13 @@ in certain major modes.
 (autoload 'whitespace-mode "whitespace" "\
 Toggle whitespace visualization (Whitespace mode).
 
-If called interactively, enable Whitespace mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Whitespace mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38668,10 +37598,13 @@ See also `whitespace-style', `whitespace-newline' and
 (autoload 'whitespace-newline-mode "whitespace" "\
 Toggle newline visualization (Whitespace Newline mode).
 
-If called interactively, enable Whitespace-Newline mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Whitespace-Newline mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38698,10 +37631,13 @@ or call the function `global-whitespace-mode'.")
 (autoload 'global-whitespace-mode "whitespace" "\
 Toggle whitespace visualization globally (Global Whitespace mode).
 
-If called interactively, enable Global Whitespace mode if ARG is
-positive, and disable it if ARG is zero or negative.  If called from
-Lisp, also enable the mode if ARG is omitted or nil, and toggle it if
-ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Whitespace mode'.  If the
+prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -38724,10 +37660,13 @@ or call the function 
`global-whitespace-newline-mode'.")
 (autoload 'global-whitespace-newline-mode "whitespace" "\
 Toggle global newline visualization (Global Whitespace Newline mode).
 
-If called interactively, enable Global Whitespace-Newline mode if ARG
-is positive, and disable it if ARG is zero or negative.  If called
-from Lisp, also enable the mode if ARG is omitted or nil, and toggle
-it if ARG is `toggle'; disable the mode otherwise.
+If called interactively, toggle `Global Whitespace-Newline mode'.  If
+the prefix argument is positive, enable the mode, and if it is zero or
+negative, disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -39051,10 +37990,13 @@ Show widget browser for WIDGET in other window.
 (autoload 'widget-minor-mode "wid-browse" "\
 Minor mode for traversing widgets.
 
-If called interactively, enable Widget minor mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Widget minor mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -39288,10 +38230,13 @@ or call the function `winner-mode'.")
 (autoload 'winner-mode "winner" "\
 Toggle Winner mode on or off.
 
-If called interactively, enable Winner mode if ARG is positive, and
-disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Winner mode'.  If the prefix argument
+is positive, enable the mode, and if it is zero or negative, disable
+the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
@@ -39577,10 +38522,13 @@ or call the function `xterm-mouse-mode'.")
 (autoload 'xterm-mouse-mode "xt-mouse" "\
 Toggle XTerm mouse mode.
 
-If called interactively, enable Xterm-Mouse mode if ARG is positive,
-and disable it if ARG is zero or negative.  If called from Lisp, also
-enable the mode if ARG is omitted or nil, and toggle it if ARG is
-`toggle'; disable the mode otherwise.
+If called interactively, toggle `Xterm-Mouse mode'.  If the prefix
+argument is positive, enable the mode, and if it is zero or negative,
+disable the mode.
+
+If called from Lisp, toggle the mode if if ARG is `toggle'.  Enable
+the mode if ARG is nil, omitted, or is a positive number.  All other
+values will disable the mode.
 
 The mode's hook is called both when the mode is enabled and when it is
 disabled.
diff --git a/lisp/leim/quail/compose.el b/lisp/leim/quail/compose.el
new file mode 100644
index 0000000..eb37a42
--- /dev/null
+++ b/lisp/leim/quail/compose.el
@@ -0,0 +1,2926 @@
+;;; compose.el --- Quail package for Multi_key character composition 
-*-coding: utf-8;-*-
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; Author: Juri Linkov <juri@linkov.net>
+;; Keywords: multilingual, input method, i18n
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This input method supports the same key sequences as defined by the
+;; standard X Multi_key: https://en.wikipedia.org/wiki/Compose_key
+
+;; You can enable this input method transiently with `C-u C-x \ compose RET'.
+;; Then typing `C-x \' will enable this input method temporarily, and
+;; after typing a key sequence it will be disabled.  So typing
+;; e.g. `C-x \ E =' will insert the Euro sign character, and disable
+;; this input method automatically afterwards.
+
+;;; Code:
+
+(require 'quail)
+
+(quail-define-package
+ "compose" "UTF-8" "+" t
+ "Compose-like input method with the same key sequences as X Multi_key.
+Examples:
+ E = -> €   1 2 -> ½   ^ 3 -> ³"
+ '(("\t" . quail-completion))
+ t nil nil nil nil nil nil nil nil t)
+
+(quail-define-rules
+ ("''" ?´)
+ ("-^" ?¯)
+ ("^-" ?¯)
+ ("__" ?¯)
+ ("_^" ?¯)
+ (" (" ?˘)
+ ("( " ?˘)
+ ("\"\"" ?¨)
+ (" <" ?ˇ)
+ ("< " ?ˇ)
+ ("-- " ?­)
+ ("++" ?#)
+ ("' " ?\')
+ (" '" ?\')
+ ("AT" ?@)
+ ("((" ?\[)
+ ("//" ["\\\\"])
+ ("/<" ["\\\\"])
+ ("</" ["\\\\"])
+ ("))" ?\])
+ ("^ " ?^)
+ (" ^" ?^)
+ ("> " ?^)
+ (" >" ?^)
+ ("` " ?`)
+ (" `" ?`)
+ (", " ?¸)
+ (" ," ?¸)
+ (",," ?¸)
+ ("(-" ?\{)
+ ("-(" ?\{)
+ ("/^" ?|)
+ ("^/" ?|)
+ ("VL" ?|)
+ ("LV" ?|)
+ ("vl" ?|)
+ ("lv" ?|)
+ (")-" ?\})
+ ("-)" ?\})
+ ("~ " ?~)
+ (" ~" ?~)
+ ("- " ?~)
+ (" -" ?~)
+ ("  " ? )
+ (" ." ? )
+ ("oc" ?©)
+ ("oC" ?©)
+ ("Oc" ?©)
+ ("OC" ?©)
+ ("Co" ?©)
+ ("CO" ?©)
+ ("or" ?®)
+ ("oR" ?®)
+ ("Or" ?®)
+ ("OR" ?®)
+ ("Ro" ?®)
+ ("RO" ?®)
+ (".>" ?›)
+ (".<" ?‹)
+ (".." ?…)
+ (".-" ?·)
+ (".^" ?·)
+ ("^." ?·)
+ (".=" ?•)
+ ("!^" ?¦)
+ ("!!" ?¡)
+ ("p!" ?¶)
+ ("P!" ?¶)
+ ("+-" ?±)
+ ("-+" ?±)
+ ("??" ?¿)
+ ("ss" ?ß)
+ ("SS" ?ẞ)
+ ("oe" ?œ)
+ ("OE" ?Œ)
+ ("ae" ?æ)
+ ("AE" ?Æ)
+ ("ff" ?ff)
+ ("fi" ?fi)
+ ("fl" ?fl)
+ ("Fi" ?ffi)
+ ("Fl" ?ffl)
+ ("IJ" ?IJ)
+ ("Ij" ?IJ)
+ ("ij" ?ij)
+ ("oo" ?°)
+ ("*0" ?°)
+ ("0*" ?°)
+ ("<<" ?«)
+ (">>" ?»)
+ ("<'" ?‘)
+ ("'<" ?‘)
+ (">'" ?’)
+ ("'>" ?’)
+ (",'" ?‚)
+ ("'," ?‚)
+ ("<\"" ?“)
+ ("\"<" ?“)
+ (">\"" ?”)
+ ("\">" ?”)
+ (",\"" ?„)
+ ("\"," ?„)
+ ("%o" ?‰)
+ ("CE" ?₠)
+ ("C/" ?₡)
+ ("/C" ?₡)
+ ("Cr" ?₢)
+ ("Fr" ?₣)
+ ("L=" ?₤)
+ ("=L" ?₤)
+ ("m/" ?₥)
+ ("/m" ?₥)
+ ("N=" ?₦)
+ ("=N" ?₦)
+ ("Pt" ?₧)
+ ("Rs" ?₨)
+ ("W=" ?₩)
+ ("=W" ?₩)
+ ("d=" ?₫)
+ ("=d" ?₫)
+ ("C=" ?€)
+ ("=C" ?€)
+ ("c=" ?€)
+ ("=c" ?€)
+ ("E=" ?€)
+ ("=E" ?€)
+ ("e=" ?€)
+ ("=e" ?€)
+ ("С=" ?€)
+ ("=С" ?€)
+ ("Е=" ?€)
+ ("=Е" ?€)
+ ("P=" ?₽)
+ ("p=" ?₽)
+ ("=P" ?₽)
+ ("=p" ?₽)
+ ("З=" ?₽)
+ ("з=" ?₽)
+ ("=З" ?₽)
+ ("=з" ?₽)
+ ("R=" ?₹)
+ ("=R" ?₹)
+ ("r=" ?₹)
+ ("=r" ?₹)
+ ("C|" ?¢)
+ ("|C" ?¢)
+ ("c|" ?¢)
+ ("|c" ?¢)
+ ("c/" ?¢)
+ ("/c" ?¢)
+ ("L-" ?£)
+ ("-L" ?£)
+ ("l-" ?£)
+ ("-l" ?£)
+ ("Y=" ?¥)
+ ("=Y" ?¥)
+ ("y=" ?¥)
+ ("=y" ?¥)
+ ("Y-" ?¥)
+ ("-Y" ?¥)
+ ("y-" ?¥)
+ ("-y" ?¥)
+ ("fs" ?ſ)
+ ("fS" ?ſ)
+ ("--." ?–)
+ ("---" ?—)
+ ("#q" ?♩)
+ ("#e" ?♪)
+ ("#E" ?♫)
+ ("#S" ?♬)
+ ("#b" ?♭)
+ ("#f" ?♮)
+ ("##" ?♯)
+ ("so" ?§)
+ ("os" ?§)
+ ("SO" ?§)
+ ("OS" ?§)
+ ("s!" ?§)
+ ("S!" ?§)
+ ("па" ?§)
+ ("ox" ?¤)
+ ("xo" ?¤)
+ ("oX" ?¤)
+ ("Xo" ?¤)
+ ("OX" ?¤)
+ ("XO" ?¤)
+ ("Ox" ?¤)
+ ("xO" ?¤)
+ ("PP" ?¶)
+ ("No" ?№)
+ ("NO" ?№)
+ ("Но" ?№)
+ ("НО" ?№)
+ ("?!" ?⸘)
+ ("!?" ?‽)
+ ("CCCP" ?☭)
+ ("OA" ?Ⓐ)
+ ("<3" ?♥)
+ (":)" ?☺)
+ (":(" ?☹)
+ ("\\o/" ?🙌)
+ ("poo" ?💩)
+ ("FU" ?🖕)
+ ("LLAP" ?🖖)
+ ("ᄀᄀ" ?ᄁ)
+ ("ᄃᄃ" ?ᄄ)
+ ("ᄇᄇ" ?ᄈ)
+ ("ᄉᄉ" ?ᄊ)
+ ("ᄌᄌ" ?ᄍ)
+ ("ᄂᄀ" ?ᄓ)
+ ("ᄂᄂ" ?ᄔ)
+ ("ᄂᄃ" ?ᄕ)
+ ("ᄂᄇ" ?ᄖ)
+ ("ᄃᄀ" ?ᄗ)
+ ("ᄅᄂ" ?ᄘ)
+ ("ᄅᄅ" ?ᄙ)
+ ("ᄅᄒ" ?ᄚ)
+ ("ᄅᄋ" ?ᄛ)
+ ("ᄆᄇ" ?ᄜ)
+ ("ᄆᄋ" ?ᄝ)
+ ("ᄇᄀ" ?ᄞ)
+ ("ᄇᄂ" ?ᄟ)
+ ("ᄇᄃ" ?ᄠ)
+ ("ᄇᄉ" ?ᄡ)
+ ("ᄇᄌ" ?ᄧ)
+ ("ᄇᄎ" ?ᄨ)
+ ("ᄇᄐ" ?ᄩ)
+ ("ᄇᄑ" ?ᄪ)
+ ("ᄇᄋ" ?ᄫ)
+ ("ᄉᄀ" ?ᄭ)
+ ("ᄉᄂ" ?ᄮ)
+ ("ᄉᄃ" ?ᄯ)
+ ("ᄉᄅ" ?ᄰ)
+ ("ᄉᄆ" ?ᄱ)
+ ("ᄉᄇ" ?ᄲ)
+ ("ᄉᄋ" ?ᄵ)
+ ("ᄉᄌ" ?ᄶ)
+ ("ᄉᄎ" ?ᄷ)
+ ("ᄉᄏ" ?ᄸ)
+ ("ᄉᄐ" ?ᄹ)
+ ("ᄉᄑ" ?ᄺ)
+ ("ᄉᄒ" ?ᄻ)
+ ("ᄼᄼ" ?ᄽ)
+ ("ᄾᄾ" ?ᄿ)
+ ("ᄋᄀ" ?ᅁ)
+ ("ᄋᄃ" ?ᅂ)
+ ("ᄋᄆ" ?ᅃ)
+ ("ᄋᄇ" ?ᅄ)
+ ("ᄋᄉ" ?ᅅ)
+ ("ᄋᅀ" ?ᅆ)
+ ("ᄋᄋ" ?ᅇ)
+ ("ᄋᄌ" ?ᅈ)
+ ("ᄋᄎ" ?ᅉ)
+ ("ᄋᄐ" ?ᅊ)
+ ("ᄋᄑ" ?ᅋ)
+ ("ᄌᄋ" ?ᅍ)
+ ("ᅎᅎ" ?ᅏ)
+ ("ᅐᅐ" ?ᅑ)
+ ("ᄎᄏ" ?ᅒ)
+ ("ᄎᄒ" ?ᅓ)
+ ("ᄑᄇ" ?ᅖ)
+ ("ᄑᄋ" ?ᅗ)
+ ("ᄒᄒ" ?ᅘ)
+ ("ᅡᅵ" ?ᅢ)
+ ("ᅣᅵ" ?ᅤ)
+ ("ᅥᅵ" ?ᅦ)
+ ("ᅧᅵ" ?ᅨ)
+ ("ᅩᅡ" ?ᅪ)
+ ("ᅩᅵ" ?ᅬ)
+ ("ᅮᅥ" ?ᅯ)
+ ("ᅮᅵ" ?ᅱ)
+ ("ᅳᅵ" ?ᅴ)
+ ("ᅡᅩ" ?ᅶ)
+ ("ᅡᅮ" ?ᅷ)
+ ("ᅣᅩ" ?ᅸ)
+ ("ᅣᅭ" ?ᅹ)
+ ("ᅥᅩ" ?ᅺ)
+ ("ᅥᅮ" ?ᅻ)
+ ("ᅥᅳ" ?ᅼ)
+ ("ᅧᅩ" ?ᅽ)
+ ("ᅧᅮ" ?ᅾ)
+ ("ᅩᅥ" ?ᅿ)
+ ("ᅩᅦ" ?ᆀ)
+ ("ᅩᅨ" ?ᆁ)
+ ("ᅩᅩ" ?ᆂ)
+ ("ᅩᅮ" ?ᆃ)
+ ("ᅭᅣ" ?ᆄ)
+ ("ᅭᅤ" ?ᆅ)
+ ("ᅭᅧ" ?ᆆ)
+ ("ᅭᅩ" ?ᆇ)
+ ("ᅭᅵ" ?ᆈ)
+ ("ᅮᅡ" ?ᆉ)
+ ("ᅮᅢ" ?ᆊ)
+ ("ᅮᅨ" ?ᆌ)
+ ("ᅮᅮ" ?ᆍ)
+ ("ᅲᅡ" ?ᆎ)
+ ("ᅲᅥ" ?ᆏ)
+ ("ᅲᅦ" ?ᆐ)
+ ("ᅲᅧ" ?ᆑ)
+ ("ᅲᅨ" ?ᆒ)
+ ("ᅲᅮ" ?ᆓ)
+ ("ᅲᅵ" ?ᆔ)
+ ("ᅳᅮ" ?ᆕ)
+ ("ᅳᅳ" ?ᆖ)
+ ("ᅴᅮ" ?ᆗ)
+ ("ᅵᅡ" ?ᆘ)
+ ("ᅵᅣ" ?ᆙ)
+ ("ᅵᅩ" ?ᆚ)
+ ("ᅵᅮ" ?ᆛ)
+ ("ᅵᅳ" ?ᆜ)
+ ("ᅵᆞ" ?ᆝ)
+ ("ᆞᅥ" ?ᆟ)
+ ("ᆞᅮ" ?ᆠ)
+ ("ᆞᅵ" ?ᆡ)
+ ("ᆞᆞ" ?ᆢ)
+ ("ᆨᆨ" ?ᆩ)
+ ("ᆨᆺ" ?ᆪ)
+ ("ᆫᆽ" ?ᆬ)
+ ("ᆫᇂ" ?ᆭ)
+ ("ᆯᆨ" ?ᆰ)
+ ("ᆯᆷ" ?ᆱ)
+ ("ᆯᆸ" ?ᆲ)
+ ("ᆯᆺ" ?ᆳ)
+ ("ᆯᇀ" ?ᆴ)
+ ("ᆯᇁ" ?ᆵ)
+ ("ᆯᇂ" ?ᆶ)
+ ("ᆸᆺ" ?ᆹ)
+ ("ᆺᆺ" ?ᆻ)
+ ("ᆨᆯ" ?ᇃ)
+ ("ᆫᆨ" ?ᇅ)
+ ("ᆫᆮ" ?ᇆ)
+ ("ᆫᆺ" ?ᇇ)
+ ("ᆫᇫ" ?ᇈ)
+ ("ᆫᇀ" ?ᇉ)
+ ("ᆮᆨ" ?ᇊ)
+ ("ᆮᆯ" ?ᇋ)
+ ("ᆯᆫ" ?ᇍ)
+ ("ᆯᆮ" ?ᇎ)
+ ("ᆯᆯ" ?ᇐ)
+ ("ᆯᇫ" ?ᇗ)
+ ("ᆯᆿ" ?ᇘ)
+ ("ᆯᇹ" ?ᇙ)
+ ("ᆷᆨ" ?ᇚ)
+ ("ᆷᆯ" ?ᇛ)
+ ("ᆷᆸ" ?ᇜ)
+ ("ᆷᆺ" ?ᇝ)
+ ("ᆷᇫ" ?ᇟ)
+ ("ᆷᆾ" ?ᇠ)
+ ("ᆷᇂ" ?ᇡ)
+ ("ᆷᆼ" ?ᇢ)
+ ("ᆸᆯ" ?ᇣ)
+ ("ᆸᇁ" ?ᇤ)
+ ("ᆸᇂ" ?ᇥ)
+ ("ᆸᆼ" ?ᇦ)
+ ("ᆺᆨ" ?ᇧ)
+ ("ᆺᆮ" ?ᇨ)
+ ("ᆺᆯ" ?ᇩ)
+ ("ᆺᆸ" ?ᇪ)
+ ("ᆼᆨ" ?ᇬ)
+ ("ᆼᆼ" ?ᇮ)
+ ("ᆼᆿ" ?ᇯ)
+ ("ᇰᆺ" ?ᇱ)
+ ("ᇰᇫ" ?ᇲ)
+ ("ᇁᆸ" ?ᇳ)
+ ("ᇁᆼ" ?ᇴ)
+ ("ᇂᆫ" ?ᇵ)
+ ("ᇂᆯ" ?ᇶ)
+ ("ᇂᆷ" ?ᇷ)
+ ("ᇂᆸ" ?ᇸ)
+ ("ᄡᄀ" ?ᄢ)
+ ("ᄡᄃ" ?ᄣ)
+ ("ᄡᄇ" ?ᄤ)
+ ("ᄡᄉ" ?ᄥ)
+ ("ᄡᄌ" ?ᄦ)
+ ("ᄈᄋ" ?ᄬ)
+ ("ᄲᄀ" ?ᄳ)
+ ("ᄊᄉ" ?ᄴ)
+ ("ᅪᅵ" ?ᅫ)
+ ("ᅯᅵ" ?ᅰ)
+ ("ᅯᅳ" ?ᆋ)
+ ("ᆪᆨ" ?ᇄ)
+ ("ᆰᆺ" ?ᇌ)
+ ("ᇎᇂ" ?ᇏ)
+ ("ᆱᆨ" ?ᇑ)
+ ("ᆱᆺ" ?ᇒ)
+ ("ᆲᆺ" ?ᇓ)
+ ("ᆲᇂ" ?ᇔ)
+ ("ᆲᆼ" ?ᇕ)
+ ("ᆳᆺ" ?ᇖ)
+ ("ᇝᆺ" ?ᇞ)
+ ("ᇬᆨ" ?ᇭ)
+ ("ᄇᄭ" ?ᄢ)
+ ("ᄇᄯ" ?ᄣ)
+ ("ᄇᄲ" ?ᄤ)
+ ("ᄇᄊ" ?ᄥ)
+ ("ᄇᄶ" ?ᄦ)
+ ("ᄇᄫ" ?ᄬ)
+ ("ᄉᄞ" ?ᄳ)
+ ("ᄉᄊ" ?ᄴ)
+ ("ᅩᅢ" ?ᅫ)
+ ("ᅮᅦ" ?ᅰ)
+ ("ᅮᅼ" ?ᆋ)
+ ("ᆨᇧ" ?ᇄ)
+ ("ᆯᆪ" ?ᇌ)
+ ("ᆯᇚ" ?ᇑ)
+ ("ᆯᇝ" ?ᇒ)
+ ("ᆯᆹ" ?ᇓ)
+ ("ᆯᇥ" ?ᇔ)
+ ("ᆯᇦ" ?ᇕ)
+ ("ᆯᆻ" ?ᇖ)
+ ("ᆷᆻ" ?ᇞ)
+ ("ᆼᆩ" ?ᇭ)
+ (",-" ?¬)
+ ("-," ?¬)
+ ("^_a" ?ª)
+ ("^_a" ?ª)
+ ("^2" ?²)
+ ("2^" ?²)
+ ("^3" ?³)
+ ("3^" ?³)
+ ("mu" ?µ)
+ ("/u" ?µ)
+ ("u/" ?µ)
+ ("^1" ?¹)
+ ("1^" ?¹)
+ ("^_o" ?º)
+ ("^_o" ?º)
+ ("14" ?¼)
+ ("12" ?½)
+ ("34" ?¾)
+ ("`A" ?À)
+ ("A`" ?À)
+ ("´A" ?Á)
+ ("A´" ?Á)
+ ("'A" ?Á)
+ ("A'" ?Á)
+ ("^A" ?Â)
+ ("A^" ?Â)
+ (">A" ?Â)
+ ("A>" ?Â)
+ ("~A" ?Ã)
+ ("A~" ?Ã)
+ ("\"A" ?Ä)
+ ("A\"" ?Ä)
+ ("¨A" ?Ä)
+ ("A¨" ?Ä)
+ ("oA" ?Å)
+ ("*A" ?Å)
+ ("A*" ?Å)
+ ("AA" ?Å)
+ (",C" ?Ç)
+ ("C," ?Ç)
+ ("¸C" ?Ç)
+ ("`E" ?È)
+ ("E`" ?È)
+ ("´E" ?É)
+ ("E´" ?É)
+ ("'E" ?É)
+ ("E'" ?É)
+ ("^E" ?Ê)
+ ("E^" ?Ê)
+ (">E" ?Ê)
+ ("E>" ?Ê)
+ ("\"E" ?Ë)
+ ("E\"" ?Ë)
+ ("¨E" ?Ë)
+ ("E¨" ?Ë)
+ ("`I" ?Ì)
+ ("I`" ?Ì)
+ ("´I" ?Í)
+ ("I´" ?Í)
+ ("'I" ?Í)
+ ("I'" ?Í)
+ ("^I" ?Î)
+ ("I^" ?Î)
+ (">I" ?Î)
+ ("I>" ?Î)
+ ("\"I" ?Ï)
+ ("I\"" ?Ï)
+ ("¨I" ?Ï)
+ ("I¨" ?Ï)
+ ("'J" ["J́"])
+ ("J'" ["J́"])
+ ("´J" ["J́"])
+ ("J´" ["J́"])
+ ("DH" ?Ð)
+ ("~N" ?Ñ)
+ ("N~" ?Ñ)
+ ("`O" ?Ò)
+ ("O`" ?Ò)
+ ("´O" ?Ó)
+ ("O´" ?Ó)
+ ("'O" ?Ó)
+ ("O'" ?Ó)
+ ("^O" ?Ô)
+ ("O^" ?Ô)
+ (">O" ?Ô)
+ ("O>" ?Ô)
+ ("~O" ?Õ)
+ ("O~" ?Õ)
+ ("\"O" ?Ö)
+ ("O\"" ?Ö)
+ ("¨O" ?Ö)
+ ("O¨" ?Ö)
+ ("xx" ?×)
+ ("/O" ?Ø)
+ ("O/" ?Ø)
+ ("`U" ?Ù)
+ ("U`" ?Ù)
+ ("´U" ?Ú)
+ ("U´" ?Ú)
+ ("'U" ?Ú)
+ ("U'" ?Ú)
+ ("^U" ?Û)
+ ("U^" ?Û)
+ (">U" ?Û)
+ ("U>" ?Û)
+ ("\"U" ?Ü)
+ ("U\"" ?Ü)
+ ("¨U" ?Ü)
+ ("U¨" ?Ü)
+ ("´Y" ?Ý)
+ ("Y´" ?Ý)
+ ("'Y" ?Ý)
+ ("Y'" ?Ý)
+ ("TH" ?Þ)
+ ("`a" ?à)
+ ("a`" ?à)
+ ("´a" ?á)
+ ("a´" ?á)
+ ("'a" ?á)
+ ("a'" ?á)
+ ("^a" ?â)
+ ("a^" ?â)
+ (">a" ?â)
+ ("a>" ?â)
+ ("~a" ?ã)
+ ("a~" ?ã)
+ ("\"a" ?ä)
+ ("a\"" ?ä)
+ ("¨a" ?ä)
+ ("a¨" ?ä)
+ ("oa" ?å)
+ ("*a" ?å)
+ ("a*" ?å)
+ ("aa" ?å)
+ (",c" ?ç)
+ ("c," ?ç)
+ ("¸c" ?ç)
+ ("`e" ?è)
+ ("e`" ?è)
+ ("´e" ?é)
+ ("e´" ?é)
+ ("'e" ?é)
+ ("e'" ?é)
+ ("^e" ?ê)
+ ("e^" ?ê)
+ (">e" ?ê)
+ ("e>" ?ê)
+ ("\"e" ?ë)
+ ("e\"" ?ë)
+ ("¨e" ?ë)
+ ("e¨" ?ë)
+ ("`i" ?ì)
+ ("i`" ?ì)
+ ("´i" ?í)
+ ("i´" ?í)
+ ("'i" ?í)
+ ("i'" ?í)
+ ("^i" ?î)
+ ("i^" ?î)
+ (">i" ?î)
+ ("i>" ?î)
+ ("\"i" ?ï)
+ ("i\"" ?ï)
+ ("¨i" ?ï)
+ ("i¨" ?ï)
+ ("'j" ["j́"])
+ ("j'" ["j́"])
+ ("´j" ["j́"])
+ ("j´" ["j́"])
+ ("dh" ?ð)
+ ("~n" ?ñ)
+ ("n~" ?ñ)
+ ("`o" ?ò)
+ ("o`" ?ò)
+ ("´o" ?ó)
+ ("o´" ?ó)
+ ("'o" ?ó)
+ ("o'" ?ó)
+ ("^o" ?ô)
+ ("o^" ?ô)
+ (">o" ?ô)
+ ("o>" ?ô)
+ ("~o" ?õ)
+ ("o~" ?õ)
+ ("o¨" ?ö)
+ ("¨o" ?ö)
+ ("\"o" ?ö)
+ ("o\"" ?ö)
+ (":-" ?÷)
+ ("-:" ?÷)
+ ("/o" ?ø)
+ ("o/" ?ø)
+ ("`u" ?ù)
+ ("u`" ?ù)
+ ("´u" ?ú)
+ ("u´" ?ú)
+ ("'u" ?ú)
+ ("u'" ?ú)
+ ("^u" ?û)
+ ("u^" ?û)
+ (">u" ?û)
+ ("u>" ?û)
+ ("\"u" ?ü)
+ ("u\"" ?ü)
+ ("¨u" ?ü)
+ ("u¨" ?ü)
+ ("´y" ?ý)
+ ("y´" ?ý)
+ ("'y" ?ý)
+ ("y'" ?ý)
+ ("th" ?þ)
+ ("\"y" ?ÿ)
+ ("y\"" ?ÿ)
+ ("¨y" ?ÿ)
+ ("y¨" ?ÿ)
+ ("¯A" ?Ā)
+ ("_A" ?Ā)
+ ("A_" ?Ā)
+ ("-A" ?Ā)
+ ("A-" ?Ā)
+ ("¯a" ?ā)
+ ("_a" ?ā)
+ ("a_" ?ā)
+ ("-a" ?ā)
+ ("a-" ?ā)
+ ("UA" ?Ă)
+ ("uA" ?Ă)
+ ("bA" ?Ă)
+ ("A(" ?Ă)
+ ("Ua" ?ă)
+ ("ua" ?ă)
+ ("ba" ?ă)
+ ("a(" ?ă)
+ (";A" ?Ą)
+ ("A;" ?Ą)
+ (",A" ?Ą)
+ ("A," ?Ą)
+ (";a" ?ą)
+ ("a;" ?ą)
+ (",a" ?ą)
+ ("a," ?ą)
+ ("´C" ?Ć)
+ ("'C" ?Ć)
+ ("C'" ?Ć)
+ ("´c" ?ć)
+ ("'c" ?ć)
+ ("c'" ?ć)
+ ("^C" ?Ĉ)
+ ("^c" ?ĉ)
+ (".C" ?Ċ)
+ ("C." ?Ċ)
+ (".c" ?ċ)
+ ("c." ?ċ)
+ ("cC" ?Č)
+ ("<C" ?Č)
+ ("C<" ?Č)
+ ("cc" ?č)
+ ("<c" ?č)
+ ("c<" ?č)
+ ("cD" ?Ď)
+ ("<D" ?Ď)
+ ("D<" ?Ď)
+ ("cd" ?ď)
+ ("<d" ?ď)
+ ("d<" ?ď)
+ ("-D" ?Đ)
+ ("D-" ?Đ)
+ ("/D" ?Đ)
+ ("-d" ?đ)
+ ("d-" ?đ)
+ ("/d" ?đ)
+ ("¯E" ?Ē)
+ ("_E" ?Ē)
+ ("E_" ?Ē)
+ ("-E" ?Ē)
+ ("E-" ?Ē)
+ ("¯e" ?ē)
+ ("_e" ?ē)
+ ("e_" ?ē)
+ ("-e" ?ē)
+ ("e-" ?ē)
+ ("UE" ?Ĕ)
+ ("bE" ?Ĕ)
+ ("Ue" ?ĕ)
+ ("be" ?ĕ)
+ (".E" ?Ė)
+ ("E." ?Ė)
+ (".e" ?ė)
+ ("e." ?ė)
+ (";E" ?Ę)
+ ("E;" ?Ę)
+ (",E" ?Ę)
+ ("E," ?Ę)
+ (";e" ?ę)
+ ("e;" ?ę)
+ (",e" ?ę)
+ ("e," ?ę)
+ ("cE" ?Ě)
+ ("<E" ?Ě)
+ ("E<" ?Ě)
+ ("ce" ?ě)
+ ("<e" ?ě)
+ ("e<" ?ě)
+ ("^G" ?Ĝ)
+ ("^g" ?ĝ)
+ ("UG" ?Ğ)
+ ("GU" ?Ğ)
+ ("bG" ?Ğ)
+ ("˘G" ?Ğ)
+ ("G˘" ?Ğ)
+ ("G(" ?Ğ)
+ ("Ug" ?ğ)
+ ("gU" ?ğ)
+ ("bg" ?ğ)
+ ("˘g" ?ğ)
+ ("g˘" ?ğ)
+ ("g(" ?ğ)
+ (".G" ?Ġ)
+ ("G." ?Ġ)
+ (".g" ?ġ)
+ ("g." ?ġ)
+ (",G" ?Ģ)
+ ("G," ?Ģ)
+ ("¸G" ?Ģ)
+ (",g" ?ģ)
+ ("g," ?ģ)
+ ("¸g" ?ģ)
+ ("^H" ?Ĥ)
+ ("^h" ?ĥ)
+ ("/H" ?Ħ)
+ ("/h" ?ħ)
+ ("~I" ?Ĩ)
+ ("I~" ?Ĩ)
+ ("~i" ?ĩ)
+ ("i~" ?ĩ)
+ ("¯I" ?Ī)
+ ("_I" ?Ī)
+ ("I_" ?Ī)
+ ("-I" ?Ī)
+ ("I-" ?Ī)
+ ("¯i" ?ī)
+ ("_i" ?ī)
+ ("i_" ?ī)
+ ("-i" ?ī)
+ ("i-" ?ī)
+ ("UI" ?Ĭ)
+ ("bI" ?Ĭ)
+ ("Ui" ?ĭ)
+ ("bi" ?ĭ)
+ (";I" ?Į)
+ ("I;" ?Į)
+ (",I" ?Į)
+ ("I," ?Į)
+ (";i" ?į)
+ ("i;" ?į)
+ (",i" ?į)
+ ("i," ?į)
+ (".I" ?İ)
+ ("I." ?İ)
+ ("i." ?ı)
+ (".i" ?ı)
+ ("^J" ?Ĵ)
+ ("^j" ?ĵ)
+ (",K" ?Ķ)
+ ("K," ?Ķ)
+ ("¸K" ?Ķ)
+ (",k" ?ķ)
+ ("k," ?ķ)
+ ("¸k" ?ķ)
+ ("kk" ?ĸ)
+ ("´L" ?Ĺ)
+ ("'L" ?Ĺ)
+ ("L'" ?Ĺ)
+ ("´l" ?ĺ)
+ ("'l" ?ĺ)
+ ("l'" ?ĺ)
+ (",L" ?Ļ)
+ ("L," ?Ļ)
+ ("¸L" ?Ļ)
+ (",l" ?ļ)
+ ("l," ?ļ)
+ ("¸l" ?ļ)
+ ("cL" ?Ľ)
+ ("<L" ?Ľ)
+ ("L<" ?Ľ)
+ ("cl" ?ľ)
+ ("<l" ?ľ)
+ ("l<" ?ľ)
+ ("/L" ?Ł)
+ ("L/" ?Ł)
+ ("/l" ?ł)
+ ("l/" ?ł)
+ ("´N" ?Ń)
+ ("'N" ?Ń)
+ ("N'" ?Ń)
+ ("´n" ?ń)
+ ("'n" ?ń)
+ ("n'" ?ń)
+ (",N" ?Ņ)
+ ("N," ?Ņ)
+ ("¸N" ?Ņ)
+ (",n" ?ņ)
+ ("n," ?ņ)
+ ("¸n" ?ņ)
+ ("cN" ?Ň)
+ ("<N" ?Ň)
+ ("N<" ?Ň)
+ ("cn" ?ň)
+ ("<n" ?ň)
+ ("n<" ?ň)
+ ("NG" ?Ŋ)
+ ("ng" ?ŋ)
+ ("¯O" ?Ō)
+ ("_O" ?Ō)
+ ("O_" ?Ō)
+ ("-O" ?Ō)
+ ("O-" ?Ō)
+ ("¯o" ?ō)
+ ("_o" ?ō)
+ ("o_" ?ō)
+ ("-o" ?ō)
+ ("o-" ?ō)
+ ("UO" ?Ŏ)
+ ("bO" ?Ŏ)
+ ("Uo" ?ŏ)
+ ("bo" ?ŏ)
+ ("=O" ?Ő)
+ ("=o" ?ő)
+ ("´R" ?Ŕ)
+ ("'R" ?Ŕ)
+ ("R'" ?Ŕ)
+ ("´r" ?ŕ)
+ ("'r" ?ŕ)
+ ("r'" ?ŕ)
+ (",R" ?Ŗ)
+ ("R," ?Ŗ)
+ ("¸R" ?Ŗ)
+ (",r" ?ŗ)
+ ("r," ?ŗ)
+ ("¸r" ?ŗ)
+ ("cR" ?Ř)
+ ("<R" ?Ř)
+ ("R<" ?Ř)
+ ("cr" ?ř)
+ ("<r" ?ř)
+ ("r<" ?ř)
+ ("´S" ?Ś)
+ ("'S" ?Ś)
+ ("S'" ?Ś)
+ ("´s" ?ś)
+ ("'s" ?ś)
+ ("s'" ?ś)
+ ("^S" ?Ŝ)
+ ("^s" ?ŝ)
+ (",S" ?Ş)
+ ("S," ?Ş)
+ ("¸S" ?Ş)
+ (",s" ?ş)
+ ("s," ?ş)
+ ("¸s" ?ş)
+ ("s¸" ?ş)
+ ("cS" ?Š)
+ ("<S" ?Š)
+ ("S<" ?Š)
+ ("cs" ?š)
+ ("<s" ?š)
+ ("s<" ?š)
+ (",T" ?Ţ)
+ ("T," ?Ţ)
+ ("¸T" ?Ţ)
+ (",t" ?ţ)
+ ("t," ?ţ)
+ ("¸t" ?ţ)
+ ("cT" ?Ť)
+ ("<T" ?Ť)
+ ("T<" ?Ť)
+ ("ct" ?ť)
+ ("<t" ?ť)
+ ("t<" ?ť)
+ ("/T" ?Ŧ)
+ ("T/" ?Ŧ)
+ ("T-" ?Ŧ)
+ ("/t" ?ŧ)
+ ("t/" ?ŧ)
+ ("t-" ?ŧ)
+ ("~U" ?Ũ)
+ ("U~" ?Ũ)
+ ("~u" ?ũ)
+ ("u~" ?ũ)
+ ("¯U" ?Ū)
+ ("_U" ?Ū)
+ ("U_" ?Ū)
+ ("-U" ?Ū)
+ ("U-" ?Ū)
+ ("¯u" ?ū)
+ ("_u" ?ū)
+ ("u_" ?ū)
+ ("-u" ?ū)
+ ("u-" ?ū)
+ ("UU" ?Ŭ)
+ ("uU" ?Ŭ)
+ ("bU" ?Ŭ)
+ ("Uu" ?ŭ)
+ ("uu" ?ŭ)
+ ("bu" ?ŭ)
+ ("oU" ?Ů)
+ ("*U" ?Ů)
+ ("U*" ?Ů)
+ ("ou" ?ů)
+ ("*u" ?ů)
+ ("u*" ?ů)
+ ("=U" ?Ű)
+ ("=u" ?ű)
+ (";U" ?Ų)
+ ("U;" ?Ų)
+ (",U" ?Ų)
+ ("U," ?Ų)
+ (";u" ?ų)
+ ("u;" ?ų)
+ (",u" ?ų)
+ ("u," ?ų)
+ ("^W" ?Ŵ)
+ ("W^" ?Ŵ)
+ ("^w" ?ŵ)
+ ("w^" ?ŵ)
+ ("^Y" ?Ŷ)
+ ("Y^" ?Ŷ)
+ ("^y" ?ŷ)
+ ("y^" ?ŷ)
+ ("\"Y" ?Ÿ)
+ ("Y\"" ?Ÿ)
+ ("¨Y" ?Ÿ)
+ ("Y¨" ?Ÿ)
+ ("´Z" ?Ź)
+ ("'Z" ?Ź)
+ ("Z'" ?Ź)
+ ("´z" ?ź)
+ ("'z" ?ź)
+ ("z'" ?ź)
+ (".Z" ?Ż)
+ ("Z." ?Ż)
+ (".z" ?ż)
+ ("z." ?ż)
+ ("cZ" ?Ž)
+ ("vZ" ?Ž)
+ ("<Z" ?Ž)
+ ("Z<" ?Ž)
+ ("cz" ?ž)
+ ("vz" ?ž)
+ ("<z" ?ž)
+ ("z<" ?ž)
+ ("/b" ?ƀ)
+ ("/I" ?Ɨ)
+ ("+O" ?Ơ)
+ ("+o" ?ơ)
+ ("+U" ?Ư)
+ ("+u" ?ư)
+ ("/Z" ?Ƶ)
+ ("/z" ?ƶ)
+ ("cA" ?Ǎ)
+ ("ca" ?ǎ)
+ ("cI" ?Ǐ)
+ ("ci" ?ǐ)
+ ("cO" ?Ǒ)
+ ("co" ?ǒ)
+ ("cU" ?Ǔ)
+ ("cu" ?ǔ)
+ ("¯Ü" ?Ǖ)
+ ("_Ü" ?Ǖ)
+ ("¯\"U" ?Ǖ)
+ ("_\"U" ?Ǖ)
+ ("¯ü" ?ǖ)
+ ("_ü" ?ǖ)
+ ("¯\"u" ?ǖ)
+ ("_\"u" ?ǖ)
+ ("´Ü" ?Ǘ)
+ ("'Ü" ?Ǘ)
+ ("´\"U" ?Ǘ)
+ ("'\"U" ?Ǘ)
+ ("´ü" ?ǘ)
+ ("'ü" ?ǘ)
+ ("´\"u" ?ǘ)
+ ("'\"u" ?ǘ)
+ ("cÜ" ?Ǚ)
+ ("c\"U" ?Ǚ)
+ ("cü" ?ǚ)
+ ("c\"u" ?ǚ)
+ ("`Ü" ?Ǜ)
+ ("`\"U" ?Ǜ)
+ ("`ü" ?ǜ)
+ ("`\"u" ?ǜ)
+ ("¯Ä" ?Ǟ)
+ ("_Ä" ?Ǟ)
+ ("¯\"A" ?Ǟ)
+ ("_\"A" ?Ǟ)
+ ("¯ä" ?ǟ)
+ ("_ä" ?ǟ)
+ ("¯\"a" ?ǟ)
+ ("_\"a" ?ǟ)
+ ("¯Ȧ" ?Ǡ)
+ ("_Ȧ" ?Ǡ)
+ ("¯.A" ?Ǡ)
+ ("_.A" ?Ǡ)
+ ("¯ȧ" ?ǡ)
+ ("_ȧ" ?ǡ)
+ ("¯.a" ?ǡ)
+ ("_.a" ?ǡ)
+ ("¯Æ" ?Ǣ)
+ ("_Æ" ?Ǣ)
+ ("¯æ" ?ǣ)
+ ("_æ" ?ǣ)
+ ("/G" ?Ǥ)
+ ("/g" ?ǥ)
+ ("cG" ?Ǧ)
+ ("cg" ?ǧ)
+ ("cK" ?Ǩ)
+ ("ck" ?ǩ)
+ (";O" ?Ǫ)
+ ("O;" ?Ǫ)
+ (",O" ?Ǫ)
+ ("O," ?Ǫ)
+ (";o" ?ǫ)
+ ("o;" ?ǫ)
+ (",o" ?ǫ)
+ ("o," ?ǫ)
+ ("¯Ǫ" ?Ǭ)
+ ("_Ǫ" ?Ǭ)
+ ("¯;O" ?Ǭ)
+ ("_;O" ?Ǭ)
+ ("¯ǫ" ?ǭ)
+ ("_ǫ" ?ǭ)
+ ("¯;o" ?ǭ)
+ ("_;o" ?ǭ)
+ ("cƷ" ?Ǯ)
+ ("cʒ" ?ǯ)
+ ("cj" ?ǰ)
+ ("´G" ?Ǵ)
+ ("'G" ?Ǵ)
+ ("´g" ?ǵ)
+ ("'g" ?ǵ)
+ ("`N" ?Ǹ)
+ ("`n" ?ǹ)
+ ("´Å" ?Ǻ)
+ ("'Å" ?Ǻ)
+ ("*'A" ?Ǻ)
+ ("´å" ?ǻ)
+ ("'å" ?ǻ)
+ ("*'a" ?ǻ)
+ ("´Æ" ?Ǽ)
+ ("'Æ" ?Ǽ)
+ ("´æ" ?ǽ)
+ ("'æ" ?ǽ)
+ ("´Ø" ?Ǿ)
+ ("'Ø" ?Ǿ)
+ ("´/O" ?Ǿ)
+ ("'/O" ?Ǿ)
+ ("´ø" ?ǿ)
+ ("'ø" ?ǿ)
+ ("´/o" ?ǿ)
+ ("'/o" ?ǿ)
+ ("cH" ?Ȟ)
+ ("ch" ?ȟ)
+ (".A" ?Ȧ)
+ (".a" ?ȧ)
+ ("¸E" ?Ȩ)
+ ("¸e" ?ȩ)
+ ("¯Ö" ?Ȫ)
+ ("_Ö" ?Ȫ)
+ ("¯\"O" ?Ȫ)
+ ("_\"O" ?Ȫ)
+ ("¯ö" ?ȫ)
+ ("_ö" ?ȫ)
+ ("¯\"o" ?ȫ)
+ ("_\"o" ?ȫ)
+ ("¯Õ" ?Ȭ)
+ ("_Õ" ?Ȭ)
+ ("¯~O" ?Ȭ)
+ ("_~O" ?Ȭ)
+ ("¯õ" ?ȭ)
+ ("_õ" ?ȭ)
+ ("¯~o" ?ȭ)
+ ("_~o" ?ȭ)
+ (".O" ?Ȯ)
+ (".o" ?ȯ)
+ ("¯Ȯ" ?Ȱ)
+ ("_Ȯ" ?Ȱ)
+ ("¯.O" ?Ȱ)
+ ("_.O" ?Ȱ)
+ ("¯ȯ" ?ȱ)
+ ("_ȯ" ?ȱ)
+ ("¯.o" ?ȱ)
+ ("_.o" ?ȱ)
+ ("¯Y" ?Ȳ)
+ ("_Y" ?Ȳ)
+ ("¯y" ?ȳ)
+ ("_y" ?ȳ)
+ ("ee" ?ə)
+ ("/i" ?ɨ)
+ ("/ʔ" ?ʡ)
+ ("^_h" ?ʰ)
+ ("^_h" ?ʰ)
+ ("^_ɦ" ?ʱ)
+ ("^_ɦ" ?ʱ)
+ ("^_j" ?ʲ)
+ ("^_j" ?ʲ)
+ ("^_r" ?ʳ)
+ ("^_r" ?ʳ)
+ ("^_ɹ" ?ʴ)
+ ("^_ɹ" ?ʴ)
+ ("^_ɻ" ?ʵ)
+ ("^_ɻ" ?ʵ)
+ ("^_ʁ" ?ʶ)
+ ("^_ʁ" ?ʶ)
+ ("^_w" ?ʷ)
+ ("^_w" ?ʷ)
+ ("^_y" ?ʸ)
+ ("^_y" ?ʸ)
+ ("^_ɣ" ?ˠ)
+ ("^_ɣ" ?ˠ)
+ ("^_l" ?ˡ)
+ ("^_l" ?ˡ)
+ ("^_s" ?ˢ)
+ ("^_s" ?ˢ)
+ ("^_x" ?ˣ)
+ ("^_x" ?ˣ)
+ ("^_ʕ" ?ˤ)
+ ("^_ʕ" ?ˤ)
+ ("\"´" ?̈́)
+ ("\"'" ?̈́)
+ ("¨´" ?΅)
+ ("¨'" ?΅)
+ ("'\" " ?΅)
+ ("´Α" ?Ά)
+ ("'Α" ?Ά)
+ ("Α'" ?Ά)
+ ("´Ε" ?Έ)
+ ("'Ε" ?Έ)
+ ("Ε'" ?Έ)
+ ("´Η" ?Ή)
+ ("'Η" ?Ή)
+ ("Η'" ?Ή)
+ ("´Ι" ?Ί)
+ ("'Ι" ?Ί)
+ ("Ι'" ?Ί)
+ ("´Ο" ?Ό)
+ ("'Ο" ?Ό)
+ ("Ο'" ?Ό)
+ ("´Υ" ?Ύ)
+ ("'Υ" ?Ύ)
+ ("Υ'" ?Ύ)
+ ("´Ω" ?Ώ)
+ ("'Ω" ?Ώ)
+ ("Ω'" ?Ώ)
+ ("´ϊ" ?ΐ)
+ ("'ϊ" ?ΐ)
+ ("´\"ι" ?ΐ)
+ ("'\"ι" ?ΐ)
+ ("\"Ι" ?Ϊ)
+ ("Ι\"" ?Ϊ)
+ ("\"Υ" ?Ϋ)
+ ("Υ\"" ?Ϋ)
+ ("´α" ?ά)
+ ("'α" ?ά)
+ ("α'" ?ά)
+ ("´ε" ?έ)
+ ("'ε" ?έ)
+ ("ε'" ?έ)
+ ("´η" ?ή)
+ ("'η" ?ή)
+ ("η'" ?ή)
+ ("´ι" ?ί)
+ ("'ι" ?ί)
+ ("´ϋ" ?ΰ)
+ ("'ϋ" ?ΰ)
+ ("´\"υ" ?ΰ)
+ ("'\"υ" ?ΰ)
+ ("\"ι" ?ϊ)
+ ("ι\"" ?ϊ)
+ ("\"υ" ?ϋ)
+ ("υ\"" ?ϋ)
+ ("´ο" ?ό)
+ ("'ο" ?ό)
+ ("ο'" ?ό)
+ ("´υ" ?ύ)
+ ("'υ" ?ύ)
+ ("υ'" ?ύ)
+ ("´ω" ?ώ)
+ ("'ω" ?ώ)
+ ("ω'" ?ώ)
+ ("\"ϒ" ?ϔ)
+ ("`Е" ?Ѐ)
+ ("\"Е" ?Ё)
+ ("´Г" ?Ѓ)
+ ("'Г" ?Ѓ)
+ ("\"І" ?Ї)
+ ("´К" ?Ќ)
+ ("'К" ?Ќ)
+ ("`И" ?Ѝ)
+ ("UУ" ?Ў)
+ ("bУ" ?Ў)
+ ("UИ" ?Й)
+ ("bИ" ?Й)
+ ("Uи" ?й)
+ ("bи" ?й)
+ ("`е" ?ѐ)
+ ("\"е" ?ё)
+ ("´г" ?ѓ)
+ ("'г" ?ѓ)
+ ("\"і" ?ї)
+ ("´к" ?ќ)
+ ("'к" ?ќ)
+ ("`и" ?ѝ)
+ ("Uу" ?ў)
+ ("bу" ?ў)
+ ("/Г" ?Ғ)
+ ("/г" ?ғ)
+ ("/К" ?Ҟ)
+ ("/к" ?ҟ)
+ ("/Ү" ?Ұ)
+ ("/ү" ?ұ)
+ ("UЖ" ?Ӂ)
+ ("bЖ" ?Ӂ)
+ ("Uж" ?ӂ)
+ ("bж" ?ӂ)
+ ("UА" ?Ӑ)
+ ("bА" ?Ӑ)
+ ("Uа" ?ӑ)
+ ("bа" ?ӑ)
+ ("\"А" ?Ӓ)
+ ("\"а" ?ӓ)
+ ("UЕ" ?Ӗ)
+ ("bЕ" ?Ӗ)
+ ("Uе" ?ӗ)
+ ("bе" ?ӗ)
+ ("\"Ә" ?Ӛ)
+ ("\"ә" ?ӛ)
+ ("\"Ж" ?Ӝ)
+ ("\"ж" ?ӝ)
+ ("\"З" ?Ӟ)
+ ("\"з" ?ӟ)
+ ("¯И" ?Ӣ)
+ ("_И" ?Ӣ)
+ ("¯и" ?ӣ)
+ ("_и" ?ӣ)
+ ("\"И" ?Ӥ)
+ ("\"и" ?ӥ)
+ ("\"О" ?Ӧ)
+ ("\"о" ?ӧ)
+ ("\"Ө" ?Ӫ)
+ ("\"ө" ?ӫ)
+ ("\"Э" ?Ӭ)
+ ("\"э" ?ӭ)
+ ("¯У" ?Ӯ)
+ ("_У" ?Ӯ)
+ ("¯у" ?ӯ)
+ ("_у" ?ӯ)
+ ("\"У" ?Ӱ)
+ ("\"у" ?ӱ)
+ ("=У" ?Ӳ)
+ ("=у" ?ӳ)
+ ("\"Ч" ?Ӵ)
+ ("\"ч" ?ӵ)
+ ("\"Ы" ?Ӹ)
+ ("\"ы" ?ӹ)
+ ("ٓا" ?آ)
+ ("ٔا" ?أ)
+ ("ٔو" ?ؤ)
+ ("ٕا" ?إ)
+ ("ٔي" ?ئ)
+ ("ٔە" ?ۀ)
+ ("ٔہ" ?ۂ)
+ ("ٔے" ?ۓ)
+ ("़न" ?ऩ)
+ ("़र" ?ऱ)
+ ("़ळ" ?ऴ)
+ ("़क" ?क़)
+ ("़ख" ?ख़)
+ ("़ग" ?ग़)
+ ("़ज" ?ज़)
+ ("़ड" ?ड़)
+ ("़ढ" ?ढ़)
+ ("़फ" ?फ़)
+ ("़य" ?य़)
+ ("ো" ?ো)
+ ("ৌ" ?ৌ)
+ ("়ড" ?ড়)
+ ("়ঢ" ?ঢ়)
+ ("়য" ?য়)
+ ("਼ਲ" ?ਲ਼)
+ ("਼ਸ" ?ਸ਼)
+ ("਼ਖ" ?ਖ਼)
+ ("਼ਗ" ?ਗ਼)
+ ("਼ਜ" ?ਜ਼)
+ ("਼ਫ" ?ਫ਼)
+ ("ୈ" ?ୈ)
+ ("ୋ" ?ୋ)
+ ("ୌ" ?ୌ)
+ ("଼ଡ" ?ଡ଼)
+ ("଼ଢ" ?ଢ଼)
+ ("ௗஒ" ?ஔ)
+ ("ொ" ?ொ)
+ ("ோ" ?ோ)
+ ("ௌ" ?ௌ)
+ ("ై" ?ై)
+ ("ೀ" ?ೀ)
+ ("ೇ" ?ೇ)
+ ("ೈ" ?ೈ)
+ ("ೊ" ?ೊ)
+ ("ೋ" ?ೋ)
+ ("ൊ" ?ൊ)
+ ("ോ" ?ോ)
+ ("ൌ" ?ൌ)
+ ("ේ" ?ේ)
+ ("ො" ?ො)
+ ("ෝ" ?ෝ)
+ ("ෞ" ?ෞ)
+ ("ྷག" ?གྷ)
+ ("ྷཌ" ?ཌྷ)
+ ("ྷད" ?དྷ)
+ ("ྷབ" ?བྷ)
+ ("ྷཛ" ?ཛྷ)
+ ("ྵཀ" ?ཀྵ)
+ ("ཱི" ?ཱི)
+ ("ཱུ" ?ཱུ)
+ ("ྲྀ" ?ྲྀ)
+ ("ླྀ" ?ླྀ)
+ ("ཱྀ" ?ཱྀ)
+ ("ྒྷ" ?ྒྷ)
+ ("ྜྷ" ?ྜྷ)
+ ("ྡྷ" ?ྡྷ)
+ ("ྦྷ" ?ྦྷ)
+ ("ྫྷ" ?ྫྷ)
+ ("ྐྵ" ?ྐྵ)
+ ("ီဥ" ?ဦ)
+ (".B" ?Ḃ)
+ ("B." ?Ḃ)
+ (".b" ?ḃ)
+ ("b." ?ḃ)
+ ("!B" ?Ḅ)
+ ("!b" ?ḅ)
+ ("´Ç" ?Ḉ)
+ ("'Ç" ?Ḉ)
+ ("´,C" ?Ḉ)
+ ("´¸C" ?Ḉ)
+ ("'¸C" ?Ḉ)
+ ("´ç" ?ḉ)
+ ("'ç" ?ḉ)
+ ("´,c" ?ḉ)
+ ("´¸c" ?ḉ)
+ ("'¸c" ?ḉ)
+ (".D" ?Ḋ)
+ ("D." ?Ḋ)
+ (".d" ?ḋ)
+ ("d." ?ḋ)
+ ("!D" ?Ḍ)
+ ("!d" ?ḍ)
+ (",D" ?Ḑ)
+ ("D," ?Ḑ)
+ ("¸D" ?Ḑ)
+ (",d" ?ḑ)
+ ("d," ?ḑ)
+ ("¸d" ?ḑ)
+ ("`Ē" ?Ḕ)
+ ("`¯E" ?Ḕ)
+ ("`_E" ?Ḕ)
+ ("`ē" ?ḕ)
+ ("`¯e" ?ḕ)
+ ("`_e" ?ḕ)
+ ("´Ē" ?Ḗ)
+ ("'Ē" ?Ḗ)
+ ("´¯E" ?Ḗ)
+ ("´_E" ?Ḗ)
+ ("'¯E" ?Ḗ)
+ ("'_E" ?Ḗ)
+ ("´ē" ?ḗ)
+ ("'ē" ?ḗ)
+ ("´¯e" ?ḗ)
+ ("´_e" ?ḗ)
+ ("'¯e" ?ḗ)
+ ("'_e" ?ḗ)
+ ("UȨ" ?Ḝ)
+ ("bȨ" ?Ḝ)
+ ("U ,E" ?Ḝ)
+ ("U¸E" ?Ḝ)
+ ("b,E" ?Ḝ)
+ ("b¸E" ?Ḝ)
+ ("Uȩ" ?ḝ)
+ ("bȩ" ?ḝ)
+ ("U ,e" ?ḝ)
+ ("U¸e" ?ḝ)
+ ("b,e" ?ḝ)
+ ("b¸e" ?ḝ)
+ (".F" ?Ḟ)
+ ("F." ?Ḟ)
+ (".f" ?ḟ)
+ ("f." ?ḟ)
+ ("¯G" ?Ḡ)
+ ("_G" ?Ḡ)
+ ("¯g" ?ḡ)
+ ("_g" ?ḡ)
+ (".H" ?Ḣ)
+ (".h" ?ḣ)
+ ("!H" ?Ḥ)
+ ("!h" ?ḥ)
+ ("\"H" ?Ḧ)
+ ("\"h" ?ḧ)
+ (",H" ?Ḩ)
+ ("H," ?Ḩ)
+ ("¸H" ?Ḩ)
+ (",h" ?ḩ)
+ ("h," ?ḩ)
+ ("¸h" ?ḩ)
+ ("´Ï" ?Ḯ)
+ ("'Ï" ?Ḯ)
+ ("´\"I" ?Ḯ)
+ ("'\"I" ?Ḯ)
+ ("´ï" ?ḯ)
+ ("'ï" ?ḯ)
+ ("´\"i" ?ḯ)
+ ("'\"i" ?ḯ)
+ ("´K" ?Ḱ)
+ ("'K" ?Ḱ)
+ ("´k" ?ḱ)
+ ("'k" ?ḱ)
+ ("!K" ?Ḳ)
+ ("!k" ?ḳ)
+ ("!L" ?Ḷ)
+ ("!l" ?ḷ)
+ ("¯Ḷ" ?Ḹ)
+ ("_Ḷ" ?Ḹ)
+ ("¯!L" ?Ḹ)
+ ("_!L" ?Ḹ)
+ ("¯ḷ" ?ḹ)
+ ("_ḷ" ?ḹ)
+ ("¯!l" ?ḹ)
+ ("_!l" ?ḹ)
+ ("´M" ?Ḿ)
+ ("'M" ?Ḿ)
+ ("´m" ?ḿ)
+ ("'m" ?ḿ)
+ (".M" ?Ṁ)
+ ("M." ?Ṁ)
+ (".m" ?ṁ)
+ ("m." ?ṁ)
+ ("!M" ?Ṃ)
+ ("!m" ?ṃ)
+ (".N" ?Ṅ)
+ (".n" ?ṅ)
+ ("!N" ?Ṇ)
+ ("!n" ?ṇ)
+ ("´Õ" ?Ṍ)
+ ("'Õ" ?Ṍ)
+ ("´~O" ?Ṍ)
+ ("'~O" ?Ṍ)
+ ("´õ" ?ṍ)
+ ("'õ" ?ṍ)
+ ("´~o" ?ṍ)
+ ("'~o" ?ṍ)
+ ("\"Õ" ?Ṏ)
+ ("\"~O" ?Ṏ)
+ ("\"õ" ?ṏ)
+ ("\"~o" ?ṏ)
+ ("`Ō" ?Ṑ)
+ ("`¯O" ?Ṑ)
+ ("`_O" ?Ṑ)
+ ("`ō" ?ṑ)
+ ("`¯o" ?ṑ)
+ ("`_o" ?ṑ)
+ ("´Ō" ?Ṓ)
+ ("'Ō" ?Ṓ)
+ ("´¯O" ?Ṓ)
+ ("´_O" ?Ṓ)
+ ("'¯O" ?Ṓ)
+ ("'_O" ?Ṓ)
+ ("´ō" ?ṓ)
+ ("'ō" ?ṓ)
+ ("´¯o" ?ṓ)
+ ("´_o" ?ṓ)
+ ("'¯o" ?ṓ)
+ ("'_o" ?ṓ)
+ ("´P" ?Ṕ)
+ ("'P" ?Ṕ)
+ ("´p" ?ṕ)
+ ("'p" ?ṕ)
+ (".P" ?Ṗ)
+ ("P." ?Ṗ)
+ (".p" ?ṗ)
+ ("p." ?ṗ)
+ (".R" ?Ṙ)
+ (".r" ?ṙ)
+ ("!R" ?Ṛ)
+ ("!r" ?ṛ)
+ ("¯Ṛ" ?Ṝ)
+ ("_Ṛ" ?Ṝ)
+ ("¯!R" ?Ṝ)
+ ("_!R" ?Ṝ)
+ ("¯ṛ" ?ṝ)
+ ("_ṛ" ?ṝ)
+ ("¯!r" ?ṝ)
+ ("_!r" ?ṝ)
+ (".S" ?Ṡ)
+ ("S." ?Ṡ)
+ (".s" ?ṡ)
+ ("s." ?ṡ)
+ ("!S" ?Ṣ)
+ ("!s" ?ṣ)
+ (".Ś" ?Ṥ)
+ (".´S" ?Ṥ)
+ (".'S" ?Ṥ)
+ (".ś" ?ṥ)
+ (".´s" ?ṥ)
+ (".'s" ?ṥ)
+ (".Š" ?Ṧ)
+ (".š" ?ṧ)
+ (".Ṣ" ?Ṩ)
+ (".!S" ?Ṩ)
+ (".ṣ" ?ṩ)
+ (".!s" ?ṩ)
+ (".T" ?Ṫ)
+ ("T." ?Ṫ)
+ (".t" ?ṫ)
+ ("t." ?ṫ)
+ ("!T" ?Ṭ)
+ ("!t" ?ṭ)
+ ("´Ũ" ?Ṹ)
+ ("'Ũ" ?Ṹ)
+ ("´~U" ?Ṹ)
+ ("'~U" ?Ṹ)
+ ("´ũ" ?ṹ)
+ ("'ũ" ?ṹ)
+ ("´~u" ?ṹ)
+ ("'~u" ?ṹ)
+ ("\"Ū" ?Ṻ)
+ ("\"¯U" ?Ṻ)
+ ("\"_U" ?Ṻ)
+ ("\"ū" ?ṻ)
+ ("\"¯u" ?ṻ)
+ ("\"_u" ?ṻ)
+ ("~V" ?Ṽ)
+ ("~v" ?ṽ)
+ ("!V" ?Ṿ)
+ ("!v" ?ṿ)
+ ("`W" ?Ẁ)
+ ("`w" ?ẁ)
+ ("´W" ?Ẃ)
+ ("'W" ?Ẃ)
+ ("´w" ?ẃ)
+ ("'w" ?ẃ)
+ ("\"W" ?Ẅ)
+ ("\"w" ?ẅ)
+ (".W" ?Ẇ)
+ (".w" ?ẇ)
+ ("!W" ?Ẉ)
+ ("!w" ?ẉ)
+ (".X" ?Ẋ)
+ (".x" ?ẋ)
+ ("\"X" ?Ẍ)
+ ("\"x" ?ẍ)
+ (".Y" ?Ẏ)
+ (".y" ?ẏ)
+ ("^Z" ?Ẑ)
+ ("^z" ?ẑ)
+ ("!Z" ?Ẓ)
+ ("!z" ?ẓ)
+ ("\"t" ?ẗ)
+ ("ow" ?ẘ)
+ ("oy" ?ẙ)
+ (".ſ" ?ẛ)
+ ("!A" ?Ạ)
+ ("!a" ?ạ)
+ ("?A" ?Ả)
+ ("?a" ?ả)
+ ("´Â" ?Ấ)
+ ("'Â" ?Ấ)
+ ("´^A" ?Ấ)
+ ("'^A" ?Ấ)
+ ("´â" ?ấ)
+ ("'â" ?ấ)
+ ("´^a" ?ấ)
+ ("'^a" ?ấ)
+ ("`Â" ?Ầ)
+ ("`^A" ?Ầ)
+ ("`â" ?ầ)
+ ("`^a" ?ầ)
+ ("?Â" ?Ẩ)
+ ("?^A" ?Ẩ)
+ ("?â" ?ẩ)
+ ("?^a" ?ẩ)
+ ("~Â" ?Ẫ)
+ ("~^A" ?Ẫ)
+ ("~â" ?ẫ)
+ ("~^a" ?ẫ)
+ ("^Ạ" ?Ậ)
+ ("^!A" ?Ậ)
+ ("^ạ" ?ậ)
+ ("^!a" ?ậ)
+ ("´Ă" ?Ắ)
+ ("'Ă" ?Ắ)
+ ("´bA" ?Ắ)
+ ("'bA" ?Ắ)
+ ("´ă" ?ắ)
+ ("'ă" ?ắ)
+ ("´ba" ?ắ)
+ ("'ba" ?ắ)
+ ("`Ă" ?Ằ)
+ ("`bA" ?Ằ)
+ ("`ă" ?ằ)
+ ("`ba" ?ằ)
+ ("?Ă" ?Ẳ)
+ ("?bA" ?Ẳ)
+ ("?ă" ?ẳ)
+ ("?ba" ?ẳ)
+ ("~Ă" ?Ẵ)
+ ("~bA" ?Ẵ)
+ ("~ă" ?ẵ)
+ ("~ba" ?ẵ)
+ ("UẠ" ?Ặ)
+ ("bẠ" ?Ặ)
+ ("U!A" ?Ặ)
+ ("b!A" ?Ặ)
+ ("Uạ" ?ặ)
+ ("bạ" ?ặ)
+ ("U!a" ?ặ)
+ ("b!a" ?ặ)
+ ("!E" ?Ẹ)
+ ("!e" ?ẹ)
+ ("?E" ?Ẻ)
+ ("?e" ?ẻ)
+ ("~E" ?Ẽ)
+ ("~e" ?ẽ)
+ ("´Ê" ?Ế)
+ ("'Ê" ?Ế)
+ ("´^E" ?Ế)
+ ("'^E" ?Ế)
+ ("´ê" ?ế)
+ ("'ê" ?ế)
+ ("´^e" ?ế)
+ ("'^e" ?ế)
+ ("`Ê" ?Ề)
+ ("`^E" ?Ề)
+ ("`ê" ?ề)
+ ("`^e" ?ề)
+ ("?Ê" ?Ể)
+ ("?^E" ?Ể)
+ ("?ê" ?ể)
+ ("?^e" ?ể)
+ ("~Ê" ?Ễ)
+ ("~^E" ?Ễ)
+ ("~ê" ?ễ)
+ ("~^e" ?ễ)
+ ("^Ẹ" ?Ệ)
+ ("^!E" ?Ệ)
+ ("^ẹ" ?ệ)
+ ("^!e" ?ệ)
+ ("?I" ?Ỉ)
+ ("?i" ?ỉ)
+ ("!I" ?Ị)
+ ("!i" ?ị)
+ ("!O" ?Ọ)
+ ("!o" ?ọ)
+ ("?O" ?Ỏ)
+ ("?o" ?ỏ)
+ ("´Ô" ?Ố)
+ ("'Ô" ?Ố)
+ ("´^O" ?Ố)
+ ("'^O" ?Ố)
+ ("´ô" ?ố)
+ ("'ô" ?ố)
+ ("´^o" ?ố)
+ ("'^o" ?ố)
+ ("`Ô" ?Ồ)
+ ("`^O" ?Ồ)
+ ("`ô" ?ồ)
+ ("`^o" ?ồ)
+ ("?Ô" ?Ổ)
+ ("?^O" ?Ổ)
+ ("?ô" ?ổ)
+ ("?^o" ?ổ)
+ ("~Ô" ?Ỗ)
+ ("~^O" ?Ỗ)
+ ("~ô" ?ỗ)
+ ("~^o" ?ỗ)
+ ("^Ọ" ?Ộ)
+ ("^!O" ?Ộ)
+ ("^ọ" ?ộ)
+ ("^!o" ?ộ)
+ ("´Ơ" ?Ớ)
+ ("'Ơ" ?Ớ)
+ ("´+O" ?Ớ)
+ ("'+O" ?Ớ)
+ ("´ơ" ?ớ)
+ ("'ơ" ?ớ)
+ ("´+o" ?ớ)
+ ("'+o" ?ớ)
+ ("`Ơ" ?Ờ)
+ ("`+O" ?Ờ)
+ ("`ơ" ?ờ)
+ ("`+o" ?ờ)
+ ("?Ơ" ?Ở)
+ ("?+O" ?Ở)
+ ("?ơ" ?ở)
+ ("?+o" ?ở)
+ ("~Ơ" ?Ỡ)
+ ("~+O" ?Ỡ)
+ ("~ơ" ?ỡ)
+ ("~+o" ?ỡ)
+ ("!Ơ" ?Ợ)
+ ("!+O" ?Ợ)
+ ("!ơ" ?ợ)
+ ("!+o" ?ợ)
+ ("!U" ?Ụ)
+ ("!u" ?ụ)
+ ("?U" ?Ủ)
+ ("?u" ?ủ)
+ ("´Ư" ?Ứ)
+ ("'Ư" ?Ứ)
+ ("´+U" ?Ứ)
+ ("'+U" ?Ứ)
+ ("´ư" ?ứ)
+ ("'ư" ?ứ)
+ ("´+u" ?ứ)
+ ("'+u" ?ứ)
+ ("`Ư" ?Ừ)
+ ("`+U" ?Ừ)
+ ("`ư" ?ừ)
+ ("`+u" ?ừ)
+ ("?Ư" ?Ử)
+ ("?+U" ?Ử)
+ ("?ư" ?ử)
+ ("?+u" ?ử)
+ ("~Ư" ?Ữ)
+ ("~+U" ?Ữ)
+ ("~ư" ?ữ)
+ ("~+u" ?ữ)
+ ("!Ư" ?Ự)
+ ("!+U" ?Ự)
+ ("!ư" ?ự)
+ ("!+u" ?ự)
+ ("`Y" ?Ỳ)
+ ("`y" ?ỳ)
+ ("!Y" ?Ỵ)
+ ("!y" ?ỵ)
+ ("?Y" ?Ỷ)
+ ("?y" ?ỷ)
+ ("~Y" ?Ỹ)
+ ("~y" ?ỹ)
+ (")α" ?ἀ)
+ ("(α" ?ἁ)
+ ("`ἀ" ?ἂ)
+ ("`)α" ?ἂ)
+ ("`ἁ" ?ἃ)
+ ("`(α" ?ἃ)
+ ("´ἀ" ?ἄ)
+ ("'ἀ" ?ἄ)
+ ("´)α" ?ἄ)
+ ("')α" ?ἄ)
+ ("´ἁ" ?ἅ)
+ ("'ἁ" ?ἅ)
+ ("´(α" ?ἅ)
+ ("'(α" ?ἅ)
+ ("~ἀ" ?ἆ)
+ ("~)α" ?ἆ)
+ ("~ἁ" ?ἇ)
+ ("~(α" ?ἇ)
+ (")Α" ?Ἀ)
+ ("(Α" ?Ἁ)
+ ("`Ἀ" ?Ἂ)
+ ("`)Α" ?Ἂ)
+ ("`Ἁ" ?Ἃ)
+ ("`(Α" ?Ἃ)
+ ("´Ἀ" ?Ἄ)
+ ("'Ἀ" ?Ἄ)
+ ("´)Α" ?Ἄ)
+ ("')Α" ?Ἄ)
+ ("´Ἁ" ?Ἅ)
+ ("'Ἁ" ?Ἅ)
+ ("´(Α" ?Ἅ)
+ ("'(Α" ?Ἅ)
+ ("~Ἀ" ?Ἆ)
+ ("~)Α" ?Ἆ)
+ ("~Ἁ" ?Ἇ)
+ ("~(Α" ?Ἇ)
+ (")ε" ?ἐ)
+ ("(ε" ?ἑ)
+ ("`ἐ" ?ἒ)
+ ("`)ε" ?ἒ)
+ ("`ἑ" ?ἓ)
+ ("`(ε" ?ἓ)
+ ("´ἐ" ?ἔ)
+ ("'ἐ" ?ἔ)
+ ("´)ε" ?ἔ)
+ ("')ε" ?ἔ)
+ ("´ἑ" ?ἕ)
+ ("'ἑ" ?ἕ)
+ ("´(ε" ?ἕ)
+ ("'(ε" ?ἕ)
+ (")Ε" ?Ἐ)
+ ("(Ε" ?Ἑ)
+ ("`Ἐ" ?Ἒ)
+ ("`)Ε" ?Ἒ)
+ ("`Ἑ" ?Ἓ)
+ ("`(Ε" ?Ἓ)
+ ("´Ἐ" ?Ἔ)
+ ("'Ἐ" ?Ἔ)
+ ("´)Ε" ?Ἔ)
+ ("')Ε" ?Ἔ)
+ ("´Ἑ" ?Ἕ)
+ ("'Ἑ" ?Ἕ)
+ ("´(Ε" ?Ἕ)
+ ("'(Ε" ?Ἕ)
+ (")η" ?ἠ)
+ ("(η" ?ἡ)
+ ("`ἠ" ?ἢ)
+ ("`)η" ?ἢ)
+ ("`ἡ" ?ἣ)
+ ("`(η" ?ἣ)
+ ("´ἠ" ?ἤ)
+ ("'ἠ" ?ἤ)
+ ("´)η" ?ἤ)
+ ("')η" ?ἤ)
+ ("´ἡ" ?ἥ)
+ ("'ἡ" ?ἥ)
+ ("´(η" ?ἥ)
+ ("'(η" ?ἥ)
+ ("~ἠ" ?ἦ)
+ ("~)η" ?ἦ)
+ ("~ἡ" ?ἧ)
+ ("~(η" ?ἧ)
+ (")Η" ?Ἠ)
+ ("(Η" ?Ἡ)
+ ("`Ἠ" ?Ἢ)
+ ("`)Η" ?Ἢ)
+ ("`Ἡ" ?Ἣ)
+ ("`(Η" ?Ἣ)
+ ("´Ἠ" ?Ἤ)
+ ("'Ἠ" ?Ἤ)
+ ("´)Η" ?Ἤ)
+ ("')Η" ?Ἤ)
+ ("´Ἡ" ?Ἥ)
+ ("'Ἡ" ?Ἥ)
+ ("´(Η" ?Ἥ)
+ ("'(Η" ?Ἥ)
+ ("~Ἠ" ?Ἦ)
+ ("~)Η" ?Ἦ)
+ ("~Ἡ" ?Ἧ)
+ ("~(Η" ?Ἧ)
+ (")ι" ?ἰ)
+ ("(ι" ?ἱ)
+ ("`ἰ" ?ἲ)
+ ("`)ι" ?ἲ)
+ ("`ἱ" ?ἳ)
+ ("`(ι" ?ἳ)
+ ("´ἰ" ?ἴ)
+ ("'ἰ" ?ἴ)
+ ("´)ι" ?ἴ)
+ ("')ι" ?ἴ)
+ ("´ἱ" ?ἵ)
+ ("'ἱ" ?ἵ)
+ ("´(ι" ?ἵ)
+ ("'(ι" ?ἵ)
+ ("~ἰ" ?ἶ)
+ ("~)ι" ?ἶ)
+ ("~ἱ" ?ἷ)
+ ("~(ι" ?ἷ)
+ (")Ι" ?Ἰ)
+ ("(Ι" ?Ἱ)
+ ("`Ἰ" ?Ἲ)
+ ("`)Ι" ?Ἲ)
+ ("`Ἱ" ?Ἳ)
+ ("`(Ι" ?Ἳ)
+ ("´Ἰ" ?Ἴ)
+ ("'Ἰ" ?Ἴ)
+ ("´)Ι" ?Ἴ)
+ ("')Ι" ?Ἴ)
+ ("´Ἱ" ?Ἵ)
+ ("'Ἱ" ?Ἵ)
+ ("´(Ι" ?Ἵ)
+ ("'(Ι" ?Ἵ)
+ ("~Ἰ" ?Ἶ)
+ ("~)Ι" ?Ἶ)
+ ("~Ἱ" ?Ἷ)
+ ("~(Ι" ?Ἷ)
+ (")ο" ?ὀ)
+ ("(ο" ?ὁ)
+ ("`ὀ" ?ὂ)
+ ("`)ο" ?ὂ)
+ ("`ὁ" ?ὃ)
+ ("`(ο" ?ὃ)
+ ("´ὀ" ?ὄ)
+ ("'ὀ" ?ὄ)
+ ("´)ο" ?ὄ)
+ ("')ο" ?ὄ)
+ ("´ὁ" ?ὅ)
+ ("'ὁ" ?ὅ)
+ ("´(ο" ?ὅ)
+ ("'(ο" ?ὅ)
+ (")Ο" ?Ὀ)
+ ("(Ο" ?Ὁ)
+ ("`Ὀ" ?Ὂ)
+ ("`)Ο" ?Ὂ)
+ ("`Ὁ" ?Ὃ)
+ ("`(Ο" ?Ὃ)
+ ("´Ὀ" ?Ὄ)
+ ("'Ὀ" ?Ὄ)
+ ("´)Ο" ?Ὄ)
+ ("')Ο" ?Ὄ)
+ ("´Ὁ" ?Ὅ)
+ ("'Ὁ" ?Ὅ)
+ ("´(Ο" ?Ὅ)
+ ("'(Ο" ?Ὅ)
+ (")υ" ?ὐ)
+ ("(υ" ?ὑ)
+ ("`ὐ" ?ὒ)
+ ("`)υ" ?ὒ)
+ ("`ὑ" ?ὓ)
+ ("`(υ" ?ὓ)
+ ("´ὐ" ?ὔ)
+ ("'ὐ" ?ὔ)
+ ("´)υ" ?ὔ)
+ ("')υ" ?ὔ)
+ ("´ὑ" ?ὕ)
+ ("'ὑ" ?ὕ)
+ ("´(υ" ?ὕ)
+ ("'(υ" ?ὕ)
+ ("~ὐ" ?ὖ)
+ ("~)υ" ?ὖ)
+ ("~ὑ" ?ὗ)
+ ("~(υ" ?ὗ)
+ ("(Υ" ?Ὑ)
+ ("`Ὑ" ?Ὓ)
+ ("`(Υ" ?Ὓ)
+ ("´Ὑ" ?Ὕ)
+ ("'Ὑ" ?Ὕ)
+ ("´(Υ" ?Ὕ)
+ ("'(Υ" ?Ὕ)
+ ("~Ὑ" ?Ὗ)
+ ("~(Υ" ?Ὗ)
+ (")ω" ?ὠ)
+ ("(ω" ?ὡ)
+ ("`ὠ" ?ὢ)
+ ("`)ω" ?ὢ)
+ ("`ὡ" ?ὣ)
+ ("`(ω" ?ὣ)
+ ("´ὠ" ?ὤ)
+ ("'ὠ" ?ὤ)
+ ("´)ω" ?ὤ)
+ ("')ω" ?ὤ)
+ ("´ὡ" ?ὥ)
+ ("'ὡ" ?ὥ)
+ ("´(ω" ?ὥ)
+ ("'(ω" ?ὥ)
+ ("~ὠ" ?ὦ)
+ ("~)ω" ?ὦ)
+ ("~ὡ" ?ὧ)
+ ("~(ω" ?ὧ)
+ (")Ω" ?Ὠ)
+ ("(Ω" ?Ὡ)
+ ("`Ὠ" ?Ὢ)
+ ("`)Ω" ?Ὢ)
+ ("`Ὡ" ?Ὣ)
+ ("`(Ω" ?Ὣ)
+ ("´Ὠ" ?Ὤ)
+ ("'Ὠ" ?Ὤ)
+ ("´)Ω" ?Ὤ)
+ ("')Ω" ?Ὤ)
+ ("´Ὡ" ?Ὥ)
+ ("'Ὡ" ?Ὥ)
+ ("´(Ω" ?Ὥ)
+ ("'(Ω" ?Ὥ)
+ ("~Ὠ" ?Ὦ)
+ ("~)Ω" ?Ὦ)
+ ("~Ὡ" ?Ὧ)
+ ("~(Ω" ?Ὧ)
+ ("`α" ?ὰ)
+ ("`ε" ?ὲ)
+ ("`η" ?ὴ)
+ ("`ι" ?ὶ)
+ ("`ο" ?ὸ)
+ ("`υ" ?ὺ)
+ ("`ω" ?ὼ)
+ ("ιἀ" ?ᾀ)
+ ("ι)α" ?ᾀ)
+ ("ιἁ" ?ᾁ)
+ ("ι(α" ?ᾁ)
+ ("ιἂ" ?ᾂ)
+ ("ι`ἀ" ?ᾂ)
+ ("ι`)α" ?ᾂ)
+ ("ιἃ" ?ᾃ)
+ ("ι`ἁ" ?ᾃ)
+ ("ι`(α" ?ᾃ)
+ ("ιἄ" ?ᾄ)
+ ("ι´ἀ" ?ᾄ)
+ ("ι'ἀ" ?ᾄ)
+ ("ι´)α" ?ᾄ)
+ ("ι')α" ?ᾄ)
+ ("ιἅ" ?ᾅ)
+ ("ι´ἁ" ?ᾅ)
+ ("ι'ἁ" ?ᾅ)
+ ("ι´(α" ?ᾅ)
+ ("ι'(α" ?ᾅ)
+ ("ιἆ" ?ᾆ)
+ ("ι~ἀ" ?ᾆ)
+ ("ι~)α" ?ᾆ)
+ ("ιἇ" ?ᾇ)
+ ("ι~ἁ" ?ᾇ)
+ ("ι~(α" ?ᾇ)
+ ("ιἈ" ?ᾈ)
+ ("ι)Α" ?ᾈ)
+ ("ιἉ" ?ᾉ)
+ ("ι(Α" ?ᾉ)
+ ("ιἊ" ?ᾊ)
+ ("ι`Ἀ" ?ᾊ)
+ ("ι`)Α" ?ᾊ)
+ ("ιἋ" ?ᾋ)
+ ("ι`Ἁ" ?ᾋ)
+ ("ι`(Α" ?ᾋ)
+ ("ιἌ" ?ᾌ)
+ ("ι´Ἀ" ?ᾌ)
+ ("ι'Ἀ" ?ᾌ)
+ ("ι´)Α" ?ᾌ)
+ ("ι')Α" ?ᾌ)
+ ("ιἍ" ?ᾍ)
+ ("ι´Ἁ" ?ᾍ)
+ ("ι'Ἁ" ?ᾍ)
+ ("ι´(Α" ?ᾍ)
+ ("ι'(Α" ?ᾍ)
+ ("ιἎ" ?ᾎ)
+ ("ι~Ἀ" ?ᾎ)
+ ("ι~)Α" ?ᾎ)
+ ("ιἏ" ?ᾏ)
+ ("ι~Ἁ" ?ᾏ)
+ ("ι~(Α" ?ᾏ)
+ ("ιἠ" ?ᾐ)
+ ("ι)η" ?ᾐ)
+ ("ιἡ" ?ᾑ)
+ ("ι(η" ?ᾑ)
+ ("ιἢ" ?ᾒ)
+ ("ι`ἠ" ?ᾒ)
+ ("ι`)η" ?ᾒ)
+ ("ιἣ" ?ᾓ)
+ ("ι`ἡ" ?ᾓ)
+ ("ι`(η" ?ᾓ)
+ ("ιἤ" ?ᾔ)
+ ("ι´ἠ" ?ᾔ)
+ ("ι'ἠ" ?ᾔ)
+ ("ι´)η" ?ᾔ)
+ ("ι')η" ?ᾔ)
+ ("ιἥ" ?ᾕ)
+ ("ι´ἡ" ?ᾕ)
+ ("ι'ἡ" ?ᾕ)
+ ("ι´(η" ?ᾕ)
+ ("ι'(η" ?ᾕ)
+ ("ιἦ" ?ᾖ)
+ ("ι~ἠ" ?ᾖ)
+ ("ι~)η" ?ᾖ)
+ ("ιἧ" ?ᾗ)
+ ("ι~ἡ" ?ᾗ)
+ ("ι~(η" ?ᾗ)
+ ("ιἨ" ?ᾘ)
+ ("ι)Η" ?ᾘ)
+ ("ιἩ" ?ᾙ)
+ ("ι(Η" ?ᾙ)
+ ("ιἪ" ?ᾚ)
+ ("ι`Ἠ" ?ᾚ)
+ ("ι`)Η" ?ᾚ)
+ ("ιἫ" ?ᾛ)
+ ("ι`Ἡ" ?ᾛ)
+ ("ι`(Η" ?ᾛ)
+ ("ιἬ" ?ᾜ)
+ ("ι´Ἠ" ?ᾜ)
+ ("ι'Ἠ" ?ᾜ)
+ ("ι´)Η" ?ᾜ)
+ ("ι')Η" ?ᾜ)
+ ("ιἭ" ?ᾝ)
+ ("ι´Ἡ" ?ᾝ)
+ ("ι'Ἡ" ?ᾝ)
+ ("ι´(Η" ?ᾝ)
+ ("ι'(Η" ?ᾝ)
+ ("ιἮ" ?ᾞ)
+ ("ι~Ἠ" ?ᾞ)
+ ("ι~)Η" ?ᾞ)
+ ("ιἯ" ?ᾟ)
+ ("ι~Ἡ" ?ᾟ)
+ ("ι~(Η" ?ᾟ)
+ ("ιὠ" ?ᾠ)
+ ("ι)ω" ?ᾠ)
+ ("ιὡ" ?ᾡ)
+ ("ι(ω" ?ᾡ)
+ ("ιὢ" ?ᾢ)
+ ("ι`ὠ" ?ᾢ)
+ ("ι`)ω" ?ᾢ)
+ ("ιὣ" ?ᾣ)
+ ("ι`ὡ" ?ᾣ)
+ ("ι`(ω" ?ᾣ)
+ ("ιὤ" ?ᾤ)
+ ("ι´ὠ" ?ᾤ)
+ ("ι'ὠ" ?ᾤ)
+ ("ι´)ω" ?ᾤ)
+ ("ι')ω" ?ᾤ)
+ ("ιὥ" ?ᾥ)
+ ("ι´ὡ" ?ᾥ)
+ ("ι'ὡ" ?ᾥ)
+ ("ι´(ω" ?ᾥ)
+ ("ι'(ω" ?ᾥ)
+ ("ιὦ" ?ᾦ)
+ ("ι~ὠ" ?ᾦ)
+ ("ι~)ω" ?ᾦ)
+ ("ιὧ" ?ᾧ)
+ ("ι~ὡ" ?ᾧ)
+ ("ι~(ω" ?ᾧ)
+ ("ιὨ" ?ᾨ)
+ ("ι)Ω" ?ᾨ)
+ ("ιὩ" ?ᾩ)
+ ("ι(Ω" ?ᾩ)
+ ("ιὪ" ?ᾪ)
+ ("ι`Ὠ" ?ᾪ)
+ ("ι`)Ω" ?ᾪ)
+ ("ιὫ" ?ᾫ)
+ ("ι`Ὡ" ?ᾫ)
+ ("ι`(Ω" ?ᾫ)
+ ("ιὬ" ?ᾬ)
+ ("ι´Ὠ" ?ᾬ)
+ ("ι'Ὠ" ?ᾬ)
+ ("ι´)Ω" ?ᾬ)
+ ("ι')Ω" ?ᾬ)
+ ("ιὭ" ?ᾭ)
+ ("ι´Ὡ" ?ᾭ)
+ ("ι'Ὡ" ?ᾭ)
+ ("ι´(Ω" ?ᾭ)
+ ("ι'(Ω" ?ᾭ)
+ ("ιὮ" ?ᾮ)
+ ("ι~Ὠ" ?ᾮ)
+ ("ι~)Ω" ?ᾮ)
+ ("ιὯ" ?ᾯ)
+ ("ι~Ὡ" ?ᾯ)
+ ("ι~(Ω" ?ᾯ)
+ ("Uα" ?ᾰ)
+ ("bα" ?ᾰ)
+ ("¯α" ?ᾱ)
+ ("_α" ?ᾱ)
+ ("ιὰ" ?ᾲ)
+ ("ι`α" ?ᾲ)
+ ("ια" ?ᾳ)
+ ("ιά" ?ᾴ)
+ ("ι´α" ?ᾴ)
+ ("ι'α" ?ᾴ)
+ ("~α" ?ᾶ)
+ ("ιᾶ" ?ᾷ)
+ ("ι~α" ?ᾷ)
+ ("UΑ" ?Ᾰ)
+ ("bΑ" ?Ᾰ)
+ ("¯Α" ?Ᾱ)
+ ("_Α" ?Ᾱ)
+ ("`Α" ?Ὰ)
+ ("ιΑ" ?ᾼ)
+ ("¨~" ?῁)
+ ("ιὴ" ?ῂ)
+ ("ι`η" ?ῂ)
+ ("ιη" ?ῃ)
+ ("ιή" ?ῄ)
+ ("ι´η" ?ῄ)
+ ("ι'η" ?ῄ)
+ ("~η" ?ῆ)
+ ("ιῆ" ?ῇ)
+ ("ι~η" ?ῇ)
+ ("`Ε" ?Ὲ)
+ ("`Η" ?Ὴ)
+ ("ιΗ" ?ῌ)
+ ("᾿`" ?῍)
+ ("᾿´" ?῎)
+ ("᾿'" ?῎)
+ ("᾿~" ?῏)
+ ("Uι" ?ῐ)
+ ("bι" ?ῐ)
+ ("¯ι" ?ῑ)
+ ("_ι" ?ῑ)
+ ("`ϊ" ?ῒ)
+ ("`\"ι" ?ῒ)
+ ("~ι" ?ῖ)
+ ("~ϊ" ?ῗ)
+ ("~\"ι" ?ῗ)
+ ("UΙ" ?Ῐ)
+ ("bΙ" ?Ῐ)
+ ("¯Ι" ?Ῑ)
+ ("_Ι" ?Ῑ)
+ ("`Ι" ?Ὶ)
+ ("῾`" ?῝)
+ ("῾´" ?῞)
+ ("῾'" ?῞)
+ ("῾~" ?῟)
+ ("Uυ" ?ῠ)
+ ("bυ" ?ῠ)
+ ("¯υ" ?ῡ)
+ ("_υ" ?ῡ)
+ ("`ϋ" ?ῢ)
+ ("`\"υ" ?ῢ)
+ (")ρ" ?ῤ)
+ ("(ρ" ?ῥ)
+ ("~υ" ?ῦ)
+ ("~ϋ" ?ῧ)
+ ("~\"υ" ?ῧ)
+ ("UΥ" ?Ῠ)
+ ("bΥ" ?Ῠ)
+ ("¯Υ" ?Ῡ)
+ ("_Υ" ?Ῡ)
+ ("`Υ" ?Ὺ)
+ ("(Ρ" ?Ῥ)
+ ("¨`" ?῭)
+ ("ιὼ" ?ῲ)
+ ("ι`ω" ?ῲ)
+ ("ιω" ?ῳ)
+ ("ιώ" ?ῴ)
+ ("ι´ω" ?ῴ)
+ ("ι'ω" ?ῴ)
+ ("~ω" ?ῶ)
+ ("ιῶ" ?ῷ)
+ ("ι~ω" ?ῷ)
+ ("`Ο" ?Ὸ)
+ ("`Ω" ?Ὼ)
+ ("ιΩ" ?ῼ)
+ ("^0" ?⁰)
+ ("^_i" ?ⁱ)
+ ("^_i" ?ⁱ)
+ ("^4" ?⁴)
+ ("^5" ?⁵)
+ ("^6" ?⁶)
+ ("^7" ?⁷)
+ ("^8" ?⁸)
+ ("^9" ?⁹)
+ ("^+" ?⁺)
+ ("^−" ?⁻)
+ ("^=" ?⁼)
+ ("^(" ?⁽)
+ ("^)" ?⁾)
+ ("^_n" ?ⁿ)
+ ("^_n" ?ⁿ)
+ ("_0" ?₀)
+ ("_0" ?₀)
+ ("_1" ?₁)
+ ("_1" ?₁)
+ ("_2" ?₂)
+ ("_2" ?₂)
+ ("_3" ?₃)
+ ("_3" ?₃)
+ ("_4" ?₄)
+ ("_4" ?₄)
+ ("_5" ?₅)
+ ("_5" ?₅)
+ ("_6" ?₆)
+ ("_6" ?₆)
+ ("_7" ?₇)
+ ("_7" ?₇)
+ ("_8" ?₈)
+ ("_8" ?₈)
+ ("_9" ?₉)
+ ("_9" ?₉)
+ ("_+" ?₊)
+ ("_+" ?₊)
+ ("_−" ?₋)
+ ("_−" ?₋)
+ ("_=" ?₌)
+ ("_=" ?₌)
+ ("_(" ?₍)
+ ("_(" ?₍)
+ ("_)" ?₎)
+ ("_)" ?₎)
+ ("SM" ?℠)
+ ("sM" ?℠)
+ ("Sm" ?℠)
+ ("sm" ?℠)
+ ("TM" ?™)
+ ("tM" ?™)
+ ("Tm" ?™)
+ ("tm" ?™)
+ ("17" ?⅐)
+ ("19" ?⅑)
+ ("110" ?⅒)
+ ("13" ?⅓)
+ ("23" ?⅔)
+ ("15" ?⅕)
+ ("25" ?⅖)
+ ("35" ?⅗)
+ ("45" ?⅘)
+ ("16" ?⅙)
+ ("56" ?⅚)
+ ("18" ?⅛)
+ ("38" ?⅜)
+ ("58" ?⅝)
+ ("78" ?⅞)
+ ("03" ?↉)
+ ("/←" ?↚)
+ ("/→" ?↛)
+ ("/↔" ?↮)
+ ("<-" ?←)
+ ("->" ?→)
+ ("=>" ?⇒)
+ ("∄" ?∄)
+ ("{}" ?∅)
+ ("∉" ?∉)
+ ("∌" ?∌)
+ ("∤" ?∤)
+ ("∦" ?∦)
+ ("≁" ?≁)
+ ("≄" ?≄)
+ ("≁" ?≇)
+ ("≉" ?≉)
+ ("/=" ?≠)
+ ("=/" ?≠)
+ ("≠" ?≠)
+ ("≢" ?≢)
+ ("<=" ?≤)
+ (">=" ?≥)
+ ("≭" ?≭)
+ ("≮" ?≮)
+ ("≮" ?≮)
+ ("≯" ?≯)
+ ("≯" ?≯)
+ ("≰" ?≰)
+ ("≱" ?≱)
+ ("≴" ?≴)
+ ("≵" ?≵)
+ ("≸" ?≸)
+ ("≹" ?≹)
+ ("⊀" ?⊀)
+ ("⊁" ?⊁)
+ ("⊄" ?⊄)
+ ("⊄" ?⊄)
+ ("⊅" ?⊅)
+ ("⊅" ?⊅)
+ ("⊈" ?⊈)
+ ("⊉" ?⊉)
+ ("⊬" ?⊬)
+ ("⊭" ?⊭)
+ ("⊮" ?⊮)
+ ("⊯" ?⊯)
+ ("⋠" ?⋠)
+ ("⋡" ?⋡)
+ ("⋢" ?⋢)
+ ("⋣" ?⋣)
+ ("⋪" ?⋪)
+ ("⋫" ?⋫)
+ ("⋬" ?⋬)
+ ("⋭" ?⋭)
+ ("di" ?⌀)
+ ("(1)" ?①)
+ ("(2)" ?②)
+ ("(3)" ?③)
+ ("(4)" ?④)
+ ("(5)" ?⑤)
+ ("(6)" ?⑥)
+ ("(7)" ?⑦)
+ ("(8)" ?⑧)
+ ("(9)" ?⑨)
+ ("(10)" ?⑩)
+ ("(11)" ?⑪)
+ ("(12)" ?⑫)
+ ("(13)" ?⑬)
+ ("(14)" ?⑭)
+ ("(15)" ?⑮)
+ ("(16)" ?⑯)
+ ("(17)" ?⑰)
+ ("(18)" ?⑱)
+ ("(19)" ?⑲)
+ ("(20)" ?⑳)
+ ("(A)" ?Ⓐ)
+ ("(B)" ?Ⓑ)
+ ("(C)" ?Ⓒ)
+ ("(D)" ?Ⓓ)
+ ("(E)" ?Ⓔ)
+ ("(F)" ?Ⓕ)
+ ("(G)" ?Ⓖ)
+ ("(H)" ?Ⓗ)
+ ("(I)" ?Ⓘ)
+ ("(J)" ?Ⓙ)
+ ("(K)" ?Ⓚ)
+ ("(L)" ?Ⓛ)
+ ("(M)" ?Ⓜ)
+ ("(N)" ?Ⓝ)
+ ("(O)" ?Ⓞ)
+ ("(P)" ?Ⓟ)
+ ("(Q)" ?Ⓠ)
+ ("(R)" ?Ⓡ)
+ ("(S)" ?Ⓢ)
+ ("(T)" ?Ⓣ)
+ ("(U)" ?Ⓤ)
+ ("(V)" ?Ⓥ)
+ ("(W)" ?Ⓦ)
+ ("(X)" ?Ⓧ)
+ ("(Y)" ?Ⓨ)
+ ("(Z)" ?Ⓩ)
+ ("(a)" ?ⓐ)
+ ("(b)" ?ⓑ)
+ ("(c)" ?ⓒ)
+ ("(d)" ?ⓓ)
+ ("(e)" ?ⓔ)
+ ("(f)" ?ⓕ)
+ ("(g)" ?ⓖ)
+ ("(h)" ?ⓗ)
+ ("(i)" ?ⓘ)
+ ("(j)" ?ⓙ)
+ ("(k)" ?ⓚ)
+ ("(l)" ?ⓛ)
+ ("(m)" ?ⓜ)
+ ("(n)" ?ⓝ)
+ ("(o)" ?ⓞ)
+ ("(p)" ?ⓟ)
+ ("(q)" ?ⓠ)
+ ("(r)" ?ⓡ)
+ ("(s)" ?ⓢ)
+ ("(t)" ?ⓣ)
+ ("(u)" ?ⓤ)
+ ("(v)" ?ⓥ)
+ ("(w)" ?ⓦ)
+ ("(x)" ?ⓧ)
+ ("(y)" ?ⓨ)
+ ("(z)" ?ⓩ)
+ ("(0)" ?⓪)
+ ("⫝̸" ?⫝̸)
+ ("^一" ?㆒)
+ ("^二" ?㆓)
+ ("^三" ?㆔)
+ ("^四" ?㆕)
+ ("^上" ?㆖)
+ ("^中" ?㆗)
+ ("^下" ?㆘)
+ ("^甲" ?㆙)
+ ("^乙" ?㆚)
+ ("^丙" ?㆛)
+ ("^丁" ?㆜)
+ ("^天" ?㆝)
+ ("^地" ?㆞)
+ ("^人" ?㆟)
+ ("(21)" ?㉑)
+ ("(22)" ?㉒)
+ ("(23)" ?㉓)
+ ("(24)" ?㉔)
+ ("(25)" ?㉕)
+ ("(26)" ?㉖)
+ ("(27)" ?㉗)
+ ("(28)" ?㉘)
+ ("(29)" ?㉙)
+ ("(30)" ?㉚)
+ ("(31)" ?㉛)
+ ("(32)" ?㉜)
+ ("(33)" ?㉝)
+ ("(34)" ?㉞)
+ ("(35)" ?㉟)
+ ("(ᄀ)" ?㉠)
+ ("(ᄂ)" ?㉡)
+ ("(ᄃ)" ?㉢)
+ ("(ᄅ)" ?㉣)
+ ("(ᄆ)" ?㉤)
+ ("(ᄇ)" ?㉥)
+ ("(ᄉ)" ?㉦)
+ ("(ᄋ)" ?㉧)
+ ("(ᄌ)" ?㉨)
+ ("(ᄎ)" ?㉩)
+ ("(ᄏ)" ?㉪)
+ ("(ᄐ)" ?㉫)
+ ("(ᄑ)" ?㉬)
+ ("(ᄒ)" ?㉭)
+ ("(가)" ?㉮)
+ ("(나)" ?㉯)
+ ("(다)" ?㉰)
+ ("(라)" ?㉱)
+ ("(마)" ?㉲)
+ ("(바)" ?㉳)
+ ("(사)" ?㉴)
+ ("(아)" ?㉵)
+ ("(자)" ?㉶)
+ ("(차)" ?㉷)
+ ("(카)" ?㉸)
+ ("(타)" ?㉹)
+ ("(파)" ?㉺)
+ ("(하)" ?㉻)
+ ("(一)" ?㊀)
+ ("(二)" ?㊁)
+ ("(三)" ?㊂)
+ ("(四)" ?㊃)
+ ("(五)" ?㊄)
+ ("(六)" ?㊅)
+ ("(七)" ?㊆)
+ ("(八)" ?㊇)
+ ("(九)" ?㊈)
+ ("(十)" ?㊉)
+ ("(月)" ?㊊)
+ ("(火)" ?㊋)
+ ("(水)" ?㊌)
+ ("(木)" ?㊍)
+ ("(金)" ?㊎)
+ ("(土)" ?㊏)
+ ("(日)" ?㊐)
+ ("(株)" ?㊑)
+ ("(有)" ?㊒)
+ ("(社)" ?㊓)
+ ("(名)" ?㊔)
+ ("(特)" ?㊕)
+ ("(財)" ?㊖)
+ ("(祝)" ?㊗)
+ ("(労)" ?㊘)
+ ("(秘)" ?㊙)
+ ("(男)" ?㊚)
+ ("(女)" ?㊛)
+ ("(適)" ?㊜)
+ ("(優)" ?㊝)
+ ("(印)" ?㊞)
+ ("(注)" ?㊟)
+ ("(項)" ?㊠)
+ ("(休)" ?㊡)
+ ("(写)" ?㊢)
+ ("(正)" ?㊣)
+ ("(上)" ?㊤)
+ ("(中)" ?㊥)
+ ("(下)" ?㊦)
+ ("(左)" ?㊧)
+ ("(右)" ?㊨)
+ ("(医)" ?㊩)
+ ("(宗)" ?㊪)
+ ("(学)" ?㊫)
+ ("(監)" ?㊬)
+ ("(企)" ?㊭)
+ ("(資)" ?㊮)
+ ("(協)" ?㊯)
+ ("(夜)" ?㊰)
+ ("(36)" ?㊱)
+ ("(37)" ?㊲)
+ ("(38)" ?㊳)
+ ("(39)" ?㊴)
+ ("(40)" ?㊵)
+ ("(41)" ?㊶)
+ ("(42)" ?㊷)
+ ("(43)" ?㊸)
+ ("(44)" ?㊹)
+ ("(45)" ?㊺)
+ ("(46)" ?㊻)
+ ("(47)" ?㊼)
+ ("(48)" ?㊽)
+ ("(49)" ?㊾)
+ ("(50)" ?㊿)
+ ("(ア)" ?㋐)
+ ("(イ)" ?㋑)
+ ("(ウ)" ?㋒)
+ ("(エ)" ?㋓)
+ ("(オ)" ?㋔)
+ ("(カ)" ?㋕)
+ ("(キ)" ?㋖)
+ ("(ク)" ?㋗)
+ ("(ケ)" ?㋘)
+ ("(コ)" ?㋙)
+ ("(サ)" ?㋚)
+ ("(シ)" ?㋛)
+ ("(ス)" ?㋜)
+ ("(セ)" ?㋝)
+ ("(ソ)" ?㋞)
+ ("(タ)" ?㋟)
+ ("(チ)" ?㋠)
+ ("(ツ)" ?㋡)
+ ("(テ)" ?㋢)
+ ("(ト)" ?㋣)
+ ("(ナ)" ?㋤)
+ ("(ニ)" ?㋥)
+ ("(ヌ)" ?㋦)
+ ("(ネ)" ?㋧)
+ ("(ノ)" ?㋨)
+ ("(ハ)" ?㋩)
+ ("(ヒ)" ?㋪)
+ ("(フ)" ?㋫)
+ ("(ヘ)" ?㋬)
+ ("(ホ)" ?㋭)
+ ("(マ)" ?㋮)
+ ("(ミ)" ?㋯)
+ ("(ム)" ?㋰)
+ ("(メ)" ?㋱)
+ ("(モ)" ?㋲)
+ ("(ヤ)" ?㋳)
+ ("(ユ)" ?㋴)
+ ("(ヨ)" ?㋵)
+ ("(ラ)" ?㋶)
+ ("(リ)" ?㋷)
+ ("(ル)" ?㋸)
+ ("(レ)" ?㋹)
+ ("(ロ)" ?㋺)
+ ("(ワ)" ?㋻)
+ ("(ヰ)" ?㋼)
+ ("(ヱ)" ?㋽)
+ ("(ヲ)" ?㋾)
+ ("ִי" ?יִ)
+ ("ַײ" ?ײַ)
+ ("ׁש" ?שׁ)
+ ("ׂש" ?שׂ)
+ ("ׁשּ" ?שּׁ)
+ ("ּׁש" ?שּׁ)
+ ("ׂשּ" ?שּׂ)
+ ("ּׂש" ?שּׂ)
+ ("ַא" ?אַ)
+ ("ָא" ?אָ)
+ ("ּא" ?אּ)
+ ("ּב" ?בּ)
+ ("ּג" ?גּ)
+ ("ּד" ?דּ)
+ ("ּה" ?הּ)
+ ("ּו" ?וּ)
+ ("ּז" ?זּ)
+ ("ּט" ?טּ)
+ ("ּי" ?יּ)
+ ("ּך" ?ךּ)
+ ("ּכ" ?כּ)
+ ("ּל" ?לּ)
+ ("ּמ" ?מּ)
+ ("ּנ" ?נּ)
+ ("ּס" ?סּ)
+ ("ּף" ?ףּ)
+ ("ּפ" ?פּ)
+ ("ּצ" ?צּ)
+ ("ּק" ?קּ)
+ ("ּר" ?רּ)
+ ("ּש" ?שּ)
+ ("ּת" ?תּ)
+ ("ֹו" ?וֹ)
+ ("ֿב" ?בֿ)
+ ("ֿכ" ?כֿ)
+ ("ֿפ" ?פֿ)
+ ("𝅗𝅥" ?𝅗𝅥)
+ ("𝅘𝅥" ?𝅘𝅥)
+ ("𝅘𝅥𝅮" ?𝅘𝅥𝅮)
+ ("𝅘𝅥𝅯" ?𝅘𝅥𝅯)
+ ("𝅘𝅥𝅰" ?𝅘𝅥𝅰)
+ ("𝅘𝅥𝅱" ?𝅘𝅥𝅱)
+ ("𝅘𝅥𝅲" ?𝅘𝅥𝅲)
+ ("𝆹𝅥" ?𝆹𝅥)
+ ("𝆺𝅥" ?𝆺𝅥)
+ ("𝆹𝅥𝅮" ?𝆹𝅥𝅮)
+ ("𝆺𝅥𝅮" ?𝆺𝅥𝅮)
+ ("𝆹𝅥𝅯" ?𝆹𝅥𝅯)
+ ("𝆺𝅥𝅯" ?𝆺𝅥𝅯)
+ (";S" ?Ș)
+ ("S;" ?Ș)
+ (";s" ?ș)
+ ("s;" ?ș)
+ (";T" ?Ț)
+ ("T;" ?Ț)
+ (";t" ?ț)
+ ("t;" ?ț)
+ ("``а" ["а̏"])
+ ("`а" ["а̀"])
+ ("´а" ["а́"])
+ ("'а" ["а́"])
+ ("¯а" ["а̄"])
+ ("_а" ["а̄"])
+ ("^а" ["а̂"])
+ ("``А" ["А̏"])
+ ("`А" ["А̀"])
+ ("´А" ["А́"])
+ ("'А" ["А́"])
+ ("¯А" ["А̄"])
+ ("_А" ["А̄"])
+ ("^А" ["А̂"])
+ ("``е" ["е̏"])
+ ("´е" ["е́"])
+ ("'е" ["е́"])
+ ("¯е" ["е̄"])
+ ("_е" ["е̄"])
+ ("^е" ["е̂"])
+ ("``Е" ["Е̏"])
+ ("´Е" ["Е́"])
+ ("'Е" ["Е́"])
+ ("¯Е" ["Е̄"])
+ ("_Е" ["Е̄"])
+ ("^Е" ["Е̂"])
+ ("``и" ["и̏"])
+ ("´и" ["и́"])
+ ("'и" ["и́"])
+ ("^и" ["и̂"])
+ ("``И" ["И̏"])
+ ("´И" ["И́"])
+ ("'И" ["И́"])
+ ("^И" ["И̂"])
+ ("``о" ["о̏"])
+ ("`о" ["о̀"])
+ ("´о" ["о́"])
+ ("'о" ["о́"])
+ ("¯о" ["о̄"])
+ ("_о" ["о̄"])
+ ("^о" ["о̂"])
+ ("``О" ["О̏"])
+ ("`О" ["О̀"])
+ ("´О" ["О́"])
+ ("'О" ["О́"])
+ ("¯О" ["О̄"])
+ ("_О" ["О̄"])
+ ("^О" ["О̂"])
+ ("``у" ["у̏"])
+ ("`у" ["у̀"])
+ ("´у" ["у́"])
+ ("'у" ["у́"])
+ ("^у" ["у̂"])
+ ("``У" ["У̏"])
+ ("`У" ["У̀"])
+ ("´У" ["У́"])
+ ("'У" ["У́"])
+ ("^У" ["У̂"])
+ ("``р" ["р̏"])
+ ("`р" ["р̀"])
+ ("´р" ["р́"])
+ ("'р" ["р́"])
+ ("¯р" ["р̄"])
+ ("_р" ["р̄"])
+ ("^р" ["р̂"])
+ ("``Р" ["Р̏"])
+ ("`Р" ["Р̀"])
+ ("´Р" ["Р́"])
+ ("'Р" ["Р́"])
+ ("¯Р" ["Р̄"])
+ ("_Р" ["Р̄"])
+ ("^Р" ["Р̂"])
+ ("v/" ?√)
+ ("/v" ?√)
+ ("88" ?∞)
+ ("=_" ?≡)
+ ("_≠" ?≢)
+ ("≠_" ?≢)
+ ("<_" ?≤)
+ ("_<" ?≤)
+ (">_" ?≥)
+ ("_>" ?≥)
+ ("_⊂" ?⊆)
+ ("⊂_" ?⊆)
+ ("_⊃" ?⊇)
+ ("⊃_" ?⊇)
+ ("○-" ?⊖)
+ ("-○" ?⊖)
+ ("○." ?⊙)
+ (".○" ?⊙)
+ ("<>" ?⋄)
+ ("><" ?⋄)
+ ("∧∨" ?⋄)
+ ("∨∧" ?⋄)
+ (":." ?∴)
+ (".:" ?∵)
+ ("⊥⊤" ?⌶)
+ ("⊤⊥" ?⌶)
+ ("[]" ?⌷)
+ ("][" ?⌷)
+ ("⎕=" ?⌸)
+ ("=⎕" ?⌸)
+ ("⎕÷" ?⌹)
+ ("÷⎕" ?⌹)
+ ("⎕⋄" ?⌺)
+ ("⋄⎕" ?⌺)
+ ("⎕∘" ?⌻)
+ ("∘⎕" ?⌻)
+ ("⎕○" ?⌼)
+ ("○⎕" ?⌼)
+ ("○|" ?⌽)
+ ("|○" ?⌽)
+ ("○∘" ?⌾)
+ ("∘○" ?⌾)
+ ("/-" ?⌿)
+ ("-/" ?⌿)
+ ("\\-" ?⍀)
+ ("-\\" ?⍀)
+ ("/⎕" ?⍁)
+ ("⎕/" ?⍁)
+ ("\\⎕" ?⍂)
+ ("⎕\\" ?⍂)
+ ("<⎕" ?⍃)
+ ("⎕<" ?⍃)
+ (">⎕" ?⍄)
+ ("⎕>" ?⍄)
+ ("←|" ?⍅)
+ ("|←" ?⍅)
+ ("→|" ?⍆)
+ ("|→" ?⍆)
+ ("←⎕" ?⍇)
+ ("⎕←" ?⍇)
+ ("→⎕" ?⍈)
+ ("⎕→" ?⍈)
+ ("○\\" ?⍉)
+ ("\\○" ?⍉)
+ ("_⊥" ?⍊)
+ ("⊥_" ?⍊)
+ ("∆|" ?⍋)
+ ("|∆" ?⍋)
+ ("∨⎕" ?⍌)
+ ("⎕∨" ?⍌)
+ ("∆⎕" ?⍍)
+ ("⎕∆" ?⍍)
+ ("∘⊥" ?⍎)
+ ("⊥∘" ?⍎)
+ ("↑-" ?⍏)
+ ("-↑" ?⍏)
+ ("↑⎕" ?⍐)
+ ("⎕↑" ?⍐)
+ ("¯⊤" ?⍑)
+ ("⊤¯" ?⍑)
+ ("∇|" ?⍒)
+ ("|∇" ?⍒)
+ ("∧⎕" ?⍓)
+ ("⎕∧" ?⍓)
+ ("∇⎕" ?⍔)
+ ("⎕∇" ?⍔)
+ ("∘⊤" ?⍕)
+ ("⊤∘" ?⍕)
+ ("↓-" ?⍖)
+ ("-↓" ?⍖)
+ ("↓⎕" ?⍗)
+ ("⎕↓" ?⍗)
+ ("_'" ?⍘)
+ ("∆_" ?⍙)
+ ("_∆" ?⍙)
+ ("⋄_" ?⍚)
+ ("_⋄" ?⍚)
+ ("∘_" ?⍛)
+ ("_∘" ?⍛)
+ ("○_" ?⍜)
+ ("_○" ?⍜)
+ ("∘∩" ?⍝)
+ ("∩∘" ?⍝)
+ ("⎕'" ?⍞)
+ ("'⎕" ?⍞)
+ ("○*" ?⍟)
+ ("*○" ?⍟)
+ (":⎕" ?⍠)
+ ("⎕:" ?⍠)
+ ("¨⊤" ?⍡)
+ ("⊤¨" ?⍡)
+ ("¨∇" ?⍢)
+ ("∇¨" ?⍢)
+ ("*¨" ?⍣)
+ ("¨*" ?⍣)
+ ("∘¨" ?⍤)
+ ("¨∘" ?⍤)
+ ("○¨" ?⍥)
+ ("¨○" ?⍥)
+ ("∪|" ?⍦)
+ ("|∪" ?⍦)
+ ("⊂|" ?⍧)
+ ("|⊂" ?⍧)
+ ("~¨" ?⍨)
+ ("¨>" ?⍩)
+ (">¨" ?⍩)
+ ("∇~" ?⍫)
+ ("~∇" ?⍫)
+ ("0~" ?⍬)
+ ("~0" ?⍬)
+ ("|~" ?⍭)
+ ("~|" ?⍭)
+ (";_" ?⍮)
+ ("≠⎕" ?⍯)
+ ("⎕≠" ?⍯)
+ ("?⎕" ?⍰)
+ ("⎕?" ?⍰)
+ ("∨~" ?⍱)
+ ("~∨" ?⍱)
+ ("∧~" ?⍲)
+ ("~∧" ?⍲)
+ ("⍺_" ?⍶)
+ ("_⍺" ?⍶)
+ ("∊_" ?⍷)
+ ("_∊" ?⍷)
+ ("⍳_" ?⍸)
+ ("_⍳" ?⍸)
+ ("⍵_" ?⍹)
+ ("_⍵" ?⍹)
+ )
+
+(provide 'compose)
+;;; compose.el ends here
diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el
index 98782ef..6effe13 100644
--- a/lisp/mail/feedmail.el
+++ b/lisp/mail/feedmail.el
@@ -1630,7 +1630,7 @@ local gurus."
   (let ((result (smtpmail-via-smtp addr-listoid prepped)))
     (when result
       (set-buffer errors-to)
-      (insert "Send via smtpmail failed: %s" result)
+      (insert "Send via smtpmail failed: " result)
       (let ((case-fold-search t)
            ;; don't be overconfident about the name of the trace buffer
            (tracer (concat "trace.*smtp.*" (regexp-quote 
smtpmail-smtp-server))))
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 86084b0..2c972ee 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -1492,8 +1492,7 @@ If so restore the actual mbox message collection."
   (setq require-final-newline nil)
   (make-local-variable 'version-control)
   (setq version-control 'never)
-  (make-local-variable 'kill-buffer-hook)
-  (add-hook 'kill-buffer-hook 'rmail-mode-kill-summary)
+  (add-hook 'kill-buffer-hook #'rmail-mode-kill-summary nil t)
   (make-local-variable 'file-precious-flag)
   (setq file-precious-flag t)
   (make-local-variable 'desktop-save-buffer)
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 5a41e2f..9d57a81 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -701,7 +701,7 @@ The text is displayed for `minibuffer-message-timeout' 
seconds,
 or until the next input event arrives, whichever comes first.
 Enclose MESSAGE in [...] if this is not yet the case.
 If ARGS are provided, then pass MESSAGE through `format-message'."
-  (if (not (minibufferp (current-buffer)))
+  (if (not (minibufferp (current-buffer) t))
       (progn
         (if args
             (apply #'message message args)
diff --git a/lisp/mwheel.el b/lisp/mwheel.el
index c6a7391..1d9fe68 100644
--- a/lisp/mwheel.el
+++ b/lisp/mwheel.el
@@ -146,6 +146,16 @@ face height."
   :group 'mouse
   :type 'boolean)
 
+(defcustom mouse-wheel-scroll-amount-horizontal 1
+  "Amount to scroll windows horizontally.
+Its value can be changed dynamically by using a numeric prefix argument
+before starting horizontal scrolling.
+It has effect when `mouse-wheel-scroll-amount' binds the value `hscroll'
+to one of modifiers (`Shift' by default)."
+  :group 'mouse
+  :type 'number
+  :version "28.1")
+
 ;;; For tilt-scroll
 ;;;
 (defcustom mouse-wheel-tilt-scroll nil
@@ -243,11 +253,17 @@ active window."
                frame nil t)))))
       (mwheel-event-window event)))
 
-(defun mwheel-scroll (event)
+(defun mwheel-scroll (event &optional arg)
   "Scroll up or down according to the EVENT.
 This should be bound only to mouse buttons 4, 5, 6, and 7 on
-non-Windows systems."
-  (interactive (list last-input-event))
+non-Windows systems.
+
+Optional argument ARG (interactively, prefix numeric argument) controls
+the step of horizontal scrolling.
+
+The variable `mouse-wheel-scroll-amount-horizontal' records the last
+value of ARG, and the command uses it in subsequent scrolls."
+  (interactive (list last-input-event current-prefix-arg))
   (let* ((selected-window (selected-window))
          (scroll-window (mouse-wheel--get-scroll-window event))
         (old-point
@@ -275,9 +291,12 @@ non-Windows systems."
         (unwind-protect
            (let ((button (mwheel-event-button event)))
               (cond ((and (eq amt 'hscroll) (eq button mouse-wheel-down-event))
+                     (when (and (natnump arg) (> arg 0))
+                       (setq mouse-wheel-scroll-amount-horizontal arg))
                      (funcall (if mouse-wheel-flip-direction
                                   mwheel-scroll-left-function
-                                mwheel-scroll-right-function) 1))
+                                mwheel-scroll-right-function)
+                              mouse-wheel-scroll-amount-horizontal))
                     ((eq button mouse-wheel-down-event)
                      (condition-case nil (funcall mwheel-scroll-down-function 
amt)
                        ;; Make sure we do indeed scroll to the beginning of
@@ -294,9 +313,12 @@ non-Windows systems."
                           ;; to only affect scroll-down.  --Stef
                           (set-window-start (selected-window) (point-min))))))
                     ((and (eq amt 'hscroll) (eq button mouse-wheel-up-event))
+                     (when (and (natnump arg) (> arg 0))
+                       (setq mouse-wheel-scroll-amount-horizontal arg))
                      (funcall (if mouse-wheel-flip-direction
                                   mwheel-scroll-right-function
-                                mwheel-scroll-left-function) 1))
+                                mwheel-scroll-left-function)
+                              mouse-wheel-scroll-amount-horizontal))
                     ((eq button mouse-wheel-up-event)
                      (condition-case nil (funcall mwheel-scroll-up-function 
amt)
                        ;; Make sure we do indeed scroll to the end of the 
buffer.
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 0cb8d7c..e0c162d 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -3427,8 +3427,7 @@ system TYPE.")
   (and (file-directory-p name)
        (file-readable-p name)))
 
-(defun ange-ftp-directory-files (directory &optional full match
-                                          &rest v19-args)
+(defun ange-ftp-directory-files (directory &optional full match nosort count)
   (setq directory (expand-file-name directory))
   (if (ange-ftp-ftp-name directory)
       (progn
@@ -3443,19 +3442,21 @@ system TYPE.")
            (if (or (not match) (string-match-p match f))
                (setq files
                      (cons (if full (concat directory f) f) files))))
+          (when (natnump count)
+            (setq files (last files count)))
          (nreverse files)))
-    (apply 'ange-ftp-real-directory-files directory full match v19-args)))
+    (apply 'ange-ftp-real-directory-files directory full match nosort count)))
 
 (defun ange-ftp-directory-files-and-attributes
-  (directory &optional full match nosort id-format)
+  (directory &optional full match nosort id-format count)
   (setq directory (expand-file-name directory))
   (if (ange-ftp-ftp-name directory)
       (mapcar
        (lambda (file)
         (cons file (file-attributes (expand-file-name file directory))))
-       (ange-ftp-directory-files directory full match nosort))
+       (ange-ftp-directory-files directory full match nosort count))
     (ange-ftp-real-directory-files-and-attributes
-     directory full match nosort id-format)))
+     directory full match nosort id-format count)))
 
 (defun ange-ftp-file-attributes (file &optional id-format)
   (setq file (expand-file-name file))
@@ -3535,20 +3536,22 @@ system TYPE.")
   (setq file (expand-file-name file))
   (let ((parsed (ange-ftp-ftp-name file)))
     (if parsed
-       (let* ((host (nth 0 parsed))
-              (user (nth 1 parsed))
-              (name (ange-ftp-quote-string (nth 2 parsed)))
-              (abbr (ange-ftp-abbreviate-filename file))
-              (result (ange-ftp-send-cmd host user
-                                         (list 'delete name)
-                                         (format "Deleting %s" abbr))))
-         (or (car result)
-             (signal 'ftp-error
-                     (list
-                      "Removing old name"
-                      (format "FTP Error: \"%s\"" (cdr result))
-                      file)))
-         (ange-ftp-delete-file-entry file))
+        (if (and delete-by-moving-to-trash trash)
+           (move-file-to-trash file)
+         (let* ((host (nth 0 parsed))
+                (user (nth 1 parsed))
+                (name (ange-ftp-quote-string (nth 2 parsed)))
+                (abbr (ange-ftp-abbreviate-filename file))
+                (result (ange-ftp-send-cmd host user
+                                           (list 'delete name)
+                                           (format "Deleting %s" abbr))))
+           (or (car result)
+               (signal 'ftp-error
+                       (list
+                        "Removing old name"
+                        (format "FTP Error: \"%s\"" (cdr result))
+                        file)))
+           (ange-ftp-delete-file-entry file)))
       (ange-ftp-real-delete-file file trash))))
 
 (defun ange-ftp-file-modtime (file)
@@ -4162,45 +4165,55 @@ directory, so that Emacs will know its current 
contents."
 
 (defun ange-ftp-delete-directory (dir &optional recursive trash)
   (if (file-directory-p dir)
-      (let ((parsed (ange-ftp-ftp-name dir)))
-       (if recursive
-           (mapc
-            (lambda (file)
-              (if (file-directory-p file)
-                  (ange-ftp-delete-directory file recursive trash)
-                (delete-file file trash)))
-            (directory-files dir 'full directory-files-no-dot-files-regexp)))
-       (if parsed
-           (let* ((host (nth 0 parsed))
-                  (user (nth 1 parsed))
-                  ;; Some ftp's on unix machines (at least on Suns)
-                  ;; insist that rmdir take a filename, and not a
-                  ;; directory-name name as an arg. Argh!! This is a bug.
-                  ;; Non-unix machines will probably always insist
-                  ;; that rmdir takes a directory-name as an arg
-                  ;; (as the ftp man page says it should).
-                  (name (ange-ftp-quote-string
-                         (if (eq (ange-ftp-host-type host) 'unix)
-                             (ange-ftp-real-directory-file-name
-                              (nth 2 parsed))
-                           (ange-ftp-real-file-name-as-directory
-                            (nth 2 parsed)))))
-                  (abbr (ange-ftp-abbreviate-filename dir))
-                  (result
-                   (progn
-                     ;; CWD must not in this directory.
-                     (ange-ftp-cd host user "/" 'noerror)
-                     (ange-ftp-send-cmd host user
-                                        (list 'rmdir name)
-                                        (format "Removing directory %s"
-                                                abbr)))))
-             (or (car result)
-                 (ange-ftp-error host user
-                                 (format "Could not remove directory %s: %s"
-                                         dir
-                                         (cdr result))))
-             (ange-ftp-delete-file-entry dir t))
-         (ange-ftp-real-delete-directory dir recursive trash)))
+      ;; Trashing directories does not work yet, because
+      ;; `rename-file', called in `move-file-to-trash', does not
+      ;; handle directories.
+      (if nil ; (and delete-by-moving-to-trash trash)
+         ;; Move non-empty dir to trash only if recursive deletion was
+         ;; requested.
+         (if (not (or recursive (directory-empty-p dir)))
+             (signal 'ftp-error
+                      (list "Directory is not empty, not moving to trash"))
+           (move-file-to-trash dir))
+        (let ((parsed (ange-ftp-ftp-name dir)))
+         (if recursive
+             (mapc
+              (lambda (file)
+                (if (file-directory-p file)
+                    (ange-ftp-delete-directory file recursive)
+                  (delete-file file)))
+              (directory-files dir 'full directory-files-no-dot-files-regexp)))
+         (if parsed
+             (let* ((host (nth 0 parsed))
+                    (user (nth 1 parsed))
+                    ;; Some ftp's on unix machines (at least on Suns)
+                    ;; insist that rmdir take a filename, and not a
+                    ;; directory-name name as an arg. Argh!! This is a bug.
+                    ;; Non-unix machines will probably always insist
+                    ;; that rmdir takes a directory-name as an arg
+                    ;; (as the ftp man page says it should).
+                    (name (ange-ftp-quote-string
+                           (if (eq (ange-ftp-host-type host) 'unix)
+                               (ange-ftp-real-directory-file-name
+                                (nth 2 parsed))
+                             (ange-ftp-real-file-name-as-directory
+                              (nth 2 parsed)))))
+                    (abbr (ange-ftp-abbreviate-filename dir))
+                    (result
+                     (progn
+                       ;; CWD must not in this directory.
+                       (ange-ftp-cd host user "/" 'noerror)
+                       (ange-ftp-send-cmd host user
+                                          (list 'rmdir name)
+                                          (format "Removing directory %s"
+                                                  abbr)))))
+               (or (car result)
+                   (ange-ftp-error host user
+                                   (format "Could not remove directory %s: %s"
+                                           dir
+                                           (cdr result))))
+               (ange-ftp-delete-file-entry dir t))
+           (ange-ftp-real-delete-directory dir recursive trash))))
     (error "Not a directory: %s" dir)))
 
 ;; Make a local copy of FILE and return its name.
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index ebc75e0..43405fb 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -811,14 +811,19 @@ Currently this means either text/html or 
application/xhtml+xml."
 
 (declare-function mailcap-view-mime "mailcap" (type))
 (defun eww-display-pdf ()
-  (let ((data (buffer-substring (point) (point-max))))
-    (pop-to-buffer-same-window (get-buffer-create "*eww pdf*"))
-    (let ((coding-system-for-write 'raw-text)
-         (inhibit-read-only t))
-      (erase-buffer)
-      (insert data)
-      (mailcap-view-mime "application/pdf")))
-  (goto-char (point-min)))
+  (let ((buf (current-buffer))
+        (pos (point)))
+    (with-current-buffer (get-buffer-create "*eww pdf*")
+      (let ((inhibit-read-only t))
+        (erase-buffer)
+        (set-buffer-multibyte nil)
+        (insert-buffer-substring buf pos)
+        (mailcap-view-mime "application/pdf"))
+      (if (zerop (buffer-size))
+          ;; Buffer contents passed to shell command via temporary file.
+          (kill-buffer)
+        (goto-char (point-min))
+        (pop-to-buffer-same-window (current-buffer))))))
 
 (defun eww-setup-buffer ()
   (when (or (plist-get eww-data :url)
diff --git a/lisp/net/mailcap.el b/lisp/net/mailcap.el
index 94cd9e2..d0f8c12 100644
--- a/lisp/net/mailcap.el
+++ b/lisp/net/mailcap.el
@@ -175,11 +175,11 @@ is consulted."
       (type   . "application/zip")
       ("copiousoutput"))
      ("pdf"
-      (viewer . pdf-view-mode)
+      (viewer . doc-view-mode)
       (type . "application/pdf")
       (test . window-system))
      ("pdf"
-      (viewer . doc-view-mode)
+      (viewer . pdf-view-mode)
       (type . "application/pdf")
       (test . window-system))
      ("pdf"
@@ -330,7 +330,10 @@ Content-Type header as argument to return a boolean value 
for the
 validity.  Otherwise, if it is a non-function Lisp symbol or list
 whose car is a symbol, it is `eval'uated to yield the validity.  If it
 is a string or list of strings, it represents a shell command to run
-to return a true or false shell value for the validity.")
+to return a true or false shell value for the validity.
+
+The last matching entry in this structure takes presedence over
+preceding entries.")
 (put 'mailcap-mime-data 'risky-local-variable t)
 
 (defvar mailcap--computed-mime-data nil
@@ -1128,20 +1131,30 @@ For instance, \"foo.png\" will result in \"image/png\"."
             res)))
        (nreverse res)))))
 
+(defun mailcap--async-shell (command file)
+  "Asynchronously call MIME viewer shell COMMAND.
+Replace %s in COMMAND with FILE, as per `mailcap-mime-data'.
+Delete FILE once COMMAND exits."
+  (let ((buf (get-buffer-create " *mailcap shell*")))
+    (async-shell-command (format command file) buf)
+    (add-function :after (process-sentinel (get-buffer-process buf))
+                  (lambda (proc _msg)
+                    (when (memq (process-status proc) '(exit signal))
+                      (delete-file file))))))
+
 (defun mailcap-view-mime (type)
   "View the data in the current buffer that has MIME type TYPE.
-`mailcap--computed-mime-data' determines the method to use."
+The variable `mailcap--computed-mime-data' determines the method
+to use.  If the method is a shell command string, erase the
+current buffer after passing its contents to the shell command."
   (let ((method (mailcap-mime-info type)))
     (if (stringp method)
-        (let ((file (make-temp-file "emacs-mailcap" nil
-                                    (cadr (split-string type "/")))))
-          (unwind-protect
-              (let ((coding-system-for-write 'binary))
-                (write-region (point-min) (point-max) file nil 'silent)
-                (delete-region (point-min) (point-max))
-                (shell-command (format method file)))
-            (when (file-exists-p file)
-              (delete-file file))))
+        (let* ((ext (concat "." (cadr (split-string type "/"))))
+               (file (make-temp-file "emacs-mailcap" nil ext))
+               (coding-system-for-write 'binary))
+          (write-region nil nil file nil 'silent)
+          (delete-region (point-min) (point-max))
+          (mailcap--async-shell method file))
       (funcall method))))
 
 (provide 'mailcap)
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index f296ae3..63e6eed 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -56,7 +56,7 @@
   :group 'applications)
 
 (defcustom rcirc-server-alist
-  '(("irc.freenode.net" :channels ("#rcirc")
+  '(("chat.freenode.net" :channels ("#rcirc")
      ;; Don't use the TLS port by default, in case gnutls is not available.
      ;; :port 7000 :encryption tls
      ))
diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el
index dc1b468..f98ded4 100644
--- a/lisp/net/secrets.el
+++ b/lisp/net/secrets.el
@@ -795,8 +795,8 @@ In this mode, widgets represent the search results.
   (set (make-local-variable 'revert-buffer-function)
        #'secrets-show-collections)
   ;; When we toggle, we must set temporary widgets.
-  (set (make-local-variable 'tree-widget-after-toggle-functions)
-       '(secrets-tree-widget-after-toggle-function)))
+  (add-hook 'tree-widget-after-toggle-functions
+            #'secrets-tree-widget-after-toggle-function nil t))
 
 ;; It doesn't make sense to call it interactively.
 (put 'secrets-mode 'disabled t)
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index 49ecaa5..be83f67 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -301,7 +301,7 @@ ARGUMENTS to pass to the OPERATION."
       file-properties)))
 
 (defun tramp-adb-handle-directory-files-and-attributes
-  (directory &optional full match nosort id-format)
+  (directory &optional full match nosort id-format count)
   "Like `directory-files-and-attributes' for Tramp files."
   (unless (file-exists-p directory)
     (tramp-error
@@ -311,8 +311,8 @@ ARGUMENTS to pass to the OPERATION."
     (with-parsed-tramp-file-name (expand-file-name directory) nil
       (copy-tree
        (with-tramp-file-property
-          v localname (format "directory-files-and-attributes-%s-%s-%s-%s"
-                              full match id-format nosort)
+          v localname (format "directory-files-and-attributes-%s-%s-%s-%s-%s"
+                              full match id-format nosort count)
         (with-current-buffer (tramp-get-buffer v)
           (when (tramp-adb-send-command-and-check
                  v (format "%s -a -l %s"
@@ -342,11 +342,17 @@ ARGUMENTS to pass to the OPERATION."
             (unless nosort
               (setq result
                     (sort result (lambda (x y) (string< (car x) (car y))))))
-            (delq nil
-                  (mapcar (lambda (x)
-                            (if (or (not match) (string-match-p match (car x)))
-                                x))
-                          result)))))))))
+
+             (setq result (delq nil
+                                (mapcar
+                                 (lambda (x) (if (or (not match)
+                                                     (string-match-p
+                                                      match (car x)))
+                                                 x))
+                                 result)))
+            (when (and (natnump count) (> count 0))
+              (setq result (nbutlast result (- (length result) count))))
+             result)))))))
 
 (defun tramp-adb-get-ls-command (vec)
   "Determine `ls' command and its arguments."
@@ -437,27 +443,25 @@ Emacs dired can't find files."
                (and parents (file-directory-p dir)))
       (tramp-error v 'file-error "Couldn't make directory %s" dir))))
 
-(defun tramp-adb-handle-delete-directory (directory &optional recursive _trash)
+(defun tramp-adb-handle-delete-directory (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
-  (setq directory (expand-file-name directory))
-  (with-parsed-tramp-file-name (file-truename directory) nil
-    (tramp-flush-directory-properties v localname))
-  (with-parsed-tramp-file-name directory nil
-    (tramp-flush-directory-properties v localname)
+  (tramp-skeleton-delete-directory directory recursive trash
     (tramp-adb-barf-unless-okay
      v (format "%s %s"
               (if recursive "rm -r" "rmdir")
               (tramp-shell-quote-argument localname))
      "Couldn't delete %s" directory)))
 
-(defun tramp-adb-handle-delete-file (filename &optional _trash)
+(defun tramp-adb-handle-delete-file (filename &optional trash)
   "Like `delete-file' for Tramp files."
   (setq filename (expand-file-name filename))
   (with-parsed-tramp-file-name filename nil
     (tramp-flush-file-properties v localname)
-    (tramp-adb-barf-unless-okay
-     v (format "rm %s" (tramp-shell-quote-argument localname))
-     "Couldn't delete %s" filename)))
+    (if (and delete-by-moving-to-trash trash)
+       (move-file-to-trash filename)
+      (tramp-adb-barf-unless-okay
+       v (format "rm %s" (tramp-shell-quote-argument localname))
+       "Couldn't delete %s" filename))))
 
 (defun tramp-adb-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index c554a8d..9a4e16e 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -309,6 +309,30 @@ A nil value for either argument stands for the current 
time."
     (lambda (filename &optional timestamp _flag)
       (set-file-times filename timestamp))))
 
+;; `directory-files' and `directory-files-and-attributes' got argument
+;; COUNT in Emacs 28.1.
+(defalias 'tramp-compat-directory-files
+  (if (equal (tramp-compat-funcall 'func-arity #'directory-files) '(1 . 5))
+      #'directory-files
+    (lambda (directory &optional full match nosort _count)
+      (directory-files directory full match nosort))))
+
+(defalias 'tramp-compat-directory-files-and-attributes
+  (if (equal (tramp-compat-funcall 'func-arity 
#'directory-files-and-attributes)
+            '(1 . 6))
+      #'directory-files-and-attributes
+    (lambda (directory &optional full match nosort id-format _count)
+      (directory-files-and-attributes directory full match nosort id-format))))
+
+;; `directory-empty-p' is new in Emacs 28.1.
+(defalias 'tramp-compat-directory-empty-p
+  (if (fboundp 'directory-empty-p)
+      #'directory-empty-p
+    (lambda (dir)
+      (and (file-directory-p dir)
+          (null (tramp-compat-directory-files
+                 dir nil directory-files-no-dot-files-regexp t 1))))))
+
 (add-hook 'tramp-unload-hook
          (lambda ()
            (unload-feature 'tramp-loaddefs 'force)
@@ -322,5 +346,8 @@ A nil value for either argument stands for the current 
time."
 ;;
 ;; * Starting with Emacs 27.1, there's no need to escape open
 ;;   parentheses with a backslash in docstrings anymore.
+;;
+;; * Starting with Emacs 27.1, there's `make-empty-file'.  Could be
+;;   used instead of `write-region'.
 
 ;;; tramp-compat.el ends here
diff --git a/lisp/net/tramp-crypt.el b/lisp/net/tramp-crypt.el
index 3e96daa..4d34bbb 100644
--- a/lisp/net/tramp-crypt.el
+++ b/lisp/net/tramp-crypt.el
@@ -651,23 +651,25 @@ absolute file names."
      (list filename newname ok-if-already-exists keep-date
           preserve-uid-gid preserve-extended-attributes))))
 
+;; Crypted files won't be trashed.
 (defun tramp-crypt-handle-delete-directory
-    (directory &optional recursive trash)
+    (directory &optional recursive _trash)
   "Like `delete-directory' for Tramp files."
   (with-parsed-tramp-file-name (expand-file-name directory) nil
     (tramp-flush-directory-properties v localname)
     (let (tramp-crypt-enabled)
-      (delete-directory
-       (tramp-crypt-encrypt-file-name directory) recursive trash))))
+      (delete-directory (tramp-crypt-encrypt-file-name directory) recursive))))
 
-(defun tramp-crypt-handle-delete-file (filename &optional trash)
+;; Crypted files won't be trashed.
+(defun tramp-crypt-handle-delete-file (filename &optional _trash)
   "Like `delete-file' for Tramp files."
   (with-parsed-tramp-file-name (expand-file-name filename) nil
     (tramp-flush-file-properties v localname)
     (let (tramp-crypt-enabled)
-      (delete-file (tramp-crypt-encrypt-file-name filename) trash))))
+      (delete-file (tramp-crypt-encrypt-file-name filename)))))
 
-(defun tramp-crypt-handle-directory-files (directory &optional full match 
nosort)
+(defun tramp-crypt-handle-directory-files
+    (directory &optional full match nosort count)
   "Like `directory-files' for Tramp files."
   (unless (file-exists-p directory)
     (tramp-error
@@ -696,7 +698,11 @@ absolute file names."
                 (replace-regexp-in-string
                  (concat "^" (regexp-quote directory)) "" x))
               result)))
-      (if nosort result (sort result #'string<)))))
+      (unless nosort
+        (setq result (sort result #'string<)))
+      (when (and (natnump count) (> count 0))
+       (setq result (nbutlast result (- (length result) count))))
+      result)))
 
 (defun tramp-crypt-handle-file-attributes (filename &optional id-format)
   "Like `file-attributes' for Tramp files."
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 6467d8f..8f8e628a 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -691,8 +691,7 @@ It has been changed in GVFS 1.14.")
     ("gvfs-move" . "move")
     ("gvfs-rename" . "rename")
     ("gvfs-rm" . "remove")
-    ("gvfs-set-attribute" . "set")
-    ("gvfs-trash" . "trash"))
+    ("gvfs-set-attribute" . "set"))
   "List of cons cells, mapping \"gvfs-<command>\" to \"gio <command>\".")
 
 ;; <http://www.pygtk.org/docs/pygobject/gio-constants.html>
@@ -877,7 +876,7 @@ Return nil for null BYTE-ARRAY."
                  byte-array (car byte-array))))
     (dbus-byte-array-to-string
      (if (and (consp byte-array) (zerop (car (last byte-array))))
-        (butlast byte-array) byte-array))))
+        (nbutlast byte-array) byte-array))))
 
 (defun tramp-gvfs-stringify-dbus-message (message)
   "Convert a D-Bus MESSAGE into readable UTF8 strings, used for traces."
@@ -1080,24 +1079,21 @@ file names."
 
 (defun tramp-gvfs-handle-delete-directory (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
-  (with-parsed-tramp-file-name directory nil
+  (tramp-skeleton-delete-directory directory recursive trash
     (if (and recursive (not (file-symlink-p directory)))
        (mapc (lambda (file)
                (if (eq t (tramp-compat-file-attribute-type
                           (file-attributes file)))
-                   (delete-directory file recursive trash)
-                 (delete-file file trash)))
+                   (delete-directory file recursive)
+                 (delete-file file)))
              (directory-files
               directory 'full directory-files-no-dot-files-regexp))
-      (when (directory-files directory nil directory-files-no-dot-files-regexp)
+      (unless (tramp-compat-directory-empty-p directory)
        (tramp-error
         v 'file-error "Couldn't delete non-empty %s" directory)))
 
-    (tramp-flush-directory-properties v localname)
-    (unless
-       (tramp-gvfs-send-command
-        v (if (and trash delete-by-moving-to-trash) "gvfs-trash" "gvfs-rm")
-        (tramp-gvfs-url-file-name directory))
+    (unless (tramp-gvfs-send-command
+            v "gvfs-rm" (tramp-gvfs-url-file-name directory))
       ;; Propagate the error.
       (with-current-buffer (tramp-get-connection-buffer v)
        (goto-char (point-min))
@@ -1108,15 +1104,15 @@ file names."
   "Like `delete-file' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (tramp-flush-file-properties v localname)
-    (unless
-       (tramp-gvfs-send-command
-        v (if (and trash delete-by-moving-to-trash) "gvfs-trash" "gvfs-rm")
-        (tramp-gvfs-url-file-name filename))
-      ;; Propagate the error.
-      (with-current-buffer (tramp-get-connection-buffer v)
-       (goto-char (point-min))
-       (tramp-error-with-buffer
-        nil v 'file-error "Couldn't delete %s" filename)))))
+    (if (and delete-by-moving-to-trash trash)
+       (move-file-to-trash filename)
+      (unless (tramp-gvfs-send-command
+              v "gvfs-rm" (tramp-gvfs-url-file-name filename))
+       ;; Propagate the error.
+       (with-current-buffer (tramp-get-connection-buffer v)
+         (goto-char (point-min))
+         (tramp-error-with-buffer
+          nil v 'file-error "Couldn't delete %s" filename))))))
 
 (defun tramp-gvfs-handle-expand-file-name (name &optional dir)
   "Like `expand-file-name' for Tramp files."
diff --git a/lisp/net/tramp-integration.el b/lisp/net/tramp-integration.el
index 7e4a9bf..f712600 100644
--- a/lisp/net/tramp-integration.el
+++ b/lisp/net/tramp-integration.el
@@ -132,7 +132,7 @@ been set up by `rfn-eshadow-setup-minibuffer'."
   ;; Use `path-separator' as it does eshell.
   (setq eshell-path-env
        (mapconcat
-        #'identity (butlast (tramp-compat-exec-path)) path-separator)))
+        #'identity (nbutlast (tramp-compat-exec-path)) path-separator)))
 
 (with-eval-after-load 'esh-util
   (add-hook 'eshell-mode-hook
diff --git a/lisp/net/tramp-rclone.el b/lisp/net/tramp-rclone.el
index 3701bfc..4790bb4 100644
--- a/lisp/net/tramp-rclone.el
+++ b/lisp/net/tramp-rclone.el
@@ -289,19 +289,19 @@ file names."
     (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
   (with-parsed-tramp-file-name (expand-file-name directory) nil
-    (delete-directory (tramp-rclone-local-file-name directory) recursive trash)
     (tramp-flush-directory-properties v localname)
-    (tramp-rclone-flush-directory-cache v)))
+    (tramp-rclone-flush-directory-cache v)
+    (delete-directory (tramp-rclone-local-file-name directory) recursive 
trash)))
 
 (defun tramp-rclone-handle-delete-file (filename &optional trash)
   "Like `delete-file' for Tramp files."
   (with-parsed-tramp-file-name (expand-file-name filename) nil
+    (tramp-rclone-flush-directory-cache v)
     (delete-file (tramp-rclone-local-file-name filename) trash)
-    (tramp-flush-file-properties v localname)
-    (tramp-rclone-flush-directory-cache v)))
+    (tramp-flush-file-properties v localname)))
 
 (defun tramp-rclone-handle-directory-files
-    (directory &optional full match nosort)
+    (directory &optional full match nosort count)
   "Like `directory-files' for Tramp files."
   (unless (file-exists-p directory)
     (tramp-error
@@ -311,8 +311,8 @@ file names."
     (setq directory (file-name-as-directory (expand-file-name directory)))
     (with-parsed-tramp-file-name directory nil
       (let ((result
-            (directory-files
-             (tramp-rclone-local-file-name directory) full match)))
+            (tramp-compat-directory-files
+             (tramp-rclone-local-file-name directory) full match nosort 
count)))
        ;; Massage the result.
        (when full
          (let ((local (concat "^" (regexp-quote (tramp-rclone-mount-point v))))
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index f1b45ee..51e15af 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -1703,7 +1703,7 @@ ID-FORMAT valid values are `string' and `integer'."
 ;; Directory listings.
 
 (defun tramp-sh-handle-directory-files-and-attributes
-  (directory &optional full match nosort id-format)
+  (directory &optional full match nosort id-format count)
   "Like `directory-files-and-attributes' for Tramp files."
   (unless id-format (setq id-format 'integer))
   (unless (file-exists-p directory)
@@ -1738,13 +1738,18 @@ ID-FORMAT valid values are `string' and `integer'."
            (setcar item (expand-file-name (car item) directory)))
          (push item result)))
 
-      (or (if nosort
-             result
-           (sort result (lambda (x y) (string< (car x) (car y)))))
+      (unless nosort
+       (setq result (sort result (lambda (x y) (string< (car x) (car y))))))
+
+      (when (and (natnump count) (> count 0))
+       (setq result (nbutlast result (- (length result) count))))
+
+      (or result
          ;; The scripts could fail, for example with huge file size.
          (tramp-handle-directory-files-and-attributes
-          directory full match nosort id-format)))))
+          directory full match nosort id-format count)))))
 
+;; FIXME: Fix function to work with count parameter.
 (defun tramp-do-directory-files-and-attributes-with-perl
   (vec localname &optional id-format)
   "Implement `directory-files-and-attributes' for Tramp files using a Perl 
script."
@@ -1760,6 +1765,7 @@ ID-FORMAT valid values are `string' and `integer'."
     (when (stringp object) (tramp-error vec 'file-error object))
     object))
 
+;; FIXME: Fix function to work with count parameter.
 (defun tramp-do-directory-files-and-attributes-with-stat
   (vec localname &optional id-format)
   "Implement `directory-files-and-attributes' for Tramp files using stat(1) 
command."
@@ -2523,13 +2529,10 @@ The method used must be an out-of-band method."
 
 (defun tramp-sh-handle-delete-directory (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
-  (setq directory (expand-file-name directory))
-  (with-parsed-tramp-file-name directory nil
-    (tramp-flush-directory-properties v localname)
+  (tramp-skeleton-delete-directory directory recursive trash
     (tramp-barf-unless-okay
      v (format "cd / && %s %s"
-              (or (and trash (tramp-get-remote-trash v))
-                  (if recursive "rm -rf" "rmdir"))
+               (if recursive "rm -rf" "rmdir")
               (tramp-shell-quote-argument localname))
      "Couldn't delete %s" directory)))
 
@@ -2538,11 +2541,11 @@ The method used must be an out-of-band method."
   (setq filename (expand-file-name filename))
   (with-parsed-tramp-file-name filename nil
     (tramp-flush-file-properties v localname)
-    (tramp-barf-unless-okay
-     v (format "%s %s"
-              (or (and trash (tramp-get-remote-trash v)) "rm -f")
-              (tramp-shell-quote-argument localname))
-     "Couldn't delete %s" filename)))
+    (if (and delete-by-moving-to-trash trash)
+       (move-file-to-trash filename)
+      (tramp-barf-unless-okay
+       v (format "rm -f %s" (tramp-shell-quote-argument localname))
+       "Couldn't delete %s" filename))))
 
 ;; Dired.
 
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index 1b6af2a..0dd233a 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -635,41 +635,39 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
        (file-attributes filename))
        (unless ok-if-already-exists 'nofollow)))))
 
-(defun tramp-smb-handle-delete-directory (directory &optional recursive _trash)
+(defun tramp-smb-handle-delete-directory (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
-  (setq directory (directory-file-name (expand-file-name directory)))
-  (when (file-exists-p directory)
-    (when recursive
-      (mapc
-       (lambda (file)
-        (if (file-directory-p file)
-            (delete-directory file recursive)
-          (delete-file file)))
-       ;; We do not want to delete "." and "..".
-       (directory-files directory 'full directory-files-no-dot-files-regexp)))
-
-    (with-parsed-tramp-file-name directory nil
+  (tramp-skeleton-delete-directory directory recursive trash
+    (when (file-exists-p directory)
+      (when recursive
+       (mapc
+        (lambda (file)
+          (if (file-directory-p file)
+              (delete-directory file recursive)
+            (delete-file file)))
+        ;; We do not want to delete "." and "..".
+        (directory-files directory 'full directory-files-no-dot-files-regexp)))
+
       ;; We must also flush the cache of the directory, because
       ;; `file-attributes' reads the values from there.
       (tramp-flush-directory-properties v localname)
       (unless (tramp-smb-send-command
               v (format
                  "%s \"%s\""
-                 (if (tramp-smb-get-cifs-capabilities v) "posix_rmdir" "rmdir")
+                 (if (tramp-smb-get-cifs-capabilities v)
+                     "posix_rmdir" "rmdir")
                  (tramp-smb-get-localname v)))
        ;; Error.
        (with-current-buffer (tramp-get-connection-buffer v)
          (goto-char (point-min))
          (search-forward-regexp tramp-smb-errors nil t)
-         (tramp-error
-          v 'file-error "%s `%s'" (match-string 0) directory)))
+         (tramp-error v 'file-error "%s `%s'" (match-string 0) directory)))
 
       ;; "rmdir" does not report an error.  So we check ourselves.
       (when (file-exists-p directory)
-       (tramp-error
-        v 'file-error "`%s' not removed." directory)))))
+       (tramp-error v 'file-error "`%s' not removed." directory)))))
 
-(defun tramp-smb-handle-delete-file (filename &optional _trash)
+(defun tramp-smb-handle-delete-file (filename &optional trash)
   "Like `delete-file' for Tramp files."
   (setq filename (expand-file-name filename))
   (when (file-exists-p filename)
@@ -677,20 +675,21 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
       ;; We must also flush the cache of the directory, because
       ;; `file-attributes' reads the values from there.
       (tramp-flush-file-properties v localname)
-      (unless (tramp-smb-send-command
-              v (format
-                 "%s \"%s\""
-                 (if (tramp-smb-get-cifs-capabilities v) "posix_unlink" "rm")
-                 (tramp-smb-get-localname v)))
-       ;; Error.
-       (with-current-buffer (tramp-get-connection-buffer v)
-         (goto-char (point-min))
-         (search-forward-regexp tramp-smb-errors nil t)
-         (tramp-error
-          v 'file-error "%s `%s'" (match-string 0) filename))))))
+      (if (and delete-by-moving-to-trash trash)
+         (move-file-to-trash filename)
+       (unless (tramp-smb-send-command
+                v (format
+                   "%s \"%s\""
+                   (if (tramp-smb-get-cifs-capabilities v) "posix_unlink" "rm")
+                   (tramp-smb-get-localname v)))
+         ;; Error.
+         (with-current-buffer (tramp-get-connection-buffer v)
+           (goto-char (point-min))
+           (search-forward-regexp tramp-smb-errors nil t)
+           (tramp-error v 'file-error "%s `%s'" (match-string 0) 
filename)))))))
 
 (defun tramp-smb-handle-directory-files
-  (directory &optional full match nosort)
+  (directory &optional full match nosort count)
   "Like `directory-files' for Tramp files."
   (unless (file-exists-p directory)
     (tramp-error
@@ -704,14 +703,22 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
            (delete nil
                    (mapcar (lambda (x) (when (string-match-p match x) x))
                            result))))
+
+    ;; Sort them if necessary.
+    (unless nosort
+      (setq result (sort result #'string-lessp)))
+
+    ;; Return count number of results.
+    (when (and (natnump count) (> count 0))
+      (setq result (nbutlast result (- (length result) count))))
+
     ;; Prepend directory.
     (when full
       (setq result
            (mapcar
             (lambda (x) (format "%s/%s" (directory-file-name directory) x))
             result)))
-    ;; Sort them if necessary.
-    (unless nosort (setq result (sort result #'string-lessp)))
+
     result))
 
 (defun tramp-smb-handle-expand-file-name (name &optional dir)
@@ -2139,8 +2146,7 @@ Removes smb prompt.  Returns nil if an error message has 
appeared."
     "%s %s"
     tramp-smb-winexe-shell-command tramp-smb-winexe-shell-command-switch))
 
-  (set (make-local-variable 'kill-buffer-hook)
-       '(tramp-smb-kill-winexe-function))
+  (add-hook 'kill-buffer-hook #'tramp-smb-kill-winexe-function nil t)
 
   ;; Suppress "^M".  Shouldn't we specify utf8?
   (set-process-coding-system (tramp-get-connection-process vec) 'raw-text-dos)
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 98727dc..558a57b 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -321,29 +321,25 @@ absolute file names."
 (defun tramp-sudoedit-handle-delete-directory
     (directory &optional recursive trash)
   "Like `delete-directory' for Tramp files."
-  (setq directory (expand-file-name directory))
-  (with-parsed-tramp-file-name directory nil
-    (tramp-flush-directory-properties v localname)
-    (unless
-       (tramp-sudoedit-send-command
-        v (or (and trash "trash")
-              (if recursive '("rm" "-rf") "rmdir"))
-        (tramp-compat-file-name-unquote localname))
+  (tramp-skeleton-delete-directory directory recursive trash
+    (unless (tramp-sudoedit-send-command
+            v (if recursive '("rm" "-rf") "rmdir")
+            (tramp-compat-file-name-unquote localname))
       (tramp-error v 'file-error "Couldn't delete %s" directory))))
 
 (defun tramp-sudoedit-handle-delete-file (filename &optional trash)
   "Like `delete-file' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (tramp-flush-file-properties v localname)
-    (unless
-       (tramp-sudoedit-send-command
-        v (if (and trash delete-by-moving-to-trash) "trash" "rm")
-        (tramp-compat-file-name-unquote localname))
-      ;; Propagate the error.
-      (with-current-buffer (tramp-get-connection-buffer v)
-       (goto-char (point-min))
-       (tramp-error-with-buffer
-        nil v 'file-error "Couldn't delete %s" filename)))))
+    (if (and delete-by-moving-to-trash trash)
+       (move-file-to-trash filename)
+      (unless (tramp-sudoedit-send-command
+              v "rm" (tramp-compat-file-name-unquote localname))
+       ;; Propagate the error.
+       (with-current-buffer (tramp-get-connection-buffer v)
+         (goto-char (point-min))
+         (tramp-error-with-buffer
+          nil v 'file-error "Couldn't delete %s" filename))))))
 
 (defun tramp-sudoedit-handle-expand-file-name (name &optional dir)
   "Like `expand-file-name' for Tramp files.
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 0c85025..55f652f 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -3116,7 +3116,7 @@ User is always nil."
     (setq directory (substring directory 0 -1)))
   directory)
 
-(defun tramp-handle-directory-files (directory &optional full match nosort)
+(defun tramp-handle-directory-files (directory &optional full match nosort 
count)
   "Like `directory-files' for Tramp files."
   (unless (file-exists-p directory)
     (tramp-error
@@ -3132,16 +3132,20 @@ User is always nil."
        (when (or (null match) (string-match-p match item))
          (push (if full (concat directory item) item)
                result)))
-      (if nosort result (sort result #'string<)))))
+      (unless nosort
+        (setq result (sort result #'string<)))
+      (when (and (natnump count) (> count 0))
+       (setq result (nbutlast result (- (length result) count))))
+      result)))
 
 (defun tramp-handle-directory-files-and-attributes
-  (directory &optional full match nosort id-format)
+  (directory &optional full match nosort id-format count)
   "Like `directory-files-and-attributes' for Tramp files."
   (mapcar
    (lambda (x)
      (cons x (file-attributes
              (if full x (expand-file-name x directory)) id-format)))
-   (directory-files directory full match nosort)))
+   (tramp-compat-directory-files directory full match nosort count)))
 
 (defun tramp-handle-dired-uncache (dir)
   "Like `dired-uncache' for Tramp files."
@@ -3864,7 +3868,7 @@ It does not support `:stderr'."
            p))))))
 
 (defun tramp-handle-make-symbolic-link
-  (target linkname &optional ok-if-already-exists)
+    (target linkname &optional ok-if-already-exists)
   "Like `make-symbolic-link' for Tramp files.
 This is the fallback implementation for backends which do not
 support symbolic links."
@@ -3877,8 +3881,7 @@ support symbolic links."
     (tramp-run-real-handler
      #'make-symbolic-link (list target linkname ok-if-already-exists))))
 
-(defun tramp-handle-shell-command
-  (command &optional output-buffer error-buffer)
+(defun tramp-handle-shell-command (command &optional output-buffer 
error-buffer)
   "Like `shell-command' for Tramp files."
   (let* ((asynchronous (string-match-p "[ \t]*&[ \t]*\\'" command))
         (command (substring command 0 asynchronous))
@@ -4662,6 +4665,7 @@ If both files are local, the function returns t."
       (and (tramp-tramp-file-p file1) (tramp-tramp-file-p file2)
           (string-equal (file-remote-p file1) (file-remote-p file2)))))
 
+;; See also `file-modes-symbolic-to-number'.
 (defun tramp-mode-string-to-int (mode-string)
   "Convert a ten-letter \"drwxrwxrwx\"-style MODE-STRING into mode bits."
   (let* (case-fold-search
@@ -4741,6 +4745,7 @@ If both files are local, the function returns t."
   "A list of file types returned from the `stat' system call.
 This is used to map a mode number to a permission string.")
 
+;; See also `file-modes-number-to-symbolic'.
 (defun tramp-file-mode-from-int (mode)
   "Turn an integer representing a file MODE into an ls(1)-like string."
   (let ((type  (cdr
@@ -5333,6 +5338,23 @@ name of a process or buffer, or nil to default to the 
current buffer."
    (lambda ()
      (remove-hook 'interrupt-process-functions #'tramp-interrupt-process))))
 
+(defmacro tramp-skeleton-delete-directory (directory recursive trash &rest 
body)
+  "Skeleton for `tramp-*-handle-delete-directory'.
+BODY is the backend specific code."
+  (declare (indent 3) (debug t))
+  `(with-parsed-tramp-file-name (expand-file-name ,directory) nil
+    (if (and delete-by-moving-to-trash ,trash)
+       ;; Move non-empty dir to trash only if recursive deletion was
+       ;; requested.
+       (if (not (or ,recursive (tramp-compat-directory-empty-p ,directory)))
+           (tramp-error
+            v 'file-error "Directory is not empty, not moving to trash")
+         (move-file-to-trash ,directory))
+      ,@body)
+    (tramp-flush-directory-properties v localname)))
+
+(put #'tramp-skeleton-delete-directory 'tramp-suppress-trace t)
+
 ;; Checklist for `tramp-unload-hook'
 ;; - Unload all `tramp-*' packages
 ;; - Reset `file-name-handler-alist'
diff --git a/lisp/gnus/nnir.el b/lisp/obsolete/nnir.el
similarity index 99%
rename from lisp/gnus/nnir.el
rename to lisp/obsolete/nnir.el
index 20f82e5..aec5ed3 100644
--- a/lisp/gnus/nnir.el
+++ b/lisp/obsolete/nnir.el
@@ -12,6 +12,7 @@
 ;;   Justus Piater <Justus <at> Piater.name>
 ;; Mostly rewritten by Andrew Cohen <cohen@bu.edu> from 2010
 ;; Keywords: news mail searching ir
+;; Obsolete-since: 28.1
 
 ;; This file is part of GNU Emacs.
 
diff --git a/lisp/pcmpl-cvs.el b/lisp/pcmpl-cvs.el
index 1b49b29..13f3093 100644
--- a/lisp/pcmpl-cvs.el
+++ b/lisp/pcmpl-cvs.el
@@ -1,4 +1,4 @@
-;;; pcmpl-cvs.el --- functions for dealing with cvs completions
+;;; pcmpl-cvs.el --- functions for dealing with cvs completions  -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 1999-2020 Free Software Foundation, Inc.
 
@@ -29,7 +29,6 @@
 (provide 'pcmpl-cvs)
 
 (require 'pcomplete)
-(require 'executable)
 
 (defgroup pcmpl-cvs nil
   "Functions for dealing with CVS completions."
@@ -39,8 +38,7 @@
 
 (defcustom pcmpl-cvs-binary (or (executable-find "cvs") "cvs")
   "The full path of the `cvs' binary."
-  :type 'file
-  :group 'pcmpl-cvs)
+  :type 'file)
 
 ;; Functions:
 
@@ -139,7 +137,7 @@
   (let ((entries (pcmpl-cvs-entries opers))
        tags)
     (with-temp-buffer
-      (apply 'call-process pcmpl-cvs-binary nil t nil
+      (apply #'call-process pcmpl-cvs-binary nil t nil
             "status" "-v" entries)
       (goto-char (point-min))
       (while (re-search-forward "Existing Tags:" nil t)
diff --git a/lisp/pcmpl-rpm.el b/lisp/pcmpl-rpm.el
index 52a1dd4..efd2559 100644
--- a/lisp/pcmpl-rpm.el
+++ b/lisp/pcmpl-rpm.el
@@ -1,4 +1,4 @@
-;;; pcmpl-rpm.el --- functions for dealing with rpm completions
+;;; pcmpl-rpm.el --- functions for dealing with rpm completions  -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 1999-2020 Free Software Foundation, Inc.
 
@@ -47,14 +47,12 @@
   :version "24.3"
   :type '(choice (const :tag "No options" nil)
                  (string :tag "Single option")
-                 (repeat :tag "List of options" string))
-  :group 'pcmpl-rpm)
+                 (repeat :tag "List of options" string)))
 
 (defcustom pcmpl-rpm-cache t
   "Whether to cache the list of installed packages."
   :version "24.3"
-  :type 'boolean
-  :group 'pcmpl-rpm)
+  :type 'boolean)
 
 (defconst pcmpl-rpm-cache-stamp-file "/var/lib/rpm/Packages"
   "File used to check that the list of installed packages is up-to-date.")
@@ -78,7 +76,7 @@
     (message "Getting list of installed rpms...")
     (setq pcmpl-rpm-cache-time (current-time)
           pcmpl-rpm-packages
-          (split-string (apply 'pcomplete-process-result "rpm"
+          (split-string (apply #'pcomplete-process-result "rpm"
                                (append '("-q" "-a")
                                        (if (stringp pcmpl-rpm-query-options)
                                            (list pcmpl-rpm-query-options)
diff --git a/lisp/pcomplete.el b/lisp/pcomplete.el
index 014f962..679f2e9 100644
--- a/lisp/pcomplete.el
+++ b/lisp/pcomplete.el
@@ -352,7 +352,7 @@ modified to be an empty string, or the desired separation 
string."
 (defvar pcomplete-show-list nil)
 (defvar pcomplete-expand-only-p nil)
 
-;; for the sake of the bye-compiler, when compiling other files that
+;; for the sake of the byte-compiler, when compiling other files that
 ;; contain completion functions
 (defvar pcomplete-args nil)
 (defvar pcomplete-begins nil)
diff --git a/lisp/play/solitaire.el b/lisp/play/solitaire.el
index 5c1dd06..1383efe 100644
--- a/lisp/play/solitaire.el
+++ b/lisp/play/solitaire.el
@@ -1,4 +1,4 @@
-;;; solitaire.el --- game of solitaire in Emacs Lisp
+;;; solitaire.el --- game of solitaire in Emacs Lisp  -*- lexical-binding: t 
-*-
 
 ;; Copyright (C) 1994, 2001-2020 Free Software Foundation, Inc.
 
@@ -38,8 +38,7 @@
 
 (defcustom solitaire-mode-hook nil
   "Hook to run upon entry to Solitaire."
-  :type 'hook
-  :group 'solitaire)
+  :type 'hook)
 
 (defvar solitaire-mode-map
   (let ((map (make-sparse-keymap)))
@@ -119,8 +118,7 @@ The usual mnemonic keys move the cursor around the board; 
in addition,
   "Non-nil means check for possible moves after each major change.
 This takes a while, so switch this on if you like to be informed when
 the game is over, or off, if you are working on a slow machine."
-  :type 'boolean
-  :group 'solitaire)
+  :type 'boolean)
 
 (defconst solitaire-valid-directions
   '(solitaire-left solitaire-right solitaire-up solitaire-down))
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 1649f50..75e2f0d 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -9894,8 +9894,9 @@ This function might do hidden buffer changes."
                 (throw 'at-decl-or-cast t))
 
               (when (and got-parens
-                         (not got-function-name-prefix)
-                         ;; (not got-suffix-after-parens)
+                         (or (not got-function-name-prefix)
+                             (and (not got-suffix-after-parens)
+                                  at-decl-end))
                          (or backup-at-type
                              maybe-typeless
                              backup-maybe-typeless
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index de0ea42..e0dabed 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -268,17 +268,20 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1))
      "^\\(?:[ \t]+at \\|==[0-9]+== 
+\\(?:at\\|b\\(y\\)\\)\\).+(\\([^()\n]+\\):\\([0-9]+\\))$" 2 3 nil (1))
 
     (javac
-     ,(concat
-       ;; line1
-       "^\\(\\(?:[A-Za-z]:\\)?[^:\n]+\\):" ;file
-       "\\([0-9]+\\): "                    ;line
-       "\\(warning: \\)?.*\n"              ;type (optional) and message
-       ;; line2: source line containing error
-       ".*\n"
-       ;; line3: single "^" under error position in line2
-       " *\\^$")
+     ,(rx bol
+          (group                        ; file
+           (? (in "A-Za-z") ":")
+           (+ (not (in "\n:"))))
+          ":"
+          (group (+ (in "0-9")))        ; line number
+          ": "
+          (? (group "warning: "))       ; type (optional)
+          (* nonl) "\n"                 ; message
+          (* nonl) "\n"                 ; source line containing error
+          (* " ") "^"                   ; caret line; ^ marks error
+          eol)
      1 2
-     ,(lambda () (1- (current-column)))
+     ,#'current-column
      (3))
 
     (jikes-file
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index ebbea6b..6178cdf 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -1606,6 +1606,9 @@ or as help on variables `cperl-tips', `cperl-problems',
   (if (cperl-val 'cperl-electric-keywords)
       (abbrev-mode 1))
   (set-syntax-table cperl-mode-syntax-table)
+  ;; Workaround for Bug#30393, needed for Emacs 26.
+  (when (< emacs-major-version 27)
+    (setq-local open-paren-in-column-0-is-defun-start nil))
   ;; Until Emacs is multi-threaded, we do not actually need it local:
   (make-local-variable 'cperl-font-lock-multiline-start)
   (make-local-variable 'cperl-font-locking)
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index ce2b924..12788ea 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1416,12 +1416,13 @@ which see."
 (defun elisp--documentation-one-liner ()
   (let* (str
          (callback (lambda (doc &rest plist)
-                     (setq str
-                           (format "%s: %s"
-                                   (propertize (prin1-to-string
-                                                (plist-get plist :thing))
-                                               'face (plist-get plist :face))
-                                   doc)))))
+                     (when doc
+                       (setq str
+                             (format "%s: %s"
+                                     (propertize (prin1-to-string
+                                                  (plist-get plist :thing))
+                                                 'face (plist-get plist :face))
+                                     doc))))))
     (or (progn (elisp-eldoc-var-docstring callback) str)
         (progn (elisp-eldoc-funcall callback) str))))
 
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 41ed317..8879726 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1406,13 +1406,8 @@ hits the start of file."
              offset (* 3 offset)))     ; expand search window
       (or found
          (re-search-forward pat nil t)
-         (if (and (buffer-narrowed-p) widen-automatically)
-              (progn
-                ;; Rerun after removing narrowing
-                (widen)
-                (etags-goto-tag-location tag-info))
-            (user-error "Rerun etags: `%s' not found in %s"
-                        pat buffer-file-name))))
+         (user-error "Rerun etags: `%s' not found in %s"
+                      pat buffer-file-name)))
     ;; Position point at the right place
     ;; if the search string matched an extra Ctrl-m at the beginning.
     (and (eq selective-display t)
@@ -2140,8 +2135,10 @@ file name, add `tag-partial-file-name-match-p' to the 
list value.")
     (let ((buffer (find-file-noselect file)))
       (with-current-buffer buffer
         (save-excursion
-          (etags-goto-tag-location tag-info)
-          (point-marker))))))
+          (save-restriction
+            (widen)
+            (etags-goto-tag-location tag-info)
+            (point-marker)))))))
 
 (cl-defmethod xref-location-line ((l xref-etags-location))
   (with-slots (tag-info) l
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index 4bebf88..6e9b683 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -2455,7 +2455,7 @@ the end of the current result or async record is reached."
 ;; files, values of string variables in the inferior, etc., are all
 ;; encoded in the same encoding.
 
-(defcustom gdb-mi-decode-strings nil
+(defcustom gdb-mi-decode-strings t
   "When non-nil, decode octal escapes in GDB output into non-ASCII text.
 
 If the value is a coding-system, use that coding-system to decode
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 8f7482a..6c647a0 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -301,8 +301,8 @@ to find the list of ignores for each directory."
                                        (split-string files)
                                        (concat " -o " find-name-arg " "))
                                       " "
-                                      (shell-quote-argument ")"))"")
-                          )))
+                                      (shell-quote-argument ")"))
+                            ""))))
     (project--remote-file-names
      (sort (split-string (shell-command-to-string command) "\0" t)
            #'string<))))
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 53b6540..d6feba2 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -4011,8 +4011,8 @@ Argument OUTPUT is a string with the output from the 
comint process."
   "Setup pdb tracking in current buffer."
   (make-local-variable 'python-pdbtrack-buffers-to-kill)
   (make-local-variable 'python-pdbtrack-tracked-buffer)
-  (add-to-list (make-local-variable 'comint-input-filter-functions)
-               #'python-pdbtrack-comint-input-filter-function)
+  (add-hook 'comint-input-filter-functions
+            #'python-pdbtrack-comint-input-filter-function nil t)
   (add-to-list (make-local-variable 'comint-output-filter-functions)
                #'python-pdbtrack-comint-output-filter-function)
   (add-function :before (process-sentinel (get-buffer-process 
(current-buffer)))
diff --git a/lisp/progmodes/tcl.el b/lisp/progmodes/tcl.el
index d4d51e8..f0dd9af 100644
--- a/lisp/progmodes/tcl.el
+++ b/lisp/progmodes/tcl.el
@@ -1,4 +1,4 @@
-;;; tcl.el --- Tcl code editing commands for Emacs
+;;; tcl.el --- Tcl code editing commands for Emacs  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1994, 1998-2020 Free Software Foundation, Inc.
 
@@ -120,20 +120,17 @@
 
 (defcustom tcl-indent-level 4
   "Indentation of Tcl statements with respect to containing block."
-  :type 'integer
-  :group 'tcl)
-(put 'tcl-indent-level 'safe-local-variable 'integerp)
+  :type 'integer)
+(put 'tcl-indent-level 'safe-local-variable #'integerp)
 
 (defcustom tcl-continued-indent-level 4
   "Indentation of continuation line relative to first line of command."
-  :type 'integer
-  :group 'tcl)
-(put 'tcl-continued-indent-level 'safe-local-variable 'integerp)
+  :type 'integer)
+(put 'tcl-continued-indent-level 'safe-local-variable #'integerp)
 
 (defcustom tcl-auto-newline nil
   "Non-nil means automatically newline before and after braces you insert."
-  :type 'boolean
-  :group 'tcl)
+  :type 'boolean)
 
 (defcustom tcl-tab-always-indent tab-always-indent
   "Control effect of TAB key.
@@ -151,8 +148,7 @@ to take place:
   6. Move backward to start of comment, indenting if necessary."
   :type '(choice (const :tag "Always" t)
                 (const :tag "Beginning only" nil)
-                (other :tag "Maybe move or make or delete comment" tcl))
-  :group 'tcl)
+                (other :tag "Maybe move or make or delete comment" tcl)))
 
 
 (defcustom tcl-electric-hash-style nil ;; 'smart
@@ -163,28 +159,23 @@ meaning that the choice between `backslash' and `quote' 
should be
 made depending on the number of hashes inserted; or nil, meaning that
 no quoting should be done.  Any other value for this variable is
 taken to mean `smart'.  The default is nil."
-  :type '(choice (const backslash) (const quote) (const smart) (const nil))
-  :group 'tcl)
+  :type '(choice (const backslash) (const quote) (const smart) (const nil)))
 
 (defcustom tcl-help-directory-list nil
   "List of topmost directories containing TclX help files."
-  :type '(repeat directory)
-  :group 'tcl)
+  :type '(repeat directory))
 
 (defcustom tcl-use-smart-word-finder t
   "If not nil, use smart way to find current word, for Tcl help feature."
-  :type 'boolean
-  :group 'tcl)
+  :type 'boolean)
 
 (defcustom tcl-application "wish"
   "Name of Tcl program to run in inferior Tcl mode."
-  :type 'string
-  :group 'tcl)
+  :type 'string)
 
 (defcustom tcl-command-switches nil
   "List of switches to supply to the `tcl-application' program."
-  :type '(repeat string)
-  :group 'tcl)
+  :type '(repeat string))
 
 (defcustom tcl-prompt-regexp "^\\(% \\|\\)"
   "If not nil, a regexp that will match the prompt in the inferior process.
@@ -192,8 +183,7 @@ If nil, the prompt is the name of the application with 
\">\" appended.
 
 The default is \"^\\(% \\|\\)\", which will match the default primary
 and secondary prompts for tclsh and wish."
-  :type 'regexp
-  :group 'tcl)
+  :type 'regexp)
 
 (defcustom inferior-tcl-source-command "source %s\n"
   "Format-string for building a Tcl command to load a file.
@@ -201,12 +191,10 @@ This format string should use `%s' to substitute a file 
name
 and should result in a Tcl expression that will command the
 inferior Tcl to load that file.  The filename will be appropriately
 quoted for Tcl."
-  :type 'string
-  :group 'tcl)
+  :type 'string)
 
 (defface tcl-escaped-newline '((t :inherit font-lock-string-face))
   "Face used for (non-escaped) backslash at end of a line in Tcl mode."
-  :group 'tcl
   :version "22.1")
 
 ;;
@@ -266,16 +254,16 @@ quoted for Tcl."
   ;; Maybe someone has a better set?
   (let ((map (make-sparse-keymap)))
     ;; Will inherit from `comint-mode-map' thanks to define-derived-mode.
-    (define-key map "\t" 'completion-at-point)
-    (define-key map "\M-?" 'comint-dynamic-list-filename-completions)
-    (define-key map "\177" 'backward-delete-char-untabify)
-    (define-key map "\M-\C-x" 'tcl-eval-defun)
-    (define-key map "\C-c\C-i" 'tcl-help-on-word)
-    (define-key map "\C-c\C-v" 'tcl-eval-defun)
-    (define-key map "\C-c\C-f" 'tcl-load-file)
-    (define-key map "\C-c\C-t" 'inferior-tcl)
-    (define-key map "\C-c\C-x" 'tcl-eval-region)
-    (define-key map "\C-c\C-s" 'switch-to-tcl)
+    (define-key map "\t" #'completion-at-point)
+    (define-key map "\M-?" #'comint-dynamic-list-filename-completions)
+    (define-key map "\177" #'backward-delete-char-untabify)
+    (define-key map "\M-\C-x" #'tcl-eval-defun)
+    (define-key map "\C-c\C-i" #'tcl-help-on-word)
+    (define-key map "\C-c\C-v" #'tcl-eval-defun)
+    (define-key map "\C-c\C-f" #'tcl-load-file)
+    (define-key map "\C-c\C-t" #'inferior-tcl)
+    (define-key map "\C-c\C-x" #'tcl-eval-region)
+    (define-key map "\C-c\C-s" #'switch-to-tcl)
     map)
   "Keymap used in `inferior-tcl-mode'.")
 
@@ -356,7 +344,7 @@ information):
 
 Add functions to the hook with `add-hook':
 
-   (add-hook 'tcl-mode-hook 'tcl-guess-application)")
+   (add-hook 'tcl-mode-hook #'tcl-guess-application)")
 
 
 (defvar tcl-proc-list
@@ -461,6 +449,7 @@ This variable is generally set from `tcl-proc-regexp',
             (string-to-syntax "."))))))))
 
 (defconst tcl-syntax-propertize-function
+  ;; FIXME: Handle the [...] commands nested inside "..." strings.
   (syntax-propertize-rules
    ;; Mark the few `#' that are not comment-markers.
    ((concat "[^" tcl--word-delimiters "][ \t]*\\(#\\)") (1 "."))
@@ -629,8 +618,8 @@ already exist."
   (unless (and (boundp 'filladapt-mode) filladapt-mode)
     (set (make-local-variable 'paragraph-ignore-fill-prefix) t))
 
-  (set (make-local-variable 'indent-line-function) 'tcl-indent-line)
-  (set (make-local-variable 'comment-indent-function) 'tcl-comment-indent)
+  (set (make-local-variable 'indent-line-function) #'tcl-indent-line)
+  (set (make-local-variable 'comment-indent-function) #'tcl-comment-indent)
   ;; Tcl doesn't require a final newline.
   ;; (make-local-variable 'require-final-newline)
   ;; (setq require-final-newline t)
@@ -662,7 +651,7 @@ already exist."
   (set (make-local-variable 'parse-sexp-ignore-comments) t)
   (set (make-local-variable 'defun-prompt-regexp) tcl-omit-ws-regexp)
   (set (make-local-variable 'add-log-current-defun-function)
-       'tcl-add-log-defun)
+       #'tcl-add-log-defun)
 
   (setq-local beginning-of-defun-function #'tcl-beginning-of-defun-function)
   (setq-local end-of-defun-function #'tcl-end-of-defun-function)
@@ -1246,7 +1235,7 @@ See documentation for function `inferior-tcl-mode' for 
more information."
   (setq inferior-tcl-buffer "*inferior-tcl*")
   (pop-to-buffer "*inferior-tcl*"))
 
-(defalias 'run-tcl 'inferior-tcl)
+(defalias 'run-tcl #'inferior-tcl)
 
 
 
diff --git a/lisp/simple.el b/lisp/simple.el
index d871be1..e96c7c9 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1344,18 +1344,20 @@ rather than line counts."
   ;; Leave mark at previous position
   (or (region-active-p) (push-mark))
   ;; Move to the specified line number in that buffer.
-  (if (and (not relative) (not widen-automatically))
-      (save-restriction
-        (widen)
-        (goto-char (point-min))
-        (if (eq selective-display t)
-            (re-search-forward "[\n\C-m]" nil 'end (1- line))
-          (forward-line (1- line))))
-    (unless relative (widen))
-    (goto-char (point-min))
-    (if (eq selective-display t)
-       (re-search-forward "[\n\C-m]" nil 'end (1- line))
-      (forward-line (1- line)))))
+  (let ((pos (save-restriction
+               (unless relative (widen))
+               (goto-char (point-min))
+               (if (eq selective-display t)
+                   (re-search-forward "[\n\C-m]" nil 'end (1- line))
+                 (forward-line (1- line)))
+               (point))))
+    (when (and (not relative)
+               (buffer-narrowed-p)
+               widen-automatically
+               ;; Position is outside narrowed part of buffer
+               (or (> (point-min) pos) (> pos (point-max))))
+      (widen))
+    (goto-char pos)))
 
 (defun goto-line-relative (line &optional buffer)
   "Go to LINE, counting from line at (point-min).
diff --git a/lisp/subr.el b/lisp/subr.el
index 8cf5b00..547cf5c 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -901,7 +901,7 @@ This is the same format used for saving keyboard macros (see
 For an approximate inverse of this, see `key-description'."
   ;; Don't use a defalias, since the `pure' property is true only for
   ;; the calling convention of `kbd'.
-  (declare (pure t))
+  (declare (pure t) (side-effect-free t))
   ;; A pure function is expected to preserve the match data.
   (save-match-data (read-kbd-macro keys)))
 
@@ -4451,7 +4451,7 @@ Unless optional argument INPLACE is non-nil, return a new 
string."
 
 (defun string-replace (fromstring tostring instring)
   "Replace FROMSTRING with TOSTRING in INSTRING each time it occurs."
-  (declare (pure t))
+  (declare (pure t) (side-effect-free t))
   (when (equal fromstring "")
     (signal 'wrong-length-argument fromstring))
   (let ((start 0)
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 715379f..fcf63ed 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -387,13 +387,13 @@ If parsing fails, try to set this variable to nil."
      (("author")
       ("howpublished" "The way in which the booklet was published")
       ("address") ("month") ("year") ("note")))
-    ("PhdThesis" "PhD. Thesis"
+    ("PhdThesis" "PhD Thesis"
      (("author")
-      ("title" "Title of the PhD. thesis")
-      ("school" "School where the PhD. thesis was written")
+      ("title" "Title of the PhD thesis")
+      ("school" "School where the PhD thesis was written")
       ("year"))
      nil
-     (("type" "Type of the PhD. thesis")
+     (("type" "Type of the PhD thesis")
       ("address" "Address of the school (if not part of field \"school\") or 
country")
       ("month") ("note")))
     ("MastersThesis" "Master's Thesis"
@@ -467,8 +467,8 @@ alternatives, starting from zero."
       ("year" nil nil 0) ("date" nil nil 0))
      nil
      (("translator") ("annotator") ("commentator") ("subtitle") ("titleaddon")
-      ("editor") ("editora") ("editorb") ("editorc")
-      ("journalsubtitle") ("issuetitle") ("issuesubtitle")
+      ("editor") ("editora") ("editorb") ("editorc") ("journalsubtitle")
+      ("journaltitleaddon") ("issuetitle") ("issuesubtitle") 
("issuetitleaddon")
       ("language") ("origlanguage") ("series") ("volume") ("number") ("eid")
       ("issue") ("month") ("pages") ("version") ("note") ("issn")
       ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
@@ -481,7 +481,7 @@ alternatives, starting from zero."
       ("introduction") ("foreword") ("afterword") ("subtitle") ("titleaddon")
       ("maintitle") ("mainsubtitle") ("maintitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition") ("volumes")
-      ("series") ("number") ("note") ("publisher") ("location") ("isbn")
+      ("series") ("number") ("note") ("publisher") ("location") ("isbn") 
("eid")
       ("chapter") ("pages") ("pagetotal") ("addendum") ("pubstate") ("doi")
       ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("MVBook" "Multi-Volume Book"
@@ -502,7 +502,7 @@ alternatives, starting from zero."
       ("afterword") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition") ("volumes")
-      ("series") ("number") ("note") ("publisher") ("location") ("isbn")
+      ("series") ("number") ("note") ("publisher") ("location") ("isbn") 
("eid")
       ("chapter") ("pages") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("BookInBook" "Book in Collection" ; same as @inbook
@@ -513,7 +513,7 @@ alternatives, starting from zero."
       ("afterword") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition") ("volumes")
-      ("series") ("number") ("note") ("publisher") ("location") ("isbn")
+      ("series") ("number") ("note") ("publisher") ("location") ("isbn") 
("eid")
       ("chapter") ("pages") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("SuppBook" "Supplemental Material in a Book" ; same as @inbook
@@ -524,7 +524,7 @@ alternatives, starting from zero."
       ("afterword") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition") ("volumes")
-      ("series") ("number") ("note") ("publisher") ("location") ("isbn")
+      ("series") ("number") ("note") ("publisher") ("location") ("isbn") 
("eid")
       ("chapter") ("pages") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Booklet" "Booklet (Bound, but no Publisher)"
@@ -532,9 +532,9 @@ alternatives, starting from zero."
       ("year" nil nil 1) ("date" nil nil 1))
      nil
      (("subtitle") ("titleaddon") ("language") ("howpublished") ("type")
-      ("note") ("location") ("chapter") ("pages") ("pagetotal") ("addendum")
-      ("pubstate") ("doi") ("eprint") ("eprintclass") ("eprinttype")
-      ("url") ("urldate")))
+      ("note") ("location") ("eid") ("chapter") ("pages") ("pagetotal")
+      ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
+      ("eprinttype") ("url") ("urldate")))
     ("Collection" "Single-Volume Collection"
      (("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
      nil
@@ -543,8 +543,8 @@ alternatives, starting from zero."
       ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("language") ("origlanguage") ("volume")
       ("part") ("edition") ("volumes") ("series") ("number") ("note")
-      ("publisher") ("location") ("isbn") ("chapter") ("pages") ("pagetotal")
-      ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
+      ("publisher") ("location") ("isbn") ("eid") ("chapter") ("pages")
+      ("pagetotal") ("addendum") ("pubstate") ("doi") ("eprint") 
("eprintclass")
       ("eprinttype") ("url") ("urldate")))
     ("MVCollection" "Multi-Volume Collection"
      (("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
@@ -558,32 +558,40 @@ alternatives, starting from zero."
     ("InCollection" "Article in a Collection"
      (("author") ("title") ("year" nil nil 0) ("date" nil nil 0))
      (("booktitle"))
-     (("editor") ("editora") ("editorb") ("editorc") ("translator") 
("annotator")
-      ("commentator") ("introduction") ("foreword") ("afterword")
+     (("editor") ("editora") ("editorb") ("editorc") ("translator")
+      ("annotator") ("commentator") ("introduction") ("foreword") ("afterword")
       ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition")
       ("volumes") ("series") ("number") ("note") ("publisher") ("location")
-      ("isbn") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
+      ("isbn") ("eid") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
       ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("SuppCollection" "Supplemental Material in a Collection" ; same as 
@incollection
-     (("author") ("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
+     (("author") ("title") ("year" nil nil 0) ("date" nil nil 0))
      (("booktitle"))
-     (("editora") ("editorb") ("editorc") ("translator") ("annotator")
-      ("commentator") ("introduction") ("foreword") ("afterword")
+     (("editor") ("editora") ("editorb") ("editorc") ("translator")
+      ("annotator") ("commentator") ("introduction") ("foreword") ("afterword")
       ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition")
       ("volumes") ("series") ("number") ("note") ("publisher") ("location")
-      ("isbn") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
+      ("isbn") ("eid") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
       ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
+    ("Dataset" "Data Set"
+     (("author" nil nil 0) ("editor" nil nil 0) ("title")
+      ("year" nil nil 1) ("date" nil nil 1))
+     nil
+     (("subtitle") ("titleaddon") ("language") ("edition") ("type") ("series")
+      ("number") ("version") ("note") ("organization") ("publisher")
+      ("location") ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
+      ("eprinttype") ("url") ("urldate")))
     ("Manual" "Technical Manual"
      (("author" nil nil 0) ("editor" nil nil 0) ("title")
       ("year" nil nil 1) ("date" nil nil 1))
      nil
      (("subtitle") ("titleaddon") ("language") ("edition")
       ("type") ("series") ("number") ("version") ("note")
-      ("organization") ("publisher") ("location") ("isbn") ("chapter")
+      ("organization") ("publisher") ("location") ("isbn") ("eid") ("chapter")
       ("pages") ("pagetotal") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Misc" "Miscellaneous"
@@ -592,35 +600,37 @@ alternatives, starting from zero."
      nil
      (("subtitle") ("titleaddon") ("language") ("howpublished") ("type")
       ("version") ("note") ("organization") ("location")
-      ("date") ("month") ("year") ("addendum") ("pubstate")
+      ("month") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Online" "Online Resource"
      (("author" nil nil 0) ("editor" nil nil 0) ("title")
-      ("year" nil nil 1) ("date" nil nil 1) ("url"))
+      ("year" nil nil 1) ("date" nil nil 1)
+      ("doi" nil nil 2) ("eprint" nil nil 2) ("url" nil nil 2))
      nil
      (("subtitle") ("titleaddon") ("language") ("version") ("note")
-      ("organization") ("date") ("month") ("year") ("addendum")
-      ("pubstate") ("urldate")))
+      ("organization") ("month") ("addendum")
+      ("pubstate") ("eprintclass") ("eprinttype") ("urldate")))
     ("Patent" "Patent"
      (("author") ("title") ("number") ("year" nil nil 0) ("date" nil nil 0))
      nil
      (("holder") ("subtitle") ("titleaddon") ("type") ("version") ("location")
-      ("note") ("date") ("month") ("year") ("addendum") ("pubstate")
+      ("note") ("month") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Periodical" "Complete Issue of a Periodical"
      (("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
      nil
-     (("editora") ("editorb") ("editorc") ("subtitle") ("issuetitle")
-      ("issuesubtitle") ("language") ("series") ("volume") ("number") ("issue")
-      ("date") ("month") ("year") ("note") ("issn") ("addendum") ("pubstate")
+     (("editora") ("editorb") ("editorc") ("subtitle") ("titleaddon")
+      ("issuetitle") ("issuesubtitle") ("issuetitleaddon") ("language")
+      ("series") ("volume") ("number") ("issue")
+      ("month") ("note") ("issn") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("SuppPeriodical" "Supplemental Material in a Periodical" ; same as 
@article
      (("author") ("title") ("journaltitle")
       ("year" nil nil 0) ("date" nil nil 0))
      nil
      (("translator") ("annotator") ("commentator") ("subtitle") ("titleaddon")
-      ("editor") ("editora") ("editorb") ("editorc")
-      ("journalsubtitle") ("issuetitle") ("issuesubtitle")
+      ("editor") ("editora") ("editorb") ("editorc") ("journalsubtitle")
+      ("journaltitleaddon") ("issuetitle") ("issuesubtitle") 
("issuetitleaddon")
       ("language") ("origlanguage") ("series") ("volume") ("number") ("eid")
       ("issue") ("month") ("pages") ("version") ("note") ("issn")
       ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
@@ -628,19 +638,19 @@ alternatives, starting from zero."
     ("Proceedings" "Single-Volume Conference Proceedings"
      (("title") ("year" nil nil 0) ("date" nil nil 0))
      nil
-     (("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
-      ("maintitleaddon") ("eventtitle") ("eventdate") ("venue") ("language")
-      ("editor")
-      ("volume") ("part") ("volumes") ("series") ("number") ("note")
-      ("organization") ("publisher") ("location") ("month")
-      ("isbn") ("chapter") ("pages") ("pagetotal") ("addendum") ("pubstate")
-      ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
+     (("editor") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
+      ("maintitleaddon") ("eventtitle") ("eventtitleaddon") ("eventdate")
+      ("venue") ("language") ("volume") ("part") ("volumes") ("series")
+      ("number") ("note") ("organization") ("publisher") ("location") ("month")
+      ("isbn") ("eid") ("chapter") ("pages") ("pagetotal") ("addendum")
+      ("pubstate") ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url")
+      ("urldate")))
     ("MVProceedings" "Multi-Volume Conference Proceedings"
-     (("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
+     (("title") ("year" nil nil 0) ("date" nil nil 0))
      nil
-     (("subtitle") ("titleaddon") ("eventtitle") ("eventdate") ("venue")
-      ("language") ("volumes") ("series") ("number") ("note")
-      ("organization") ("publisher") ("location") ("month")
+     (("editor") ("subtitle") ("titleaddon") ("eventtitle") ("eventtitleaddon")
+      ("eventdate") ("venue") ("language") ("volumes") ("series") ("number")
+      ("note") ("organization") ("publisher") ("location") ("month")
       ("isbn") ("pagetotal") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("InProceedings" "Article in Conference Proceedings"
@@ -648,9 +658,9 @@ alternatives, starting from zero."
      (("booktitle"))
      (("editor") ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
-      ("eventtitle") ("eventdate") ("venue") ("language")
+      ("eventtitle") ("eventtitleaddon") ("eventdate") ("venue") ("language")
       ("volume") ("part") ("volumes") ("series") ("number") ("note")
-      ("organization") ("publisher") ("location") ("month") ("isbn")
+      ("organization") ("publisher") ("location") ("month") ("isbn") ("eid")
       ("chapter") ("pages") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Reference" "Single-Volume Work of Reference" ; same as @collection
@@ -661,8 +671,8 @@ alternatives, starting from zero."
       ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("language") ("origlanguage") ("volume")
       ("part") ("edition") ("volumes") ("series") ("number") ("note")
-      ("publisher") ("location") ("isbn") ("chapter") ("pages") ("pagetotal")
-      ("addendum") ("pubstate") ("doi") ("eprint") ("eprintclass")
+      ("publisher") ("location") ("isbn") ("eid") ("chapter") ("pages")
+      ("pagetotal") ("addendum") ("pubstate") ("doi") ("eprint") 
("eprintclass")
       ("eprinttype") ("url") ("urldate")))
     ("MVReference" "Multi-Volume Work of Reference" ; same as @mvcollection
      (("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
@@ -674,42 +684,51 @@ alternatives, starting from zero."
       ("location") ("isbn") ("pagetotal") ("addendum") ("pubstate") ("doi")
       ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("InReference" "Article in a Work of Reference" ; same as @incollection
-     (("author") ("editor") ("title") ("year" nil nil 0) ("date" nil nil 0))
+     (("author") ("title") ("year" nil nil 0) ("date" nil nil 0))
      (("booktitle"))
-     (("editora") ("editorb") ("editorc") ("translator") ("annotator")
-      ("commentator") ("introduction") ("foreword") ("afterword")
+     (("editor") ("editora") ("editorb") ("editorc") ("translator")
+      ("annotator") ("commentator") ("introduction") ("foreword") ("afterword")
       ("subtitle") ("titleaddon") ("maintitle") ("mainsubtitle")
       ("maintitleaddon") ("booksubtitle") ("booktitleaddon")
       ("language") ("origlanguage") ("volume") ("part") ("edition")
       ("volumes") ("series") ("number") ("note") ("publisher") ("location")
-      ("isbn") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
+      ("isbn") ("eid") ("chapter") ("pages") ("addendum") ("pubstate") ("doi")
       ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Report" "Technical or Research Report"
      (("author") ("title") ("type") ("institution")
       ("year" nil nil 0) ("date" nil nil 0))
      nil
      (("subtitle") ("titleaddon") ("language") ("number") ("version") ("note")
-      ("location") ("month") ("isrn") ("chapter") ("pages") ("pagetotal")
-      ("addendum") ("pubstate")
+      ("location") ("month") ("isrn") ("eid") ("chapter") ("pages")
+      ("pagetotal") ("addendum") ("pubstate")
+      ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
+    ("Software" "Computer Software" ; Same as @misc.
+     (("author" nil nil 0) ("editor" nil nil 0) ("title")
+      ("year" nil nil 1) ("date" nil nil 1))
+     nil
+     (("subtitle") ("titleaddon") ("language") ("howpublished") ("type")
+      ("version") ("note") ("organization") ("location")
+      ("month") ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
-    ("Thesis" "PhD. or Master's Thesis"
+    ("Thesis" "PhD or Master's Thesis"
      (("author") ("title") ("type") ("institution")
       ("year" nil nil 0) ("date" nil nil 0))
      nil
      (("subtitle") ("titleaddon") ("language") ("note") ("location")
-      ("month") ("isbn") ("chapter") ("pages") ("pagetotal")
+      ("month") ("isbn") ("eid") ("chapter") ("pages") ("pagetotal")
       ("addendum") ("pubstate")
       ("doi") ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate")))
     ("Unpublished" "Unpublished"
      (("author") ("title") ("year" nil nil 0) ("date" nil nil 0))
      nil
-     (("subtitle") ("titleaddon") ("language") ("howpublished")
-      ("note") ("location") ("isbn") ("date") ("month") ("year")
-      ("addendum") ("pubstate") ("url") ("urldate"))))
+     (("subtitle") ("titleaddon") ("type") ("eventtitle") ("eventtitleaddon")
+      ("eventdate") ("venue") ("language") ("howpublished") ("note")
+      ("location") ("isbn") ("month") ("addendum") ("pubstate") ("doi")
+      ("eprint") ("eprintclass") ("eprinttype") ("url") ("urldate"))))
   "Alist of biblatex entry types and their associated fields.
 It has the same format as `bibtex-BibTeX-entry-alist'."
   :group 'bibtex
-  :version "24.1"
+  :version "28.1"
   :type 'bibtex-entry-alist
   :risky t)
 
@@ -766,6 +785,7 @@ if `bibtex-BibTeX-entry-alist' does not define a comment 
for FIELD."
     ("eprinttype" "Type of eprint identifier")
     ("eventdate" "Date of a conference or some other event")
     ("eventtitle" "Title of a conference or some other event")
+    ("eventtitleaddon" "Annex to the eventtitle (e.g., acronym of known 
event)")
     ("file" "Local link to an electronic version of the work")
     ("foreword" "Author(s) of a foreword to the work")
     ("holder" "Holder(s) of a patent")
@@ -781,9 +801,11 @@ if `bibtex-BibTeX-entry-alist' does not define a comment 
for FIELD."
     ("issue" "Issue of a journal")
     ("issuesubtitle" "Subtitle of a specific issue of a journal or other 
periodical.")
     ("issuetitle" "Title of a specific issue of a journal or other 
periodical.")
+    ("issuetitleaddon" "Annex to the issuetitle")
     ("iswc" "International Standard Work Code of a musical work")
     ("journalsubtitle" "Subtitle of a journal, a newspaper, or some other 
periodical.")
     ("journaltitle" "Name of a journal, a newspaper, or some other 
periodical.")
+    ("journaltitleaddon" "Annex to the journaltitle")
     ("label" "Substitute for the regular label to be used by the citation 
style")
     ("language" "Language(s) of the work")
     ("library" "Library name and a call number")
@@ -811,6 +833,8 @@ if `bibtex-BibTeX-entry-alist' does not define a comment 
for FIELD."
     ("series" "Name of a publication series")
     ("shortauthor" "Author(s) of the work, given in an abbreviated form")
     ("shorteditor" "Editor(s) of the work, given in an abbreviated form")
+    ("shorthand" "Special designation overriding the default label")
+    ("shorthandintro" "Phrase overriding the standard shorthand introduction")
     ("shortjournal" "Short version or an acronym of the journal title")
     ("shortseries" "Short version or an acronym of the series field")
     ("shorttitle" "Title in an abridged form")
@@ -829,7 +853,7 @@ if `bibtex-BibTeX-entry-alist' does not define a comment 
for FIELD."
     "Alist of biblatex fields.
 It has the same format as `bibtex-BibTeX-entry-alist'."
   :group 'bibtex
-  :version "24.1"
+  :version "28.1"
   :type 'bibtex-field-alist)
 
 (defcustom bibtex-dialect-list '(BibTeX biblatex)
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 05a4bd0..3358cf1 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -684,13 +684,9 @@ Otherwise returns the library directory name, if that is 
defined."
     (with-temp-buffer
       (setq status (ispell-call-process
                    ispell-program-name nil t nil
-                   ;; aspell doesn't accept the -vv switch.
                    (let ((case-fold-search
-                          (memq system-type '(ms-dos windows-nt)))
-                         (speller
-                          (file-name-nondirectory ispell-program-name)))
-                     ;; Assume anything that isn't `aspell' is Ispell.
-                     (if (string-match "\\`aspell" speller) "-v" "-vv"))))
+                          (memq system-type '(ms-dos windows-nt))))
+                     "-vv")))
       (goto-char (point-min))
       (if interactivep
          ;; Report version information of ispell
@@ -771,18 +767,23 @@ Otherwise returns the library directory name, if that is 
defined."
            (setq ispell-really-hunspell nil))))))
     result))
 
+(defmacro ispell-with-safe-default-directory (&rest body)
+  "Execute the forms in BODY with a reasonable
+`default-directory'."
+  (declare (indent 0) (debug t))
+  `(let ((default-directory default-directory))
+     (unless (file-accessible-directory-p default-directory)
+       (setq default-directory (expand-file-name "~/")))
+     ,@body))
+
 (defun ispell-call-process (&rest args)
-  "Like `call-process' but defend against bad `default-directory'."
-  (let ((default-directory default-directory))
-    (unless (file-accessible-directory-p default-directory)
-      (setq default-directory (expand-file-name "~/")))
+  "Like `call-process', but defend against bad `default-directory'."
+  (ispell-with-safe-default-directory
     (apply 'call-process args)))
 
 (defun ispell-call-process-region (&rest args)
-  "Like `call-process-region' but defend against bad `default-directory'."
-  (let ((default-directory default-directory))
-    (unless (file-accessible-directory-p default-directory)
-      (setq default-directory (expand-file-name "~/")))
+  "Like `call-process-region', but defend against bad `default-directory'."
+  (ispell-with-safe-default-directory
     (apply 'call-process-region args)))
 
 (defvar ispell-debug-buffer)
@@ -1216,13 +1217,14 @@ Internal use.")
 (defun ispell--call-enchant-lsmod (&rest args)
   "Call enchant-lsmod with ARGS and return the output as string."
   (with-output-to-string
-    (with-current-buffer
-        standard-output
+    (with-current-buffer standard-output
       (apply #'ispell-call-process
              (replace-regexp-in-string "enchant\\(-[0-9]\\)?\\'"
                                        "enchant-lsmod\\1"
                                        ispell-program-name)
-             nil t nil args))))
+             ;; We discard stderr here because enchant-lsmod can emit
+             ;; unrelated warnings that will confuse us.
+             nil '(t nil) nil args))))
 
 (defun ispell--get-extra-word-characters (&optional lang)
   "Get the extra word characters for LANG as a character class.
diff --git a/lisp/url/url-dired.el b/lisp/url/url-dired.el
index ba68fe1..fa75a0a 100644
--- a/lisp/url/url-dired.el
+++ b/lisp/url/url-dired.el
@@ -1,4 +1,4 @@
-;;; url-dired.el --- URL Dired minor mode
+;;; url-dired.el --- URL Dired minor mode  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1996-1999, 2004-2020 Free Software Foundation, Inc.
 
diff --git a/lisp/url/url-ftp.el b/lisp/url/url-ftp.el
index a436a43..50b21bd 100644
--- a/lisp/url/url-ftp.el
+++ b/lisp/url/url-ftp.el
@@ -1,4 +1,4 @@
-;;; url-ftp.el --- FTP wrapper
+;;; url-ftp.el --- FTP wrapper  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1996-1999, 2004-2020 Free Software Foundation, Inc.
 
diff --git a/lisp/url/url-irc.el b/lisp/url/url-irc.el
index 9647df1..3ff6e64 100644
--- a/lisp/url/url-irc.el
+++ b/lisp/url/url-irc.el
@@ -1,4 +1,4 @@
-;;; url-irc.el --- IRC URL interface
+;;; url-irc.el --- IRC URL interface  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1996-1999, 2004-2020 Free Software Foundation, Inc.
 
@@ -48,6 +48,8 @@ PASSWORD - What password to use"
 ;; External.
 (declare-function zenirc "ext:zenirc" (&optional prefix))
 (declare-function zenirc-send-line "ext:zenirc" ())
+(defvar zenirc-server-alist)
+(defvar zenirc-buffer-name)
 
 (defun url-irc-zenirc (host port channel user password)
   (let ((zenirc-buffer-name (if (and user host port)
@@ -65,7 +67,7 @@ PASSWORD - What password to use"
 
 (defun url-irc-rcirc (host port channel user password)
   (let ((chan (when channel (concat "#" channel))))
-    (rcirc-connect host port user nil nil (when chan (list chan)))
+    (rcirc-connect host port user nil nil (when chan (list chan)) password)
     (when chan
       (switch-to-buffer (concat chan "@" host)))))
 
diff --git a/lisp/vc/smerge-mode.el b/lisp/vc/smerge-mode.el
index d0a83fd..fe7724d 100644
--- a/lisp/vc/smerge-mode.el
+++ b/lisp/vc/smerge-mode.el
@@ -1352,24 +1352,26 @@ buffer names."
     ;; Do a few further adjustments and take precautions for exit.
     (set (make-local-variable 'smerge-ediff-windows) config)
     (set (make-local-variable 'smerge-ediff-buf) buf)
-    (set (make-local-variable 'ediff-quit-hook)
-        (lambda ()
-          (let ((buffer-A ediff-buffer-A)
-                (buffer-B ediff-buffer-B)
-                (buffer-C ediff-buffer-C)
-                (buffer-Ancestor ediff-ancestor-buffer)
-                (buf smerge-ediff-buf)
-                (windows smerge-ediff-windows))
-            (ediff-cleanup-mess)
-            (with-current-buffer buf
-              (erase-buffer)
-              (insert-buffer-substring buffer-C)
-              (kill-buffer buffer-A)
-              (kill-buffer buffer-B)
-              (kill-buffer buffer-C)
-              (when (bufferp buffer-Ancestor) (kill-buffer buffer-Ancestor))
-              (set-window-configuration windows)
-              (message "Conflict resolution finished; you may save the 
buffer")))))
+    (add-hook 'ediff-quit-hook
+             (lambda ()
+               (let ((buffer-A ediff-buffer-A)
+                     (buffer-B ediff-buffer-B)
+                     (buffer-C ediff-buffer-C)
+                     (buffer-Ancestor ediff-ancestor-buffer)
+                     (buf smerge-ediff-buf)
+                     (windows smerge-ediff-windows))
+                 (ediff-cleanup-mess)
+                 (with-current-buffer buf
+                   (erase-buffer)
+                   (insert-buffer-substring buffer-C)
+                   (kill-buffer buffer-A)
+                   (kill-buffer buffer-B)
+                   (kill-buffer buffer-C)
+                   (when (bufferp buffer-Ancestor)
+                     (kill-buffer buffer-Ancestor))
+                   (set-window-configuration windows)
+                   (message "Conflict resolution finished; you may save the 
buffer"))))
+             nil t)
     (message "Please resolve conflicts now; exit ediff when done")))
 
 (defun smerge-makeup-conflict (pt1 pt2 pt3 &optional pt4)
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index 99bf5bf..932b915 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -138,7 +138,9 @@ preserve the setting."
 ;; Variables the user doesn't need to know about.
 
 (defvar vc-log-operation nil)
-(defvar vc-log-after-operation-hook nil)
+(defvar vc-log-after-operation-hook nil
+  "Name of the hook run at the end of `vc-finish-logentry'.
+BEWARE: Despite its name, this variable is not itself a hook!")
 (defvar vc-log-fileset)
 
 ;; In a log entry buffer, this is a local variable
diff --git a/lisp/wdired.el b/lisp/wdired.el
index da162b7..bb32da3 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -482,7 +482,7 @@ non-nil means return old filename."
     (when files-deleted
       (wdired-flag-for-deletion files-deleted))
     (when (> errors 0)
-      (dired-log-summary (format "%d rename actions failed" errors) nil)))
+      (dired-log-summary (format "%d actions failed" errors) nil)))
   (set-buffer-modified-p nil)
   (setq buffer-undo-list nil))
 
@@ -911,26 +911,26 @@ Like original function but it skips read-only words."
   (mouse-set-point event)
   (wdired-toggle-bit))
 
-;; Allowed chars for 4000 bit are Ss  in position 3
-;; Allowed chars for 2000 bit are Ssl in position 6
-;; Allowed chars for 1000 bit are Tt  in position 9
+;; Allowed chars for #o4000 bit are Ss  in position 3
+;; Allowed chars for #o2000 bit are Ssl in position 6
+;; Allowed chars for #o1000 bit are Tt  in position 9
 (defun wdired-perms-to-number (perms)
-  (let ((nperm 0777))
-    (if (= (elt perms 1) ?-) (setq nperm (- nperm 400)))
-    (if (= (elt perms 2) ?-) (setq nperm (- nperm 200)))
+  (let ((nperm #o0777))
+    (if (= (elt perms 1) ?-) (setq nperm (- nperm #o400)))
+    (if (= (elt perms 2) ?-) (setq nperm (- nperm #o200)))
     (let ((p-bit (elt perms 3)))
-      (if (memq p-bit '(?- ?S)) (setq nperm (- nperm 100)))
-      (if (memq p-bit '(?s ?S)) (setq nperm (+ nperm 4000))))
-    (if (= (elt perms 4) ?-) (setq nperm (- nperm 40)))
-    (if (= (elt perms 5) ?-) (setq nperm (- nperm 20)))
+      (if (memq p-bit '(?- ?S)) (setq nperm (- nperm #o100)))
+      (if (memq p-bit '(?s ?S)) (setq nperm (+ nperm #o4000))))
+    (if (= (elt perms 4) ?-) (setq nperm (- nperm #o40)))
+    (if (= (elt perms 5) ?-) (setq nperm (- nperm #o20)))
     (let ((p-bit (elt perms 6)))
-      (if (memq p-bit '(?- ?S ?l)) (setq nperm (- nperm 10)))
-      (if (memq p-bit '(?s ?S ?l)) (setq nperm (+ nperm 2000))))
+      (if (memq p-bit '(?- ?S ?l)) (setq nperm (- nperm #o10)))
+      (if (memq p-bit '(?s ?S ?l)) (setq nperm (+ nperm #o2000))))
     (if (= (elt perms 7) ?-) (setq nperm (- nperm 4)))
     (if (= (elt perms 8) ?-) (setq nperm (- nperm 2)))
     (let ((p-bit (elt perms 9)))
       (if (memq p-bit '(?- ?T)) (setq nperm (- nperm 1)))
-      (if (memq p-bit '(?t ?T)) (setq nperm (+ nperm 1000))))
+      (if (memq p-bit '(?t ?T)) (setq nperm (+ nperm #o1000))))
     nperm))
 
 ;; Perform the changes in the permissions of the files that have
@@ -940,7 +940,7 @@ Like original function but it skips read-only words."
        (errors 0)
        (prop-wanted (if (eq wdired-allow-to-change-permissions 'advanced)
                         'old-perm 'perm-changed))
-       filename perms-ori perms-new perm-tmp)
+       filename perms-ori perms-new)
     (goto-char (next-single-property-change (point-min) prop-wanted
                                            nil (point-max)))
     (while (not (eobp))
@@ -951,14 +951,12 @@ Like original function but it skips read-only words."
         (setq changes t)
         (setq filename (wdired-get-filename nil t))
         (if (= (length perms-new) 10)
-            (progn
-              (setq perm-tmp
-                    (string-to-number
-                     (int-to-string (wdired-perms-to-number perms-new)) 8))
-              (unless (set-file-modes filename perm-tmp)
-                (setq errors (1+ errors))
-                (dired-log "%s %s `%s' failed\n\n"
-                           dired-chmod-program perm-tmp filename)))
+            (condition-case nil
+                (set-file-modes filename (wdired-perms-to-number perms-new))
+              (error
+               (setq errors (1+ errors))
+               (dired-log "Setting mode of `%s' to `%s' failed\n\n"
+                          filename perms-new)))
           (setq errors (1+ errors))
           (dired-log "Cannot parse permission `%s' for file `%s'\n\n"
                      perms-new filename)))
diff --git a/src/buffer.c b/src/buffer.c
index 241f2d4..4fd2b0c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5645,6 +5645,9 @@ Use the command `abbrev-mode' to change this variable.  
*/);
   DEFVAR_PER_BUFFER ("fill-column", &BVAR (current_buffer, fill_column),
                     Qintegerp,
                     doc: /* Column beyond which automatic line-wrapping should 
happen.
+It is used by filling commands, such as `fill-region' and `fill-paragraph',
+and by `auto-fill-mode', which see.
+See also `current-fill-column'.
 Interactively, you can set the buffer local value using \\[set-fill-column].  
*/);
 
   DEFVAR_PER_BUFFER ("left-margin", &BVAR (current_buffer, left_margin),
diff --git a/src/character.c b/src/character.c
index 5860f6a..00b7329 100644
--- a/src/character.c
+++ b/src/character.c
@@ -982,6 +982,27 @@ printablep (int c)
            || gen_cat == UNICODE_CATEGORY_Cn)); /* unassigned */
 }
 
+/* Return true if C is graphic character that can be printed independently.  */
+bool
+graphic_base_p (int c)
+{
+  Lisp_Object category = CHAR_TABLE_REF (Vunicode_category_table, c);
+  if (! FIXNUMP (category))
+    return false;
+  EMACS_INT gen_cat = XFIXNUM (category);
+
+  return (!(gen_cat == UNICODE_CATEGORY_Mn       /* mark, nonspacing */
+            || gen_cat == UNICODE_CATEGORY_Mc    /* mark, combining */
+            || gen_cat == UNICODE_CATEGORY_Me    /* mark, enclosing */
+            || gen_cat == UNICODE_CATEGORY_Zs    /* separator, space */
+            || gen_cat == UNICODE_CATEGORY_Zl    /* separator, line */
+            || gen_cat == UNICODE_CATEGORY_Zp    /* separator, paragraph */
+            || gen_cat == UNICODE_CATEGORY_Cc    /* other, control */
+            || gen_cat == UNICODE_CATEGORY_Cs    /* other, surrogate */
+            || gen_cat == UNICODE_CATEGORY_Cf    /* other, format */
+            || gen_cat == UNICODE_CATEGORY_Cn)); /* other, unassigned */
+}
+
 /* Return true if C is a horizontal whitespace character, as defined
    by https://www.unicode.org/reports/tr18/tr18-19.html#blank.  */
 bool
diff --git a/src/character.h b/src/character.h
index af5023f..cbf4309 100644
--- a/src/character.h
+++ b/src/character.h
@@ -583,6 +583,7 @@ extern bool alphanumericp (int);
 extern bool graphicp (int);
 extern bool printablep (int);
 extern bool blankp (int);
+extern bool graphic_base_p (int);
 
 /* Look up the element in char table OBJ at index CH, and return it as
    an integer.  If the element is not a character, return CH itself.  */
diff --git a/src/dired.c b/src/dired.c
index 8256f26..feb5f05 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -165,8 +165,16 @@ read_dirent (DIR *dir, Lisp_Object dirname)
 Lisp_Object
 directory_files_internal (Lisp_Object directory, Lisp_Object full,
                          Lisp_Object match, Lisp_Object nosort, bool attrs,
-                         Lisp_Object id_format)
+                         Lisp_Object id_format, Lisp_Object return_count)
 {
+  EMACS_INT ind = 0, last = MOST_POSITIVE_FIXNUM;
+
+  if (!NILP (return_count))
+    {
+      CHECK_FIXNAT (return_count);
+      last = XFIXNAT (return_count);
+    }
+
   if (!NILP (match))
     CHECK_STRING (match);
 
@@ -267,6 +275,10 @@ directory_files_internal (Lisp_Object directory, 
Lisp_Object full,
       else
        finalname = name;
 
+      if (ind == last)
+          break;
+      ind ++;
+
       list = Fcons (attrs ? Fcons (finalname, fileattrs) : finalname, list);
     }
 
@@ -288,18 +300,20 @@ directory_files_internal (Lisp_Object directory, 
Lisp_Object full,
 }
 
 
-DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 4, 0,
+DEFUN ("directory-files", Fdirectory_files, Sdirectory_files, 1, 5, 0,
        doc: /* Return a list of names of files in DIRECTORY.
-There are three optional arguments:
+There are four optional arguments:
 If FULL is non-nil, return absolute file names.  Otherwise return names
  that are relative to the specified directory.
 If MATCH is non-nil, mention only file names whose non-directory part
  matches the regexp MATCH.
 If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
  Otherwise, the list returned is sorted with `string-lessp'.
- NOSORT is useful if you plan to sort the result yourself.  */)
+ NOSORT is useful if you plan to sort the result yourself.
+If COUNT is non-nil and a natural number, the function will return
+ COUNT number of file names (if so many are present).  */)
   (Lisp_Object directory, Lisp_Object full, Lisp_Object match,
-   Lisp_Object nosort)
+   Lisp_Object nosort, Lisp_Object count)
 {
   directory = Fexpand_file_name (directory, Qnil);
 
@@ -307,14 +321,15 @@ If NOSORT is non-nil, the list is not sorted--its order 
is unpredictable.
      call the corresponding file name handler.  */
   Lisp_Object handler = Ffind_file_name_handler (directory, Qdirectory_files);
   if (!NILP (handler))
-    return call5 (handler, Qdirectory_files, directory,
-                  full, match, nosort);
+    return call6 (handler, Qdirectory_files, directory,
+                  full, match, nosort, count);
 
-  return directory_files_internal (directory, full, match, nosort, false, 
Qnil);
+  return directory_files_internal (directory, full, match, nosort,
+                                   false, Qnil, count);
 }
 
 DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
-       Sdirectory_files_and_attributes, 1, 5, 0,
+       Sdirectory_files_and_attributes, 1, 6, 0,
        doc: /* Return a list of names of files and their attributes in 
DIRECTORY.
 Value is a list of the form:
 
@@ -323,7 +338,7 @@ Value is a list of the form:
 where each FILEn-ATTRS is the attributes of FILEn as returned
 by `file-attributes'.
 
-This function accepts four optional arguments:
+This function accepts five optional arguments:
 If FULL is non-nil, return absolute file names.  Otherwise return names
  that are relative to the specified directory.
 If MATCH is non-nil, mention only file names whose non-directory part
@@ -332,10 +347,12 @@ If NOSORT is non-nil, the list is not sorted--its order 
is unpredictable.
  NOSORT is useful if you plan to sort the result yourself.
 ID-FORMAT specifies the preferred format of attributes uid and gid, see
  `file-attributes' for further documentation.
+If COUNT is non-nil and a natural number, the function will return
+ COUNT number of file names (if so many are present).
 On MS-Windows, performance depends on `w32-get-true-file-attributes',
 which see.  */)
   (Lisp_Object directory, Lisp_Object full, Lisp_Object match,
-   Lisp_Object nosort, Lisp_Object id_format)
+   Lisp_Object nosort, Lisp_Object id_format, Lisp_Object count)
 {
   directory = Fexpand_file_name (directory, Qnil);
 
@@ -344,11 +361,11 @@ which see.  */)
   Lisp_Object handler
     = Ffind_file_name_handler (directory, Qdirectory_files_and_attributes);
   if (!NILP (handler))
-    return call6 (handler, Qdirectory_files_and_attributes,
-                  directory, full, match, nosort, id_format);
+    return call7 (handler, Qdirectory_files_and_attributes,
+                  directory, full, match, nosort, id_format, count);
 
   return directory_files_internal (directory, full, match, nosort,
-                                  true, id_format);
+                                  true, id_format, count);
 }
 
 
diff --git a/src/emacs.c b/src/emacs.c
index e8a59eb..03566c8 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -170,7 +170,7 @@ static uintmax_t heap_bss_diff;
    We mark being in the exec'd process by a daemon name argument of
    form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
    NAME is the original daemon name, if any. */
-#if defined NS_IMPL_COCOA || (defined HAVE_NTGUI && defined CYGWIN)
+#if defined NS_IMPL_COCOA || defined CYGWIN
 # define DAEMON_MUST_EXEC
 #endif
 
diff --git a/src/frame.c b/src/frame.c
index 7c377da..512aaf5 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1482,6 +1482,7 @@ do_switch_frame (Lisp_Object frame, int track, int 
for_deletion, Lisp_Object nor
 #endif
     internal_last_event_frame = Qnil;
 
+  move_minibuffer_onto_frame ();
   return frame;
 }
 
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index a10308c..b895107 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -84,7 +84,12 @@ ftcrfont_glyph_extents (struct font *font,
       cache->lbearing = floor (extents.x_bearing);
       cache->rbearing = ceil (extents.width + extents.x_bearing);
       cache->width = lround (extents.x_advance);
-      cache->ascent = ceil (- extents.y_bearing);
+      /* The subtraction of a small number is to avoid rounding up due
+        to floating-point inaccuracies with some fonts, which then
+        could cause unpleasant effects while scrolling (see bug
+        #44284), since we then think that a glyph row's ascent is too
+        small to accommodate a glyph with a higher phys_ascent.  */
+      cache->ascent = ceil (- extents.y_bearing - 1.0 / 256);
       cache->descent = ceil (extents.height + extents.y_bearing);
     }
 
diff --git a/src/image.c b/src/image.c
index 61c5aa7..c857b8e 100644
--- a/src/image.c
+++ b/src/image.c
@@ -9808,11 +9808,11 @@ svg_load_image (struct frame *f, struct image *img, 
char *contents,
 
   /* Get the image dimensions.  */
 #if LIBRSVG_CHECK_VERSION (2, 46, 0)
-  RsvgRectangle zero_rect, viewbox;
+  RsvgRectangle zero_rect, viewbox, out_logical_rect;
 
   rsvg_handle_get_geometry_for_layer (rsvg_handle, NULL,
                                       &zero_rect, &viewbox,
-                                      NULL, NULL);
+                                      &out_logical_rect, NULL);
   viewbox_width = viewbox.x + viewbox.width;
   viewbox_height = viewbox.y + viewbox.height;
 #else
diff --git a/src/keyboard.c b/src/keyboard.c
index 2e01433..49a0a8b 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -7005,12 +7005,8 @@ tty_read_avail_input (struct terminal *terminal,
   if (gpm_tty == tty)
   {
       Gpm_Event event;
-      struct input_event gpm_hold_quit;
       int gpm, fd = gpm_fd;
 
-      EVENT_INIT (gpm_hold_quit);
-      gpm_hold_quit.kind = NO_EVENT;
-
       /* gpm==1 if event received.
          gpm==0 if the GPM daemon has closed the connection, in which case
                 Gpm_GetEvent closes gpm_fd and clears it to -1, which is why
@@ -7018,13 +7014,11 @@ tty_read_avail_input (struct terminal *terminal,
                select masks.
          gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal.  */
       while (gpm = Gpm_GetEvent (&event), gpm == 1) {
-         nread += handle_one_term_event (tty, &event, &gpm_hold_quit);
+         nread += handle_one_term_event (tty, &event);
       }
       if (gpm == 0)
        /* Presumably the GPM daemon has closed the connection.  */
        close_gpm (fd);
-      if (gpm_hold_quit.kind != NO_EVENT)
-         kbd_buffer_store_event (&gpm_hold_quit);
       if (nread)
          return nread;
   }
diff --git a/src/kqueue.c b/src/kqueue.c
index adbb8d9..590b747 100644
--- a/src/kqueue.c
+++ b/src/kqueue.c
@@ -128,7 +128,7 @@ kqueue_compare_dir_list (Lisp_Object watch_object)
     return;
   }
   new_directory_files =
-    directory_files_internal (dir, Qnil, Qnil, Qnil, true, Qnil);
+    directory_files_internal (dir, Qnil, Qnil, Qnil, true, Qnil, Qnil);
   new_dl = kqueue_directory_listing (new_directory_files);
 
   /* Parse through the old list.  */
@@ -452,7 +452,8 @@ only when the upper directory of the renamed file is 
watched.  */)
   if (NILP (Ffile_directory_p (file)))
     watch_object = list4 (watch_descriptor, file, flags, callback);
   else {
-    dir_list = directory_files_internal (file, Qnil, Qnil, Qnil, true, Qnil);
+    dir_list = directory_files_internal (file, Qnil, Qnil, Qnil, true, Qnil,
+                                         Qnil);
     watch_object = list5 (watch_descriptor, file, flags, callback, dir_list);
   }
   watch_list = Fcons (watch_object, watch_list);
diff --git a/src/lisp.h b/src/lisp.h
index 4b0592e..31d2b5f 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4356,6 +4356,8 @@ extern void clear_regexp_cache (void);
 
 extern Lisp_Object Vminibuffer_list;
 extern Lisp_Object last_minibuf_string;
+extern void move_minibuffer_onto_frame (void);
+extern bool is_minibuffer (EMACS_INT, Lisp_Object);
 extern Lisp_Object get_minibuffer (EMACS_INT);
 extern void init_minibuf_once (void);
 extern void syms_of_minibuf (void);
@@ -4633,7 +4635,7 @@ extern void syms_of_ccl (void);
 extern void syms_of_dired (void);
 extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
                                              Lisp_Object, Lisp_Object,
-                                             bool, Lisp_Object);
+                                             bool, Lisp_Object, Lisp_Object);
 
 /* Defined in term.c.  */
 extern int *char_ins_del_vector;
diff --git a/src/minibuf.c b/src/minibuf.c
index f957b2a..068086e 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -64,6 +64,12 @@ static Lisp_Object minibuf_prompt;
 static ptrdiff_t minibuf_prompt_width;
 
 
+static bool
+minibuf_follows_frame (void)
+{
+  return !NILP (Fdefault_toplevel_value (Qminibuffer_follows_selected_frame));
+}
+
 /* Put minibuf on currently selected frame's minibuffer.
    We do this whenever the user starts a new minibuffer
    or when a minibuffer exits.  */
@@ -76,37 +82,72 @@ choose_minibuf_frame (void)
       && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window))
     {
       struct frame *sf = XFRAME (selected_frame);
-      Lisp_Object buffer;
-
       /* I don't think that any frames may validly have a null minibuffer
         window anymore.  */
       if (NILP (sf->minibuffer_window))
        emacs_abort ();
 
-      /* Under X, we come here with minibuf_window being the
-        minibuffer window of the unused termcap window created in
-        init_window_once.  That window doesn't have a buffer.  */
-      buffer = XWINDOW (minibuf_window)->contents;
-      if (BUFFERP (buffer))
-       /* Use set_window_buffer instead of Fset_window_buffer (see
-          discussion of bug#11984, bug#12025, bug#12026).  */
-       set_window_buffer (sf->minibuffer_window, buffer, 0, 0);
       minibuf_window = sf->minibuffer_window;
+      /* If we've still got another minibuffer open, use its mini-window
+         instead.  */
+      if (minibuf_level && !minibuf_follows_frame ())
+        {
+          Lisp_Object buffer = get_minibuffer (minibuf_level);
+          Lisp_Object tail, frame;
+
+          FOR_EACH_FRAME (tail, frame)
+            if (EQ (XWINDOW (XFRAME (frame)->minibuffer_window)->contents,
+                    buffer))
+              {
+                minibuf_window = XFRAME (frame)->minibuffer_window;
+                break;
+              }
+        }
     }
 
-  /* Make sure no other frame has a minibuffer as its selected window,
-     because the text would not be displayed in it, and that would be
-     confusing.  Only allow the selected frame to do this,
-     and that only if the minibuffer is active.  */
-  {
-    Lisp_Object tail, frame;
+  if (minibuf_follows_frame ())
+    /* Make sure no other frame has a minibuffer as its selected window,
+       because the text would not be displayed in it, and that would be
+       confusing.  Only allow the selected frame to do this,
+       and that only if the minibuffer is active.  */
+    {
+      Lisp_Object tail, frame;
+
+      FOR_EACH_FRAME (tail, frame)
+        if (MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (XFRAME (frame))))
+            && !(EQ (frame, selected_frame)
+                 && minibuf_level > 0))
+          Fset_frame_selected_window (frame, Fframe_first_window (frame),
+                                      Qnil);
+    }
+}
 
-    FOR_EACH_FRAME (tail, frame)
-      if (MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (XFRAME (frame))))
-         && !(EQ (frame, selected_frame)
-              && minibuf_level > 0))
-       Fset_frame_selected_window (frame, Fframe_first_window (frame), Qnil);
-  }
+/* If `minibuffer_follows_selected_frame' and we have a minibuffer, move it
+   from its current frame to the selected frame.  This function is
+   intended to be called from `do_switch_frame' in frame.c.  */
+void move_minibuffer_onto_frame (void)
+{
+  if (!minibuf_level)
+    return;
+  if (!minibuf_follows_frame ())
+    return;
+  if (FRAMEP (selected_frame)
+      && FRAME_LIVE_P (XFRAME (selected_frame))
+      && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window))
+    {
+      struct frame *sf = XFRAME (selected_frame);
+      Lisp_Object old_frame = XWINDOW (minibuf_window)->frame;
+      struct frame *of = XFRAME (old_frame);
+      Lisp_Object buffer = XWINDOW (minibuf_window)->contents;
+
+      set_window_buffer (sf->minibuffer_window, buffer, 0, 0);
+      minibuf_window = sf->minibuffer_window;
+      if (EQ (XWINDOW (minibuf_window)->frame, selected_frame))
+        /* The minibuffer might be on another frame. */
+        Fset_frame_selected_window (selected_frame, sf->minibuffer_window,
+                                    Qnil);
+      set_window_buffer (of->minibuffer_window, get_minibuffer (0), 0, 0);
+    }
 }
 
 DEFUN ("active-minibuffer-window", Factive_minibuffer_window,
@@ -261,15 +302,31 @@ read_minibuf_noninteractive (Lisp_Object prompt, bool 
expflag,
   return val;
 }
 
+/* Return true when BUFFER is an active minibuffer.  */
+static bool
+live_minibuffer_p (Lisp_Object buffer)
+{
+  Lisp_Object tem;
+  EMACS_INT i;
+
+  if (EQ (buffer, Fcar (Vminibuffer_list)))
+    /*  *Minibuf-0* is never active.  */
+    return false;
+  tem = Fcdr (Vminibuffer_list);
+  for (i = 1; i <= minibuf_level; i++, tem = Fcdr (tem))
+    if (EQ (Fcar (tem), buffer))
+      return true;
+  return false;
+}
+
 DEFUN ("minibufferp", Fminibufferp,
-       Sminibufferp, 0, 1, 0,
+       Sminibufferp, 0, 2, 0,
        doc: /* Return t if BUFFER is a minibuffer.
 No argument or nil as argument means use current buffer as BUFFER.
-BUFFER can be a buffer or a buffer name.  */)
-  (Lisp_Object buffer)
+BUFFER can be a buffer or a buffer name.  If LIVE is non-nil, then
+return t only if BUFFER is an active minibuffer.  */)
+  (Lisp_Object buffer, Lisp_Object live)
 {
-  Lisp_Object tem;
-
   if (NILP (buffer))
     buffer = Fcurrent_buffer ();
   else if (STRINGP (buffer))
@@ -277,8 +334,10 @@ BUFFER can be a buffer or a buffer name.  */)
   else
     CHECK_BUFFER (buffer);
 
-  tem = Fmemq (buffer, Vminibuffer_list);
-  return ! NILP (tem) ? Qt : Qnil;
+  return (NILP (live)
+          ? !NILP (Fmemq (buffer, Vminibuffer_list))
+          : live_minibuffer_p (buffer))
+    ? Qt : Qnil;
 }
 
 DEFUN ("minibuffer-prompt-end", Fminibuffer_prompt_end,
@@ -433,6 +492,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
       return unbind_to (count, val);
     }
 
+  minibuf_level++;         /* Before calling choose_minibuf_frame.  */
+
   /* Choose the minibuffer window and frame, and take action on them.  */
 
   /* Prepare for restoring the current buffer since choose_minibuf_frame
@@ -484,7 +545,6 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
     = Fcons (Fthis_command_keys_vector (), minibuf_save_list);
 
   record_unwind_protect_void (read_minibuf_unwind);
-  minibuf_level++;
   /* We are exiting the minibuffer one way or the other, so run the hook.
      It should be run before unwinding the minibuf settings.  Do it
      separately from read_minibuf_unwind because we need to make sure that
@@ -566,8 +626,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
   if (minibuf_level == 1 || !EQ (minibuf_window, selected_window))
     minibuf_selected_window = selected_window;
 
-  /* Empty out the minibuffers of all frames other than the one
-     where we are going to display one now.
+  /* Empty out the minibuffers of all frames, except those frames
+     where there is an active minibuffer.
      Set them to point to ` *Minibuf-0*', which is always empty.  */
   empty_minibuf = get_minibuffer (0);
 
@@ -575,12 +635,17 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
     {
       Lisp_Object root_window = Fframe_root_window (frame);
       Lisp_Object mini_window = XWINDOW (root_window)->next;
+      Lisp_Object buffer;
 
-      if (! NILP (mini_window) && ! EQ (mini_window, minibuf_window)
-         && !NILP (Fwindow_minibuffer_p (mini_window)))
-       /* Use set_window_buffer instead of Fset_window_buffer (see
-          discussion of bug#11984, bug#12025, bug#12026).  */
-       set_window_buffer (mini_window, empty_minibuf, 0, 0);
+      if (!NILP (mini_window) && !EQ (mini_window, minibuf_window)
+          && !NILP (Fwindow_minibuffer_p (mini_window)))
+        {
+          buffer = XWINDOW (mini_window)->contents;
+          if (!live_minibuffer_p (buffer))
+            /* Use set_window_buffer instead of Fset_window_buffer (see
+               discussion of bug#11984, bug#12025, bug#12026).  */
+            set_window_buffer (mini_window, empty_minibuf, 0, 0);
+        }
     }
 
   /* Display this minibuffer in the proper window.  */
@@ -714,6 +779,16 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
   return val;
 }
 
+/* Return true if BUF is a particular existing minibuffer.  */
+bool
+is_minibuffer (EMACS_INT depth, Lisp_Object buf)
+{
+  Lisp_Object tail = Fnthcdr (make_fixnum (depth), Vminibuffer_list);
+  return
+    !NILP (tail)
+    && EQ (Fcar (tail), buf);
+}
+
 /* Return a buffer to be used as the minibuffer at depth `depth'.
    depth = 0 is the lowest allowed argument, and that is the value
    used for nonrecursive minibuffer invocations.  */
@@ -775,6 +850,7 @@ read_minibuf_unwind (void)
 {
   Lisp_Object old_deactivate_mark;
   Lisp_Object window;
+  Lisp_Object future_mini_window;
 
   /* If this was a recursive minibuffer,
      tie the minibuffer window back to the outer level minibuffer buffer.  */
@@ -809,6 +885,7 @@ read_minibuf_unwind (void)
   if (FRAME_LIVE_P (XFRAME (WINDOW_FRAME (XWINDOW (temp)))))
     minibuf_window = temp;
 #endif
+  future_mini_window = Fcar (minibuf_save_list);
   minibuf_save_list = Fcdr (minibuf_save_list);
 
   /* Erase the minibuffer we were using at this level.  */
@@ -825,7 +902,8 @@ read_minibuf_unwind (void)
 
   /* When we get to the outmost level, make sure we resize the
      mini-window back to its normal size.  */
-  if (minibuf_level == 0)
+  if (minibuf_level == 0
+      || !EQ (selected_frame, WINDOW_FRAME (XWINDOW (future_mini_window))))
     resize_mini_window (XWINDOW (window), 0);
 
   /* Deal with frames that should be removed when exiting the
@@ -1911,6 +1989,8 @@ syms_of_minibuf (void)
   staticpro (&minibuf_prompt);
   staticpro (&minibuf_save_list);
 
+  DEFSYM (Qminibuffer_follows_selected_frame,
+          "minibuffer-follows-selected-frame");
   DEFSYM (Qcompletion_ignore_case, "completion-ignore-case");
   DEFSYM (Qminibuffer_default, "minibuffer-default");
   Fset (Qminibuffer_default, Qnil);
@@ -1954,6 +2034,14 @@ For example, `eval-expression' uses this.  */);
 The function is called with the arguments passed to `read-buffer'.  */);
   Vread_buffer_function = Qnil;
 
+  DEFVAR_BOOL ("minibuffer-follows-selected-frame", 
minibuffer_follows_selected_frame,
+               doc: /* Non-nil means the active minibuffer always displays on 
the selected frame.
+Nil means that a minibuffer will appear only in the frame which created it.
+
+Any buffer local or dynamic binding of this variable is ignored.  Only the
+default top level value is used.  */);
+  minibuffer_follows_selected_frame = 1;
+
   DEFVAR_BOOL ("read-buffer-completion-ignore-case",
               read_buffer_completion_ignore_case,
               doc: /* Non-nil means completion ignores case when reading a 
buffer name.  */);
diff --git a/src/print.c b/src/print.c
index 9d839d6..bdf8829 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1859,6 +1859,24 @@ print_vectorlike (Lisp_Object obj, Lisp_Object 
printcharfun, bool escapeflag,
   return true;
 }
 
+static char
+named_escape (int i)
+{
+  switch (i)
+    {
+    case '\b': return 'b';
+    case '\t': return 't';
+    case '\n': return 'n';
+    case '\f': return 'f';
+    case '\r': return 'r';
+    case ' ':  return 's';
+      /* \a, \v, \e and \d are excluded from printing as escapes since
+         they are somewhat rare as characters and more likely to be
+         plain integers. */
+    }
+  return 0;
+}
+
 static void
 print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
 {
@@ -1919,8 +1937,32 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, 
bool escapeflag)
     {
     case_Lisp_Int:
       {
-       int len = sprintf (buf, "%"pI"d", XFIXNUM (obj));
-       strout (buf, len, len, printcharfun);
+        EMACS_INT i = XFIXNUM (obj);
+        char escaped_name;
+
+       if (print_integers_as_characters && i >= 0 && i <= MAX_UNICODE_CHAR
+            && ((escaped_name = named_escape (i))
+                || graphic_base_p (i)))
+         {
+           printchar ('?', printcharfun);
+            if (escaped_name)
+              {
+                printchar ('\\', printcharfun);
+                i = escaped_name;
+              }
+            else if (escapeflag
+                     && (i == ';' || i == '\"' || i == '\'' || i == '\\'
+                         || i == '(' || i == ')'
+                         || i == '{' || i == '}'
+                         || i == '[' || i == ']'))
+             printchar ('\\', printcharfun);
+           printchar (i, printcharfun);
+         }
+       else
+         {
+           int len = sprintf (buf, "%"pI"d", i);
+           strout (buf, len, len, printcharfun);
+         }
       }
       break;
 
@@ -2258,6 +2300,14 @@ A value of nil means to use the shortest notation
 that represents the number without losing information.  */);
   Vfloat_output_format = Qnil;
 
+  DEFVAR_BOOL ("print-integers-as-characters", print_integers_as_characters,
+              doc: /* Non-nil means integers are printed using characters 
syntax.
+Only independent graphic characters, and control characters with named
+escape sequences such as newline, are printed this way.  Other
+integers, including those corresponding to raw bytes, are printed
+as numbers the usual way.  */);
+  print_integers_as_characters = false;
+
   DEFVAR_LISP ("print-length", Vprint_length,
               doc: /* Maximum length of list to print before abbreviating.
 A value of nil means no limit.  See also `eval-expression-print-length'.  */);
diff --git a/src/sysdep.c b/src/sysdep.c
index f6c0dde..29c88f5 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1440,6 +1440,7 @@ set_window_size (int fd, int height, int width)
 
   /* BSD-style.  */
   struct winsize size;
+  memset (&size, 0, sizeof (size));
   size.ws_row = height;
   size.ws_col = width;
 
@@ -1450,6 +1451,7 @@ set_window_size (int fd, int height, int width)
 
   /* SunOS - style.  */
   struct ttysize size;
+  memset (&size, 0, sizeof (size));
   size.ts_lines = height;
   size.ts_cols = width;
 
@@ -2892,7 +2894,8 @@ list_system_processes (void)
      process.  */
   procdir = build_string ("/proc");
   match = build_string ("[0-9]+");
-  proclist = directory_files_internal (procdir, Qnil, match, Qt, false, Qnil);
+  proclist = directory_files_internal (procdir, Qnil, match, Qt,
+                                       false, Qnil, Qnil);
 
   /* `proclist' gives process IDs as strings.  Destructively convert
      each string into a number.  */
diff --git a/src/term.c b/src/term.c
index ff1aabf..3a13da1 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2550,67 +2550,63 @@ term_mouse_click (struct input_event *result, Gpm_Event 
*event,
 }
 
 int
-handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event,
-                      struct input_event *hold_quit)
+handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event)
 {
   struct frame *f = XFRAME (tty->top_frame);
   struct input_event ie;
-  bool do_help = 0;
   int count = 0;
 
   EVENT_INIT (ie);
   ie.kind = NO_EVENT;
   ie.arg = Qnil;
 
-  if (event->type & (GPM_MOVE | GPM_DRAG)) {
-    previous_help_echo_string = help_echo_string;
-    help_echo_string = Qnil;
+  if (event->type & (GPM_MOVE | GPM_DRAG))
+    {
+      previous_help_echo_string = help_echo_string;
+      help_echo_string = Qnil;
 
-    Gpm_DrawPointer (event->x, event->y, fileno (tty->output));
+      Gpm_DrawPointer (event->x, event->y, fileno (tty->output));
 
-    if (!term_mouse_movement (f, event))
-      help_echo_string = previous_help_echo_string;
+      if (!term_mouse_movement (f, event))
+        help_echo_string = previous_help_echo_string;
 
-    /* If the contents of the global variable help_echo_string
-       has changed, generate a HELP_EVENT.  */
-    if (!NILP (help_echo_string)
-       || !NILP (previous_help_echo_string))
-      do_help = 1;
+      /* If the contents of the global variable help_echo_string
+         has changed, generate a HELP_EVENT.  */
+      if (!NILP (help_echo_string)
+         || !NILP (previous_help_echo_string))
+       {
+         Lisp_Object frame;
 
-    goto done;
-  }
-  else {
-    f->mouse_moved = 0;
-    term_mouse_click (&ie, event, f);
-    if (tty_handle_tab_bar_click (f, event->x, event->y,
-                                 (ie.modifiers & down_modifier) != 0, &ie))
-      {
-       /* tty_handle_tab_bar_click stores 2 events in the event
-          queue, so we are done here.  */
-       count += 2;
-       return count;
-      }
-  }
+         if (f)
+           XSETFRAME (frame, f);
+         else
+           frame = Qnil;
 
- done:
-  if (ie.kind != NO_EVENT)
-    {
-      kbd_buffer_store_event_hold (&ie, hold_quit);
-      count++;
+         gen_help_event (help_echo_string, frame, help_echo_window,
+                         help_echo_object, help_echo_pos);
+         count++;
+       }
     }
-
-  if (do_help
-      && !(hold_quit && hold_quit->kind != NO_EVENT))
+  else
     {
-      Lisp_Object frame;
-
-      if (f)
-       XSETFRAME (frame, f);
-      else
-       frame = Qnil;
-
-      gen_help_event (help_echo_string, frame, help_echo_window,
-                     help_echo_object, help_echo_pos);
+      f->mouse_moved = 0;
+      term_mouse_click (&ie, event, f);
+      /* eassert (ie.kind == GPM_CLICK_EVENT); */
+      if (tty_handle_tab_bar_click (f, event->x, event->y,
+                                    (ie.modifiers & down_modifier) != 0, &ie))
+        {
+          /* eassert (ie.kind == GPM_CLICK_EVENT
+           *          || ie.kind == TAB_BAR_EVENT); */
+          /* tty_handle_tab_bar_click stores 2 events in the event
+             queue, so we are done here.  */
+          /* FIXME: Actually, `tty_handle_tab_bar_click` returns true
+             without storing any events, when
+             (ie.modifiers & down_modifier) != 0  */
+          count += 2;
+          return count;
+        }
+      /* eassert (ie.kind == GPM_CLICK_EVENT); */
+      kbd_buffer_store_event (&ie);
       count++;
     }
 
diff --git a/src/termhooks.h b/src/termhooks.h
index d18b750..6ab06ce 100644
--- a/src/termhooks.h
+++ b/src/termhooks.h
@@ -370,7 +370,7 @@ enum {
 
 #ifdef HAVE_GPM
 #include <gpm.h>
-extern int handle_one_term_event (struct tty_display_info *, Gpm_Event *, 
struct input_event *);
+extern int handle_one_term_event (struct tty_display_info *, Gpm_Event *);
 #ifndef HAVE_WINDOW_SYSTEM
 extern void term_mouse_moveto (int, int);
 #endif
diff --git a/src/window.c b/src/window.c
index e743396..a6de34f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2643,8 +2643,10 @@ candidate_window_p (Lisp_Object window, Lisp_Object 
owindow,
     /*         To qualify as candidate, it's not sufficient for WINDOW's frame
        to just share the minibuffer window - it must be active as well
        (see Bug#24500).  */
-    candidate_p = (EQ (XWINDOW (all_frames)->frame, w->frame)
-                  || EQ (XWINDOW (all_frames)->frame, FRAME_FOCUS_FRAME (f)));
+    candidate_p = ((EQ (XWINDOW (all_frames)->frame, w->frame)
+                    || (EQ (f->minibuffer_window, all_frames)
+                        && EQ (XWINDOW (all_frames)->frame, FRAME_FOCUS_FRAME 
(f))))
+                   && !is_minibuffer (0, XWINDOW (all_frames)->contents));
   else if (FRAMEP (all_frames))
     candidate_p = EQ (all_frames, w->frame);
 
diff --git a/src/xdisp.c b/src/xdisp.c
index cc499f3..0001bcd 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -18820,6 +18820,10 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
 
   /* Try to scroll by specified few lines.  */
   if ((0 < scroll_conservatively
+       /* FIXME: the option is supposed to affect minibuffers, but we
+         test MINI_WINDOW_P, which can also catch uses of
+         mini-windows for displaying the echo area.  Do we need to
+         distinguish these two use cases?  */
        || (scroll_minibuffer_conservatively && MINI_WINDOW_P (w))
        || 0 < emacs_scroll_step
        || temp_scroll_step
@@ -27065,7 +27069,7 @@ display_string (const char *string, Lisp_Object 
lisp_string, Lisp_Object face_st
   else
     max_x = min (max_x, it->last_visible_x);
 
-  /* Skip over display elements that are not visible. because IT->w is
+  /* Skip over display elements that are not visible because IT->w is
      hscrolled.  */
   if (it->current_x < it->first_visible_x)
     move_it_in_display_line_to (it, 100000, it->first_visible_x,
@@ -31224,7 +31228,9 @@ get_window_cursor_type (struct window *w, struct glyph 
*glyph, int *width,
     {
       *active_cursor = false;
 
-      if (MINI_WINDOW_P (w) && minibuf_level == 0)
+      if (MINI_WINDOW_P (w) &&
+          (minibuf_level == 0
+           || is_minibuffer (0, w->contents)))
        return NO_CURSOR;
 
       non_selected = true;
diff --git a/test/README b/test/README
index fe05b54..d0da89d 100644
--- a/test/README
+++ b/test/README
@@ -81,6 +81,11 @@ Some tests might take long time to run.  In order to 
summarize the
 
     make SUMMARIZE_TESTS=<nn> ...
 
+The backtrace of failing tests are truncated to the default value of
+'ert-batch-backtrace-right-margin'.  To see more of the backtrace, use
+
+    make TEST_BACKTRACE_LINE_LENGTH=<nn> ...
+
 The tests are run in batch mode by default; sometimes it's useful to
 get precisely the same environment but run in interactive mode for
 debugging.  To do that, use
diff --git a/test/lisp/custom-tests.el b/test/lisp/custom-tests.el
index a1451cf..7691f16 100644
--- a/test/lisp/custom-tests.el
+++ b/test/lisp/custom-tests.el
@@ -156,4 +156,13 @@
   (load custom-test-admin-cus-test)
   (should (null (cus-test-opts t))))
 
+(ert-deftest custom-test-enable-theme-keeps-settings ()
+  "Test that enabling a theme doesn't change its settings."
+  (let* ((custom-theme-load-path `(,(ert-resource-directory)))
+         settings)
+    (load-theme 'custom--test 'no-confirm 'no-enable)
+    (setq settings (get 'custom--test 'theme-settings))
+    (enable-theme 'custom--test)
+    (should (equal settings (get 'custom--test 'theme-settings)))))
+
 ;;; custom-tests.el ends here
diff --git a/test/lisp/dired-tests.el b/test/lisp/dired-tests.el
index cec533d..66f8ed9 100644
--- a/test/lisp/dired-tests.el
+++ b/test/lisp/dired-tests.el
@@ -293,6 +293,7 @@
 
 (ert-deftest dired-test-bug27899 ()
   "Test for https://debbugs.gnu.org/27899 ."
+  :tags '(:unstable)
   (dired (list (expand-file-name "src" source-directory)
                "cygw32.c" "alloc.c" "w32xfns.c" "xdisp.c"))
   (let ((orig dired-hide-details-mode))
@@ -440,6 +441,81 @@
        (should (= 6 (length (dired-get-marked-files)))) ; All empty dirs but 
zeta-empty-dir deleted.
      (advice-remove 'read-answer 'dired-test-bug27940-advice))))
 
+(ert-deftest dired-test-directory-files ()
+  "Test for `directory-files'."
+  (let ((testdir (expand-file-name
+                  "directory-files-test" (temporary-file-directory)))
+        (nod directory-files-no-dot-files-regexp))
+    (unwind-protect
+        (progn
+          (when (file-directory-p testdir)
+            (delete-directory testdir t))
+
+          (make-directory testdir)
+          (when (file-directory-p testdir)
+            ;; directory-empty-p: test non-existent dir
+            (should-not (directory-empty-p "some-imaginary-dir"))
+            (should (= 2 (length (directory-files testdir))))
+            ;; directory-empty-p: test empty dir
+            (should (directory-empty-p testdir))
+            (should-not (directory-files testdir nil nod t 1))
+            (dolist (file '(a b c d))
+              (make-empty-file (expand-file-name (symbol-name file) testdir)))
+            (should (= 6 (length (directory-files testdir))))
+            (should (equal "abcd" (mapconcat 'identity (directory-files
+                                                        testdir nil nod) "")))
+            (should (= 2 (length (directory-files testdir nil "[bc]"))))
+            (should (= 3 (length (directory-files testdir nil nod nil 3))))
+            (dolist (file '(5 4 3 2 1))
+              (make-empty-file
+               (expand-file-name (number-to-string file) testdir)))
+            ;;(should (= 0 (length (directory-files testdir nil "[0-9]" t 
-1))))
+            (should (= 5 (length (directory-files testdir nil "[0-9]" t))))
+            (should (= 5 (length (directory-files testdir nil "[0-9]" t 50))))
+            (should-not (directory-empty-p testdir)))
+
+          (delete-directory testdir t)))))
+
+(ert-deftest dired-test-directory-files-and-attributes ()
+  "Test for `directory-files-and-attributes'."
+  (let ((testdir (expand-file-name
+                  "directory-files-test" (temporary-file-directory)))
+        (nod directory-files-no-dot-files-regexp))
+
+    (unwind-protect
+        (progn
+          (when (file-directory-p testdir)
+            (delete-directory testdir t))
+
+          (make-directory testdir)
+          (when (file-directory-p testdir)
+            (should (= 2 (length (directory-files testdir))))
+            (should-not (directory-files-and-attributes testdir t nod t 1))
+            (dolist (file '(a b c d))
+              (make-directory (expand-file-name (symbol-name file) testdir)))
+            (should (= 6 (length (directory-files-and-attributes testdir))))
+            (dolist (dir (directory-files-and-attributes testdir t nod))
+              (should (file-directory-p (car dir)))
+              (should-not (file-regular-p (car dir))))
+            (should (= 2 (length
+                          (directory-files-and-attributes testdir nil 
"[bc]"))))
+            (should (= 3 (length
+                          (directory-files-and-attributes
+                           testdir nil nod nil nil 3))))
+            (dolist (file '(5 4 3 2 1))
+              (make-empty-file
+               (expand-file-name (number-to-string file) testdir)))
+            ;; (should (= 0 (length (directory-files-and-attributes testdir nil
+            ;;                                                      "[0-9]" t
+            ;;                                                      nil -1))))
+            (should (= 5 (length
+                          (directory-files-and-attributes
+                           testdir nil "[0-9]" t))))
+            (should (= 5 (length
+                          (directory-files-and-attributes
+                           testdir nil "[0-9]" t nil 50))))))
+      (when (file-directory-p testdir)
+        (delete-directory testdir t)))))
 
 (provide 'dired-tests)
 ;; dired-tests.el ends here
diff --git a/test/lisp/emacs-lisp/easy-mmode-tests.el 
b/test/lisp/emacs-lisp/easy-mmode-tests.el
index 4d7fe94..bbd0197 100644
--- a/test/lisp/emacs-lisp/easy-mmode-tests.el
+++ b/test/lisp/emacs-lisp/easy-mmode-tests.el
@@ -44,6 +44,22 @@
                  '(c-mode (not message-mode mail-mode) text-mode))
                 t))))
 
+(define-minor-mode easy-mmode-test-mode "A test.")
+
+(ert-deftest easy-mmode--minor-mode ()
+  (with-temp-buffer
+    (should (eq easy-mmode-test-mode nil))
+    (easy-mmode-test-mode nil)
+    (should (eq easy-mmode-test-mode t))
+    (easy-mmode-test-mode -33)
+    (should (eq easy-mmode-test-mode nil))
+    (easy-mmode-test-mode 33)
+    (should (eq easy-mmode-test-mode t))
+    (easy-mmode-test-mode 'toggle)
+    (should (eq easy-mmode-test-mode nil))
+    (easy-mmode-test-mode 'toggle)
+    (should (eq easy-mmode-test-mode t))))
+
 (provide 'easy-mmode-tests)
 
 ;;; easy-mmode-tests.el ends here
diff --git a/test/lisp/gnus/gnus-search-tests.el 
b/test/lisp/gnus/gnus-search-tests.el
new file mode 100644
index 0000000..5bae9cb
--- /dev/null
+++ b/test/lisp/gnus/gnus-search-tests.el
@@ -0,0 +1,96 @@
+;;; gnus-search-tests.el --- Tests for Gnus' search routines  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2017  Free Software Foundation, Inc.
+
+;; Author: Eric Abrahamsen <eric@ericabrahamsen.net>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Tests for the search parsing, search engines, and their
+;; transformations.
+
+;;; Code:
+
+(require 'ert)
+(require 'gnus-search)
+
+(ert-deftest gnus-s-parse ()
+  "Test basic structural parsing."
+  (let ((pairs
+         '(("string" . ("string"))
+           ("from:john" . ((from . "john")))
+           ("here and there" . ("here" and "there"))
+           ("here or there" . ((or "here" "there")))
+           ("here (there or elsewhere)" . ("here" ((or "there" "elsewhere"))))
+           ("here not there" . ("here" (not "there")))
+           ("from:boss or not vacation" . ((or (from . "boss") (not 
"vacation")))))))
+    (dolist (p pairs)
+      (should (equal (gnus-search-parse-query (car p)) (cdr p))))))
+
+(ert-deftest gnus-s-expand-keyword ()
+  "Test expansion of keywords"
+  (let ((gnus-search-expandable-keys
+         (default-value 'gnus-search-expandable-keys))
+        (pairs
+         '(("su" . "subject")
+           ("sin" . "since"))))
+    (dolist (p pairs)
+      (should (equal (gnus-search-query-expand-key (car p))
+                     (cdr p))))
+    (should-error (gnus-search-query-expand-key "s")
+                  :type 'gnus-search-parse-error)))
+
+(ert-deftest gnus-s-parse-date ()
+  "Test parsing of date expressions."
+  (let ((rel-date (encode-time 0 0 0 15 4 2017))
+        (pairs
+         '(("January" . (nil 1 nil))
+           ("2017" . (nil nil 2017))
+           ("15" . (15 nil nil))
+           ("January 15" . (15 1 nil))
+           ("tuesday" . (11 4 2017))
+           ("1d" . (14 4 2017))
+           ("1w" . (8 4 2017)))))
+    (dolist (p pairs)
+      (should (equal (gnus-search-query-parse-date (car p) rel-date)
+                     (cdr p))))))
+
+(ert-deftest gnus-s-delimited-string ()
+  "Test proper functioning of `gnus-search-query-return-string'."
+  (with-temp-buffer
+    (insert "one\ntwo words\nthree \"words with quotes\"\n\"quotes at 
start\"\n/alternate \"quotes\"/\n(more bits)")
+    (goto-char (point-min))
+    (should (string= (gnus-search-query-return-string)
+                     "one"))
+    (forward-line)
+    (should (string= (gnus-search-query-return-string)
+                     "two"))
+    (forward-line)
+    (should (string= (gnus-search-query-return-string)
+                     "three"))
+    (forward-line)
+    (should (string= (gnus-search-query-return-string "\"")
+                     "\"quotes at start\""))
+    (forward-line)
+    (should (string= (gnus-search-query-return-string "/")
+                     "/alternate \"quotes\"/"))
+    (forward-line)
+    (should (string= (gnus-search-query-return-string ")" t)
+                     "more bits"))))
+
+(provide 'gnus-search-tests)
+;;; search-tests.el ends here
diff --git a/test/lisp/help-tests.el b/test/lisp/help-tests.el
index 079b111..b6dffb2 100644
--- a/test/lisp/help-tests.el
+++ b/test/lisp/help-tests.el
@@ -361,6 +361,26 @@ C-b                undefined
 
 ")))))
 
+(defvar help-tests--was-in-buffer nil)
+
+(ert-deftest help-substitute-command-keys/menu-filter-in-correct-buffer ()
+  "Evaluate menu-filter in the original buffer.  See Bug#39149."
+  (unwind-protect
+      (progn
+        (define-key global-map (kbd "C-c C-l r")
+          `(menu-item "2" identity
+                      :filter ,(lambda (cmd)
+                                 (setq help-tests--was-in-buffer
+                                       (current-buffer))
+                                 cmd)))
+        (with-temp-buffer
+          (substitute-command-keys "\\[identity]")
+          (should (eq help-tests--was-in-buffer
+                      (current-buffer)))))
+    (setq help-tests--was-in-buffer nil)
+    (define-key global-map (kbd "C-c C-l r") nil)
+    (define-key global-map (kbd "C-c C-l") nil)))
+
 (provide 'help-tests)
 
 ;;; help-tests.el ends here
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index 2c5b4bf..7b83a8d 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -2169,6 +2169,8 @@ is greater than 10.
   (skip-unless (tramp--test-enabled))
   ;; The bugs are fixed in Emacs 28.1.
   (skip-unless (tramp--test-emacs28-p))
+  ;; Methods with a share do not expand "/path/..".
+  (skip-unless (not (tramp--test-share-p)))
 
   (should
    (string-equal
@@ -2266,7 +2268,24 @@ This checks also `file-name-as-directory', 
`file-name-directory',
       (write-region "foo" nil tmp-name)
       (should (file-exists-p tmp-name))
       (delete-file tmp-name)
-      (should-not (file-exists-p tmp-name)))))
+      (should-not (file-exists-p tmp-name))
+
+      ;; Trashing files doesn't work for crypted remote files.
+      (unless (tramp--test-crypt-p)
+       (let ((trash-directory (tramp--test-make-temp-name 'local quoted))
+             (delete-by-moving-to-trash t))
+         (make-directory trash-directory)
+         (should-not (file-exists-p tmp-name))
+         (write-region "foo" nil tmp-name)
+         (should (file-exists-p tmp-name))
+         (delete-file tmp-name 'trash)
+         (should-not (file-exists-p tmp-name))
+         (should
+          (file-exists-p
+           (expand-file-name
+            (file-name-nondirectory tmp-name) trash-directory)))
+         (delete-directory trash-directory 'recursive)
+         (should-not (file-exists-p trash-directory)))))))
 
 (ert-deftest tramp-test08-file-local-copy ()
   "Check `file-local-copy'."
@@ -2431,7 +2450,7 @@ This checks also `file-name-as-directory', 
`file-name-directory',
              (should-error
               (cl-letf (((symbol-function #'y-or-n-p) #'ignore)
                         ;; Ange-FTP.
-                        ((symbol-function 'yes-or-no-p) 'ignore))
+                        ((symbol-function #'yes-or-no-p) #'ignore))
                 (write-region "foo" nil tmp-name nil nil nil 'mustbenew))
                :type 'file-already-exists)
              (should-error
@@ -2763,7 +2782,53 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
        (delete-directory tmp-name1)
        :type 'file-error)
       (delete-directory tmp-name1 'recursive)
-      (should-not (file-directory-p tmp-name1)))))
+      (should-not (file-directory-p tmp-name1))
+
+      ;; Trashing directories works only since Emacs 27.1.  It doesn't
+      ;; work for crypted remote directories and for ange-ftp.
+      (when (and (not (tramp--test-crypt-p)) (not (tramp--test-ftp-p))
+                (tramp--test-emacs27-p))
+       (let ((trash-directory (tramp--test-make-temp-name 'local quoted))
+             (delete-by-moving-to-trash t))
+         (make-directory trash-directory)
+         ;; Delete empty directory.
+         (make-directory tmp-name1)
+         (should (file-directory-p tmp-name1))
+         (delete-directory tmp-name1 nil 'trash)
+         (should-not (file-directory-p tmp-name1))
+         (should
+          (file-exists-p
+           (expand-file-name
+            (file-name-nondirectory tmp-name1) trash-directory)))
+         (delete-directory trash-directory 'recursive)
+         (should-not (file-exists-p trash-directory))
+         ;; Delete non-empty directory.
+         (make-directory tmp-name1)
+         (should (file-directory-p tmp-name1))
+         (write-region "foo" nil (expand-file-name "bla" tmp-name1))
+         (should (file-exists-p (expand-file-name "bla" tmp-name1)))
+         (make-directory tmp-name2)
+         (should (file-directory-p tmp-name2))
+         (write-region "foo" nil (expand-file-name "bla" tmp-name2))
+         (should (file-exists-p (expand-file-name "bla" tmp-name2)))
+         (should-error
+          (delete-directory tmp-name1 nil 'trash)
+          ;; tramp-rclone.el calls the local `delete-directory'.
+          ;; This raises another error.
+          :type (if (tramp--test-rclone-p) 'error 'file-error))
+         (delete-directory tmp-name1 'recursive 'trash)
+         (should-not (file-directory-p tmp-name1))
+         (should
+          (file-exists-p
+           (format
+            "%s/%s/bla" trash-directory (file-name-nondirectory tmp-name1))))
+         (should
+          (file-exists-p
+           (format
+            "%s/%s/%s/bla" trash-directory (file-name-nondirectory tmp-name1)
+            (file-name-nondirectory tmp-name2))))
+         (delete-directory trash-directory 'recursive)
+         (should-not (file-exists-p trash-directory)))))))
 
 (ert-deftest tramp-test15-copy-directory ()
   "Check `copy-directory'."
@@ -2863,7 +2928,15 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
                           '("bla" "foo")))
            (should (equal (directory-files
                            tmp-name1 'full directory-files-no-dot-files-regexp)
-                          `(,tmp-name2 ,tmp-name3))))
+                          `(,tmp-name2 ,tmp-name3)))
+           ;; Check the COUNT arg.  It exists since Emacs 28.
+           (when (tramp--test-emacs28-p)
+             (with-no-warnings
+               (should
+                (equal
+                 (directory-files
+                  tmp-name1 nil directory-files-no-dot-files-regexp nil 1)
+                 '("bla"))))))
 
        ;; Cleanup.
        (ignore-errors (delete-directory tmp-name1 'recursive))))))
@@ -3381,7 +3454,14 @@ They might differ only in time attributes or directory 
size."
                (file-attributes (car elt)) (cdr elt))))
 
            (setq attr (directory-files-and-attributes tmp-name2 nil "\\`b"))
-           (should (equal (mapcar #'car attr) '("bar" "boz"))))
+           (should (equal (mapcar #'car attr) '("bar" "boz")))
+
+           ;; Check the COUNT arg.  It exists since Emacs 28.
+           (when (tramp--test-emacs28-p)
+             (with-no-warnings
+               (setq attr (directory-files-and-attributes
+                           tmp-name2 nil "\\`b" nil nil 1))
+               (should (equal (mapcar #'car attr) '("bar"))))))
 
        ;; Cleanup.
        (ignore-errors (delete-directory tmp-name1 'recursive))))))
@@ -3393,10 +3473,7 @@ This tests also `file-executable-p', `file-writable-p' 
and `set-file-modes'."
   (skip-unless
    (or (tramp--test-sh-p) (tramp--test-sudoedit-p)
        ;; Not all tramp-gvfs.el methods support changing the file mode.
-       (and
-       (tramp--test-gvfs-p)
-       (string-match-p
-        "ftp" (file-remote-p tramp-test-temporary-file-directory 'method)))))
+       (tramp--test-gvfs-p "afp") (tramp--test-gvfs-p "ftp")))
 
   (dolist (quoted (if (tramp--test-expensive-test) '(nil t) '(nil)))
     (let ((tmp-name1 (tramp--test-make-temp-name nil quoted))
@@ -5628,6 +5705,13 @@ This does not support special file names."
   (tramp-sh-file-name-handler-p
    (tramp-dissect-file-name tramp-test-temporary-file-directory)))
 
+(defun tramp--test-share-p ()
+  "Check, whether the method needs a share."
+  (and (tramp--test-gvfs-p)
+       (string-match-p
+       "^\\(afp\\|davs?\\|smb\\)$"
+       (file-remote-p tramp-test-temporary-file-directory 'method))))
+
 (defun tramp--test-sudoedit-p ()
   "Check, whether the sudoedit method is used."
   (tramp-sudoedit-file-name-p tramp-test-temporary-file-directory))
diff --git a/test/lisp/progmodes/compile-tests.el 
b/test/lisp/progmodes/compile-tests.el
index b8ed6e0..0288cba 100644
--- a/test/lisp/progmodes/compile-tests.el
+++ b/test/lisp/progmodes/compile-tests.el
@@ -191,10 +191,10 @@
     ;; javac
     (javac
      "/src/Test.java:5: ';' expected\n        foo foo\n               ^\n"
-     1 15 5 "/src/Test.java" 2)
+     1 16 5 "/src/Test.java" 2)
     (javac
      "e:\\src\\Test.java:7: warning: ';' expected\n   foo foo\n          ^\n"
-     1 10 7 "e:\\src\\Test.java" 1)
+     1 11 7 "e:\\src\\Test.java" 1)
     ;; jikes-file jikes-line
     (jikes-file
      "Found 2 semantic errors compiling \"../javax/swing/BorderFactory.java\":"
diff --git a/test/lisp/progmodes/cperl-mode-resources/cperl-bug-30393.pl 
b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-30393.pl
new file mode 100644
index 0000000..01db7b5
--- /dev/null
+++ b/test/lisp/progmodes/cperl-mode-resources/cperl-bug-30393.pl
@@ -0,0 +1,19 @@
+# -------- bug#30393: input --------
+#
+          my $sql = "insert into jobs (id, priority) values (1, 2);";
+               my $sth = $dbh->prepare($sql) or die "bother";
+
+          my $sql = "insert into jobs
+(id, priority)
+values (1, 2);";
+               my $sth = $dbh->prepare($sql) or die "bother";
+# -------- bug#30393: expected output --------
+#
+my $sql = "insert into jobs (id, priority) values (1, 2);";
+my $sth = $dbh->prepare($sql) or die "bother";
+
+my $sql = "insert into jobs
+(id, priority)
+values (1, 2);";
+my $sth = $dbh->prepare($sql) or die "bother";
+# -------- bug#30393: end --------
diff --git a/test/lisp/progmodes/cperl-mode-tests.el 
b/test/lisp/progmodes/cperl-mode-tests.el
index 9a7b5e4..effebc8 100644
--- a/test/lisp/progmodes/cperl-mode-tests.el
+++ b/test/lisp/progmodes/cperl-mode-tests.el
@@ -220,10 +220,43 @@ point in the distant past, and is still broken in 
perl-mode. "
         (should (equal (nth 3 (syntax-ppss)) nil))
         (should (equal (nth 4 (syntax-ppss)) t))))))
 
+(ert-deftest cperl-bug30393 ()
+  "Verify that indentation is not disturbed by an open paren in col 0.
+Perl is not Lisp: An open paren in column 0 does not start a function."
+  (let ((file (ert-resource-file "cperl-bug-30393.pl")))
+    (with-temp-buffer
+      (insert-file-contents file)
+      (goto-char (point-min))
+      (while (re-search-forward
+              (concat "^# ?-+ \\_<\\(?1:.+?\\)\\_>: input ?-+\n"
+                      "\\(?2:\\(?:.*\n\\)+?\\)"
+                      "# ?-+ \\1: expected output ?-+\n"
+                      "\\(?3:\\(?:.*\n\\)+?\\)"
+                      "# ?-+ \\1: end ?-+")
+              nil t)
+        (let ((name (match-string 1))
+              (code (match-string 2))
+              (expected (match-string 3))
+              got)
+          (with-temp-buffer
+            (insert code)
+           (funcall cperl-test-mode)
+            (goto-char (point-min))
+            (while (null (eobp))
+              (cperl-indent-command)
+              (forward-line 1))
+            (setq expected (concat "test case " name ":\n" expected))
+            (setq got (concat "test case " name ":\n" (buffer-string)))
+            (should (equal got expected))))))))
+
 (ert-deftest cperl-bug37127 ()
   "Verify that closing a paren in a regex goes without a message.
 Also check that the message is issued if the regex terminator is
 missing."
+  ;; The actual fix for this bug is in simple.el, which is not
+  ;; backported to older versions of Emacs.  Therefore we skip this
+  ;; test if we're running Emacs 27 or older.
+  (skip-unless (< 27 emacs-major-version))
   ;; Part one: Regex is ok, no messages
   (ert-with-message-capture collected-messages
     (with-temp-buffer
diff --git a/test/lisp/progmodes/gdb-mi-tests.el 
b/test/lisp/progmodes/gdb-mi-tests.el
index 79493a5..64b7a26 100644
--- a/test/lisp/progmodes/gdb-mi-tests.el
+++ b/test/lisp/progmodes/gdb-mi-tests.el
@@ -34,8 +34,10 @@
            '((alpha . "ab\ncd")
              (beta . ("x" ("y" (delta . ())))))))
 
-  (should (equal (gdb-mi--from-string "alpha=\"a\\303\\245b\"")
-                 `((alpha . ,(string-to-multibyte "a\303\245b")))))
+  (let ((gdb-mi-decode-strings nil))
+    (let ((ref `((alpha . ,(string-to-multibyte "a\303\245b")))))
+      (should (equal (gdb-mi--from-string "alpha=\"a\\303\\245b\"")
+                     ref))))
   (let ((gdb-mi-decode-strings 'utf-8))
     (should (equal (gdb-mi--from-string "alpha=\"a\\303\\245b\"")
                    '((alpha . "aåb")))))
diff --git a/test/src/keymap-tests.el b/test/src/keymap-tests.el
index 75f8c0f..8331a41 100644
--- a/test/src/keymap-tests.el
+++ b/test/src/keymap-tests.el
@@ -3,6 +3,7 @@
 ;; Copyright (C) 2015-2020 Free Software Foundation, Inc.
 
 ;; Author: Juanma Barranquero <lekktu@gmail.com>
+;;         Stefan Kangas <stefankangas@gmail.com>
 
 ;; This file is part of GNU Emacs.
 
@@ -23,6 +24,58 @@
 
 (require 'ert)
 
+(defun keymap-tests--make-keymap-test (fun)
+  (should (eq (car (funcall fun)) 'keymap))
+  (should (proper-list-p (funcall fun)))
+  (should (equal (car (last (funcall fun "foo"))) "foo")))
+
+(ert-deftest keymap-make-keymap ()
+  (keymap-tests--make-keymap-test #'make-keymap)
+  (should (char-table-p (cadr (make-keymap)))))
+
+(ert-deftest keymap-make-sparse-keymap ()
+  (keymap-tests--make-keymap-test #'make-sparse-keymap))
+
+(ert-deftest keymap-keymapp ()
+  (should (keymapp (make-keymap)))
+  (should (keymapp (make-sparse-keymap)))
+  (should-not (keymapp '(foo bar))))
+
+(ert-deftest keymap-keymap-parent ()
+  (should-not (keymap-parent (make-keymap)))
+  (should-not (keymap-parent (make-sparse-keymap)))
+  (let ((map (make-keymap)))
+    (set-keymap-parent map help-mode-map)
+    (should (equal (keymap-parent map) help-mode-map))))
+
+(ert-deftest keymap-keymap-set-parent/returns-parent ()
+  (let ((map (make-keymap)))
+    (should (equal (set-keymap-parent map help-mode-map) help-mode-map))))
+
+(ert-deftest keymap-copy-keymap/is-equal ()
+  (should (equal (copy-keymap help-mode-map) help-mode-map)))
+
+(ert-deftest keymap-copy-keymap/is-not-eq ()
+  (should-not (eq (copy-keymap help-mode-map) help-mode-map)))
+
+(ert-deftest keymap-lookup-key ()
+  (let ((map (make-keymap)))
+    (define-key map [?a] 'foo)
+    (should (eq (lookup-key map [?a]) 'foo))))
+
+(ert-deftest describe-buffer-bindings/header-in-current-buffer ()
+  "Header should be inserted into the current buffer.
+https://debbugs.gnu.org/39149#31";
+  (with-temp-buffer
+    (describe-buffer-bindings (current-buffer))
+    (should (string-match (rx bol "key" (+ space) "binding" eol)
+                          (buffer-string)))))
+
+(ert-deftest describe-buffer-bindings/returns-nil ()
+  "Should return nil."
+  (with-temp-buffer
+    (should (eq (describe-buffer-bindings (current-buffer)) nil))))
+
 (ert-deftest keymap-store_in_keymap-XFASTINT-on-non-characters ()
   "Check for bug fixed in \"Fix assertion violation in define-key\",
 commit 86c19714b097aa477d339ed99ffb5136c755a046."
@@ -38,13 +91,99 @@ commit 86c19714b097aa477d339ed99ffb5136c755a046."
           (should (eq (lookup-key Buffer-menu-mode-map [32]) 'undefined)))
       (define-key Buffer-menu-mode-map [32] def))))
 
-(ert-deftest keymap-where-is-internal-test ()
+
+;;;; where-is-internal
+
+(defun keymap-tests--command-1 () (interactive) nil)
+(defun keymap-tests--command-2 () (interactive) nil)
+(put 'keymap-tests--command-1 :advertised-binding [?y])
+
+(ert-deftest keymap-where-is-internal ()
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'keymap-tests--command-1)
+    (define-key map "y" 'keymap-tests--command-1)
+    (should (equal (where-is-internal 'keymap-tests--command-1 map)
+                   '([?y] [?x])))))
+
+(ert-deftest keymap-where-is-internal/firstonly-t ()
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'keymap-tests--command-1)
+    (define-key map "y" 'keymap-tests--command-1)
+    (should (equal (where-is-internal 'keymap-tests--command-1 map t)
+                   [?y]))))
+
+(ert-deftest keymap-where-is-internal/menu-item ()
+  (let ((map (make-sparse-keymap)))
+    (define-key map [menu-bar foobar cmd1]
+      '(menu-item "Run Command 1" keymap-tests--command-1
+                  :help "Command 1 Help"))
+    (define-key map "x" 'keymap-tests--command-1)
+    (should (equal (where-is-internal 'keymap-tests--command-1 map)
+                   '([?x] [menu-bar foobar cmd1])))
+    (should (equal (where-is-internal 'keymap-tests--command-1 map t) [?x]))))
+
+
+(ert-deftest keymap-where-is-internal/advertised-binding ()
+  ;; Make sure order does not matter.
+  (dolist (keys '(("x" . "y") ("y" . "x")))
+    (let ((map (make-sparse-keymap)))
+      (define-key map (car keys) 'keymap-tests--command-1)
+      (define-key map (cdr keys) 'keymap-tests--command-1)
+      (should (equal (where-is-internal 'keymap-tests--command-1 map t) 
[121])))))
+
+(ert-deftest keymap-where-is-internal/advertised-binding-respect-remap ()
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'next-line)
+    (define-key map [remap keymap-tests--command-1] 'next-line)
+    (define-key map "y" 'keymap-tests--command-1)
+    (should (equal (where-is-internal 'keymap-tests--command-1 map t) [?x]))))
+
+(ert-deftest keymap-where-is-internal/remap ()
+  (let ((map (make-keymap)))
+    (define-key map (kbd "x") 'foo)
+    (define-key map (kbd "y") 'bar)
+    (define-key map [remap foo] 'bar)
+    (should (equal (where-is-internal 'foo map t) [?y]))
+    (should (equal (where-is-internal 'bar map t) [?y]))))
+
+(defvar keymap-tests-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'keymap-tests--command-2)
+    map))
+
+(defvar keymap-tests-major-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "x" 'keymap-tests--command-1)
+    map))
+
+(define-minor-mode keymap-tests-minor-mode "Test.")
+
+(define-derived-mode keymap-tests-major-mode nil "Test.")
+
+(ert-deftest keymap-where-is-internal/shadowed ()
+  (with-temp-buffer
+    (keymap-tests-major-mode)
+    (keymap-tests-minor-mode)
+    (should-not (where-is-internal 'keymap-tests--command-1 nil t))
+    (should (equal (where-is-internal 'keymap-tests--command-2 nil t) [120]))))
+
+(ert-deftest keymap-where-is-internal/preferred-modifier-is-a-string ()
   "Make sure we don't crash when `where-is-preferred-modifier' is not a 
symbol."
   (should
    (equal (let ((where-is-preferred-modifier "alt"))
             (where-is-internal 'execute-extended-command global-map t))
           [#x8000078])))
 
+(ert-deftest keymap-apropos-internal ()
+  (should (equal (apropos-internal "^next-line$") '(next-line)))
+  (should (>= (length (apropos-internal "^help")) 100))
+  (should-not (apropos-internal "^test-a-missing-symbol-foo-bar-zut$")))
+
+(ert-deftest keymap-apropos-internal/predicate ()
+  (should (equal (apropos-internal "^next-line$" #'commandp) '(next-line)))
+  (should (>= (length (apropos-internal "^help" #'commandp)) 15))
+  (should-not (apropos-internal "^next-line$" #'keymapp)))
+
 (provide 'keymap-tests)
 
 ;;; keymap-tests.el ends here
diff --git a/test/src/print-tests.el b/test/src/print-tests.el
index eb9572d..202555a 100644
--- a/test/src/print-tests.el
+++ b/test/src/print-tests.el
@@ -383,5 +383,28 @@ otherwise, use a different charset."
       (let ((print-length 1))
         (format "%S" h))))))
 
+(print-tests--deftest print-integers-as-characters ()
+  ;; Bug#44155.
+  (let* ((print-integers-as-characters t)
+         (chars '(?? ?\; ?\( ?\) ?\{ ?\} ?\[ ?\] ?\" ?\' ?\\ ?f ?~ ?Á 32
+                  ?\n ?\r ?\t ?\b ?\f ?\a ?\v ?\e ?\d))
+         (nums '(-1 -65 0 1 31 #x80 #x9f #x110000 #x3fff80 #x3fffff))
+         (nonprints '(#xd800 #xdfff #x030a #xffff #x2002 #x200c))
+         (printed-chars (print-tests--prin1-to-string chars))
+         (printed-nums (print-tests--prin1-to-string nums))
+         (printed-nonprints (print-tests--prin1-to-string nonprints)))
+    (should (equal (read printed-chars) chars))
+    (should (equal
+             printed-chars
+             (concat
+              "(?? ?\\; ?\\( ?\\) ?\\{ ?\\} ?\\[ ?\\] ?\\\" ?\\' ?\\\\"
+              " ?f ?~ ?Á ?\\s ?\\n ?\\r ?\\t ?\\b ?\\f 7 11 27 127)")))
+    (should (equal (read printed-nums) nums))
+    (should (equal printed-nums
+                   "(-1 -65 0 1 31 128 159 1114112 4194176 4194303)"))
+    (should (equal (read printed-nonprints) nonprints))
+    (should (equal printed-nonprints
+                   "(55296 57343 778 65535 8194 8204)"))))
+
 (provide 'print-tests)
 ;;; print-tests.el ends here
diff --git a/test/src/xdisp-tests.el b/test/src/xdisp-tests.el
index fad90fa..a7e05a5 100644
--- a/test/src/xdisp-tests.el
+++ b/test/src/xdisp-tests.el
@@ -57,9 +57,9 @@
          (xdisp-tests--in-minibuffer
            (let ((max-mini-window-height 4))
              (dotimes (_ 80) (insert "\nhello"))
-             (beginning-of-buffer)
+             (goto-char (point-min))
              (redisplay 'force)
-             (end-of-buffer)
+             (goto-char (point-max))
              ;; A simple edit like removing the last `o' shouldn't cause
              ;; the rest of the minibuffer's text to move.
              (list



reply via email to

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