emacs-diffs
[Top][All Lists]
Advanced

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

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


From: Yuuki Harano
Subject: feature/pgtk b302a55: Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
Date: Sun, 25 Apr 2021 02:31:17 -0400 (EDT)

branch: feature/pgtk
commit b302a551ab50a3d961f438380e9d095870c11a6c
Merge: de46c77 86d1b4d
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Yuuki Harano <masm+github@masm11.me>

    Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
---
 Makefile.in                                        |   19 +-
 admin/charsets/eucjp-ms.awk                        |    2 +-
 admin/charsets/mule-charsets.el                    |    2 +-
 admin/unidata/unidata-gen.el                       |    6 +-
 configure.ac                                       |    7 +
 doc/emacs/maintaining.texi                         |    8 +-
 doc/emacs/mini.texi                                |    3 +
 doc/lispref/macros.texi                            |   18 +-
 doc/lispref/minibuf.texi                           |   39 +-
 doc/lispref/nonascii.texi                          |   10 +-
 doc/lispref/windows.texi                           |   10 +-
 doc/misc/erc.texi                                  |   73 +-
 doc/misc/gnus.texi                                 |    2 +-
 doc/misc/modus-themes.org                          |  499 ++-
 doc/misc/sem-user.texi                             |    2 +-
 doc/misc/tramp.texi                                |   24 +-
 etc/NEWS                                           |   76 +-
 etc/themes/manoj-dark-theme.el                     |    2 +-
 etc/themes/modus-operandi-theme.el                 |    5 +-
 etc/themes/modus-themes.el                         | 2333 +++++++------
 etc/themes/modus-vivendi-theme.el                  |    5 +-
 leim/leim-ext.el                                   |    2 +-
 lib-src/seccomp-filter.c                           |   15 +-
 lisp/allout-widgets.el                             |    4 +-
 lisp/calc/calc-menu.el                             |    2 +
 lisp/calc/calc-nlfit.el                            |    2 +
 lisp/cedet/semantic/wisent/comp.el                 |    2 +-
 lisp/cus-theme.el                                  |    6 +-
 lisp/custom.el                                     |   11 +-
 lisp/dframe.el                                     |    2 +-
 lisp/dos-w32.el                                    |    2 +-
 lisp/emacs-lisp/byte-opt.el                        |    4 +-
 lisp/emacs-lisp/check-declare.el                   |    2 +-
 lisp/emacs-lisp/cl-generic.el                      |    2 +-
 lisp/emacs-lisp/easy-mmode.el                      |   23 +-
 lisp/emacs-lisp/eieio-custom.el                    |    2 +-
 lisp/emacs-lisp/eieio-opt.el                       |    2 +-
 lisp/emacs-lisp/eieio-speedbar.el                  |    2 +-
 lisp/emacs-lisp/eieio.el                           |    2 +-
 lisp/emacs-lisp/eldoc.el                           |   16 +-
 lisp/emacs-lisp/package.el                         |   10 +-
 lisp/emacs-lisp/rx.el                              |    2 +-
 lisp/emacs-lisp/tcover-ses.el                      |    4 +-
 lisp/emacs-lisp/testcover.el                       |    4 +-
 lisp/emacs-lisp/text-property-search.el            |    2 +
 lisp/emacs-lisp/unsafep.el                         |    2 +-
 lisp/erc/erc-backend.el                            |   30 +-
 lisp/erc/erc-button.el                             |    2 +-
 lisp/erc/erc-desktop-notifications.el              |    2 +-
 lisp/erc/erc-goodies.el                            |    2 +-
 lisp/erc/erc-imenu.el                              |    2 +-
 lisp/erc/erc-menu.el                               |    2 +-
 lisp/erc/erc-page.el                               |    2 +-
 lisp/erc/erc-replace.el                            |    2 +-
 lisp/erc/erc-ring.el                               |    2 +-
 lisp/erc/erc.el                                    |  100 +-
 lisp/files.el                                      |   15 +-
 lisp/gnus/gnus-group.el                            |    3 +-
 lisp/gnus/gnus-notifications.el                    |    2 +-
 lisp/gnus/gnus-sum.el                              |    2 +-
 lisp/gnus/legacy-gnus-agent.el                     |    2 +-
 lisp/gnus/mm-archive.el                            |    2 +-
 lisp/gnus/spam-report.el                           |    2 +-
 lisp/help-macro.el                                 |   12 +-
 lisp/help.el                                       |  163 +-
 lisp/info.el                                       |    5 +-
 lisp/international/mule-cmds.el                    |    2 +-
 lisp/isearch.el                                    |   54 +-
 lisp/language/burmese.el                           |    2 +
 lisp/language/cham.el                              |    2 +
 lisp/language/khmer.el                             |    2 +-
 lisp/language/sinhala.el                           |    2 +-
 lisp/language/tai-viet.el                          |    2 +
 lisp/language/thai-word.el                         |    4 +-
 lisp/language/tv-util.el                           |    3 +-
 lisp/leim/quail/croatian.el                        |    2 +-
 lisp/leim/quail/hebrew.el                          |    2 +-
 lisp/leim/quail/persian.el                         |    2 +-
 lisp/mail/rmail-spam-filter.el                     |    2 +-
 lisp/mail/rmailmm.el                               |    6 +-
 lisp/mail/uudecode.el                              |    2 +-
 lisp/mh-e/mh-search.el                             |    4 +-
 lisp/minibuffer.el                                 |  128 +-
 lisp/misearch.el                                   |    2 +-
 lisp/mpc.el                                        |  158 +-
 lisp/net/newst-ticker.el                           |    2 +-
 lisp/net/rcirc.el                                  |    5 +-
 lisp/net/secrets.el                                |    2 +
 lisp/net/sieve-manage.el                           |    2 +-
 lisp/net/sieve-mode.el                             |    2 +-
 lisp/net/sieve.el                                  |    2 +-
 lisp/net/tramp-cmds.el                             |   43 +
 lisp/net/tramp-sh.el                               |    8 +-
 lisp/notifications.el                              |    2 +
 lisp/nxml/rng-cmpct.el                             |    2 +-
 lisp/obsolete/info-edit.el                         |    2 +-
 lisp/obsolete/old-emacs-lock.el                    |    4 +-
 lisp/obsolete/otodo-mode.el                        |    4 +-
 lisp/obsolete/sb-image.el                          |    2 +-
 lisp/org/ob-hledger.el                             |    2 +-
 lisp/org/ob-mscgen.el                              |    4 +-
 lisp/org/ol-eshell.el                              |    2 +-
 lisp/org/org-ctags.el                              |    4 +-
 lisp/org/ox-man.el                                 |    2 +-
 lisp/outline.el                                    |   39 +
 lisp/progmodes/bug-reference.el                    |    2 +-
 lisp/progmodes/cc-awk.el                           |    2 +-
 lisp/progmodes/cc-styles.el                        |    2 +-
 lisp/progmodes/cperl-mode.el                       |    2 +-
 lisp/progmodes/ebrowse.el                          |    2 +-
 lisp/progmodes/idlw-shell.el                       |    2 +-
 lisp/progmodes/idlwave.el                          |    2 +-
 lisp/progmodes/js.el                               |    7 +-
 lisp/progmodes/project.el                          |   38 +-
 lisp/progmodes/sql.el                              |    4 +-
 lisp/progmodes/which-func.el                       |   19 +-
 lisp/progmodes/xref.el                             |   11 +-
 lisp/replace.el                                    |    2 +-
 lisp/rot13.el                                      |   29 +-
 lisp/ses.el                                        |    2 +-
 lisp/speedbar.el                                   |    4 +-
 lisp/startup.el                                    |    2 +-
 lisp/strokes.el                                    |   13 +-
 lisp/subr.el                                       |   34 +-
 lisp/svg.el                                        |   48 +-
 lisp/term/konsole.el                               |    2 +-
 lisp/term/linux.el                                 |    4 +-
 lisp/term/lk201.el                                 |    2 +-
 lisp/term/screen.el                                |    2 +-
 lisp/term/st.el                                    |    2 +-
 lisp/term/tmux.el                                  |    2 +-
 lisp/term/w32console.el                            |    2 +-
 lisp/textmodes/flyspell.el                         |    2 +-
 lisp/textmodes/remember.el                         |    2 +-
 lisp/textmodes/sgml-mode.el                        |    3 +-
 lisp/thingatpt.el                                  |    6 +-
 lisp/time.el                                       |   11 +-
 lisp/transient.el                                  | 3615 ++++++++++++++++++++
 lisp/url/url-mailto.el                             |    2 +-
 lisp/vc/vc-dispatcher.el                           |    2 +-
 lisp/vc/vc-filewise.el                             |    2 +
 lisp/wdired.el                                     |   43 +-
 lisp/window.el                                     |    4 +-
 src/character.h                                    |    2 +-
 src/frame.c                                        |   15 +-
 src/keyboard.c                                     |    2 +-
 src/keymap.c                                       |    6 -
 src/minibuf.c                                      |   87 +-
 src/w32fns.c                                       |    2 +
 src/window.c                                       |   60 +-
 src/xdisp.c                                        |   14 +-
 src/xfns.c                                         |    2 +
 test/lisp/autorevert-tests.el                      |    2 +-
 test/lisp/calendar/icalendar-tests.el              |    2 +-
 test/lisp/calendar/parse-time-tests.el             |    2 +-
 test/lisp/cedet/srecode-utest-template.el          |    2 +-
 test/lisp/custom-resources/custom--test-theme.el   |    2 +-
 test/lisp/descr-text-tests.el                      |    2 +-
 .../eieio-tests/eieio-test-methodinvoke.el         |    2 +-
 test/lisp/emacs-lisp/eieio-tests/eieio-tests.el    |    2 +-
 test/lisp/eshell/em-hist-tests.el                  |    2 +-
 test/lisp/eshell/em-ls-tests.el                    |    2 +-
 test/lisp/eshell/esh-opt-tests.el                  |    2 +-
 test/lisp/eshell/eshell-tests.el                   |    2 +-
 test/lisp/gnus/message-tests.el                    |    2 +-
 test/lisp/info-xref-tests.el                       |    2 +-
 test/lisp/international/ucs-normalize-tests.el     |    2 +-
 test/lisp/minibuffer-tests.el                      |   59 +-
 test/lisp/net/nsm-tests.el                         |    2 +-
 test/lisp/net/shr-tests.el                         |    2 +-
 test/lisp/play/cookie1-tests.el                    |    2 +-
 test/lisp/progmodes/cperl-mode-tests.el            |   31 +-
 test/lisp/progmodes/perl-mode-tests.el             |    2 +-
 test/lisp/progmodes/project-tests.el               |   61 +-
 test/lisp/progmodes/xref-tests.el                  |    2 +
 test/lisp/simple-tests.el                          |    2 +-
 test/lisp/textmodes/fill-tests.el                  |    2 +-
 test/lisp/textmodes/tildify-tests.el               |    2 +-
 test/lisp/thingatpt-tests.el                       |    2 +-
 test/lisp/vc/vc-bzr-tests.el                       |    2 +-
 test/lisp/xml-tests.el                             |    2 +-
 test/manual/cedet/semantic-tests.el                |    2 +-
 test/manual/image-size-tests.el                    |    2 +-
 test/manual/image-transforms-tests.el              |    2 +-
 test/manual/scroll-tests.el                        |    2 +-
 test/misc/test-custom-noloads.el                   |    4 +-
 test/src/character-tests.el                        |    2 +-
 test/src/coding-tests.el                           |    2 +-
 test/src/editfns-tests.el                          |    2 +-
 test/src/emacs-module-tests.el                     |    2 +-
 test/src/fileio-tests.el                           |    2 +-
 test/src/thread-tests.el                           |    2 +-
 test/src/timefns-tests.el                          |    2 +-
 193 files changed, 6672 insertions(+), 1824 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index 059ce1a..64ad53a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -841,12 +841,11 @@ mostlyclean: $(mostlyclean_dirs:=_mostlyclean)
 ###      with them.
 ###
 ###      Delete '.dvi' files here if they are not part of the distribution.
-clean_dirs = $(mostlyclean_dirs) nextstep
+clean_dirs = $(mostlyclean_dirs) nextstep admin/charsets admin/unidata
 
 $(foreach dir,$(clean_dirs),$(eval $(call submake_template,$(dir),clean)))
 
 clean: $(clean_dirs:=_clean) clean-gsettings-schemas
-       $(MAKE) -C admin/charsets $@
        [ ! -d test ] || $(MAKE) -C test $@
        -rm -f ./*.tmp etc/*.tmp*
        -rm -rf info-dir.*
@@ -867,16 +866,11 @@ top_distclean=\
        rm -f config.status config.log~ \
          Makefile makefile lib/gnulib.mk ${SUBDIR_MAKEFILES}
 
-distclean_dirs = $(clean_dirs) leim lisp
+distclean_dirs = $(clean_dirs) leim lisp admin/grammars
 
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),distclean)))
 
-maybeclean_dirs = test admin/grammars admin/unidata admin/charsets
-
 distclean: $(distclean_dirs:=_distclean)
-       for dir in $(filter-out test,$(maybeclean_dirs)); do \
-         $(MAKE) -C $$dir $@ || exit; \
-       done
        [ ! -d test ] || $(MAKE) -C test $@
        ${top_distclean}
 
@@ -886,9 +880,6 @@ distclean: $(distclean_dirs:=_distclean)
 $(foreach dir,$(distclean_dirs),$(eval $(call 
submake_template,$(dir),bootstrap-clean)))
 
 bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
-       for dir in $(filter-out test,$(maybeclean_dirs)); do \
-         $(MAKE) -C $$dir $@ || exit; \
-       done
        [ ! -d test ] || $(MAKE) -C test $@
        [ ! -f config.log ] || mv -f config.log config.log~
        rm -rf ${srcdir}/info
@@ -910,14 +901,12 @@ top_maintainer_clean=\
        ${top_distclean}; \
        rm -fr autom4te.cache
 
-maintainer_clean_dirs = src leim lisp
+maintainer_clean_dirs = src leim lisp admin/charsets admin/grammars \
+  admin/unidata
 
 $(foreach dir,$(maintainer_clean_dirs),$(eval $(call 
submake_template,$(dir),maintainer-clean)))
 
 maintainer-clean: bootstrap-clean $(maintainer_clean_dirs:=_maintainer-clean)
-       for dir in $(filter-out test,$(maybeclean_dirs)); do \
-         $(MAKE) -C $$dir $@ || exit; \
-       done
        [ ! -d test ] || $(MAKE) -C test $@
        ${top_maintainer_clean}
 
diff --git a/admin/charsets/eucjp-ms.awk b/admin/charsets/eucjp-ms.awk
index ca9a317..033b37f 100644
--- a/admin/charsets/eucjp-ms.awk
+++ b/admin/charsets/eucjp-ms.awk
@@ -38,7 +38,7 @@ BEGIN {
   JISX0208_FROM2 = "/xf5/xa1";
   JISX0212_FROM = "/x8f/xf3/xf3";
 
-  print ";;; eucjp-ms.el -- translation table for eucJP-ms  -*- 
lexical-binding:t -*-";
+  print ";;; eucjp-ms.el --- translation table for eucJP-ms  -*- 
lexical-binding:t -*-";
   print ";;; Automatically generated from 
/usr/share/i18n/charmaps/EUC-JP-MS.gz";
   print "(let ((map";
   print "       '(;JISEXT<->UNICODE";
diff --git a/admin/charsets/mule-charsets.el b/admin/charsets/mule-charsets.el
index 99a8c60..7bcceb3 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.  -*- 
lexical-binding: t -*-
+;;; 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
diff --git a/admin/unidata/unidata-gen.el b/admin/unidata/unidata-gen.el
index 221c9b1..abd41e3 100644
--- a/admin/unidata/unidata-gen.el
+++ b/admin/unidata/unidata-gen.el
@@ -1,4 +1,4 @@
-;; unidata-gen.el -- Create files containing character property data  -*- 
lexical-binding:t -*-
+;;; unidata-gen.el --- Create files containing character property data  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
@@ -1446,7 +1446,7 @@ Property value is a symbol `o' (Open), `c' (Close), or 
`n' (None)."
                 ";; no-byte-compile: t\n"
                 ";; no-update-autoloads: t\n"
                 ";; End:\n\n"
-                (format ";; %s ends here\n" basename)))))
+                (format ";;; %s ends here\n" basename)))))
   (or noninteractive (message "Generating %s...done" file)))
 
 (defun unidata-gen-charprop (&optional charprop-file)
@@ -1470,7 +1470,7 @@ Property value is a symbol `o' (Open), `c' (Close), or 
`n' (None)."
            ";; no-byte-compile: t\n"
            ";; no-update-autoloads: t\n"
            ";; End:\n\n"
-           (format ";; %s ends here\n"
+            (format ";;; %s ends here\n"
                    (file-name-nondirectory charprop-file)))))
 
 
diff --git a/configure.ac b/configure.ac
index fc95d19..0b5c0fe 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5639,6 +5639,13 @@ case "$opsys" in
      x86_64-*-*) LD_SWITCH_SYSTEM_TEMACS="-Wl,-stack,0x00800000 
-Wl,-heap,0x00100000 -Wl,-image-base,0x400000000 -Wl,-entry,__start 
-Wl,-Map,./temacs.map" ;;
      *) LD_SWITCH_SYSTEM_TEMACS="-Wl,-stack,0x00800000 -Wl,-heap,0x00100000 
-Wl,-image-base,0x01000000 -Wl,-entry,__start -Wl,-Map,./temacs.map" ;;
    esac
+   ## If they want unexec, disable Windows ASLR for the Emacs binary
+   if test "$with_dumping" = "unexec"; then
+      case "$canonical" in
+        x86_64-*-*) LD_SWITCH_SYSTEM_TEMACS="$LD_SWITCH_SYSTEM_TEMACS 
-Wl,-disable-dynamicbase -Wl,-disable-high-entropy-va 
-Wl,-default-image-base-low" ;;
+        *) LD_SWITCH_SYSTEM_TEMACS="$LD_SWITCH_SYSTEM_TEMACS 
-Wl,-disable-dynamicbase" ;;
+      esac
+   fi
    ;;
 
   *) LD_SWITCH_SYSTEM_TEMACS= ;;
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index dfe4eb0..880829a 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -2213,7 +2213,8 @@ the special XREF mode:
 @table @kbd
 @item @key{RET}
 @itemx mouse-2
-Display the reference on the current line.
+Display the reference on the current line (@code{xref-goto-xref}).
+With prefix argument, also bury the @file{*xref*} buffer.
 
 @item n
 @itemx .
@@ -2242,11 +2243,6 @@ display it in the other window (@code{xref-prev-group}).
 Display the reference on the current line in the other window
 (@code{xref-show-location-at-point}).
 
-@item @key{TAB}
-@findex xref-quit-and-goto-xref
-Display the reference on the current line and bury the @file{*xref*}
-buffer (@code{xref-quit-and-goto-xref}).
-
 @item r @var{pattern} @key{RET} @var{replacement} @key{RET}
 Perform interactive query-replace on references that match
 @var{pattern} (@code{xref-query-replace-in-results}), replacing
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
index 1eba707..03db669 100644
--- a/doc/emacs/mini.texi
+++ b/doc/emacs/mini.texi
@@ -247,6 +247,9 @@ You might need also to enable 
@code{minibuffer-depth-indicate-mode}
 to show the current recursion depth in the minibuffer prompt
 on recursive use of the minibuffer.
 
+  When active, the minibuffer is usually in @code{minibuffer-mode}.
+This is an internal Emacs mode without any special features.
+
 @findex minibuffer-inactive-mode
   When not active, the minibuffer is in @code{minibuffer-inactive-mode},
 and clicking @kbd{mouse-1} there shows the @file{*Messages*} buffer.
diff --git a/doc/lispref/macros.texi b/doc/lispref/macros.texi
index e56a85c..7c090ae 100644
--- a/doc/lispref/macros.texi
+++ b/doc/lispref/macros.texi
@@ -480,13 +480,15 @@ in expressions ordinarily.
 
   Another problem can happen if the macro definition itself
 evaluates any of the macro argument expressions, such as by calling
-@code{eval} (@pxref{Eval}).  If the argument is supposed to refer to the
-user's variables, you may have trouble if the user happens to use a
+@code{eval} (@pxref{Eval}).  You have to take into account that the
+context of the caller is not accessible at that time since the macro expansion
+may take place long before the code is executed.  Also if your macro definition
+does not use @code{lexical-binding} its own variables may hide the
+user's variables, if the user happens to use a
 variable with the same name as one of the macro arguments.  Inside the
 macro body, the macro argument binding is the most local binding of this
 variable, so any references inside the form being evaluated do refer to
 it.  Here is an example:
-
 @example
 @group
 (defmacro foo (a)
@@ -508,12 +510,10 @@ it.  Here is an example:
 @code{x}, because @code{a} conflicts with the macro argument variable
 @code{a}.
 
-  Another problem with calling @code{eval} in a macro definition is that
-it probably won't do what you intend in a compiled program.  The
-byte compiler runs macro definitions while compiling the program, when
-the program's own computations (which you might have wished to access
-with @code{eval}) don't occur and its local variable bindings don't
-exist.
+  Also the expansion of @code{(foo x)} above will return something
+different or signal an error when the code is compiled since in that case
+@code{(foo x)} is expanded during compilation whereas the execution of
+@code{(setq x 'b)} will only take place later when the code is executed.
 
   To avoid these problems, @strong{don't evaluate an argument expression
 while computing the macro expansion}.  Instead, substitute the
diff --git a/doc/lispref/minibuf.texi b/doc/lispref/minibuf.texi
index d16409d..7cf2fcf 100644
--- a/doc/lispref/minibuf.texi
+++ b/doc/lispref/minibuf.texi
@@ -97,6 +97,14 @@ to be done.  @xref{Text from Minibuffer}, for the 
non-completion
 minibuffer local maps.  @xref{Completion Commands}, for the minibuffer
 local maps for completion.
 
+@cindex active minibuffer
+  An active minibuffer usually has major mode @code{minibuffer-mode}.
+This is an Emacs internal mode without any special features.  To
+customize the setup of minibuffers, we suggest you use
+@code{minibuffer-setup-hook} (@pxref{Minibuffer Misc}) rather than
+@code{minibuffer-mode-hook}, since the former is run later, after the
+minibuffer has been fully initialized.
+
 @cindex inactive minibuffer
   When a minibuffer is inactive, its major mode is
 @code{minibuffer-inactive-mode}, with keymap
@@ -167,8 +175,10 @@ various applications such as completion.
 
 The argument @var{history} specifies a history list variable to use
 for saving the input and for history commands used in the minibuffer.
-It defaults to @code{minibuffer-history}.  You can optionally specify
-a starting position in the history list as well.  @xref{Minibuffer History}.
+It defaults to @code{minibuffer-history}.  If @var{history} is the
+symbol @code{t}, history is not recorded.  You can optionally specify
+a starting position in the history list as well.  @xref{Minibuffer
+History}.
 
 If the variable @code{minibuffer-allow-text-properties} is
 non-@code{nil}, then the string that is returned includes whatever text
@@ -970,16 +980,19 @@ and @var{suffix} holds the text after point.
 
 Normally completion operates on the whole string, so for all normal
 collections, this will always return @code{(0 . (length
-@var{suffix}))}.  But more complex completion such as completion on
-files is done one field at a time.  For example, completion of
+@var{suffix}))}.  But more complex completion, such as completion on
+files, is done one field at a time.  For example, completion of
 @code{"/usr/sh"} will include @code{"/usr/share/"} but not
 @code{"/usr/share/doc"} even if @code{"/usr/share/doc"} exists.
 Also @code{all-completions} on @code{"/usr/sh"} will not include
 @code{"/usr/share/"} but only @code{"share/"}.  So if @var{string} is
 @code{"/usr/sh"} and @var{suffix} is @code{"e/doc"},
-@code{completion-boundaries} will return @code{(5 . 1)} which tells us
+@code{completion-boundaries} will return @w{@code{(5 . 1)}} which tells us
 that the @var{collection} will only return completion information that
 pertains to the area after @code{"/usr/"} and before @code{"/doc"}.
+@code{try-completion} is not affected by nontrivial boundaries; e.g.,
+@code{try-completion} on @code{"/usr/sh"} might still return
+@code{"/usr/share/"}, not @code{"share/"}.
 @end defun
 
 If you store a completion alist in a variable, you should mark the
@@ -1107,9 +1120,10 @@ The function @code{completing-read} uses
 @code{minibuffer-local-must-match-map} if @var{require-match} is
 non-@code{nil}.  @xref{Completion Commands}.
 
-The argument @var{history} specifies which history list variable to use for
-saving the input and for minibuffer history commands.  It defaults to
-@code{minibuffer-history}.  @xref{Minibuffer History}.
+The argument @var{history} specifies which history list variable to
+use for saving the input and for minibuffer history commands.  It
+defaults to @code{minibuffer-history}.  If @var{history} is the symbol
+@code{t}, history is not recorded.  @xref{Minibuffer History}.
 
 The argument @var{initial} is mostly deprecated; we recommend using a
 non-@code{nil} value only in conjunction with specifying a cons cell
@@ -1883,6 +1897,13 @@ should return @code{(boundaries @var{start} . 
@var{end})}, where
 string, and @var{end} is the position of the end boundary in
 @var{suffix}.
 
+If a Lisp program returns nontrivial boundaries, it should make sure that the
+@code{all-completions} operation is consistent with them.  The
+completions returned by @code{all-completions} should only pertain to
+the piece of the prefix and suffix covered by the completion
+boundaries.  @xref{Basic Completion}, for the precise expected semantics
+of completion boundaries.
+
 @item metadata
 This specifies a request for information about the state of the
 current completion.  The return value should have the form
@@ -1961,7 +1982,7 @@ was entered.
 The return value of @code{completion-table-dynamic} is a function that
 can be used as the 2nd argument to @code{try-completion} and
 @code{all-completions}.  Note that this function will always return
-empty metadata and trivial boundaries (@pxref{Programmed Completion}).
+empty metadata and trivial boundaries.
 @end defun
 
 @defun completion-table-with-cache function &optional ignore-case
diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi
index 84f5d2f..c22930d 100644
--- a/doc/lispref/nonascii.texi
+++ b/doc/lispref/nonascii.texi
@@ -301,7 +301,7 @@ character, and returns that character.  If @var{char} is 
neither
 @end defun
 
 @defun unibyte-char-to-multibyte char
-This convert the unibyte character @var{char} to a multibyte
+This converts the unibyte character @var{char} to a multibyte
 character, assuming @var{char} is either @acronym{ASCII} or raw 8-bit
 byte.
 @end defun
@@ -676,7 +676,7 @@ This function returns the value of @var{char}'s 
@var{propname} property.
 @end group
 @group
 (get-char-code-property ?\( 'paired-bracket)
-     @result{} 41  ;; closing parenthesis
+     @result{} 41  ; closing parenthesis
 @end group
 @group
 (get-char-code-property ?\) 'bracket-type)
@@ -955,13 +955,13 @@ translating the result.
 
 @defvar standard-translation-table-for-decode
 This is the default translation table for decoding.  If a coding
-systems specifies its own translation tables, the table that is the
+system specifies its own translation tables, the table that is the
 value of this variable, if non-@code{nil}, is applied after them.
 @end defvar
 
 @defvar standard-translation-table-for-encode
 This is the default translation table for encoding.  If a coding
-systems specifies its own translation tables, the table that is the
+system specifies its own translation tables, the table that is the
 value of this variable, if non-@code{nil}, is applied after them.
 @end defvar
 
@@ -1258,7 +1258,7 @@ name or @code{nil}.
 @defun check-coding-system coding-system
 This function checks the validity of @var{coding-system}.  If that is
 valid, it returns @var{coding-system}.  If @var{coding-system} is
-@code{nil}, the function return @code{nil}.  For any other values, it
+@code{nil}, the function returns @code{nil}.  For any other values, it
 signals an error whose @code{error-symbol} is @code{coding-system-error}
 (@pxref{Signaling Errors, signal}).
 @end defun
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index c32d711..82d2ce4 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -5877,7 +5877,7 @@ which window parameters (if any) are saved by this 
function.
 @xref{Window Parameters}.
 @end defun
 
-@defun set-window-configuration configuration &optional dont-set-frame
+@defun set-window-configuration configuration &optional dont-set-frame 
dont-set-miniwindow
 This function restores the configuration of windows and buffers as
 specified by @var{configuration}, for the frame that
 @var{configuration} was created for, regardless of whether that frame
@@ -5885,8 +5885,12 @@ is selected or not.  The argument @var{configuration} 
must be a value
 that was previously returned by @code{current-window-configuration}
 for that frame.  Normally the function also selects the frame which is
 recorded in the configuration, but if @var{dont-set-frame} is
-non-@code{nil}, it leaves selected the frame which was current at the
-start of the function.
+non-@code{nil}, it leaves selected the frame which was already
+selected at the start of the function.
+
+Normally the function restores the saved minibuffer (if any), but if
+@var{dont-set-miniwindow} is non-@code{nil}, the minibuffer current
+at the start of the function (if any) remains in the mini-window.
 
 If the frame from which @var{configuration} was saved is dead, all
 this function does is to restore the value of the variable
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index d635cac..45a753d 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -514,15 +514,82 @@ Non-interactively, it takes the following keyword 
arguments.
 
 That is, if called with the following arguments, @var{server} and
 @var{full-name} will be set to those values, whereas
-@code{erc-compute-port}, @code{erc-compute-nick} and
-@code{erc-compute-full-name} will be invoked for the values of the other
-parameters.
+@code{erc-compute-port} and @code{erc-compute-nick} will be invoked
+for the values of the other parameters.
 
 @example
 (erc :server "chat.freenode.net" :full-name "Harry S Truman")
 @end example
 @end defun
 
+To connect securely over an encrypted TLS connection, use @kbd{M-x
+erc-tls}.
+
+@defun erc-tls
+Select connection parameters and run ERC over TLS@.
+Non-interactively, it takes the following keyword arguments.
+
+@itemize @bullet
+@item @var{server}
+@item @var{port}
+@item @var{nick}
+@item @var{password}
+@item @var{full-name}
+@item @var{client-certificate}
+@end itemize
+
+That is, if called with the following arguments, @var{server} and
+@var{full-name} will be set to those values, whereas
+@code{erc-compute-port} and @code{erc-compute-nick} will be invoked
+for the values of the other parameters, and @code{client-certificate}
+will be @code{nil}.
+
+@example
+(erc-tls :server "chat.freenode.net" :full-name "Harry S Truman")
+@end example
+
+To use a certificate with @code{erc-tls}, specify the optional
+@var{client-certificate} keyword argument, whose value should be as
+described in the documentation of @code{open-network-stream}: if
+non-@code{nil}, it should either be a list where the first element is
+the file name of the private key corresponding to a client certificate
+and the second element is the file name of the client certificate
+itself to use when connecting over TLS, or @code{t}, which means that
+@code{auth-source} will be queried for the private key and the
+certificate.  Authenticating using a TLS client certificate is also
+refered to as ``CertFP'' (Certificate Fingerprint) authentication by
+various IRC networks.
+
+Examples of use:
+
+@example
+(erc-tls :server "chat.freenode.net" :port 6697
+         :client-certificate
+         '("/home/bandali/my-cert.key"
+           "/home/bandali/my-cert.crt"))
+@end example
+
+@example
+(erc-tls :server "chat.freenode.net" :port 6697
+         :client-certificate
+         `(,(expand-file-name "~/cert-freenode.key")
+           ,(expand-file-name "~/cert-freenode.crt")))
+@end example
+
+@example
+(erc-tls :server "chat.freenode.net" :port 6697
+         :client-certificate t)
+@end example
+
+In the case of @code{:client-certificate t}, you will need to add a
+line like the following to your authinfo file
+(e.g. @file{~/.authinfo.gpg}):
+
+@example
+machine chat.freenode.net key /home/bandali/my-cert.key cert 
/home/bandali/my-cert.crt
+@end example
+@end defun
+
 @subheading Server
 
 @defun erc-compute-server &optional server
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index b6553c8..869bb27 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -17966,7 +17966,7 @@ This creates a group including all flagged messages 
from all groups on
 two IMAP servers, "home" and "work".
 
 And one last example.  Here is a function that runs a search query to
-find all message that have been received recently from certain groups:
+find all messages that have been received recently from certain groups:
 
 @lisp
 (defun my-recent-email (args)
diff --git a/doc/misc/modus-themes.org b/doc/misc/modus-themes.org
index 9764a34..001ed57 100644
--- a/doc/misc/modus-themes.org
+++ b/doc/misc/modus-themes.org
@@ -4,9 +4,9 @@
 #+language: en
 #+options: ':t toc:nil author:t email:t
 
-#+macro: stable-version 1.2.3
-#+macro: release-date 2021-03-05
-#+macro: development-version 1.3.0-dev
+#+macro: stable-version 1.3.2
+#+macro: release-date 2021-04-18
+#+macro: development-version 1.4.0-dev
 #+macro: export-date (eval (format-time-string "%F %R %z" (current-time)))
 #+macro: file @@texinfo:@file{@@$1@@texinfo:}@@
 #+macro: space @@texinfo:@: @@
@@ -46,11 +46,15 @@ built on {{{export-date}}}.
 Copyright (C) 2020-2021  Free Software Foundation, Inc.
 
 #+begin_quote
-Permission is granted to copy, distribute and/or modify this
-document under the terms of the GNU Free Documentation License,
-Version 1.3 or any later version published by the Free Software
-Foundation; with no Invariant Sections, with no Front-Cover Texts,
-and with no Back-Cover Texts.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and
+with the Back-Cover Texts as in (a) below.  A copy of the license is
+included in the section entitled “GNU Free Documentation License.”
+
+(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and
+modify this GNU manual.”
 #+end_quote
 
 * Overview
@@ -141,7 +145,7 @@ The themes are now ready to be used: 
[[#h:3f3c3728-1b34-437d-9d0c-b110f5b161a9][
 :custom_id: h:c4b10085-149f-43e2-bd4d-347f33aee054
 :end:
 
-The =modus-themes= package is available from the GNU ELPA archive, which
+The ~modus-themes~ package is available from the GNU ELPA archive, which
 is configured by default.
 
 Prior to querying any package archive, make sure to have updated the
@@ -287,7 +291,8 @@ package configurations in their setup.  We use this as an 
example:
   :init
   ;; Add all your customizations prior to loading the themes
   (setq modus-themes-slanted-constructs t
-        modus-themes-bold-constructs nil)
+        modus-themes-bold-constructs nil
+        modus-themes-region 'no-extend)
 
   ;; Load the theme files before enabling a theme (else you get an error).
   (modus-themes-load-themes)
@@ -374,13 +379,13 @@ Symbol: ~modus-themes-bold-constructs~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 The default is to use a bold typographic weight only when it is
 required.
 
-With a non-nil value (=t=) display several syntactic constructs in bold
+With a non-nil value (~t~) display several syntactic constructs in bold
 weight.  This concerns keywords and other important aspects of code
 syntax.  It also affects certain mode line indicators and command-line
 prompts.
@@ -397,13 +402,13 @@ Symbol: ~modus-themes-slanted-constructs~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 The default is to not use slanted text (italics) unless it is absolutely
 necessary.
 
-With a non-nil value (=t=) choose to render more faces in slanted text.
+With a non-nil value (~t~) choose to render more faces in slanted text.
 This typically affects documentation strings and code comments.
 
 ** Option for syntax highlighting
@@ -418,7 +423,7 @@ Symbol: ~modus-themes-syntax~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~faint~
 3. ~yellow-comments~
 4. ~green-strings~
@@ -467,8 +472,8 @@ Symbol: ~modus-themes-no-mixed-fonts~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 By default, the themes configure some spacing-sensitive faces like Org
 tables and code blocks to always inherit from the ~fixed-pitch~ face.
@@ -476,14 +481,14 @@ This is to ensure that those constructs remain monospaced 
even when
 users opt for a mode that remaps typeface families, such as the built-in
 {{{kbd(M-x variable-pitch-mode)}}}.  Otherwise the layout would appear
 broken, due to how spacing is done.  To disable this behaviour, set the
-option to =t=.
+option to ~t~.
 
 Users may prefer to use another package for handling mixed typeface
 configurations, rather than letting the theme do it, perhaps because a
 purpose-specific package has extra functionality.  Two possible options
 are ~org-variable-pitch~ and ~mixed-pitch~.
 
-[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org (and 
others)]].
+[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and 
others]].
 
 ** Option for links
 :properties:
@@ -497,7 +502,7 @@ Symbol: ~modus-themes-links~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~faint~
 3. ~neutral-underline~
 4. ~faint-neutral-underline~
@@ -545,7 +550,7 @@ Symbol: ~modus-themes-prompts~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~subtle-accented~ (~subtle~ exists for backward compatibility)
 3. ~intense-accented~ (~intense~ exists for backward compatibility)
 4. ~subtle-gray~
@@ -577,12 +582,15 @@ Symbol: ~modus-themes-mode-line~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~3d~
 3. ~moody~
 4. ~borderless~
 5. ~borderless-3d~
 6. ~borderless-moody~
+7. ~accented~
+8. ~accented-3d~
+9. ~accented-moody~
 
 The default produces a two-dimensional effect both for the active and
 inactive modelines.  The differences between the two are limited to
@@ -612,6 +620,11 @@ that the inactive modelines remain visible, they apply a 
slightly more
 prominent background to them than what their counterparts do (same
 inactive background as with the default).
 
+Similarly, ~accented~, ~accented-3d~, and ~accented-moody~ correspond to the
+default (~nil~), ~3d~, and ~moody~ styles respectively, except that the active
+mode line uses a colored background instead of the standard shade of
+gray.
+
 Note that Moody does not expose any faces that the themes could style
 directly.  Instead it re-purposes existing ones to render its tabs and
 ribbons.  As such, there may be cases where the contrast ratio falls
@@ -624,10 +637,11 @@ is activated when Emacs determines that the background 
and foreground of
 the given construct are too close to each other in terms of color
 distance.  In effect, users would need to experiment with the variable
 ~face-near-same-color-threshold~ to trigger the effect.  We find that a
-value of =45000= will suffice, contrary to the default =30000=.  Do not set
-the value too high, because that would have the adverse effect of always
-overriding the default color (which has been carefully designed to be
-highly accessible).
+value of =45000= will suffice, contrary to the default =30000=.  Though for
+the ~accented-moody~ value mentioned above, that should be raised up to
+=70000=.  Do not set it too high, because it has the adverse effect of
+always overriding the default colors (which have been carefully designed
+to be highly accessible).
 
 Furthermore, because Moody expects an underline and overline instead of
 a box style, it is advised you include this in your setup:
@@ -648,7 +662,7 @@ Symbol: ~modus-themes-completions~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~moderate~
 3. ~opinionated~
 
@@ -661,7 +675,7 @@ The former category encompasses Icomplete, Ido, Selectrum 
as well as
 pattern matching styles like Orderless and Flx.  The latter covers Helm,
 Ivy, and similar.
 
-A value of =nil= will respect the metaphors of each completion framework.
+A value of ~nil~ will respect the metaphors of each completion framework.
 
 Option ~moderate~ applies a combination of background and foreground that
 is fairly subtle.  For Icomplete and friends this constitutes a
@@ -677,7 +691,7 @@ packages will revert to an even more nuanced aesthetic with 
some
 additional changes to the choice of hues.
 
 To appreciate the scope of this customization option, you should spend
-some time with every one of the =nil= (default), ~moderate~, and ~opinionated~
+some time with every one of the ~nil~ (default), ~moderate~, and ~opinionated~
 possibilities.
 
 ** Option for fringe visibility
@@ -692,7 +706,7 @@ Symbol: ~modus-themes-fringes~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~subtle~
 3. ~intense~
 
@@ -716,7 +730,7 @@ Symbol: ~modus-themes-lang-checkers~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~subtle-foreground~
 3. ~intense-foreground~
 4. ~straight-underline~
@@ -755,25 +769,50 @@ refer to their documentation strings.
 ** Option for line highlighting (hl-line-mode)
 :properties:
 :alt_title: Line highlighting
-:description: Toggle intense style for current line highlighting
+:description: Choose style of current line (hl-line-mode)
 :custom_id: h:1dba1cfe-d079-4c13-a810-f768e8789177
 :end:
-#+vindex: modus-themes-intense-hl-line
+#+vindex: modus-themes-hl-line
 
-Symbol: ~modus-themes-intense-hl-line~
+Symbol: ~modus-themes-hl-line~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~intense-background~
+3. ~accented-background~
+4. ~underline-neutral~
+5. ~underline-accented~
+6. ~underline-only-neutral~
+7. ~underline-only-accented~
+
+The default is to use a subtle gray background for the current line when
+~hl-line-mode~ is enabled.
+
+The ~intense-background~ applies a more prominent gray to the background
+of the current line.
+
+With ~accented-background~ the default's subtle aesthetic is retained, but
+the background has a more colored hint.
+
+The ~underline-neutral~ combines the default subtle neutral background
+with a gray underline.
 
-The default is to use a subtle gray background for ~hl-line-mode~ and its
-global equivalent.
+Similarly, the ~underline-accented~ renders the background of the current
+line in a subtle colored background, while it also draws an accented
+underline.
 
-With a non-nil value (=t=) use a more prominent background color instead.
+Option ~underline-only-neutral~ produces a neutral underline, but does not
+use any background.
 
-This affects several packages that enable ~hl-line-mode~, such as =elfeed=
-and =mu4e=.
+While ~underline-only-accented~ also uses just an underline, only this one
+is colored.
+
+Consider setting the variable ~x-underline-at-descent-line~ to a non-nil
+value for better results with underlines.
+
+This style affects several packages that enable ~hl-line-mode~, such as
+=elfeed= and =mu4e=.
 
 ** Option for line numbers (display-line-numbers-mode)
 :properties:
@@ -787,8 +826,8 @@ Symbol: ~modus-themes-subtle-line-numbers~
 
 Possible value:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 The default style for ~display-line-numbers-mode~ and its global variant
 is to apply a subtle gray background to the line numbers.  The current
@@ -799,7 +838,7 @@ Similarly, the faces for ~display-line-numbers-major-tick~ 
and its
 counterpart ~display-line-numbers-minor-tick~ use appropriate styles that
 involve a bespoke background and foreground combination.
 
-With a non-nil value (=t=), line numbers have no background of their own.
+With a non-nil value (~t~), line numbers have no background of their own.
 Instead they retain the primary background of the theme, blending with
 the rest of the buffer.  Foreground values for all relevant faces are
 updated to accommodate this aesthetic.
@@ -816,7 +855,7 @@ Symbol: ~modus-themes-paren-match~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~subtle-bold~
 3. ~intense~
 4. ~intense-bold~
@@ -847,10 +886,12 @@ Symbol: ~modus-themes-region~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~no-extend~
 3. ~bg-only~
 4. ~bg-only-no-extend~
+5. ~accent~
+6. ~accent-no-extend~
 
 Nil means to only use a prominent gray background with a neutral
 foreground.  The foreground overrides all syntax highlighting.  The
@@ -866,6 +907,11 @@ colors.  It extends to the edge of the window.
 Option ~bg-only-no-extend~ is a combination of the ~bg-only~ and ~no-extend~
 options.
 
+Option ~accent~ is like the default, though it uses a more colorful
+background, while ~accent-no-extend~ is the same except it draws the
+region only up to the end of each line instead of extending to the edge
+of the window.
+
 ** Option for diff buffer looks
 :properties:
 :alt_title: Diffs
@@ -878,7 +924,7 @@ Symbol: ~modus-themes-diffs~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~desaturated~
 3. ~fg-only~
 4. ~bg-only~
@@ -935,7 +981,7 @@ Symbol: ~modus-themes-org-blocks~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~grayscale~
 3. ~rainbow~
 
@@ -960,6 +1006,9 @@ major-mode so that the colors are applied consistently 
throughout: use
 Or start typing in each code block (inefficient at scale, but it still
 works).
 
+The extent of Org block delimiter lines is controlled by the variable
+~org-fontify-whole-block-delimiter-line~.
+
 ** Option for org-habit graph styles
 :properties:
 :alt_title: Org agenda habits
@@ -972,7 +1021,7 @@ Symbol: ~modus-themes-org-habit~
 
 Possible values:
 
-1. =nil= (default)
+1. ~nil~ (default)
 2. ~simplified~
 3. ~traffic-light~
 
@@ -1014,11 +1063,10 @@ than other customization options documented in this 
manual.
 
 Symbol: ~modus-themes-headings~
 
-Possible values, which can be specified for each heading level (examples
-further below):
+Possible values, which can be specified for each heading level N
+(examples further below):
 
-+ nil (default fallback option---covers all heading levels)
-+ =t= (default style for a single heading, when the fallback differs)
++ ~nil~ (~t~ is also available for backward compatibility)
 + ~no-bold~
 + ~line~
 + ~line-no-bold~
@@ -1058,19 +1106,19 @@ To set a uniform value for all heading levels, use this 
pattern:
       '((t . section)))
 
 ;; Default aesthetic for every heading
-(setq modus-themes-headings
-      '())
+(setq modus-themes-headings nil)
 #+end_src
 
 The default style for headings uses a fairly desaturated foreground
-value in combination with bold typographic weight.  To specify this
+color in combination with bold typographic weight.  To specify this
 style for a given level N, assuming you wish to have another fallback
-option, just specify the value =t= like this:
+option, just assign the value ~nil~ like this:
 
 #+begin_src emacs-lisp
 (setq modus-themes-headings
-      '((1 . t)
+      '((1 . nil)
         (2 . line)
+        (3) ; same as nil
         (t . rainbow-line-no-bold)))
 #+end_src
 
@@ -1122,6 +1170,9 @@ A description of all other possible styles beyond the 
default:
 
 + ~no-color-no-bold~ is like ~no-color~ but without the bold weight.
 
+Remember to also inspect relevant variables that Org provides, such as:
+~org-fontify-whole-heading-line~ and ~org-fontify-done-headline~.
+
 ** Option for scaled headings
 :properties:
 :alt_title: Scaled headings
@@ -1134,12 +1185,12 @@ Symbol: ~modus-themes-scale-headings~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 The default is to use the same size for headings and paragraph text.
 
-With a non-nil value (=t=) make headings larger in height relative to the
+With a non-nil value (~t~) make headings larger in height relative to the
 main text.  This is noticeable in modes like Org, Markdown, and Info.
 
 *** Control the scale of headings
@@ -1217,8 +1268,8 @@ Symbol: ~modus-themes-variable-pitch-ui~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 This option concerns User Interface elements that are under the direct
 control of Emacs.  In particular: the mode line, header line, tab bar,
@@ -1227,7 +1278,7 @@ and tab line.
 The default is to use the same font as the rest of Emacs, which usually
 is a monospaced family.
 
-With a non-nil value (=t=) apply a proportionately spaced typeface.  This
+With a non-nil value (~t~) apply a proportionately spaced typeface.  This
 is done by assigning the ~variable-pitch~ face to the relevant items.
 
 [[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and 
others]].
@@ -1244,13 +1295,13 @@ Symbol: ~modus-themes-variable-pitch-headings~
 
 Possible values:
 
-1. =nil= (default)
-2. =t=
+1. ~nil~ (default)
+2. ~t~
 
 The default is to use the main font family, which typically is
 monospaced.
 
-With a non-nil value (=t=) apply a proportionately spaced typeface, else
+With a non-nil value (~t~) apply a proportionately spaced typeface, else
 "variable-pitch", to headings (such as in Org mode).
 
 [[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and 
others]].
@@ -1357,7 +1408,7 @@ With that granted, let us expand the example to actually 
change the
 
 If you evaluate this form, your cursor will become blue.  But if you
 change themes, such as with ~modus-themes-toggle~, your edits will be
-lost, because the newly loaded theme will override the =:background=
+lost, because the newly loaded theme will override the ~:background~
 attribute you had assigned to that face.
 
 For such changes to persist, we need to make them after loading the
@@ -1458,7 +1509,7 @@ Getting a list of colors may have its applications, 
though what you are
 most likely interested in is how to use those variables to configure
 several faces at once.  To do so we can rely on the built-in
 ~custom-set-faces~ function, which sets face specifications for the
-special =user= theme.  That "theme" gets applied on top of regular themes
+special ~user~ theme.  That "theme" gets applied on top of regular themes
 like ~modus-operandi~ and ~modus-vivendi~.
 
 This is how it works:
@@ -1502,7 +1553,7 @@ Thus:
 [[#h:86f6906b-f090-46cc-9816-1fe8aeb38776][A theme-agnostic hook for theme 
loading]].
 
 To discover the faces defined by all loaded libraries, you may do
-{{{kbd(M-x list-faces-display)}}}.  Be warned that when you =:inherit= a face
+{{{kbd(M-x list-faces-display)}}}.  Be warned that when you ~:inherit~ a face
 you are introducing an implicit dependency, so try to avoid doing so for
 libraries other than the built-in {{{file(faces.el)}}} (or at least understand
 that things may break if you inherit from a yet-to-be-loaded face).
@@ -1524,6 +1575,68 @@ the previous section.  Adapt the above example like this:
    ...))
 #+end_src
 
+** Remap face with local value (DIY)
+:properties:
+:custom_id: h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f
+:end:
+#+cindex: Remapping faces
+
+There are cases where we need to change the buffer-local attributes of a
+face.  This might be because we have our own minor mode that re-uses a
+face for a particular purpose, such as a line selection tool that
+activates ~hl-line-mode~, but we wish to keep it distinct from other
+buffers.  This is where ~face-remap-add-relative~ can be applied and may
+be combined with ~modus-themes-with-colors~ to deliver consistent results.
+
+[[#h:51ba3547-b8c8-40d6-ba5a-4586477fd4ae][Face specs at scale using the 
themes' palette (DIY)]].
+
+In this example we will write a simple interactive function that adjusts
+the background color of the ~region~ face.  This is the sample code:
+
+#+begin_src emacs-lisp
+(defvar my-rainbow-region-colors
+  (modus-themes-with-colors
+    `((red . ,red-subtle-bg)
+      (green . ,green-subtle-bg)
+      (yellow . ,yellow-subtle-bg)
+      (blue . ,blue-subtle-bg)
+      (magenta . ,magenta-subtle-bg)
+      (cyan . ,cyan-subtle-bg)))
+  "Sample list of color values for `my-rainbow-region'.")
+
+(defun my-rainbow-region (color)
+  "Remap buffer-local attribute of `region' using COLOR."
+  (interactive
+   (list
+    (completing-read "Pick a color: " my-rainbow-region-colors)))
+  (face-remap-add-relative
+   'region
+   `( :background ,(alist-get (intern color) my-rainbow-region-colors)
+      :foreground ,(face-attribute 'default :foreground))))
+#+end_src
+
+When ~my-rainbow-region~ is called interactively, it prompts for a color
+to use.  The list of candidates is drawn from the car of each
+association in ~my-rainbow-region-colors~ (so "red", "green", etc.).
+
+To extend this principle, we may write wrapper functions that pass a
+color directly.  Those can be useful in tandem with hooks.  Consider
+this example:
+
+#+begin_src emacs-lisp
+(defun my-rainbow-region-magenta ()
+  (my-rainbow-region 'magenta))
+
+(add-hook 'diff-mode-hook #'my-rainbow-region-magenta)
+#+end_src
+
+Whenever we enter a ~diff-mode~ buffer, we now get a magenta-colored
+region.
+
+Perhaps you may wish to generalise those findings in to a set of
+functions that also accept an arbitrary face.  We shall leave the
+experimentation up to you.
+
 ** Override colors (DIY)
 :properties:
 :custom_id: h:307d95dd-8dbd-4ece-a543-10ae86f155a6
@@ -1627,16 +1740,89 @@ with {{{kbd(M-x modus-themes-toggle)}}} will also use 
the overrides.
 Given that this is a user-level customisation, one is free to implement
 whatever color values they desire, even if the possible combinations
 fall below the minimum 7:1 contrast ratio that governs the design of the
-themes (the WCAG AAA legibility standard).  Preferences aside, it is
-advised to inspect the source code of ~modus-themes-operandi-colors~ and
-~modus-themes-vivendi-colors~ to read the inline commentary: it explains
-what the intended use of each palette subset is.
+themes (the WCAG AAA legibility standard).  Alternatively, this can also
+be done programmatically ([[#h:4589acdc-2505-41fc-9f5e-699cfc45ab00][Override 
color saturation]]).
+
+For manual interventions it is advised to inspect the source code of
+~modus-themes-operandi-colors~ and ~modus-themes-vivendi-colors~ for the
+inline commentary: it explains what the intended use of each palette
+subset is.
 
 Furthermore, users may benefit from the ~modus-themes-contrast~ function
 that we provide: [[#h:02e25930-e71a-493d-828a-8907fc80f874][test color 
combinations]].  It measures the contrast
 ratio between two color values, so it can help in overriding the palette
 (or a subset thereof) without making the end result inaccessible.
 
+** Override color saturation (DIY)
+:properties:
+:custom_id: h:4589acdc-2505-41fc-9f5e-699cfc45ab00
+:end:
+#+cindex: Change a theme's color saturation
+
+In the previous section we documented how one can override color values
+manually ([[#h:307d95dd-8dbd-4ece-a543-10ae86f155a6][Override colors]]).  Here 
we use a programmatic approach which
+leverages the built-in ~color-saturate-name~ function to adjust the
+saturation of all color values used by the active Modus theme.  Our goal
+is to prepare a counterpart of the active theme's palette that holds
+modified color values, adjusted for a percent change in saturation.  A
+positive number amplifies the effect, while a negative one will move
+towards a grayscale spectrum.
+
+We start with a function that can be either called from Lisp or invoked
+interactively.  In the former scenario, we pass to it the rate of change
+we want.  While in the latter, a minibuffer prompt asks for a number to
+apply the desired effect.  In either case, we intend to assign anew the
+value of ~modus-themes-operandi-color-overrides~ (light theme) and the
+same for ~modus-themes-vivendi-color-overrides~ (dark theme).
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-saturate (percent)
+  "Saturate current Modus theme palette overrides by PERCENT."
+  (interactive
+   (list (read-number "Saturation by percent: ")))
+  (let* ((theme (modus-themes--current-theme))
+         (palette (pcase theme
+                    ('modus-operandi modus-themes-operandi-colors)
+                    ('modus-vivendi modus-themes-vivendi-colors)
+                    (_ (error "No Modus theme is active"))))
+         (overrides (pcase theme
+                      ('modus-operandi 'modus-themes-operandi-color-overrides)
+                      ('modus-vivendi 'modus-themes-vivendi-color-overrides)
+                      (_ (error "No Modus theme is active")))))
+    (let (name cons colors)
+      (dolist (cons palette)
+        (setq name (color-saturate-name (cdr cons) percent))
+        (setq name (format "%s" name))
+        (setq cons `(,(car cons) . ,name))
+        (push cons colors))
+      (set overrides colors))
+    (pcase theme
+      ('modus-operandi (modus-themes-load-operandi))
+      ('modus-vivendi (modus-themes-load-vivendi)))))
+
+;; sample Elisp calls (or call `my-modus-themes-saturate' interactively)
+(my-modus-themes-saturate 50)
+(my-modus-themes-saturate -75)
+#+end_src
+
+Using the above has an immediate effect, as it reloads the active Modus
+theme.
+
+To disable the effect, one must reset the aforementioned variables to
+~nil~.  Or specify a command for it, such as by taking inspiration from
+the ~modus-themes-toggle~ we already provide:
+
+#+begin_src emacs-lisp
+(defun my-modus-themes-revert-overrides ()
+  "Reset palette overrides and reload active Modus theme."
+  (interactive)
+  (setq modus-themes-operandi-color-overrides nil
+        modus-themes-vivendi-color-overrides nil)
+  (pcase (modus-themes--current-theme)
+    ('modus-operandi (modus-themes-load-operandi))
+    ('modus-vivendi (modus-themes-load-vivendi))))
+#+end_src
+
 ** Font configurations for Org and others (DIY)
 :properties:
 :custom_id: h:defcf4fc-8fa8-4c29-b12e-7119582cc929
@@ -1677,9 +1863,9 @@ reading the doc string of ~set-face-attribute~):
 (set-face-attribute 'fixed-pitch nil :family "DejaVu Sans Mono" :height 1.0)
 #+end_src
 
-Note the differences in the =:height= property.  The =default= face must
+Note the differences in the ~:height~ property.  The ~default~ face must
 specify an absolute value, which is the point size × 10.  So if you want
-to use a font at point size =11=, you set the height to =110=.[fn:: =:height=
+to use a font at point size =11=, you set the height to =110=.[fn:: ~:height~
 values do not need to be rounded to multiples of ten: the likes of =115=
 are perfectly valid—some typefaces will change to account for those
 finer increments.]  Whereas every other face must have a value that is
@@ -1689,6 +1875,8 @@ importance: it ensures that all fonts can scale 
gracefully when using
 something like the ~text-scale-adjust~ command which only operates on the
 base font size (i.e. the ~default~ face's absolute height).
 
+[[#h:e6c5451f-6763-4be7-8fdb-b4706a422a4c][Note for EWW and Elfeed fonts (SHR 
fonts)]].
+
 ** Custom Org user faces (DIY)
 :properties:
 :custom_id: h:89f0678d-c5c3-4a57-a526-668b2bb2d7ad
@@ -1871,6 +2059,68 @@ package:
   (circadian-setup))
 #+end_src
 
+** Backdrop for pdf-tools (DIY)
+:properties:
+:custom_id: h:ff69dfe1-29c0-447a-915c-b5ff7c5509cd
+:end:
+#+cindex: Remapping pdf-tools backdrop
+
+Most PDF files use a white background for their page, making it
+impossible to discern the file's boundaries in the buffer while using
+the Modus Operandi theme.  To introduce a distinction between the
+buffer's backdrop and the PDF page's background, the former must be
+rendered as some shade of gray.  Ideally, ~pdf-tools~ would provide a face
+that the themes could support directly, though this does not seem to be
+the case for the time being.  We must thus employ the face remapping
+technique that is documented elsewhere in this document to change the
+buffer-local value of the ~default~ face.
+
+[[#h:7a93cb6f-4eca-4d56-a85c-9dcd813d6b0f][Remap face with local value (DIY)]].
+
+To remap the buffer's backdrop, we start with a function like this one:
+
+#+begin_src emacs-lisp
+(defun my-pdf-tools-backdrop ()
+  (face-remap-add-relative
+   'default
+   `(:background ,(modus-themes-color 'bg-alt))))
+
+(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-backdrop)
+#+end_src
+
+The idea is to assign that function to a hook that gets called when
+~pdf-tools~ renders the document: ~pdf-tools-enabled-hook~.  This is enough
+when you only use one theme.  However it has the downside of setting the
+background color value only at render time.  In other words, the face
+remapping function does not get evaluated anew whenever the theme
+changes, such as upon invoking {{{kbd(M-x modus-themes-toggle)}}}.
+
+To have our face remapping adapt gracefully while switching between the
+Modus themes, we need to also account for the current theme and control
+the activation of ~pdf-view-midnight-minor-mode~.  To which end we arrive
+at something like the following, which builds on the above example:
+
+#+begin_src emacs-lisp
+(defun my-pdf-tools-backdrop ()
+  (face-remap-add-relative
+   'default
+   `(:background ,(modus-themes-color 'bg-alt))))
+
+(defun my-pdf-tools-midnight-mode-toggle ()
+  (when (derived-mode-p 'pdf-view-mode)
+    (if (eq (car custom-enabled-themes) 'modus-vivendi)
+        (pdf-view-midnight-minor-mode 1)
+      (pdf-view-midnight-minor-mode -1))
+    (my-pdf-tools-backdrop)))
+
+(add-hook 'pdf-tools-enabled-hook #'my-pdf-tools-midnight-mode-toggle)
+(add-hook 'modus-themes-after-load-theme-hook 
#'my-pdf-tools-midnight-mode-toggle)
+#+end_src
+
+With those in place, PDFs have a distinct backdrop for their page, while
+they automatically switch to their dark mode when ~modus-themes-toggle~ is
+called from inside a buffer whose major-mode is ~pdf-view-mode~.
+
 ** A theme-agnostic hook for theme loading (DIY)
 :properties:
 :custom_id: h:86f6906b-f090-46cc-9816-1fe8aeb38776
@@ -1976,6 +2226,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + compilation-mode
 + completions
 + consult
++ corfu
 + counsel*
 + counsel-css
 + counsel-notmuch
@@ -2018,8 +2269,9 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + eldoc-box
 + elfeed
 + elfeed-score
++ embark
 + emms
-+ enhanced-ruby-mode
++ enh-ruby-mode (enhanced-ruby-mode)
 + epa
 + equake
 + erc
@@ -2149,6 +2401,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + outline-minor-faces
 + package (what you get with {{{kbd(M-x list-packages)}}})
 + page-break-lines
++ pandoc-mode
 + paradox
 + paren-face
 + parrot
@@ -2206,7 +2459,11 @@ have lots of extensions, so the "full support" may not 
be 100% true…
 + sx
 + symbol-overlay
 + syslog-mode
++ tab-bar-groups
++ tab-bar-mode
++ tab-line-mode
 + table (built-in table.el)
++ telega
 + telephone-line
 + terraform-mode
 + term
@@ -2221,6 +2478,7 @@ have lots of extensions, so the "full support" may not be 
100% true…
 + vc (built-in mode line status for version control)
 + vc-annotate (the out put of {{{kbd(C-x v g)}}})
 + vdiff
++ vertico
 + vimish-fold
 + visible-mark
 + visual-regexp
@@ -2274,6 +2532,42 @@ inherit from some basic faces.  Please confirm.
 This section covers information that may be of interest to users of
 individual packages.
 
+** Note for dimmer.el
+:properties:
+:custom_id: h:8eb4b758-d318-4480-9ead-357a571beb93
+:end:
+
+The {{{file(dimmer.el)}}} library by Neil Okamoto can be configured to
+automatically dim the colors of inactive Emacs windows.  To guarantee
+consistent results with the Modus themes, we suggest some tweaks to the
+default styles, such as in this minimal setup:
+
+#+begin_src emacs-lisp
+(use-package dimmer
+  :config
+  (setq dimmer-fraction 0.3)
+  (setq dimmer-adjustment-mode :foreground)
+  (setq dimmer-use-colorspace :rgb)
+
+  (dimmer-mode 1))
+#+end_src
+
+Of the above, we strongly recommend the RGB color space because it is
+the one that remains faithful to the hueness of the colors used by the
+themes.  Whereas the default CIELAB space has a tendency to distort
+colors in addition to applying the dim effect, which can be somewhat
+disorienting.
+
+The value of the ~dimmer-fraction~ has been selected empirically.  Users
+might prefer to tweak it further (increasing it makes the dim effect
+more pronounced).
+
+Changing the ~dimmer-adjustment-mode~ is a matter of preference.  Though
+because the Modus themes use black and white as their base colors, any
+other value for that variable will turn the main background gray.  This
+inadvertently leads to the opposite of the intended utility of this
+package: it draws too much attention to unfocused windows.
+
 ** Note for display-fill-column-indicator-mode
 :properties:
 :custom_id: h:2a602816-bc1b-45bf-9675-4cbbd7bf6cab
@@ -2521,6 +2815,21 @@ specifications the webpage provides.
 
 Consult {{{kbd(C-h v shr-use-colors)}}}.
 
+
+** Note for EWW and Elfeed fonts (SHR fonts)
+:properties:
+:custom_id: h:e6c5451f-6763-4be7-8fdb-b4706a422a4c
+:end:
+
+EWW and Elfeed rely on the Simple HTML Renderer to display their
+content.  The {{{file(shr.el)}}} library contains the variable ~shr-use-fonts~
+that controls whether the text in the buffer is set to a ~variable-pitch~
+typeface (proportionately spaced) or if just retains whatever the
+default font family is.  Its default value is non-nil, which means that
+~variable-pitch~ is applied.
+
+[[#h:defcf4fc-8fa8-4c29-b12e-7119582cc929][Font configurations for Org and 
others]].
+
 ** Note for Helm grep
 :properties:
 :custom_id: h:d28879a2-8e4b-4525-986e-14c0f873d229
@@ -2748,26 +3057,28 @@ The Modus themes are a collective effort.  Every bit of 
work matters.
 
 + Contributions to code or documentation :: Anders Johansson, Basil
   L.{{{space()}}} Contovounesios, Carlo Zancanaro, Eli Zaretskii, Kostadin
-  Ninev, Madhavan Krishnan, Markus Beppler, Matthew Stevenson, Nicolas
-  De Jaeghere, Shreyas Ragavan, Stefan Kangas, Vincent Murphy, Xinglu
-  Chen.
+  Ninev, Madhavan Krishnan, Markus Beppler, Matthew Stevenson, Mauro
+  Aranda, Nicolas De Jaeghere, Shreyas Ragavan, Stefan Kangas, Vincent
+  Murphy, Xinglu Chen.
 
 + Ideas and user feedback :: Aaron Jensen, Adam Spiers, Adrian Manea,
   Alex Griffin, Alex Peitsinis, Alexey Shmalko, Alok Singh, Anders
   Johansson, André Alexandre Gomes, Arif Rezai, Basil L.{{{space()}}}
   Contovounesios, Burgess Chang, Christian Tietze, Christopher Dimech,
   Damien Cassou, Daniel Mendler, Dario Gjorgjevski, David Edmondson,
-  Davor Rotim, Divan Santana, Gerry Agbobada, Gianluca Recchia, Gustavo
-  Barros, Hörmetjan Yiltiz, Ilja Kocken, Iris Garcia, Jeremy Friesen,
-  John Haman, Joshua O'Connor, Kevin Fleming, Kostadin Ninev, Len Trigg,
-  Manuel Uberti, Mark Burton, Markus Beppler, Michael Goldenberg, Morgan
-  Smith, Murilo Pereira, Nicolas De Jaeghere, Paul Poloskov, Pete
-  Kazmier, Peter Wu, Philip K., Pierre Téchoueyres, Roman Rudakov, Ryan
-  Phillips, Sam Kleinman, Shreyas Ragavan, Simon Pugnet, Tassilo Horn,
-  Thibaut Verron, Trey Merkley, Togan Muftuoglu, Toon Claes, Uri Sharf,
-  Utkarsh Singh, Vincent Foley.  As well as users: Ben, CsBigDataHub1,
-  Emacs Contrib, Eugene, Fourchaux, Fredrik, Moesasji, Nick, TheBlob42,
-  bepolymathe, doolio, fleimgruber, iSeeU, jixiuf, okamsn.
+  Davor Rotim, Divan Santana, Emanuele Michele Alberto Monterosso,
+  Farasha Euker, Gerry Agbobada, Gianluca Recchia, Gustavo Barros,
+  Hörmetjan Yiltiz, Ilja Kocken, Iris Garcia, Jeremy Friesen, John
+  Haman, Joshua O'Connor, Kevin Fleming, Kévin Le Gouguec, Kostadin
+  Ninev, Len Trigg, Manuel Uberti, Mark Burton, Markus Beppler, Mauro
+  Aranda, Michael Goldenberg, Morgan Smith, Murilo Pereira, Nicky van
+  Foreest, Nicolas De Jaeghere, Paul Poloskov, Pete Kazmier, Peter Wu,
+  Philip K., Pierre Téchoueyres, Roman Rudakov, Ryan Phillips, Sam
+  Kleinman, Shreyas Ragavan, Simon Pugnet, Tassilo Horn, Thibaut Verron,
+  Trey Merkley, Togan Muftuoglu, Toon Claes, Uri Sharf, Utkarsh Singh,
+  Vincent Foley.  As well as users: Ben, CsBigDataHub1, Emacs Contrib,
+  Eugene, Fourchaux, Fredrik, Moesasji, Nick, TheBlob42, Trey,
+  bepolymathe, doolio, fleimgruber, iSeeU, jixiuf, okamsn, pRot0ta1p.
 
 + Packaging :: Basil L.{{{space()}}} Contovounesios, Eli Zaretskii, Glenn
   Morris, Mauro Aranda, Richard Stallman, Stefan Kangas (core Emacs),
@@ -2819,6 +3130,7 @@ And here are the canonical sources of this project's 
documentation:
 #+texinfo: @include doclicense.texi
 
 #+begin_export html
+<pre>
 
                 GNU Free Documentation License
                  Version 1.3, 3 November 2008
@@ -3270,6 +3582,7 @@ If your document contains nontrivial examples of program 
code, we
 recommend releasing these examples in parallel under your choice of
 free software license, such as the GNU General Public License,
 to permit their use in free software.
+</pre>
 #+end_export
 
 #+html: <!--
diff --git a/doc/misc/sem-user.texi b/doc/misc/sem-user.texi
index c37291a..70a1948 100644
--- a/doc/misc/sem-user.texi
+++ b/doc/misc/sem-user.texi
@@ -142,7 +142,7 @@ Move point ``up'' one reference 
(@code{senator-go-to-up-reference}).
 The meaning of ``up'' is language-dependent; in C++, for instance,
 this means moving to the parent of the current tag.
 
-@item C-c, @key{SPC}
+@item C-c , @key{SPC}
 Display a list of possible completions for the symbol at point
 (@code{semantic-complete-analyze-inline}).  This also activates a
 special set of keybindings for choosing a completion: @key{RET}
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 40245ac..e0f648f 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -5095,35 +5095,21 @@ two forms in your @file{~/.emacs} after loading the 
@code{tramp} and
 
 @item
 I get a warning @samp{Tramp has been compiled with Emacs a.b, this is Emacs 
c.d}
+@item
+I get an error @samp{tramp-file-name-handler: Invalid function:
+tramp-compat-with-mutex}
 
 @value{tramp} comes with compatibility code for different Emacs
 versions.  When you see this warning, you don't use the Emacs built-in
 version of @value{tramp}.  In case you have installed @value{tramp}
-from GNU ELPA, you must delete and reinstall it.
+from GNU ELPA, see the package README file for instructions how to
+recompile it.
 @ifset installchapter
 In case you have installed it from its Git repository, @ref{Recompilation}.
 @end ifset
 
 
 @item
-I get an error @samp{tramp-file-name-handler: Invalid function:
-tramp-compat-with-mutex}
-
-Likely, you have a running Emacs session with loaded @value{tramp},
-and you try to upgrade it to another version from GNU ELPA.  Since
-@value{tramp} is not forward compatible, you must unload / reload it.
-Try the following steps:
-
-@example
-@kbd{M-x tramp-unload-tramp @key{RET}}
-@kbd{M-x load-library @key{RET} tramp @key{RET}}
-@end example
-
-If this doesn't work, you must restart Emacs with proper
-@code{load-path} for the new @value{tramp} version.
-
-
-@item
 I get an error @samp{Remote file error: Forbidden reentrant call of Tramp}
 
 @vindex remote-file-error
diff --git a/etc/NEWS b/etc/NEWS
index b641e8d..63de46a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -958,6 +958,13 @@ authentication mechanism by setting a value for the key 
'smtp-auth'.
 
 ** Search and Replace
 
+*** New key 'M-s M-.' starts isearch with the thing found at point.
+This key is bound to the new command 'isearch-forward-thing-at-point'.
+The new user option 'isearch-forward-thing-at-point' defines
+a list of symbols to try to get the "thing" at point.  By default,
+the first element of the list is 'region' that tries to yank
+the currently active region to the search string.
+
 *** New user option 'isearch-wrap-pause' defines how to wrap the search.
 There are choices to disable wrapping completely and to wrap immediately.
 When wrapping immediately, it consistently handles the numeric arguments
@@ -982,6 +989,9 @@ skipped.
 ** Help
 
 ---
+*** The 'help-for-help' ('C-h C-h') screen has been redesigned.
+
+---
 *** Keybindings in 'help-mode' use the new 'help-key-binding' face.
 This face is added by 'substitute-command-keys' to any "\[command]"
 substitution.  The return value of that function should consequently
@@ -1670,6 +1680,13 @@ choosing the exact definition to go to, and this should 
do TRT.
 If chosen, file names in "*xref*" buffers will be displayed relative
 to the 'project-root' of the current project, when available.
 
++++
+*** The TAB key binding in *xref* buffers is obsolete.
+Use 'C-u RET' instead.  The TAB binding in *xref* buffers is still
+supported, but we plan on removing it in a future version; at that
+time, the command 'xref-quit-and-goto-xref' will no longer have a key
+binding in 'xref--xref-buffer-mode-map'.
+
 ** json.el
 
 ---
@@ -1731,6 +1748,42 @@ type for highlighting the entire message but not the 
sender's nick.
 The 'erc-status-sidebar' package which provides a HexChat-like
 activity overview sidebar for joined IRC channels is now part of ERC.
 
++++
+*** erc-tls now supports specifying a TLS client certificate.
+The 'erc-tls' function has been updated to allow specifying a TLS
+client certificate for authentication, as an alternative to NickServ
+password-based authentication.  This is referred to as "CertFP" (short
+for Certificate Fingerprint) by several IRC networks.
+
+To use a certificate with 'erc-tls', specify the ':client-certificate'
+optional parameter, whose value should be as described in the
+documentation of 'open-network-stream': if non-nil, it should either
+be a list where the first element is the file name of the private key
+corresponding to a client certificate and the second element is the
+file name of the client certificate itself to use when connecting over
+TLS, or t, which means that 'auth-source' will be queried for the
+private key and the certificate.
+
+Examples of use:
+
+    (erc-tls :server "chat.freenode.net" :port 6697
+             :client-certificate
+             '("/home/bandali/my-cert.key"
+               "/home/bandali/my-cert.crt"))
+
+    (erc-tls :server "chat.freenode.net" :port 6697
+             :client-certificate
+             `(,(expand-file-name "~/cert-freenode.key")
+               ,(expand-file-name "~/cert-freenode.crt")))
+
+    (erc-tls :server "chat.freenode.net" :port 6697
+             :client-certificate t)
+
+In the case of ':client-certificate t', you will need to add a line
+like the following to your authinfo file (e.g. "~/.authinfo.gpg"):
+
+    machine chat.freenode.net key /home/bandali/my-cert.key cert 
/home/bandali/my-cert.crt
+
 ** Battery
 
 ---
@@ -2227,6 +2280,10 @@ The following user options have been renamed:
 
 The old names are now obsolete.
 
+---
+*** 'world-clock-mode' can no longer be turned on interactively.
+Use 'world-clock' to turn on that mode.
+
 ** D-Bus
 
 +++
@@ -2325,6 +2382,13 @@ This is a mode for searching a RFC 2229 dictionary 
server.
 the mouse in 'dictionary-tooltip-dictionary' (which must be customized
 first).
 
+** transient.el
+
+This library implements support for powerful keyboard-driven menus.
+Such menus can be used as simple visual command dispatchers.  More
+complex menus take advantage of infix arguments, which are somewhat
+similar to prefix arguments, but are more flexible and discoverable.
+
 
 * Incompatible Editing Changes in Emacs 28.1
 
@@ -2393,6 +2457,10 @@ This affects the suffix specified by completion 
'annotation-function'.
 The mark will be set to point to the end of the new buffer.
 
 +++
+** An active minibuffer now has major mode 'minibuffer-mode', not the
+erroneous 'minibuffer-inactive-mode' it formerly had.
+
++++
 ** Some properties from completion tables are now preserved.
 If 'minibuffer-allow-text-properties' is non-nil, doing completion
 over a table of strings with properties will no longer remove all the
@@ -2656,9 +2724,11 @@ one to another in the init file.  The same user option 
also controls
 whether the function 'read-answer' accepts short answers.
 
 +++
-** 'set-window-configuration' now takes an optional 'dont-set-frame'
-parameter which, when non-nil, instructs the function not to select
-the frame recorded in the configuration.
+** 'set-window-configuration' now takes two optional parameters,
+'dont-set-frame' and 'dont-set-miniwindow'.  The first of these, when
+non-nil, instructs the function not to select the frame recorded in
+the configuration.  The second prevents the current minibuffer being
+replaced by the one stored in the configuration.
 
 +++
 ** 'define-globalized-minor-mode' now takes a ':predicate' parameter.
diff --git a/etc/themes/manoj-dark-theme.el b/etc/themes/manoj-dark-theme.el
index 1f4891c..5a52711 100644
--- a/etc/themes/manoj-dark-theme.el
+++ b/etc/themes/manoj-dark-theme.el
@@ -1,4 +1,4 @@
-;;; manoj-dark.el --- A dark theme from Manoj  -*- lexical-binding:t -*-
+;;; manoj-dark-theme.el --- A dark theme from Manoj  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
diff --git a/etc/themes/modus-operandi-theme.el 
b/etc/themes/modus-operandi-theme.el
index 64763a1..77c2e11 100644
--- a/etc/themes/modus-operandi-theme.el
+++ b/etc/themes/modus-operandi-theme.el
@@ -4,7 +4,7 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.2.3
+;; Version: 1.3.2
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
@@ -52,6 +52,9 @@
 
 (eval-and-compile
   (unless (and (fboundp 'require-theme)
+               load-file-name
+               (equal (file-name-directory load-file-name)
+                      (expand-file-name "themes/" data-directory))
                (require-theme 'modus-themes t))
     (require 'modus-themes)))
 
diff --git a/etc/themes/modus-themes.el b/etc/themes/modus-themes.el
index ad20707..08e634e 100644
--- a/etc/themes/modus-themes.el
+++ b/etc/themes/modus-themes.el
@@ -4,7 +4,8 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.2.4
+;; Version: 1.3.2
+;; Last-Modified: <2021-04-18 06:25:05 +0300>
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
@@ -50,7 +51,7 @@
 ;;     modus-themes-mode-line                      (choice)
 ;;     modus-themes-diffs                          (choice)
 ;;     modus-themes-syntax                         (choice)
-;;     modus-themes-intense-hl-line                (boolean)
+;;     modus-themes-hl-line                        (choice)
 ;;     modus-themes-subtle-line-numbers            (boolean)
 ;;     modus-themes-paren-match                    (choice)
 ;;     modus-themes-region                         (choice)
@@ -112,6 +113,7 @@
 ;;     compilation-mode
 ;;     completions
 ;;     consult
+;;     corfu
 ;;     counsel
 ;;     counsel-css
 ;;     counsel-notmuch
@@ -155,8 +157,9 @@
 ;;     eldoc-box
 ;;     elfeed
 ;;     elfeed-score
+;;     embark
 ;;     emms
-;;     enhanced-ruby-mode
+;;     enh-ruby-mode (enhanced-ruby-mode)
 ;;     epa
 ;;     equake
 ;;     erc
@@ -284,6 +287,7 @@
 ;;     outline-minor-faces
 ;;     package (M-x list-packages)
 ;;     page-break-lines
+;;     pandoc-mode
 ;;     paradox
 ;;     paren-face
 ;;     parrot
@@ -339,10 +343,12 @@
 ;;     swoop
 ;;     sx
 ;;     symbol-overlay
+;;     syslog-mode
+;;     tab-bar-groups
 ;;     tab-bar-mode
 ;;     tab-line-mode
-;;     syslog-mode
 ;;     table (built-in table.el)
+;;     telega
 ;;     telephone-line
 ;;     terraform-mode
 ;;     term
@@ -357,6 +363,7 @@
 ;;     vc (built-in mode line status for version control)
 ;;     vc-annotate (C-x v g)
 ;;     vdiff
+;;     vertico
 ;;     vimish-fold
 ;;     visible-mark
 ;;     visual-regexp
@@ -389,7 +396,7 @@
 ;;; News:
 ;;
 ;; Users updating from older versions to >= 1.0.0, are advised to read
-;; the anouncement on the emacs-devel mailing list:
+;; the announcement on the emacs-devel mailing list:
 ;; <https://lists.gnu.org/archive/html/emacs-devel/2021-03/msg00300.html>.
 ;;
 ;; The web page of the change log is also available:
@@ -434,9 +441,11 @@
     (bg-alt . "#f0f0f0") (fg-alt . "#505050")
     ;; specifically for on/off states and must be combined with
     ;; themselves, though the backgrounds are also meant to be used with
-    ;; other "active" values, defined further below
+    ;; other "active" values, defined further below; bg-active-accent
+    ;; can work as a substitute for bg-active
     (bg-active . "#d7d7d7") (fg-active . "#0a0a0a")
     (bg-inactive . "#efefef") (fg-inactive . "#404148")
+    (bg-active-accent . "#d0d6ff")
     ;; these special values are intended as alternatives to the base
     ;; values for cases where we need to avoid confusion between the
     ;; highlighted constructs; they must either be used as pairs based
@@ -496,20 +505,20 @@
     ;; those foregrounds are meant exclusively for bg-active, bg-inactive
     (red-active . "#8a0000")
     (green-active . "#004c2e")
-    (yellow-active . "#702d1f")
+    (yellow-active . "#702f00")
     (blue-active . "#0030b4")
     (magenta-active . "#5c2092")
     (cyan-active . "#003f8a")
     ;; the "subtle" values below be combined with fg-dim, while the
     ;; "intense" should be paired with fg-main
     (red-subtle-bg . "#f2b0a2")
-    (red-intense-bg . "#ff8892")
+    (red-intense-bg . "#ff9f9f")
     (green-subtle-bg . "#aecf90")
     (green-intense-bg . "#5ada88")
     (yellow-subtle-bg . "#e4c340")
     (yellow-intense-bg . "#f5df23")
     (blue-subtle-bg . "#b5d0ff")
-    (blue-intense-bg . "#6aaeff")
+    (blue-intense-bg . "#77baff")
     (magenta-subtle-bg . "#f0d3ff")
     (magenta-intense-bg . "#d5baff")
     (cyan-subtle-bg . "#c0efff")
@@ -544,7 +553,7 @@
     (red-refine-bg . "#ffcccc") (red-refine-fg . "#780000")
     (green-refine-bg . "#aceaac") (green-refine-fg . "#004c00")
     (yellow-refine-bg . "#fff29a") (yellow-refine-fg . "#604000")
-    (blue-refine-bg . "#8ac7ff") (blue-refine-fg . "#002288")
+    (blue-refine-bg . "#8fcfff") (blue-refine-fg . "#002f88")
     (magenta-refine-bg . "#ffccff") (magenta-refine-fg . "#770077")
     (cyan-refine-bg . "#8eecf4") (cyan-refine-fg . "#004850")
     ;; the "nuanced" backgrounds can be combined with all of the above
@@ -563,22 +572,22 @@
     ;; work with all accents that cover those two, plus bg-main
     ;;
     ;; bg-hl-alt and bg-hl-alt-intense should only be used when no
-    ;; other greyscale or fairly neutral background is available to
+    ;; other grayscale or fairly neutral background is available to
     ;; properly draw attention to a given construct
     ;;
     ;; bg-header is between bg-active and bg-inactive, so it
     ;; can be combined with any of the "active" values, plus the
     ;; "special" and base foreground colors
     ;;
-    ;; bg-paren-match, bg-paren-match-intense, bg-region and
-    ;; bg-tab-active must be combined with fg-main, while
-    ;; bg-tab-inactive should be combined with fg-dim, whereas
+    ;; bg-paren-match, bg-paren-match-intense, bg-region,
+    ;; bg-region-accent and bg-tab-active must be combined with fg-main,
+    ;; while bg-tab-inactive should be combined with fg-dim, whereas
     ;; bg-tab-inactive-alt goes together with fg-main
     ;;
     ;; bg-tab-bar is only intended for the bar that holds the tabs and
     ;; can only be combined with fg-main
     ;;
-    ;; fg-tab-active is meant to be combined with bg-tab-active,
+    ;; fg-tab-accent is meant to be combined with bg-tab-active,
     ;; though only for styling special elements, such as underlining
     ;; the current tab
     ;;
@@ -606,12 +615,22 @@
     (bg-paren-match . "#e0af82")
     (bg-paren-match-intense . "#c488ff")
     (bg-region . "#bcbcbc")
+    (bg-region-accent . "#afafef")
 
     (bg-tab-bar . "#d5d5d5")
     (bg-tab-active . "#f6f6f6")
     (bg-tab-inactive . "#bdbdbd")
     (bg-tab-inactive-alt . "#999999")
-    (fg-tab-active . "#30169e")
+    (fg-tab-accent . "#30169e")
+
+    (red-tab . "#680000")
+    (green-tab . "#003900")
+    (yellow-tab . "#393000")
+    (orange-tab . "#502300")
+    (blue-tab . "#000080")
+    (cyan-tab . "#052f60")
+    (magenta-tab . "#5f004d")
+    (purple-tab . "#400487")
 
     (fg-escape-char-construct . "#8b1030")
     (fg-escape-char-backslash . "#654d0f")
@@ -651,10 +670,6 @@
     (bg-diff-focus-changed . "#ecdfbf") (fg-diff-focus-changed . "#392900")
     (bg-diff-focus-removed . "#efcbcf") (fg-diff-focus-removed . "#4a0000")
 
-    (bg-diff-neutral-0 . "#979797") (fg-diff-neutral-0 . "#040404")
-    (bg-diff-neutral-1 . "#b0b0b0") (fg-diff-neutral-1 . "#252525")
-    (bg-diff-neutral-2 . "#cccccc") (fg-diff-neutral-2 . "#3a3a3a")
-
     (bg-mark-sel . "#a0f0cf") (fg-mark-sel . "#005040")
     (bg-mark-del . "#ffccbb") (fg-mark-del . "#840040")
     (bg-mark-alt . "#f5d88f") (fg-mark-alt . "#782900"))
@@ -677,13 +692,15 @@ symbol and the latter as a string.")
 (defconst modus-themes-vivendi-colors
   '(;; base values
     (bg-main . "#000000") (fg-main . "#ffffff")
-    (bg-dim . "#110b11") (fg-dim . "#e0e6f0")
-    (bg-alt . "#181a20") (fg-alt . "#a8a8a8")
+    (bg-dim . "#100f10") (fg-dim . "#e0e6f0")
+    (bg-alt . "#191a1b") (fg-alt . "#a8a8a8")
     ;; specifically for on/off states and must be combined with
     ;; themselves, though the backgrounds are also meant to be used with
-    ;; other "active" values, defined further below
+    ;; other "active" values, defined further below; bg-active-accent
+    ;; can work as a substitute for bg-active
     (bg-active . "#323232") (fg-active . "#f4f4f4")
     (bg-inactive . "#1e1e1e") (fg-inactive . "#bfc0c4")
+    (bg-active-accent . "#2a2a66")
     ;; these special values are intended as alternatives to the base
     ;; values for cases where we need to avoid confusion between the
     ;; highlighted constructs; they must either be used as pairs based
@@ -791,7 +808,7 @@ symbol and the latter as a string.")
     (red-refine-bg . "#77002a") (red-refine-fg . "#ffb9ab")
     (green-refine-bg . "#00422a") (green-refine-fg . "#9ff0cf")
     (yellow-refine-bg . "#693200") (yellow-refine-fg . "#e2d980")
-    (blue-refine-bg . "#242679") (blue-refine-fg . "#8ec6ff")
+    (blue-refine-bg . "#242679") (blue-refine-fg . "#8ecfff")
     (magenta-refine-bg . "#71206a") (magenta-refine-fg . "#ffcaf0")
     (cyan-refine-bg . "#004065") (cyan-refine-fg . "#8ae4f2")
     ;; the "nuanced" backgrounds can be combined with all of the above
@@ -810,22 +827,22 @@ symbol and the latter as a string.")
     ;; work with all accents that cover those two, plus bg-main
     ;;
     ;; bg-hl-alt and bg-hl-alt-intense should only be used when no
-    ;; other greyscale or fairly neutral background is available to
+    ;; other grayscale or fairly neutral background is available to
     ;; properly draw attention to a given construct
     ;;
     ;; bg-header is between bg-active and bg-inactive, so it
     ;; can be combined with any of the "active" values, plus the
     ;; "special" and base foreground colors
     ;;
-    ;; bg-paren-match, bg-paren-match-intense, bg-region and
-    ;; bg-tab-active must be combined with fg-main, while
-    ;; bg-tab-inactive should be combined with fg-dim, whereas
+    ;; bg-paren-match, bg-paren-match-intense, bg-region,
+    ;; bg-region-accent and bg-tab-active must be combined with fg-main,
+    ;; while bg-tab-inactive should be combined with fg-dim, whereas
     ;; bg-tab-inactive-alt goes together with fg-main
     ;;
     ;; bg-tab-bar is only intended for the bar that holds the tabs and
     ;; can only be combined with fg-main
     ;;
-    ;; fg-tab-active is meant to be combined with bg-tab-active,
+    ;; fg-tab-accent is meant to be combined with bg-tab-active,
     ;; though only for styling special elements, such as underlining
     ;; the current tab
     ;;
@@ -853,12 +870,22 @@ symbol and the latter as a string.")
     (bg-paren-match . "#5f362f")
     (bg-paren-match-intense . "#7416b5")
     (bg-region . "#3c3c3c")
+    (bg-region-accent . "#4f3d88")
 
     (bg-tab-bar . "#2c2c2c")
     (bg-tab-active . "#0e0e0e")
     (bg-tab-inactive . "#3d3d3d")
     (bg-tab-inactive-alt . "#595959")
-    (fg-tab-active . "#5ac3cf")
+    (fg-tab-accent . "#5ac3cf")
+
+    (red-tab . "#ffc0bf")
+    (green-tab . "#88ef88")
+    (yellow-tab . "#d2e580")
+    (orange-tab . "#f5ca80")
+    (blue-tab . "#92d9ff")
+    (cyan-tab . "#60e7e0")
+    (magenta-tab . "#ffb8ff")
+    (purple-tab . "#cfcaff")
 
     (fg-escape-char-construct . "#e7a59a")
     (fg-escape-char-backslash . "#abab00")
@@ -898,10 +925,6 @@ symbol and the latter as a string.")
     (bg-diff-focus-changed . "#4a3a10") (fg-diff-focus-changed . "#d0daaf")
     (bg-diff-focus-removed . "#5e2526") (fg-diff-focus-removed . "#eebdba")
 
-    (bg-diff-neutral-0 . "#575757") (fg-diff-neutral-0 . "#fcfcfc")
-    (bg-diff-neutral-1 . "#454545") (fg-diff-neutral-1 . "#dddddd")
-    (bg-diff-neutral-2 . "#313131") (fg-diff-neutral-2 . "#bfbfbf")
-
     (bg-mark-sel . "#002f2f") (fg-mark-sel . "#60cfa2")
     (bg-mark-del . "#5a0000") (fg-mark-del . "#ff99aa")
     (bg-mark-alt . "#3f2210") (fg-mark-alt . "#f0aa20"))
@@ -916,219 +939,219 @@ symbol and the latter as a string.")
 ;; These faces are used internally to ensure consistency between various
 ;; groups and to streamline the evaluation of relevant customization
 ;; options.
-(defface modus-theme-subtle-red nil
+(defface modus-themes-subtle-red nil
   "Subtle red background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-green nil
+(defface modus-themes-subtle-green nil
   "Subtle green background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-yellow nil
+(defface modus-themes-subtle-yellow nil
   "Subtle yellow background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-blue nil
+(defface modus-themes-subtle-blue nil
   "Subtle blue background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-magenta nil
+(defface modus-themes-subtle-magenta nil
   "Subtle magenta background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-cyan nil
+(defface modus-themes-subtle-cyan nil
   "Subtle cyan background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-subtle-neutral nil
+(defface modus-themes-subtle-neutral nil
   "Subtle gray background combined with a dimmed foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-red nil
+(defface modus-themes-intense-red nil
   "Intense red background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-green nil
+(defface modus-themes-intense-green nil
   "Intense green background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-yellow nil
+(defface modus-themes-intense-yellow nil
   "Intense yellow background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-blue nil
+(defface modus-themes-intense-blue nil
   "Intense blue background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-magenta nil
+(defface modus-themes-intense-magenta nil
   "Intense magenta background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-cyan nil
+(defface modus-themes-intense-cyan nil
   "Intense cyan background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-intense-neutral nil
+(defface modus-themes-intense-neutral nil
   "Intense gray background combined with the main foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-red nil
+(defface modus-themes-refine-red nil
   "Combination of accented red background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-green nil
+(defface modus-themes-refine-green nil
   "Combination of accented green background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-yellow nil
+(defface modus-themes-refine-yellow nil
   "Combination of accented yellow background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-blue nil
+(defface modus-themes-refine-blue nil
   "Combination of accented blue background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-magenta nil
+(defface modus-themes-refine-magenta nil
   "Combination of accented magenta background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-refine-cyan nil
+(defface modus-themes-refine-cyan nil
   "Combination of accented cyan background and foreground.
 This is used for general purpose highlighting, mostly in buffers
 or for completion interfaces.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-red nil
+(defface modus-themes-active-red nil
   "A red background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-green nil
+(defface modus-themes-active-green nil
   "A green background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-yellow nil
+(defface modus-themes-active-yellow nil
   "A yellow background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-blue nil
+(defface modus-themes-active-blue nil
   "A blue background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-magenta nil
+(defface modus-themes-active-magenta nil
   "A magenta background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-active-cyan nil
+(defface modus-themes-active-cyan nil
   "A cyan background meant for use on the modeline or similar.
 This is combined with the modelines primary foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-red nil
+(defface modus-themes-fringe-red nil
   "A red background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-green nil
+(defface modus-themes-fringe-green nil
   "A green background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-yellow nil
+(defface modus-themes-fringe-yellow nil
   "A yellow background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-blue nil
+(defface modus-themes-fringe-blue nil
   "A blue background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-magenta nil
+(defface modus-themes-fringe-magenta nil
   "A magenta background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-fringe-cyan nil
+(defface modus-themes-fringe-cyan nil
   "A cyan background meant for use on the fringe or similar.
 This is combined with the main foreground value.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-red nil
+(defface modus-themes-nuanced-red nil
   "A nuanced red background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1136,7 +1159,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-green nil
+(defface modus-themes-nuanced-green nil
   "A nuanced green background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1144,7 +1167,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-yellow nil
+(defface modus-themes-nuanced-yellow nil
   "A nuanced yellow background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1152,7 +1175,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-blue nil
+(defface modus-themes-nuanced-blue nil
   "A nuanced blue background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1160,7 +1183,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-magenta nil
+(defface modus-themes-nuanced-magenta nil
   "A nuanced magenta background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1168,7 +1191,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-nuanced-cyan nil
+(defface modus-themes-nuanced-cyan nil
   "A nuanced cyan background.
 This does not specify a foreground of its own.  Instead it is meant to
 serve as the backdrop for elements such as Org blocks, headings, and any
@@ -1176,7 +1199,7 @@ other surface that needs to retain the colors on display.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-special-cold nil
+(defface modus-themes-special-cold nil
   "Combines the 'special cold' background and foreground values.
 This is intended for cases when a neutral gray background is not
 suitable and where a combination of more saturated colors would not be
@@ -1184,7 +1207,7 @@ appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-special-mild nil
+(defface modus-themes-special-mild nil
   "Combines the 'special mild' background and foreground values.
 This is intended for cases when a neutral gray background is not
 suitable and where a combination of more saturated colors would not be
@@ -1192,7 +1215,7 @@ appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-special-warm nil
+(defface modus-themes-special-warm nil
   "Combines the 'special warm' background and foreground values.
 This is intended for cases when a neutral gray background is not
 suitable and where a combination of more saturated colors would not be
@@ -1200,7 +1223,7 @@ appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-special-calm nil
+(defface modus-themes-special-calm nil
   "Combines the 'special calm' background and foreground values.
 This is intended for cases when a neutral gray background is not
 suitable and where a combination of more saturated colors would not be
@@ -1208,180 +1231,180 @@ appropriate.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-added nil
+(defface modus-themes-diff-added nil
   "Combines green colors for the 'added' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-changed nil
+(defface modus-themes-diff-changed nil
   "Combines yellow colors for the 'changed' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-removed nil
+(defface modus-themes-diff-removed nil
   "Combines red colors for the 'removed' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-refine-added nil
+(defface modus-themes-diff-refine-added nil
   "Combines green colors for word-wise 'added' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-refine-changed nil
+(defface modus-themes-diff-refine-changed nil
   "Combines yellow colors for word-wise 'changed' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-refine-removed nil
+(defface modus-themes-diff-refine-removed nil
   "Combines red colors for word-wise 'removed' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-focus-added nil
+(defface modus-themes-diff-focus-added nil
   "Combines green colors for the focused 'added' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-focus-changed nil
+(defface modus-themes-diff-focus-changed nil
   "Combines yellow colors for the focused 'changed' state in.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-focus-removed nil
+(defface modus-themes-diff-focus-removed nil
   "Combines red colors for the focused 'removed' state in diffs.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-diff-heading nil
+(defface modus-themes-diff-heading nil
   "Combines blue colors for the diff hunk heading.
 The applied colors are contingent on the value assigned to
 `modus-themes-diffs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-pseudo-header nil
+(defface modus-themes-pseudo-header nil
   "Generic style for some elements that function like headings.
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-mark-alt nil
-  "Combines yellow colors for marking special lines
+(defface modus-themes-mark-alt nil
+  "Combines yellow colors for marking special lines.
 This is intended for use in modes such as Dired, Ibuffer, Proced.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-mark-del nil
-  "Combines red colors for marking deletable lines
+(defface modus-themes-mark-del nil
+  "Combines red colors for marking deletable lines.
 This is intended for use in modes such as Dired, Ibuffer, Proced.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-mark-sel nil
-  "Combines green colors for marking lines
+(defface modus-themes-mark-sel nil
+  "Combines green colors for marking lines.
 This is intended for use in modes such as Dired, Ibuffer, Proced.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-mark-symbol nil
+(defface modus-themes-mark-symbol nil
   "Applies a blue color and other styles for mark indicators.
 This is intended for use in modes such as Dired, Ibuffer, Proced.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-1 nil
-  "General purpose face for use in headings level 1
+(defface modus-themes-heading-1 nil
+  "General purpose face for use in headings level 1.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-2 nil
+(defface modus-themes-heading-2 nil
   "General purpose face for use in headings level 2.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-3 nil
+(defface modus-themes-heading-3 nil
   "General purpose face for use in headings level 3.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-4 nil
+(defface modus-themes-heading-4 nil
   "General purpose face for use in headings level 4.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-5 nil
+(defface modus-themes-heading-5 nil
   "General purpose face for use in headings level 5.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-6 nil
+(defface modus-themes-heading-6 nil
   "General purpose face for use in headings level 6.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-7 nil
+(defface modus-themes-heading-7 nil
   "General purpose face for use in headings level 7.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-heading-8 nil
+(defface modus-themes-heading-8 nil
   "General purpose face for use in headings level 8.
 The exact attributes assigned to this face are contingent on the values
 assigned to the `modus-themes-headings' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-hl-line nil
+(defface modus-themes-hl-line nil
   "General purpose face for the current line.
 The exact attributes assigned to this face are contingent on the values
-assigned to the `modus-themes-intense-hl-line' variable.
+assigned to the `modus-themes-hl-line' variable.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-bold nil
+(defface modus-themes-bold nil
   "Generic face for applying a conditional bold weight.
 This behaves in accordance with `modus-themes-bold-constructs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-slant nil
+(defface modus-themes-slant nil
   "Generic face for applying a conditional slant (italics).
 This behaves in accordance with `modus-themes-slanted-constructs'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-variable-pitch nil
+(defface modus-themes-variable-pitch nil
   "Generic face for applying a conditional `variable-pitch'.
 This behaves in accordance with `modus-themes-no-mixed-fonts',
 `modus-themes-variable-pitch-headings' for all heading levels, and
@@ -1389,7 +1412,7 @@ This behaves in accordance with 
`modus-themes-no-mixed-fonts',
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-red-0 nil
+(defface modus-themes-graph-red-0 nil
   "Special subdued red face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1397,7 +1420,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-red-1 nil
+(defface modus-themes-graph-red-1 nil
   "Special prominent red face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1405,7 +1428,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-green-0 nil
+(defface modus-themes-graph-green-0 nil
   "Special subdued green face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1413,7 +1436,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-green-1 nil
+(defface modus-themes-graph-green-1 nil
   "Special prominent green face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1421,7 +1444,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-yellow-0 nil
+(defface modus-themes-graph-yellow-0 nil
   "Special subdued yellow face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1429,7 +1452,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-yellow-1 nil
+(defface modus-themes-graph-yellow-1 nil
   "Special prominent yellow face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1437,7 +1460,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-blue-0 nil
+(defface modus-themes-graph-blue-0 nil
   "Special subdued blue face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1445,7 +1468,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-blue-1 nil
+(defface modus-themes-graph-blue-1 nil
   "Special prominent blue face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1453,7 +1476,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-magenta-0 nil
+(defface modus-themes-graph-magenta-0 nil
   "Special subdued magenta face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1461,7 +1484,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-magenta-1 nil
+(defface modus-themes-graph-magenta-1 nil
   "Special prominent magenta face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1469,7 +1492,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-cyan-0 nil
+(defface modus-themes-graph-cyan-0 nil
   "Special subdued cyan face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1477,7 +1500,7 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-graph-cyan-1 nil
+(defface modus-themes-graph-cyan-1 nil
   "Special prominent cyan face for use in graphs.
 This is intended to be applied in contexts such as the Org agenda habit
 graph where faithfulness to the semantics of a color value is of
@@ -1485,27 +1508,51 @@ paramount importance.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-lang-note nil
+(defface modus-themes-lang-note nil
   "Generic face for linter or spell checker notes.
 The exact attributes and color combinations are controlled by
 `modus-themes-lang-checkers'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-lang-warning nil
+(defface modus-themes-lang-warning nil
   "Generic face for linter or spell checker warnings.
 The exact attributes and color combinations are controlled by
 `modus-themes-lang-checkers'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
-(defface modus-theme-lang-error nil
+(defface modus-themes-lang-error nil
   "Generic face for linter or spell checker errors.
 The exact attributes and color combinations are controlled by
 `modus-themes-lang-checkers'.
 
 The actual styling of the face is done by `modus-themes-faces'.")
 
+(defface modus-themes-reset-soft nil
+  "Generic face to set most face properties to nil.
+
+This is intended to be inherited by faces that should not retain
+properties from their context (e.g. an overlay over an underlined
+text should not be underlined as well) yet still blend in.  Also
+see `modus-themes-reset-hard'.
+
+The actual styling of the face is done by `modus-themes-faces'.")
+
+(defface modus-themes-reset-hard nil
+  "Generic face to set all face properties to nil.
+
+This is intended to be inherited by faces that should not retain
+properties from their context (e.g. an overlay over an underlined
+text should not be underlined as well) and not blend in.  Also
+see `modus-themes-reset-soft'.
+
+The actual styling of the face is done by `modus-themes-faces'.")
+
+(defface modus-themes-key-binding nil
+  "Generic face for key bindings.
+The actual styling of the face is done by `modus-themes-faces'.")
+
 
 
 ;;; Customization options
@@ -1592,8 +1639,31 @@ mixing fonts."
   :type 'boolean
   :link '(info-link "(modus-themes) No mixed fonts"))
 
-(defcustom modus-themes-headings
-  '((t . nil))
+(defconst modus-themes--headings-choice
+  '(choice
+    (const :format "[%v] %t\n" :tag "Fairly desaturated foreground with bold 
weight (default)" nil)
+    (const :format "[%v] %t\n" :tag "Same as the default 
(backward-compatible)" t)
+    (const :format "[%v] %t\n" :tag "Like the default without bold weight" 
no-bold)
+    (const :format "[%v] %t\n" :tag "Like the default plus overline" line)
+    (const :format "[%v] %t\n" :tag "Like `line' without bold weight" 
line-no-bold)
+    (const :format "[%v] %t\n" :tag "Like the default but with more colorful 
foreground" rainbow)
+    (const :format "[%v] %t\n" :tag "Like `rainbow' plus overline" 
rainbow-line)
+    (const :format "[%v] %t\n" :tag "Like `rainbow' without bold weight" 
rainbow-no-bold)
+    (const :format "[%v] %t\n" :tag "Like `rainbow-line' without bold weight" 
rainbow-line-no-bold)
+    (const :format "[%v] %t\n" :tag "Like the default plus subtle background" 
highlight)
+    (const :format "[%v] %t\n" :tag "Like `highlight' without bold weight" 
highlight-no-bold)
+    (const :format "[%v] %t\n" :tag "Like `highlight' with more colorful 
foreground" rainbow-highlight)
+    (const :format "[%v] %t\n" :tag "Like `rainbow-highlight' without bold 
weight" rainbow-highlight-no-bold)
+    (const :format "[%v] %t\n" :tag "Like `highlight' plus overline" section)
+    (const :format "[%v] %t\n" :tag "Like `section' without bold weight" 
section-no-bold)
+    (const :format "[%v] %t\n" :tag "Like `section' with more colorful 
foreground" rainbow-section)
+    (const :format "[%v] %t\n" :tag "Like `rainbow-section' without bold 
weight" rainbow-section-no-bold)
+    (const :format "[%v] %t\n" :tag "Do not use any distinct foreground color; 
just bold weight" no-color)
+    (const :format "[%v] %t\n" :tag "Like `no-bold' but without the distinct 
foreground color" no-color-no-bold))
+  "Refer to the doc string of `modus-themes-headings'.
+This is a helper variable intended for internal use.")
+
+(defcustom modus-themes-headings nil
   "Alist of styles for headings, with optional value per level.
 
 To control faces per level from 1-8, use something like this:
@@ -1608,17 +1678,18 @@ To set a uniform value for all heading levels, use this 
pattern:
   (setq modus-themes-headings
         '((t . rainbow-line-no-bold)))
 
-The default uses a fairly desaturated foreground value in
+The default value uses a fairly desaturated foreground color in
 combination with a bold typographic weight.  To specify this
 style for a given level N (assuming you wish to have another
-fallback option), just specify the value t like this:
+fallback option), just specify the value nil like this:
 
   (setq modus-themes-headings
-        '((1 . t)
+        '((1 . nil)
           (2 . line)
+          (3) ; same as nil
           (t . rainbow-line-no-bold)))
 
-A description of all possible values:
+A description of all other possible values:
 
 + `no-bold' retains the default text color while removing the
   typographic weight.
@@ -1669,30 +1740,14 @@ A description of all possible values:
 + `no-color-no-bold' is like `no-color' but without the bold
   weight."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.2.0")
+  :package-version '(modus-themes . "1.3.0")
   :version "28.1"
-  :type
-  '(alist
-    :key-type symbol
-    :value-type
-    (choice (const :tag "Fairly desaturated foreground with bold weight 
(default)" t)
-            (const :tag "Like the default without bold weight" no-bold)
-            (const :tag "Like the default plus overline" line)
-            (const :tag "Like `line' without bold weight" line-no-bold)
-            (const :tag "Like the default but with more colorful foreground" 
rainbow)
-            (const :tag "Like `rainbow' plus overline" rainbow-line)
-            (const :tag "Like `rainbow' without bold weight" rainbow-no-bold)
-            (const :tag "Like `rainbow-line' without bold weight" 
rainbow-line-no-bold)
-            (const :tag "Like the default plus subtle background" highlight)
-            (const :tag "Like `highlight' without bold weight" 
highlight-no-bold)
-            (const :tag "Like `highlight' with more colorful foreground" 
rainbow-highlight)
-            (const :tag "Like `rainbow-highlight' without bold weight" 
rainbow-highlight-no-bold)
-            (const :tag "Like `highlight' plus overline" section)
-            (const :tag "Like `section' without bold weight" section-no-bold)
-            (const :tag "Like `section' with more colorful foreground" 
rainbow-section)
-            (const :tag "Like `rainbow-section' without bold weight" 
rainbow-section-no-bold)
-            (const :tag "Do not use any distinct foreground color; just bold 
weight" no-color)
-            (const :tag "Like `no-bold' but without the distinct foreground 
color" no-color-no-bold)))
+  :type `(alist
+          :options ,(mapcar (lambda (el)
+                              (list el modus-themes--headings-choice))
+                            '(1 2 3 4 5 6 7 8 t))
+          :key-type symbol
+          :value-type ,modus-themes--headings-choice)
   :link '(info-link "(modus-themes) Heading styles"))
 
 (defcustom modus-themes-scale-headings nil
@@ -1830,16 +1885,16 @@ accordance with it in cases where it changes, such as 
while using
   "Define the visibility of fringes.
 
 Nil means the fringes have no background color.  Option `subtle'
-will apply a greyscale value that is visible yet close to the
+will apply a grayscale value that is visible yet close to the
 main buffer background color.  Option `intense' will use a more
-pronounced greyscale value."
+pronounced grayscale value."
   :group 'modus-themes
   :package-version '(modus-themes . "1.0.0")
   :version "28.1"
   :type '(choice
-          (const :tag "No visible fringes (default)" nil)
-          (const :tag "Subtle greyscale background" subtle)
-          (const :tag "Intense greyscale background" intense))
+          (const :format "[%v] %t\n" :tag "No visible fringes (default)" nil)
+          (const :format "[%v] %t\n" :tag "Subtle grayscale background" subtle)
+          (const :format "[%v] %t\n" :tag "Intense grayscale background" 
intense))
   :link '(info-link "(modus-themes) Fringes"))
 
 (defcustom modus-themes-lang-checkers nil
@@ -1867,13 +1922,13 @@ most intense combination of face properties."
   :package-version '(modus-themes . "1.1.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Only color-coded wavy underline (default)" nil)
-          (const :tag "Like the default, but with a straight underline" 
straight-underline)
-          (const :tag "Color-coded wavy underline; subtle foreground" 
subtle-foreground)
-          (const :tag "Combines `straight-underline' and `subtle-foreground'" 
subtle-foreground-straight-underline)
-          (const :tag "Color-coded wavy underline; intense foreground" 
intense-foreground)
-          (const :tag "Combines `straight-underline' and `intense-foreground'" 
intense-foreground-straight-underline)
-          (const :tag "Color-coded background, foreground, straight underline" 
colored-background))
+          (const :format "[%v] %t\n" :tag "Only color-coded wavy underline 
(default)" nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but with a 
straight underline" straight-underline)
+          (const :format "[%v] %t\n" :tag "Color-coded wavy underline; subtle 
foreground" subtle-foreground)
+          (const :format "[%v] %t\n" :tag "Combines `straight-underline' and 
`subtle-foreground'" subtle-foreground-straight-underline)
+          (const :format "[%v] %t\n" :tag "Color-coded wavy underline; intense 
foreground" intense-foreground)
+          (const :format "[%v] %t\n" :tag "Combines `straight-underline' and 
`intense-foreground'" intense-foreground-straight-underline)
+          (const :format "[%v] %t\n" :tag "Color-coded background, foreground, 
straight underline" colored-background))
   :link '(info-link "(modus-themes) Language checkers"))
 
 (defcustom modus-themes-org-blocks nil
@@ -1897,10 +1952,10 @@ association list)."
   :package-version '(modus-themes . "1.0.0")
   :version "28.1"
   :type '(choice
-          (const :tag "No Org block background (default)" nil)
-          (const :tag "Subtle gray block background" grayscale)
-          (const :tag "Subtle gray block background (alt spelling)" greyscale)
-          (const :tag "Color-coded background per programming language" 
rainbow))
+          (const :format "[%v] %t\n" :tag "No Org block background (default)" 
nil)
+          (const :format "[%v] %t\n" :tag "Subtle gray block background" 
grayscale)
+          (const :format "[%v] %t\n" :tag "Subtle gray block background (alt 
spelling)" greyscale)
+          (const :format "[%v] %t\n" :tag "Color-coded background per 
programming language" rainbow))
   :link '(info-link "(modus-themes) Org mode blocks"))
 
 (defcustom modus-themes-org-habit nil
@@ -1936,17 +1991,17 @@ highlights the alert and overdue states."
   :package-version '(modus-themes . "1.1.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Respect the original design of org-habit (default)" nil)
-          (const :tag "Like the default, but do not distinguish between 
present and future variants" simplified)
-          (const :tag "Like `simplified', but only use red, yellow, green" 
traffic-light))
+          (const :format "[%v] %t\n" :tag "Respect the original design of 
org-habit (default)" nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but do not 
distinguish between present and future variants" simplified)
+          (const :format "[%v] %t\n" :tag "Like `simplified', but only use 
red, yellow, green" traffic-light))
   :link '(info-link "(modus-themes) Org agenda habits"))
 
 (defcustom modus-themes-mode-line nil
   "Adjust the overall style of the mode line.
 
-Nil is a two-dimensional rectangle with a border around it.  The
-active and the inactive modelines use different shades of
-greyscale values for the background and foreground.
+The default (nil) is a two-dimensional rectangle with a border
+around it.  The active and the inactive modelines use different
+shades of grayscale values for the background and foreground.
 
 A `3d' value will apply a three-dimensional effect to the active
 modeline.  The inactive modelines remain two-dimensional and are
@@ -1969,17 +2024,25 @@ and `moody' options respectively, while removing the 
borders.
 However, to ensure that the inactive modelines remain visible,
 they apply a slightly more prominent background to them than what
 their counterparts do (same inactive background as with the
-default)."
+default).
+
+Similarly, `accented', `accented-3d', and `accented-moody'
+correspond to the default (nil), `3d', and `moody' styles
+respectively, except that the active mode line uses a colored
+background instead of the standard shade of gray."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.0.0")
+  :package-version '(modus-themes . "1.3.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Two-dimensional box (default)" nil)
-          (const :tag "Three-dimensional style for the active mode line" 3d)
-          (const :tag "No box effects, which are optimal for use with the 
`moody' library" moody)
-          (const :tag "Like the default, but without border effects" 
borderless)
-          (const :tag "Like `3d', but without noticeable border" borderless-3d)
-          (const :tag "Like `moody', but without noticeable border" 
borderless-moody))
+          (const :format "[%v] %t\n" :tag "Two-dimensional box (default)" nil)
+          (const :format "[%v] %t\n" :tag "Three-dimensional style for the 
active mode line" 3d)
+          (const :format "[%v] %t\n" :tag "No box effects, which are optimal 
for use with the `moody' library" moody)
+          (const :format "[%v] %t\n" :tag "Like the default, but without 
border effects" borderless)
+          (const :format "[%v] %t\n" :tag "Like `3d', but without noticeable 
border" borderless-3d)
+          (const :format "[%v] %t\n" :tag "Like `moody', but without 
noticeable border" borderless-moody)
+          (const :format "[%v] %t\n" :tag "Two-dimensional box with a colored 
background" accented)
+          (const :format "[%v] %t\n" :tag "Like `3d', but with a colored 
background" accented-3d)
+          (const :format "[%v] %t\n" :tag "Like `moody', but with a colored 
background" accented-moody))
   :link '(info-link "(modus-themes) Mode line"))
 
 (defcustom modus-themes-diffs nil
@@ -1998,7 +2061,7 @@ Option `fg-only' will remove all accented backgrounds, 
except
 from word-wise changes.  It instead uses color-coded foreground
 values to differentiate between added/removed/changed lines.  If
 a background is necessary, such as with `ediff', then a subtle
-greyscale value is used.
+grayscale value is used.
 
 Option `bg-only' applies a background but does not override the
 text's foreground.  This makes it suitable for a non-nil value
@@ -2014,11 +2077,11 @@ of optimizing for such a use-case."
   :package-version '(modus-themes . "1.2.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Intensely colored backgrounds (default)" nil)
-          (const :tag "Slightly accented backgrounds with tinted text" 
desaturated)
-          (const :tag "No backgrounds, except for refined diffs" fg-only)
-          (const :tag "Apply color-coded backgrounds; keep syntax colors in 
tact" bg-only)
-          (const :tag "Optimized for red-green color defficiency" 
deuteranopia))
+          (const :format "[%v] %t\n" :tag "Intensely colored backgrounds 
(default)" nil)
+          (const :format "[%v] %t\n" :tag "Slightly accented backgrounds with 
tinted text" desaturated)
+          (const :format "[%v] %t\n" :tag "No backgrounds, except for refined 
diffs" fg-only)
+          (const :format "[%v] %t\n" :tag "Apply color-coded backgrounds; keep 
syntax colors in tact" bg-only)
+          (const :format "[%v] %t\n" :tag "Optimized for red-green color 
defficiency" deuteranopia))
   :link '(info-link "(modus-themes) Diffs"))
 
 (defcustom modus-themes-completions nil
@@ -2048,9 +2111,9 @@ revert to an even more nuanced aesthetic."
   :package-version '(modus-themes . "1.0.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Respect the framework's established aesthetic 
(default)" nil)
-          (const :tag "Subtle backgrounds for various elements" moderate)
-          (const :tag "Radical alternative to the framework's looks" 
opinionated))
+          (const :format "[%v] %t\n" :tag "Respect the framework's established 
aesthetic (default)" nil)
+          (const :format "[%v] %t\n" :tag "Subtle backgrounds for various 
elements" moderate)
+          (const :format "[%v] %t\n" :tag "Radical alternative to the 
framework's looks" opinionated))
   :link '(info-link "(modus-themes) Completion UIs"))
 
 (defcustom modus-themes-prompts nil
@@ -2069,18 +2132,18 @@ Options `subtle-gray' and `intense-gray' are like their
 `subtle-accented' and `intense-accented' counterparts, except
 they use grayscale values instead of accented ones."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.0.0")
+  :package-version '(modus-themes . "1.1.0")
   :version "28.1"
   :type '(choice
           ;; `subtle' is the same as `subtle-accented', while `intense' is
           ;; equal to `intense-accented' for backward compatibility
-          (const :tag "No prompt background (default)" nil)
-          (const :tag "Subtle accented background for the prompt" 
subtle-accented)
-          (const :tag "Same as `subtle-accented' for compatibility with older 
versions" subtle)
-          (const :tag "Intense accented background and foreground for the 
prompt" intense-accented)
-          (const :tag "Same as `intense-accented' for compatibility with older 
versions" intense)
-          (const :tag "Like `subtle-accented' but grayscale" subtle-gray)
-          (const :tag "Like `intense-accented' but grayscale" intense-gray))
+          (const :format "[%v] %t\n" :tag "No prompt background (default)" nil)
+          (const :format "[%v] %t\n" :tag "Subtle accented background for the 
prompt" subtle-accented)
+          (const :format "[%v] %t\n" :tag "Same as `subtle-accented' for 
compatibility with older versions" subtle)
+          (const :format "[%v] %t\n" :tag "Intense accented background and 
foreground for the prompt" intense-accented)
+          (const :format "[%v] %t\n" :tag "Same as `intense-accented' for 
compatibility with older versions" intense)
+          (const :format "[%v] %t\n" :tag "Like `subtle-accented' but 
grayscale" subtle-gray)
+          (const :format "[%v] %t\n" :tag "Like `intense-accented' but 
grayscale" intense-gray))
   :link '(info-link "(modus-themes) Command prompts"))
 
 (defcustom modus-themes-intense-hl-line nil
@@ -2091,6 +2154,45 @@ they use grayscale values instead of accented ones."
   :type 'boolean
   :link '(info-link "(modus-themes) Line highlighting"))
 
+(make-obsolete 'modus-themes-intense-hl-line 'modus-themes-hl-line "1.3.0")
+
+(defcustom modus-themes-hl-line nil
+  "Control the current line highlight of HL-line mode.
+
+The default (nil) is to apply a subtle neutral background to the
+current line.
+
+Option `intense-background' uses a prominent neutral background.
+
+Option `accented-background' uses a subtle colored background.
+
+Option `underline-neutral' combines a subtle neutral background
+with a gray underline.
+
+Option `underline-accented' draws an underline while applying a
+subtle colored background.
+
+Option `underline-only-neutral' uses just a neutral underline,
+without any added change to the background.
+
+Option `underline-only-accented' uses just a colored underline,
+without any added change to the background.
+
+Set `x-underline-at-descent-line' to a non-nil value for better
+results with underlines."
+  :group 'modus-themes
+  :package-version '(modus-themes . "1.3.0")
+  :version "28.1"
+  :type '(choice
+          (const :format "[%v] %t\n" :tag "Subtle neutral background 
(default)" nil)
+          (const :format "[%v] %t\n" :tag "Prominent neutral background" 
intense-background)
+          (const :format "[%v] %t\n" :tag "Subtle colored background" 
accented-background)
+          (const :format "[%v] %t\n" :tag "Underline with a subtle neutral 
background" underline-neutral)
+          (const :format "[%v] %t\n" :tag "Underline with a subtle colored 
background" underline-accented)
+          (const :format "[%v] %t\n" :tag "Just a neutral underline, without a 
background" underline-only-neutral)
+          (const :format "[%v] %t\n" :tag "Just an accented underline, without 
a background" underline-only-accented))
+  :link '(info-link "(modus-themes) Line highlighting"))
+
 (defcustom modus-themes-subtle-line-numbers nil
   "Use more subtle style for command `display-line-numbers-mode'."
   :group 'modus-themes
@@ -2115,10 +2217,10 @@ uses a bold weight."
   :package-version '(modus-themes . "1.0.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Sublte tinted background (default)" nil)
-          (const :tag "Like the default, but also use bold typographic weight" 
subtle-bold)
-          (const :tag "Intense saturated background" intense)
-          (const :tag "Like `intense' but with bold weight" intense-bold))
+          (const :format "[%v] %t\n" :tag "Sublte tinted background (default)" 
nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but also use bold 
typographic weight" subtle-bold)
+          (const :format "[%v] %t\n" :tag "Intense saturated background" 
intense)
+          (const :format "[%v] %t\n" :tag "Like `intense' but with bold 
weight" intense-bold))
   :link '(info-link "(modus-themes) Matching parentheses"))
 
 (defcustom modus-themes-syntax nil
@@ -2155,14 +2257,14 @@ Option `faint-yellow-comments' combines the `faint' 
style with
   :package-version '(modus-themes . "1.2.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Balanced use of blue, cyan, magenta, purple variants 
(default)" nil)
-          (const :tag "Like the default, but with desaturated color values" 
faint)
-          (const :tag "Apply yellow tint to comments, keep the default style 
for the rest" yellow-comments)
-          (const :tag "Use green for strings, keep the default style for the 
rest" green-strings)
-          (const :tag "Use green for strings, yellow for comments, keep the 
default style for the rest" yellow-comments-green-strings)
-          (const :tag "Refashion syntax highlighting with more colors, gray 
comments" alt-syntax)
-          (const :tag "Like `alt-syntax' but with yellow comments" 
alt-syntax-yellow-comments)
-          (const :tag "Like `faint' but with yellow comments" 
faint-yellow-comments))
+          (const :format "[%v] %t\n" :tag "Balanced use of blue, cyan, 
magenta, purple variants (default)" nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but with 
desaturated color values" faint)
+          (const :format "[%v] %t\n" :tag "Apply yellow tint to comments, keep 
the default style for the rest" yellow-comments)
+          (const :format "[%v] %t\n" :tag "Use green for strings, keep the 
default style for the rest" green-strings)
+          (const :format "[%v] %t\n" :tag "Use green for strings, yellow for 
comments, keep the default style for the rest" yellow-comments-green-strings)
+          (const :format "[%v] %t\n" :tag "Refashion syntax highlighting with 
more colors, gray comments" alt-syntax)
+          (const :format "[%v] %t\n" :tag "Like `alt-syntax' but with yellow 
comments" alt-syntax-yellow-comments)
+          (const :format "[%v] %t\n" :tag "Like `faint' but with yellow 
comments" faint-yellow-comments))
   :link '(info-link "(modus-themes) Syntax styles"))
 
 (defcustom modus-themes-links nil
@@ -2174,11 +2276,11 @@ foreground.
 Option `faint' applies desaturated colors to the link's text and
 underline.
 
-Option `neutral-underline' applies a subtle grey underline, while
+Option `neutral-underline' applies a subtle gray underline, while
 retaining the link's foreground.
 
 Option `faint-neutral-underline' combines a desaturated text
-color with a subtle grey underline.
+color with a subtle gray underline.
 
 Option `no-underline' removes link underlines altogether, while
 retaining their original fairly vivid color.
@@ -2193,13 +2295,13 @@ using a subtle underline below it."
   :package-version '(modus-themes . "1.2.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Undeline link using the same color as the text 
(default)" nil)
-          (const :tag "Like the default, but apply less intense colors to 
links" faint)
-          (const :tag "Change the color of link underlines to a neutral grey" 
neutral-underline)
-          (const :tag "Desaturated foreground with neutral grey underline" 
faint-neutral-underline)
-          (const :tag "Remove underline property from links, keeping their 
foreground as-is" no-underline)
-          (const :tag "Apply underline only; use default foreground" 
underline-only)
-          (const :tag "Like `underline-only' but with a subtle underline" 
neutral-underline-only))
+          (const :format "[%v] %t\n" :tag "Undeline link using the same color 
as the text (default)" nil)
+          (const :format "[%v] %t\n" :tag "Like the default, but apply less 
intense colors to links" faint)
+          (const :format "[%v] %t\n" :tag "Change the color of link underlines 
to a neutral gray" neutral-underline)
+          (const :format "[%v] %t\n" :tag "Desaturated foreground with neutral 
gray underline" faint-neutral-underline)
+          (const :format "[%v] %t\n" :tag "Remove underline property from 
links, keeping their foreground as-is" no-underline)
+          (const :format "[%v] %t\n" :tag "Apply underline only; use default 
foreground" underline-only)
+          (const :format "[%v] %t\n" :tag "Like `underline-only' but with a 
subtle underline" neutral-underline-only))
   :link '(info-link "(modus-themes) Link styles"))
 
 (defcustom modus-themes-region nil
@@ -2218,15 +2320,24 @@ override any existing colors.  It extends to the edge 
of the
 window.
 
 Option `bg-only-no-extend' is a combination of the `bg-only' and
-`no-extend' options."
+`no-extend' options.
+
+Option `accent' uses a more colorful background with a neutral
+foreground.  It overrides all syntax highlighting and extends to
+the edge of the window.
+
+Option `accent-no-extend' is like the above, but stretches only
+to the end of each line within the region."
   :group 'modus-themes
-  :package-version '(modus-themes . "1.0.0")
+  :package-version '(modus-themes . "1.3.0")
   :version "28.1"
   :type '(choice
-          (const :tag "Intense background; overrides colors; extends to edge 
of window (default)" nil)
-          (const :tag "As with the default, but does not extend" no-extend)
-          (const :tag "Subtle background; preserves colors; extends to edge of 
window" bg-only)
-          (const :tag "As with the `subtle' option, but does not extend" 
bg-only-no-extend))
+          (const :format "[%v] %t\n" :tag "Intense background; overrides 
colors; extends to edge of window (default)" nil)
+          (const :format "[%v] %t\n" :tag "As with the default, but does not 
extend" no-extend)
+          (const :format "[%v] %t\n" :tag "Subtle background; preserves 
colors; extends to edge of window" bg-only)
+          (const :format "[%v] %t\n" :tag "As with the `subtle' option, but 
does not extend" bg-only-no-extend)
+          (const :format "[%v] %t\n" :tag "Like the default, but with an 
accented background" accent)
+          (const :format "[%v] %t\n" :tag "As with the `accent' option, but 
does not extend" accent-no-extend))
   :link '(info-link "(modus-themes) Active region"))
 
 
@@ -2382,8 +2493,8 @@ Those are stored in `modus-themes-faces' and
 
 (defun modus-themes--fringe (mainbg subtlebg intensebg)
   "Conditional use of background colors for fringes.
-MAINBG is the default.  SUBTLEBG should be a subtle greyscale
-value.  INTENSEBG must be a more pronounced greyscale color."
+MAINBG is the default.  SUBTLEBG should be a subtle grayscale
+value.  INTENSEBG must be a more pronounced grayscale color."
   (pcase modus-themes-fringes
     ('intense (list :background intensebg))
     ('subtle (list :background subtlebg))
@@ -2431,9 +2542,9 @@ combinable with INTENSEFG."
     ('intense (list :background intensebg :foreground intensefg))
     ('subtle-accented (list :background subtlebg :foreground subtlefg))
     ('subtle (list :background subtlebg :foreground subtlefg))
-    ('subtle-gray (list :inherit 'modus-theme-subtle-neutral))
-    ('intense-gray (list :inherit 'modus-theme-intense-neutral))
-    (_ (list :background nil :foreground mainfg))))
+    ('subtle-gray (list :inherit 'modus-themes-subtle-neutral))
+    ('intense-gray (list :inherit 'modus-themes-intense-neutral))
+    (_ (list :background 'unspecified :foreground mainfg))))
 
 (defun modus-themes--paren (normalbg intensebg)
   "Conditional use of intense colors for matching parentheses.
@@ -2582,10 +2693,10 @@ theme's source code)."
 BG, FG, BGACCENT, FGACCENT apply a background and foreground
 color respectively.
 
-The former pair is a greyscale combination that should be more
+The former pair is a grayscale combination that should be more
 distinct than the background of the block.  It is applied to the
 default styles or when `modus-themes-org-blocks' is set
-to `greyscale'.
+to `grayscale' (or `greyscale').
 
 The latter pair should be more subtle than the background of the
 block, as it is used when `modus-themes-org-blocks' is
@@ -2606,13 +2717,14 @@ instead.  Same for SIMPLE."
     (_ (list :background default))))
 
 (defun modus-themes--mode-line-attrs
-    (fg bg fg-alt bg-alt border border-3d &optional alt-style border-width 
fg-distant)
+    (fg bg fg-alt bg-alt fg-accent bg-accent border border-3d &optional 
alt-style border-width fg-distant)
   "Color combinations for `modus-themes-mode-line'.
 
 FG and BG are the default colors.  FG-ALT and BG-ALT are meant to
 accommodate the options for a 3D modeline or a `moody' compliant
-one.  BORDER applies to all permutations of the modeline, except
-the three-dimensional effect, where BORDER-3D is used instead.
+one.  FG-ACCENT and BG-ACCENT are used for all variants.  BORDER
+applies to all permutations of the modeline, except the
+three-dimensional effect, where BORDER-3D is used instead.
 
 Optional ALT-STYLE applies an appropriate style to the mode
 line's box property.
@@ -2644,6 +2756,17 @@ property."
      `(:background ,bg :foreground ,fg
        :underline ,bg :overline ,bg
        :distant-foreground ,fg-distant))
+    ('accented
+     `(:foreground ,fg-accent :background ,bg-accent :box ,border))
+    ('accented-3d
+     `(:background ,bg-accent :foreground ,fg-accent
+       :box (:line-width ,(or border-width 1)
+             :color ,border-3d
+             :style ,(and alt-style 'released-button))))
+    ('accented-moody
+     `(:background ,bg-accent :foreground ,fg-accent
+       :underline ,border :overline ,border
+       :distant-foreground ,fg-distant))
     (_
      `(:foreground ,fg :background ,bg :box ,border))))
 
@@ -2730,7 +2853,7 @@ These are intended for Helm, Ivy, etc."
   "Conditional application of link styles.
 FG is the link's default color for its text and underline
 property.  FGFAINT is a desaturated color for the text and
-underline.  UNDERLINE is a grey color only for the undeline."
+underline.  UNDERLINE is a gray color only for the undeline."
   (pcase modus-themes-links
     ('faint (list :foreground fgfaint :underline t))
     ('neutral-underline (list :foreground fg :underline underline))
@@ -2757,18 +2880,39 @@ AMOUNT is a customization option."
   (when modus-themes-scale-headings
     (list :height amount)))
 
-(defun modus-themes--region (bg fg bgsubtle)
+(defun modus-themes--region (bg fg bgsubtle bgaccent)
   "Apply `modus-themes-region' styles.
 
 BG and FG are the main values that are used by default.  BGSUBTLE
 is a subtle background value that can be combined with all colors
-used to fontify text and code syntax."
+used to fontify text and code syntax.  BGACCENT is a colored
+background that combines well with FG."
   (pcase modus-themes-region
     ('bg-only (list :background bgsubtle))
     ('bg-only-no-extend (list :background bgsubtle :extend nil))
     ('no-extend (list :background bg :foreground fg :extend nil))
+    ('accent (list :background bgaccent :foreground fg))
+    ('accent-no-extend (list :background bgaccent :foreground fg :extend nil))
     (_ (list :background bg :foreground fg))))
 
+(defun modus-themes--hl-line (bgdefault bgintense bgaccent lineneutral 
lineaccent)
+  "Apply `modus-themes-hl-line' styles.
+
+BGDEFAULT is a subtle neutral background.  BGINTENSE is like the
+default, but more prominent.  BGACCENT is a subtle accented
+background.  LINENEUTRAL and LINEACCENT are a color values that
+can remain distinct against the buffer's possible backgrounds:
+the former is neutral, the latter is accented.  LINEONLY must be
+a prominent neutral color."
+  (pcase modus-themes-hl-line
+    ('intense-background (list :background bgintense))
+    ('accented-background (list :background bgaccent))
+    ('underline-neutral (list :background bgdefault :underline lineneutral))
+    ('underline-accented (list :background bgaccent :underline lineaccent))
+    ('underline-only-neutral (list :background 'unspecified :underline 
lineneutral))
+    ('underline-only-accented (list :background 'unspecified :underline 
lineaccent))
+    (_ (list :background bgdefault))))
+
 
 
 ;;;; Utilities for DIY users
@@ -2929,112 +3073,112 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;; custom faces
     ;; these bespoke faces are inherited by other constructs below
 ;;;;; subtle colored backgrounds
-    `(modus-theme-subtle-red ((,class :background ,red-subtle-bg :foreground 
,fg-dim)))
-    `(modus-theme-subtle-green ((,class :background ,green-subtle-bg 
:foreground ,fg-dim)))
-    `(modus-theme-subtle-yellow ((,class :background ,yellow-subtle-bg 
:foreground ,fg-dim)))
-    `(modus-theme-subtle-blue ((,class :background ,blue-subtle-bg :foreground 
,fg-dim)))
-    `(modus-theme-subtle-magenta ((,class :background ,magenta-subtle-bg 
:foreground ,fg-dim)))
-    `(modus-theme-subtle-cyan ((,class :background ,cyan-subtle-bg :foreground 
,fg-dim)))
-    `(modus-theme-subtle-neutral ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
+    `(modus-themes-subtle-red ((,class :background ,red-subtle-bg :foreground 
,fg-dim)))
+    `(modus-themes-subtle-green ((,class :background ,green-subtle-bg 
:foreground ,fg-dim)))
+    `(modus-themes-subtle-yellow ((,class :background ,yellow-subtle-bg 
:foreground ,fg-dim)))
+    `(modus-themes-subtle-blue ((,class :background ,blue-subtle-bg 
:foreground ,fg-dim)))
+    `(modus-themes-subtle-magenta ((,class :background ,magenta-subtle-bg 
:foreground ,fg-dim)))
+    `(modus-themes-subtle-cyan ((,class :background ,cyan-subtle-bg 
:foreground ,fg-dim)))
+    `(modus-themes-subtle-neutral ((,class :background ,bg-inactive 
:foreground ,fg-inactive)))
 ;;;;; intense colored backgrounds
-    `(modus-theme-intense-red ((,class :background ,red-intense-bg :foreground 
,fg-main)))
-    `(modus-theme-intense-green ((,class :background ,green-intense-bg 
:foreground ,fg-main)))
-    `(modus-theme-intense-yellow ((,class :background ,yellow-intense-bg 
:foreground ,fg-main)))
-    `(modus-theme-intense-blue ((,class :background ,blue-intense-bg 
:foreground ,fg-main)))
-    `(modus-theme-intense-magenta ((,class :background ,magenta-intense-bg 
:foreground ,fg-main)))
-    `(modus-theme-intense-cyan ((,class :background ,cyan-intense-bg 
:foreground ,fg-main)))
-    `(modus-theme-intense-neutral ((,class :background ,bg-active :foreground 
,fg-main)))
+    `(modus-themes-intense-red ((,class :background ,red-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-green ((,class :background ,green-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-yellow ((,class :background ,yellow-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-blue ((,class :background ,blue-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-magenta ((,class :background ,magenta-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-cyan ((,class :background ,cyan-intense-bg 
:foreground ,fg-main)))
+    `(modus-themes-intense-neutral ((,class :background ,bg-active :foreground 
,fg-main)))
 ;;;;; refined background and foreground combinations
     ;; general purpose styles that use an accented foreground against an
     ;; accented background
-    `(modus-theme-refine-red ((,class :background ,red-refine-bg :foreground 
,red-refine-fg)))
-    `(modus-theme-refine-green ((,class :background ,green-refine-bg 
:foreground ,green-refine-fg)))
-    `(modus-theme-refine-yellow ((,class :background ,yellow-refine-bg 
:foreground ,yellow-refine-fg)))
-    `(modus-theme-refine-blue ((,class :background ,blue-refine-bg :foreground 
,blue-refine-fg)))
-    `(modus-theme-refine-magenta ((,class :background ,magenta-refine-bg 
:foreground ,magenta-refine-fg)))
-    `(modus-theme-refine-cyan ((,class :background ,cyan-refine-bg :foreground 
,cyan-refine-fg)))
+    `(modus-themes-refine-red ((,class :background ,red-refine-bg :foreground 
,red-refine-fg)))
+    `(modus-themes-refine-green ((,class :background ,green-refine-bg 
:foreground ,green-refine-fg)))
+    `(modus-themes-refine-yellow ((,class :background ,yellow-refine-bg 
:foreground ,yellow-refine-fg)))
+    `(modus-themes-refine-blue ((,class :background ,blue-refine-bg 
:foreground ,blue-refine-fg)))
+    `(modus-themes-refine-magenta ((,class :background ,magenta-refine-bg 
:foreground ,magenta-refine-fg)))
+    `(modus-themes-refine-cyan ((,class :background ,cyan-refine-bg 
:foreground ,cyan-refine-fg)))
 ;;;;; "active" combinations, mostly for use on the mode line
-    `(modus-theme-active-red ((,class :background ,red-active :foreground 
,bg-active)))
-    `(modus-theme-active-green ((,class :background ,green-active :foreground 
,bg-active)))
-    `(modus-theme-active-yellow ((,class :background ,yellow-active 
:foreground ,bg-active)))
-    `(modus-theme-active-blue ((,class :background ,blue-active :foreground 
,bg-active)))
-    `(modus-theme-active-magenta ((,class :background ,magenta-active 
:foreground ,bg-active)))
-    `(modus-theme-active-cyan ((,class :background ,cyan-active :foreground 
,bg-active)))
+    `(modus-themes-active-red ((,class :background ,red-active :foreground 
,bg-active)))
+    `(modus-themes-active-green ((,class :background ,green-active :foreground 
,bg-active)))
+    `(modus-themes-active-yellow ((,class :background ,yellow-active 
:foreground ,bg-active)))
+    `(modus-themes-active-blue ((,class :background ,blue-active :foreground 
,bg-active)))
+    `(modus-themes-active-magenta ((,class :background ,magenta-active 
:foreground ,bg-active)))
+    `(modus-themes-active-cyan ((,class :background ,cyan-active :foreground 
,bg-active)))
 ;;;;; nuanced backgrounds
     ;; useful for adding an accented background that is suitable for all
     ;; main foreground colors (intended for use in Org source blocks)
-    `(modus-theme-nuanced-red ((,class :background ,red-nuanced-bg :extend t)))
-    `(modus-theme-nuanced-green ((,class :background ,green-nuanced-bg :extend 
t)))
-    `(modus-theme-nuanced-yellow ((,class :background ,yellow-nuanced-bg 
:extend t)))
-    `(modus-theme-nuanced-blue ((,class :background ,blue-nuanced-bg :extend 
t)))
-    `(modus-theme-nuanced-magenta ((,class :background ,magenta-nuanced-bg 
:extend t)))
-    `(modus-theme-nuanced-cyan ((,class :background ,cyan-nuanced-bg :extend 
t)))
+    `(modus-themes-nuanced-red ((,class :background ,red-nuanced-bg :extend 
t)))
+    `(modus-themes-nuanced-green ((,class :background ,green-nuanced-bg 
:extend t)))
+    `(modus-themes-nuanced-yellow ((,class :background ,yellow-nuanced-bg 
:extend t)))
+    `(modus-themes-nuanced-blue ((,class :background ,blue-nuanced-bg :extend 
t)))
+    `(modus-themes-nuanced-magenta ((,class :background ,magenta-nuanced-bg 
:extend t)))
+    `(modus-themes-nuanced-cyan ((,class :background ,cyan-nuanced-bg :extend 
t)))
 ;;;;; fringe-specific combinations
-    `(modus-theme-fringe-red ((,class :background ,red-fringe-bg :foreground 
,fg-main)))
-    `(modus-theme-fringe-green ((,class :background ,green-fringe-bg 
:foreground ,fg-main)))
-    `(modus-theme-fringe-yellow ((,class :background ,yellow-fringe-bg 
:foreground ,fg-main)))
-    `(modus-theme-fringe-blue ((,class :background ,blue-fringe-bg :foreground 
,fg-main)))
-    `(modus-theme-fringe-magenta ((,class :background ,magenta-fringe-bg 
:foreground ,fg-main)))
-    `(modus-theme-fringe-cyan ((,class :background ,cyan-fringe-bg :foreground 
,fg-main)))
+    `(modus-themes-fringe-red ((,class :background ,red-fringe-bg :foreground 
,fg-main)))
+    `(modus-themes-fringe-green ((,class :background ,green-fringe-bg 
:foreground ,fg-main)))
+    `(modus-themes-fringe-yellow ((,class :background ,yellow-fringe-bg 
:foreground ,fg-main)))
+    `(modus-themes-fringe-blue ((,class :background ,blue-fringe-bg 
:foreground ,fg-main)))
+    `(modus-themes-fringe-magenta ((,class :background ,magenta-fringe-bg 
:foreground ,fg-main)))
+    `(modus-themes-fringe-cyan ((,class :background ,cyan-fringe-bg 
:foreground ,fg-main)))
 ;;;;; special base values
     ;; these are closer to the grayscale than the accents defined above
     ;; and should only be used when the next closest alternative would be
-    ;; a greyscale value than an accented one
-    `(modus-theme-special-cold ((,class :background ,bg-special-cold 
:foreground ,fg-special-cold)))
-    `(modus-theme-special-mild ((,class :background ,bg-special-mild 
:foreground ,fg-special-mild)))
-    `(modus-theme-special-warm ((,class :background ,bg-special-warm 
:foreground ,fg-special-warm)))
-    `(modus-theme-special-calm ((,class :background ,bg-special-calm 
:foreground ,fg-special-calm)))
+    ;; a grayscale value than an accented one
+    `(modus-themes-special-cold ((,class :background ,bg-special-cold 
:foreground ,fg-special-cold)))
+    `(modus-themes-special-mild ((,class :background ,bg-special-mild 
:foreground ,fg-special-mild)))
+    `(modus-themes-special-warm ((,class :background ,bg-special-warm 
:foreground ,fg-special-warm)))
+    `(modus-themes-special-calm ((,class :background ,bg-special-calm 
:foreground ,fg-special-calm)))
 ;;;;; diff-specific combinations
     ;; intended for `diff-mode' or equivalent
-    `(modus-theme-diff-added
+    `(modus-themes-diff-added
       ((,class ,@(modus-themes--diff
                   bg-main green
                   bg-diff-focus-added fg-diff-focus-added
                   green-nuanced-bg fg-diff-added
                   bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
-    `(modus-theme-diff-changed
+    `(modus-themes-diff-changed
       ((,class ,@(modus-themes--diff
                   bg-main yellow
                   bg-diff-focus-changed fg-diff-focus-changed
                   yellow-nuanced-bg fg-diff-changed))))
-    `(modus-theme-diff-removed
+    `(modus-themes-diff-removed
       ((,class ,@(modus-themes--diff
                   bg-main red
                   bg-diff-focus-removed fg-diff-focus-removed
                   red-nuanced-bg fg-diff-removed))))
-    `(modus-theme-diff-refine-added
+    `(modus-themes-diff-refine-added
       ((,class ,@(modus-themes--diff
                   bg-diff-added fg-diff-added
                   bg-diff-refine-added fg-diff-refine-added
                   bg-diff-focus-added fg-diff-focus-added
                   bg-diff-refine-added-deuteran 
fg-diff-refine-added-deuteran))))
-    `(modus-theme-diff-refine-changed
+    `(modus-themes-diff-refine-changed
       ((,class ,@(modus-themes--diff
                   bg-diff-changed fg-diff-changed
                   bg-diff-refine-changed fg-diff-refine-changed
                   bg-diff-focus-changed fg-diff-focus-changed))))
-    `(modus-theme-diff-refine-removed
+    `(modus-themes-diff-refine-removed
       ((,class ,@(modus-themes--diff
                   bg-diff-removed fg-diff-removed
                   bg-diff-refine-removed fg-diff-refine-removed
                   bg-diff-focus-removed fg-diff-focus-removed))))
-    `(modus-theme-diff-focus-added
+    `(modus-themes-diff-focus-added
       ((,class ,@(modus-themes--diff
                   bg-dim green
                   bg-diff-focus-added fg-diff-focus-added
                   bg-diff-added fg-diff-added
                   bg-diff-focus-added-deuteran fg-diff-focus-added-deuteran))))
-    `(modus-theme-diff-focus-changed
+    `(modus-themes-diff-focus-changed
       ((,class ,@(modus-themes--diff
                   bg-dim yellow
                   bg-diff-focus-changed fg-diff-focus-changed
                   bg-diff-changed fg-diff-changed))))
-    `(modus-theme-diff-focus-removed
+    `(modus-themes-diff-focus-removed
       ((,class ,@(modus-themes--diff
                   bg-dim red
                   bg-diff-focus-removed fg-diff-focus-removed
                   bg-diff-removed fg-diff-removed))))
-    `(modus-theme-diff-heading
+    `(modus-themes-diff-heading
       ((,class ,@(modus-themes--diff
                   bg-main blue
                   bg-diff-heading fg-diff-heading
@@ -3043,65 +3187,70 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   t))))
 ;;;;; mark indicators
     ;; color combinations intended for Dired, Ibuffer, or equivalent
-    `(modus-theme-pseudo-header ((,class :inherit bold :foreground ,fg-main)))
-    `(modus-theme-mark-alt ((,class :inherit bold :background ,bg-mark-alt 
:foreground ,fg-mark-alt)))
-    `(modus-theme-mark-del ((,class :inherit bold :background ,bg-mark-del 
:foreground ,fg-mark-del)))
-    `(modus-theme-mark-sel ((,class :inherit bold :background ,bg-mark-sel 
:foreground ,fg-mark-sel)))
-    `(modus-theme-mark-symbol ((,class :inherit bold :foreground ,blue-alt)))
+    `(modus-themes-pseudo-header ((,class :inherit bold :foreground ,fg-main)))
+    `(modus-themes-mark-alt ((,class :inherit bold :background ,bg-mark-alt 
:foreground ,fg-mark-alt)))
+    `(modus-themes-mark-del ((,class :inherit bold :background ,bg-mark-del 
:foreground ,fg-mark-del)))
+    `(modus-themes-mark-sel ((,class :inherit bold :background ,bg-mark-sel 
:foreground ,fg-mark-sel)))
+    `(modus-themes-mark-symbol ((,class :inherit bold :foreground ,blue-alt)))
 ;;;;; heading levels
     ;; styles for regular headings used in Org, Markdown, Info, etc.
-    `(modus-theme-heading-1
+    `(modus-themes-heading-1
       ((,class ,@(modus-themes--heading
                   1 fg-main magenta-alt-other magenta-nuanced-bg bg-region)
                ,@(modus-themes--scale modus-themes-scale-4))))
-    `(modus-theme-heading-2
+    `(modus-themes-heading-2
       ((,class ,@(modus-themes--heading
                   2 fg-special-warm magenta-alt red-nuanced-bg bg-region)
                ,@(modus-themes--scale modus-themes-scale-3))))
-    `(modus-theme-heading-3
+    `(modus-themes-heading-3
       ((,class ,@(modus-themes--heading
                   3 fg-special-cold blue blue-nuanced-bg bg-region)
                ,@(modus-themes--scale modus-themes-scale-2))))
-    `(modus-theme-heading-4
+    `(modus-themes-heading-4
       ((,class ,@(modus-themes--heading
                   4 fg-special-mild cyan cyan-nuanced-bg bg-region)
                ,@(modus-themes--scale modus-themes-scale-1))))
-    `(modus-theme-heading-5
+    `(modus-themes-heading-5
       ((,class ,@(modus-themes--heading
                   5 fg-special-calm green-alt-other green-nuanced-bg 
bg-region))))
-    `(modus-theme-heading-6
+    `(modus-themes-heading-6
       ((,class ,@(modus-themes--heading
                   6 yellow-nuanced-fg yellow-alt-other yellow-nuanced-bg 
bg-region))))
-    `(modus-theme-heading-7
+    `(modus-themes-heading-7
       ((,class ,@(modus-themes--heading
                   7 red-nuanced-fg red-alt red-nuanced-bg bg-region))))
-    `(modus-theme-heading-8
+    `(modus-themes-heading-8
       ((,class ,@(modus-themes--heading
                   8 fg-dim magenta bg-alt bg-region))))
 ;;;;; graph-specific faces
-    `(modus-theme-graph-red-0 ((,class :background ,red-graph-0-bg)))
-    `(modus-theme-graph-red-1 ((,class :background ,red-graph-1-bg)))
-    `(modus-theme-graph-green-0 ((,class :background ,green-graph-0-bg)))
-    `(modus-theme-graph-green-1 ((,class :background ,green-graph-1-bg)))
-    `(modus-theme-graph-yellow-0 ((,class :background ,yellow-graph-0-bg)))
-    `(modus-theme-graph-yellow-1 ((,class :background ,yellow-graph-1-bg)))
-    `(modus-theme-graph-blue-0 ((,class :background ,blue-graph-0-bg)))
-    `(modus-theme-graph-blue-1 ((,class :background ,blue-graph-1-bg)))
-    `(modus-theme-graph-magenta-0 ((,class :background ,magenta-graph-0-bg)))
-    `(modus-theme-graph-magenta-1 ((,class :background ,magenta-graph-1-bg)))
-    `(modus-theme-graph-cyan-0 ((,class :background ,cyan-graph-0-bg)))
-    `(modus-theme-graph-cyan-1 ((,class :background ,cyan-graph-1-bg)))
+    `(modus-themes-graph-red-0 ((,class :background ,red-graph-0-bg)))
+    `(modus-themes-graph-red-1 ((,class :background ,red-graph-1-bg)))
+    `(modus-themes-graph-green-0 ((,class :background ,green-graph-0-bg)))
+    `(modus-themes-graph-green-1 ((,class :background ,green-graph-1-bg)))
+    `(modus-themes-graph-yellow-0 ((,class :background ,yellow-graph-0-bg)))
+    `(modus-themes-graph-yellow-1 ((,class :background ,yellow-graph-1-bg)))
+    `(modus-themes-graph-blue-0 ((,class :background ,blue-graph-0-bg)))
+    `(modus-themes-graph-blue-1 ((,class :background ,blue-graph-1-bg)))
+    `(modus-themes-graph-magenta-0 ((,class :background ,magenta-graph-0-bg)))
+    `(modus-themes-graph-magenta-1 ((,class :background ,magenta-graph-1-bg)))
+    `(modus-themes-graph-cyan-0 ((,class :background ,cyan-graph-0-bg)))
+    `(modus-themes-graph-cyan-1 ((,class :background ,cyan-graph-1-bg)))
 ;;;;; language checkers
-    `(modus-theme-lang-error ((,class ,@(modus-themes--lang-check 
fg-lang-underline-error fg-lang-error red red-nuanced-bg))))
-    `(modus-theme-lang-note ((,class ,@(modus-themes--lang-check 
fg-lang-underline-note fg-lang-note blue-alt blue-nuanced-bg))))
-    `(modus-theme-lang-warning ((,class ,@(modus-themes--lang-check 
fg-lang-underline-warning fg-lang-warning yellow yellow-nuanced-bg))))
+    `(modus-themes-lang-error ((,class ,@(modus-themes--lang-check 
fg-lang-underline-error fg-lang-error red red-nuanced-bg))))
+    `(modus-themes-lang-note ((,class ,@(modus-themes--lang-check 
fg-lang-underline-note fg-lang-note blue-alt blue-nuanced-bg))))
+    `(modus-themes-lang-warning ((,class ,@(modus-themes--lang-check 
fg-lang-underline-warning fg-lang-warning yellow yellow-nuanced-bg))))
 ;;;;; other custom faces
-    `(modus-theme-bold ((,class ,@(modus-themes--bold-weight))))
-    `(modus-theme-hl-line ((,class :background ,(if 
modus-themes-intense-hl-line
-                                                    bg-hl-line-intense 
bg-hl-line)
-                                   :extend t)))
-    `(modus-theme-slant ((,class :inherit italic :slant 
,@(modus-themes--slant))))
-    `(modus-theme-variable-pitch ((,class ,@(modus-themes--variable-pitch))))
+    `(modus-themes-bold ((,class ,@(modus-themes--bold-weight))))
+    `(modus-themes-hl-line ((,class ,@(modus-themes--hl-line bg-hl-line 
bg-hl-line-intense blue-nuanced-bg
+                                                             bg-region 
blue-intense-bg)
+                                    :extend t)))
+    `(modus-themes-key-binding ((,class :inherit bold :foreground 
,blue-alt-other)))
+    `(modus-themes-slant ((,class :inherit italic :slant 
,@(modus-themes--slant))))
+    `(modus-themes-variable-pitch ((,class ,@(modus-themes--variable-pitch))))
+    `(modus-themes-reset-soft ((,class :background ,bg-main :foreground 
,fg-main
+                                       :weight normal :slant normal 
:strike-through nil
+                                       :box nil :underline nil :overline nil 
:extend nil)))
+    `(modus-themes-reset-hard ((,class :inherit (fixed-pitch 
modus-themes-reset-soft))))
 ;;;; standard faces
 ;;;;; absolute essentials
     `(default ((,class :background ,bg-main :foreground ,fg-main)))
@@ -3114,7 +3263,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(bold-italic ((,class :inherit (bold italic))))
     `(buffer-menu-buffer ((,class :inherit bold)))
     `(comint-highlight-input ((,class :inherit bold)))
-    `(comint-highlight-prompt ((,class :inherit modus-theme-bold
+    `(comint-highlight-prompt ((,class :inherit modus-themes-bold
                                        ,@(modus-themes--prompt
                                           cyan
                                           blue-nuanced-bg blue-alt
@@ -3124,8 +3273,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(file-name-shadow ((,class :foreground ,fg-unfocused)))
     `(header-line ((,class ,@(modus-themes--variable-pitch-ui)
                            :background ,bg-header :foreground ,fg-header)))
-    `(header-line-highlight ((,class :inherit modus-theme-active-blue)))
-    `(help-argument-name ((,class :inherit modus-theme-slant :foreground 
,cyan)))
+    `(header-line-highlight ((,class :inherit modus-themes-active-blue)))
+    `(help-argument-name ((,class :inherit modus-themes-slant :foreground 
,cyan)))
+    `(help-key-binding ((,class :box (:line-width (1 . -1) :color ,bg-region) 
; NOTE: box syntax is for Emacs28
+                                :background ,bg-inactive)))
     `(homoglyph ((,class :foreground ,red-alt-faint)))
     `(ibuffer-locked-buffer ((,class :foreground ,yellow-alt-other-faint)))
     `(italic ((,class :slant italic)))
@@ -3137,10 +3288,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                     cyan-refine-bg fg-main))))
     `(mm-command-output ((,class :foreground ,red-alt-other)))
     `(mm-uu-extract ((,class :background ,bg-dim :foreground 
,fg-special-mild)))
-    `(next-error ((,class :inherit modus-theme-subtle-red)))
-    `(rectangle-preview ((,class :inherit modus-theme-special-mild)))
-    `(region ((,class ,@(modus-themes--region bg-region fg-main 
bg-hl-alt-intense))))
-    `(secondary-selection ((,class :inherit modus-theme-special-cold)))
+    `(next-error ((,class :inherit modus-themes-subtle-red)))
+    `(rectangle-preview ((,class :inherit modus-themes-special-mild)))
+    `(region ((,class ,@(modus-themes--region bg-region fg-main 
bg-hl-alt-intense bg-region-accent))))
+    `(secondary-selection ((,class :inherit modus-themes-special-cold)))
     `(shadow ((,class :foreground ,fg-alt)))
     `(success ((,class :inherit bold :foreground ,green)))
     `(trailing-whitespace ((,class :background ,red-intense-bg)))
@@ -3163,7 +3314,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(widget-single-line-field ((,class :inherit widget-field)))
 ;;;;; ag
     `(ag-hit-face ((,class :foreground ,fg-special-cold)))
-    `(ag-match-face ((,class :inherit modus-theme-special-calm)))
+    `(ag-match-face ((,class :inherit modus-themes-special-calm)))
 ;;;;; alert
     `(alert-high-face ((,class :inherit bold :foreground ,red-alt)))
     `(alert-low-face ((,class :foreground ,fg-special-mild)))
@@ -3207,28 +3358,28 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(all-the-icons-silver ((,class :foreground ,fg-special-cold)))
     `(all-the-icons-yellow ((,class :foreground ,yellow)))
 ;;;;; annotate
-    `(annotate-annotation ((,class :inherit modus-theme-subtle-blue)))
-    `(annotate-annotation-secondary ((,class :inherit 
modus-theme-subtle-green)))
+    `(annotate-annotation ((,class :inherit modus-themes-subtle-blue)))
+    `(annotate-annotation-secondary ((,class :inherit 
modus-themes-subtle-green)))
     `(annotate-highlight ((,class :background ,blue-nuanced-bg :underline 
,blue-intense)))
     `(annotate-highlight-secondary ((,class :background ,green-nuanced-bg 
:underline ,green-intense)))
 ;;;;; anzu
-    `(anzu-match-1 ((,class :inherit modus-theme-subtle-cyan)))
-    `(anzu-match-2 ((,class :inherit modus-theme-subtle-green)))
-    `(anzu-match-3 ((,class :inherit modus-theme-subtle-yellow)))
+    `(anzu-match-1 ((,class :inherit modus-themes-subtle-cyan)))
+    `(anzu-match-2 ((,class :inherit modus-themes-subtle-green)))
+    `(anzu-match-3 ((,class :inherit modus-themes-subtle-yellow)))
     `(anzu-mode-line ((,class :inherit bold :foreground ,green-active)))
     `(anzu-mode-line-no-match ((,class :inherit bold :foreground ,red-active)))
-    `(anzu-replace-highlight ((,class :inherit modus-theme-refine-yellow 
:underline t)))
-    `(anzu-replace-to ((,class :inherit (modus-theme-intense-green bold))))
+    `(anzu-replace-highlight ((,class :inherit modus-themes-refine-yellow 
:underline t)))
+    `(anzu-replace-to ((,class :inherit (modus-themes-intense-green bold))))
 ;;;;; apropos
     `(apropos-function-button ((,class :inherit button
                                        ,@(modus-themes--link-color
                                           magenta-alt-other 
magenta-alt-other-faint))))
-    `(apropos-keybinding ((,class :inherit bold :foreground ,cyan)))
+    `(apropos-keybinding ((,class :inherit modus-themes-key-binding)))
     `(apropos-misc-button ((,class :inherit button
                                    ,@(modus-themes--link-color
                                       cyan-alt-other cyan-alt-other-faint))))
-    `(apropos-property ((,class :inherit modus-theme-bold :foreground 
,magenta-alt)))
-    `(apropos-symbol ((,class :inherit modus-theme-bold :foreground 
,blue-alt-other)))
+    `(apropos-property ((,class :inherit modus-themes-bold :foreground 
,magenta-alt)))
+    `(apropos-symbol ((,class :inherit modus-themes-bold :foreground 
,magenta)))
     `(apropos-user-option-button ((,class :inherit button
                                           ,@(modus-themes--link-color
                                              green-alt-other 
green-alt-other-faint))))
@@ -3242,25 +3393,25 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(apt-sources-list-type ((,class :foreground ,magenta)))
     `(apt-sources-list-uri ((,class :foreground ,blue)))
 ;;;;; artbollocks-mode
-    `(artbollocks-face ((,class :inherit modus-theme-lang-note)))
+    `(artbollocks-face ((,class :inherit modus-themes-lang-note)))
     `(artbollocks-lexical-illusions-face ((,class :background ,bg-alt 
:foreground ,red-alt :underline t)))
-    `(artbollocks-passive-voice-face ((,class :inherit 
modus-theme-lang-warning)))
-    `(artbollocks-weasel-words-face ((,class :inherit modus-theme-lang-error)))
+    `(artbollocks-passive-voice-face ((,class :inherit 
modus-themes-lang-warning)))
+    `(artbollocks-weasel-words-face ((,class :inherit 
modus-themes-lang-error)))
 ;;;;; auctex and Tex
     `(font-latex-bold-face ((,class :inherit bold :foreground 
,fg-special-calm)))
-    `(font-latex-doctex-documentation-face ((,class :inherit modus-theme-slant 
:foreground ,fg-special-cold)))
-    `(font-latex-doctex-preprocessor-face ((,class :inherit modus-theme-bold 
:foreground ,red-alt-other)))
+    `(font-latex-doctex-documentation-face ((,class :inherit 
modus-themes-slant :foreground ,fg-special-cold)))
+    `(font-latex-doctex-preprocessor-face ((,class :inherit modus-themes-bold 
:foreground ,red-alt-other)))
     `(font-latex-italic-face ((,class :inherit italic :foreground 
,fg-special-calm)))
     `(font-latex-math-face ((,class :foreground ,cyan-alt-other)))
     `(font-latex-script-char-face ((,class :foreground ,cyan-alt-other)))
-    `(font-latex-sectioning-0-face ((,class :inherit 
modus-theme-variable-pitch :foreground ,blue-nuanced-fg)))
-    `(font-latex-sectioning-1-face ((,class :inherit (bold 
modus-theme-variable-pitch) :foreground ,blue-nuanced-fg)))
-    `(font-latex-sectioning-2-face ((,class :inherit (bold 
modus-theme-variable-pitch) :foreground ,blue-nuanced-fg)))
-    `(font-latex-sectioning-3-face ((,class :inherit (bold 
modus-theme-variable-pitch) :foreground ,blue-nuanced-fg)))
-    `(font-latex-sectioning-4-face ((,class :inherit (bold 
modus-theme-variable-pitch) :foreground ,blue-nuanced-fg)))
-    `(font-latex-sectioning-5-face ((,class :inherit 
modus-theme-variable-pitch :foreground ,blue-nuanced-fg)))
-    `(font-latex-sedate-face ((,class :inherit modus-theme-bold :foreground 
,magenta-alt-other)))
-    `(font-latex-slide-title-face ((,class :inherit (bold 
modus-theme-variable-pitch) :foreground ,cyan-nuanced-fg
+    `(font-latex-sectioning-0-face ((,class :inherit 
modus-themes-variable-pitch :foreground ,blue-nuanced-fg)))
+    `(font-latex-sectioning-1-face ((,class :inherit (bold 
modus-themes-variable-pitch) :foreground ,blue-nuanced-fg)))
+    `(font-latex-sectioning-2-face ((,class :inherit (bold 
modus-themes-variable-pitch) :foreground ,blue-nuanced-fg)))
+    `(font-latex-sectioning-3-face ((,class :inherit (bold 
modus-themes-variable-pitch) :foreground ,blue-nuanced-fg)))
+    `(font-latex-sectioning-4-face ((,class :inherit (bold 
modus-themes-variable-pitch) :foreground ,blue-nuanced-fg)))
+    `(font-latex-sectioning-5-face ((,class :inherit 
modus-themes-variable-pitch :foreground ,blue-nuanced-fg)))
+    `(font-latex-sedate-face ((,class :inherit modus-themes-bold :foreground 
,magenta-alt-other)))
+    `(font-latex-slide-title-face ((,class :inherit (bold 
modus-themes-variable-pitch) :foreground ,cyan-nuanced-fg
                                            ,@(modus-themes--scale 
modus-themes-scale-4))))
     `(font-latex-string-face ((,class :inherit font-lock-string-face)))
     `(font-latex-subscript-face ((,class :height 0.95)))
@@ -3277,17 +3428,18 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; auto-dim-other-buffers
     `(auto-dim-other-buffers-face ((,class :background ,bg-alt)))
 ;;;;; avy
-    `(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim)))
-    `(avy-goto-char-timer-face ((,class :inherit (modus-theme-intense-yellow 
bold))))
-    `(avy-lead-face ((,class :inherit (modus-theme-intense-magenta bold))))
-    `(avy-lead-face-0 ((,class :inherit (modus-theme-intense-blue bold))))
-    `(avy-lead-face-1 ((,class :inherit (modus-theme-intense-red bold))))
-    `(avy-lead-face-2 ((,class :inherit (modus-theme-intense-green bold))))
+    `(avy-background-face ((,class :background ,bg-dim :foreground ,fg-dim 
:extend t)))
+    `(avy-goto-char-timer-face ((,class :inherit (modus-themes-intense-yellow 
bold))))
+    `(avy-lead-face ((,class :inherit (modus-themes-intense-magenta bold 
modus-themes-reset-soft))))
+    `(avy-lead-face-0 ((,class :inherit (modus-themes-refine-cyan bold 
modus-themes-reset-soft))))
+    `(avy-lead-face-1 ((,class :inherit (modus-themes-intense-neutral bold 
modus-themes-reset-soft))))
+    `(avy-lead-face-2 ((,class :inherit (modus-themes-refine-red bold 
modus-themes-reset-soft))))
 ;;;;; aw (ace-window)
-    `(aw-background-face ((,class :background ,bg-dim :foreground ,fg-dim)))
-    `(aw-key-face ((,class :inherit bold :foreground ,blue-intense)))
-    `(aw-leading-char-face ((,class :inherit bold :height 1.5 :slant normal 
:background ,bg-main :foreground ,red-intense)))
-    `(aw-minibuffer-leading-char-face ((,class :foreground ,magenta-active)))
+    `(aw-background-face ((,class :foreground ,fg-unfocused)))
+    `(aw-key-face ((,class :inherit modus-themes-key-binding)))
+    `(aw-leading-char-face ((,class :inherit (bold modus-themes-reset-soft) 
:height 1.5
+                                    :foreground ,red-intense)))
+    `(aw-minibuffer-leading-char-face ((,class :inherit 
(modus-themes-intense-red bold))))
     `(aw-mode-line-face ((,class :inherit bold)))
 ;;;;; awesome-tray
     `(awesome-tray-module-awesome-tab-face ((,class :inherit bold :foreground 
,red-alt-other)))
@@ -3307,47 +3459,47 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(bbdb-organization ((,class :foreground ,red-alt-other)))
     `(bbdb-field-name ((,class :foreground ,cyan-alt-other)))
 ;;;;; binder
-    `(binder-sidebar-highlight ((,class :inherit modus-theme-subtle-cyan)))
-    `(binder-sidebar-marked ((,class :inherit modus-theme-mark-sel)))
-    `(binder-sidebar-missing ((,class :inherit modus-theme-subtle-red)))
+    `(binder-sidebar-highlight ((,class :inherit modus-themes-subtle-cyan)))
+    `(binder-sidebar-marked ((,class :inherit modus-themes-mark-sel)))
+    `(binder-sidebar-missing ((,class :inherit modus-themes-subtle-red)))
     `(binder-sidebar-tags ((,class :foreground ,cyan)))
 ;;;;; bm
-    `(bm-face ((,class :inherit modus-theme-subtle-yellow :extend t)))
-    `(bm-fringe-face ((,class :inherit modus-theme-fringe-yellow)))
-    `(bm-fringe-persistent-face ((,class :inherit modus-theme-fringe-blue)))
-    `(bm-persistent-face ((,class :inherit modus-theme-intense-blue :extend 
t)))
+    `(bm-face ((,class :inherit modus-themes-subtle-yellow :extend t)))
+    `(bm-fringe-face ((,class :inherit modus-themes-fringe-yellow)))
+    `(bm-fringe-persistent-face ((,class :inherit modus-themes-fringe-blue)))
+    `(bm-persistent-face ((,class :inherit modus-themes-intense-blue :extend 
t)))
 ;;;;; bongo
-    `(bongo-album-title ((,class :foreground ,yellow-active)))
+    `(bongo-album-title ((,class :foreground ,fg-active)))
     `(bongo-artist ((,class :foreground ,magenta-active)))
     `(bongo-currently-playing-track ((,class :inherit bold)))
-    `(bongo-elapsed-track-part ((,class :inherit modus-theme-subtle-magenta 
:underline t)))
+    `(bongo-elapsed-track-part ((,class :inherit modus-themes-subtle-magenta 
:underline t)))
     `(bongo-filled-seek-bar ((,class :background ,blue-intense-bg :foreground 
,fg-main)))
     `(bongo-marked-track ((,class :foreground ,fg-mark-alt)))
     `(bongo-marked-track-line ((,class :background ,bg-mark-alt)))
     `(bongo-played-track ((,class :foreground ,fg-unfocused :strike-through 
t)))
-    `(bongo-track-length ((,class :foreground ,fg-active)))
-    `(bongo-track-title ((,class :foreground ,cyan-active)))
+    `(bongo-track-length ((,class :foreground ,fg-alt)))
+    `(bongo-track-title ((,class :foreground ,blue-active)))
     `(bongo-unfilled-seek-bar ((,class :background ,bg-special-cold 
:foreground ,fg-main)))
 ;;;;; boon
-    `(boon-modeline-cmd ((,class :inherit modus-theme-active-blue)))
-    `(boon-modeline-ins ((,class :inherit modus-theme-active-red)))
-    `(boon-modeline-off ((,class :inherit modus-theme-active-yellow)))
-    `(boon-modeline-spc ((,class :inherit modus-theme-active-green)))
+    `(boon-modeline-cmd ((,class :inherit modus-themes-active-blue)))
+    `(boon-modeline-ins ((,class :inherit modus-themes-active-red)))
+    `(boon-modeline-off ((,class :inherit modus-themes-active-yellow)))
+    `(boon-modeline-spc ((,class :inherit modus-themes-active-green)))
 ;;;;; breakpoint (built-in gdb-mi.el)
     `(breakpoint-disabled ((,class :inherit shadow)))
     `(breakpoint-enabled ((,class :inherit bold :foreground ,red)))
 ;;;;; buffer-expose
     `(buffer-expose-ace-char-face ((,class :inherit bold :foreground 
,red-active)))
     `(buffer-expose-mode-line-face ((,class :foreground ,cyan-active)))
-    `(buffer-expose-selected-face ((,class :inherit modus-theme-special-mild)))
+    `(buffer-expose-selected-face ((,class :inherit 
modus-themes-special-mild)))
 ;;;;; calendar and diary
-    `(calendar-month-header ((,class :inherit modus-theme-pseudo-header)))
+    `(calendar-month-header ((,class :inherit modus-themes-pseudo-header)))
     `(calendar-today ((,class :inherit bold :underline t)))
-    `(calendar-weekday-header ((,class :inherit shadow)))
-    `(calendar-weekend-header ((,class :inherit shadow)))
-    `(diary ((,class :background ,green-nuanced-bg :foreground 
,green-alt-other)))
+    `(calendar-weekday-header ((,class :foreground ,fg-unfocused)))
+    `(calendar-weekend-header ((,class :foreground ,fg-unfocused)))
+    `(diary ((,class :background ,blue-nuanced-bg :foreground 
,blue-alt-other)))
     `(diary-anniversary ((,class :foreground ,red-alt-other)))
-    `(diary-time ((,class :foreground ,blue-alt)))
+    `(diary-time ((,class :foreground ,cyan)))
     `(holiday ((,class :background ,magenta-nuanced-bg :foreground 
,magenta-alt)))
 ;;;;; calfw
     `(cfw:face-annotation ((,class :foreground ,fg-special-warm)))
@@ -3360,9 +3512,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cfw:face-holiday ((,class :foreground ,magenta-alt-other)))
     `(cfw:face-periods ((,class :foreground ,cyan-alt-other)))
     `(cfw:face-saturday ((,class :inherit bold :foreground ,cyan-alt-other)))
-    `(cfw:face-select ((,class :inherit modus-theme-intense-blue)))
+    `(cfw:face-select ((,class :inherit modus-themes-intense-blue)))
     `(cfw:face-sunday ((,class :inherit bold :foreground ,cyan-alt-other)))
-    `(cfw:face-title ((,class :inherit modus-theme-variable-pitch
+    `(cfw:face-title ((,class :inherit modus-themes-variable-pitch
                               :foreground ,fg-special-cold
                               ,@(modus-themes--scale modus-themes-scale-5))))
     `(cfw:face-today ((,class :background ,bg-inactive)))
@@ -3372,7 +3524,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cfw:face-toolbar-button-on ((,class :inherit bold :background 
,blue-nuanced-bg
                                           :foreground ,blue-alt)))
 ;;;;; centaur-tabs
-    `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-active)))
+    `(centaur-tabs-active-bar-face ((,class :background ,fg-tab-accent)))
     `(centaur-tabs-close-mouse-face ((,class :inherit bold :foreground 
,red-active :underline t)))
     `(centaur-tabs-close-selected ((,class :inherit centaur-tabs-selected)))
     `(centaur-tabs-close-unselected ((,class :inherit 
centaur-tabs-unselected)))
@@ -3403,7 +3555,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; cider
     `(cider-debug-code-overlay-face ((,class :background ,bg-alt)))
     `(cider-debug-prompt-face ((,class :foreground ,magenta-alt :underline t)))
-    `(cider-deprecated-face ((,class :inherit modus-theme-refine-yellow)))
+    `(cider-deprecated-face ((,class :inherit modus-themes-refine-yellow)))
     `(cider-docview-emphasis-face ((,class :inherit italic :foreground 
,fg-special-cold)))
     `(cider-docview-literal-face ((,class :foreground ,blue-alt)))
     `(cider-docview-strong-face ((,class :inherit bold :foreground 
,fg-special-cold)))
@@ -3416,7 +3568,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cider-instrumented-face ((,class :box (:line-width -1 :color ,red :style 
nil) :background ,bg-dim)))
     `(cider-reader-conditional-face ((,class :inherit italic :foreground 
,fg-special-warm)))
     `(cider-repl-input-face ((,class :inherit bold)))
-    `(cider-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+    `(cider-repl-prompt-face ((,class :inherit comint-highlight-prompt)))
     `(cider-repl-stderr-face ((,class :inherit bold :foreground ,red)))
     `(cider-repl-stdout-face ((,class :foreground ,blue)))
     `(cider-result-overlay-face ((,class :box (:line-width -1 :color ,blue 
:style nil) :background ,bg-dim)))
@@ -3430,15 +3582,15 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(cider-stacktrace-promoted-button-face ((,class :box (:line-width 3 
:color ,fg-alt :style released-button) :foreground ,red)))
     `(cider-stacktrace-suppressed-button-face ((,class :box (:line-width 3 
:color ,fg-alt :style pressed-button)
                                                        :background ,bg-alt 
:foreground ,fg-alt)))
-    `(cider-test-error-face ((,class :inherit modus-theme-subtle-red)))
-    `(cider-test-failure-face ((,class :inherit (modus-theme-intense-red 
bold))))
-    `(cider-test-success-face ((,class :inherit modus-theme-intense-green)))
+    `(cider-test-error-face ((,class :inherit modus-themes-subtle-red)))
+    `(cider-test-failure-face ((,class :inherit (modus-themes-intense-red 
bold))))
+    `(cider-test-success-face ((,class :inherit modus-themes-intense-green)))
     `(cider-traced-face ((,class :box (:line-width -1 :color ,cyan :style nil) 
:background ,bg-dim)))
     `(cider-warning-highlight-face ((,class :foreground ,yellow :underline t)))
 ;;;;; circe (and lui)
     `(circe-fool-face ((,class :inherit shadow)))
     `(circe-highlight-nick-face ((,class :inherit bold :foreground ,blue)))
-    `(circe-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+    `(circe-prompt-face ((,class :inherit comint-highlight-prompt)))
     `(circe-server-face ((,class :foreground ,fg-unfocused)))
     `(lui-button-face ((,class :inherit button)))
     `(lui-highlight-face ((,class :foreground ,magenta-alt)))
@@ -3447,8 +3599,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(color-rg-font-lock-column-number ((,class :foreground 
,magenta-alt-other)))
     `(color-rg-font-lock-command ((,class :inherit bold :foreground ,fg-main)))
     `(color-rg-font-lock-file ((,class :inherit bold :foreground 
,fg-special-cold)))
-    `(color-rg-font-lock-flash ((,class :inherit modus-theme-intense-blue)))
-    `(color-rg-font-lock-function-location ((,class :inherit 
modus-theme-special-calm)))
+    `(color-rg-font-lock-flash ((,class :inherit modus-themes-intense-blue)))
+    `(color-rg-font-lock-function-location ((,class :inherit 
modus-themes-special-calm)))
     `(color-rg-font-lock-header-line-directory ((,class :foreground 
,blue-active)))
     `(color-rg-font-lock-header-line-edit-mode ((,class :foreground 
,magenta-active)))
     `(color-rg-font-lock-header-line-keyword ((,class :foreground 
,green-active)))
@@ -3456,42 +3608,42 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(color-rg-font-lock-line-number ((,class :foreground ,fg-special-warm)))
     `(color-rg-font-lock-mark-changed ((,class :inherit bold :foreground 
,blue)))
     `(color-rg-font-lock-mark-deleted ((,class :inherit bold :foreground 
,red)))
-    `(color-rg-font-lock-match ((,class :inherit modus-theme-special-calm)))
+    `(color-rg-font-lock-match ((,class :inherit modus-themes-special-calm)))
     `(color-rg-font-lock-position-splitter ((,class :inherit shadow)))
 ;;;;; column-enforce-mode
-    `(column-enforce-face ((,class :inherit modus-theme-refine-yellow)))
+    `(column-enforce-face ((,class :inherit modus-themes-refine-yellow)))
 ;;;;; company-mode
     `(company-echo-common ((,class :foreground ,magenta-alt-other)))
     `(company-preview ((,class :background ,bg-dim :foreground ,fg-dim)))
     `(company-preview-common ((,class :foreground ,blue-alt)))
-    `(company-preview-search ((,class :inherit modus-theme-special-calm)))
+    `(company-preview-search ((,class :inherit modus-themes-special-calm)))
     `(company-scrollbar-bg ((,class :background ,bg-active)))
     `(company-scrollbar-fg ((,class :background ,fg-active)))
-    `(company-template-field ((,class :inherit modus-theme-intense-magenta)))
+    `(company-template-field ((,class :inherit modus-themes-intense-magenta)))
     `(company-tooltip ((,class :background ,bg-alt :foreground ,fg-alt)))
-    `(company-tooltip-annotation ((,class :inherit modus-theme-slant 
:foreground ,fg-special-cold)))
+    `(company-tooltip-annotation ((,class :inherit modus-themes-slant 
:foreground ,fg-special-cold)))
     `(company-tooltip-annotation-selection ((,class :inherit bold :foreground 
,fg-main)))
     `(company-tooltip-common ((,class :inherit bold :foreground ,blue-alt)))
     `(company-tooltip-common-selection ((,class :foreground ,fg-main)))
-    `(company-tooltip-mouse ((,class :inherit modus-theme-intense-blue)))
-    `(company-tooltip-search ((,class :inherit (modus-theme-refine-cyan 
bold))))
-    `(company-tooltip-search-selection ((,class :inherit 
(modus-theme-intense-green bold) :underline t)))
-    `(company-tooltip-selection ((,class :inherit (modus-theme-subtle-cyan 
bold))))
+    `(company-tooltip-mouse ((,class :inherit modus-themes-intense-blue)))
+    `(company-tooltip-search ((,class :inherit (modus-themes-refine-cyan 
bold))))
+    `(company-tooltip-search-selection ((,class :inherit 
(modus-themes-intense-green bold) :underline t)))
+    `(company-tooltip-selection ((,class :inherit (modus-themes-subtle-cyan 
bold))))
 ;;;;; company-posframe
     `(company-posframe-active-backend-name ((,class :inherit bold :background 
,bg-active :foreground ,blue-active)))
     `(company-posframe-inactive-backend-name ((,class :background ,bg-active 
:foreground ,fg-active)))
     `(company-posframe-metadata ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
 ;;;;; compilation feedback
     `(compilation-column-number ((,class :foreground ,magenta-alt-other)))
-    `(compilation-error ((,class :inherit modus-theme-bold :foreground ,red)))
-    `(compilation-info ((,class :inherit modus-theme-bold :foreground 
,fg-special-cold)))
+    `(compilation-error ((,class :inherit modus-themes-bold :foreground ,red)))
+    `(compilation-info ((,class :inherit modus-themes-bold :foreground 
,fg-special-cold)))
     `(compilation-line-number ((,class :foreground ,fg-special-warm)))
-    `(compilation-mode-line-exit ((,class :inherit modus-theme-bold 
:foreground ,blue-active)))
-    `(compilation-mode-line-fail ((,class :inherit modus-theme-bold 
:foreground ,red-active)))
-    `(compilation-mode-line-run ((,class :inherit modus-theme-bold :foreground 
,magenta-active)))
-    `(compilation-warning ((,class :inherit modus-theme-bold :foreground 
,yellow)))
+    `(compilation-mode-line-exit ((,class :inherit modus-themes-bold 
:foreground ,blue-active)))
+    `(compilation-mode-line-fail ((,class :inherit modus-themes-bold 
:foreground ,red-active)))
+    `(compilation-mode-line-run ((,class :inherit modus-themes-bold 
:foreground ,magenta-active)))
+    `(compilation-warning ((,class :inherit modus-themes-bold :foreground 
,yellow)))
 ;;;;; completions
-    `(completions-annotations ((,class :inherit modus-theme-slant :foreground 
,cyan-faint)))
+    `(completions-annotations ((,class :inherit modus-themes-slant :foreground 
,cyan-faint)))
     `(completions-common-part ((,class ,@(modus-themes--standard-completions
                                           blue-alt blue-nuanced-bg
                                           cyan-refine-bg cyan-refine-fg))))
@@ -3505,17 +3657,22 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(consult-bookmark ((,class :foreground ,blue)))
     `(consult-file ((,class :foreground ,fg-special-cold)))
     `(consult-imenu-prefix ((,class :inherit shadow)))
-    `(consult-key ((,class :inherit modus-themes-bold :foreground 
,magenta-alt-other)))
+    `(consult-key ((,class :inherit modus-themes-key-binding)))
     `(consult-line-number ((,class :foreground ,fg-special-warm)))
     `(consult-line-number-prefix ((,class :foreground ,fg-unfocused)))
     `(consult-narrow-indicator ((,class :foreground ,magenta-alt)))
-    `(consult-preview-cursor ((,class :inherit modus-theme-intense-blue)))
-    `(consult-preview-error ((,class :inherit modus-theme-intense-red)))
+    `(consult-preview-cursor ((,class :inherit modus-themes-intense-blue)))
+    `(consult-preview-error ((,class :inherit modus-themes-intense-red)))
     `(consult-preview-line ((,class :background ,bg-hl-alt-intense)))
+;;;;; corfu
+    `(corfu-background ((,class :background ,bg-alt :foreground ,fg-alt)))
+    `(corfu-current ((,class :inherit bold :background ,cyan-subtle-bg)))
+    `(corfu-bar ((,class :background ,fg-alt :foreground ,fg-alt)))
+    `(corfu-border ((,class :background ,bg-active :foreground ,bg-region)))
 ;;;;; counsel
     `(counsel-active-mode ((,class :foreground ,magenta-alt-other)))
     `(counsel-application-name ((,class :foreground ,red-alt-other)))
-    `(counsel-key-binding ((,class :inherit bold :foreground ,blue-alt-other)))
+    `(counsel-key-binding ((,class :inherit modus-themes-key-binding)))
     `(counsel-outline-1 ((,class :inherit org-level-1)))
     `(counsel-outline-2 ((,class :inherit org-level-2)))
     `(counsel-outline-3 ((,class :inherit org-level-3)))
@@ -3525,7 +3682,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(counsel-outline-7 ((,class :inherit org-level-7)))
     `(counsel-outline-8 ((,class :inherit org-level-8)))
     `(counsel-outline-default ((,class :foreground ,fg-main)))
-    `(counsel-variable-documentation ((,class :inherit modus-theme-slant 
:foreground ,yellow-alt-other)))
+    `(counsel-variable-documentation ((,class :inherit modus-themes-slant 
:foreground ,yellow-alt-other)))
 ;;;;; counsel-css
     `(counsel-css-selector-depth-face-1 ((,class :foreground ,blue)))
     `(counsel-css-selector-depth-face-2 ((,class :foreground ,cyan)))
@@ -3554,9 +3711,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; csv-mode
     `(csv-separator-face ((,class :background ,bg-special-cold :foreground 
,fg-main)))
 ;;;;; ctrlf
-    `(ctrlf-highlight-active ((,class :inherit (modus-theme-intense-green 
bold))))
-    `(ctrlf-highlight-line ((,class :inherit modus-theme-hl-line)))
-    `(ctrlf-highlight-passive ((,class :inherit modus-theme-refine-cyan)))
+    `(ctrlf-highlight-active ((,class :inherit (modus-themes-intense-green 
bold))))
+    `(ctrlf-highlight-line ((,class :inherit modus-themes-hl-line)))
+    `(ctrlf-highlight-passive ((,class :inherit modus-themes-refine-cyan)))
 ;;;;; custom (M-x customize)
     `(custom-button ((,class :box (:line-width 2 :color nil :style 
released-button)
                              :background ,bg-active :foreground ,fg-main)))
@@ -3564,18 +3721,18 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                    :background ,bg-active :foreground 
,fg-active)))
     `(custom-button-pressed ((,class :box (:line-width 2 :color nil :style 
pressed-button)
                                      :background ,bg-active :foreground 
,fg-main)))
-    `(custom-changed ((,class :inherit modus-theme-subtle-cyan)))
+    `(custom-changed ((,class :inherit modus-themes-subtle-cyan)))
     `(custom-comment ((,class :inherit shadow)))
     `(custom-comment-tag ((,class :background ,bg-alt :foreground 
,yellow-alt-other)))
     `(custom-face-tag ((,class :inherit bold :foreground ,blue-intense)))
     `(custom-group-tag ((,class :inherit bold :foreground ,green-intense)))
-    `(custom-group-tag-1 ((,class :inherit modus-theme-special-warm)))
-    `(custom-invalid ((,class :inherit (modus-theme-intense-red bold))))
-    `(custom-modified ((,class :inherit modus-theme-subtle-cyan)))
-    `(custom-rogue ((,class :inherit modus-theme-refine-magenta)))
+    `(custom-group-tag-1 ((,class :inherit modus-themes-special-warm)))
+    `(custom-invalid ((,class :inherit (modus-themes-intense-red bold))))
+    `(custom-modified ((,class :inherit modus-themes-subtle-cyan)))
+    `(custom-rogue ((,class :inherit modus-themes-refine-magenta)))
     `(custom-set ((,class :foreground ,blue-alt)))
     `(custom-state ((,class :foreground ,cyan-alt-other)))
-    `(custom-themed ((,class :inherit modus-theme-subtle-blue)))
+    `(custom-themed ((,class :inherit modus-themes-subtle-blue)))
     `(custom-variable-tag ((,class :inherit bold :foreground ,cyan)))
 ;;;;; dap-mode
     `(dap-mouse-eval-thing-face ((,class :box (:line-width -1 :color 
,blue-active :style nil)
@@ -3587,7 +3744,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(dap-ui-locals-scope-face ((,class :inherit bold :foreground ,magenta 
:underline t)))
     `(dap-ui-locals-variable-face ((,class :inherit bold :foreground ,cyan)))
     `(dap-ui-locals-variable-leaf-face ((,class :inherit italic :foreground 
,cyan-alt-other)))
-    `(dap-ui-marker-face ((,class :inherit modus-theme-subtle-blue)))
+    `(dap-ui-marker-face ((,class :inherit modus-themes-subtle-blue)))
     `(dap-ui-sessions-stack-frame-face ((,class :inherit bold :foreground 
,magenta-alt)))
     `(dap-ui-sessions-terminated-active-face ((,class :inherit bold 
:foreground ,fg-alt)))
     `(dap-ui-sessions-terminated-face ((,class :inherit shadow)))
@@ -3599,7 +3756,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(dashboard-text-banner ((,class :foreground ,fg-dim)))
 ;;;;; deadgrep
     `(deadgrep-filename-face ((,class :inherit bold :foreground 
,fg-special-cold)))
-    `(deadgrep-match-face ((,class :inherit modus-theme-special-calm)))
+    `(deadgrep-match-face ((,class :inherit modus-themes-special-calm)))
     `(deadgrep-meta-face ((,class :inherit shadow)))
     `(deadgrep-regexp-metachar-face ((,class :inherit bold :foreground 
,yellow-intense)))
     `(deadgrep-search-term-face ((,class :inherit bold :foreground 
,green-intense)))
@@ -3620,11 +3777,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(define-word-face-1 ((,class :foreground ,yellow)))
     `(define-word-face-2 ((,class :foreground ,fg-main)))
 ;;;;; deft
-    `(deft-filter-string-error-face ((,class :inherit modus-theme-refine-red)))
+    `(deft-filter-string-error-face ((,class :inherit 
modus-themes-refine-red)))
     `(deft-filter-string-face ((,class :foreground ,green-intense)))
     `(deft-header-face ((,class :inherit bold :foreground ,fg-special-warm)))
     `(deft-separator-face ((,class :inherit shadow)))
-    `(deft-summary-face ((,class :inherit modus-theme-slant :foreground 
,fg-alt)))
+    `(deft-summary-face ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
     `(deft-time-face ((,class :foreground ,fg-special-cold)))
     `(deft-title-face ((,class :inherit bold :foreground ,fg-main)))
 ;;;;; dictionary
@@ -3633,34 +3790,34 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(dictionary-word-definition-face (()))
     `(dictionary-word-entry-face ((,class :inherit font-lock-comment-face)))
 ;;;;; diff-hl
-    `(diff-hl-change ((,class :inherit modus-theme-fringe-yellow)))
-    `(diff-hl-delete ((,class :inherit modus-theme-fringe-red)))
+    `(diff-hl-change ((,class :inherit modus-themes-fringe-yellow)))
+    `(diff-hl-delete ((,class :inherit modus-themes-fringe-red)))
     `(diff-hl-dired-change ((,class :inherit diff-hl-change)))
     `(diff-hl-dired-delete ((,class :inherit diff-hl-delete)))
     `(diff-hl-dired-ignored ((,class :inherit dired-ignored)))
     `(diff-hl-dired-insert ((,class :inherit diff-hl-insert)))
     `(diff-hl-dired-unknown ((,class :inherit dired-ignored)))
-    `(diff-hl-insert ((,class :inherit modus-theme-fringe-green)))
-    `(diff-hl-reverted-hunk-highlight ((,class :inherit 
(modus-theme-active-magenta bold))))
+    `(diff-hl-insert ((,class :inherit modus-themes-fringe-green)))
+    `(diff-hl-reverted-hunk-highlight ((,class :inherit 
(modus-themes-active-magenta bold))))
 ;;;;; diff-mode
-    `(diff-added ((,class :inherit modus-theme-diff-added)))
-    `(diff-changed ((,class :inherit modus-theme-diff-changed :extend t)))
+    `(diff-added ((,class :inherit modus-themes-diff-added)))
+    `(diff-changed ((,class :inherit modus-themes-diff-changed :extend t)))
     `(diff-context ((,class ,@(modus-themes--diff-text fg-main fg-unfocused))))
-    `(diff-error ((,class :inherit modus-theme-intense-red)))
+    `(diff-error ((,class :inherit modus-themes-intense-red)))
     `(diff-file-header ((,class :inherit (bold diff-header))))
-    `(diff-function ((,class :inherit modus-theme-diff-heading)))
+    `(diff-function ((,class :inherit modus-themes-diff-heading)))
     `(diff-header ((,class ,@(modus-themes--diff-text cyan-faint fg-main))))
-    `(diff-hunk-header ((,class :inherit (bold modus-theme-diff-heading))))
+    `(diff-hunk-header ((,class :inherit (bold modus-themes-diff-heading))))
     `(diff-index ((,class :inherit bold :foreground ,blue-alt)))
     `(diff-indicator-added ((,class :inherit (diff-added bold)
                                     :foreground ,@(modus-themes--diff-deuteran 
blue green))))
     `(diff-indicator-changed ((,class :inherit (diff-changed bold) :foreground 
,yellow)))
     `(diff-indicator-removed ((,class :inherit (diff-removed bold) :foreground 
,red)))
-    `(diff-nonexistent ((,class :inherit (modus-theme-neutral bold))))
-    `(diff-refine-added ((,class :inherit modus-theme-diff-refine-added)))
-    `(diff-refine-changed ((,class :inherit modus-theme-diff-refine-changed)))
-    `(diff-refine-removed ((,class :inherit modus-theme-diff-refine-removed)))
-    `(diff-removed ((,class :inherit modus-theme-diff-removed)))
+    `(diff-nonexistent ((,class :inherit (modus-themes-neutral bold))))
+    `(diff-refine-added ((,class :inherit modus-themes-diff-refine-added)))
+    `(diff-refine-changed ((,class :inherit modus-themes-diff-refine-changed)))
+    `(diff-refine-removed ((,class :inherit modus-themes-diff-refine-removed)))
+    `(diff-removed ((,class :inherit modus-themes-diff-removed)))
 ;;;;; dim-autoload
     `(dim-autoload-cookie-line ((,class :inherit font-lock-comment-face)))
 ;;;;; dir-treeview
@@ -3680,7 +3837,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(dir-treeview-image-icon-face ((,class :inherit 
dir-treeview-default-icon-face :foreground ,green-alt)))
     `(dir-treeview-indent-face ((,class :inherit shadow)))
     `(dir-treeview-label-mouse-face ((,class :inherit highlight)))
-    `(dir-treeview-start-dir-face ((,class :inherit 
modus-theme-pseudo-header)))
+    `(dir-treeview-start-dir-face ((,class :inherit 
modus-themes-pseudo-header)))
     `(dir-treeview-symlink-face ((,class :inherit button
                                          ,@(modus-themes--link-color
                                             cyan cyan-faint))))
@@ -3689,27 +3846,27 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; dired
     `(dired-broken-symlink ((,class :inherit button :foreground ,red)))
     `(dired-directory ((,class :foreground ,blue)))
-    `(dired-flagged ((,class :inherit modus-theme-mark-del)))
-    `(dired-header ((,class :inherit modus-theme-pseudo-header)))
+    `(dired-flagged ((,class :inherit modus-themes-mark-del)))
+    `(dired-header ((,class :inherit modus-themes-pseudo-header)))
     `(dired-ignored ((,class :inherit shadow)))
-    `(dired-mark ((,class :inherit modus-theme-mark-symbol)))
-    `(dired-marked ((,class :inherit modus-theme-mark-sel)))
+    `(dired-mark ((,class :inherit modus-themes-mark-symbol)))
+    `(dired-marked ((,class :inherit modus-themes-mark-sel)))
     `(dired-perm-write ((,class :foreground ,fg-special-warm)))
     `(dired-symlink ((,class :inherit button
                              ,@(modus-themes--link-color
                                 cyan-alt cyan-alt-faint))))
     `(dired-warning ((,class :inherit bold :foreground ,yellow)))
 ;;;;; dired-async
-    `(dired-async-failures ((,class :inherit modus-theme-bold :foreground 
,red-active)))
-    `(dired-async-message ((,class :inherit modus-theme-bold :foreground 
,green-active)))
-    `(dired-async-mode-message ((,class :inherit modus-theme-bold :foreground 
,cyan-active)))
+    `(dired-async-failures ((,class :inherit bold :foreground ,red-active)))
+    `(dired-async-message ((,class :inherit bold :foreground ,blue-active)))
+    `(dired-async-mode-message ((,class :inherit bold :foreground 
,cyan-active)))
 ;;;;; dired-git
     `(dired-git-branch-else ((,class :inherit bold :foreground ,magenta-alt)))
     `(dired-git-branch-master ((,class :inherit bold :foreground 
,magenta-alt-other)))
 ;;;;; dired-git-info
     `(dgi-commit-message-face ((,class :foreground ,fg-special-mild)))
 ;;;;; dired-narrow
-    `(dired-narrow-blink ((,class :inherit (modus-theme-subtle-cyan bold))))
+    `(dired-narrow-blink ((,class :inherit (modus-themes-subtle-cyan bold))))
 ;;;;; dired-subtree
     ;; remove backgrounds from dired-subtree faces, else they break
     ;; dired-{flagged,marked} and any other face that sets a background
@@ -3727,21 +3884,21 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(diredc-face-chmod-font-lock-read ((,class :foreground ,fg-main)))
     `(diredc-face-chmod-font-lock-write ((,class :foreground ,cyan)))
 ;;;;; diredfl
-    `(diredfl-autofile-name ((,class :inherit modus-theme-special-cold)))
+    `(diredfl-autofile-name ((,class :inherit modus-themes-special-cold)))
     `(diredfl-compressed-file-name ((,class :foreground ,fg-special-warm)))
     `(diredfl-compressed-file-suffix ((,class :foreground ,red-alt)))
     `(diredfl-date-time ((,class :foreground ,cyan-alt-other)))
-    `(diredfl-deletion ((,class :inherit modus-theme-mark-del)))
-    `(diredfl-deletion-file-name ((,class :inherit modus-theme-mark-del)))
-    `(diredfl-dir-heading ((,class :inherit modus-theme-pseudo-header)))
+    `(diredfl-deletion ((,class :inherit modus-themes-mark-del)))
+    `(diredfl-deletion-file-name ((,class :inherit modus-themes-mark-del)))
+    `(diredfl-dir-heading ((,class :inherit modus-themes-pseudo-header)))
     `(diredfl-dir-name ((,class :inherit dired-directory)))
     `(diredfl-dir-priv ((,class :foreground ,blue-alt)))
     `(diredfl-exec-priv ((,class :foreground ,magenta)))
     `(diredfl-executable-tag ((,class :foreground ,magenta-alt)))
     `(diredfl-file-name ((,class :foreground ,fg-main)))
     `(diredfl-file-suffix ((,class :foreground ,cyan)))
-    `(diredfl-flag-mark ((,class :inherit modus-theme-mark-sel)))
-    `(diredfl-flag-mark-line ((,class :inherit modus-theme-mark-sel)))
+    `(diredfl-flag-mark ((,class :inherit modus-themes-mark-sel)))
+    `(diredfl-flag-mark-line ((,class :inherit modus-themes-mark-sel)))
     `(diredfl-ignored-file-name ((,class :inherit shadow)))
     `(diredfl-link-priv ((,class :foreground ,blue-alt-other)))
     `(diredfl-no-priv ((,class :inherit shadow)))
@@ -3750,24 +3907,24 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(diredfl-rare-priv ((,class :foreground ,red-alt)))
     `(diredfl-read-priv ((,class :foreground ,fg-main)))
     `(diredfl-symlink ((,class :inherit dired-symlink)))
-    `(diredfl-tagged-autofile-name ((,class :inherit 
modus-theme-refine-magenta)))
+    `(diredfl-tagged-autofile-name ((,class :inherit 
modus-themes-refine-magenta)))
     `(diredfl-write-priv ((,class :foreground ,cyan)))
 ;;;;; dired+
-    `(diredp-autofile-name ((,class :inherit modus-theme-special-cold)))
+    `(diredp-autofile-name ((,class :inherit modus-themes-special-cold)))
     `(diredp-compressed-file-name ((,class :foreground ,fg-special-warm)))
     `(diredp-compressed-file-suffix ((,class :foreground ,red-alt)))
     `(diredp-date-time ((,class :foreground ,cyan-alt-other)))
-    `(diredp-deletion ((,class :inherit modus-theme-mark-del)))
-    `(diredp-deletion-file-name ((,class :inherit modus-theme-mark-del)))
-    `(diredp-dir-heading ((,class :inherit modus-theme-pseudo-header)))
+    `(diredp-deletion ((,class :inherit modus-themes-mark-del)))
+    `(diredp-deletion-file-name ((,class :inherit modus-themes-mark-del)))
+    `(diredp-dir-heading ((,class :inherit modus-themes-pseudo-header)))
     `(diredp-dir-name ((,class :inherit dired-directory)))
     `(diredp-dir-priv ((,class :foreground ,blue-alt)))
     `(diredp-exec-priv ((,class :foreground ,magenta)))
     `(diredp-executable-tag ((,class :foreground ,magenta-alt)))
     `(diredp-file-name ((,class :foreground ,fg-main)))
     `(diredp-file-suffix ((,class :foreground ,cyan)))
-    `(diredp-flag-mark ((,class :inherit modus-theme-mark-sel)))
-    `(diredp-flag-mark-line ((,class :inherit modus-theme-mark-sel)))
+    `(diredp-flag-mark ((,class :inherit modus-themes-mark-sel)))
+    `(diredp-flag-mark-line ((,class :inherit modus-themes-mark-sel)))
     `(diredp-ignored-file-name ((,class :inherit shadow)))
     `(diredp-link-priv ((,class :foreground ,blue-alt-other)))
     `(diredp-mode-line-flagged ((,class :foreground ,red-active)))
@@ -3779,7 +3936,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(diredp-rare-priv ((,class :foreground ,red-alt)))
     `(diredp-read-priv ((,class :foreground ,fg-main)))
     `(diredp-symlink ((,class :inherit dired-symlink)))
-    `(diredp-tagged-autofile-name ((,class :inherit 
modus-theme-refine-magenta)))
+    `(diredp-tagged-autofile-name ((,class :inherit 
modus-themes-refine-magenta)))
     `(diredp-write-priv ((,class :foreground ,cyan)))
 ;;;;; disk-usage
     `(disk-usage-children ((,class :foreground ,yellow)))
@@ -3791,7 +3948,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; display-fill-column-indicator-mode
     `(fill-column-indicator ((,class :foreground ,bg-active)))
 ;;;;; doom-modeline
-    `(doom-modeline-bar ((,class :inherit modus-theme-active-blue)))
+    `(doom-modeline-bar ((,class :inherit modus-themes-active-blue)))
     `(doom-modeline-bar-inactive ((,class :background ,fg-inactive :foreground 
,bg-main)))
     `(doom-modeline-battery-charging ((,class :foreground ,green-active)))
     `(doom-modeline-battery-critical ((,class :inherit bold :foreground 
,red-active)))
@@ -3820,7 +3977,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(doom-modeline-lsp-error ((,class :inherit bold :foreground ,red-active)))
     `(doom-modeline-lsp-success ((,class :inherit bold :foreground 
,green-active)))
     `(doom-modeline-lsp-warning ((,class :inherit bold :foreground 
,yellow-active)))
-    `(doom-modeline-panel ((,class :inherit modus-theme-active-blue)))
+    `(doom-modeline-panel ((,class :inherit modus-themes-active-blue)))
     `(doom-modeline-persp-buffer-not-in-persp ((,class :inherit italic 
:foreground ,yellow-active)))
     `(doom-modeline-persp-name ((,class :foreground ,fg-active)))
     `(doom-modeline-project-dir ((,class :inherit bold :foreground 
,blue-active)))
@@ -3830,13 +3987,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(doom-modeline-urgent ((,class :inherit bold :foreground ,red-active)))
     `(doom-modeline-warning ((,class :inherit bold :foreground 
,yellow-active)))
 ;;;;; dynamic-ruler
-    `(dynamic-ruler-negative-face ((,class :inherit 
modus-theme-intense-neutral)))
-    `(dynamic-ruler-positive-face ((,class :inherit 
modus-theme-intense-yellow)))
+    `(dynamic-ruler-negative-face ((,class :inherit 
modus-themes-intense-neutral)))
+    `(dynamic-ruler-positive-face ((,class :inherit 
modus-themes-intense-yellow)))
 ;;;;; easy-jekyll
     `(easy-jekyll-help-face ((,class :background ,bg-dim :foreground 
,cyan-alt-other)))
 ;;;;; easy-kill
-    `(easy-kill-origin ((,class :inherit modus-theme-subtle-red)))
-    `(easy-kill-selection ((,class :inherit modus-theme-subtle-yellow)))
+    `(easy-kill-origin ((,class :inherit modus-themes-subtle-red)))
+    `(easy-kill-selection ((,class :inherit modus-themes-subtle-yellow)))
 ;;;;; ebdb
     `(ebdb-address-default ((,class :foreground ,fg-special-calm)))
     `(ebdb-defunct ((,class :inherit shadow)))
@@ -3850,46 +4007,32 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ebdb-phone-default ((,class :foreground ,cyan)))
     `(eieio-custom-slot-tag-face ((,class :foreground ,red-alt)))
 ;;;;; ediff
-    ;; NOTE: here we break from the pattern of inheriting from the
-    ;; modus-theme-diff-* faces.
-    `(ediff-current-diff-A ((,class ,@(modus-themes--diff
-                                       bg-dim red
-                                       bg-diff-removed fg-diff-removed
-                                       red-nuanced-bg red-faint))))
+    `(ediff-current-diff-A ((,class :inherit modus-themes-diff-removed)))
     `(ediff-current-diff-Ancestor ((,class ,@(modus-themes--diff
-                                              bg-dim fg-special-cold
+                                              bg-alt fg-special-cold
                                               bg-special-cold fg-special-cold
                                               blue-nuanced-bg blue))))
-    `(ediff-current-diff-B ((,class ,@(modus-themes--diff
-                                       bg-dim green
-                                       bg-diff-added fg-diff-added
-                                       green-nuanced-bg green-faint
-                                       bg-diff-added-deuteran 
fg-diff-added-deuteran))))
-    `(ediff-current-diff-C ((,class ,@(modus-themes--diff
-                                       bg-dim yellow
-                                       bg-diff-changed fg-diff-changed
-                                       yellow-nuanced-bg yellow-faint))))
-    `(ediff-even-diff-A ((,class :background ,bg-diff-neutral-1 :foreground 
,fg-diff-neutral-1)))
-    `(ediff-even-diff-Ancestor ((,class :background ,bg-diff-neutral-2 
:foreground ,fg-diff-neutral-1)))
-    `(ediff-even-diff-B ((,class :background ,bg-diff-neutral-1 :foreground 
,fg-diff-neutral-1)))
-    `(ediff-even-diff-C ((,class :background ,bg-diff-neutral-2 :foreground 
,fg-diff-neutral-2)))
-    `(ediff-fine-diff-A ((,class :background ,bg-diff-focus-removed 
:foreground ,fg-diff-focus-removed)))
-    `(ediff-fine-diff-Ancestor ((,class :inherit modus-theme-refine-cyan)))
-    `(ediff-fine-diff-B
-      ((,class :background ,@(modus-themes--diff-deuteran 
bg-diff-focus-added-deuteran bg-diff-focus-added)
-               :foreground ,@(modus-themes--diff-deuteran 
fg-diff-focus-added-deuteran fg-diff-focus-added))))
-    `(ediff-fine-diff-C ((,class :background ,bg-diff-focus-changed 
:foreground ,fg-diff-focus-changed)))
-    `(ediff-odd-diff-A ((,class :background ,bg-diff-neutral-2 :foreground 
,fg-diff-neutral-2)))
-    `(ediff-odd-diff-Ancestor ((,class :background ,bg-diff-neutral-0 
:foreground ,fg-diff-neutral-0)))
-    `(ediff-odd-diff-B ((,class :background ,bg-diff-neutral-2 :foreground 
,fg-diff-neutral-2)))
-    `(ediff-odd-diff-C ((,class :background ,bg-diff-neutral-1 :foreground 
,fg-diff-neutral-1)))
+    `(ediff-current-diff-B ((,class :inherit modus-themes-diff-added)))
+    `(ediff-current-diff-C ((,class :inherit modus-themes-diff-changed)))
+    `(ediff-even-diff-A ((,class :background ,bg-alt)))
+    `(ediff-even-diff-Ancestor ((,class :background ,bg-alt)))
+    `(ediff-even-diff-B ((,class :background ,bg-alt)))
+    `(ediff-even-diff-C ((,class :background ,bg-alt)))
+    `(ediff-fine-diff-A ((,class :inherit modus-themes-diff-refine-removed)))
+    `(ediff-fine-diff-Ancestor ((,class :inherit modus-themes-refine-cyan)))
+    `(ediff-fine-diff-B ((,class :inherit modus-themes-diff-refine-added)))
+    `(ediff-fine-diff-C ((,class :inherit modus-themes-diff-refine-changed)))
+    `(ediff-odd-diff-A ((,class :inherit ediff-even-diff-A)))
+    `(ediff-odd-diff-Ancestor ((,class :inherit ediff-even-diff-Ancestor)))
+    `(ediff-odd-diff-B ((,class :inherit ediff-even-diff-B)))
+    `(ediff-odd-diff-C ((,class :inherit ediff-even-diff-C)))
 ;;;;; eglot
-    `(eglot-mode-line ((,class :inherit modus-theme-bold :foreground 
,magenta-active)))
+    `(eglot-mode-line ((,class :inherit modus-themes-bold :foreground 
,magenta-active)))
 ;;;;; el-search
     `(el-search-highlight-in-prompt-face ((,class :inherit bold :foreground 
,magenta-alt)))
-    `(el-search-match ((,class :inherit modus-theme-intense-green)))
-    `(el-search-other-match ((,class :inherit modus-theme-special-mild)))
-    `(el-search-occur-match ((,class :inherit modus-theme-special-calm)))
+    `(el-search-match ((,class :inherit modus-themes-intense-green)))
+    `(el-search-other-match ((,class :inherit modus-themes-special-mild)))
+    `(el-search-occur-match ((,class :inherit modus-themes-special-calm)))
 ;;;;; eldoc
     ;; NOTE: see https://github.com/purcell/package-lint/issues/187
     (list 'eldoc-highlight-function-argument `((,class :inherit bold 
:foreground ,blue-alt-other)))
@@ -3916,17 +4059,19 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(elfeed-score-error-level-face ((,class :foreground ,red)))
     `(elfeed-score-info-level-face ((,class :foreground ,cyan)))
     `(elfeed-score-warn-level-face ((,class :foreground ,yellow)))
+;;;;; embark
+    `(embark-keybinding ((,class :inherit modus-themes-key-binding)))
 ;;;;; emms
     `(emms-playlist-track-face ((,class :foreground ,blue)))
     `(emms-playlist-selected-face ((,class :inherit bold :foreground 
,magenta)))
-;;;;; enhanced-ruby-mode
-    `(enh-ruby-heredoc-delimiter-face ((,class :foreground ,blue-alt-other)))
+;;;;; enh-ruby-mode (enhanced-ruby-mode)
+    `(enh-ruby-heredoc-delimiter-face ((,class :inherit 
font-lock-constant-face)))
     `(enh-ruby-op-face ((,class :foreground ,fg-main)))
-    `(enh-ruby-regexp-delimiter-face ((,class :foreground ,green)))
-    `(enh-ruby-regexp-face ((,class :foreground ,magenta)))
-    `(enh-ruby-string-delimiter-face ((,class :foreground ,blue-alt)))
-    `(erm-syn-errline ((,class :foreground ,red :underline t)))
-    `(erm-syn-warnline ((,class :foreground ,yellow :underline t)))
+    `(enh-ruby-regexp-delimiter-face ((,class :inherit 
font-lock-regexp-grouping-construct)))
+    `(enh-ruby-regexp-face ((,class :inherit font-lock-string-face)))
+    `(enh-ruby-string-delimiter-face ((,class :inherit font-lock-string-face)))
+    `(erm-syn-errline ((,class :inherit modus-themes-lang-error)))
+    `(erm-syn-warnline ((,class :inherit modus-themes-lang-warning)))
 ;;;;; epa
     `(epa-field-body ((,class :foreground ,fg-main)))
     `(epa-field-name ((,class :inherit bold :foreground ,fg-dim)))
@@ -3951,7 +4096,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(erc-button ((,class :inherit button)))
     `(erc-command-indicator-face ((,class :inherit bold :foreground 
,cyan-alt)))
     `(erc-current-nick-face ((,class :foreground ,magenta-alt-other)))
-    `(erc-dangerous-host-face ((,class :inherit modus-theme-intense-red)))
+    `(erc-dangerous-host-face ((,class :inherit modus-themes-intense-red)))
     `(erc-direct-msg-face ((,class :foreground ,magenta)))
     `(erc-error-face ((,class :inherit bold :foreground ,red)))
     `(erc-fool-face ((,class :foreground ,fg-inactive)))
@@ -3966,7 +4111,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(erc-nick-prefix-face ((,class :inherit erc-nick-default-face)))
     `(erc-notice-face ((,class :foreground ,fg-unfocused)))
     `(erc-pal-face ((,class :inherit bold :foreground ,red-alt)))
-    `(erc-prompt-face ((,class :inherit bold :foreground ,cyan-alt-other)))
+    `(erc-prompt-face ((,class :inherit comint-highlight-prompt)))
     `(erc-timestamp-face ((,class :foreground ,blue-nuanced-fg)))
     `(erc-underline-face ((,class :underline t)))
     `(bg:erc-color-face0 ((,class :background "white")))
@@ -4005,15 +4150,15 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(eros-result-overlay-face ((,class :box (:line-width -1 :color ,blue)
                                         :background ,bg-dim :foreground 
,fg-dim)))
 ;;;;; ert
-    `(ert-test-result-expected ((,class :inherit modus-theme-intense-green)))
-    `(ert-test-result-unexpected ((,class :inherit modus-theme-intense-red)))
+    `(ert-test-result-expected ((,class :inherit modus-themes-intense-green)))
+    `(ert-test-result-unexpected ((,class :inherit modus-themes-intense-red)))
 ;;;;; eshell
     `(eshell-ls-archive ((,class :inherit bold :foreground ,cyan-alt)))
     `(eshell-ls-backup ((,class :foreground ,yellow-alt)))
     `(eshell-ls-clutter ((,class :foreground ,red-alt)))
     `(eshell-ls-directory ((,class :inherit bold :foreground ,blue-alt)))
     `(eshell-ls-executable ((,class :foreground ,magenta-alt)))
-    `(eshell-ls-missing ((,class :inherit modus-theme-intense-red)))
+    `(eshell-ls-missing ((,class :inherit modus-themes-intense-red)))
     `(eshell-ls-product ((,class :foreground ,fg-special-warm)))
     `(eshell-ls-readonly ((,class :foreground ,fg-special-cold)))
     `(eshell-ls-special ((,class :inherit bold :foreground ,magenta)))
@@ -4021,7 +4166,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                  ,@(modus-themes--link-color
                                     cyan cyan-faint))))
     `(eshell-ls-unreadable ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
-    `(eshell-prompt ((,class :inherit modus-theme-bold
+    `(eshell-prompt ((,class :inherit modus-themes-bold
                              ,@(modus-themes--prompt
                                 green-alt-other
                                 green-nuanced-bg green-alt
@@ -4043,16 +4188,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(eshell-git-prompt-robyrussell-git-dirty-face ((,class :foreground 
,yellow)))
     `(eshell-git-prompt-robyrussell-git-face ((,class :foreground ,blue)))
 ;;;;; eshell-prompt-extras (epe)
-    `(epe-dir-face ((,class :inherit modus-theme-bold :foreground ,blue)))
+    `(epe-dir-face ((,class :inherit modus-themes-bold :foreground ,blue)))
     `(epe-git-dir-face ((,class :foreground ,red-alt-other)))
     `(epe-git-face ((,class :foreground ,cyan-alt)))
     `(epe-pipeline-delimiter-face ((,class :foreground ,green-alt)))
     `(epe-pipeline-host-face ((,class :foreground ,blue)))
     `(epe-pipeline-time-face ((,class :foreground ,fg-special-warm)))
     `(epe-pipeline-user-face ((,class :foreground ,magenta)))
-    `(epe-remote-face ((,class :inherit modus-theme-slant :foreground 
,fg-alt)))
+    `(epe-remote-face ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
     `(epe-status-face ((,class :foreground ,magenta-alt-other)))
-    `(epe-venv-face ((,class :inherit modus-theme-slant :foreground ,fg-alt)))
+    `(epe-venv-face ((,class :inherit modus-themes-slant :foreground ,fg-alt)))
 ;;;;; eshell-syntax-highlighting
     `(eshell-syntax-highlighting-alias-face ((,class :foreground ,cyan)))
     `(eshell-syntax-highlighting-comment-face ((,class :inherit shadow)))
@@ -4065,103 +4210,104 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; evil-mode
     `(evil-ex-commands ((,class :foreground ,magenta-alt-other)))
     `(evil-ex-info ((,class :foreground ,cyan-alt-other)))
-    `(evil-ex-lazy-highlight ((,class :inherit modus-theme-refine-cyan)))
-    `(evil-ex-search ((,class :inherit modus-theme-intense-green)))
-    `(evil-ex-substitute-matches ((,class :inherit modus-theme-refine-yellow 
:underline t)))
-    `(evil-ex-substitute-replacement ((,class :inherit 
(modus-theme-intense-green bold))))
+    `(evil-ex-lazy-highlight ((,class :inherit modus-themes-refine-cyan)))
+    `(evil-ex-search ((,class :inherit modus-themes-intense-green)))
+    `(evil-ex-substitute-matches ((,class :inherit modus-themes-refine-yellow 
:underline t)))
+    `(evil-ex-substitute-replacement ((,class :inherit 
(modus-themes-intense-green bold))))
 ;;;;; evil-goggles
-    `(evil-goggles-change-face ((,class :inherit modus-theme-refine-yellow)))
-    `(evil-goggles-commentary-face ((,class :inherit 
(modus-theme-subtle-neutral modus-theme-slant))))
-    `(evil-goggles-default-face ((,class :inherit modus-theme-subtle-neutral)))
-    `(evil-goggles-delete-face ((,class :inherit modus-theme-refine-red)))
+    `(evil-goggles-change-face ((,class :inherit modus-themes-refine-yellow)))
+    `(evil-goggles-commentary-face ((,class :inherit 
(modus-themes-subtle-neutral modus-themes-slant))))
+    `(evil-goggles-default-face ((,class :inherit 
modus-themes-subtle-neutral)))
+    `(evil-goggles-delete-face ((,class :inherit modus-themes-refine-red)))
     `(evil-goggles-fill-and-move-face ((,class :inherit 
evil-goggles-default-face)))
     `(evil-goggles-indent-face ((,class :inherit evil-goggles-default-face)))
-    `(evil-goggles-join-face ((,class :inherit modus-theme-subtle-green)))
+    `(evil-goggles-join-face ((,class :inherit modus-themes-subtle-green)))
     `(evil-goggles-nerd-commenter-face ((,class :inherit 
evil-goggles-commentary-face)))
-    `(evil-goggles-paste-face ((,class :inherit modus-theme-subtle-cyan)))
-    `(evil-goggles-record-macro-face ((,class :inherit 
modus-theme-special-cold)))
-    `(evil-goggles-replace-with-register-face ((,class :inherit 
modus-theme-refine-magenta)))
-    `(evil-goggles-set-marker-face ((,class :inherit 
modus-theme-intense-magenta)))
+    `(evil-goggles-paste-face ((,class :inherit modus-themes-subtle-cyan)))
+    `(evil-goggles-record-macro-face ((,class :inherit 
modus-themes-special-cold)))
+    `(evil-goggles-replace-with-register-face ((,class :inherit 
modus-themes-refine-magenta)))
+    `(evil-goggles-set-marker-face ((,class :inherit 
modus-themes-intense-magenta)))
     `(evil-goggles-shift-face ((,class :inherit evil-goggles-default-face)))
     `(evil-goggles-surround-face ((,class :inherit evil-goggles-default-face)))
-    `(evil-goggles-yank-face ((,class :inherit modus-theme-subtle-blue)))
+    `(evil-goggles-yank-face ((,class :inherit modus-themes-subtle-blue)))
 ;;;;; evil-snipe
-    `(evil-snipe-first-match-face ((,class :inherit (bold 
modus-theme-intense-blue))))
-    `(evil-snipe-matches-face ((,class :inherit modus-theme-refine-magenta)))
+    `(evil-snipe-first-match-face ((,class :inherit (bold 
modus-themes-intense-blue))))
+    `(evil-snipe-matches-face ((,class :inherit modus-themes-refine-magenta)))
 ;;;;; evil-visual-mark-mode
-    `(evil-visual-mark-face ((,class :inherit modus-theme-intense-magenta)))
+    `(evil-visual-mark-face ((,class :inherit modus-themes-intense-magenta)))
 ;;;;; eww
-    `(eww-invalid-certificate ((,class :foreground ,red-active)))
-    `(eww-valid-certificate ((,class :foreground ,green-active)))
-    `(eww-form-checkbox ((,class :box (:line-width 1 :color ,fg-inactive 
:style released-button) :background ,bg-inactive :foreground ,fg-main)))
-    `(eww-form-file ((,class :box (:line-width 1 :color ,fg-inactive :style 
released-button) :background ,bg-active :foreground ,fg-main)))
-    `(eww-form-select ((,class :inherit eww-form-checkbox)))
-    `(eww-form-submit ((,class :inherit eww-form-file)))
-    `(eww-form-text ((,class :box (:line-width 1 :color ,fg-inactive :style 
none) :background ,bg-active :foreground ,fg-active)))
-    `(eww-form-textarea ((,class :background ,bg-alt :foreground ,fg-main)))
+    `(eww-invalid-certificate ((,class :foreground ,red-faint)))
+    `(eww-valid-certificate ((,class :foreground ,blue-faint)))
+    `(eww-form-checkbox ((,class :inherit eww-form-text)))
+    `(eww-form-file ((,class :inherit eww-form-submit)))
+    `(eww-form-select ((,class :inherit eww-form-submit)))
+    `(eww-form-submit ((,class :box (:line-width 2 :style released-button)
+                               :background ,bg-active)))
+    `(eww-form-text ((,class :box ,bg-active :background ,bg-alt)))
+    `(eww-form-textarea ((,class :background ,bg-alt)))
 ;;;;; eyebrowse
     `(eyebrowse-mode-line-active ((,class :inherit bold :foreground 
,blue-active)))
 ;;;;; fancy-dabbrev
     `(fancy-dabbrev-menu-face ((,class :background ,bg-alt :foreground 
,fg-alt)))
     `(fancy-dabbrev-preview-face ((,class :inherit shadow :underline t)))
-    `(fancy-dabbrev-selection-face ((,class :inherit (modus-theme-intense-cyan 
bold))))
+    `(fancy-dabbrev-selection-face ((,class :inherit 
(modus-themes-intense-cyan bold))))
 ;;;;; flycheck
-    `(flycheck-error ((,class :inherit modus-theme-lang-error)))
+    `(flycheck-error ((,class :inherit modus-themes-lang-error)))
     `(flycheck-error-list-checker-name ((,class :foreground ,magenta-active)))
     `(flycheck-error-list-column-number ((,class :foreground 
,fg-special-cold)))
-    `(flycheck-error-list-error ((,class :inherit modus-theme-bold :foreground 
,red)))
+    `(flycheck-error-list-error ((,class :inherit modus-themes-bold 
:foreground ,red)))
     `(flycheck-error-list-filename ((,class :foreground ,blue)))
-    `(flycheck-error-list-highlight ((,class :inherit modus-theme-hl-line)))
+    `(flycheck-error-list-highlight ((,class :inherit modus-themes-hl-line)))
     `(flycheck-error-list-id ((,class :foreground ,magenta-alt-other)))
     `(flycheck-error-list-id-with-explainer ((,class :inherit 
flycheck-error-list-id :box t)))
     `(flycheck-error-list-info ((,class :foreground ,cyan)))
     `(flycheck-error-list-line-number ((,class :foreground ,fg-special-warm)))
     `(flycheck-error-list-warning ((,class :foreground ,yellow)))
-    `(flycheck-fringe-error ((,class :inherit modus-theme-fringe-red)))
-    `(flycheck-fringe-info ((,class :inherit modus-theme-fringe-cyan)))
-    `(flycheck-fringe-warning ((,class :inherit modus-theme-fringe-yellow)))
-    `(flycheck-info ((,class :inherit modus-theme-lang-note)))
+    `(flycheck-fringe-error ((,class :inherit modus-themes-fringe-red)))
+    `(flycheck-fringe-info ((,class :inherit modus-themes-fringe-cyan)))
+    `(flycheck-fringe-warning ((,class :inherit modus-themes-fringe-yellow)))
+    `(flycheck-info ((,class :inherit modus-themes-lang-note)))
     `(flycheck-verify-select-checker ((,class :box (:line-width 1 :color nil 
:style released-button))))
-    `(flycheck-warning ((,class :inherit modus-theme-lang-warning)))
+    `(flycheck-warning ((,class :inherit modus-themes-lang-warning)))
 ;;;;; flycheck-color-mode-line
     `(flycheck-color-mode-line-error-face ((,class :inherit 
flycheck-fringe-error)))
     `(flycheck-color-mode-line-info-face ((,class :inherit 
flycheck-fringe-info)))
     `(flycheck-color-mode-line-running-face ((,class :inherit italic 
:foreground ,fg-inactive)))
     `(flycheck-color-mode-line-info-face ((,class :inherit 
flycheck-fringe-warning)))
 ;;;;; flycheck-indicator
-    `(flycheck-indicator-disabled ((,class :inherit modus-theme-slant 
:foreground ,fg-inactive)))
-    `(flycheck-indicator-error ((,class :inherit modus-theme-bold :foreground 
,red-active)))
-    `(flycheck-indicator-info ((,class :inherit modus-theme-bold :foreground 
,blue-active)))
-    `(flycheck-indicator-running ((,class :inherit modus-theme-bold 
:foreground ,magenta-active)))
-    `(flycheck-indicator-success ((,class :inherit modus-theme-bold 
:foreground ,green-active)))
-    `(flycheck-indicator-warning ((,class :inherit modus-theme-bold 
:foreground ,yellow-active)))
+    `(flycheck-indicator-disabled ((,class :inherit modus-themes-slant 
:foreground ,fg-inactive)))
+    `(flycheck-indicator-error ((,class :inherit modus-themes-bold :foreground 
,red-active)))
+    `(flycheck-indicator-info ((,class :inherit modus-themes-bold :foreground 
,blue-active)))
+    `(flycheck-indicator-running ((,class :inherit modus-themes-bold 
:foreground ,magenta-active)))
+    `(flycheck-indicator-success ((,class :inherit modus-themes-bold 
:foreground ,green-active)))
+    `(flycheck-indicator-warning ((,class :inherit modus-themes-bold 
:foreground ,yellow-active)))
 ;;;;; flycheck-posframe
     `(flycheck-posframe-background-face ((,class :background ,bg-alt)))
     `(flycheck-posframe-border-face ((,class :inherit shadow)))
     `(flycheck-posframe-error-face ((,class :inherit bold :foreground ,red)))
-    `(flycheck-posframe-face ((,class :inherit modus-theme-slant :foreground 
,fg-main)))
+    `(flycheck-posframe-face ((,class :inherit modus-themes-slant :foreground 
,fg-main)))
     `(flycheck-posframe-info-face ((,class :inherit bold :foreground ,cyan)))
     `(flycheck-posframe-warning-face ((,class :inherit bold :foreground 
,yellow)))
 ;;;;; flymake
-    `(flymake-error ((,class :inherit modus-theme-lang-error)))
-    `(flymake-note ((,class :inherit modus-theme-lang-note)))
-    `(flymake-warning ((,class :inherit modus-theme-lang-warning)))
+    `(flymake-error ((,class :inherit modus-themes-lang-error)))
+    `(flymake-note ((,class :inherit modus-themes-lang-note)))
+    `(flymake-warning ((,class :inherit modus-themes-lang-warning)))
 ;;;;; flyspell
-    `(flyspell-duplicate ((,class :inherit modus-theme-lang-warning)))
-    `(flyspell-incorrect ((,class :inherit modus-theme-lang-error)))
+    `(flyspell-duplicate ((,class :inherit modus-themes-lang-warning)))
+    `(flyspell-incorrect ((,class :inherit modus-themes-lang-error)))
 ;;;;; flyspell-correct
-    `(flyspell-correct-highlight-face ((,class :inherit 
modus-theme-refine-green)))
+    `(flyspell-correct-highlight-face ((,class :inherit 
modus-themes-refine-green)))
 ;;;;; flx
     `(flx-highlight-face ((,class ,@(modus-themes--extra-completions
-                                     'modus-theme-subtle-magenta
-                                     'modus-theme-intense-magenta
-                                     'modus-theme-nuanced-magenta
+                                     'modus-themes-subtle-magenta
+                                     'modus-themes-intense-magenta
+                                     'modus-themes-nuanced-magenta
                                      magenta-alt
                                      'bold))))
 ;;;;; freeze-it
     `(freeze-it-show ((,class :background ,bg-dim :foreground 
,fg-special-warm)))
 ;;;;; frog-menu
-    `(frog-menu-action-keybinding-face ((,class :foreground ,blue-alt-other)))
+    `(frog-menu-action-keybinding-face ((,class :inherit 
modus-themes-key-binding)))
     `(frog-menu-actions-face ((,class :foreground ,magenta)))
     `(frog-menu-border ((,class :background ,bg-active)))
     `(frog-menu-candidates-face ((,class :foreground ,fg-main)))
@@ -4170,27 +4316,27 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; focus
     `(focus-unfocused ((,class :foreground ,fg-unfocused)))
 ;;;;; fold-this
-    `(fold-this-overlay ((,class :inherit modus-theme-special-mild)))
+    `(fold-this-overlay ((,class :inherit modus-themes-special-mild)))
 ;;;;; font-lock
-    `(font-lock-builtin-face ((,class :inherit modus-theme-bold
+    `(font-lock-builtin-face ((,class :inherit modus-themes-bold
                                       ,@(modus-themes--syntax-extra
                                          magenta-alt magenta-alt-faint 
blue-alt))))
     `(font-lock-comment-delimiter-face ((,class :inherit 
font-lock-comment-face)))
-    `(font-lock-comment-face ((,class :inherit modus-theme-slant
+    `(font-lock-comment-face ((,class :inherit modus-themes-slant
                                       ,@(modus-themes--syntax-comment
                                          fg-alt fg-comment-yellow))))
     `(font-lock-constant-face ((,class ,@(modus-themes--syntax-extra
                                           blue-alt-other blue-alt-other-faint 
magenta-alt-other))))
-    `(font-lock-doc-face ((,class :inherit modus-theme-slant
+    `(font-lock-doc-face ((,class :inherit modus-themes-slant
                                   ,@(modus-themes--syntax-docstring
                                      fg-docstring green-alt-other-faint
                                      green-alt-other-faint 
magenta-nuanced-fg))))
     `(font-lock-function-name-face ((,class ,@(modus-themes--syntax-extra
                                                magenta magenta-faint 
magenta-alt))))
-    `(font-lock-keyword-face ((,class :inherit modus-theme-bold
+    `(font-lock-keyword-face ((,class :inherit modus-themes-bold
                                       ,@(modus-themes--syntax-extra
                                          magenta-alt-other 
magenta-alt-other-faint cyan-alt-other))))
-    `(font-lock-negation-char-face ((,class :inherit modus-theme-bold
+    `(font-lock-negation-char-face ((,class :inherit modus-themes-bold
                                             ,@(modus-themes--syntax-foreground
                                                yellow yellow-faint))))
     `(font-lock-preprocessor-face ((,class ,@(modus-themes--syntax-foreground
@@ -4205,12 +4351,12 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                                       red magenta-alt))))
     `(font-lock-string-face ((,class ,@(modus-themes--syntax-string
                                         blue-alt blue-alt-faint green 
green-alt))))
-    `(font-lock-type-face ((,class :inherit modus-theme-bold
+    `(font-lock-type-face ((,class :inherit modus-themes-bold
                                    ,@(modus-themes--syntax-extra
                                       cyan-alt-other cyan-alt-faint 
cyan-alt))))
     `(font-lock-variable-name-face ((,class ,@(modus-themes--syntax-extra
                                                cyan cyan-faint 
blue-alt-faint))))
-    `(font-lock-warning-face ((,class :inherit modus-theme-bold
+    `(font-lock-warning-face ((,class :inherit modus-themes-bold
                                       ,@(modus-themes--syntax-foreground
                                          yellow-active yellow-alt-faint))))
 ;;;;; forge
@@ -4219,26 +4365,26 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(forge-topic-closed ((,class :inherit shadow)))
     `(forge-topic-merged ((,class :inherit shadow)))
     `(forge-topic-open ((,class :foreground ,fg-special-mild)))
-    `(forge-topic-unmerged ((,class :inherit modus-theme-slant :foreground 
,magenta)))
+    `(forge-topic-unmerged ((,class :inherit modus-themes-slant :foreground 
,magenta)))
     `(forge-topic-unread ((,class :inherit bold :foreground ,fg-main)))
 ;;;;; fountain-mode
     `(fountain-character ((,class :foreground ,blue-alt-other)))
-    `(fountain-comment ((,class :inherit modus-theme-slant :foreground 
,fg-alt)))
+    `(fountain-comment ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
     `(fountain-dialog ((,class :foreground ,blue-alt)))
     `(fountain-metadata-key ((,class :foreground ,green-alt-other)))
     `(fountain-metadata-value ((,class :foreground ,blue)))
     `(fountain-non-printing ((,class :inherit shadow)))
-    `(fountain-note ((,class :inherit modus-theme-slant :foreground ,yellow)))
+    `(fountain-note ((,class :inherit modus-themes-slant :foreground ,yellow)))
     `(fountain-page-break ((,class :inherit bold :foreground ,red-alt)))
     `(fountain-page-number ((,class :inherit bold :foreground ,red-alt-other)))
     `(fountain-paren ((,class :foreground ,cyan)))
     `(fountain-scene-heading ((,class :inherit bold :foreground 
,blue-nuanced-fg)))
-    `(fountain-section-heading ((,class :inherit modus-theme-heading-1)))
-    `(fountain-section-heading-1 ((,class :inherit modus-theme-heading-1)))
-    `(fountain-section-heading-2 ((,class :inherit modus-theme-heading-2)))
-    `(fountain-section-heading-3 ((,class :inherit modus-theme-heading-3)))
-    `(fountain-section-heading-4 ((,class :inherit modus-theme-heading-4)))
-    `(fountain-section-heading-5 ((,class :inherit modus-theme-heading-5)))
+    `(fountain-section-heading ((,class :inherit modus-themes-heading-1)))
+    `(fountain-section-heading-1 ((,class :inherit modus-themes-heading-1)))
+    `(fountain-section-heading-2 ((,class :inherit modus-themes-heading-2)))
+    `(fountain-section-heading-3 ((,class :inherit modus-themes-heading-3)))
+    `(fountain-section-heading-4 ((,class :inherit modus-themes-heading-4)))
+    `(fountain-section-heading-5 ((,class :inherit modus-themes-heading-5)))
     `(fountain-synopsis ((,class :foreground ,cyan-alt)))
     `(fountain-trans ((,class :foreground ,yellow-alt-other)))
 ;;;;; geiser
@@ -4255,40 +4401,40 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(geiser-font-lock-xref-link ((,class :inherit button)))
 ;;;;; git-commit
     `(git-commit-comment-action ((,class :inherit font-lock-comment-face)))
-    `(git-commit-comment-branch-local ((,class :inherit modus-theme-slant 
:foreground ,blue-alt)))
-    `(git-commit-comment-branch-remote ((,class :inherit modus-theme-slant 
:foreground ,magenta-alt)))
-    `(git-commit-comment-detached ((,class :inherit modus-theme-slant 
:foreground ,cyan-alt)))
-    `(git-commit-comment-file ((,class :inherit modus-theme-slant
+    `(git-commit-comment-branch-local ((,class :inherit modus-themes-slant 
:foreground ,blue-alt)))
+    `(git-commit-comment-branch-remote ((,class :inherit modus-themes-slant 
:foreground ,magenta-alt)))
+    `(git-commit-comment-detached ((,class :inherit modus-themes-slant 
:foreground ,cyan-alt)))
+    `(git-commit-comment-file ((,class :inherit modus-themes-slant
                                        ,@(modus-themes--syntax-comment
                                           fg-special-cold red-nuanced-fg))))
-    `(git-commit-comment-heading ((,class :inherit (bold modus-theme-slant)
+    `(git-commit-comment-heading ((,class :inherit (bold modus-themes-slant)
                                           ,@(modus-themes--syntax-comment
                                              fg-dim fg-special-warm))))
     `(git-commit-keyword ((,class :foreground ,magenta)))
     `(git-commit-known-pseudo-header ((,class :foreground ,cyan-alt-other)))
-    `(git-commit-nonempty-second-line ((,class :inherit 
modus-theme-refine-yellow)))
-    `(git-commit-overlong-summary ((,class :inherit 
modus-theme-refine-yellow)))
+    `(git-commit-nonempty-second-line ((,class :inherit 
modus-themes-refine-yellow)))
+    `(git-commit-overlong-summary ((,class :inherit 
modus-themes-refine-yellow)))
     `(git-commit-pseudo-header ((,class :foreground ,blue)))
     `(git-commit-summary ((,class :inherit bold :foreground ,cyan)))
 ;;;;; git-gutter
-    `(git-gutter:added ((,class :inherit modus-theme-fringe-green)))
-    `(git-gutter:deleted ((,class :inherit modus-theme-fringe-red)))
-    `(git-gutter:modified ((,class :inherit modus-theme-fringe-yellow)))
-    `(git-gutter:separator ((,class :inherit modus-theme-fringe-cyan)))
-    `(git-gutter:unchanged ((,class :inherit modus-theme-fringe-magenta)))
+    `(git-gutter:added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter:deleted ((,class :inherit modus-themes-fringe-red)))
+    `(git-gutter:modified ((,class :inherit modus-themes-fringe-yellow)))
+    `(git-gutter:separator ((,class :inherit modus-themes-fringe-cyan)))
+    `(git-gutter:unchanged ((,class :inherit modus-themes-fringe-magenta)))
 ;;;;; git-gutter-fr
-    `(git-gutter-fr:added ((,class :inherit modus-theme-fringe-green)))
-    `(git-gutter-fr:deleted ((,class :inherit modus-theme-fringe-red)))
-    `(git-gutter-fr:modified ((,class :inherit modus-theme-fringe-yellow)))
+    `(git-gutter-fr:added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter-fr:deleted ((,class :inherit modus-themes-fringe-red)))
+    `(git-gutter-fr:modified ((,class :inherit modus-themes-fringe-yellow)))
 ;;;;; git-{gutter,fringe}+
-    `(git-gutter+-added ((,class :inherit modus-theme-fringe-green)))
-    `(git-gutter+-deleted ((,class :inherit modus-theme-fringe-red)))
-    `(git-gutter+-modified ((,class :inherit modus-theme-fringe-yellow)))
-    `(git-gutter+-separator ((,class :inherit modus-theme-fringe-cyan)))
-    `(git-gutter+-unchanged ((,class :inherit modus-theme-fringe-magenta)))
-    `(git-gutter-fr+-added ((,class :inherit modus-theme-fringe-green)))
-    `(git-gutter-fr+-deleted ((,class :inherit modus-theme-fringe-red)))
-    `(git-gutter-fr+-modified ((,class :inherit modus-theme-fringe-yellow)))
+    `(git-gutter+-added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter+-deleted ((,class :inherit modus-themes-fringe-red)))
+    `(git-gutter+-modified ((,class :inherit modus-themes-fringe-yellow)))
+    `(git-gutter+-separator ((,class :inherit modus-themes-fringe-cyan)))
+    `(git-gutter+-unchanged ((,class :inherit modus-themes-fringe-magenta)))
+    `(git-gutter-fr+-added ((,class :inherit modus-themes-fringe-green)))
+    `(git-gutter-fr+-deleted ((,class :inherit modus-themes-fringe-red)))
+    `(git-gutter-fr+-modified ((,class :inherit modus-themes-fringe-yellow)))
 ;;;;; git-lens
     `(git-lens-added ((,class :inherit bold :foreground ,green)))
     `(git-lens-deleted ((,class :inherit bold :foreground ,red)))
@@ -4296,10 +4442,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(git-lens-modified ((,class :inherit bold :foreground ,yellow)))
     `(git-lens-renamed ((,class :inherit bold :foreground ,magenta)))
 ;;;;; git-rebase
-    `(git-rebase-comment-hash ((,class :inherit modus-theme-slant
+    `(git-rebase-comment-hash ((,class :inherit modus-themes-slant
                                        ,@(modus-themes--syntax-comment
                                           fg-special-cold red-nuanced-fg))))
-    `(git-rebase-comment-heading  ((,class :inherit (bold modus-theme-slant)
+    `(git-rebase-comment-heading  ((,class :inherit (bold modus-themes-slant)
                                            ,@(modus-themes--syntax-comment
                                               fg-dim fg-special-warm))))
     `(git-rebase-description ((,class :foreground ,fg-main)))
@@ -4328,7 +4474,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(gnus-cite-attribution ((,class :inherit italic :foreground ,fg-main)))
     `(gnus-emphasis-bold ((,class :inherit bold)))
     `(gnus-emphasis-bold-italic ((,class :inherit bold-italic)))
-    `(gnus-emphasis-highlight-words ((,class :inherit 
modus-theme-refine-yellow)))
+    `(gnus-emphasis-highlight-words ((,class :inherit 
modus-themes-refine-yellow)))
     `(gnus-emphasis-italic ((,class :inherit italic)))
     `(gnus-emphasis-underline-bold ((,class :inherit gnus-emphasis-bold 
:underline t)))
     `(gnus-emphasis-underline-bold-italic ((,class :inherit 
gnus-emphasis-bold-italic :underline t)))
@@ -4363,13 +4509,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(gnus-server-agent ((,class :inherit bold :foreground ,cyan)))
     `(gnus-server-closed ((,class :inherit bold :foreground ,magenta)))
     `(gnus-server-cloud ((,class :inherit bold :foreground ,cyan-alt)))
-    `(gnus-server-cloud-host ((,class :inherit modus-theme-refine-cyan)))
+    `(gnus-server-cloud-host ((,class :inherit modus-themes-refine-cyan)))
     `(gnus-server-denied ((,class :inherit bold :foreground ,red)))
     `(gnus-server-offline ((,class :inherit bold :foreground ,yellow)))
     `(gnus-server-opened ((,class :inherit bold :foreground ,green)))
     `(gnus-signature ((,class :inherit italic :foreground ,fg-special-cold)))
     `(gnus-splash ((,class :inherit shadow)))
-    `(gnus-summary-cancelled ((,class :inherit modus-theme-mark-alt)))
+    `(gnus-summary-cancelled ((,class :inherit modus-themes-mark-alt :extend 
t)))
     `(gnus-summary-high-ancient ((,class :inherit bold :foreground ,fg-alt)))
     `(gnus-summary-high-read ((,class :inherit bold :foreground 
,fg-special-cold)))
     `(gnus-summary-high-ticked ((,class :inherit bold :foreground 
,red-alt-other)))
@@ -4385,11 +4531,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(gnus-summary-normal-ticked ((,class :foreground ,red-alt-other)))
     `(gnus-summary-normal-undownloaded ((,class :foreground ,yellow)))
     `(gnus-summary-normal-unread ((,class :foreground ,fg-main)))
-    `(gnus-summary-selected ((,class :inherit modus-theme-subtle-blue)))
+    `(gnus-summary-selected ((,class :inherit modus-themes-subtle-blue :extend 
t)))
 ;;;;; golden-ratio-scroll-screen
     `(golden-ratio-scroll-highlight-line-face ((,class :background 
,cyan-subtle-bg :foreground ,fg-main)))
 ;;;;; helm
-    `(helm-M-x-key ((,class :inherit bold :foreground ,magenta-alt-other)))
+    `(helm-M-x-key ((,class :inherit modus-themes-key-binding)))
     `(helm-action ((,class :underline t)))
     `(helm-bookmark-addressbook ((,class :foreground ,green-alt)))
     `(helm-bookmark-directory ((,class :inherit bold :foreground ,blue)))
@@ -4418,9 +4564,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(helm-etags-file ((,class :foreground ,fg-dim :underline t)))
     `(helm-ff-backup-file ((,class :inherit shadow)))
     `(helm-ff-denied ((,class ,@(modus-themes--extra-completions
-                                 'modus-theme-subtle-red
-                                 'modus-theme-intense-red
-                                 'modus-theme-nuanced-red
+                                 'modus-themes-subtle-red
+                                 'modus-themes-intense-red
+                                 'modus-themes-nuanced-red
                                  red))))
     `(helm-ff-directory ((,class :inherit helm-buffer-directory)))
     `(helm-ff-dirs ((,class :inherit bold :foreground ,blue-alt-other)))
@@ -4433,20 +4579,20 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                        ,@(modus-themes--link-color
                                           red red-faint))))
     `(helm-ff-pipe ((,class ,@(modus-themes--extra-completions
-                               'modus-theme-refine-magenta
-                               'modus-theme-subtle-magenta
-                               'modus-theme-nuanced-magenta
+                               'modus-themes-refine-magenta
+                               'modus-themes-subtle-magenta
+                               'modus-themes-nuanced-magenta
                                magenta))))
     `(helm-ff-prefix ((,class ,@(modus-themes--extra-completions
-                                 'modus-theme-refine-yellow
-                                 'modus-theme-subtle-yellow
-                                 'modus-theme-nuanced-yellow
+                                 'modus-themes-refine-yellow
+                                 'modus-themes-subtle-yellow
+                                 'modus-themes-nuanced-yellow
                                  yellow-alt-other))))
     `(helm-ff-socket ((,class :foreground ,red-alt-other)))
     `(helm-ff-suid ((,class ,@(modus-themes--extra-completions
-                               'modus-theme-subtle-red
-                               'modus-theme-refine-red
-                               'modus-theme-nuanced-yellow
+                               'modus-themes-subtle-red
+                               'modus-themes-refine-red
+                               'modus-themes-nuanced-yellow
                                red-alt))))
     `(helm-ff-symlink ((,class :inherit button
                                ,@(modus-themes--link-color
@@ -4457,59 +4603,59 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(helm-grep-file ((,class :inherit bold :foreground ,fg-special-cold)))
     `(helm-grep-finish ((,class :foreground ,green-active)))
     `(helm-grep-lineno ((,class :foreground ,fg-special-warm)))
-    `(helm-grep-match ((,class :inherit modus-theme-special-calm)))
+    `(helm-grep-match ((,class :inherit modus-themes-special-calm)))
     `(helm-header ((,class :inherit bold :foreground ,fg-special-cold)))
     `(helm-header-line-left-margin ((,class :inherit bold :foreground 
,yellow-intense)))
     `(helm-history-deleted ((,class ,@(modus-themes--extra-completions
-                                       'modus-theme-subtle-red
-                                       'modus-theme-intense-red
-                                       'modus-theme-nuanced-red
+                                       'modus-themes-subtle-red
+                                       'modus-themes-intense-red
+                                       'modus-themes-nuanced-red
                                        red
                                        'bold))))
     `(helm-history-remote ((,class :foreground ,red-alt-other)))
     `(helm-lisp-completion-info ((,class :foreground ,fg-special-warm)))
     `(helm-lisp-show-completion ((,class ,@(modus-themes--extra-completions
-                                            'modus-theme-subtle-yellow
-                                            'modus-theme-refine-yellow
-                                            'modus-theme-nuanced-yellow
+                                            'modus-themes-subtle-yellow
+                                            'modus-themes-refine-yellow
+                                            'modus-themes-nuanced-yellow
                                             yellow
                                             'bold))))
     `(helm-locate-finish ((,class :foreground ,green-active)))
     `(helm-match ((,class ,@(modus-themes--extra-completions
-                             'modus-theme-subtle-cyan
-                             'modus-theme-refine-cyan
-                             'modus-theme-nuanced-cyan
+                             'modus-themes-subtle-cyan
+                             'modus-themes-refine-cyan
+                             'modus-themes-nuanced-cyan
                              cyan
                              'bold))))
     `(helm-match-item ((,class ,@(modus-themes--extra-completions
-                                  'modus-theme-subtle-neutral
-                                  'modus-theme-subtle-cyan
-                                  'modus-theme-nuanced-cyan
+                                  'modus-themes-subtle-neutral
+                                  'modus-themes-subtle-cyan
+                                  'modus-themes-nuanced-cyan
                                   cyan-alt-other))))
     `(helm-minibuffer-prompt ((,class :inherit minibuffer-prompt)))
     `(helm-moccur-buffer ((,class :inherit button
                                   ,@(modus-themes--link-color
                                      cyan-alt-other cyan-alt-other-faint))))
     `(helm-mode-prefix ((,class ,@(modus-themes--extra-completions
-                                   'modus-theme-subtle-magenta
-                                   'modus-theme-intense-magenta
-                                   'modus-theme-nuanced-magenta
+                                   'modus-themes-subtle-magenta
+                                   'modus-themes-intense-magenta
+                                   'modus-themes-nuanced-magenta
                                    magenta-alt
                                    'bold))))
     `(helm-non-file-buffer ((,class :inherit shadow)))
     `(helm-prefarg ((,class :foreground ,red-active)))
     `(helm-resume-need-update ((,class ,@(modus-themes--extra-completions
-                                          'modus-theme-subtle-magenta
-                                          'modus-theme-refine-magenta
-                                          'modus-theme-nuanced-magenta
+                                          'modus-themes-subtle-magenta
+                                          'modus-themes-refine-magenta
+                                          'modus-themes-nuanced-magenta
                                           magenta-alt-other))))
     `(helm-selection ((,class ,@(modus-themes--extra-completions
-                                 'modus-theme-subtle-blue
-                                 'modus-theme-refine-blue
-                                 'modus-theme-special-cold
+                                 'modus-themes-subtle-blue
+                                 'modus-themes-refine-blue
+                                 'modus-themes-special-cold
                                  nil
                                  'bold))))
-    `(helm-selection-line ((,class :inherit modus-theme-special-cold)))
+    `(helm-selection-line ((,class :inherit modus-themes-special-cold)))
     `(helm-separator ((,class :foreground ,fg-special-mild)))
     `(helm-time-zone-current ((,class :foreground ,green)))
     `(helm-time-zone-home ((,class :foreground ,magenta)))
@@ -4517,7 +4663,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                   ,@(modus-themes--scale 
modus-themes-scale-4))))
     `(helm-top-columns ((,class :inherit helm-header)))
     `(helm-ucs-char ((,class :foreground ,yellow-alt-other)))
-    `(helm-visible-mark ((,class :inherit modus-theme-subtle-cyan)))
+    `(helm-visible-mark ((,class :inherit modus-themes-subtle-cyan)))
 ;;;;; helm-ls-git
     `(helm-ls-git-added-copied-face ((,class :foreground ,green-intense)))
     `(helm-ls-git-added-modified-face ((,class :foreground ,yellow-intense)))
@@ -4530,16 +4676,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(helm-ls-git-untracked-face ((,class :foreground ,fg-special-cold)))
 ;;;;; helm-switch-shell
     `(helm-switch-shell-new-shell-face ((,class 
,@(modus-themes--extra-completions
-                                                   'modus-theme-subtle-magenta
-                                                   'modus-theme-refine-magenta
-                                                   'modus-theme-nuanced-magenta
+                                                   'modus-themes-subtle-magenta
+                                                   'modus-themes-refine-magenta
+                                                   
'modus-themes-nuanced-magenta
                                                    magenta-alt-other
                                                    'bold))))
 ;;;;; helm-xref
     `(helm-xref-file-name ((,class :inherit bold :foreground 
,fg-special-cold)))
     `(helm-xref-file-name ((,class :foreground ,fg-special-warm)))
 ;;;;; helpful
-    `(helpful-heading ((,class :inherit modus-theme-heading-1)))
+    `(helpful-heading ((,class :inherit modus-themes-heading-1)))
 ;;;;; highlight region or ad-hoc regexp
     `(hi-aquamarine ((,class :background ,cyan-subtle-bg :foreground 
,fg-main)))
     `(hi-black-b ((,class :inherit bold :background ,fg-main :foreground 
,bg-main)))
@@ -4553,10 +4699,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(hi-red-b ((,class :inherit bold :background ,red-intense-bg :foreground 
,fg-main)))
     `(hi-salmon ((,class :background ,red-subtle-bg :foreground ,fg-main)))
     `(hi-yellow ((,class :background ,yellow-subtle-bg :foreground ,fg-main)))
-    `(highlight ((,class :inherit modus-theme-subtle-blue)))
-    `(highlight-changes ((,class :foreground ,yellow-alt-other)))
-    `(highlight-changes-delete ((,class :foreground ,red-alt-other :underline 
t)))
-    `(hl-line ((,class :inherit modus-theme-hl-line)))
+    `(highlight ((,class :inherit modus-themes-subtle-blue)))
+    `(highlight-changes ((,class :foreground ,red-alt :underline nil)))
+    `(highlight-changes-delete ((,class :background ,red-nuanced-bg
+                                        :foreground ,red :underline t)))
+    `(hl-line ((,class :inherit modus-themes-hl-line)))
 ;;;;; highlight-blocks
     `(highlight-blocks-depth-1-face ((,class :background ,bg-dim :foreground 
,fg-main)))
     `(highlight-blocks-depth-2-face ((,class :background ,bg-alt :foreground 
,fg-main)))
@@ -4578,12 +4725,12 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(hes-escape-backslash-face ((,class :inherit bold :foreground 
,fg-escape-char-construct)))
     `(hes-escape-sequence-face ((,class :inherit bold :foreground 
,fg-escape-char-backslash)))
 ;;;;; highlight-indentation
-    `(highlight-indentation-face ((,class :inherit modus-theme-hl-line)))
+    `(highlight-indentation-face ((,class :inherit modus-themes-hl-line)))
     `(highlight-indentation-current-column-face ((,class :background 
,bg-active)))
 ;;;;; highlight-numbers
     `(highlight-numbers-number ((,class :foreground ,blue-alt-other)))
 ;;;;; highlight-symbol
-    `(highlight-symbol-face ((,class :inherit modus-theme-special-mild)))
+    `(highlight-symbol-face ((,class :inherit modus-themes-special-mild)))
 ;;;;; highlight-thing
     `(highlight-thing ((,class :background ,bg-alt :foreground ,cyan)))
 ;;;;; hl-defined
@@ -4593,7 +4740,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; hl-fill-column
     `(hl-fill-column-face ((,class :background ,bg-active :foreground 
,fg-active)))
 ;;;;; hl-todo
-    `(hl-todo ((,class :inherit (bold modus-theme-slant) :foreground 
,red-alt-other)))
+    `(hl-todo ((,class :inherit (bold modus-themes-slant) :foreground 
,red-alt-other)))
 ;;;;; hydra
     `(hydra-face-amaranth ((,class :inherit bold :foreground ,yellow)))
     `(hydra-face-blue ((,class :inherit bold :foreground ,blue-alt)))
@@ -4623,7 +4770,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                   magenta bg-alt
                                   bg-active fg-main))))
     `(ido-incomplete-regexp ((,class :inherit error)))
-    `(ido-indicator ((,class :inherit modus-theme-subtle-yellow)))
+    `(ido-indicator ((,class :inherit modus-themes-subtle-yellow)))
     `(ido-only-match ((,class :inherit bold
                               ,@(modus-themes--standard-completions
                                  green green-nuanced-bg
@@ -4631,8 +4778,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ido-subdir ((,class :foreground ,blue)))
     `(ido-virtual ((,class :foreground ,fg-special-warm)))
 ;;;;; iedit
-    `(iedit-occurrence ((,class :inherit modus-theme-refine-blue)))
-    `(iedit-read-only-occurrence ((,class :inherit 
modus-theme-intense-yellow)))
+    `(iedit-occurrence ((,class :inherit modus-themes-refine-blue)))
+    `(iedit-read-only-occurrence ((,class :inherit 
modus-themes-intense-yellow)))
 ;;;;; iflipb
     `(iflipb-current-buffer-face ((,class :inherit bold :foreground 
,cyan-alt)))
     `(iflipb-other-buffer-face ((,class :inherit shadow)))
@@ -4648,10 +4795,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; indium
     `(indium-breakpoint-face ((,class :foreground ,red-active)))
     `(indium-frame-url-face ((,class :inherit button :foreground ,fg-alt)))
-    `(indium-keyword-face ((,class :foreground ,magenta-alt-other)))
-    `(indium-litable-face ((,class :inherit modus-theme-slant :foreground 
,fg-special-warm)))
-    `(indium-repl-error-face ((,class :inherit bold :foreground ,red)))
-    `(indium-repl-prompt-face ((,class :foreground ,cyan-alt-other)))
+    `(indium-keyword-face ((,class :inherit font-lock-keyword-face)))
+    `(indium-litable-face ((,class :inherit modus-themes-slant :foreground 
,fg-special-warm)))
+    `(indium-repl-error-face ((,class :inherit error)))
+    `(indium-repl-prompt-face ((,class :inherit comint-highlight-prompt)))
     `(indium-repl-stdout-face ((,class :foreground ,fg-main)))
 ;;;;; info
     `(Info-quoted ((,class ,@(modus-themes--mixed-fonts) ; the capitalization 
is canonical
@@ -4659,16 +4806,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(info-header-node ((,class :inherit bold :foreground ,fg-alt)))
     `(info-header-xref ((,class :foreground ,blue-active)))
     `(info-index-match ((,class :inherit match)))
-    `(info-menu-header ((,class :inherit modus-theme-heading-3)))
+    `(info-menu-header ((,class :inherit modus-themes-heading-3)))
     `(info-menu-star ((,class :foreground ,red)))
     `(info-node ((,class :inherit bold)))
-    `(info-title-1 ((,class :inherit modus-theme-heading-1)))
-    `(info-title-2 ((,class :inherit modus-theme-heading-2)))
-    `(info-title-3 ((,class :inherit modus-theme-heading-3)))
-    `(info-title-4 ((,class :inherit modus-theme-heading-4)))
+    `(info-title-1 ((,class :inherit modus-themes-heading-1)))
+    `(info-title-2 ((,class :inherit modus-themes-heading-2)))
+    `(info-title-3 ((,class :inherit modus-themes-heading-3)))
+    `(info-title-4 ((,class :inherit modus-themes-heading-4)))
 ;;;;; info-colors
     `(info-colors-lisp-code-block ((,class :inherit fixed-pitch)))
-    `(info-colors-ref-item-command ((,class :foreground ,magenta)))
+    `(info-colors-ref-item-command ((,class :inherit 
font-lock-function-name-face)))
     `(info-colors-ref-item-constant ((,class :inherit 
font-lock-constant-face)))
     `(info-colors-ref-item-function ((,class :inherit 
font-lock-function-name-face)))
     `(info-colors-ref-item-macro ((,class :inherit font-lock-keyword-face)))
@@ -4688,35 +4835,35 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; ioccur
     `(ioccur-cursor ((,class :foreground ,fg-main)))
     `(ioccur-invalid-regexp ((,class :foreground ,red)))
-    `(ioccur-match-face ((,class :inherit modus-theme-special-calm)))
-    `(ioccur-match-overlay-face ((,class :inherit modus-theme-special-cold 
:extend t)))
+    `(ioccur-match-face ((,class :inherit modus-themes-special-calm)))
+    `(ioccur-match-overlay-face ((,class :inherit modus-themes-special-cold 
:extend t)))
     `(ioccur-num-line-face ((,class :foreground ,fg-special-warm)))
-    `(ioccur-overlay-face ((,class :inherit modus-theme-refine-blue :extend 
t)))
-    `(ioccur-regexp-face ((,class :inherit (modus-theme-intense-magenta 
bold))))
+    `(ioccur-overlay-face ((,class :inherit modus-themes-refine-blue :extend 
t)))
+    `(ioccur-regexp-face ((,class :inherit (modus-themes-intense-magenta 
bold))))
     `(ioccur-title-face ((,class :inherit bold :foreground ,red-alt
                                  ,@(modus-themes--scale 
modus-themes-scale-4))))
 ;;;;; isearch, occur, and the like
-    `(isearch ((,class :inherit (modus-theme-intense-green bold))))
-    `(isearch-fail ((,class :inherit modus-theme-refine-red)))
-    `(isearch-group-1 ((,class :inherit modus-theme-intense-blue)))
-    `(isearch-group-2 ((,class :inherit modus-theme-intense-magenta)))
-    `(lazy-highlight ((,class :inherit modus-theme-refine-cyan)))
-    `(match ((,class :inherit modus-theme-special-calm)))
-    `(query-replace ((,class :inherit (modus-theme-intense-yellow bold))))
+    `(isearch ((,class :inherit (modus-themes-intense-green bold))))
+    `(isearch-fail ((,class :inherit modus-themes-refine-red)))
+    `(isearch-group-1 ((,class :inherit modus-themes-intense-blue)))
+    `(isearch-group-2 ((,class :inherit modus-themes-intense-magenta)))
+    `(lazy-highlight ((,class :inherit modus-themes-refine-cyan)))
+    `(match ((,class :inherit modus-themes-special-calm)))
+    `(query-replace ((,class :inherit (modus-themes-intense-yellow bold))))
 ;;;;; isl (isearch-light)
-    `(isl-line ((,class :inherit modus-theme-subtle-green)))
-    `(isl-match ((,class :inherit modus-theme-refine-cyan)))
-    `(isl-number ((,class :inherit modus-theme-bold :foreground 
,green-active)))
-    `(isl-on ((,class :inherit (bold modus-theme-intense-green))))
-    `(isl-string ((,class :inherit modus-theme-bold :foreground ,cyan-active)))
+    `(isl-line ((,class :inherit modus-themes-subtle-green)))
+    `(isl-match ((,class :inherit modus-themes-refine-cyan)))
+    `(isl-number ((,class :inherit modus-themes-bold :foreground 
,green-active)))
+    `(isl-on ((,class :inherit (bold modus-themes-intense-green))))
+    `(isl-string ((,class :inherit modus-themes-bold :foreground 
,cyan-active)))
 ;;;;; ivy
     `(ivy-action ((,class :inherit bold :foreground ,red-alt)))
     `(ivy-completions-annotations ((,class :inherit completions-annotations)))
     `(ivy-confirm-face ((,class :foreground ,cyan)))
     `(ivy-current-match ((,class ,@(modus-themes--extra-completions
-                                    'modus-theme-refine-cyan
-                                    'modus-theme-intense-cyan
-                                    'modus-theme-special-cold
+                                    'modus-themes-refine-cyan
+                                    'modus-themes-intense-cyan
+                                    'modus-themes-special-cold
                                     nil
                                     'bold))))
     `(ivy-cursor ((,class :background ,fg-main :foreground ,bg-main)))
@@ -4725,36 +4872,36 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ivy-highlight-face ((,class :foreground ,magenta)))
     `(ivy-match-required-face ((,class :inherit error)))
     `(ivy-minibuffer-match-face-1 ((,class ,@(modus-themes--extra-completions
-                                              'modus-theme-subtle-neutral
-                                              'modus-theme-intense-neutral
-                                              'modus-theme-nuanced-cyan
+                                              'modus-themes-subtle-neutral
+                                              'modus-themes-intense-neutral
+                                              'modus-themes-nuanced-cyan
                                               fg-alt))))
     `(ivy-minibuffer-match-face-2 ((,class ,@(modus-themes--extra-completions
-                                              'modus-theme-subtle-green
-                                              'modus-theme-refine-green
-                                              'modus-theme-nuanced-green
+                                              'modus-themes-subtle-green
+                                              'modus-themes-refine-green
+                                              'modus-themes-nuanced-green
                                               green-alt-other
                                               'bold))))
     `(ivy-minibuffer-match-face-3 ((,class ,@(modus-themes--extra-completions
-                                              'modus-theme-subtle-blue
-                                              'modus-theme-refine-blue
-                                              'modus-theme-nuanced-blue
+                                              'modus-themes-subtle-blue
+                                              'modus-themes-refine-blue
+                                              'modus-themes-nuanced-blue
                                               blue-alt-other
                                               'bold))))
     `(ivy-minibuffer-match-face-4 ((,class ,@(modus-themes--extra-completions
-                                              'modus-theme-subtle-magenta
-                                              'modus-theme-refine-magenta
-                                              'modus-theme-nuanced-magenta
+                                              'modus-themes-subtle-magenta
+                                              'modus-themes-refine-magenta
+                                              'modus-themes-nuanced-magenta
                                               magenta-alt-other
                                               'bold))))
     `(ivy-minibuffer-match-highlight ((,class 
,@(modus-themes--extra-completions
-                                                 'modus-theme-subtle-cyan
-                                                 'modus-theme-intense-cyan
-                                                 'modus-theme-nuanced-cyan
+                                                 'modus-themes-subtle-cyan
+                                                 'modus-themes-intense-cyan
+                                                 'modus-themes-nuanced-cyan
                                                  cyan-alt-other
                                                  'bold))))
-    `(ivy-modified-buffer ((,class :inherit modus-theme-slant :foreground 
,yellow)))
-    `(ivy-modified-outside-buffer ((,class :inherit modus-theme-slant 
:foreground ,yellow-alt)))
+    `(ivy-modified-buffer ((,class :inherit modus-themes-slant :foreground 
,yellow)))
+    `(ivy-modified-outside-buffer ((,class :inherit modus-themes-slant 
:foreground ,yellow-alt)))
     `(ivy-org ((,class :foreground ,cyan-alt-other)))
     `(ivy-prompt-match ((,class :inherit ivy-current-match)))
     `(ivy-remote ((,class :foreground ,magenta)))
@@ -4762,9 +4909,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ivy-subdir ((,class :foreground ,blue-alt-other)))
     `(ivy-virtual ((,class :foreground ,magenta-alt-other)))
     `(ivy-yanked-word ((,class ,@(modus-themes--extra-completions
-                                  'modus-theme-subtle-blue
-                                  'modus-theme-refine-blue
-                                  'modus-theme-nuanced-blue
+                                  'modus-themes-subtle-blue
+                                  'modus-themes-refine-blue
+                                  'modus-themes-nuanced-blue
                                   blue-alt))))
 ;;;;; ivy-posframe
     `(ivy-posframe ((,class :background ,bg-dim :foreground ,fg-main)))
@@ -4773,55 +4920,51 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; jira (org-jira)
     `(jiralib-comment-face ((,class :background ,bg-alt)))
     `(jiralib-comment-header-face ((,class :inherit bold)))
-    `(jiralib-issue-info-face ((,class :inherit modus-theme-special-warm)))
-    `(jiralib-issue-info-header-face ((,class :inherit 
(modus-theme-special-warm bold))))
+    `(jiralib-issue-info-face ((,class :inherit modus-themes-special-warm)))
+    `(jiralib-issue-info-header-face ((,class :inherit 
(modus-themes-special-warm bold))))
     `(jiralib-issue-summary-face ((,class :inherit bold)))
     `(jiralib-link-filter-face ((,class :underline t)))
     `(jiralib-link-issue-face ((,class :underline t)))
     `(jiralib-link-project-face ((,class :underline t)))
 ;;;;; journalctl-mode
-    `(journalctl-error-face ((,class :inherit bold :foreground ,red)))
-    `(journalctl-finished-face ((,class :inherit bold :foreground ,green)))
+    `(journalctl-error-face ((,class :inherit error)))
+    `(journalctl-finished-face ((,class :inherit success)))
     `(journalctl-host-face ((,class :foreground ,blue)))
     `(journalctl-process-face ((,class :foreground ,cyan-alt-other)))
     `(journalctl-starting-face ((,class :foreground ,green)))
     `(journalctl-timestamp-face ((,class :foreground ,fg-special-cold)))
-    `(journalctl-warning-face ((,class :inherit bold :foreground ,yellow)))
+    `(journalctl-warning-face ((,class :inherit warning)))
 ;;;;; js2-mode
-    `(js2-error ((,class :foreground ,red)))
-    `(js2-external-variable ((,class :foreground ,cyan-alt-other)))
-    `(js2-function-call ((,class :foreground ,magenta)))
-    `(js2-function-param ((,class :foreground ,blue)))
-    `(js2-instance-member ((,class :foreground ,magenta-alt-other)))
+    `(js2-error ((,class :inherit modus-themes-lang-error)))
+    `(js2-external-variable ((,class :inherit font-lock-variable-name-face)))
+    `(js2-function-call ((,class :inherit font-lock-function-name-face)))
+    `(js2-function-param ((,class :inherit font-lock-constant-face)))
+    `(js2-instance-member ((,class :inherit font-lock-keyword-face)))
     `(js2-jsdoc-html-tag-delimiter ((,class :foreground ,fg-main)))
-    `(js2-jsdoc-html-tag-name ((,class :foreground ,cyan)))
-    `(js2-jsdoc-tag ((,class :foreground ,fg-special-calm)))
-    `(js2-jsdoc-type ((,class :foreground ,fg-special-cold)))
-    `(js2-jsdoc-value ((,class :foreground ,fg-special-warm)))
+    `(js2-jsdoc-html-tag-name ((,class :inherit font-lock-function-name-face)))
+    `(js2-jsdoc-tag ((,class :inherit (font-lock-builtin-face 
font-lock-comment-face) :weight normal)))
+    `(js2-jsdoc-type ((,class :inherit (font-lock-type-face 
font-lock-comment-face) :weight normal)))
+    `(js2-jsdoc-value ((,class :inherit (font-lock-constant-face 
font-lock-comment-face) :weight normal)))
     `(js2-object-property ((,class :foreground ,fg-main)))
     `(js2-object-property-access ((,class :foreground ,fg-main)))
-    `(js2-private-function-call ((,class :foreground ,green-alt-other)))
-    `(js2-private-member ((,class :foreground ,fg-special-mild)))
-    `(js2-warning ((,class :foreground ,yellow-alt :underline t)))
+    `(js2-private-function-call ((,class :inherit 
font-lock-preprocessor-face)))
+    `(js2-private-member ((,class :inherit font-lock-warning-face)))
+    `(js2-warning ((,class :inherit modus-themes-lang-warning)))
 ;;;;; julia
-    `(julia-macro-face ((,class :inherit modus-theme-bold :foreground 
,magenta)))
-    `(julia-quoted-symbol-face ((,class :foreground ,blue-alt-other)))
+    `(julia-macro-face ((,class :inherit font-lock-builtin-face)))
+    `(julia-quoted-symbol-face ((,class :inherit font-lock-constant-face)))
 ;;;;; jupyter
     `(jupyter-eval-overlay ((,class :inherit bold :foreground ,blue)))
     `(jupyter-repl-input-prompt ((,class :foreground ,cyan-alt-other)))
     `(jupyter-repl-output-prompt ((,class :foreground ,magenta-alt-other)))
-    `(jupyter-repl-traceback ((,class :inherit modus-theme-intense-red)))
+    `(jupyter-repl-traceback ((,class :inherit modus-themes-intense-red)))
 ;;;;; kaocha-runner
     `(kaocha-runner-error-face ((,class :foreground ,red)))
     `(kaocha-runner-success-face ((,class :foreground ,green)))
     `(kaocha-runner-warning-face ((,class :foreground ,yellow)))
 ;;;;; keycast
     `(keycast-command ((,class :inherit bold :foreground ,blue-active)))
-    `(keycast-key ((,class ,@(modus-themes--mode-line-attrs
-                              bg-main blue-active
-                              bg-main blue-active
-                              blue-active blue-intense
-                              'alt-style -3))))
+    `(keycast-key ((,class :background ,blue-active :foreground ,bg-main)))
 ;;;;; line numbers (display-line-numbers-mode and global variant)
     `(line-number
       ((,class :inherit default
@@ -4844,27 +4987,24 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   fg-alt bg-inactive
                   fg-inactive))))
 ;;;;; lsp-mode
-    `(lsp-face-highlight-read ((,class :inherit modus-theme-subtle-blue 
:underline t)))
-    `(lsp-face-highlight-textual ((,class :inherit modus-theme-subtle-blue)))
-    `(lsp-face-highlight-write ((,class :inherit (modus-theme-refine-blue 
bold))))
+    `(lsp-face-highlight-read ((,class :inherit modus-themes-subtle-blue 
:underline t)))
+    `(lsp-face-highlight-textual ((,class :inherit modus-themes-subtle-blue)))
+    `(lsp-face-highlight-write ((,class :inherit (modus-themes-refine-blue 
bold))))
     `(lsp-face-semhl-constant ((,class :foreground ,blue-alt-other)))
-    `(lsp-face-semhl-deprecated
-      ((,(append '((supports :underline (:style wave))) class)
-        :foreground ,yellow :underline (:style wave))
-       (,class :foreground ,yellow :underline t)))
+    `(lsp-face-semhl-deprecated ((,class :inherit modus-themes-lang-warning)))
     `(lsp-face-semhl-enummember ((,class :foreground ,blue-alt-other)))
     `(lsp-face-semhl-field ((,class :foreground ,cyan-alt)))
-    `(lsp-face-semhl-field-static ((,class :inherit modus-theme-slant 
:foreground ,cyan-alt)))
+    `(lsp-face-semhl-field-static ((,class :inherit modus-themes-slant 
:foreground ,cyan-alt)))
     `(lsp-face-semhl-function ((,class :foreground ,magenta)))
     `(lsp-face-semhl-method ((,class :foreground ,magenta)))
-    `(lsp-face-semhl-namespace ((,class :inherit modus-theme-bold :foreground 
,magenta-alt)))
+    `(lsp-face-semhl-namespace ((,class :inherit modus-themes-bold :foreground 
,magenta-alt)))
     `(lsp-face-semhl-preprocessor ((,class :foreground ,red-alt-other)))
-    `(lsp-face-semhl-static-method ((,class :inherit modus-theme-slant 
:foreground ,magenta)))
+    `(lsp-face-semhl-static-method ((,class :inherit modus-themes-slant 
:foreground ,magenta)))
     `(lsp-face-semhl-type-class ((,class :foreground ,magenta-alt)))
     `(lsp-face-semhl-type-enum ((,class :foreground ,magenta-alt)))
-    `(lsp-face-semhl-type-primitive ((,class :inherit modus-theme-slant 
:foreground ,magenta-alt)))
-    `(lsp-face-semhl-type-template ((,class :inherit modus-theme-slant 
:foreground ,magenta-alt)))
-    `(lsp-face-semhl-type-typedef ((,class :inherit modus-theme-slant 
:foreground ,magenta-alt)))
+    `(lsp-face-semhl-type-primitive ((,class :inherit modus-themes-slant 
:foreground ,magenta-alt)))
+    `(lsp-face-semhl-type-template ((,class :inherit modus-themes-slant 
:foreground ,magenta-alt)))
+    `(lsp-face-semhl-type-typedef ((,class :inherit modus-themes-slant 
:foreground ,magenta-alt)))
     `(lsp-face-semhl-variable ((,class :foreground ,cyan)))
     `(lsp-face-semhl-variable-local ((,class :foreground ,cyan)))
     `(lsp-face-semhl-variable-parameter ((,class :foreground ,cyan-alt-other)))
@@ -4876,11 +5016,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(lsp-ui-peek-filename ((,class :foreground ,fg-special-warm)))
     `(lsp-ui-peek-footer ((,class :background ,bg-header :foreground 
,fg-header)))
     `(lsp-ui-peek-header ((,class :background ,bg-header :foreground 
,fg-header)))
-    `(lsp-ui-peek-highlight ((,class :inherit modus-theme-subtle-blue)))
+    `(lsp-ui-peek-highlight ((,class :inherit modus-themes-subtle-blue)))
     `(lsp-ui-peek-line-number ((,class :inherit shadow)))
     `(lsp-ui-peek-list ((,class :background ,bg-dim)))
     `(lsp-ui-peek-peek ((,class :background ,bg-alt)))
-    `(lsp-ui-peek-selection ((,class :inherit modus-theme-subtle-cyan)))
+    `(lsp-ui-peek-selection ((,class :inherit modus-themes-subtle-cyan)))
     `(lsp-ui-sideline-code-action ((,class :foreground ,yellow)))
     `(lsp-ui-sideline-current-symbol ((,class :inherit bold :height 0.99 :box 
(:line-width -1 :style nil) :foreground ,fg-main)))
     `(lsp-ui-sideline-symbol ((,class :inherit bold :height 0.99 :box 
(:line-width -1 :style nil) :foreground ,fg-alt)))
@@ -4899,11 +5039,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-bisect-good ((,class :foreground ,green-alt-other)))
     `(magit-bisect-skip ((,class :foreground ,yellow-alt-other)))
     `(magit-blame-date ((,class :foreground ,blue)))
-    `(magit-blame-dimmed ((,class :inherit shadow)))
+    `(magit-blame-dimmed ((,class :inherit (shadow modus-themes-reset-hard))))
     `(magit-blame-hash ((,class :foreground ,fg-special-warm)))
-    `(magit-blame-heading ((,class :background ,bg-alt)))
-    `(magit-blame-highlight ((,class :inherit modus-theme-nuanced-cyan)))
-    `(magit-blame-margin ((,class :inherit magit-blame-highlight)))
+    `(magit-blame-heading ((,class :inherit modus-themes-reset-hard 
:background ,bg-alt :extend t)))
+    `(magit-blame-highlight ((,class :inherit modus-themes-nuanced-cyan)))
+    `(magit-blame-margin ((,class :inherit (magit-blame-highlight 
modus-themes-reset-hard))))
     `(magit-blame-name ((,class :foreground ,magenta-alt-other)))
     `(magit-blame-summary ((,class :foreground ,cyan-alt-other)))
     `(magit-branch-current ((,class :foreground ,blue-alt-other :box t)))
@@ -4914,7 +5054,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-cherry-equivalent ((,class :background ,bg-main :foreground 
,magenta-intense)))
     `(magit-cherry-unmatched ((,class :background ,bg-main :foreground 
,cyan-intense)))
     ;; NOTE: here we break from the pattern of inheriting from the
-    ;; modus-theme-diff-* faces, though only for the standard actions,
+    ;; modus-themes-diff-* faces, though only for the standard actions,
     ;; not the highlighted ones.  This is because Magit's interaction
     ;; model relies on highlighting the current diff hunk.
     `(magit-diff-added ((,class ,@(modus-themes--diff
@@ -4922,37 +5062,37 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                    bg-diff-added fg-diff-added
                                    green-nuanced-bg fg-diff-added
                                    bg-diff-added-deuteran 
fg-diff-added-deuteran))))
-    `(magit-diff-added-highlight ((,class :inherit 
modus-theme-diff-focus-added)))
+    `(magit-diff-added-highlight ((,class :inherit 
modus-themes-diff-focus-added)))
     `(magit-diff-base ((,class ,@(modus-themes--diff
                                   bg-main yellow
                                   bg-diff-changed fg-diff-changed
                                   yellow-nuanced-bg fg-diff-changed))))
-    `(magit-diff-base-highlight ((,class :inherit 
modus-theme-diff-focus-changed)))
+    `(magit-diff-base-highlight ((,class :inherit 
modus-themes-diff-focus-changed)))
     `(magit-diff-context ((,class :foreground ,fg-unfocused)))
     `(magit-diff-context-highlight ((,class ,@(modus-themes--diff
                                                bg-dim fg-dim
                                                bg-inactive fg-inactive
                                                bg-dim fg-alt))))
     `(magit-diff-file-heading ((,class :inherit bold :foreground 
,fg-special-cold)))
-    `(magit-diff-file-heading-highlight ((,class :inherit 
(modus-theme-special-cold bold))))
-    `(magit-diff-file-heading-selection ((,class :inherit 
modus-theme-refine-cyan)))
+    `(magit-diff-file-heading-highlight ((,class :inherit 
(modus-themes-special-cold bold))))
+    `(magit-diff-file-heading-selection ((,class :inherit 
modus-themes-refine-cyan)))
     ;; NOTE: here we break from the pattern of inheriting from the
-    ;; modus-theme-diff-* faces.
+    ;; modus-themes-diff-* faces.
     `(magit-diff-hunk-heading ((,class :inherit bold :background ,bg-active
                                        :foreground ,fg-inactive)))
     `(magit-diff-hunk-heading-highlight
       ((,class :inherit bold
                :background ,@(modus-themes--diff-deuteran bg-region 
bg-diff-heading)
                :foreground ,@(modus-themes--diff-deuteran fg-main 
fg-diff-heading))))
-    `(magit-diff-hunk-heading-selection ((,class :inherit 
modus-theme-refine-blue)))
+    `(magit-diff-hunk-heading-selection ((,class :inherit 
modus-themes-refine-blue)))
     `(magit-diff-hunk-region ((,class :inherit bold)))
     `(magit-diff-lines-boundary ((,class :background ,fg-main)))
-    `(magit-diff-lines-heading ((,class :inherit modus-theme-refine-magenta)))
+    `(magit-diff-lines-heading ((,class :inherit modus-themes-refine-magenta)))
     `(magit-diff-removed ((,class ,@(modus-themes--diff
                                      bg-main red
                                      bg-diff-removed fg-diff-removed
                                      red-nuanced-bg fg-diff-removed))))
-    `(magit-diff-removed-highlight ((,class :inherit 
modus-theme-diff-focus-removed)))
+    `(magit-diff-removed-highlight ((,class :inherit 
modus-themes-diff-focus-removed)))
     `(magit-diffstat-added ((,class :foreground ,@(modus-themes--diff-deuteran 
blue green))))
     `(magit-diffstat-removed ((,class :foreground ,red)))
     `(magit-dimmed ((,class :foreground ,fg-unfocused)))
@@ -4960,7 +5100,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-hash ((,class :inherit shadow)))
     `(magit-head ((,class :inherit magit-branch-local)))
     `(magit-header-line ((,class :inherit bold :foreground ,magenta-active)))
-    `(magit-header-line-key ((,class :inherit bold :foreground ,blue-active)))
+    `(magit-header-line-key ((,class :inherit modus-themes-key-binding)))
     `(magit-header-line-log-select ((,class :inherit bold :foreground 
,fg-main)))
     `(magit-keyword ((,class :foreground ,magenta)))
     `(magit-keyword-squash ((,class :inherit bold :foreground 
,yellow-alt-other)))
@@ -4986,7 +5126,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(magit-refname-wip ((,class :inherit shadow)))
     `(magit-section ((,class :background ,bg-dim :foreground ,fg-main)))
     `(magit-section-heading ((,class :inherit bold :foreground ,cyan)))
-    `(magit-section-heading-selection ((,class :inherit 
(modus-theme-refine-cyan bold))))
+    `(magit-section-heading-selection ((,class :inherit 
(modus-themes-refine-cyan bold))))
     `(magit-section-highlight ((,class :background ,bg-alt)))
     `(magit-sequence-done ((,class :foreground ,green-alt)))
     `(magit-sequence-drop ((,class :foreground ,red-alt)))
@@ -5011,16 +5151,22 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(makefile-space ((,class :background ,magenta-nuanced-bg)))
 ;;;;; man
     `(Man-overstrike ((,class :inherit bold :foreground ,magenta)))
-    `(Man-reverse ((,class :inherit modus-theme-subtle-magenta)))
+    `(Man-reverse ((,class :inherit modus-themes-subtle-magenta)))
     `(Man-underline ((,class :foreground ,cyan :underline t)))
 ;;;;; marginalia
     `(marginalia-archive ((,class :foreground ,green-nuanced-fg)))
     `(marginalia-date ((,class :foreground ,blue-nuanced-fg)))
     `(marginalia-char ((,class :foreground ,red-active)))
-    `(marginalia-documentation ((,class :foreground ,fg-special-cold :inherit 
modus-theme-slant)))
+    `(marginalia-documentation ((,class :foreground ,fg-special-cold :inherit 
modus-themes-slant)))
     `(marginalia-file-modes ((,class :inherit shadow)))
     `(marginalia-file-name ((,class :foreground ,fg-special-mild)))
     `(marginalia-file-owner ((,class :foreground ,red-nuanced-fg)))
+    ;; Here we make an exception of not applying the bespoke
+    ;; `modus-themes-key-binding' for two reasons: (1) completion
+    ;; highlights can be fairly intense, so we do not want more
+    ;; components to compete with them for attention, (2) the
+    ;; `marginalia-key' may not be used for key bindings specifically,
+    ;; so we might end up applying styles in places we should not.
     `(marginalia-key ((,class :foreground ,magenta-active)))
     `(marginalia-mode ((,class :foreground ,cyan-active)))
     `(marginalia-modified ((,class :foreground ,yellow-active)))
@@ -5030,21 +5176,21 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(marginalia-variable ((,class :foreground ,yellow-nuanced-fg)))
     `(marginalia-version ((,class :foreground ,cyan-active)))
 ;;;;; markdown-mode
-    `(markdown-blockquote-face ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
+    `(markdown-blockquote-face ((,class :inherit modus-themes-slant 
:foreground ,fg-special-cold)))
     `(markdown-bold-face ((,class :inherit bold)))
     `(markdown-code-face ((,class ,@(modus-themes--mixed-fonts) :background 
,bg-dim :extend t)))
     `(markdown-comment-face ((,class :inherit font-lock-comment-face)))
     `(markdown-footnote-marker-face ((,class :inherit bold :foreground 
,cyan-alt)))
-    `(markdown-footnote-text-face ((,class :inherit modus-theme-slant 
:foreground ,fg-main)))
+    `(markdown-footnote-text-face ((,class :inherit modus-themes-slant 
:foreground ,fg-main)))
     `(markdown-gfm-checkbox-face ((,class :foreground ,cyan-alt-other)))
-    `(markdown-header-delimiter-face ((,class :inherit modus-theme-bold 
:foreground ,fg-dim)))
+    `(markdown-header-delimiter-face ((,class :inherit modus-themes-bold 
:foreground ,fg-dim)))
     `(markdown-header-face ((t nil)))
-    `(markdown-header-face-1 ((,class :inherit modus-theme-heading-1)))
-    `(markdown-header-face-2 ((,class :inherit modus-theme-heading-2)))
-    `(markdown-header-face-3 ((,class :inherit modus-theme-heading-3)))
-    `(markdown-header-face-4 ((,class :inherit modus-theme-heading-4)))
-    `(markdown-header-face-5 ((,class :inherit modus-theme-heading-5)))
-    `(markdown-header-face-6 ((,class :inherit modus-theme-heading-6)))
+    `(markdown-header-face-1 ((,class :inherit modus-themes-heading-1)))
+    `(markdown-header-face-2 ((,class :inherit modus-themes-heading-2)))
+    `(markdown-header-face-3 ((,class :inherit modus-themes-heading-3)))
+    `(markdown-header-face-4 ((,class :inherit modus-themes-heading-4)))
+    `(markdown-header-face-5 ((,class :inherit modus-themes-heading-5)))
+    `(markdown-header-face-6 ((,class :inherit modus-themes-heading-6)))
     `(markdown-header-rule-face ((,class :inherit bold :foreground 
,fg-special-warm)))
     `(markdown-hr-face ((,class :inherit bold :foreground ,fg-special-warm)))
     `(markdown-html-attr-name-face ((,class ,@(modus-themes--mixed-fonts)
@@ -5065,9 +5211,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(markdown-language-keyword-face ((,class ,@(modus-themes--mixed-fonts)
                                               :background ,bg-alt
                                               :foreground ,fg-alt)))
-    `(markdown-line-break-face ((,class :inherit modus-theme-refine-cyan 
:underline t)))
+    `(markdown-line-break-face ((,class :inherit modus-themes-refine-cyan 
:underline t)))
     `(markdown-link-face ((,class :inherit button)))
-    `(markdown-link-title-face ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
+    `(markdown-link-title-face ((,class :inherit modus-themes-slant 
:foreground ,fg-special-cold)))
     `(markdown-list-face ((,class :foreground ,fg-dim)))
     `(markdown-markup-face ((,class :inherit shadow)))
     `(markdown-math-face ((,class :foreground ,magenta-alt-other)))
@@ -5090,13 +5236,13 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(markup-command-face ((,class :foreground ,fg-inactive)))
     `(markup-comment-face ((,class :inherit font-lock-comment-face)))
     `(markup-complex-replacement-face ((,class :box (:line-width 2 :color nil 
:style released-button)
-                                               :inherit 
modus-theme-refine-magenta)))
+                                               :inherit 
modus-themes-refine-magenta)))
     `(markup-emphasis-face ((,class :inherit italic :foreground 
,fg-special-cold)))
     `(markup-error-face ((,class :inherit bold :foreground ,red)))
     `(markup-gen-face ((,class :foreground ,magenta-alt)))
     `(markup-internal-reference-face ((,class :inherit button :foreground 
,fg-alt)))
     `(markup-italic-face ((,class :inherit italic :foreground 
,fg-special-cold)))
-    `(markup-list-face ((,class :inherit modus-theme-special-calm)))
+    `(markup-list-face ((,class :inherit modus-themes-special-calm)))
     `(markup-meta-face ((,class :foreground ,fg-inactive)))
     `(markup-meta-hide-face ((,class :inherit shadow)))
     `(markup-passthrough-face ((,class :inherit fixed-pitch :foreground 
,cyan)))
@@ -5107,9 +5253,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(markup-strong-face ((,class :inherit bold :foreground ,red-nuanced-fg)))
     `(markup-subscript-face ((,class :height 0.8 :foreground 
,fg-special-cold)))
     `(markup-superscript-face ((,class :height 0.8 :foreground 
,fg-special-cold)))
-    `(markup-table-cell-face ((,class :inherit modus-theme-special-cold)))
-    `(markup-table-face ((,class :inherit modus-theme-subtle-cyan)))
-    `(markup-table-row-face ((,class :inherit modus-theme-subtle-cyan)))
+    `(markup-table-cell-face ((,class :inherit modus-themes-special-cold)))
+    `(markup-table-face ((,class :inherit modus-themes-subtle-cyan)))
+    `(markup-table-row-face ((,class :inherit modus-themes-subtle-cyan)))
     `(markup-title-0-face ((,class :height 3.0 :foreground ,blue-nuanced-fg)))
     `(markup-title-1-face ((,class :height 2.4 :foreground ,blue-nuanced-fg)))
     `(markup-title-2-face ((,class :height 1.8 :foreground ,blue-nuanced-fg)))
@@ -5117,7 +5263,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(markup-title-4-face ((,class :height 1.2 :foreground ,blue-nuanced-fg)))
     `(markup-title-5-face ((,class :height 1.2 :foreground ,blue-nuanced-fg 
:underline t)))
     `(markup-value-face ((,class :foreground ,fg-inactive)))
-    `(markup-verbatim-face ((,class :inherit modus-theme-special-mild)))
+    `(markup-verbatim-face ((,class :inherit modus-themes-special-mild)))
 ;;;;; mentor
     `(mentor-download-message ((,class :foreground ,fg-special-warm)))
     `(mentor-download-name ((,class :foreground ,fg-special-cold)))
@@ -5126,7 +5272,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mentor-download-speed-down ((,class :foreground ,cyan-alt)))
     `(mentor-download-speed-up ((,class :foreground ,red-alt)))
     `(mentor-download-state ((,class :foreground ,yellow-alt)))
-    `(mentor-highlight-face ((,class :inherit modus-theme-subtle-blue)))
+    `(mentor-highlight-face ((,class :inherit modus-themes-subtle-blue)))
     `(mentor-tracker-name ((,class :foreground ,magenta-alt)))
 ;;;;; messages
     `(message-cited-text-1 ((,class :foreground ,blue-faint)))
@@ -5141,7 +5287,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(message-header-to ((,class :inherit bold :foreground 
,magenta-alt-other)))
     `(message-header-xheader ((,class :foreground ,blue-alt)))
     `(message-mml ((,class :foreground ,yellow)))
-    `(message-separator ((,class :inherit modus-theme-intense-neutral)))
+    `(message-separator ((,class :inherit modus-themes-intense-neutral)))
 ;;;;; minibuffer-line
     `(minibuffer-line ((,class :foreground ,fg-main)))
 ;;;;; minimap
@@ -5159,14 +5305,19 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; modeline
     `(mode-line ((,class ,@(modus-themes--variable-pitch-ui)
                          ,@(modus-themes--mode-line-attrs
-                            fg-active bg-active fg-dim bg-active
-                            fg-alt bg-active 'alt-style nil bg-main))))
+                            fg-active bg-active
+                            fg-dim bg-active
+                            fg-main bg-active-accent
+                            fg-alt bg-active
+                            'alt-style nil bg-main))))
     `(mode-line-buffer-id ((,class :inherit bold)))
     `(mode-line-emphasis ((,class :inherit bold :foreground ,blue-active)))
-    `(mode-line-highlight ((,class :inherit modus-theme-active-blue :box 
(:line-width -1 :style pressed-button))))
+    `(mode-line-highlight ((,class :inherit modus-themes-active-blue :box 
(:line-width -1 :style pressed-button))))
     `(mode-line-inactive ((,class ,@(modus-themes--variable-pitch-ui)
                                   ,@(modus-themes--mode-line-attrs
-                                     fg-inactive bg-inactive fg-alt bg-dim
+                                     fg-inactive bg-inactive
+                                     fg-alt bg-dim
+                                     fg-inactive bg-inactive
                                      bg-region bg-active))))
 ;;;;; mood-line
     `(mood-line-modified ((,class :foreground ,magenta-active)))
@@ -5189,28 +5340,28 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mu4e-cited-6-face ((,class :foreground ,magenta)))
     `(mu4e-cited-7-face ((,class :foreground ,green-alt)))
     `(mu4e-compose-header-face ((,class :inherit mu4e-compose-separator-face)))
-    `(mu4e-compose-separator-face ((,class :inherit 
modus-theme-intense-neutral)))
+    `(mu4e-compose-separator-face ((,class :inherit 
modus-themes-intense-neutral)))
     `(mu4e-contact-face ((,class :inherit message-header-to)))
     `(mu4e-context-face ((,class :foreground ,blue-active)))
     `(mu4e-draft-face ((,class :foreground ,magenta-alt)))
     `(mu4e-flagged-face ((,class :foreground ,red-alt)))
-    `(mu4e-footer-face ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
+    `(mu4e-footer-face ((,class :inherit modus-themes-slant :foreground 
,fg-special-cold)))
     `(mu4e-forwarded-face ((,class :foreground ,magenta-alt-other)))
     `(mu4e-header-face ((,class :inherit shadow)))
-    `(mu4e-header-highlight-face ((,class :inherit modus-theme-hl-line)))
+    `(mu4e-header-highlight-face ((,class :inherit modus-themes-hl-line)))
     `(mu4e-header-key-face ((,class :inherit message-header-name)))
     `(mu4e-header-marks-face ((,class :inherit 
mu4e-special-header-value-face)))
     `(mu4e-header-title-face ((,class :foreground ,fg-special-mild)))
     `(mu4e-header-value-face ((,class :inherit message-header-other)))
-    `(mu4e-highlight-face ((,class :inherit bold :foreground ,blue-alt-other)))
+    `(mu4e-highlight-face ((,class :inherit modus-themes-key-binding)))
     `(mu4e-link-face ((,class :inherit button)))
     `(mu4e-modeline-face ((,class :foreground ,magenta-active)))
-    `(mu4e-moved-face ((,class :inherit modus-theme-slant :foreground 
,yellow)))
+    `(mu4e-moved-face ((,class :inherit modus-themes-slant :foreground 
,yellow)))
     `(mu4e-ok-face ((,class :inherit bold :foreground ,green)))
-    `(mu4e-region-code ((,class :inherit modus-theme-special-calm)))
+    `(mu4e-region-code ((,class :inherit modus-themes-special-calm)))
     `(mu4e-replied-face ((,class :foreground ,blue)))
     `(mu4e-special-header-value-face ((,class :inherit 
message-header-subject)))
-    `(mu4e-system-face ((,class :inherit modus-theme-slant :foreground 
,fg-mark-del)))
+    `(mu4e-system-face ((,class :inherit modus-themes-slant :foreground 
,fg-mark-del)))
     `(mu4e-title-face ((,class :foreground ,fg-main)))
     `(mu4e-trashed-face ((,class :foreground ,red)))
     `(mu4e-unread-face ((,class :inherit bold)))
@@ -5218,7 +5369,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(mu4e-view-body-face ((,class :foreground ,fg-main)))
     `(mu4e-warning-face ((,class :inherit warning)))
 ;;;;; mu4e-conversation
-    `(mu4e-conversation-header ((,class :inherit modus-theme-special-cold)))
+    `(mu4e-conversation-header ((,class :inherit modus-themes-special-cold)))
     `(mu4e-conversation-sender-1 ((,class :foreground ,fg-special-warm)))
     `(mu4e-conversation-sender-2 ((,class :foreground ,fg-special-cold)))
     `(mu4e-conversation-sender-3 ((,class :foreground ,fg-special-mild)))
@@ -5250,20 +5401,20 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(neo-vc-needs-merge-face ((,class :foreground ,magenta-alt)))
     `(neo-vc-needs-update-face ((,class :underline t)))
     `(neo-vc-removed-face ((,class :strike-through t)))
-    `(neo-vc-unlocked-changes-face ((,class :inherit modus-theme-refine-blue)))
+    `(neo-vc-unlocked-changes-face ((,class :inherit 
modus-themes-refine-blue)))
     `(neo-vc-up-to-date-face ((,class :inherit shadow)))
     `(neo-vc-user-face ((,class :foreground ,magenta)))
 ;;;;; no-emoji
     `(no-emoji ((,class :foreground ,cyan)))
 ;;;;; notmuch
-    `(notmuch-crypto-decryption ((,class :inherit modus-theme-refine-magenta)))
+    `(notmuch-crypto-decryption ((,class :inherit modus-themes-special-mild)))
     `(notmuch-crypto-part-header ((,class :foreground ,magenta-alt-other)))
-    `(notmuch-crypto-signature-bad ((,class :inherit modus-theme-intense-red)))
-    `(notmuch-crypto-signature-good ((,class :inherit 
modus-theme-refine-green)))
-    `(notmuch-crypto-signature-good-key ((,class :inherit 
modus-theme-refine-yellow)))
-    `(notmuch-crypto-signature-unknown ((,class :inherit 
modus-theme-refine-red)))
+    `(notmuch-crypto-signature-bad ((,class :inherit 
modus-themes-intense-red)))
+    `(notmuch-crypto-signature-good ((,class :inherit 
modus-themes-refine-blue)))
+    `(notmuch-crypto-signature-good-key ((,class :inherit 
modus-themes-refine-cyan)))
+    `(notmuch-crypto-signature-unknown ((,class :inherit 
modus-themes-refine-red)))
     `(notmuch-hello-logo-background ((,class :background "gray50")))
-    `(notmuch-message-summary-face ((,class :inherit 
modus-theme-nuanced-cyan)))
+    `(notmuch-message-summary-face ((,class :inherit 
modus-themes-nuanced-cyan)))
     `(notmuch-search-count ((,class :inherit shadow)))
     `(notmuch-search-date ((,class :foreground ,cyan)))
     `(notmuch-search-flagged-face ((,class :foreground ,red-alt)))
@@ -5271,14 +5422,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(notmuch-search-non-matching-authors ((,class :inherit shadow)))
     `(notmuch-search-subject ((,class :foreground ,fg-dim)))
     `(notmuch-search-unread-face ((,class :inherit bold)))
-    `(notmuch-tag-added
-      ((,(append '((supports :underline (:style wave))) class)
-        :underline (:color ,green :style wave))
-       (,class :foreground ,green :underline t)))
-    `(notmuch-tag-deleted
-      ((,(append '((supports :underline (:style wave))) class)
-        :underline (:color ,red :style wave))
-       (,class :foreground ,red :underline t)))
+    `(notmuch-tag-added ((,class :inherit modus-themes-lang-note)))
+    `(notmuch-tag-deleted ((,class :inherit modus-themes-lang-error)))
     `(notmuch-tag-face ((,class :inherit bold :foreground ,blue-alt)))
     `(notmuch-tag-flagged ((,class :foreground ,red-alt)))
     `(notmuch-tag-unread ((,class :foreground ,magenta-alt)))
@@ -5300,15 +5445,15 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(nxml-cdata-section-CDATA ((,class :inherit error)))
     `(nxml-cdata-section-delimiter ((,class :inherit error)))
     `(nxml-char-ref-delimiter ((,class :foreground ,fg-special-mild)))
-    `(nxml-char-ref-number ((,class :inherit modus-theme-bold :foreground 
,fg-special-mild)))
-    `(nxml-delimited-data ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
+    `(nxml-char-ref-number ((,class :inherit modus-themes-bold :foreground 
,fg-special-mild)))
+    `(nxml-delimited-data ((,class :inherit modus-themes-slant :foreground 
,fg-special-cold)))
     `(nxml-delimiter ((,class :foreground ,fg-dim)))
     `(nxml-element-colon ((,class :foreground ,fg-main)))
     `(nxml-element-local-name ((,class :inherit font-lock-function-name-face)))
     `(nxml-element-prefix ((,class :inherit font-lock-builtin-face)))
     `(nxml-entity-ref-delimiter ((,class :foreground ,fg-special-mild)))
-    `(nxml-entity-ref-name ((,class :inherit modus-theme-bold :foreground 
,fg-special-mild)))
-    `(nxml-glyph ((,class :inherit modus-theme-intense-neutral)))
+    `(nxml-entity-ref-name ((,class :inherit modus-themes-bold :foreground 
,fg-special-mild)))
+    `(nxml-glyph ((,class :inherit modus-themes-intense-neutral)))
     `(nxml-hash ((,class :inherit (bold font-lock-string-face))))
     `(nxml-heading ((,class :inherit bold)))
     `(nxml-name ((,class :inherit font-lock-builtin-face)))
@@ -5316,11 +5461,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(nxml-namespace-attribute-prefix ((,class :inherit 
font-lock-variable-name-face)))
     `(nxml-processing-instruction-target ((,class :inherit 
font-lock-keyword-face)))
     `(nxml-prolog-keyword ((,class :inherit font-lock-keyword-face)))
-    `(nxml-ref ((,class :inherit modus-theme-bold :foreground 
,fg-special-mild)))
+    `(nxml-ref ((,class :inherit modus-themes-bold :foreground 
,fg-special-mild)))
     `(rng-error ((,class :inherit error)))
 ;;;;; objed
-    `(objed-hl ((,class :background ,(if modus-themes-intense-hl-line
-                                         bg-hl-alt-intense bg-hl-alt))))
+    `(objed-hl ((,class :background ,(if modus-themes-hl-line 
bg-hl-alt-intense bg-hl-alt))))
     `(objed-mark ((,class :background ,bg-active)))
     `(objed-mode-line ((,class :foreground ,cyan-active)))
 ;;;;; orderless
@@ -5343,7 +5487,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; org
     `(org-agenda-calendar-event ((,class :foreground ,fg-main)))
     `(org-agenda-calendar-sexp ((,class :foreground ,cyan-alt)))
-    `(org-agenda-clocking ((,class :inherit modus-theme-special-cold :extend 
t)))
+    `(org-agenda-clocking ((,class :inherit modus-themes-special-cold :extend 
t)))
     `(org-agenda-column-dateline ((,class :background ,bg-alt)))
     `(org-agenda-current-time ((,class :inherit bold :foreground 
,blue-alt-other)))
     `(org-agenda-date ((,class :foreground ,cyan)))
@@ -5372,9 +5516,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                             :background ,bg-inactive :foreground ,fg-active)))
     `(org-checkbox-statistics-done ((,class :inherit org-done)))
     `(org-checkbox-statistics-todo ((,class :inherit org-todo)))
-    `(org-clock-overlay ((,class :inherit modus-theme-special-cold)))
+    `(org-clock-overlay ((,class :inherit modus-themes-special-cold)))
     `(org-code ((,class ,@(modus-themes--mixed-fonts)
-                        :background ,red-nuanced-bg :foreground ,magenta)))
+                        :background ,magenta-nuanced-bg :foreground 
,magenta-nuanced-fg)))
     `(org-column ((,class :background ,bg-alt)))
     `(org-column-title ((,class :inherit bold :underline t :background 
,bg-alt)))
     `(org-date ((,class :inherit ,(if modus-themes-no-mixed-fonts
@@ -5383,11 +5527,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                         ,@(modus-themes--link-color
                            cyan cyan-faint))))
     `(org-date-selected ((,class :inherit bold :foreground ,blue-alt 
:inverse-video t)))
-    `(org-dispatcher-highlight ((,class :inherit (bold modus-theme-mark-alt))))
+    `(org-dispatcher-highlight ((,class :inherit (bold 
modus-themes-mark-alt))))
     `(org-document-info ((,class :foreground ,fg-special-cold)))
     `(org-document-info-keyword ((,class ,@(modus-themes--mixed-fonts)
                                          :foreground ,fg-alt)))
-    `(org-document-title ((,class :inherit (bold modus-theme-variable-pitch) 
:foreground ,fg-special-cold
+    `(org-document-title ((,class :inherit (bold modus-themes-variable-pitch) 
:foreground ,fg-special-cold
                                   ,@(modus-themes--scale 
modus-themes-scale-5))))
     `(org-done ((,class :foreground ,green)))
     `(org-drawer ((,class ,@(modus-themes--mixed-fonts)
@@ -5430,32 +5574,30 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                               green-graph-1-bg
                                               green-graph-0-bg
                                               green-graph-1-bg))))
-    `(org-headline-done ((,class :inherit modus-theme-variable-pitch 
:foreground ,green-nuanced-fg)))
-    `(org-headline-todo ((,class :inherit modus-theme-variable-pitch 
:foreground ,red-nuanced-fg)))
+    `(org-headline-done ((,class :inherit modus-themes-variable-pitch 
:foreground ,green-nuanced-fg)))
+    `(org-headline-todo ((,class :inherit modus-themes-variable-pitch 
:foreground ,red-nuanced-fg)))
     `(org-hide ((,class :foreground ,bg-main)))
     `(org-indent ((,class :inherit (fixed-pitch org-hide))))
     `(org-latex-and-related ((,class :foreground ,magenta-refine-fg)))
-    `(org-level-1 ((,class :inherit modus-theme-heading-1)))
-    `(org-level-2 ((,class :inherit modus-theme-heading-2)))
-    `(org-level-3 ((,class :inherit modus-theme-heading-3)))
-    `(org-level-4 ((,class :inherit modus-theme-heading-4)))
-    `(org-level-5 ((,class :inherit modus-theme-heading-5)))
-    `(org-level-6 ((,class :inherit modus-theme-heading-6)))
-    `(org-level-7 ((,class :inherit modus-theme-heading-7)))
-    `(org-level-8 ((,class :inherit modus-theme-heading-8)))
+    `(org-level-1 ((,class :inherit modus-themes-heading-1)))
+    `(org-level-2 ((,class :inherit modus-themes-heading-2)))
+    `(org-level-3 ((,class :inherit modus-themes-heading-3)))
+    `(org-level-4 ((,class :inherit modus-themes-heading-4)))
+    `(org-level-5 ((,class :inherit modus-themes-heading-5)))
+    `(org-level-6 ((,class :inherit modus-themes-heading-6)))
+    `(org-level-7 ((,class :inherit modus-themes-heading-7)))
+    `(org-level-8 ((,class :inherit modus-themes-heading-8)))
     `(org-link ((,class :inherit button)))
     `(org-list-dt ((,class :inherit bold)))
     `(org-macro ((,class ,@(modus-themes--mixed-fonts)
-                         :background ,blue-nuanced-bg :foreground 
,magenta-alt-other)))
+                         :background ,cyan-nuanced-bg :foreground 
,cyan-nuanced-fg)))
     `(org-meta-line ((,class ,@(modus-themes--mixed-fonts) :foreground 
,fg-alt)))
     `(org-mode-line-clock ((,class :foreground ,fg-main)))
-    `(org-mode-line-clock-overrun ((,class :inherit modus-theme-active-red)))
+    `(org-mode-line-clock-overrun ((,class :inherit modus-themes-active-red)))
     `(org-priority ((,class :foreground ,magenta)))
     `(org-property-value ((,class ,@(modus-themes--mixed-fonts)
                                   :foreground ,fg-special-cold)))
-    `(org-quote ((,class :inherit modus-theme-slant
-                         ,@(modus-themes--org-block bg-dim)
-                         :foreground ,fg-special-cold)))
+    `(org-quote ((,class ,@(modus-themes--org-block bg-dim))))
     `(org-scheduled ((,class :foreground ,magenta-alt)))
     `(org-scheduled-previously ((,class :foreground ,yellow-alt-other)))
     `(org-scheduled-today ((,class :foreground ,magenta-alt-other)))
@@ -5464,7 +5606,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                    :foreground ,fg-alt)))
     `(org-table ((,class ,@(modus-themes--mixed-fonts)
                          :foreground ,fg-special-cold)))
-    `(org-table-header ((,class :inherit (fixed-pitch 
modus-theme-intense-neutral))))
+    `(org-table-header ((,class :inherit (fixed-pitch 
modus-themes-intense-neutral))))
     `(org-tag ((,class :foreground ,magenta-nuanced-fg)))
     `(org-tag-group ((,class :inherit bold :foreground ,cyan-nuanced-fg)))
     `(org-target ((,class :underline t)))
@@ -5477,8 +5619,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(org-verse ((,class :inherit org-quote)))
     `(org-warning ((,class :inherit bold :foreground ,red-alt-other)))
 ;;;;; org-journal
-    `(org-journal-calendar-entry-face ((,class :inherit modus-theme-slant 
:foreground ,yellow-alt-other)))
-    `(org-journal-calendar-scheduled-face ((,class :inherit modus-theme-slant 
:foreground ,red-alt-other)))
+    `(org-journal-calendar-entry-face ((,class :inherit modus-themes-slant 
:foreground ,yellow-alt-other)))
+    `(org-journal-calendar-scheduled-face ((,class :inherit modus-themes-slant 
:foreground ,red-alt-other)))
     `(org-journal-highlight ((,class :foreground ,magenta-alt)))
 ;;;;; org-noter
     `(org-noter-no-notes-exist-face ((,class :inherit bold :foreground 
,red-active)))
@@ -5507,27 +5649,27 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(org-superstar-item ((,class :foreground ,fg-main)))
     `(org-superstar-leading ((,class :foreground ,fg-whitespace)))
 ;;;;; org-table-sticky-header
-    `(org-table-sticky-header-face ((,class :inherit 
modus-theme-intense-neutral)))
+    `(org-table-sticky-header-face ((,class :inherit 
modus-themes-intense-neutral)))
 ;;;;; org-tree-slide
     `(org-tree-slide-header-overlay-face
-      ((,class :inherit (bold modus-theme-variable-pitch) :background ,bg-main
+      ((,class :inherit (bold modus-themes-variable-pitch) :background ,bg-main
                :foreground ,fg-special-cold :overline nil
                ,@(modus-themes--scale modus-themes-scale-5))))
 ;;;;; org-treescope
-    `(org-treescope-faces--markerinternal-midday ((,class :inherit 
modus-theme-intense-blue)))
-    `(org-treescope-faces--markerinternal-range ((,class :inherit 
modus-theme-special-mild)))
+    `(org-treescope-faces--markerinternal-midday ((,class :inherit 
modus-themes-intense-blue)))
+    `(org-treescope-faces--markerinternal-range ((,class :inherit 
modus-themes-special-mild)))
 ;;;;; origami
     `(origami-fold-header-face ((,class :background ,bg-dim :foreground 
,fg-dim :box t)))
     `(origami-fold-replacement-face ((,class :background ,bg-alt :foreground 
,fg-alt)))
 ;;;;; outline-mode
-    `(outline-1 ((,class :inherit modus-theme-heading-1)))
-    `(outline-2 ((,class :inherit modus-theme-heading-2)))
-    `(outline-3 ((,class :inherit modus-theme-heading-3)))
-    `(outline-4 ((,class :inherit modus-theme-heading-4)))
-    `(outline-5 ((,class :inherit modus-theme-heading-5)))
-    `(outline-6 ((,class :inherit modus-theme-heading-6)))
-    `(outline-7 ((,class :inherit modus-theme-heading-7)))
-    `(outline-8 ((,class :inherit modus-theme-heading-8)))
+    `(outline-1 ((,class :inherit modus-themes-heading-1)))
+    `(outline-2 ((,class :inherit modus-themes-heading-2)))
+    `(outline-3 ((,class :inherit modus-themes-heading-3)))
+    `(outline-4 ((,class :inherit modus-themes-heading-4)))
+    `(outline-5 ((,class :inherit modus-themes-heading-5)))
+    `(outline-6 ((,class :inherit modus-themes-heading-6)))
+    `(outline-7 ((,class :inherit modus-themes-heading-7)))
+    `(outline-8 ((,class :inherit modus-themes-heading-8)))
 ;;;;; outline-minor-faces
     `(outline-minor-0 ((,class :background ,bg-alt)))
 ;;;;; package (M-x list-packages)
@@ -5538,7 +5680,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(package-status-available ((,class :foreground ,fg-special-mild)))
     `(package-status-built-in ((,class :foreground ,magenta)))
     `(package-status-dependency ((,class :foreground ,magenta-alt-other)))
-    `(package-status-disabled ((,class :inherit modus-theme-subtle-red)))
+    `(package-status-disabled ((,class :inherit modus-themes-subtle-red)))
     `(package-status-external ((,class :foreground ,cyan-alt-other)))
     `(package-status-held ((,class :foreground ,yellow-alt)))
     `(package-status-incompat ((,class :inherit bold :foreground ,yellow)))
@@ -5547,14 +5689,20 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(package-status-unsigned ((,class :inherit bold :foreground ,red-alt)))
 ;;;;; page-break-lines
     `(page-break-lines ((,class :inherit default :foreground 
,fg-window-divider-outer)))
+;;;;; pandoc-mode
+    `(pandoc-citation-key-face ((,class :background ,bg-dim :foreground 
,magenta-alt)))
+    `(pandoc-directive-@@-face ((,class :background ,bg-dim :foreground 
,blue-alt-other)))
+    `(pandoc-directive-braces-face ((,class :foreground ,blue-alt-other)))
+    `(pandoc-directive-contents-face ((,class :foreground ,cyan-alt-other)))
+    `(pandoc-directive-type-face ((,class :foreground ,magenta)))
 ;;;;; paradox
     `(paradox-archive-face ((,class :foreground ,fg-special-mild)))
     `(paradox-comment-face ((,class :inherit font-lock-comment-face)))
-    `(paradox-commit-tag-face ((,class :inherit modus-theme-refine-magenta 
:box t)))
+    `(paradox-commit-tag-face ((,class :inherit modus-themes-refine-magenta 
:box t)))
     `(paradox-description-face ((,class :foreground ,fg-special-cold)))
     `(paradox-description-face-multiline ((,class :foreground 
,fg-special-cold)))
-    `(paradox-download-face ((,class :inherit modus-theme-bold :foreground 
,blue-alt-other)))
-    `(paradox-highlight-face ((,class :inherit modus-theme-bold :foreground 
,cyan-alt-other)))
+    `(paradox-download-face ((,class :inherit modus-themes-bold :foreground 
,blue-alt-other)))
+    `(paradox-highlight-face ((,class :inherit modus-themes-bold :foreground 
,cyan-alt-other)))
     `(paradox-homepage-button-face ((,class :foreground ,magenta-alt-other 
:underline t)))
     `(paradox-mode-line-face ((,class :inherit bold :foreground ,cyan-active)))
     `(paradox-name-face ((,class :foreground ,blue :underline t)))
@@ -5563,7 +5711,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; paren-face
     `(parenthesis ((,class :foreground ,fg-unfocused)))
 ;;;;; parrot
-    `(parrot-rotate-rotation-highlight-face ((,class :inherit 
modus-theme-refine-magenta)))
+    `(parrot-rotate-rotation-highlight-face ((,class :inherit 
modus-themes-refine-magenta)))
 ;;;;; pass
     `(pass-mode-directory-face ((,class :inherit bold :foreground 
,fg-special-cold)))
     `(pass-mode-entry-face ((,class :background ,bg-main :foreground 
,fg-main)))
@@ -5573,7 +5721,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(pdf-occur-document-face ((,class :inherit shadow)))
     `(pdf-occur-page-face ((,class :inherit shadow)))
 ;;;;; persp-mode
-    `(persp-face-lighter-buffer-not-in-persp ((,class :inherit 
modus-theme-intense-red)))
+    `(persp-face-lighter-buffer-not-in-persp ((,class :inherit 
modus-themes-intense-red)))
     `(persp-face-lighter-default ((,class :inherit bold :foreground 
,blue-active)))
     `(persp-face-lighter-nil-persp ((,class :inherit bold :foreground 
,fg-active)))
 ;;;;; perspective
@@ -5582,30 +5730,30 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(phi-grep-heading-face  ((,class :inherit bold :foreground ,red-alt
                                       ,@(modus-themes--scale 
modus-themes-scale-4))))
     `(phi-grep-line-number-face ((,class :foreground ,fg-special-warm)))
-    `(phi-grep-match-face ((,class :inherit modus-theme-special-calm)))
-    `(phi-grep-modified-face ((,class :inherit modus-theme-refine-yellow)))
-    `(phi-grep-overlay-face ((,class :inherit modus-theme-refine-blue)))
+    `(phi-grep-match-face ((,class :inherit modus-themes-special-calm)))
+    `(phi-grep-modified-face ((,class :inherit modus-themes-refine-yellow)))
+    `(phi-grep-overlay-face ((,class :inherit modus-themes-refine-blue)))
 ;;;;; phi-search
-    `(phi-replace-preview-face ((,class :inherit modus-theme-intense-magenta)))
-    `(phi-search-failpart-face ((,class :inherit modus-theme-refine-red)))
-    `(phi-search-match-face ((,class :inherit modus-theme-refine-cyan)))
-    `(phi-search-selection-face ((,class :inherit (modus-theme-intense-green 
bold))))
+    `(phi-replace-preview-face ((,class :inherit 
modus-themes-intense-magenta)))
+    `(phi-search-failpart-face ((,class :inherit modus-themes-refine-red)))
+    `(phi-search-match-face ((,class :inherit modus-themes-refine-cyan)))
+    `(phi-search-selection-face ((,class :inherit (modus-themes-intense-green 
bold))))
 ;;;;; pkgbuild-mode
-    `(pkgbuild-error-face ((,class :inherit modus-theme-lang-error)))
+    `(pkgbuild-error-face ((,class :inherit modus-themes-lang-error)))
 ;;;;; pomidor
     `(pomidor-break-face ((,class :foreground ,blue-alt-other)))
     `(pomidor-overwork-face ((,class :foreground ,red-alt-other)))
-    `(pomidor-skip-face ((,class :inherit modus-theme-slant :foreground 
,fg-alt)))
+    `(pomidor-skip-face ((,class :inherit modus-themes-slant :foreground 
,fg-alt)))
     `(pomidor-work-face ((,class :foreground ,green-alt-other)))
 ;;;;; popup
     `(popup-face ((,class :background ,bg-alt :foreground ,fg-main)))
-    `(popup-isearch-match ((,class :inherit (modus-theme-refine-cyan bold))))
-    `(popup-menu-mouse-face ((,class :inherit modus-theme-intense-blue)))
-    `(popup-menu-selection-face ((,class :inherit (modus-theme-subtle-cyan 
bold))))
+    `(popup-isearch-match ((,class :inherit (modus-themes-refine-cyan bold))))
+    `(popup-menu-mouse-face ((,class :inherit modus-themes-intense-blue)))
+    `(popup-menu-selection-face ((,class :inherit (modus-themes-subtle-cyan 
bold))))
     `(popup-scroll-bar-background-face ((,class :background ,bg-active)))
     `(popup-scroll-bar-foreground-face ((,class :foreground ,fg-active)))
     `(popup-summary-face ((,class :background ,bg-active :foreground 
,fg-inactive)))
-    `(popup-tip-face ((,class :inherit modus-theme-refine-yellow)))
+    `(popup-tip-face ((,class :inherit modus-themes-refine-yellow)))
 ;;;;; powerline
     `(powerline-active0 ((,class :background ,bg-main :foreground ,blue-faint 
:inverse-video t)))
     `(powerline-active1 ((,class :background ,blue-nuanced-bg :foreground 
,blue-nuanced-fg)))
@@ -5615,16 +5763,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(powerline-inactive2 ((,class :background ,bg-inactive :foreground 
,fg-inactive)))
 ;;;;; powerline-evil
     `(powerline-evil-base-face ((,class :background ,fg-main :foreground 
,bg-main)))
-    `(powerline-evil-emacs-face ((,class :inherit modus-theme-active-magenta)))
-    `(powerline-evil-insert-face ((,class :inherit modus-theme-active-green)))
-    `(powerline-evil-motion-face ((,class :inherit modus-theme-active-blue)))
+    `(powerline-evil-emacs-face ((,class :inherit 
modus-themes-active-magenta)))
+    `(powerline-evil-insert-face ((,class :inherit modus-themes-active-green)))
+    `(powerline-evil-motion-face ((,class :inherit modus-themes-active-blue)))
     `(powerline-evil-normal-face ((,class :background ,fg-alt :foreground 
,bg-main)))
-    `(powerline-evil-operator-face ((,class :inherit 
modus-theme-active-yellow)))
-    `(powerline-evil-replace-face ((,class :inherit modus-theme-active-red)))
-    `(powerline-evil-visual-face ((,class :inherit modus-theme-active-cyan)))
+    `(powerline-evil-operator-face ((,class :inherit 
modus-themes-active-yellow)))
+    `(powerline-evil-replace-face ((,class :inherit modus-themes-active-red)))
+    `(powerline-evil-visual-face ((,class :inherit modus-themes-active-cyan)))
 ;;;;; proced
-    `(proced-mark ((,class :inherit modus-theme-mark-symbol)))
-    `(proced-marked ((,class :inherit modus-theme-mark-alt)))
+    `(proced-mark ((,class :inherit modus-themes-mark-symbol)))
+    `(proced-marked ((,class :inherit modus-themes-mark-alt)))
     `(proced-sort-header ((,class :inherit bold :foreground ,fg-special-calm 
:underline t)))
 ;;;;; prodigy
     `(prodigy-green-face ((,class :foreground ,green)))
@@ -5635,19 +5783,19 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(quick-peek-border-face ((,class :background ,fg-window-divider-inner 
:height 1)))
     `(quick-peek-padding-face ((,class :background ,bg-alt :height 0.15)))
 ;;;;; racket-mode
-    `(racket-debug-break-face ((,class :inherit modus-theme-intense-red)))
+    `(racket-debug-break-face ((,class :inherit modus-themes-intense-red)))
     `(racket-debug-locals-face ((,class :box (:line-width -1 :color nil)
                                         :foreground ,green-alt-other)))
     `(racket-debug-result-face ((,class :inherit bold :box (:line-width -1 
:color nil)
                                         :foreground ,green)))
     `(racket-here-string-face ((,class :foreground ,blue-alt)))
     `(racket-keyword-argument-face ((,class :foreground ,red-alt)))
-    `(racket-logger-config-face ((,class :inherit modus-theme-slant 
:foreground ,fg-alt)))
+    `(racket-logger-config-face ((,class :inherit modus-themes-slant 
:foreground ,fg-alt)))
     `(racket-logger-debug-face ((,class :foreground ,blue-alt-other)))
     `(racket-logger-info-face ((,class :foreground ,fg-lang-note)))
-    `(racket-logger-topic-face ((,class :inherit modus-theme-slant :foreground 
,magenta)))
+    `(racket-logger-topic-face ((,class :inherit modus-themes-slant 
:foreground ,magenta)))
     `(racket-selfeval-face ((,class :foreground ,green-alt)))
-    `(racket-xp-error-face ((,class :inherit modus-theme-lang-error)))
+    `(racket-xp-error-face ((,class :inherit modus-themes-lang-error)))
 ;;;;; rainbow-blocks
     `(rainbow-blocks-depth-1-face ((,class :foreground ,magenta-alt-other)))
     `(rainbow-blocks-depth-2-face ((,class :foreground ,blue)))
@@ -5687,8 +5835,8 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(rainbow-delimiters-depth-7-face ((,class :foreground ,red-intense)))
     `(rainbow-delimiters-depth-8-face ((,class :foreground ,blue-intense)))
     `(rainbow-delimiters-depth-9-face ((,class :foreground ,yellow-intense)))
-    `(rainbow-delimiters-mismatched-face ((,class :inherit (bold 
modus-theme-refine-yellow))))
-    `(rainbow-delimiters-unmatched-face ((,class :inherit (bold 
modus-theme-refine-red))))
+    `(rainbow-delimiters-mismatched-face ((,class :inherit (bold 
modus-themes-refine-yellow))))
+    `(rainbow-delimiters-unmatched-face ((,class :inherit (bold 
modus-themes-refine-red))))
 ;;;;; rcirc
     `(rcirc-bright-nick ((,class :inherit bold :foreground ,magenta-alt)))
     `(rcirc-dim-nick ((,class :inherit shadow)))
@@ -5696,7 +5844,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(rcirc-nick-in-message ((,class :foreground ,magenta-alt-other)))
     `(rcirc-nick-in-message-full-line ((,class :inherit bold :foreground 
,fg-special-mild)))
     `(rcirc-other-nick ((,class :inherit bold :foreground ,fg-special-cold)))
-    `(rcirc-prompt ((,class :inherit bold :foreground ,cyan-alt-other)))
+    `(rcirc-prompt ((,class :inherit comint-highlight-prompt)))
     `(rcirc-server ((,class :foreground ,fg-unfocused)))
     `(rcirc-timestamp ((,class :foreground ,blue-nuanced-fg)))
     `(rcirc-url ((,class :foreground ,blue :underline t)))
@@ -5704,10 +5852,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(recursion-indicator-general ((,class :foreground ,blue-active)))
     `(recursion-indicator-minibuffer ((,class :foreground ,red-active)))
 ;;;;; regexp-builder (re-builder)
-    `(reb-match-0 ((,class :inherit modus-theme-refine-cyan)))
-    `(reb-match-1 ((,class :inherit modus-theme-subtle-magenta)))
-    `(reb-match-2 ((,class :inherit modus-theme-subtle-green)))
-    `(reb-match-3 ((,class :inherit modus-theme-refine-yellow)))
+    `(reb-match-0 ((,class :inherit modus-themes-refine-cyan)))
+    `(reb-match-1 ((,class :inherit modus-themes-subtle-magenta)))
+    `(reb-match-2 ((,class :inherit modus-themes-subtle-green)))
+    `(reb-match-3 ((,class :inherit modus-themes-refine-yellow)))
     `(reb-regexp-grouping-backslash ((,class :inherit 
font-lock-regexp-grouping-backslash)))
     `(reb-regexp-grouping-construct ((,class :inherit 
font-lock-regexp-grouping-construct)))
 ;;;;; rg (rg.el)
@@ -5718,7 +5866,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(rg-filename-face ((,class :inherit bold :foreground ,fg-special-cold)))
     `(rg-line-number-face ((,class :foreground ,fg-special-warm)))
     `(rg-literal-face ((,class :foreground ,blue-alt)))
-    `(rg-match-face ((,class :inherit modus-theme-special-calm)))
+    `(rg-match-face ((,class :inherit modus-themes-special-calm)))
     `(rg-regexp-face ((,class :foreground ,magenta-active)))
     `(rg-toggle-off-face ((,class :inherit bold :foreground ,fg-inactive)))
     `(rg-toggle-on-face ((,class :inherit bold :foreground ,cyan-active)))
@@ -5727,7 +5875,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(ripgrep-context-face ((,class :foreground ,fg-unfocused)))
     `(ripgrep-error-face ((,class :inherit bold :foreground ,red)))
     `(ripgrep-hit-face ((,class :foreground ,cyan)))
-    `(ripgrep-match-face ((,class :inherit modus-theme-special-calm)))
+    `(ripgrep-match-face ((,class :inherit modus-themes-special-calm)))
 ;;;;; rmail
     `(rmail-header-name ((,class :foreground ,cyan-alt-other)))
     `(rmail-highlight ((,class :inherit bold :foreground ,magenta-alt)))
@@ -5753,29 +5901,30 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(sallet-buffer-size ((,class :foreground ,fg-special-calm)))
     `(sallet-buffer-special ((,class :foreground ,magenta-alt-other)))
     `(sallet-flx-match ((,class ,@(modus-themes--extra-completions
-                                   'modus-theme-subtle-cyan
-                                   'modus-theme-refine-cyan
-                                   'modus-theme-nuanced-cyan
+                                   'modus-themes-subtle-cyan
+                                   'modus-themes-refine-cyan
+                                   'modus-themes-nuanced-cyan
                                    cyan-alt-other))))
     `(sallet-recentf-buffer-name ((,class :foreground ,blue-nuanced-fg)))
     `(sallet-recentf-file-path ((,class :foreground ,fg-special-mild)))
     `(sallet-regexp-match ((,class ,@(modus-themes--extra-completions
-                                      'modus-theme-subtle-magenta
-                                      'modus-theme-refine-magenta
-                                      'modus-theme-nuanced-magenta
+                                      'modus-themes-subtle-magenta
+                                      'modus-themes-refine-magenta
+                                      'modus-themes-nuanced-magenta
                                       magenta-alt-other))))
     `(sallet-source-header ((,class :inherit bold :foreground ,red-alt
                                     ,@(modus-themes--scale 
modus-themes-scale-4))))
     `(sallet-substring-match ((,class ,@(modus-themes--extra-completions
-                                         'modus-theme-subtle-blue
-                                         'modus-theme-refine-blue
-                                         'modus-theme-nuanced-blue
+                                         'modus-themes-subtle-blue
+                                         'modus-themes-refine-blue
+                                         'modus-themes-nuanced-blue
                                          blue-alt-other))))
 ;;;;; selectrum
-;; NOTE 2021-02-22: The `selectrum-primary-highlight' and
-;; `selectrum-secondary-highlight' are deprecated upstream in favour of
-;; their selectrum-prescient counterparts.  We shall remove those faces
-;; from the themes once we are certain that they are no longer relevant.
+    ;; NOTE 2021-02-22: The `selectrum-primary-highlight' and
+    ;; `selectrum-secondary-highlight' are deprecated upstream in favour
+    ;; of their selectrum-prescient counterparts.  We shall remove those
+    ;; faces from the themes once we are certain that they are no longer
+    ;; relevant.
     `(selectrum-current-candidate
       ((,class :inherit bold :foreground ,fg-main
                :background ,@(pcase modus-themes-completions
@@ -5791,6 +5940,10 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                ,@(modus-themes--standard-completions
                   cyan-alt-other cyan-nuanced-bg
                   cyan-refine-bg cyan-refine-fg))))
+    `(selectrum-quick-keys-highlight
+      ((,class :inherit modus-themes-refine-red)))
+    `(selectrum-quick-keys-match
+      ((,class :inherit (bold modus-themes-intense-green))))
 ;;;;; selectrum-prescient
     `(selectrum-prescient-primary-highlight
       ((,class :inherit bold
@@ -5804,40 +5957,37 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                   cyan-refine-bg cyan-refine-fg))))
 ;;;;; semantic
     `(semantic-complete-inline-face ((,class :foreground ,fg-special-warm 
:underline t)))
-    `(semantic-decoration-on-fileless-includes ((,class :inherit 
modus-theme-refine-green)))
-    `(semantic-decoration-on-private-members-face ((,class :inherit 
modus-theme-refine-cyan)))
+    `(semantic-decoration-on-fileless-includes ((,class :inherit 
modus-themes-refine-green)))
+    `(semantic-decoration-on-private-members-face ((,class :inherit 
modus-themes-refine-cyan)))
     `(semantic-decoration-on-protected-members-face ((,class :background 
,bg-dim)))
-    `(semantic-decoration-on-unknown-includes ((,class :inherit 
modus-theme-refine-red)))
-    `(semantic-decoration-on-unparsed-includes ((,class :inherit 
modus-theme-refine-yellow)))
+    `(semantic-decoration-on-unknown-includes ((,class :inherit 
modus-themes-refine-red)))
+    `(semantic-decoration-on-unparsed-includes ((,class :inherit 
modus-themes-refine-yellow)))
     `(semantic-highlight-edits-face ((,class :background ,bg-alt)))
     `(semantic-highlight-func-current-tag-face ((,class :background ,bg-alt)))
-    `(semantic-idle-symbol-highlight ((,class :inherit 
modus-theme-special-mild)))
+    `(semantic-idle-symbol-highlight ((,class :inherit 
modus-themes-special-mild)))
     `(semantic-tag-boundary-face ((,class :overline ,blue-intense)))
     `(semantic-unmatched-syntax-face ((,class :underline ,fg-lang-error)))
 ;;;;; sesman
     `(sesman-browser-button-face ((,class :foreground ,blue-alt-other 
:underline t)))
-    `(sesman-browser-highligh-face ((,class :inherit modus-theme-subtle-blue)))
+    `(sesman-browser-highligh-face ((,class :inherit 
modus-themes-subtle-blue)))
     `(sesman-buffer-face ((,class :foreground ,magenta)))
     `(sesman-directory-face ((,class :inherit bold :foreground ,blue)))
     `(sesman-project-face ((,class :inherit bold :foreground 
,magenta-alt-other)))
 ;;;;; shell-script-mode
     `(sh-heredoc ((,class :foreground ,blue-alt)))
-    `(sh-quoted-exec ((,class :inherit modus-theme-bold :foreground 
,magenta-alt)))
+    `(sh-quoted-exec ((,class :inherit modus-themes-bold :foreground 
,magenta-alt)))
 ;;;;; shortdoc
-    `(shortdoc-heading ((,class :inherit modus-theme-pseudo-header)))
+    `(shortdoc-heading ((,class :inherit modus-themes-pseudo-header)))
     `(shortdoc-section (())) ; remove the default's variable-pitch style
 ;;;;; show-paren-mode
     `(show-paren-match ((,class ,@(modus-themes--paren bg-paren-match
                                                        bg-paren-match-intense)
                                 :foreground ,fg-main)))
-    `(show-paren-match-expression ((,class :inherit modus-theme-special-calm)))
-    `(show-paren-mismatch ((,class :inherit modus-theme-intense-red)))
+    `(show-paren-match-expression ((,class :inherit 
modus-themes-special-calm)))
+    `(show-paren-mismatch ((,class :inherit modus-themes-intense-red)))
 ;;;;; shr
-    `(shr-abbreviation
-      ((,(append '((supports :underline (:style wave))) class)
-        :foreground ,fg-docstring :underline (:color ,fg-alt :style wave))
-       (,class :foreground ,fg-docstring :underline t)))
-    `(shr-selected-link ((,class :inherit modus-theme-subtle-cyan)))
+    `(shr-abbreviation ((,class :inherit modus-themes-lang-note)))
+    `(shr-selected-link ((,class :inherit modus-themes-subtle-red)))
 ;;;;; side-notes
     `(side-notes ((,class :background ,bg-dim :foreground ,fg-dim)))
 ;;;;; sieve-mode
@@ -5862,94 +6012,94 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(sml/name-filling ((,class :foreground ,yellow-active)))
     `(sml/not-modified ((,class :inherit sml/global)))
     `(sml/numbers-separator ((,class :inherit sml/global)))
-    `(sml/outside-modified ((,class :inherit modus-theme-intense-red)))
+    `(sml/outside-modified ((,class :inherit modus-themes-intense-red)))
     `(sml/position-percentage ((,class :inherit sml/global)))
     `(sml/prefix ((,class :foreground ,green-active)))
     `(sml/process ((,class :inherit sml/prefix)))
     `(sml/projectile ((,class :inherit sml/git)))
     `(sml/read-only ((,class :inherit bold :foreground ,cyan-active)))
     `(sml/remote ((,class :inherit sml/global)))
-    `(sml/sudo ((,class :inherit modus-theme-subtle-red)))
+    `(sml/sudo ((,class :inherit modus-themes-subtle-red)))
     `(sml/time ((,class :inherit sml/global)))
     `(sml/vc ((,class :inherit sml/git)))
     `(sml/vc-edited ((,class :inherit bold :foreground ,yellow-active)))
 ;;;;; smartparens
-    `(sp-pair-overlay-face ((,class :inherit modus-theme-special-warm)))
-    `(sp-show-pair-enclosing ((,class :inherit modus-theme-special-mild)))
+    `(sp-pair-overlay-face ((,class :inherit modus-themes-special-warm)))
+    `(sp-show-pair-enclosing ((,class :inherit modus-themes-special-mild)))
     `(sp-show-pair-match-face ((,class ,@(modus-themes--paren bg-paren-match
                                                               
bg-paren-match-intense)
                                        :foreground ,fg-main)))
-    `(sp-show-pair-mismatch-face ((,class :inherit modus-theme-intense-red)))
+    `(sp-show-pair-mismatch-face ((,class :inherit modus-themes-intense-red)))
     `(sp-wrap-overlay-closing-pair ((,class :inherit sp-pair-overlay-face)))
     `(sp-wrap-overlay-face ((,class :inherit sp-pair-overlay-face)))
     `(sp-wrap-overlay-opening-pair ((,class :inherit sp-pair-overlay-face)))
     `(sp-wrap-tag-overlay-face ((,class :inherit sp-pair-overlay-face)))
 ;;;;; smerge
-    `(smerge-base ((,class :inherit modus-theme-diff-changed)))
-    `(smerge-lower ((,class :inherit modus-theme-diff-added)))
-    `(smerge-markers ((,class :background ,bg-diff-neutral-2 :foreground 
,fg-diff-neutral-2)))
-    `(smerge-refined-added ((,class :inherit modus-theme-diff-refine-added)))
+    `(smerge-base ((,class :inherit modus-themes-diff-changed)))
+    `(smerge-lower ((,class :inherit modus-themes-diff-added)))
+    `(smerge-markers ((,class :inherit modus-themes-diff-heading)))
+    `(smerge-refined-added ((,class :inherit modus-themes-diff-refine-added)))
     `(smerge-refined-changed (()))
-    `(smerge-refined-removed ((,class :inherit 
modus-theme-diff-refine-removed)))
-    `(smerge-upper ((,class :inherit modus-theme-diff-removed)))
+    `(smerge-refined-removed ((,class :inherit 
modus-themes-diff-refine-removed)))
+    `(smerge-upper ((,class :inherit modus-themes-diff-removed)))
 ;;;;; solaire
     `(solaire-default-face ((,class :inherit default :background ,bg-alt 
:foreground ,fg-dim)))
     `(solaire-line-number-face ((,class :inherit solaire-default-face 
:foreground ,fg-unfocused)))
     `(solaire-hl-line-face ((,class :background ,bg-active)))
     `(solaire-org-hide-face ((,class :background ,bg-alt :foreground ,bg-alt)))
 ;;;;; spaceline
-    `(spaceline-evil-emacs ((,class :inherit modus-theme-active-magenta)))
-    `(spaceline-evil-insert ((,class :inherit modus-theme-active-green)))
-    `(spaceline-evil-motion ((,class :inherit modus-theme-active-blue)))
+    `(spaceline-evil-emacs ((,class :inherit modus-themes-active-magenta)))
+    `(spaceline-evil-insert ((,class :inherit modus-themes-active-green)))
+    `(spaceline-evil-motion ((,class :inherit modus-themes-active-blue)))
     `(spaceline-evil-normal ((,class :background ,fg-alt :foreground ,bg-alt)))
-    `(spaceline-evil-replace ((,class :inherit modus-theme-active-red)))
-    `(spaceline-evil-visual ((,class :inherit modus-theme-active-cyan)))
+    `(spaceline-evil-replace ((,class :inherit modus-themes-active-red)))
+    `(spaceline-evil-visual ((,class :inherit modus-themes-active-cyan)))
     `(spaceline-flycheck-error ((,class :foreground ,red-active)))
     `(spaceline-flycheck-info ((,class :foreground ,cyan-active)))
     `(spaceline-flycheck-warning ((,class :foreground ,yellow-active)))
-    `(spaceline-highlight-face ((,class :inherit modus-theme-fringe-blue)))
-    `(spaceline-modified ((,class :inherit modus-theme-fringe-magenta)))
+    `(spaceline-highlight-face ((,class :inherit modus-themes-fringe-blue)))
+    `(spaceline-modified ((,class :inherit modus-themes-fringe-magenta)))
     `(spaceline-python-venv ((,class :foreground ,magenta-active)))
-    `(spaceline-read-only ((,class :inherit modus-theme-fringe-red)))
-    `(spaceline-unmodified ((,class :inherit modus-theme-fringe-cyan)))
+    `(spaceline-read-only ((,class :inherit modus-themes-fringe-red)))
+    `(spaceline-unmodified ((,class :inherit modus-themes-fringe-cyan)))
 ;;;;; speedbar
     `(speedbar-button-face ((,class :inherit button)))
     `(speedbar-directory-face ((,class :inherit bold :foreground ,blue)))
     `(speedbar-file-face ((,class :foreground ,fg-main)))
-    `(speedbar-highlight-face ((,class :inherit modus-theme-subtle-blue)))
+    `(speedbar-highlight-face ((,class :inherit modus-themes-subtle-blue)))
     `(speedbar-selected-face ((,class :inherit bold :foreground ,cyan)))
-    `(speedbar-separator-face ((,class :inherit modus-theme-intense-neutral)))
+    `(speedbar-separator-face ((,class :inherit modus-themes-intense-neutral)))
     `(speedbar-tag-face ((,class :foreground ,yellow-alt-other)))
 ;;;;; spell-fu
-    `(spell-fu-incorrect-face ((,class :inherit modus-theme-lang-error)))
+    `(spell-fu-incorrect-face ((,class :inherit modus-themes-lang-error)))
 ;;;;; spray
     `(spray-accent-face ((,class :foreground ,red-intense)))
     `(spray-base-face ((,class :inherit default :foreground ,fg-special-cold)))
 ;;;;; stripes
-    `(stripes ((,class :inherit modus-theme-hl-line)))
+    `(stripes ((,class :inherit modus-themes-hl-line)))
 ;;;;; success
     `(suggest-heading ((,class :inherit bold :foreground ,yellow-alt-other)))
 ;;;;; switch-window
     `(switch-window-background ((,class :background ,bg-dim)))
     `(switch-window-label ((,class :height 3.0 :foreground ,blue-intense)))
 ;;;;; swiper
-    `(swiper-background-match-face-1 ((,class :inherit 
modus-theme-subtle-neutral)))
-    `(swiper-background-match-face-2 ((,class :inherit 
modus-theme-refine-cyan)))
-    `(swiper-background-match-face-3 ((,class :inherit 
modus-theme-refine-magenta)))
-    `(swiper-background-match-face-4 ((,class :inherit 
modus-theme-refine-yellow)))
-    `(swiper-line-face ((,class :inherit modus-theme-special-cold)))
-    `(swiper-match-face-1 ((,class :inherit (bold 
modus-theme-intense-neutral))))
-    `(swiper-match-face-2 ((,class :inherit (bold modus-theme-intense-green))))
-    `(swiper-match-face-3 ((,class :inherit (bold modus-theme-intense-blue))))
-    `(swiper-match-face-4 ((,class :inherit (bold modus-theme-intense-red))))
+    `(swiper-background-match-face-1 ((,class :inherit 
modus-themes-subtle-neutral)))
+    `(swiper-background-match-face-2 ((,class :inherit 
modus-themes-refine-cyan)))
+    `(swiper-background-match-face-3 ((,class :inherit 
modus-themes-refine-magenta)))
+    `(swiper-background-match-face-4 ((,class :inherit 
modus-themes-refine-yellow)))
+    `(swiper-line-face ((,class :inherit modus-themes-special-cold)))
+    `(swiper-match-face-1 ((,class :inherit (bold 
modus-themes-intense-neutral))))
+    `(swiper-match-face-2 ((,class :inherit (bold 
modus-themes-intense-green))))
+    `(swiper-match-face-3 ((,class :inherit (bold modus-themes-intense-blue))))
+    `(swiper-match-face-4 ((,class :inherit (bold modus-themes-intense-red))))
 ;;;;; swoop
     `(swoop-face-header-format-line ((,class :inherit bold :foreground ,red-alt
                                              ,@(modus-themes--scale 
modus-themes-scale-3))))
     `(swoop-face-line-buffer-name ((,class :inherit bold :foreground ,blue-alt
                                            ,@(modus-themes--scale 
modus-themes-scale-4))))
     `(swoop-face-line-number ((,class :foreground ,fg-special-warm)))
-    `(swoop-face-target-line ((,class :inherit modus-theme-intense-blue 
:extend t)))
-    `(swoop-face-target-words ((,class :inherit modus-theme-refine-cyan)))
+    `(swoop-face-target-line ((,class :inherit modus-themes-intense-blue 
:extend t)))
+    `(swoop-face-target-words ((,class :inherit modus-themes-refine-cyan)))
 ;;;;; sx
     `(sx-inbox-item-type ((,class :foreground ,magenta-alt-other)))
     `(sx-inbox-item-type-unread ((,class :inherit (sx-inbox-item-type bold))))
@@ -5964,7 +6114,7 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(sx-question-list-score-upvoted ((,class :inherit (sx-question-list-score 
bold))))
     `(sx-question-list-unread-question ((,class :inherit bold :foreground 
,fg-main)))
     `(sx-question-mode-accepted ((,class :inherit bold :height 1.3 :foreground 
,green)))
-    `(sx-question-mode-closed ((,class :inherit modus-theme-active-yellow :box 
(:line-width 2 :color nil))))
+    `(sx-question-mode-closed ((,class :inherit modus-themes-active-yellow 
:box (:line-width 2 :color nil))))
     `(sx-question-mode-closed-reason ((,class :box (:line-width 2 :color nil) 
:foreground ,fg-main)))
     `(sx-question-mode-content-face ((,class :background ,bg-dim)))
     `(sx-question-mode-date ((,class :foreground ,blue)))
@@ -5979,15 +6129,15 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(sx-user-name ((,class :foreground ,blue-alt)))
     `(sx-user-reputation ((,class :inherit shadow)))
 ;;;;; symbol-overlay
-    `(symbol-overlay-default-face ((,class :inherit modus-theme-special-warm)))
-    `(symbol-overlay-face-1 ((,class :inherit modus-theme-intense-blue)))
-    `(symbol-overlay-face-2 ((,class :inherit modus-theme-refine-magenta)))
-    `(symbol-overlay-face-3 ((,class :inherit modus-theme-intense-yellow)))
-    `(symbol-overlay-face-4 ((,class :inherit modus-theme-intense-magenta)))
-    `(symbol-overlay-face-5 ((,class :inherit modus-theme-intense-red)))
-    `(symbol-overlay-face-6 ((,class :inherit modus-theme-refine-red)))
-    `(symbol-overlay-face-7 ((,class :inherit modus-theme-intense-cyan)))
-    `(symbol-overlay-face-8 ((,class :inherit modus-theme-refine-cyan)))
+    `(symbol-overlay-default-face ((,class :inherit 
modus-themes-special-warm)))
+    `(symbol-overlay-face-1 ((,class :inherit modus-themes-intense-blue)))
+    `(symbol-overlay-face-2 ((,class :inherit modus-themes-refine-magenta)))
+    `(symbol-overlay-face-3 ((,class :inherit modus-themes-intense-yellow)))
+    `(symbol-overlay-face-4 ((,class :inherit modus-themes-intense-magenta)))
+    `(symbol-overlay-face-5 ((,class :inherit modus-themes-intense-red)))
+    `(symbol-overlay-face-6 ((,class :inherit modus-themes-refine-red)))
+    `(symbol-overlay-face-7 ((,class :inherit modus-themes-intense-cyan)))
+    `(symbol-overlay-face-8 ((,class :inherit modus-themes-refine-cyan)))
 ;;;;; syslog-mode
     `(syslog-debug ((,class :inherit bold :foreground ,cyan-alt-other)))
     `(syslog-error ((,class :inherit bold :foreground ,red)))
@@ -5998,6 +6148,23 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(syslog-ip ((,class :inherit bold :foreground ,fg-special-mild :underline 
t)))
     `(syslog-su ((,class :inherit bold :foreground ,red-alt)))
     `(syslog-warn ((,class :inherit bold :foreground ,yellow)))
+;;;;; tab-bar-groups
+    `(tab-bar-groups-1 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,blue-tab)))
+    `(tab-bar-groups-1-group-name ((,class :inherit tab-bar-groups-1 
:inverse-video t)))
+    `(tab-bar-groups-2 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,red-tab)))
+    `(tab-bar-groups-2-group-name ((,class :inherit tab-bar-groups-2 
:inverse-video t)))
+    `(tab-bar-groups-3 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,green-tab)))
+    `(tab-bar-groups-3-group-name ((,class :inherit tab-bar-groups-3 
:inverse-video t)))
+    `(tab-bar-groups-4 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,orange-tab)))
+    `(tab-bar-groups-4-group-name ((,class :inherit tab-bar-groups-4 
:inverse-video t)))
+    `(tab-bar-groups-5 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,purple-tab)))
+    `(tab-bar-groups-5-group-name ((,class :inherit tab-bar-groups-5 
:inverse-video t)))
+    `(tab-bar-groups-6 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,cyan-tab)))
+    `(tab-bar-groups-6-group-name ((,class :inherit tab-bar-groups-6 
:inverse-video t)))
+    `(tab-bar-groups-7 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,yellow-tab)))
+    `(tab-bar-groups-7-group-name ((,class :inherit tab-bar-groups-7 
:inverse-video t)))
+    `(tab-bar-groups-8 ((,class ,@(modus-themes--variable-pitch-ui) 
:foreground ,magenta-tab)))
+    `(tab-bar-groups-8-group-name ((,class :inherit tab-bar-groups-8 
:inverse-video t)))
 ;;;;; tab-bar-mode
     `(tab-bar ((,class ,@(modus-themes--variable-pitch-ui)
                        :background ,bg-tab-bar :foreground ,fg-main)))
@@ -6019,6 +6186,30 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
                                                :background 
,bg-tab-inactive-alt :foreground ,fg-main)))
 ;;;;; table (built-in table.el)
     `(table-cell ((,class :background ,blue-nuanced-bg)))
+;;;;; telega
+    ;; FIXME 2021-03-28: Some aspects of `telega' are not fully
+    ;; supported or have not been tested thoroughly.  Please understand
+    ;; that I do not use that service because it requires a smartphone
+    ;; and I have none.  Help with testing is appreciated.
+    `(telega-button ((,class :box t :foreground ,blue)))
+    `(telega-button-active ((,class :box ,blue-intense-bg :background 
,blue-intense-bg :foreground ,fg-main)))
+    `(telega-button-highlight ((,class :inherit modus-themes-subtle-magenta)))
+    `(telega-chat-prompt ((,class :inherit bold)))
+    `(telega-entity-type-code ((,class :inherit fixed-pitch)))
+    `(telega-entity-type-mention ((,class :foreground ,cyan)))
+    `(telega-entity-type-pre ((,class :inherit fixed-pitch)))
+    `(telega-msg-heading ((,class :background ,bg-alt)))
+    `(telega-msg-self-title ((,class :inherit bold)))
+    `(telega-root-heading ((,class :inherit modus-themes-subtle-neutral)))
+    `(telega-secret-title ((,class :foreground ,magenta-alt)))
+    `(telega-unmuted-count ((,class :foreground ,blue-alt-other)))
+    `(telega-user-online-status ((,class :foreground ,cyan-active)))
+    `(telega-username ((,class :foreground ,cyan-alt-other)))
+    `(telega-webpage-chat-link ((,class :background ,bg-alt)))
+    `(telega-webpage-fixed ((,class :inherit fixed-pitch :height 0.85)))
+    `(telega-webpage-header ((,class :inherit modus-themes-variable-pitch 
:height 1.3)))
+    `(telega-webpage-preformatted ((,class :inherit fixed-pitch :background 
,bg-alt)))
+    `(telega-webpage-subheader ((,class :inherit modus-themes-variable-pitch 
:height 1.15)))
 ;;;;; telephone-line
     `(telephone-line-accent-active ((,class :background ,fg-inactive 
:foreground ,bg-inactive)))
     `(telephone-line-accent-inactive ((,class :background ,bg-active 
:foreground ,fg-active)))
@@ -6058,16 +6249,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(tomatinho-pause-face ((,class :foreground ,yellow-intense)))
     `(tomatinho-reset-face ((,class :inherit shadow)))
 ;;;;; transient
-    `(transient-active-infix ((,class :inherit modus-theme-special-mild)))
+    `(transient-active-infix ((,class :inherit modus-themes-special-mild)))
     `(transient-amaranth ((,class :inherit bold :foreground ,yellow)))
     `(transient-argument ((,class :inherit bold :foreground ,red-alt)))
     `(transient-blue ((,class :inherit bold :foreground ,blue)))
-    `(transient-disabled-suffix ((,class :inherit modus-theme-intense-red)))
-    `(transient-enabled-suffix ((,class :inherit modus-theme-intense-green)))
+    `(transient-disabled-suffix ((,class :inherit modus-themes-intense-red)))
+    `(transient-enabled-suffix ((,class :inherit modus-themes-intense-green)))
     `(transient-heading ((,class :inherit bold :foreground ,fg-main)))
     `(transient-inactive-argument ((,class :inherit shadow)))
     `(transient-inactive-value ((,class :inherit shadow)))
-    `(transient-key ((,class :inherit bold :foreground ,blue)))
+    `(transient-key ((,class :inherit modus-themes-key-binding)))
     `(transient-mismatched-key ((,class :underline t)))
     `(transient-nonstandard-key ((,class :underline t)))
     `(transient-pink ((,class :inherit bold :foreground ,magenta)))
@@ -6077,11 +6268,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(transient-unreachable-key ((,class :foreground ,fg-unfocused)))
     `(transient-value ((,class :inherit bold :foreground ,magenta-alt-other)))
 ;;;;; trashed
-    `(trashed-deleted ((,class :inherit modus-theme-mark-del)))
+    `(trashed-deleted ((,class :inherit modus-themes-mark-del)))
     `(trashed-directory ((,class :foreground ,blue)))
-    `(trashed-mark ((,class :inherit modus-theme-mark-symbol)))
-    `(trashed-marked ((,class :inherit modus-theme-mark-alt)))
-    `(trashed-restored ((,class :inherit modus-theme-mark-sel)))
+    `(trashed-mark ((,class :inherit modus-themes-mark-symbol)))
+    `(trashed-marked ((,class :inherit modus-themes-mark-alt)))
+    `(trashed-restored ((,class :inherit modus-themes-mark-sel)))
     `(trashed-symlink ((,class :inherit button
                                ,@(modus-themes--link-color
                                   cyan-alt cyan-alt-faint))))
@@ -6091,16 +6282,16 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(treemacs-file-face ((,class :foreground ,fg-main)))
     `(treemacs-fringe-indicator-face ((,class :foreground ,fg-main)))
     `(treemacs-git-added-face ((,class :foreground ,green-intense)))
-    `(treemacs-git-conflict-face ((,class :inherit (modus-theme-intense-red 
bold))))
+    `(treemacs-git-conflict-face ((,class :inherit (modus-themes-intense-red 
bold))))
     `(treemacs-git-ignored-face ((,class :inherit shadow)))
     `(treemacs-git-modified-face ((,class :foreground ,yellow-alt-other)))
     `(treemacs-git-renamed-face ((,class :foreground ,cyan-alt-other)))
     `(treemacs-git-unmodified-face ((,class :foreground ,fg-main)))
     `(treemacs-git-untracked-face ((,class :foreground ,red-alt-other)))
-    `(treemacs-help-column-face ((,class :inherit modus-theme-bold :foreground 
,magenta-alt-other :underline t)))
+    `(treemacs-help-column-face ((,class :inherit modus-themes-bold 
:foreground ,magenta-alt-other :underline t)))
     `(treemacs-help-title-face ((,class :foreground ,blue-alt-other)))
-    `(treemacs-on-failure-pulse-face ((,class :inherit 
modus-theme-intense-red)))
-    `(treemacs-on-success-pulse-face ((,class :inherit 
modus-theme-intense-green)))
+    `(treemacs-on-failure-pulse-face ((,class :inherit 
modus-themes-intense-red)))
+    `(treemacs-on-success-pulse-face ((,class :inherit 
modus-themes-intense-green)))
     `(treemacs-root-face ((,class :inherit bold :foreground ,blue-alt-other 
:height 1.2 :underline t)))
     `(treemacs-root-remote-disconnected-face ((,class :inherit 
treemacs-root-remote-face :foreground ,yellow)))
     `(treemacs-root-remote-face ((,class :inherit treemacs-root-face 
:foreground ,magenta)))
@@ -6111,17 +6302,17 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;;; tty-menu
     `(tty-menu-disabled-face ((,class :background ,bg-alt :foreground 
,fg-alt)))
     `(tty-menu-enabled-face ((,class :inherit bold :background ,bg-alt 
:foreground ,fg-main)))
-    `(tty-menu-selected-face ((,class :inherit modus-theme-intense-blue)))
+    `(tty-menu-selected-face ((,class :inherit modus-themes-intense-blue)))
 ;;;;; tuareg
-    `(caml-types-def-face ((,class :inherit modus-theme-subtle-red)))
-    `(caml-types-expr-face ((,class :inherit modus-theme-subtle-green)))
-    `(caml-types-occ-face ((,class :inherit modus-theme-subtle-green)))
-    `(caml-types-scope-face ((,class :inherit modus-theme-subtle-blue)))
-    `(caml-types-typed-face ((,class :inherit modus-theme-subtle-magenta)))
+    `(caml-types-def-face ((,class :inherit modus-themes-subtle-red)))
+    `(caml-types-expr-face ((,class :inherit modus-themes-subtle-green)))
+    `(caml-types-occ-face ((,class :inherit modus-themes-subtle-green)))
+    `(caml-types-scope-face ((,class :inherit modus-themes-subtle-blue)))
+    `(caml-types-typed-face ((,class :inherit modus-themes-subtle-magenta)))
     `(tuareg-font-double-semicolon-face ((,class :inherit 
font-lock-preprocessor-face)))
     `(tuareg-font-lock-attribute-face ((,class :inherit 
font-lock-function-name-face)))
     `(tuareg-font-lock-constructor-face ((,class :foreground ,fg-main)))
-    `(tuareg-font-lock-error-face ((,class :inherit (modus-theme-intense-red 
bold))))
+    `(tuareg-font-lock-error-face ((,class :inherit (modus-themes-intense-red 
bold))))
     `(tuareg-font-lock-extension-node-face ((,class :background ,bg-alt 
:foreground ,magenta)))
     `(tuareg-font-lock-governing-face ((,class :inherit bold :foreground 
,fg-main)))
     `(tuareg-font-lock-infix-extension-node-face ((,class :inherit 
font-lock-function-name-face)))
@@ -6136,9 +6327,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(tuareg-opam-error-face ((,class :inherit error)))
     `(tuareg-opam-pkg-variable-name-face ((,class :inherit 
font-lock-variable-name-face)))
 ;;;;; typescript
-    `(typescript-jsdoc-tag ((,class :inherit modus-theme-slant :foreground 
,fg-special-mild)))
-    `(typescript-jsdoc-type ((,class :inherit modus-theme-slant :foreground 
,fg-special-calm)))
-    `(typescript-jsdoc-value ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
+    `(typescript-jsdoc-tag ((,class :inherit (font-lock-builtin-face 
font-lock-comment-face) :weight normal)))
+    `(typescript-jsdoc-type ((,class :inherit (font-lock-type-face 
font-lock-comment-face) :weight normal)))
+    `(typescript-jsdoc-value ((,class :inherit (font-lock-constant-face 
font-lock-comment-face) :weight normal)))
 ;;;;; undo-tree
     `(undo-tree-visualizer-active-branch-face ((,class :inherit bold 
:foreground ,fg-main)))
     `(undo-tree-visualizer-current-face ((,class :foreground ,blue-intense)))
@@ -6155,26 +6346,31 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(vc-dir-status-ignored ((,class :foreground ,fg-unfocused)))
     `(vc-dir-status-up-to-date ((,class :foreground ,cyan)))
     `(vc-dir-status-warning ((,class :foreground ,red)))
-    `(vc-conflict-state ((,class :inherit modus-theme-slant :foreground 
,red-active)))
+    `(vc-conflict-state ((,class :inherit modus-themes-slant :foreground 
,red-active)))
     `(vc-edited-state ((,class :foreground ,yellow-active)))
     `(vc-locally-added-state ((,class :foreground ,cyan-active)))
     `(vc-locked-state ((,class :foreground ,blue-active)))
-    `(vc-missing-state ((,class :inherit modus-theme-slant :foreground 
,magenta-active)))
-    `(vc-needs-update-state ((,class :inherit modus-theme-slant :foreground 
,green-active)))
+    `(vc-missing-state ((,class :inherit modus-themes-slant :foreground 
,magenta-active)))
+    `(vc-needs-update-state ((,class :inherit modus-themes-slant :foreground 
,green-active)))
     `(vc-removed-state ((,class :foreground ,red-active)))
     `(vc-state-base ((,class :foreground ,fg-active)))
     `(vc-up-to-date-state ((,class :foreground ,fg-special-cold)))
 ;;;;; vdiff
-    `(vdiff-addition-face ((,class :inherit modus-theme-diff-added)))
-    `(vdiff-change-face ((,class :inherit modus-theme-diff-changed)))
-    `(vdiff-closed-fold-face ((,class :background ,bg-diff-neutral-1 
:foreground ,fg-diff-neutral-1)))
-    `(vdiff-refine-added ((,class :inherit modus-theme-diff-refine-added)))
-    `(vdiff-refine-changed ((,class :inherit modus-theme-diff-refine-changed)))
-    `(vdiff-subtraction-face ((,class :inherit modus-theme-diff-removed)))
-    `(vdiff-target-face ((,class :inherit modus-theme-intense-blue)))
+    `(vdiff-addition-face ((,class :inherit modus-themes-diff-added)))
+    `(vdiff-change-face ((,class :inherit modus-themes-diff-changed)))
+    `(vdiff-closed-fold-face ((,class :inherit modus-themes-diff-heading)))
+    `(vdiff-refine-added ((,class :inherit modus-themes-diff-refine-added)))
+    `(vdiff-refine-changed ((,class :inherit 
modus-themes-diff-refine-changed)))
+    `(vdiff-subtraction-face ((,class :inherit modus-themes-diff-removed)))
+    `(vdiff-target-face ((,class :inherit modus-themes-intense-blue)))
+;;;;; vertico
+    `(vertico-current ((,class :inherit bold :foreground ,fg-main
+                               :background ,@(pcase modus-themes-completions
+                                               ('opinionated (list bg-active))
+                                               (_ (list bg-inactive))))))
 ;;;;; vimish-fold
     `(vimish-fold-fringe ((,class :foreground ,cyan-active)))
-    `(vimish-fold-mouse-face ((,class :inherit modus-theme-intense-blue)))
+    `(vimish-fold-mouse-face ((,class :inherit modus-themes-intense-blue)))
     `(vimish-fold-overlay ((,class :background ,bg-alt :foreground 
,fg-special-cold)))
 ;;;;; visible-mark
     `(visible-mark-active ((,class :background ,blue-intense-bg)))
@@ -6183,12 +6379,12 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(visible-mark-forward-face1 ((,class :background ,magenta-intense-bg)))
     `(visible-mark-forward-face2 ((,class :background ,green-intense-bg)))
 ;;;;; visual-regexp
-    `(vr/group-0 ((,class :inherit modus-theme-intense-blue)))
-    `(vr/group-1 ((,class :inherit modus-theme-intense-magenta)))
-    `(vr/group-2 ((,class :inherit modus-theme-intense-green)))
-    `(vr/match-0 ((,class :inherit modus-theme-refine-yellow)))
-    `(vr/match-1 ((,class :inherit modus-theme-refine-yellow)))
-    `(vr/match-separator-face ((,class :inherit (modus-theme-intense-neutral 
bold))))
+    `(vr/group-0 ((,class :inherit modus-themes-intense-blue)))
+    `(vr/group-1 ((,class :inherit modus-themes-intense-magenta)))
+    `(vr/group-2 ((,class :inherit modus-themes-intense-green)))
+    `(vr/match-0 ((,class :inherit modus-themes-refine-yellow)))
+    `(vr/match-1 ((,class :inherit modus-themes-refine-yellow)))
+    `(vr/match-separator-face ((,class :inherit (modus-themes-intense-neutral 
bold))))
 ;;;;; volatile-highlights
     `(vhl/default-face ((,class :background ,bg-alt :foreground 
,blue-nuanced-fg :extend t)))
 ;;;;; vterm
@@ -6232,9 +6428,9 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(web-mode-css-string-face ((,class :inherit web-mode-string-face)))
     `(web-mode-css-variable-face ((,class :foreground ,fg-special-warm)))
     `(web-mode-current-column-highlight-face ((,class :background ,bg-alt)))
-    `(web-mode-current-element-highlight-face ((,class :inherit 
modus-theme-special-mild)))
-    `(web-mode-doctype-face ((,class :inherit modus-theme-slant :foreground 
,fg-special-cold)))
-    `(web-mode-error-face ((,class :inherit modus-theme-intense-red)))
+    `(web-mode-current-element-highlight-face ((,class :inherit 
modus-themes-special-mild)))
+    `(web-mode-doctype-face ((,class :inherit modus-themes-slant :foreground 
,fg-special-cold)))
+    `(web-mode-error-face ((,class :inherit modus-themes-intense-red)))
     `(web-mode-filter-face ((,class :inherit font-lock-function-name-face)))
     `(web-mode-folded-face ((,class :underline t)))
     `(web-mode-function-call-face ((,class :inherit 
font-lock-function-name-face)))
@@ -6280,44 +6476,44 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(web-mode-warning-face ((,class :inherit font-lock-warning-face)))
     `(web-mode-whitespace-face ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
 ;;;;; wgrep
-    `(wgrep-delete-face ((,class :inherit modus-theme-refine-yellow)))
-    `(wgrep-done-face ((,class :inherit modus-theme-refine-blue)))
-    `(wgrep-face ((,class :inherit modus-theme-refine-green)))
+    `(wgrep-delete-face ((,class :inherit modus-themes-refine-yellow)))
+    `(wgrep-done-face ((,class :inherit modus-themes-refine-blue)))
+    `(wgrep-face ((,class :inherit modus-themes-refine-green)))
     `(wgrep-file-face ((,class :foreground ,fg-special-warm)))
-    `(wgrep-reject-face ((,class :inherit (modus-theme-intense-red bold))))
+    `(wgrep-reject-face ((,class :inherit (modus-themes-intense-red bold))))
 ;;;;; which-function-mode
     `(which-func ((,class :foreground ,magenta-active)))
 ;;;;; which-key
     `(which-key-command-description-face ((,class :foreground ,fg-main)))
     `(which-key-group-description-face ((,class :foreground ,magenta-alt)))
     `(which-key-highlighted-command-face ((,class :foreground ,yellow 
:underline t)))
-    `(which-key-key-face ((,class :inherit bold :foreground ,blue-intense)))
+    `(which-key-key-face ((,class :inherit modus-themes-key-binding)))
     `(which-key-local-map-description-face ((,class :foreground ,fg-main)))
     `(which-key-note-face ((,class :foreground ,fg-special-warm)))
     `(which-key-separator-face ((,class :inherit shadow)))
     `(which-key-special-key-face ((,class :inherit bold :foreground 
,orange-intense)))
 ;;;;; whitespace-mode
-    `(whitespace-big-indent ((,class :inherit modus-theme-subtle-red)))
-    `(whitespace-empty ((,class :inherit modus-theme-intense-magenta)))
+    `(whitespace-big-indent ((,class :inherit modus-themes-subtle-red)))
+    `(whitespace-empty ((,class :inherit modus-themes-intense-magenta)))
     `(whitespace-hspace ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
     `(whitespace-indentation ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
     `(whitespace-line ((,class :background ,bg-alt)))
     `(whitespace-newline ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
     `(whitespace-space ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
-    `(whitespace-space-after-tab ((,class :inherit 
modus-theme-subtle-magenta)))
-    `(whitespace-space-before-tab ((,class :inherit modus-theme-subtle-cyan)))
+    `(whitespace-space-after-tab ((,class :inherit 
modus-themes-subtle-magenta)))
+    `(whitespace-space-before-tab ((,class :inherit modus-themes-subtle-cyan)))
     `(whitespace-tab ((,class :background ,bg-whitespace :foreground 
,fg-whitespace)))
-    `(whitespace-trailing ((,class :inherit modus-theme-intense-red)))
+    `(whitespace-trailing ((,class :inherit modus-themes-intense-red)))
 ;;;;; window-divider-mode
     `(window-divider ((,class :foreground ,fg-window-divider-inner)))
     `(window-divider-first-pixel ((,class :foreground 
,fg-window-divider-outer)))
     `(window-divider-last-pixel ((,class :foreground 
,fg-window-divider-outer)))
 ;;;;; winum
-    `(winum-face ((,class :inherit modus-theme-bold :foreground ,cyan-active)))
+    `(winum-face ((,class :inherit modus-themes-bold :foreground 
,cyan-active)))
 ;;;;; writegood-mode
     `(writegood-duplicates-face ((,class :background ,bg-alt :foreground 
,red-alt :underline t)))
-    `(writegood-passive-voice-face ((,class :inherit 
modus-theme-lang-warning)))
-    `(writegood-weasels-face ((,class :inherit modus-theme-lang-error)))
+    `(writegood-passive-voice-face ((,class :inherit 
modus-themes-lang-warning)))
+    `(writegood-weasels-face ((,class :inherit modus-themes-lang-error)))
 ;;;;; woman
     `(woman-addition ((,class :foreground ,magenta-alt-other)))
     `(woman-bold ((,class :inherit bold :foreground ,magenta)))
@@ -6333,18 +6529,18 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(xref-line-number ((,class :inherit shadow)))
     `(xref-match ((,class :inherit match)))
 ;;;;; yaml-mode
-    `(yaml-tab-face ((,class :inherit modus-theme-intense-red)))
+    `(yaml-tab-face ((,class :inherit modus-themes-intense-red)))
 ;;;;; yasnippet
     `(yas-field-highlight-face ((,class :background ,bg-hl-alt-intense)))
 ;;;;; ztree
     `(ztreep-arrow-face ((,class :foreground ,fg-inactive)))
     `(ztreep-diff-header-face ((,class :inherit bold :height 1.2 :foreground 
,fg-special-cold)))
-    `(ztreep-diff-header-small-face ((,class :inherit bold :foreground 
,fg-special-mild)))
-    `(ztreep-diff-model-add-face ((,class :foreground ,green)))
+    `(ztreep-diff-header-small-face ((,class :foreground ,fg-main)))
+    `(ztreep-diff-model-add-face ((,class :foreground 
,@(modus-themes--diff-deuteran blue green))))
     `(ztreep-diff-model-diff-face ((,class :foreground ,red)))
     `(ztreep-diff-model-ignored-face ((,class :inherit shadow :strike-through 
t)))
     `(ztreep-diff-model-normal-face ((,class :inherit shadow)))
-    `(ztreep-expand-sign-face ((,class :foreground ,blue)))
+    `(ztreep-expand-sign-face ((,class :inherit ztreep-arrow-face)))
     `(ztreep-header-face ((,class :inherit bold :height 1.2 :foreground 
,fg-special-cold)))
     `(ztreep-leaf-face ((,class :foreground ,cyan)))
     `(ztreep-node-count-children-face ((,class :foreground ,fg-special-warm)))
@@ -6362,14 +6558,14 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
 ;;;; exwm
     `(exwm-floating-border-color ,fg-window-divider-inner)
 ;;;; flymake fringe indicators
-    `(flymake-error-bitmap '(flymake-double-exclamation-mark 
modus-theme-fringe-red))
-    `(flymake-warning-bitmap '(exclamation-mark modus-theme-fringe-yellow))
-    `(flymake-note-bitmap '(exclamation-mark modus-theme-fringe-cyan))
+    `(flymake-error-bitmap '(flymake-double-exclamation-mark 
modus-themes-fringe-red))
+    `(flymake-warning-bitmap '(exclamation-mark modus-themes-fringe-yellow))
+    `(flymake-note-bitmap '(exclamation-mark modus-themes-fringe-cyan))
 ;;;; ibuffer
-    `(ibuffer-deletion-face 'modus-theme-mark-del)
-    `(ibuffer-filter-group-name-face 'modus-theme-mark-symbol)
-    `(ibuffer-marked-face 'modus-theme-mark-sel)
-    `(ibuffer-title-face 'modus-theme-pseudo-header)
+    `(ibuffer-deletion-face 'modus-themes-mark-del)
+    `(ibuffer-filter-group-name-face 'modus-themes-mark-symbol)
+    `(ibuffer-marked-face 'modus-themes-mark-sel)
+    `(ibuffer-title-face 'modus-themes-pseudo-header)
 ;;;; highlight-tail
     `(highlight-tail-colors
       '((,green-subtle-bg . 0)
@@ -6425,24 +6621,24 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
     `(xterm-color-names-bright ["gray35" ,red-alt ,green-alt ,yellow-alt 
,blue-alt ,magenta-alt ,cyan-alt "white"])
     (if (eq modus-themes-org-blocks 'rainbow)
         `(org-src-block-faces              ; TODO this list should be expanded
-          `(("emacs-lisp" modus-theme-nuanced-magenta)
-            ("elisp" modus-theme-nuanced-magenta)
-            ("clojure" modus-theme-nuanced-magenta)
-            ("clojurescript" modus-theme-nuanced-magenta)
-            ("c" modus-theme-nuanced-blue)
-            ("c++" modus-theme-nuanced-blue)
-            ("sh" modus-theme-nuanced-green)
-            ("shell" modus-theme-nuanced-green)
-            ("html" modus-theme-nuanced-yellow)
-            ("xml" modus-theme-nuanced-yellow)
-            ("css" modus-theme-nuanced-red)
-            ("scss" modus-theme-nuanced-red)
-            ("python" modus-theme-nuanced-green)
-            ("ipython" modus-theme-nuanced-magenta)
-            ("r" modus-theme-nuanced-cyan)
-            ("yaml" modus-theme-nuanced-cyan)
-            ("conf" modus-theme-nuanced-cyan)
-            ("docker" modus-theme-nuanced-cyan)))
+          `(("emacs-lisp" modus-themes-nuanced-magenta)
+            ("elisp" modus-themes-nuanced-magenta)
+            ("clojure" modus-themes-nuanced-magenta)
+            ("clojurescript" modus-themes-nuanced-magenta)
+            ("c" modus-themes-nuanced-blue)
+            ("c++" modus-themes-nuanced-blue)
+            ("sh" modus-themes-nuanced-green)
+            ("shell" modus-themes-nuanced-green)
+            ("html" modus-themes-nuanced-yellow)
+            ("xml" modus-themes-nuanced-yellow)
+            ("css" modus-themes-nuanced-red)
+            ("scss" modus-themes-nuanced-red)
+            ("python" modus-themes-nuanced-green)
+            ("ipython" modus-themes-nuanced-magenta)
+            ("r" modus-themes-nuanced-cyan)
+            ("yaml" modus-themes-nuanced-cyan)
+            ("conf" modus-themes-nuanced-cyan)
+            ("docker" modus-themes-nuanced-cyan)))
       `(org-src-block-faces '())))
   "Custom variables for `modus-themes-theme'.")
 
@@ -6453,4 +6649,11 @@ by virtue of calling either of 
`modus-themes-load-operandi' and
       (add-to-list 'custom-theme-load-path dir))))
 
 (provide 'modus-themes)
+
+;; Local Variables:
+;; time-stamp-start: "Last-Modified:[ \t]+\\\\?[\"<]"
+;; time-stamp-end: "\\\\?[\">]"
+;; time-stamp-format: "%Y-%02m-%02d %02H:%02M:%02S %5z"
+;; End:
+
 ;;; modus-themes.el ends here
diff --git a/etc/themes/modus-vivendi-theme.el 
b/etc/themes/modus-vivendi-theme.el
index 814f10d..ff59d30 100644
--- a/etc/themes/modus-vivendi-theme.el
+++ b/etc/themes/modus-vivendi-theme.el
@@ -4,7 +4,7 @@
 
 ;; Author: Protesilaos Stavrou <info@protesilaos.com>
 ;; URL: https://gitlab.com/protesilaos/modus-themes
-;; Version: 1.2.3
+;; Version: 1.3.2
 ;; Package-Requires: ((emacs "26.1"))
 ;; Keywords: faces, theme, accessibility
 
@@ -52,6 +52,9 @@
 
 (eval-and-compile
   (unless (and (fboundp 'require-theme)
+               load-file-name
+               (equal (file-name-directory load-file-name)
+                      (expand-file-name "themes/" data-directory))
                (require-theme 'modus-themes t))
     (require 'modus-themes)))
 
diff --git a/leim/leim-ext.el b/leim/leim-ext.el
index 687379d..904675c 100644
--- a/leim/leim-ext.el
+++ b/leim/leim-ext.el
@@ -1,4 +1,4 @@
-;; leim-ext.el -- extra leim configuration     -*- lexical-binding: t; -*-
+;;; leim-ext.el --- extra leim configuration   -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2004-2021 Free Software Foundation, Inc.
 ;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
diff --git a/lib-src/seccomp-filter.c b/lib-src/seccomp-filter.c
index fc3c3a0..dc568e0 100644
--- a/lib-src/seccomp-filter.c
+++ b/lib-src/seccomp-filter.c
@@ -35,6 +35,7 @@ variants of those files that can be used to sandbox Emacs 
before
 
 #include "config.h"
 
+#include <assert.h>
 #include <errno.h>
 #include <limits.h>
 #include <stdarg.h>
@@ -60,6 +61,10 @@ variants of those files that can be used to sandbox Emacs 
before
 
 #include "verify.h"
 
+#ifndef ARCH_CET_STATUS
+#define ARCH_CET_STATUS 0x3001
+#endif
+
 static ATTRIBUTE_FORMAT_PRINTF (2, 3) _Noreturn void
 fail (int error, const char *format, ...)
 {
@@ -165,7 +170,7 @@ main (int argc, char **argv)
   verify (sizeof (long) == 8 && LONG_MIN == INT64_MIN
           && LONG_MAX == INT64_MAX);
   verify (sizeof (void *) == 8);
-  verify ((uintptr_t) NULL == 0);
+  assert ((uintptr_t) NULL == 0);
 
   /* Allow a clean exit.  */
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (exit));
@@ -183,9 +188,9 @@ main (int argc, char **argv)
            some versions of the dynamic loader still use it.  Also
            allow allocating thread stacks.  */
         SCMP_A3_32 (SCMP_CMP_MASKED_EQ,
-                    ~(MAP_PRIVATE | MAP_FILE | MAP_ANONYMOUS
-                      | MAP_FIXED | MAP_DENYWRITE | MAP_STACK
-                      | MAP_NORESERVE),
+                    ~(MAP_SHARED | MAP_PRIVATE | MAP_FILE
+                      | MAP_ANONYMOUS | MAP_FIXED | MAP_DENYWRITE
+                      | MAP_STACK | MAP_NORESERVE),
                     0));
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (mmap),
         SCMP_A2_32 (SCMP_CMP_MASKED_EQ,
@@ -345,6 +350,8 @@ main (int argc, char **argv)
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (set_tid_address));
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (arch_prctl),
         SCMP_A0_32 (SCMP_CMP_EQ, ARCH_SET_FS));
+  RULE (SCMP_ACT_ERRNO (EINVAL), SCMP_SYS (arch_prctl),
+        SCMP_A0_32 (SCMP_CMP_EQ, ARCH_CET_STATUS));
   RULE (SCMP_ACT_ALLOW, SCMP_SYS (statfs));
 
   /* We want to allow starting the Emacs binary itself with the
diff --git a/lisp/allout-widgets.el b/lisp/allout-widgets.el
index 90f3f61..0e12704 100644
--- a/lisp/allout-widgets.el
+++ b/lisp/allout-widgets.el
@@ -1,4 +1,4 @@
-;; allout-widgets.el --- Visually highlight allout outline structure.  -*- 
lexical-binding: t; -*-
+;;; allout-widgets.el --- Visually highlight allout outline structure.  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2005-2021 Free Software Foundation, Inc.
 
@@ -2296,3 +2296,5 @@ The elements of LIST are not copied, just the list 
structure itself."
 ;;;_  , Local variables:
 ;;;_  , allout-layout: (-1 : 0)
 ;;;_  , End:
+
+;;; allout-widgets.el ends here
diff --git a/lisp/calc/calc-menu.el b/lisp/calc/calc-menu.el
index ac14e36..516f62d 100644
--- a/lisp/calc/calc-menu.el
+++ b/lisp/calc/calc-menu.el
@@ -1669,3 +1669,5 @@
         ["Quit" calc-quit]))
 
 (provide 'calc-menu)
+
+;;; calc-menu.el ends here
diff --git a/lisp/calc/calc-nlfit.el b/lisp/calc/calc-nlfit.el
index 11867f1..f676b09 100644
--- a/lisp/calc/calc-nlfit.el
+++ b/lisp/calc/calc-nlfit.el
@@ -819,3 +819,5 @@
        (calc-record traillist "parm")))))
 
 (provide 'calc-nlfit)
+
+;;; calc-nlfit.el ends here
diff --git a/lisp/cedet/semantic/wisent/comp.el 
b/lisp/cedet/semantic/wisent/comp.el
index b96fa40..a87ed51 100644
--- a/lisp/cedet/semantic/wisent/comp.el
+++ b/lisp/cedet/semantic/wisent/comp.el
@@ -3427,7 +3427,7 @@ where:
   (if (wisent-automaton-p grammar)
       grammar ;; Grammar already compiled just return it
     (wisent-with-context compile-grammar
-      (let* ((gc-cons-threshold 1000000))
+      (let* ((gc-cons-threshold (max gc-cons-threshold 1000000)))
         (garbage-collect)
        (setq wisent-new-log-flag t)
        ;; Parse input grammar
diff --git a/lisp/cus-theme.el b/lisp/cus-theme.el
index a702fed..13fb9f3 100644
--- a/lisp/cus-theme.el
+++ b/lisp/cus-theme.el
@@ -1,7 +1,7 @@
-;;; cus-theme.el -- custom theme creation user interface  -*- lexical-binding: 
t -*-
-;;
+;;; cus-theme.el --- custom theme creation user interface  -*- 
lexical-binding: t -*-
+
 ;; Copyright (C) 2001-2021 Free Software Foundation, Inc.
-;;
+
 ;; Author: Alex Schroeder <alex@gnu.org>
 ;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: help, faces
diff --git a/lisp/custom.el b/lisp/custom.el
index 2c9eadb..614f8cf 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -117,9 +117,10 @@ For the standard setting, use `set-default'."
        (set-default symbol (eval exp)))))))
 
 (defvar custom-delayed-init-variables nil
-  "List of variables whose initialization is pending.")
+  "List of variables whose initialization is pending until startup.
+Once this list has been processed, this var is set to a non-list value.")
 
-(defun custom-initialize-delay (symbol _value)
+(defun custom-initialize-delay (symbol value)
   "Delay initialization of SYMBOL to the next Emacs start.
 This is used in files that are preloaded (or for autoloaded
 variables), so that the initialization is done in the run-time
@@ -133,7 +134,11 @@ the :set function."
   ;; This seemed to be at least as good as setting it to an arbitrary
   ;; value like nil (evaluating `value' is not an option because it
   ;; may have undesirable side-effects).
-  (push symbol custom-delayed-init-variables))
+  (if (listp custom-delayed-init-variables)
+      (push symbol custom-delayed-init-variables)
+    ;; In case this is called after startup, there is no "later" to which to
+    ;; delay it, so initialize it "normally" (bug#47072).
+    (custom-initialize-reset symbol value)))
 
 (defun custom-declare-variable (symbol default doc &rest args)
   "Like `defcustom', but SYMBOL and DEFAULT are evaluated as normal arguments.
diff --git a/lisp/dframe.el b/lisp/dframe.el
index f4208f3..1ddf11a 100644
--- a/lisp/dframe.el
+++ b/lisp/dframe.el
@@ -1,4 +1,4 @@
-;;; dframe --- dedicate frame support modes  -*- lexical-binding:t -*-
+;;; dframe.el --- dedicate frame support modes  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1996-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/dos-w32.el b/lisp/dos-w32.el
index cf75321..45daaad 100644
--- a/lisp/dos-w32.el
+++ b/lisp/dos-w32.el
@@ -1,4 +1,4 @@
-;; dos-w32.el --- Functions shared among MS-DOS and W32 (NT/95) platforms  -*- 
lexical-binding: t; -*-
+;;; dos-w32.el --- Functions shared among MS-DOS and W32 (NT/95) platforms  
-*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1996, 2001-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index e526537..43e9395 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -1324,7 +1324,7 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
          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
+        make-byte-code make-list make-string make-symbol mark marker-buffer max
         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
@@ -1374,7 +1374,7 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
         invocation-directory invocation-name
         keymapp keywordp
         list listp
-        make-marker mark mark-marker markerp max-char
+        make-marker mark-marker markerp max-char
         memory-limit
         mouse-movement-p
         natnump nlistp not null number-or-marker-p numberp
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
index 7c2b23b..bec4ad9 100644
--- a/lisp/emacs-lisp/check-declare.el
+++ b/lisp/emacs-lisp/check-declare.el
@@ -328,4 +328,4 @@ Returns non-nil if any false statements are found."
 
 (provide 'check-declare)
 
-;;; check-declare.el ends here.
+;;; check-declare.el ends here
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index f5b8c7b..31aa0cb 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -438,7 +438,7 @@ Presumes point is at the end of the `cl-defmethod' symbol."
 ;;;###autoload
 (defmacro cl-defmethod (name args &rest body)
   "Define a new method for generic function NAME.
-This it defines an implementation of NAME to use for invocations
+This defines an implementation of NAME to use for invocations
 of specific types of arguments.
 
 ARGS is a list of dispatch arguments (see `cl-defun'), but where
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 2dd1524..0a6d4ec 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -118,7 +118,7 @@ it is disabled.")
 ;;;###autoload
 (defalias 'easy-mmode-define-minor-mode #'define-minor-mode)
 ;;;###autoload
-(defmacro define-minor-mode (mode doc &optional init-value lighter keymap 
&rest body)
+(defmacro define-minor-mode (mode doc &rest body)
   "Define a new minor mode MODE.
 This defines the toggle command MODE and (by default) a control variable
 MODE (you can override this with the :variable keyword, see below).
@@ -200,6 +200,9 @@ INIT-VALUE LIGHTER KEYMAP.
 
   (let* ((last-message (make-symbol "last-message"))
          (mode-name (symbol-name mode))
+         (init-value nil)
+         (keymap nil)
+         (lighter nil)
         (pretty-name nil)
         (globalp nil)
         (set nil)
@@ -216,22 +219,20 @@ INIT-VALUE LIGHTER KEYMAP.
         (hook-on (intern (concat mode-name "-on-hook")))
         (hook-off (intern (concat mode-name "-off-hook")))
          (interactive t)
-         (warnwrap (if (keywordp init-value) #'identity
+         (warnwrap (if (or (null body) (keywordp (car body))) #'identity
                      (lambda (exp)
                        (macroexp-warn-and-return
                         "Use keywords rather than deprecated positional 
arguments to `define-minor-mode'"
                         exp))))
         keyw keymap-sym tmp)
 
-    ;; Allow skipping the first three args.
-    (cond
-     ((keywordp init-value)
-      (setq body (if keymap `(,init-value ,lighter ,keymap ,@body)
-                  `(,init-value ,lighter))
-           init-value nil lighter nil keymap nil))
-     ((keywordp lighter)
-      (setq body `(,lighter ,keymap ,@body) lighter nil keymap nil))
-     ((keywordp keymap) (push keymap body) (setq keymap nil)))
+    ;; Allow BODY to start with the old INIT-VALUE LIGHTER KEYMAP triplet.
+    (unless (keywordp (car body))
+      (setq init-value (pop body))
+      (unless (keywordp (car body))
+        (setq lighter (pop body))
+        (unless (keywordp (car body))
+          (setq keymap (pop body)))))
 
     ;; Check keys.
     (while (keywordp (setq keyw (car body)))
diff --git a/lisp/emacs-lisp/eieio-custom.el b/lisp/emacs-lisp/eieio-custom.el
index 184b99f..8257f7a 100644
--- a/lisp/emacs-lisp/eieio-custom.el
+++ b/lisp/emacs-lisp/eieio-custom.el
@@ -1,4 +1,4 @@
-;;; eieio-custom.el -- eieio object customization  -*- lexical-binding:t -*-
+;;; eieio-custom.el --- eieio object customization  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1999-2001, 2005, 2007-2021 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/emacs-lisp/eieio-opt.el b/lisp/emacs-lisp/eieio-opt.el
index e65f424..08a6deb 100644
--- a/lisp/emacs-lisp/eieio-opt.el
+++ b/lisp/emacs-lisp/eieio-opt.el
@@ -1,4 +1,4 @@
-;;; eieio-opt.el -- eieio optional functions (debug, printing, speedbar)  -*- 
lexical-binding: t; -*-
+;;; eieio-opt.el --- eieio optional functions (debug, printing, speedbar)  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1996, 1998-2003, 2005, 2008-2021 Free Software
 ;; Foundation, Inc.
diff --git a/lisp/emacs-lisp/eieio-speedbar.el 
b/lisp/emacs-lisp/eieio-speedbar.el
index 8bf77e2..c25ea8a 100644
--- a/lisp/emacs-lisp/eieio-speedbar.el
+++ b/lisp/emacs-lisp/eieio-speedbar.el
@@ -1,4 +1,4 @@
-;;; eieio-speedbar.el -- Classes for managing speedbar displays.  -*- 
lexical-binding:t -*-
+;;; eieio-speedbar.el --- Classes for managing speedbar displays.  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 1999-2002, 2005, 2007-2021 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 910023b..31b6b09 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -981,4 +981,4 @@ of `eq'."
 
 (provide 'eieio)
 
-;;; eieio ends here
+;;; eieio.el ends here
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index a02406a..b4f068c 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -63,7 +63,7 @@ If this variable is set to 0, no idle time is required."
   :type 'number)
 
 (defcustom eldoc-print-after-edit nil
-  "If non-nil eldoc info is only shown when editing.
+  "If non-nil, eldoc info is only shown when editing.
 Changing the value requires toggling `eldoc-mode'."
   :type 'boolean)
 
@@ -391,12 +391,12 @@ name, inside its arg list, or on any object with some 
associated
 information.
 
 Each hook function is called with at least one argument CALLBACK,
-a function, and decides whether to display a doc short string
+a function, and decides whether to display a short doc string
 about the context around point.
 
 - If that decision can be taken quickly, the hook function may
-  call CALLBACK immediately following the protocol described
-  below.  Alternatively it may ignore CALLBACK entirely and
+  call CALLBACK immediately, following the protocol described
+  below.  Alternatively, it may ignore CALLBACK entirely and
   return either the doc string, or nil if there's no doc
   appropriate for the context.
 
@@ -688,11 +688,11 @@ following values are allowed:
 - `eldoc-documentation-compose': calls all functions in the
   special hook and displays all of the resulting doc strings
   together.  Wait for all strings to be ready, and preserve their
-  relative as specified by the order of functions in the hook;
+  relative order as specified by the order of functions in the hook;
 
 - `eldoc-documentation-compose-eagerly': calls all functions in
-  the special hook and display as many of the resulting doc
-  strings as possible, as soon as possible.  Preserving the
+  the special hook and displays as many of the resulting doc
+  strings as possible, as soon as possible.  Preserves the
   relative order of doc strings;
 
 - `eldoc-documentation-enthusiast': calls all functions in the
@@ -793,7 +793,7 @@ function passes responsibility to the functions in
 Other third-party values of `eldoc-documentation-strategy' should
 not use `eldoc--make-callback'.  They must find some alternate
 way to produce callbacks to feed to
-`eldoc-documentation-function' and should endeavour to display
+`eldoc-documentation-functions' and should endeavour to display
 the docstrings eventually produced, using
 `eldoc-display-functions'."
   (let* (;; How many callbacks have been created by the strategy
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 2ecd92c..64d7d56 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -73,9 +73,9 @@
 ;; M-x list-packages
 ;;    Enters a mode similar to buffer-menu which lets you manage
 ;;    packages.  You can choose packages for install (mark with "i",
-;;    then "x" to execute) or deletion (not implemented yet), and you
-;;    can see what packages are available.  This will automatically
-;;    fetch the latest list of packages from ELPA.
+;;    then "x" to execute) or deletion, and you can see what packages
+;;    are available.  This will automatically fetch the latest list of
+;;    packages from ELPA.
 ;;
 ;; M-x package-install-from-buffer
 ;;    Install a package consisting of a single .el file that appears
@@ -89,7 +89,7 @@
 ;;    Install a package from the indicated file.  The package can be
 ;;    either a tar file or a .el file.  A tar file must contain an
 ;;    appropriately-named "-pkg.el" file; a .el file must be properly
-;;    formatted as with package-install-from-buffer.
+;;    formatted as with `package-install-from-buffer'.
 
 ;;; Thanks:
 ;;; (sorted by sort-lines):
@@ -225,7 +225,7 @@ security."
   :type '(alist :key-type (string :tag "Archive name")
                 :value-type (string :tag "URL or directory name"))
   :risky t
-  :version "26.1")                      ; gnutls test
+  :version "28.1")
 
 (defcustom package-menu-hide-low-priority 'archive
   "If non-nil, hide low priority packages from the packages menu.
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 56e588e..1e3eb9c 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -1210,7 +1210,7 @@ unmatchable     Never match anything at all.
 CHARCLASS       Match a character from a character class.  One of:
  alpha, alphabetic, letter   Alphabetic characters (defined by Unicode).
  alnum, alphanumeric         Alphabetic or decimal digit chars (Unicode).
- digit numeric, num          0-9.
+ digit, numeric, num         0-9.
  xdigit, hex-digit, hex      0-9, A-F, a-f.
  cntrl, control              ASCII codes 0-31.
  blank                       Horizontal whitespace (Unicode).
diff --git a/lisp/emacs-lisp/tcover-ses.el b/lisp/emacs-lisp/tcover-ses.el
index d9db1d3..4460fef 100644
--- a/lisp/emacs-lisp/tcover-ses.el
+++ b/lisp/emacs-lisp/tcover-ses.el
@@ -1,4 +1,4 @@
-;;;; testcover-ses.el -- Example use of `testcover' to test "SES"  -*- 
lexical-binding: t; -*-
+;;; tcover-ses.el --- Example use of `testcover' to test "SES"  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
@@ -716,4 +716,4 @@ spreadsheet files with invalid formatting."
   ;;Could do this here: (testcover-end "ses.el")
   (message "Done"))
 
-;;; testcover-ses.el ends here.
+;;; tcover-ses.el ends here
diff --git a/lisp/emacs-lisp/testcover.el b/lisp/emacs-lisp/testcover.el
index 75b27d0..e75f151 100644
--- a/lisp/emacs-lisp/testcover.el
+++ b/lisp/emacs-lisp/testcover.el
@@ -1,4 +1,4 @@
-;;;; testcover.el -- Visual code-coverage tool  -*- lexical-binding:t -*-
+;;; testcover.el --- Visual code-coverage tool  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
@@ -675,4 +675,4 @@ The list is 1valued if all of its constituent elements are 
also 1valued."
     (testcover-analyze-coverage (cadr form)))
    (t (testcover-analyze-coverage-backquote form))))
 
-;; testcover.el ends here.
+;;; testcover.el ends here
diff --git a/lisp/emacs-lisp/text-property-search.el 
b/lisp/emacs-lisp/text-property-search.el
index e909e4b..69943a8 100644
--- a/lisp/emacs-lisp/text-property-search.el
+++ b/lisp/emacs-lisp/text-property-search.el
@@ -214,3 +214,5 @@ and if a matching region is found, place point at its end."
   (funcall predicate value prop-value))
 
 (provide 'text-property-search)
+
+;;; text-property-search.el ends here
diff --git a/lisp/emacs-lisp/unsafep.el b/lisp/emacs-lisp/unsafep.el
index d52a6c7..fa4e058 100644
--- a/lisp/emacs-lisp/unsafep.el
+++ b/lisp/emacs-lisp/unsafep.el
@@ -1,4 +1,4 @@
-;;;; unsafep.el -- Determine whether a Lisp form is safe to evaluate  -*- 
lexical-binding: t; -*-
+;;; unsafep.el --- Determine whether a Lisp form is safe to evaluate  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index b1f97ae..ea9f9a3 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -138,6 +138,13 @@ Use `erc-current-nick' to access this.")
 (defvar-local erc-session-port nil
   "The port used to connect to.")
 
+(defvar-local erc-session-client-certificate nil
+  "TLS client certificate used when connecting over TLS.
+If non-nil, should either be a list where the first element is
+the certificate key file name, and the second element is the
+certificate file name itself, or t, which means that
+`auth-source' will be queried for the key and the certificate.")
+
 (defvar-local erc-server-announced-name nil
   "The name the server announced to use.")
 
@@ -505,18 +512,23 @@ The current buffer is given by BUFFER."
          (memq (process-status erc-server-process) '(run open)))))
 
 ;;;; Connecting to a server
-(defun erc-open-network-stream (name buffer host service)
-  "As `open-network-stream', but does non-blocking IO"
-  (make-network-process :name name :buffer  buffer
-                        :host host :service service :nowait t))
+(defun erc-open-network-stream (name buffer host service &rest parameters)
+  "Like `open-network-stream', but does non-blocking IO."
+  (let ((p (plist-put parameters :nowait t)))
+    (apply #'open-network-stream name buffer host service p)))
 
-(defun erc-server-connect (server port buffer)
+(defun erc-server-connect (server port buffer &optional client-certificate)
   "Perform the connection and login using the specified SERVER and PORT.
-We will store server variables in the buffer given by BUFFER."
-  (let ((msg (erc-format-message 'connect ?S server ?p port)) process)
+We will store server variables in the buffer given by BUFFER.
+CLIENT-CERTIFICATE may optionally be used to specify a TLS client
+certificate to use for authentication when connecting over
+TLS (see `erc-session-client-certificate' for more details)."
+  (let ((msg (erc-format-message 'connect ?S server ?p port)) process
+        (args `(,(format "erc-%s-%s" server port) nil ,server ,port)))
+    (when client-certificate
+      (setq args `(,@args :client-certificate ,client-certificate)))
     (message "%s" msg)
-    (setq process (funcall erc-server-connect-function
-                           (format "erc-%s-%s" server port) nil server port))
+    (setq process (apply erc-server-connect-function args))
     (unless (processp process)
       (error "Connection attempt failed"))
     ;; Misc server variables
diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el
index 044776c..cb9af92 100644
--- a/lisp/erc/erc-button.el
+++ b/lisp/erc/erc-button.el
@@ -1,4 +1,4 @@
-;; erc-button.el --- A way of buttonizing certain things in ERC buffers  -*- 
lexical-binding:t -*-
+;;; erc-button.el --- A way of buttonizing certain things in ERC buffers  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 1996-2004, 2006-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-desktop-notifications.el 
b/lisp/erc/erc-desktop-notifications.el
index 990f013..9838b23 100644
--- a/lisp/erc/erc-desktop-notifications.el
+++ b/lisp/erc/erc-desktop-notifications.el
@@ -1,4 +1,4 @@
-;; erc-desktop-notifications.el -- Send notification on PRIVMSG or mentions 
-*- lexical-binding:t -*-
+;;; erc-desktop-notifications.el --- Send notification on PRIVMSG or mentions 
-*- lexical-binding:t -*-
 
 ;; Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el
index 1143faa..fc9a8d3 100644
--- a/lisp/erc/erc-goodies.el
+++ b/lisp/erc/erc-goodies.el
@@ -1,4 +1,4 @@
-;; erc-goodies.el --- Collection of ERC modules  -*- lexical-binding: t; -*-
+;;; erc-goodies.el --- Collection of ERC modules  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2001-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-imenu.el b/lisp/erc/erc-imenu.el
index b2a2dc5..dcf6db7 100644
--- a/lisp/erc/erc-imenu.el
+++ b/lisp/erc/erc-imenu.el
@@ -1,4 +1,4 @@
-;;; erc-imenu.el -- Imenu support for ERC  -*- lexical-binding: t; -*-
+;;; erc-imenu.el --- Imenu support for ERC  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2001-2002, 2004, 2006-2021 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/erc/erc-menu.el b/lisp/erc/erc-menu.el
index 0dc819f..1bee6ff 100644
--- a/lisp/erc/erc-menu.el
+++ b/lisp/erc/erc-menu.el
@@ -1,4 +1,4 @@
-;; erc-menu.el -- Menu-bar definitions for ERC  -*- lexical-binding: t; -*-
+;;; erc-menu.el --- Menu-bar definitions for ERC  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2001-2002, 2004-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-page.el b/lisp/erc/erc-page.el
index 4c244b7..457e8cd 100644
--- a/lisp/erc/erc-page.el
+++ b/lisp/erc/erc-page.el
@@ -1,4 +1,4 @@
-;; erc-page.el - CTCP PAGE support for ERC  -*- lexical-binding: t; -*-
+;;; erc-page.el --- CTCP PAGE support for ERC  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2002, 2004, 2006-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc-replace.el b/lisp/erc/erc-replace.el
index d08d985..3f69c4c 100644
--- a/lisp/erc/erc-replace.el
+++ b/lisp/erc/erc-replace.el
@@ -1,4 +1,4 @@
-;; erc-replace.el -- wash and massage messages inserted into the buffer  -*- 
lexical-binding: t; -*-
+;;; erc-replace.el --- wash and massage messages inserted into the buffer  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2001-2002, 2004, 2006-2021 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/erc/erc-ring.el b/lisp/erc/erc-ring.el
index 28299ae..666fd58 100644
--- a/lisp/erc/erc-ring.el
+++ b/lisp/erc/erc-ring.el
@@ -1,4 +1,4 @@
-;; erc-ring.el -- Command history handling for erc using ring.el  -*- 
lexical-binding: t; -*-
+;;; erc-ring.el --- Command history handling for erc using ring.el  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2001-2004, 2006-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index e20aa80..43661a2 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -47,8 +47,12 @@
 ;;
 ;; M-x erc RET
 ;;
-;; After you are connected to a server, you can use C-h m or have a look at
-;; the ERC menu.
+;; or
+;;
+;; M-x erc-tls RET
+;;
+;; to connect over TLS (encrypted).  Once you are connected to a
+;; server, you can use C-h m or have a look at the ERC menu.
 
 ;;; Code:
 
@@ -1967,7 +1971,8 @@ removed from the list will be disabled."
        (switch-to-buffer buffer)))))
 
 (defun erc-open (&optional server port nick full-name
-                           connect passwd tgt-list channel process)
+                           connect passwd tgt-list channel process
+                           client-certificate)
   "Connect to SERVER on PORT as NICK with FULL-NAME.
 
 If CONNECT is non-nil, connect to the server.  Otherwise assume
@@ -1977,6 +1982,13 @@ target CHANNEL.
 Use PASSWD as user password on the server.  If TGT-LIST is
 non-nil, use it to initialize `erc-default-recipients'.
 
+CLIENT-CERTIFICATE, if non-nil, should either be a list where the
+first element is the file name of the private key corresponding
+to a client certificate and the second element is the file name
+of the client certificate itself to use when connecting over TLS,
+or t, which means that `auth-source' will be queried for the
+private key and the certificate.
+
 Returns the buffer for the given server or channel."
   (let ((server-announced-name (when (and (boundp 'erc-session-server)
                                           (string= server erc-session-server))
@@ -2059,6 +2071,8 @@ Returns the buffer for the given server or channel."
                 (if (functionp secret)
                     (funcall secret)
                   secret))))
+    ;; client certificate (only useful if connecting over TLS)
+    (setq erc-session-client-certificate client-certificate)
     ;; debug output buffer
     (setq erc-dbuf
           (when erc-log-p
@@ -2079,7 +2093,10 @@ Returns the buffer for the given server or channel."
     (run-hook-with-args 'erc-connect-pre-hook buffer)
 
     (when connect
-      (erc-server-connect erc-session-server erc-session-port buffer))
+      (erc-server-connect erc-session-server
+                          erc-session-port
+                          buffer
+                          erc-session-client-certificate))
     (erc-update-mode-line)
 
     ;; Now display the buffer in a window as per user wishes.
@@ -2196,22 +2213,22 @@ parameters SERVER and NICK."
   "ERC is a powerful, modular, and extensible IRC client.
 This function is the main entry point for ERC.
 
-It permits you to select connection parameters, and then starts ERC.
+It allows selecting connection parameters, and then starts ERC.
 
 Non-interactively, it takes the keyword arguments
    (server (erc-compute-server))
    (port   (erc-compute-port))
    (nick   (erc-compute-nick))
    password
-   (full-name (erc-compute-full-name)))
+   (full-name (erc-compute-full-name))
 
 That is, if called with
 
    (erc :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
 
-then the server and full-name will be set to those values, whereas
-`erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
-be invoked for the values of the other parameters."
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of the other parameters."
   (interactive (erc-select-read-args))
   (erc-open server port nick full-name t password))
 
@@ -2220,21 +2237,66 @@ be invoked for the values of the other parameters."
 (defalias 'erc-ssl #'erc-tls)
 
 ;;;###autoload
-(defun erc-tls (&rest r)
-  "Interactively select TLS connection parameters and run ERC.
-Arguments are the same as for `erc'."
+(cl-defun erc-tls (&key (server (erc-compute-server))
+                        (port   (erc-compute-port))
+                        (nick   (erc-compute-nick))
+                        password
+                        (full-name (erc-compute-full-name))
+                        client-certificate)
+  "ERC is a powerful, modular, and extensible IRC client.
+This function is the main entry point for ERC over TLS.
+
+It allows selecting connection parameters, and then starts ERC
+over TLS.
+
+Non-interactively, it takes the keyword arguments
+   (server (erc-compute-server))
+   (port   (erc-compute-port))
+   (nick   (erc-compute-nick))
+   password
+   (full-name (erc-compute-full-name))
+   client-certificate
+
+That is, if called with
+
+   (erc-tls :server \"chat.freenode.net\" :full-name \"Harry S Truman\")
+
+then the server and full-name will be set to those values,
+whereas `erc-compute-port' and `erc-compute-nick' will be invoked
+for the values of their respective parameters.
+
+CLIENT-CERTIFICATE, if non-nil, should either be a list where the
+first element is the certificate key file name, and the second
+element is the certificate file name itself, or t, which means
+that `auth-source' will be queried for the key and the
+certificate.  Authenticating using a TLS client certificate is
+also refered to as \"CertFP\" (Certificate Fingerprint)
+authentication by various IRC networks.
+
+Example usage:
+
+    (erc-tls :server \"chat.freenode.net\" :port 6697
+             :client-certificate
+             '(\"/data/bandali/my-cert.key\"
+               \"/data/bandali/my-cert.crt\"))"
   (interactive (let ((erc-default-port erc-default-port-tls))
                 (erc-select-read-args)))
   (let ((erc-server-connect-function 'erc-open-tls-stream))
-    (apply #'erc r)))
+    (erc-open server port nick full-name t password
+              nil nil nil client-certificate)))
 
-(defun erc-open-tls-stream (name buffer host port)
+(defun erc-open-tls-stream (name buffer host port &rest parameters)
   "Open an TLS stream to an IRC server.
-The process will be given the name NAME, its target buffer will be
-BUFFER.  HOST and PORT specify the connection target."
-  (open-network-stream name buffer host port
-                      :nowait t
-                       :type 'tls))
+The process will be given the name NAME, its target buffer will
+be BUFFER.  HOST and PORT specify the connection target.
+PARAMETERS should be a sequence of keywords and values, per
+`open-network-stream'."
+  (let ((p (plist-put parameters :type 'tls))
+        args)
+    (unless (plist-member p :nowait)
+      (setq p (plist-put p :nowait t)))
+    (setq args `(,name ,buffer ,host ,port ,@p))
+    (apply #'open-network-stream args)))
 
 ;;; Displaying error messages
 
diff --git a/lisp/files.el b/lisp/files.el
index 7440c11..ee16abf 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1648,13 +1648,14 @@ rather than FUN itself, to `minibuffer-setup-hook'."
     (when (eq (car-safe fun) :append)
       (setq append '(t) fun (cadr fun)))
     `(let ((,funsym ,fun)
-           ,hook)
-       (setq ,hook
-             (lambda ()
-               ;; Clear out this hook so it does not interfere
-               ;; with any recursive minibuffer usage.
-               (remove-hook 'minibuffer-setup-hook ,hook)
-               (funcall ,funsym)))
+           ;; Use a symbol to make sure `add-hook' doesn't waste time
+           ;; in `equal'ity testing (bug#46326).
+           (,hook (make-symbol "minibuffer-setup")))
+       (fset ,hook (lambda ()
+                     ;; Clear out this hook so it does not interfere
+                     ;; with any recursive minibuffer usage.
+                     (remove-hook 'minibuffer-setup-hook ,hook)
+                     (funcall ,funsym)))
        (unwind-protect
            (progn
              (add-hook 'minibuffer-setup-hook ,hook ,@append)
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 423b180..8c62c94 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -2462,7 +2462,8 @@ the ephemeral group."
             (with-temp-file tmpfile
               (mm-disable-multibyte)
               (dolist (id ids)
-                (let ((file (concat "~/.emacs.d/debbugs-cache/" id)))
+                (let ((file (expand-file-name id (locate-user-emacs-file
+                                                  "debbugs-cache"))))
                   (if (and (not gnus-plugged)
                            (file-exists-p file))
                       (insert-file-contents file)
diff --git a/lisp/gnus/gnus-notifications.el b/lisp/gnus/gnus-notifications.el
index a4d198b..8646904 100644
--- a/lisp/gnus/gnus-notifications.el
+++ b/lisp/gnus/gnus-notifications.el
@@ -1,4 +1,4 @@
-;; gnus-notifications.el -- Send notification on new message in Gnus  -*- 
lexical-binding: t; -*-
+;;; gnus-notifications.el --- Send notification on new message in Gnus  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index eeb5ac8..aa4c753 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -8089,7 +8089,7 @@ Return nil if there are no unseen articles."
 
 (defun gnus-summary-first-unseen-or-unread-subject ()
   "Place the point on the subject line of the first unseen and unread article.
-If all article have been seen, on the subject line of the first unread
+If all articles have been seen, on the subject line of the first unread
 article."
   (interactive nil gnus-summary-mode)
   (prog1
diff --git a/lisp/gnus/legacy-gnus-agent.el b/lisp/gnus/legacy-gnus-agent.el
index 091e389..4f80089 100644
--- a/lisp/gnus/legacy-gnus-agent.el
+++ b/lisp/gnus/legacy-gnus-agent.el
@@ -1,4 +1,4 @@
-;;; gnus-agent.el --- Legacy unplugged support for Gnus  -*- lexical-binding: 
t; -*-
+;;; legacy-gnus-agent.el --- Legacy unplugged support for Gnus  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2004-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/gnus/mm-archive.el b/lisp/gnus/mm-archive.el
index 1ecceee..fdc83e1 100644
--- a/lisp/gnus/mm-archive.el
+++ b/lisp/gnus/mm-archive.el
@@ -108,4 +108,4 @@
 
 (provide 'mm-archive)
 
-;; mm-archive.el ends here
+;;; mm-archive.el ends here
diff --git a/lisp/gnus/spam-report.el b/lisp/gnus/spam-report.el
index 7d93f8a..a4234f8 100644
--- a/lisp/gnus/spam-report.el
+++ b/lisp/gnus/spam-report.el
@@ -378,4 +378,4 @@ Process queued spam reports."
 
 (provide 'spam-report)
 
-;;; spam-report.el ends here.
+;;; spam-report.el ends here
diff --git a/lisp/help-macro.el b/lisp/help-macro.el
index 81d2383..96edeaf 100644
--- a/lisp/help-macro.el
+++ b/lisp/help-macro.el
@@ -83,7 +83,8 @@ gives the window that lists the options."
   :type 'boolean
   :group 'help)
 
-(defmacro make-help-screen (fname help-line help-text helped-map)
+(defmacro make-help-screen (fname help-line help-text helped-map
+                                  &optional buffer-name)
   "Construct help-menu function name FNAME.
 When invoked, FNAME shows HELP-LINE and reads a command using HELPED-MAP.
 If the command is the help character, FNAME displays HELP-TEXT
@@ -132,7 +133,7 @@ and then returns."
                (when (or (eq char ??) (eq char help-char)
                          (memq char help-event-list))
                  (setq config (current-window-configuration))
-                 (pop-to-buffer " *Metahelp*" nil t)
+                 (pop-to-buffer (or ,buffer-name " *Metahelp*") nil t)
                  (and (fboundp 'make-frame)
                       (not (eq (window-frame)
                                prev-frame))
@@ -166,7 +167,12 @@ and then returns."
                                 (format "Type one of the options listed%s: "
                                         (if (pos-visible-in-window-p
                                              (point-max))
-                                            "" ", or SPACE or DEL to scroll")))
+                                            ""
+                                          (concat  ", or "
+                                                   
(help--key-description-fontified "\s") ; SPC
+                                                   " or "
+                                                   
(help--key-description-fontified "\d") ; DEL
+                                                   " to scroll"))))
                            char (aref key 0)))
 
                    ;; If this is a scroll bar command, just run it.
diff --git a/lisp/help.el b/lisp/help.el
index d4be9aa..4dcb235 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -187,59 +187,120 @@ Do not call this in the scope of `with-help-window'."
 ;; So keyboard macro definitions are documented correctly
 (fset 'defining-kbd-macro (symbol-function 'start-kbd-macro))
 
+
+;;; Help for help.  (a.k.a. `C-h C-h')
+
+(defvar help-for-help-buffer-name " *Metahelp*"
+  "Name of the `help-for-help' buffer.")
+
+(defface help-for-help-header '((t :height 1.26))
+  "Face used for headers in the `help-for-help' buffer."
+  :group 'help)
+
+(defun help--for-help-make-commands (commands)
+  "Create commands for `help-for-help' screen from COMMANDS."
+  (mapconcat
+   (lambda (cmd)
+     (if (listp cmd)
+         (let ((name (car cmd)) (desc (cadr cmd)))
+           (concat
+            "   "
+            (if (string-match (rx string-start "C-" word string-end) name)
+                ;; `help--key-description-fontified' would convert "C-m" to
+                ;; "RET" so we can't use it here.
+                (propertize name 'face 'help-key-binding)
+              (concat "\\[" name "]"))
+            (propertize "\t" 'display '(space :align-to 8))
+            desc))
+       ""))
+   commands "\n"))
+
+(defun help--for-help-make-sections (sections)
+  "Create sections for `help-for-help' screen from SECTIONS."
+  (mapconcat
+   (lambda (section)
+     (let ((title (car section)) (commands (cdr section)))
+       (concat
+        "\n\n"
+        (propertize title 'face 'help-for-help-header)
+        "\n\n"
+        (help--for-help-make-commands commands))))
+   sections ""))
+
 (defalias 'help 'help-for-help)
 (make-help-screen help-for-help
   (purecopy "Type a help option: [abcCdefFgiIkKlLmnprstvw.] C-[cdefmnoptw] or 
?")
-  "You have typed %THIS-KEY%, the help character.  Type a Help option:
-\(Use SPC or DEL to scroll through this text.  Type \\<help-map>\\[help-quit] 
to exit the Help command.)
-
-\\[apropos-command] PATTERN   Show commands whose name matches the PATTERN (a 
list of words
-              or a regexp).  See also \\[apropos].
-\\[describe-bindings]           Display all key bindings.
-\\[describe-key-briefly] KEYS      Display the command name run by the given 
key sequence.
-\\[describe-coding-system] CODING    Describe the given coding system, or RET 
for current ones.
-\\[apropos-documentation] PATTERN   Show a list of functions, variables, and 
other items whose
-              documentation matches the PATTERN (a list of words or a regexp).
-\\[view-echo-area-messages]           Go to the *Messages* buffer which logs 
echo-area messages.
-\\[describe-function] FUNCTION  Display documentation for the given function.
-\\[Info-goto-emacs-command-node] COMMAND   Show the Emacs manual's section 
that describes the command.
-\\[describe-gnu-project]           Display information about the GNU project.
-\\[view-hello-file]           Display the HELLO file which illustrates various 
scripts.
-\\[info]           Start the Info documentation reader: read included manuals.
-\\[describe-input-method] METHOD    Describe a specific input method, or RET 
for current.
-\\[describe-key] KEYS      Display the full documentation for the key sequence.
-\\[Info-goto-emacs-key-command-node] KEYS      Show the Emacs manual's section 
for the command bound to KEYS.
-\\[view-lossage]           Show last 300 input keystrokes (lossage).
-\\[describe-language-environment] LANG-ENV  Describe a specific language 
environment, or RET for current.
-\\[describe-mode]           Display documentation of current minor modes and 
current major mode,
-             including their special commands.
-\\[view-emacs-news]           Display news of recent Emacs changes.
-\\[describe-symbol] SYMBOL    Display the given function or variable's 
documentation and value.
-\\[finder-by-keyword] TOPIC     Find packages matching a given topic keyword.
-\\[describe-package] PACKAGE   Describe the given Emacs Lisp package.
-\\[info-emacs-manual]           Display the Emacs manual in Info mode.
-\\[info-display-manual]           Prompt for a manual and then display it in 
Info mode.
-\\[describe-syntax]           Display contents of current syntax table, plus 
explanations.
-\\[info-lookup-symbol] SYMBOL    Show the section for the given symbol in the 
Info manual
-              for the programming language used in this buffer.
-\\[help-with-tutorial]           Start the Emacs learn-by-doing tutorial.
-\\[describe-variable] VARIABLE  Display the given variable's documentation and 
value.
-\\[where-is] COMMAND   Display which keystrokes invoke the given command 
(where-is).
-\\[display-local-help]           Display any available local help at point in 
the echo area.
-
-\\[about-emacs]         Information about Emacs.
-\\[describe-copying]         Emacs copying permission (GNU General Public 
License).
-\\[view-emacs-debugging]         Instructions for debugging GNU Emacs.
-\\[view-external-packages]         External packages and information about 
Emacs.
-\\[view-emacs-FAQ]         Emacs FAQ.
-C-m         How to order printed Emacs manuals.
-C-n         News of recent Emacs changes.
-\\[describe-distribution]         Emacs ordering and distribution information.
-\\[view-emacs-problems]         Info about known Emacs problems.
-\\[search-forward-help-for-help]         Search forward \"help window\".
-\\[view-emacs-todo]         Emacs TODO list.
-\\[describe-no-warranty]         Information on absence of warranty for GNU 
Emacs."
-  help-map)
+  (concat
+   "\(Type "
+   (help--key-description-fontified "\s") ; SPC
+   " or "
+   (help--key-description-fontified "\d") ; DEL
+   " to scroll, "
+   (help--key-description-fontified "\C-s")
+   " to search, or \\<help-map>\\[help-quit] to exit.)"
+   (help--for-help-make-sections
+    '(("Commands, Keys and Functions"
+       ("describe-mode"
+        "Show help for current major and minor modes and their commands")
+       ("describe-bindings" "Show all key bindings")
+       ("describe-key" "Show help for key")
+       ("describe-key-briefly" "Show help for key briefly")
+       ("where-is" "Show which key runs a specific command")
+       ""
+       ("apropos-command"
+        "Search for commands (see also \\[apropos])")
+       ("apropos-documentation"
+        "Search documentation of functions, variables, and other items")
+       ("describe-function" "Show help for function")
+       ("describe-variable" "Show help for variable")
+       ("describe-symbol" "Show help for function or variable"))
+      ("Manuals"
+       ("info-emacs-manual" "Show Emacs manual")
+       ("Info-goto-emacs-command-node"
+        "Show Emacs manual section for command")
+       ("Info-goto-emacs-key-command-node"
+        "Show Emacs manual section for a key sequence")
+       ("info" "Show all installed manuals")
+       ("info-display-manual" "Show a specific manual")
+       ("info-lookup-symbol" "Show description of symbol in pertinent manual"))
+      ("Other Help Commands"
+       ("view-external-packages"
+        "Extending Emacs with external packages")
+       ("finder-by-keyword"
+        "Search for Emacs packages (see also \\[list-packages])")
+       ("describe-package" "Describe a specific Emacs package")
+       ""
+       ("help-with-tutorial" "Start the Emacs tutorial")
+       ("view-echo-area-messages"
+        "Show recent messages (from echo area)")
+       ("view-lossage" "Show last 300 input keystrokes (lossage)")
+       ("display-local-help" "Show local help at point"))
+      ("Miscellaneous"
+       ("about-emacs" "About Emacs")
+       ("view-emacs-FAQ" "Emacs FAQ")
+       ("C-n" "News of recent changes")
+       ("view-emacs-problems" "Known problems")
+       ("view-emacs-debugging" "Debugging Emacs")
+       ""
+       ("describe-gnu-project" "About the GNU project")
+       ("describe-copying"
+        "Emacs copying permission (GNU General Public License)")
+       ("describe-distribution"
+        "Emacs ordering and distribution information")
+       ("C-m" "Order printed manuals")
+       ("view-emacs-todo" "Emacs TODO")
+       ("describe-no-warranty"
+        "Information on absence of warranty"))
+      ("Internationalization and Coding Systems"
+       ("describe-input-method" "Describe input method")
+       ("describe-coding-system" "Describe coding system")
+       ("describe-language-environment"
+        "Describe language environment")
+       ("describe-syntax" "Show current syntax table")
+       ("view-hello-file"
+        "Display the HELLO file illustrating various scripts")))))
+  help-map
+  help-for-help-buffer-name)
 
 
 
@@ -885,7 +946,7 @@ current buffer."
   "Search forward \"help window\"."
   (interactive)
   ;; Move cursor to the "help window".
-  (pop-to-buffer " *Metahelp*")
+  (pop-to-buffer help-for-help-buffer-name)
   ;; Do incremental search forward.
   (isearch-forward nil t))
 
diff --git a/lisp/info.el b/lisp/info.el
index dd7e16f..82f0eb3 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -1,4 +1,4 @@
-;; info.el --- Info package for Emacs  -*- lexical-binding:t -*-
+;;; info.el --- Info package for Emacs  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1985-1986, 1992-2021 Free Software Foundation, Inc.
 
@@ -916,7 +916,8 @@ find a node."
          (when (and (not no-pop-to-dir)
                      (not Info-current-file))
            (Info-directory))
-         (user-error "Info file %s does not exist" filename)))
+          (user-error "Info file `%s' does not exist; consider installing it"
+                      filename)))
       filename))))
 
 (defun Info-find-node (filename nodename &optional no-going-back strict-case)
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index c055523..7874c20 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -3047,7 +3047,7 @@ on encoding."
               (#x1D000 . #x1FFFF)
               ;; (#x20000 . #xDFFFF) CJK Ideograph Extension A, B, etc, unused
               (#xE0000 . #xE01FF)))
-           (gc-cons-threshold 10000000)
+            (gc-cons-threshold (max gc-cons-threshold 10000000))
            (names (make-hash-table :size 42943 :test #'equal)))
         (dolist (range ranges)
           (let ((c (car range))
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 69fdc9d..9f3cfd7 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -972,12 +972,13 @@ Each element is an `isearch--state' struct where the 
slots are
 (defvar-local isearch-mode nil) ;; Name of the minor mode, if non-nil.
 
 (define-key global-map "\C-s" 'isearch-forward)
-(define-key esc-map "\C-s" 'isearch-forward-regexp)
+(define-key esc-map    "\C-s" 'isearch-forward-regexp)
 (define-key global-map "\C-r" 'isearch-backward)
-(define-key esc-map "\C-r" 'isearch-backward-regexp)
-(define-key search-map "w" 'isearch-forward-word)
-(define-key search-map "_" 'isearch-forward-symbol)
-(define-key search-map "." 'isearch-forward-symbol-at-point)
+(define-key esc-map    "\C-r" 'isearch-backward-regexp)
+(define-key search-map    "w" 'isearch-forward-word)
+(define-key search-map    "_" 'isearch-forward-symbol)
+(define-key search-map    "." 'isearch-forward-symbol-at-point)
+(define-key search-map "\M-." 'isearch-forward-thing-at-point)
 
 ;; Entry points to isearch-mode.
 
@@ -1157,6 +1158,42 @@ positive, or search for ARGth symbol backward if ARG is 
negative."
       (isearch-push-state)
       (isearch-update)))))
 
+(defcustom isearch-forward-thing-at-point '(region url symbol sexp)
+  "A list of symbols to try to get the \"thing\" at point.
+Each element of the list should be one of the symbols supported by
+`bounds-of-thing-at-point'.  This variable is used by the command
+`isearch-forward-thing-at-point' to yank the initial \"thing\"
+as text to the search string."
+  :type '(repeat (symbol :tag "Thing symbol"))
+  :version "28.1")
+
+(defun isearch-forward-thing-at-point ()
+  "Do incremental search forward for the \"thing\" found near point.
+Like ordinary incremental search except that the \"thing\" found at point
+is added to the search string initially.  The \"thing\" is defined by
+`bounds-of-thing-at-point'.  You can customize the variable
+`isearch-forward-thing-at-point' to define a list of symbols to try
+to find a \"thing\" at point.  For example, when the list contains
+the symbol `region' and the region is active, then text from the
+active region is added to the search string."
+  (interactive)
+  (isearch-forward nil 1)
+  (let ((bounds (seq-some (lambda (thing)
+                            (bounds-of-thing-at-point thing))
+                          isearch-forward-thing-at-point)))
+    (cond
+     (bounds
+      (when (use-region-p)
+        (deactivate-mark))
+      (when (< (car bounds) (point))
+       (goto-char (car bounds)))
+      (isearch-yank-string
+       (buffer-substring-no-properties (car bounds) (cdr bounds))))
+     (t
+      (setq isearch-error "No thing at point")
+      (isearch-push-state)
+      (isearch-update)))))
+
 
 ;; isearch-mode only sets up incremental search for the minor mode.
 ;; All the work is done by the isearch-mode commands.
@@ -1337,7 +1374,8 @@ The last thing is to trigger a new round of lazy 
highlighting."
                    ;; the X coordinate it returns is 1 pixel beyond
                    ;; the last visible one.
                    (>= (car visible-p)
-                        (* (window-max-chars-per-line) (frame-char-width))))
+                        (* (window-max-chars-per-line) (frame-char-width)))
+                    (< (car visible-p) 0))
                (set-window-hscroll (selected-window) current-scroll))))
        (if isearch-other-end
             (if (< isearch-other-end (point)) ; isearch-forward?
@@ -3056,10 +3094,6 @@ See more for options in `search-exit-option'."
            (goto-char isearch-pre-move-point))
          (isearch-search-and-update)))
      (setq isearch-pre-move-point nil))
-  ;; Terminate the search if point has moved to another buffer.
-  (unless (eq isearch--current-buffer (current-buffer))
-    (when (buffer-live-p isearch--current-buffer)
-      (with-current-buffer isearch--current-buffer (isearch-exit))))
   (force-mode-line-update))
 
 (defun isearch-quote-char (&optional count)
diff --git a/lisp/language/burmese.el b/lisp/language/burmese.el
index 373f25a..ade3566 100644
--- a/lisp/language/burmese.el
+++ b/lisp/language/burmese.el
@@ -55,3 +55,5 @@
                 (vector "." 0 #'font-shape-gstring))))
   (set-char-table-range composition-function-table '(#x1000 . #x107F) elt)
   (set-char-table-range composition-function-table '(#xAA60 . #xAA7B) elt))
+
+;;; burmese.el ends here
diff --git a/lisp/language/cham.el b/lisp/language/cham.el
index 3aac986..cbb3556 100644
--- a/lisp/language/cham.el
+++ b/lisp/language/cham.el
@@ -43,3 +43,5 @@ an Austronesian language spoken by some 245,000 Chams
 in Vietnam and Cambodia.")))
 
 (provide 'cham)
+
+;;; cham.el ends here
diff --git a/lisp/language/khmer.el b/lisp/language/khmer.el
index 6f08e60..471af40 100644
--- a/lisp/language/khmer.el
+++ b/lisp/language/khmer.el
@@ -35,4 +35,4 @@
   (set-char-table-range composition-function-table '(#x1780 . #x17FF) val)
   (set-char-table-range composition-function-table '(#x19E0 . #x19FF) val))
 
-;; khmer.el ends here
+;;; khmer.el ends here
diff --git a/lisp/language/sinhala.el b/lisp/language/sinhala.el
index 99a104e..89392ad 100644
--- a/lisp/language/sinhala.el
+++ b/lisp/language/sinhala.el
@@ -45,4 +45,4 @@
         "[\u0D80-\u0DFF]")
        0 #'font-shape-gstring)))
 
-;; sinhala.el ends here
+;;; sinhala.el ends here
diff --git a/lisp/language/tai-viet.el b/lisp/language/tai-viet.el
index 4549b11..366c392 100644
--- a/lisp/language/tai-viet.el
+++ b/lisp/language/tai-viet.el
@@ -56,3 +56,5 @@ The language name is spelled as \"ꪁꪫꪱꪣ ꪼꪕ\", and the script 
name is
 spelled as \"ꪎꪳ ꪼꪕ\".")))
 
 (provide 'tai-viet)
+
+;;; tai-viet.el ends here
diff --git a/lisp/language/thai-word.el b/lisp/language/thai-word.el
index 7a09bc3..5d0389c 100644
--- a/lisp/language/thai-word.el
+++ b/lisp/language/thai-word.el
@@ -1,4 +1,4 @@
-;;; thai-word.el -- find Thai word boundaries  -*- lexical-binding: t; -*-
+;;; thai-word.el --- find Thai word boundaries  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 
2010, 2011
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
@@ -11074,4 +11074,4 @@ With argument, do this that many times."
 ;; coding: utf-8
 ;; End:
 
-;; thai-word.el ends here
+;;; thai-word.el ends here
diff --git a/lisp/language/tv-util.el b/lisp/language/tv-util.el
index 1a530d3..207d76f 100644
--- a/lisp/language/tv-util.el
+++ b/lisp/language/tv-util.el
@@ -136,5 +136,6 @@
     (if (looking-at tai-viet-re)
        (tai-viet-compose-region from (match-end 0)))))
 
-;;
 (provide 'tai-viet-util)
+
+;;; tv-util.el ends here
diff --git a/lisp/leim/quail/croatian.el b/lisp/leim/quail/croatian.el
index 08f1e47..7402b81 100644
--- a/lisp/leim/quail/croatian.el
+++ b/lisp/leim/quail/croatian.el
@@ -1,4 +1,4 @@
-;;; croatian.el -- Quail package for inputting Croatian  -*-coding: utf-8; 
lexical-binding:t -*-
+;;; croatian.el --- Quail package for inputting Croatian  -*-coding: utf-8; 
lexical-binding:t -*-
 
 ;; Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/leim/quail/hebrew.el b/lisp/leim/quail/hebrew.el
index fc6bb80..28b2eb3 100644
--- a/lisp/leim/quail/hebrew.el
+++ b/lisp/leim/quail/hebrew.el
@@ -1,4 +1,4 @@
-;; hebrew.el --- Quail package for inputting Hebrew characters  -*- coding: 
utf-8; lexical-binding: t -*-
+;;; hebrew.el --- Quail package for inputting Hebrew characters  -*- coding: 
utf-8; lexical-binding: t -*-
 
 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
 ;;   2008, 2009, 2010, 2011
diff --git a/lisp/leim/quail/persian.el b/lisp/leim/quail/persian.el
index 4157f88..cb1f6e3 100644
--- a/lisp/leim/quail/persian.el
+++ b/lisp/leim/quail/persian.el
@@ -1,4 +1,4 @@
-;;; persian.el  --- Quail package for inputting Persian/Farsi keyboard -*- 
coding: utf-8; lexical-binding: t -*-
+;;; persian.el --- Quail package for inputting Persian/Farsi keyboard  -*- 
coding: utf-8; lexical-binding: t -*-
 
 ;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/mail/rmail-spam-filter.el b/lisp/mail/rmail-spam-filter.el
index d833685..fbac9e0 100644
--- a/lisp/mail/rmail-spam-filter.el
+++ b/lisp/mail/rmail-spam-filter.el
@@ -555,4 +555,4 @@ checks to see if the old format is used, and updates it if 
necessary."
 
 (provide 'rmail-spam-filter)
 
-;;; rmail-spam-filter ends here
+;;; rmail-spam-filter.el ends here
diff --git a/lisp/mail/rmailmm.el b/lisp/mail/rmailmm.el
index e08500a..99bff66 100644
--- a/lisp/mail/rmailmm.el
+++ b/lisp/mail/rmailmm.el
@@ -784,9 +784,11 @@ directly."
           (let ((encoding (rmail-mime-entity-transfer-encoding entity)))
             (setq size (- (aref body 1) (aref body 0)))
             (cond ((string= encoding "base64")
-                   (setq size (/ (* size 3) 4)))
+                    ;; https://en.wikipedia.org/wiki/Base64#MIME
+                   (setq size (* size 0.73)))
                   ((string= encoding "quoted-printable")
-                   (setq size (/ (* size 7) 3)))))))
+                    ;; Assume most of the text is ASCII...
+                   (setq size (/ (* size 5) 7)))))))
 
     (cond
      ((string-match "text/html" content-type)
diff --git a/lisp/mail/uudecode.el b/lisp/mail/uudecode.el
index fdd402e..026356e 100644
--- a/lisp/mail/uudecode.el
+++ b/lisp/mail/uudecode.el
@@ -1,4 +1,4 @@
-;;; uudecode.el -- elisp native uudecode  -*- lexical-binding:t -*-
+;;; uudecode.el --- elisp native uudecode  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1998-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/mh-e/mh-search.el b/lisp/mh-e/mh-search.el
index 9df7c32..b3a250b 100644
--- a/lisp/mh-e/mh-search.el
+++ b/lisp/mh-e/mh-search.el
@@ -1,4 +1,4 @@
-;;; mh-search  ---  MH-Search mode  -*- lexical-binding: t; -*-
+;;; mh-search.el --- MH-Search mode  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1993, 1995, 2001-2021 Free Software Foundation, Inc.
 
@@ -1943,4 +1943,4 @@ folder buffer."
 ;; sentence-end-double-space: nil
 ;; End:
 
-;;; mh-search ends here
+;;; mh-search.el ends here
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index c900b0d..98691c2 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -271,7 +271,7 @@ the form (concat S2 S)."
     (let* ((str (if (string-prefix-p s1 string completion-ignore-case)
                     (concat s2 (substring string (length s1)))))
            (res (if str (complete-with-action action table str pred))))
-      (when res
+      (when (or res (eq (car-safe action) 'boundaries))
         (cond
          ((eq (car-safe action) 'boundaries)
           (let ((beg (or (and (eq (car-safe res) 'boundaries) (cadr res)) 0)))
@@ -489,12 +489,12 @@ for use at QPOS."
              (ufull (if (zerop (length qsuffix)) ustring
                       (funcall unquote (concat string qsuffix))))
              ;; If (not (string-prefix-p ustring ufull)) we have a problem:
-             ;; the unquoting the qfull gives something "unrelated" to ustring.
+             ;; unquoting the qfull gives something "unrelated" to ustring.
              ;; E.g. "~/" and "/" where "~//" gets unquoted to just "/" (see
              ;; bug#47678).
              ;; In that case we can't even tell if we're right before the
              ;; "/" or right after it (aka if this "/" is from qstring or
-             ;; from qsuffix), which which usuffix to use is very unclear.
+             ;; from qsuffix), thus which usuffix to use is very unclear.
              (usuffix (if (string-prefix-p ustring ufull)
                           (substring ufull (length ustring))
                         ;; FIXME: Maybe "" is preferable/safer?
@@ -1355,6 +1355,52 @@ scroll the window of possible completions."
     (if (eq (car bounds) base) md-at-point
       (completion-metadata (substring string 0 base) table pred))))
 
+(defun minibuffer--sort-by-key (elems keyfun)
+  "Return ELEMS sorted by increasing value of their KEYFUN.
+KEYFUN takes an element of ELEMS and should return a numerical value."
+  (mapcar #'cdr
+          (sort (mapcar (lambda (x) (cons (funcall keyfun x) x)) elems)
+                 #'car-less-than-car)))
+
+(defun minibuffer--sort-by-position (hist elems)
+  "Sort ELEMS by their position in HIST."
+  (let ((hash (make-hash-table :test #'equal :size (length hist)))
+        (index 0))
+    ;; Record positions in hash
+    (dolist (c hist)
+      (unless (gethash c hash)
+        (puthash c index hash))
+      (cl-incf index))
+    (minibuffer--sort-by-key
+     elems (lambda (x) (gethash x hash most-positive-fixnum)))))
+
+(defun minibuffer--sort-by-length-alpha (elems)
+  "Sort ELEMS first by length, then alphabetically."
+  (sort elems (lambda (c1 c2)
+                (or (< (length c1) (length c2))
+                    (and (= (length c1) (length c2))
+                         (string< c1 c2))))))
+
+(defun minibuffer--sort-preprocess-history (base)
+  "Preprocess history.
+Remove completion BASE prefix string from history elements."
+  (let* ((def (if (stringp minibuffer-default)
+                  minibuffer-default
+                (car-safe minibuffer-default)))
+         (hist (and (not (eq minibuffer-history-variable t))
+                    (symbol-value minibuffer-history-variable)))
+         (base-size (length base)))
+    ;; Default comes first.
+    (setq hist (if def (cons def hist) hist))
+    ;; Drop base string from the history elements.
+    (if (= base-size 0)
+        hist
+      (delq nil (mapcar
+                 (lambda (c)
+                   (when (string-prefix-p base c)
+                     (substring c base-size)))
+                 hist)))))
+
 (defun completion-all-sorted-completions (&optional start end)
   (or completion-all-sorted-completions
       (let* ((start (or start (minibuffer-prompt-end)))
@@ -1384,23 +1430,18 @@ scroll the window of possible completions."
           (setq all (delete-dups all))
           (setq last (last all))
 
-          (cond
-           (sort-fun
-            (setq all (funcall sort-fun all)))
-           (t
-            ;; Prefer shorter completions, by default.
-            (setq all (sort all (lambda (c1 c2) (< (length c1) (length c2)))))
-            (if (minibufferp)
-                ;; Prefer recently used completions and put the default, if
-                ;; it exists, on top.
-                (let ((hist (symbol-value minibuffer-history-variable)))
-                  (setq all
-                        (sort all
-                              (lambda (c1 c2)
-                                (cond ((equal c1 minibuffer-default) t)
-                                      ((equal c2 minibuffer-default) nil)
-                                      (t (> (length (member c1 hist))
-                                            (length (member c2 hist))))))))))))
+          (if sort-fun
+              (setq all (funcall sort-fun all))
+            ;; Sort first by length and alphabetically.
+            (setq all (minibuffer--sort-by-length-alpha all))
+            ;; Sort by history position, put the default, if it
+            ;; exists, on top.
+            (when (minibufferp)
+              (setq all (minibuffer--sort-by-position
+                         (minibuffer--sort-preprocess-history
+                          (substring string 0 base-size))
+                         all))))
+
           ;; Cache the result.  This is not just for speed, but also so that
           ;; repeated calls to minibuffer-force-complete can cycle through
           ;; all possibilities.
@@ -1423,7 +1464,7 @@ scroll the window of possible completions."
    ;; test-completion, then we shouldn't exit, but that should be rare.
    (lambda ()
      (if minibuffer--require-match
-         (minibuffer-message "Incomplete")
+         (completion--message "Incomplete")
        ;; If a match is not required, exit after all.
        (exit-minibuffer)))))
 
@@ -2008,7 +2049,7 @@ variables.")
           ;; the sole completion, then hide (previous&stale) completions.
           (minibuffer-hide-completions)
           (ding)
-          (minibuffer-message
+          (completion--message
            (if completions "Sole completion" "No completions")))
 
       (let* ((last (last completions))
@@ -2444,10 +2485,33 @@ with `minibuffer-local-must-match-map'.")
 (defvar minibuffer-local-filename-must-match-map (make-sparse-keymap))
 (make-obsolete-variable 'minibuffer-local-filename-must-match-map nil "24.1")
 
-(let ((map minibuffer-local-ns-map))
-  (define-key map " " 'exit-minibuffer)
-  (define-key map "\t" 'exit-minibuffer)
-  (define-key map "?" 'self-insert-and-exit))
+(defvar minibuffer-local-ns-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map minibuffer-local-map)
+    (define-key map " "  #'exit-minibuffer)
+    (define-key map "\t" #'exit-minibuffer)
+    (define-key map "?"  #'self-insert-and-exit)
+    map)
+  "Local keymap for the minibuffer when spaces are not allowed.")
+
+(defun read-no-blanks-input (prompt &optional initial inherit-input-method)
+  "Read a string from the terminal, not allowing blanks.
+Prompt with PROMPT.  Whitespace terminates the input.  If INITIAL is
+non-nil, it should be a string, which is used as initial input, with
+point positioned at the end, so that SPACE will accept the input.
+\(Actually, INITIAL can also be a cons of a string and an integer.
+Such values are treated as in `read-from-minibuffer', but are normally
+not useful in this function.)
+
+Third arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits
+the current input method and the setting of`enable-multibyte-characters'.
+
+If `inhibit-interaction' is non-nil, this function will signal an
+`inhibited-interaction' error."
+  (read-from-minibuffer prompt initial minibuffer-local-ns-map
+                       nil minibuffer-history nil inherit-input-method))
+
+;;; Major modes for the minibuffer
 
 (defvar minibuffer-inactive-mode-map
   (let ((map (make-keymap)))
@@ -2474,6 +2538,18 @@ not active.")
   "Major mode to use in the minibuffer when it is not active.
 This is only used when the minibuffer area has no active minibuffer.")
 
+(defvaralias 'minibuffer-mode-map 'minibuffer-local-map)
+
+(define-derived-mode minibuffer-mode nil "Minibuffer"
+  "Major mode used for active minibuffers.
+
+For customizing this mode, it is better to use
+`minibuffer-setup-hook' and `minibuffer-exit-hook' rather than
+the mode hook of this mode."
+  :syntax-table nil
+  :abbrev-table nil
+  :interactive nil)
+
 ;;; Completion tables.
 
 (defun minibuffer--double-dollars (str)
diff --git a/lisp/misearch.el b/lisp/misearch.el
index 1f0dd31..335efb9 100644
--- a/lisp/misearch.el
+++ b/lisp/misearch.el
@@ -206,7 +206,7 @@ search status stack."
      (multi-isearch-pop-state cmd ,(current-buffer))))
 
 (defun multi-isearch-pop-state (_cmd buffer)
-  "Restore the multiple buffers search state.
+  "Restore the multiple buffers search state in BUFFER.
 Switch to the buffer restored from the search status stack."
   (unless (equal buffer (current-buffer))
     (switch-to-buffer (setq multi-isearch-current-buffer buffer))))
diff --git a/lisp/mpc.el b/lisp/mpc.el
index 315d8c0..f730275 100644
--- a/lisp/mpc.el
+++ b/lisp/mpc.el
@@ -183,7 +183,7 @@ numerically rather than lexicographically."
                     (abs res))
                 res))))))))
 
-(define-obsolete-function-alias 'mpc-string-prefix-p 'string-prefix-p "24.3")
+(define-obsolete-function-alias 'mpc-string-prefix-p #'string-prefix-p "24.3")
 
 ;; This can speed up mpc--song-search significantly.  The table may grow
 ;; very large, tho.  It's only bounded by the fact that it gets flushed
@@ -291,11 +291,11 @@ defaults to 6600 and HOST defaults to localhost."
           (let ((plist (process-plist mpc-proc)))
             (while plist (process-put proc (pop plist) (pop plist)))))
         (mpc-proc-buffer proc 'mpd-commands (current-buffer))
-        (process-put proc 'callback 'ignore)
+        (process-put proc 'callback #'ignore)
         (process-put proc 'ready nil)
         (clrhash mpc--find-memoize)
-        (set-process-filter proc 'mpc--proc-filter)
-        (set-process-sentinel proc 'ignore)
+        (set-process-filter proc #'mpc--proc-filter)
+        (set-process-sentinel proc #'ignore)
         (set-process-query-on-exit-flag proc nil)
         ;; This may be called within a process filter ;-(
         (with-local-quit (mpc-proc-sync proc))
@@ -376,7 +376,7 @@ which will be concatenated with proper quoting before 
passing them to MPD."
         (mpc--debug "Send \"%s\"" cmd)
         (process-send-string
          proc (concat (if (stringp cmd) cmd
-                        (mapconcat 'mpc--proc-quote-string cmd " "))
+                        (mapconcat #'mpc--proc-quote-string cmd " "))
                       "\n")))
       (if callback
           ;; (let ((buf (current-buffer)))
@@ -388,7 +388,7 @@ which will be concatenated with proper quoting before 
passing them to MPD."
                        ;;              (set-buffer buf)))))
                        )
         ;; If `callback' is nil, we're executing synchronously.
-        (process-put proc 'callback 'ignore)
+        (process-put proc 'callback #'ignore)
         ;; This returns the process's buffer.
         (mpc-proc-sync proc)))))
 
@@ -398,7 +398,7 @@ which will be concatenated with proper quoting before 
passing them to MPD."
   (concat "command_list_begin\n"
           (mapconcat (lambda (cmd)
                        (if (stringp cmd) cmd
-                         (mapconcat 'mpc--proc-quote-string cmd " ")))
+                         (mapconcat #'mpc--proc-quote-string cmd " ")))
                      cmds
                      "\n")
           "\ncommand_list_end"))
@@ -488,9 +488,9 @@ to call FUN for any change whatsoever.")
 
 (defvar mpc--status-timer nil)
 (defun mpc--status-timer-start ()
-  (add-hook 'pre-command-hook 'mpc--status-timer-stop)
+  (add-hook 'pre-command-hook #'mpc--status-timer-stop)
   (unless mpc--status-timer
-    (setq mpc--status-timer (run-with-timer 1 1 'mpc--status-timer-run))))
+    (setq mpc--status-timer (run-with-timer 1 1 #'mpc--status-timer-run))))
 (defun mpc--status-timer-stop ()
   (when mpc--status-timer
     (cancel-timer mpc--status-timer)
@@ -510,7 +510,7 @@ to call FUN for any change whatsoever.")
     ;; Turn it off even if we'll start it again, in case it changes the delay.
     (cancel-timer mpc--status-idle-timer))
   (setq mpc--status-idle-timer
-        (run-with-idle-timer 1 t 'mpc--status-idle-timer-run))
+        (run-with-idle-timer 1 t #'mpc--status-idle-timer-run))
   ;; Typically, the idle timer is started from the mpc--status-callback,
   ;; which is run asynchronously while we're already idle (we typically
   ;; just started idling), so the timer itself will only be run the next
@@ -525,7 +525,7 @@ to call FUN for any change whatsoever.")
         (unless really
           ;; We don't completely stop the timer, so that if some other MPD
           ;; client starts playback, we may get a chance to notice it.
-          (run-with-idle-timer 10 t 'mpc--status-idle-timer-run))))
+          (run-with-idle-timer 10 t #'mpc--status-idle-timer-run))))
 (defun mpc--status-idle-timer-run ()
   (mpc--status-timer-start)
   (mpc--status-timer-run))
@@ -596,7 +596,7 @@ Any call to `mpc-status-refresh' may cause it to be 
restarted."
 ;;       (dotimes (i (string-to-number pos)) (mpc--queue-pop))
 ;;       (mpc-proc-cmd (mpc-proc-cmd-list
 ;;                      (make-list (string-to-number pos) "delete 0"))
-;;                     'ignore)
+;;                     #'ignore)
 ;;       (if (not (equal (cdr (assq 'file mpc-status))
 ;;                       (mpc--queue-head)))
 ;;           (message "MPC's queue is out of sync"))))))
@@ -683,7 +683,7 @@ The songs are returned as alists."
           (let ((plsongs (mpc-cmd-find 'Playlist pl)))
             (if (not (mpc-cmd-special-tag-p other-tag))
                 (when (member (cons other-tag value)
-                              (apply 'append plsongs))
+                              (apply #'append plsongs))
                   (push pl pls))
               ;; Problem N°2: we compute the intersection whereas all
               ;; we care about is whether it's empty.  So we could
@@ -694,15 +694,15 @@ The songs are returned as alists."
               ;; good enough because this is only used with "search", which
               ;; doesn't pay attention to playlists and URLs anyway.
               (let* ((osongs (mpc-cmd-find other-tag value))
-                     (ofiles (mpc-assq-all 'file (apply 'append osongs)))
-                     (plfiles (mpc-assq-all 'file (apply 'append plsongs))))
+                     (ofiles (mpc-assq-all 'file (apply #'append osongs)))
+                     (plfiles (mpc-assq-all 'file (apply #'append plsongs))))
                 (when (seq-intersection plfiles ofiles)
                   (push pl pls)))))))
       pls))
 
    ((eq tag 'Directory)
     (if (null other-tag)
-        (apply 'nconc
+        (apply #'nconc
                (mpc-assq-all 'directory
                              (mpc-proc-buf-to-alist
                               (mpc-proc-cmd "lsinfo")))
@@ -725,7 +725,7 @@ The songs are returned as alists."
       ;; If there's an other-tag, then just extract the dir info from the
       ;; list of other-tag's songs.
       (let* ((other-songs (mpc-cmd-find other-tag value))
-             (files (mpc-assq-all 'file (apply 'append other-songs)))
+             (files (mpc-assq-all 'file (apply #'append other-songs)))
              (dirs '()))
         (dolist (file files)
           (let ((dir (file-name-directory file)))
@@ -759,7 +759,7 @@ The songs are returned as alists."
 
    ((null other-tag)
     (condition-case nil
-        (mapcar 'cdr (mpc-proc-cmd-to-alist (list "list" (symbol-name tag))))
+        (mapcar #'cdr (mpc-proc-cmd-to-alist (list "list" (symbol-name tag))))
       (mpc-proc-error
        ;; If `tag' is not one of the expected tags, MPD burps about not
        ;; having the relevant table.
@@ -770,7 +770,7 @@ The songs are returned as alists."
     (condition-case nil
         (if (mpc-cmd-special-tag-p other-tag)
             (signal 'mpc-proc-error "Not implemented")
-          (mapcar 'cdr
+          (mapcar #'cdr
                   (mpc-proc-cmd-to-alist
                    (list "list" (symbol-name tag)
                          (symbol-name other-tag) value))))
@@ -781,7 +781,7 @@ The songs are returned as alists."
          (mpc-assq-all tag
                        ;; Don't use `nconc' now that mpc-cmd-find may
                        ;; return a memoized result.
-                       (apply 'append other-songs))))))))
+                       (apply #'append other-songs))))))))
 
 (defun mpc-cmd-stop (&optional callback)
   (mpc-proc-cmd "stop" callback))
@@ -847,7 +847,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
                          ;; Sort them from last to first, so the renumbering
                          ;; caused by the earlier deletions don't affect
                          ;; later ones.
-                         (sort (copy-sequence song-poss) '>))))
+                         (sort (copy-sequence song-poss) #'>))))
     (if (stringp playlist)
         (puthash (cons 'Playlist playlist) nil mpc--find-memoize)))
 
@@ -871,7 +871,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
               ;; Sort them from last to first, so the renumbering
               ;; caused by the earlier deletions affect
               ;; later ones a bit less.
-              (sort (copy-sequence song-poss) '>))))
+              (sort (copy-sequence song-poss) #'>))))
     (if (stringp playlist)
         (puthash (cons 'Playlist playlist) nil mpc--find-memoize))))
 
@@ -882,7 +882,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
     (unless callback (mpc-proc-sync))))
 
 (defun mpc-cmd-tagtypes ()
-  (mapcar 'cdr (mpc-proc-cmd-to-alist "tagtypes")))
+  (mapcar #'cdr (mpc-proc-cmd-to-alist "tagtypes")))
 
 ;; This was never integrated into MPD.
 ;; (defun mpc-cmd-download (file)
@@ -998,7 +998,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
                    (cond
                     ((>= col 0) (insert str))
                     (t (insert (substring str (min (length str) (- col))))))))
-         (pred nil))
+         (pred #'always))
     (while (string-match 
"%\\(?:%\\|\\(-\\)?\\([0-9]+\\)?{\\([[:alpha:]][[:alnum:]]*\\)\\(?:-\\([^}]+\\)\\)?}\\)"
 format-spec pos)
       (let ((pre-text (substring format-spec pos (match-beginning 0))))
         (funcall insert pre-text)
@@ -1017,7 +1017,7 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                   (pcase tag
                     ((or 'Time 'Duration)
                      (let ((time (cdr (or (assq 'time info) (assq 'Time 
info)))))
-                       (setq pred (list nil)) ;Just assume it's never eq.
+                       (setq pred #'ignore) ;Just assume it's never eq.
                        (when time
                          (mpc-secs-to-time (if (and (eq tag 'Duration)
                                                     (string-match ":" time))
@@ -1026,7 +1026,11 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                     ('Cover
                      (let ((dir (file-name-directory (cdr (assq 'file info)))))
                        ;; (debug)
-                       (push `(equal ',dir (file-name-directory (cdr (assq 
'file info)))) pred)
+                       (setq pred
+                             (lambda (info)
+                               (and (funcall pred info)
+                                    (equal dir (file-name-directory
+                                                (cdr (assq 'file info)))))))
                        (if-let* ((covers '(".folder.png" "cover.jpg" 
"folder.jpg"))
                                  (cover (cl-loop for file in (directory-files 
(mpc-file-local-copy dir))
                                                  if (member (downcase file) 
covers)
@@ -1043,7 +1047,7 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                              (setq size nil)
                              (propertize dir 'display image))
                          ;; Make sure we return something on which we can
-                         ;; place the `mpc-pred' property, as
+                         ;; place the `mpc--uptodate-p' property, as
                          ;; a negative-cache.  We could also use
                          ;; a default cover.
                          (progn (setq size nil) " "))))
@@ -1052,7 +1056,10 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                          ;; than the URL in `file'.  Pretend it's in `Title'.
                          (when (and (null val) (eq tag 'Title))
                            (setq val (cdr (assq 'file info))))
-                         (push `(equal ',val (cdr (assq ',tag info))) pred)
+                         (setq pred
+                               (lambda (info)
+                                 (and (funcall pred info)
+                                      (equal val (cdr (assq ',tag info))))))
                          (cond
                           ((not (and (eq tag 'Date) (stringp val))) val)
                           ;; For "date", only keep the year!
@@ -1080,11 +1087,11 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
                                   'follow-link t
                                   'keymap `(keymap
                                             (mouse-2
-                                             . (lambda ()
-                                                 (interactive)
-                                                 (mpc-constraints-push 
'noerror)
-                                                 (mpc-constraints-restore
-                                                  ',(list (list tag 
text)))))))))
+                                             . ,(lambda ()
+                                                  (interactive)
+                                                  (mpc-constraints-push 
'noerror)
+                                                  (mpc-constraints-restore
+                                                   ',(list (list tag 
text)))))))))
               (funcall insert
                        (concat (when size
                                  (propertize " " 'display
@@ -1097,35 +1104,34 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
           (if (null size) (setq col (+ col textwidth postwidth))
             (insert space)
             (setq col (+ col size))))))
-    (put-text-property start (point) 'mpc-pred
-                       `(lambda (info) (and ,@(nreverse pred))))))
+    (put-text-property start (point) 'mpc--uptodate-p pred)))
 
 ;;; The actual UI code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defvar mpc-mode-map
   (let ((map (make-sparse-keymap)))
-    ;; (define-key map "\e" 'mpc-stop)
-    (define-key map "q" 'mpc-quit)
-    (define-key map "\r" 'mpc-select)
-    (define-key map [(shift return)] 'mpc-select-toggle)
-    (define-key map [mouse-2] 'mpc-select)
-    (define-key map [S-mouse-2] 'mpc-select-extend)
-    (define-key map [C-mouse-2] 'mpc-select-toggle)
-    (define-key map [drag-mouse-2] 'mpc-drag-n-drop)
+    ;; (define-key map "\e"          #'mpc-stop)
+    (define-key map "q"              #'mpc-quit)
+    (define-key map "\r"             #'mpc-select)
+    (define-key map [(shift return)] #'mpc-select-toggle)
+    (define-key map [mouse-2]        #'mpc-select)
+    (define-key map [S-mouse-2]      #'mpc-select-extend)
+    (define-key map [C-mouse-2]      #'mpc-select-toggle)
+    (define-key map [drag-mouse-2]   #'mpc-drag-n-drop)
     ;; We use `always' because a binding to t is like a binding to nil.
     (define-key map [follow-link] :always)
     ;; But follow-link doesn't apply blindly to header-line and
     ;; mode-line clicks.
-    (define-key map [header-line follow-link] 'ignore)
-    (define-key map [mode-line follow-link] 'ignore)
+    (define-key map [header-line follow-link] #'ignore)
+    (define-key map [mode-line follow-link] #'ignore)
     ;; Doesn't work because the first click changes the buffer, so the second
     ;; is applied elsewhere :-(
-    ;; (define-key map [(double mouse-2)] 'mpc-play-at-point)
-    (define-key map "p" 'mpc-pause)
-    (define-key map "s" 'mpc-toggle-play)
-    (define-key map ">" 'mpc-next)
-    (define-key map "<" 'mpc-prev)
-    (define-key map "g" 'mpc-seek-current)
+    ;; (define-key map [(double mouse-2)] #'mpc-play-at-point)
+    (define-key map "p" #'mpc-pause)
+    (define-key map "s" #'mpc-toggle-play)
+    (define-key map ">" #'mpc-next)
+    (define-key map "<" #'mpc-prev)
+    (define-key map "g" #'mpc-seek-current)
     map))
 
 (easy-menu-define mpc-mode-menu mpc-mode-map
@@ -1217,7 +1223,7 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
           (when (assq 'file mpc-status)
             (let ((inhibit-read-only t))
               (dolist (spec mpc-status-buffer-format)
-                (let ((pred (get-text-property (point) 'mpc-pred)))
+                (let ((pred (get-text-property (point) 'mpc--uptodate-p)))
                   (if (and pred (funcall pred mpc-status))
                       (forward-line)
                     (delete-region (point) (line-beginning-position 2))
@@ -1277,7 +1283,7 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
   ;; Restore the selection.  I.e. move the overlays back to their
   ;; corresponding location.  Actually which overlay is used for what
   ;; doesn't matter.
-  (mapc 'delete-overlay mpc-select)
+  (mapc #'delete-overlay mpc-select)
   (setq mpc-select nil)
   (dolist (elem selection)
     ;; After an update, some elements may have disappeared.
@@ -1302,7 +1308,7 @@ If PLAYLIST is t or nil or missing, use the main 
playlist."
   (interactive (list last-nonmenu-event))
   (mpc-event-set-point event)
   (if (and (bolp) (eobp)) (forward-line -1))
-  (mapc 'delete-overlay mpc-select)
+  (mapc #'delete-overlay mpc-select)
   (setq mpc-select nil)
   (if (mpc-tagbrowser-all-p)
       nil
@@ -1662,7 +1668,7 @@ Return non-nil if a selection was deactivated."
       ;; (unless (equal constraints mpc-constraints)
       ;;   (setq-local mpc-constraints constraints)
       (dolist (cst constraints)
-        (let ((vals (apply 'mpc-union
+        (let ((vals (apply #'mpc-union
                            (mapcar (lambda (val)
                                      (mpc-cmd-list mpc-tag (car cst) val))
                                    (cdr cst)))))
@@ -1681,7 +1687,7 @@ Return non-nil if a selection was deactivated."
               (setq mpc--changed-selection t))
             (unless nodeactivate
               (setq selection nil)
-              (mapc 'delete-overlay mpc-select)
+              (mapc #'delete-overlay mpc-select)
               (setq mpc-select nil)
               (mpc-tagbrowser-all-select))))
 
@@ -1726,7 +1732,7 @@ Return non-nil if a selection was deactivated."
 (defvar mpc-tagbrowser-dir-mode-map
   (let ((map (make-sparse-keymap)))
     (set-keymap-parent map mpc-tagbrowser-mode-map)
-    (define-key map [?\M-\C-m] 'mpc-tagbrowser-dir-toggle)
+    (define-key map [?\M-\C-m] #'mpc-tagbrowser-dir-toggle)
     map))
 
 ;; (defvar mpc-tagbrowser-dir-keywords
@@ -1838,12 +1844,12 @@ A value of t means the main playlist.")
   (let ((map (make-sparse-keymap)))
     ;; Bind the up-events rather than the down-event, so the
     ;; `message' isn't canceled by the subsequent up-event binding.
-    (define-key map [down-mouse-1] 'ignore)
-    (define-key map [mouse-1] 'mpc-volume-mouse-set)
-    (define-key map [header-line mouse-1] 'mpc-volume-mouse-set)
-    (define-key map [header-line down-mouse-1] 'ignore)
-    (define-key map [mode-line mouse-1] 'mpc-volume-mouse-set)
-    (define-key map [mode-line down-mouse-1] 'ignore)
+    (define-key map [down-mouse-1]             #'ignore)
+    (define-key map [mouse-1]                  #'mpc-volume-mouse-set)
+    (define-key map [header-line mouse-1]      #'mpc-volume-mouse-set)
+    (define-key map [header-line down-mouse-1] #'ignore)
+    (define-key map [mode-line mouse-1]        #'mpc-volume-mouse-set)
+    (define-key map [mode-line down-mouse-1]   #'ignore)
     map))
 
 (defvar mpc-volume nil) (put 'mpc-volume 'risky-local-variable t)
@@ -1876,7 +1882,7 @@ A value of t means the main playlist.")
         (progn
           (message "MPD volume already at %s%%" newvol)
           (ding))
-      (mpc-proc-cmd (list "setvol" newvol) 'mpc-status-refresh)
+      (mpc-proc-cmd (list "setvol" newvol) #'mpc-status-refresh)
       (message "Set MPD volume to %s%%" newvol))))
 
 (defun mpc-volume-widget (vol &optional size)
@@ -1913,7 +1919,7 @@ A value of t means the main playlist.")
 
 (defvar mpc-songs-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map [remap mpc-select] 'mpc-songs-jump-to)
+    (define-key map [remap mpc-select] #'mpc-songs-jump-to)
     map))
 
 (defvar mpc-songpointer-set-visible nil)
@@ -1961,7 +1967,7 @@ This is used so that they can be compared with `eq', 
which is needed for
                   (setq mpc-songs-playlist (cadr cst)))
               ;; We don't do anything really special here for playlists,
               ;; because it's unclear what's a correct "union" of playlists.
-              (let ((vals (apply 'mpc-union
+              (let ((vals (apply #'mpc-union
                                  (mapcar (lambda (val)
                                            (mpc-cmd-find (car cst) val))
                                          (cdr cst)))))
@@ -2335,7 +2341,7 @@ This is used so that they can be compared with `eq', 
which is needed for
   "Quit Music Player Daemon."
   (interactive)
   (let* ((proc mpc-proc)
-         (bufs (mapcar 'cdr (if proc (process-get proc 'buffers))))
+         (bufs (mapcar #'cdr (if proc (process-get proc 'buffers))))
          (wins (mapcar (lambda (buf) (get-buffer-window buf 0)) bufs))
          (song-buf (mpc-songs-buf))
          frames)
@@ -2356,7 +2362,7 @@ This is used so that they can be compared with `eq', 
which is needed for
             (unless (memq (window-buffer win) bufs) (setq delete nil)))
           (if delete (ignore-errors (delete-frame frame))))))
     ;; Then kill the buffers.
-    (mapc 'kill-buffer bufs)
+    (mapc #'kill-buffer bufs)
     (mpc-status-stop)
     (if proc (delete-process proc))))
 
@@ -2519,7 +2525,7 @@ If stopped, start playback."
               (setq mpc-last-seek-time
                     (cons currenttime (setq time (+ time step))))
               (mpc-proc-cmd (list "seekid" songid time)
-                            'mpc-status-refresh))))
+                            #'mpc-status-refresh))))
       (let ((status (mpc-cmd-status)))
         (let* ((songid (cdr (assq 'songid status)))
                        (time (if songid (string-to-number
@@ -2529,7 +2535,7 @@ If stopped, start playback."
                         (lambda ()
                           (mpc-proc-cmd (list "seekid" songid
                                               (setq time (+ time step)))
-                                        'mpc-status-refresh)))))
+                                        #'mpc-status-refresh)))))
             (while (mouse-movement-p
                     (event-basic-type (setq event (read-event)))))
             (cancel-timer timer)))))))
@@ -2584,7 +2590,7 @@ If stopped, start playback."
                   ((and (>= songtime songduration) mpc--faster-toggle-forward)
                    ;; Skip to the beginning of the next song.
                    (if (not (equal (cdr (assq 'state mpc-status)) "play"))
-                       (mpc-proc-cmd "next" 'mpc-status-refresh)
+                       (mpc-proc-cmd "next" #'mpc-status-refresh)
                      ;; If we're playing, this is done automatically, so we
                      ;; don't need to do anything, or rather we *shouldn't*
                      ;; do anything otherwise there's a race condition where
@@ -2616,7 +2622,7 @@ If stopped, start playback."
                        (condition-case nil
                            (mpc-proc-cmd
                             (list "seekid" songid songtime)
-                            'mpc-status-refresh)
+                            #'mpc-status-refresh)
                          (mpc-proc-error (mpc-status-refresh)))))))))))
         (setq mpc--faster-toggle-forward (> step 0))
         (funcall fun)                   ;Initialize values.
@@ -2700,7 +2706,7 @@ If stopped, start playback."
                            (error "Not a playlist")
                          (buffer-substring (line-beginning-position)
                                            (line-end-position)))))
-         (mpc-cmd-add (mapcar 'car songs) playlist)
+         (mpc-cmd-add (mapcar #'car songs) playlist)
          (message "Added %d songs to %s" (length songs) playlist)
          (if (member playlist
                      (cdr (assq 'Playlist (mpc-constraints-get-current))))
@@ -2712,7 +2718,7 @@ If stopped, start playback."
          ((eq start-buf end-buf)
           ;; Moving songs within the shown playlist.
           (let ((dest-pos (get-text-property (point) 'mpc-file-pos)))
-            (mpc-cmd-move (mapcar 'cdr songs) dest-pos mpc-songs-playlist)
+            (mpc-cmd-move (mapcar #'cdr songs) dest-pos mpc-songs-playlist)
             (message "Moved %d songs" (length songs))))
          (t
           ;; Adding songs to the shown playlist.
@@ -2723,10 +2729,10 @@ If stopped, start playback."
             ;; MPD's protocol does not let us add songs at a particular
             ;; position in a playlist, so we first have to add them to the
             ;; end, and then move them to their final destination.
-            (mpc-cmd-add (mapcar 'car songs) mpc-songs-playlist)
+            (mpc-cmd-add (mapcar #'car songs) mpc-songs-playlist)
             (mpc-cmd-move (let ((poss '()))
                             (dotimes (i (length songs))
-                                     (push (+ i (length pl)) poss))
+                              (push (+ i (length pl)) poss))
                             (nreverse poss))
                             dest-pos mpc-songs-playlist)
             (message "Added %d songs" (length songs)))))
diff --git a/lisp/net/newst-ticker.el b/lisp/net/newst-ticker.el
index 2f76470..8cfafb5 100644
--- a/lisp/net/newst-ticker.el
+++ b/lisp/net/newst-ticker.el
@@ -1,4 +1,4 @@
-;; newst-ticker.el --- mode line ticker for newsticker.  -*- lexical-binding: 
t; -*-
+;;; newst-ticker.el --- mode line ticker for newsticker.  -*- lexical-binding: 
t; -*-
 
 ;; Copyright (C) 2003-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 7bb8ca6..7251640 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -1166,9 +1166,10 @@ If ALL is non-nil, update prompts in all IRC buffers."
        (or (eq (aref target 0) ?#)
            (eq (aref target 0) ?&))))
 
-(defcustom rcirc-log-directory "~/.emacs.d/rcirc-log"
+(defcustom rcirc-log-directory (locate-user-emacs-file "rcirc-log")
   "Directory to keep IRC logfiles."
-  :type 'directory)
+  :type 'directory
+  :version "28.1")
 
 (defcustom rcirc-log-flag nil
   "Non-nil means log IRC activity to disk.
diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el
index 94db318..4102b9d 100644
--- a/lisp/net/secrets.el
+++ b/lisp/net/secrets.el
@@ -957,3 +957,5 @@ to their attributes."
 ;; * Check, whether the dh-ietf1024-aes128-cbc-pkcs7 algorithm can be
 ;;   used for the transfer of the secrets.  Currently, we use the
 ;;   plain algorithm.
+
+;;; secrets.el ends here
diff --git a/lisp/net/sieve-manage.el b/lisp/net/sieve-manage.el
index c4d6ec4..5dad5f4 100644
--- a/lisp/net/sieve-manage.el
+++ b/lisp/net/sieve-manage.el
@@ -580,4 +580,4 @@ to local variable `sieve-manage-capability'."
 
 (provide 'sieve-manage)
 
-;; sieve-manage.el ends here
+;;; sieve-manage.el ends here
diff --git a/lisp/net/sieve-mode.el b/lisp/net/sieve-mode.el
index 966f0f0..0e8fdc0 100644
--- a/lisp/net/sieve-mode.el
+++ b/lisp/net/sieve-mode.el
@@ -206,4 +206,4 @@ Turning on Sieve mode runs `sieve-mode-hook'."
 
 (provide 'sieve-mode)
 
-;; sieve-mode.el ends here
+;;; sieve-mode.el ends here
diff --git a/lisp/net/sieve.el b/lisp/net/sieve.el
index 595d633..6d571a0 100644
--- a/lisp/net/sieve.el
+++ b/lisp/net/sieve.el
@@ -379,4 +379,4 @@ Used to bracket operations which move point in the 
sieve-buffer."
 
 (provide 'sieve)
 
-;; sieve.el ends here
+;;; sieve.el ends here
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index d208f0e..a3cf6f3 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -472,6 +472,49 @@ For details, see `tramp-rename-files'."
 (function-put
  #'tramp-rename-these-files 'completion-predicate #'tramp-command-completion-p)
 
+;; This function takes action since Emacs 28.1, when
+;; `read-extended-command-predicate' is set to
+;; `command-completion-default-include-p'.
+;;;###tramp-autoload
+(defun tramp-recompile-elpa-command-completion-p (_symbol _buffer)
+  "A predicate for `tramp-recompile-elpa'.
+It is completed by \"M-x TAB\" only if package.el is loaded, and
+Tramp is an installed ELPA package."
+  ;; We cannot apply `package-installed-p', this would also return the
+  ;; builtin package.
+  (and (assq 'tramp (bound-and-true-p package-alist))
+       (tramp-compat-funcall 'package--user-installed-p 'tramp)))
+
+;;;###tramp-autoload
+(defun tramp-recompile-elpa ()
+  "Recompile the installed Tramp ELPA package.
+This is needed if there are compatibility problems."
+  ;; (declare (completion tramp-recompile-elpa-command-completion-p))
+  (interactive)
+  ;; We expect just one Tramp package is installed.
+  (when-let
+      ((dir (tramp-compat-funcall
+            'package-desc-dir
+            (car (alist-get 'tramp (bound-and-true-p package-alist))))))
+    (dolist (elc (directory-files dir 'full "\\.elc$"))
+      (delete-file elc))
+    (with-current-buffer (get-buffer-create byte-compile-log-buffer)
+      (let ((inhibit-read-only t))
+       (compilation-mode)
+       (goto-char (point-max))
+       (insert "\f\n")
+       (call-process
+        (expand-file-name invocation-name invocation-directory) nil t t
+        "-Q" "-batch" "-L" dir
+        "--eval" (format "(byte-recompile-directory %S 0 t)" dir))
+       (message "Package `tramp' recompiled.")))))
+
+;; Starting with Emacs 28.1, this can be replaced by the "(declare ...)" form.
+;;;###tramp-autoload
+(function-put
+ #'tramp-recompile-elpa 'completion-predicate
+ #'tramp-recompile-elpa-command-completion-p)
+
 ;; Tramp version is useful in a number of situations.
 
 ;;;###tramp-autoload
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index df64d13..dde92d8 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -5488,15 +5488,15 @@ Nonexistent directories are removed from spec."
        ;; Check whether stat(1) returns usable syntax.  "%s" does not
        ;; work on older AIX systems.  Recent GNU stat versions
        ;; (8.24?)  use shell quoted format for "%N", we check the
-       ;; boundaries "`" and "'", therefore.  See Bug#23422 in
-       ;; coreutils.  Since GNU stat 8.26, environment variable
-       ;; QUOTING_STYLE is supported.
+       ;; boundaries "`" and "'" and their localized variants,
+       ;; therefore.  See Bug#23422 in coreutils.  Since GNU stat
+       ;; 8.26, environment variable QUOTING_STYLE is supported.
        (when result
          (setq result (concat "env QUOTING_STYLE=locale " result)
                tmp (tramp-send-command-and-read
                     vec (format "%s -c '(\"%%N\" %%s)' /" result) 'noerror))
          (unless (and (listp tmp) (stringp (car tmp))
-                      (string-match-p "^\\(`/'\\|‘/’\\)$" (car tmp))
+                      (string-match-p "^[\"`‘„”«「]/[\"'’“”»」]$" (car tmp))
                       (integerp (cadr tmp)))
            (setq result nil)))
        result))))
diff --git a/lisp/notifications.el b/lisp/notifications.el
index b439d82..ebd74dd 100644
--- a/lisp/notifications.el
+++ b/lisp/notifications.el
@@ -420,3 +420,5 @@ version this library is compliant with."
                      notifications-get-server-information-method)))
 
 (provide 'notifications)
+
+;;; notifications.el ends here
diff --git a/lisp/nxml/rng-cmpct.el b/lisp/nxml/rng-cmpct.el
index 3d4b9f8..1314ade 100644
--- a/lisp/nxml/rng-cmpct.el
+++ b/lisp/nxml/rng-cmpct.el
@@ -922,4 +922,4 @@ Current token after parse is token following ]."
 
 (provide 'rng-cmpct)
 
-;;; rng-cmpct.el
+;;; rng-cmpct.el ends here
diff --git a/lisp/obsolete/info-edit.el b/lisp/obsolete/info-edit.el
index c53616d..1995897 100644
--- a/lisp/obsolete/info-edit.el
+++ b/lisp/obsolete/info-edit.el
@@ -1,4 +1,4 @@
-;; info-edit.el --- Editing info files  -*- lexical-binding:t -*-
+;;; info-edit.el --- Editing info files  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1985-1986, 1992-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/obsolete/old-emacs-lock.el b/lisp/obsolete/old-emacs-lock.el
index 90ff93e..ce4c60e 100644
--- a/lisp/obsolete/old-emacs-lock.el
+++ b/lisp/obsolete/old-emacs-lock.el
@@ -1,4 +1,4 @@
-;;; emacs-lock.el --- prevents you from exiting Emacs if a buffer is locked  
-*- lexical-binding: t; -*-
+;;; old-emacs-lock.el --- prevents you from exiting Emacs if a buffer is 
locked  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1994, 1997, 2001-2021 Free Software Foundation, Inc.
 
@@ -99,4 +99,4 @@ If the buffer is locked, signal error and display its name."
 
 (provide 'emacs-lock)
 
-;;; emacs-lock.el ends here
+;;; old-emacs-lock.el ends here
diff --git a/lisp/obsolete/otodo-mode.el b/lisp/obsolete/otodo-mode.el
index add17b2..47f5089 100644
--- a/lisp/obsolete/otodo-mode.el
+++ b/lisp/obsolete/otodo-mode.el
@@ -1,4 +1,4 @@
-;;; todo-mode.el --- major mode for editing TODO list files  -*- 
lexical-binding: t; -*-
+;;; otodo-mode.el --- major mode for editing TODO list files  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1997, 1999, 2001-2021 Free Software Foundation, Inc.
 
@@ -963,4 +963,4 @@ If INCLUDE-SEP is non-nil, return point after the 
separator."
 
 (provide 'todo-mode)
 
-;;; todo-mode.el ends here
+;;; otodo-mode.el ends here
diff --git a/lisp/obsolete/sb-image.el b/lisp/obsolete/sb-image.el
index e9a507f..fc9e03e 100644
--- a/lisp/obsolete/sb-image.el
+++ b/lisp/obsolete/sb-image.el
@@ -1,4 +1,4 @@
-;;; sb-image --- Image management for speedbar  -*- lexical-binding: t; -*-
+;;; sb-image.el --- Image management for speedbar  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1999-2003, 2005-2019, 2021 Free Software Foundation,
 ;; Inc.
diff --git a/lisp/org/ob-hledger.el b/lisp/org/ob-hledger.el
index 3d2f46c..48dcb8c 100644
--- a/lisp/org/ob-hledger.el
+++ b/lisp/org/ob-hledger.el
@@ -1,4 +1,4 @@
-;;  ob-hledger.el --- Babel Functions for hledger      -*- lexical-binding: t; 
-*-
+;;; ob-hledger.el --- Babel Functions for hledger      -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/org/ob-mscgen.el b/lisp/org/ob-mscgen.el
index 999d4f4..79c9f87 100644
--- a/lisp/org/ob-mscgen.el
+++ b/lisp/org/ob-mscgen.el
@@ -1,4 +1,4 @@
-;;; ob-msc.el --- Babel Functions for Mscgen         -*- lexical-binding: t; 
-*-
+;;; ob-mscgen.el --- Babel Functions for Mscgen         -*- lexical-binding: 
t; -*-
 
 ;; Copyright (C) 2010-2021 Free Software Foundation, Inc.
 
@@ -78,4 +78,4 @@ mscgen supported formats."
 
 (provide 'ob-mscgen)
 
-;;; ob-msc.el ends here
+;;; ob-mscgen.el ends here
diff --git a/lisp/org/ol-eshell.el b/lisp/org/ol-eshell.el
index 769e7ee..8920e0a 100644
--- a/lisp/org/ol-eshell.el
+++ b/lisp/org/ol-eshell.el
@@ -1,4 +1,4 @@
-;;; ol-eshell.el - Links to Working Directories in Eshell -*- lexical-binding: 
t; -*-
+;;; ol-eshell.el --- Links to Working Directories in Eshell  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/org/org-ctags.el b/lisp/org/org-ctags.el
index 1fca873..dc2b3be 100644
--- a/lisp/org/org-ctags.el
+++ b/lisp/org/org-ctags.el
@@ -1,5 +1,5 @@
-;;; org-ctags.el - Integrate Emacs "tags" Facility with Org -*- 
lexical-binding: t; -*-
-;;
+;;; org-ctags.el --- Integrate Emacs "tags" Facility with Org -*- 
lexical-binding: t; -*-
+
 ;; Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
 ;; Author: Paul Sexton <eeeickythump@gmail.com>
diff --git a/lisp/org/ox-man.el b/lisp/org/ox-man.el
index 6cace7e..27d2ded 100644
--- a/lisp/org/ox-man.el
+++ b/lisp/org/ox-man.el
@@ -1,4 +1,4 @@
-;; ox-man.el --- Man Back-End for Org Export Engine -*- lexical-binding: t; -*-
+;;; ox-man.el --- Man Back-End for Org Export Engine -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/outline.el b/lisp/outline.el
index bce9c6b..fa7c1a2 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -1274,6 +1274,45 @@ Return either 'hide-all, 'headings-only, or 'show-all."
       (setq outline--cycle-buffer-state 'show-all)
       (message "Show all")))))
 
+(defvar outline-navigation-repeat-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-b") #'outline-backward-same-level)
+    (define-key map (kbd "b") #'outline-backward-same-level)
+    (define-key map (kbd "C-f") #'outline-forward-same-level)
+    (define-key map (kbd "f") #'outline-forward-same-level)
+    (define-key map (kbd "C-n") #'outline-next-visible-heading)
+    (define-key map (kbd "n") #'outline-next-visible-heading)
+    (define-key map (kbd "C-p") #'outline-previous-visible-heading)
+    (define-key map (kbd "p") #'outline-previous-visible-heading)
+    (define-key map (kbd "C-u") #'outline-up-heading)
+    (define-key map (kbd "u") #'outline-up-heading)
+    map))
+
+(dolist (command '(outline-backward-same-level
+                   outline-forward-same-level
+                   outline-next-visible-heading
+                   outline-previous-visible-heading
+                   outline-up-heading))
+  (put command 'repeat-map 'outline-navigation-repeat-map))
+
+(defvar outline-editing-repeat-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-v") #'outline-move-subtree-down)
+    (define-key map (kbd "v") #'outline-move-subtree-down)
+    (define-key map (kbd "C-^") #'outline-move-subtree-up)
+    (define-key map (kbd "^") #'outline-move-subtree-up)
+    (define-key map (kbd "C->") #'outline-demote)
+    (define-key map (kbd ">") #'outline-demote)
+    (define-key map (kbd "C-<") #'outline-promote)
+    (define-key map (kbd "<") #'outline-promote)
+    map))
+
+(dolist (command '(outline-move-subtree-down
+                   outline-move-subtree-up
+                   outline-demote
+                   outline-promote))
+  (put command 'repeat-map 'outline-editing-repeat-map))
+
 (provide 'outline)
 (provide 'noutline)
 
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index e467d98..0c5837c 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -1,4 +1,4 @@
-;; bug-reference.el --- buttonize bug references  -*- lexical-binding: t; -*-
+;;; bug-reference.el --- buttonize bug references  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/progmodes/cc-awk.el b/lisp/progmodes/cc-awk.el
index 84cc5b1..334e821 100644
--- a/lisp/progmodes/cc-awk.el
+++ b/lisp/progmodes/cc-awk.el
@@ -1227,4 +1227,4 @@ comment at the start of cc-engine.el for more info."
 ;; indent-tabs-mode: t
 ;; tab-width: 8
 ;; End:
-;;; awk-mode.el ends here
+;;; cc-awk.el ends here
diff --git a/lisp/progmodes/cc-styles.el b/lisp/progmodes/cc-styles.el
index 77cad77..8514434 100644
--- a/lisp/progmodes/cc-styles.el
+++ b/lisp/progmodes/cc-styles.el
@@ -374,7 +374,7 @@ in this way.
 If DONT-OVERRIDE is t, style variables that already have values (i.e., whose
 values are not the symbol `set-from-style') will not be overridden.  CC Mode
 calls c-set-style internally in this way whilst initializing a buffer; if
-cc-set-style is called like this from anywhere else, it will usually behave as
+c-set-style is called like this from anywhere else, it will usually behave as
 a null operation."
   (interactive
    (list (let ((completion-ignore-case t)
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 7878e91..bff3e60 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -2224,7 +2224,7 @@ Help message may be switched off by setting 
`cperl-message-electric-keyword'
 to nil."
   (let ((beg (point-at-bol)))
     (and (save-excursion
-          (backward-sexp 1)
+           (skip-chars-backward "[:alpha:]")
           (cperl-after-expr-p nil "{;:"))
         (save-excursion
           (not
diff --git a/lisp/progmodes/ebrowse.el b/lisp/progmodes/ebrowse.el
index cafdb3b..7524c28 100644
--- a/lisp/progmodes/ebrowse.el
+++ b/lisp/progmodes/ebrowse.el
@@ -794,7 +794,7 @@ and TREE is a list of `ebrowse-ts' structures forming the 
class tree."
             (ebrowse-hs-version header) ebrowse-version-string))
     ;; Read Lisp objects.  Temporarily increase `gc-cons-threshold' to
     ;; prevent a GC that would not free any memory.
-    (let ((gc-cons-threshold 2000000))
+    (let ((gc-cons-threshold (max gc-cons-threshold 2000000)))
       (while (not (progn (skip-chars-forward " \t\n") (eobp)))
        (let* ((root (read (current-buffer)))
               (old-root-ptr (ebrowse-class-in-tree root tree)))
diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el
index 134a6c6..ad8feb9 100644
--- a/lisp/progmodes/idlw-shell.el
+++ b/lisp/progmodes/idlw-shell.el
@@ -1,4 +1,4 @@
-;; idlw-shell.el --- run IDL as an inferior process of Emacs.  -*- 
lexical-binding:t -*-
+;;; idlw-shell.el --- run IDL as an inferior process of Emacs.  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 1999-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 75f2016..b55a98a 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -1,4 +1,4 @@
-;; idlwave.el --- IDL editing mode for GNU Emacs  -*- lexical-binding: t; -*-
+;;; idlwave.el --- IDL editing mode for GNU Emacs  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 1999-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index eb690a7..a942235 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -494,10 +494,11 @@ for preventing Firefox from stealing the keyboard focus."
   :type 'boolean)
 
 (defcustom js-js-tmpdir
-  "~/.emacs.d/js/js"
+  (locate-user-emacs-file "js/js")
   "Temporary directory used by `js-mode' to communicate with Mozilla.
 This directory must be readable and writable by both Mozilla and Emacs."
-  :type 'directory)
+  :type 'directory
+  :version "28.1")
 
 (defcustom js-js-timeout 5
   "Reply timeout for executing commands in Mozilla via `js-mode'.
@@ -4654,4 +4655,4 @@ one of the aforementioned options instead of using this 
mode."
 
 (provide 'js)
 
-;; js.el ends here
+;;; js.el ends here
diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index 1023b75..914d7ce 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -918,11 +918,7 @@ With \\[universal-argument] prefix arg, create a new 
inferior shell buffer even
 if one already exists."
   (interactive)
   (let* ((default-directory (project-root (project-current t)))
-         (default-project-shell-name
-           (concat "*" (file-name-nondirectory
-                        (directory-file-name
-                         (file-name-directory default-directory)))
-                   "-shell*"))
+         (default-project-shell-name (project-prefixed-buffer-name "shell"))
          (shell-buffer (get-buffer default-project-shell-name)))
     (if (and shell-buffer (not current-prefix-arg))
         (pop-to-buffer-same-window shell-buffer)
@@ -938,11 +934,7 @@ if one already exists."
   (interactive)
   (defvar eshell-buffer-name)
   (let* ((default-directory (project-root (project-current t)))
-         (eshell-buffer-name
-          (concat "*" (file-name-nondirectory
-                       (directory-file-name
-                        (file-name-directory default-directory)))
-                  "-eshell*"))
+         (eshell-buffer-name (project-prefixed-buffer-name "eshell"))
          (eshell-buffer (get-buffer eshell-buffer-name)))
     (if (and eshell-buffer (not current-prefix-arg))
         (pop-to-buffer-same-window eshell-buffer)
@@ -994,12 +986,34 @@ loop using the command \\[fileloop-continue]."
 (defvar compilation-read-command)
 (declare-function compilation-read-command "compile")
 
+(defun project-prefixed-buffer-name (mode)
+  (concat "*"
+          (file-name-nondirectory
+           (directory-file-name default-directory))
+          "-"
+          (downcase mode)
+          "*"))
+
+(defcustom project-compilation-buffer-name-function nil
+  "Function to compute the name of a project compilation buffer.
+If non-nil, it overrides `compilation-buffer-name-function' for
+`project-compile'."
+  :version "28.1"
+  :group 'project
+  :type '(choice (const :tag "Default" nil)
+                 (const :tag "Prefixed with root directory name"
+                        project-prefixed-buffer-name)
+                 (function :tag "Custom function")))
+
 ;;;###autoload
 (defun project-compile ()
   "Run `compile' in the project root."
   (declare (interactive-only compile))
   (interactive)
-  (let ((default-directory (project-root (project-current t))))
+  (let ((default-directory (project-root (project-current t)))
+        (compilation-buffer-name-function
+         (or project-compilation-buffer-name-function
+             compilation-buffer-name-function)))
     (call-interactively #'compile)))
 
 (defun project--read-project-buffer ()
@@ -1302,6 +1316,7 @@ to distinguish the menu entries in the dispatch menu.  If 
KEY is
 absent, COMMAND must be bound in `project-prefix-map', and the
 key is looked up in that map."
   :version "28.1"
+  :group 'project
   :package-version '(project . "0.6.0")
   :type '(repeat
           (list
@@ -1318,6 +1333,7 @@ listed in `project-switch-commands' and signal an error 
when
 others are invoked.  Otherwise, all keys in `project-prefix-map'
 are legal even if they aren't listed in the dispatch menu."
   :type 'boolean
+  :group 'project
   :version "28.1")
 
 (defun project--keymap-prompt ()
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index 6e53a04..65a4094 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -5606,7 +5606,7 @@ The default value disables the internal pager."
 
 (provide 'sql)
 
-;;; sql.el ends here
-
 ; LocalWords:  sql SQL SQLite sqlite Sybase Informix MySQL
 ; LocalWords:  Postgres SQLServer SQLi
+
+;;; sql.el ends here
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index 3303257..02a8d72 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -1,7 +1,6 @@
 ;;; which-func.el --- print current function in mode line  -*- 
lexical-binding:t -*-
 
-;; Copyright (C) 1994, 1997-1998, 2001-2021 Free Software Foundation,
-;; Inc.
+;; Copyright (C) 1994-2021 Free Software Foundation, Inc.
 
 ;; Author:   Alex Rezinsky <alexr@msil.sps.mot.com>
 ;;           (doesn't seem to be responsive any more)
@@ -25,17 +24,17 @@
 ;;; Commentary:
 
 ;; This package prints name of function where your current point is
-;; located in mode line. It assumes that you work with imenu package
-;; and imenu--index-alist is up to date.
+;; located in mode line.  It assumes that you work with the imenu
+;; package and `imenu--index-alist' is up to date.
 
 ;; KNOWN BUGS
 ;; ----------
 ;; Really this package shows not "function where the current point is
 ;; located now", but "nearest function which defined above the current
-;; point". So if your current point is located after end of function
-;; FOO but before begin of function BAR, FOO will be displayed in mode
-;; line.
-;; - if two windows display the same buffer, both windows
+;; point".  So if your current point is located after the end of
+;; function FOO but before the beginning of function BAR, FOO will be
+;; displayed in the mode line.
+;; - If two windows display the same buffer, both windows
 ;;   show the same `which-func' information.
 
 ;; TODO LIST
@@ -44,7 +43,7 @@
 ;; function determination mechanism should be used to determine the end
 ;; of a function as well as the beginning of a function.
 ;;     2. This package should be realized with the help of overlay
-;; properties instead of imenu--index-alist variable.
+;; properties instead of the `imenu--index-alist' variable.
 
 ;;; History:
 
@@ -214,7 +213,7 @@ It creates the Imenu index for the buffer, if necessary."
      (setq which-func-mode nil))))
 
 (defun which-func-update ()
-  ;; "Update the Which-Function mode display for all windows."
+  "Update the Which-Function mode display for all windows."
   ;; (walk-windows 'which-func-update-1 nil 'visible))
   (let ((non-essential t))
     (which-func-update-1 (selected-window))))
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 3d2f21a..e80603f 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -24,11 +24,6 @@
 
 ;;; Commentary:
 
-;; NOTE: The xref API is still experimental and can change in major,
-;; backward-incompatible ways.  Everyone is encouraged to try it, and
-;; report to us any problems or use cases we hadn't anticipated, by
-;; sending an email to emacs-devel, or `M-x report-emacs-bug'.
-;;
 ;; This file provides a somewhat generic infrastructure for cross
 ;; referencing commands, in particular "find-definition".
 ;;
@@ -657,8 +652,8 @@ SELECT is `quit', also quit the *xref* window."
 
 (defun xref-goto-xref (&optional quit)
   "Jump to the xref on the current line and select its window.
-Non-interactively, non-nil QUIT, or interactively, with prefix argument
-means to first quit the *xref* buffer."
+If QUIT is non-nil (interactively, with prefix argument), also
+quit the *xref* buffer."
   (interactive "P")
   (let* ((buffer (current-buffer))
          (xref (or (xref--item-at-point)
@@ -1534,6 +1529,8 @@ FILES must be a list of absolute file names."
                        #'tramp-file-local-name
                        #'file-local-name)
                    files)))
+    (when (file-name-quoted-p (car files))
+      (setq files (mapcar #'file-name-unquote files)))
     (with-current-buffer output
       (erase-buffer)
       (with-temp-buffer
diff --git a/lisp/replace.el b/lisp/replace.el
index 71c6e65..b5dea61 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -1433,7 +1433,7 @@ This is a compatibility function for \\[next-error] 
invocations."
 
 (defface match
   '((((class color) (min-colors 88) (background light))
-     :background "yellow1")
+     :background "khaki1")
     (((class color) (min-colors 88) (background dark))
      :background "RoyalBlue3")
     (((class color) (min-colors 8) (background light))
diff --git a/lisp/rot13.el b/lisp/rot13.el
index dfcf4ad..4e4e60f 100644
--- a/lisp/rot13.el
+++ b/lisp/rot13.el
@@ -3,6 +3,7 @@
 ;; Copyright (C) 1988, 2001-2021 Free Software Foundation, Inc.
 
 ;; Author: Howard Gayle
+;;         Simon Josefsson
 ;; Maintainer: emacs-devel@gnu.org
 
 ;; This file is part of GNU Emacs.
@@ -22,18 +23,26 @@
 
 ;;; Commentary:
 
-;; The entry point, `rot13-other-window', performs a Caesar cipher
-;; encrypt/decrypt on the current buffer and displays the result in another
-;; window.  ROT13 encryption is sometimes used on USENET as a read-at-your-
-;; own-risk wrapper for material some might consider offensive, such as
-;; ethnic humor.
+;;   "ROT13 ('rotate by 13 places') is a simple letter substitution
+;;   cipher that replaces a letter with the 13th letter after it in
+;;   the alphabet.  ROT13 is a special case of the Caesar cipher
+;;   which was developed in ancient Rome.
 ;;
-;; Written by Howard Gayle.
-;; This hack is mainly to show off the char table stuff.
+;;   Because there are 26 letters (2×13) in the basic Latin
+;;   alphabet, ROT13 is its own inverse; that is, to undo ROT13, the
+;;   same algorithm is applied, so the same action can be used for
+;;   encoding and decoding.  The algorithm provides virtually no
+;;   cryptographic security, and is often cited as a canonical
+;;   example of weak encryption.
 ;;
-;; New entry points, `rot13', `rot13-string', and `rot13-region' that
-;; performs Caesar cipher encrypt/decrypt on buffers and strings, was
-;; added by Simon Josefsson.
+;;   ROT13 is used in online forums as a means of hiding spoilers,
+;;   punchlines, puzzle solutions, and offensive materials from the
+;;   casual glance."                      - Wikipedia article on ROT13
+;;
+;; The entry points, `rot13', `rot13-string', and `rot13-region' performs ROT13
+;; encoding/decoding on buffers and strings.  The entry point
+;; `rot13-other-window' performs a ROT13 encoding/decoding on the current
+;; buffer and displays the result in another window.
 
 ;;; Code:
 
diff --git a/lisp/ses.el b/lisp/ses.el
index 6058d48..98785b6 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -1,4 +1,4 @@
-;;; ses.el -- Simple Emacs Spreadsheet  -*- lexical-binding:t -*-
+;;; ses.el --- Simple Emacs Spreadsheet  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index 118c726..4666026 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -1,4 +1,4 @@
-;;; speedbar --- quick access to files and tags in a frame  -*- 
lexical-binding: t; -*-
+;;; speedbar.el --- quick access to files and tags in a frame  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1996-2021 Free Software Foundation, Inc.
 
@@ -4057,4 +4057,4 @@ this version is not backward compatible to 0.14 or 
earlier.")
 
 (run-hooks 'speedbar-load-hook)
 
-;;; speedbar ends here
+;;; speedbar.el ends here
diff --git a/lisp/startup.el b/lisp/startup.el
index bfbee6a..cf536b3 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -1175,7 +1175,7 @@ please check its value")
         ;; are dependencies between them.
         (nreverse custom-delayed-init-variables))
   (mapc #'custom-reevaluate-setting custom-delayed-init-variables)
-  (setq custom-delayed-init-variables nil)
+  (setq custom-delayed-init-variables t)
 
   ;; Warn for invalid user name.
   (when init-file-user
diff --git a/lisp/strokes.el b/lisp/strokes.el
index 575092a..18595cb 100644
--- a/lisp/strokes.el
+++ b/lisp/strokes.el
@@ -138,15 +138,14 @@
 ;; the user to enter strokes which "remove the pencil from the paper"
 ;; so to speak, so one character can have multiple strokes.
 
-;; NOTE (Oct 7, 2006): The URLs below seem to be invalid!!!
-
 ;; You can read more about strokes at:
 
-;; http://www.mit.edu/people/cadet/strokes-help.html
+;; 
https://web.archive.org/web/20041209171947/http://www.mit.edu/people/cadet/strokes-help.html
 
 ;; If you're interested in using strokes for writing English into Emacs
 ;; using strokes, then you'll want to read about it on the web page above
-;; or just download from http://www.mit.edu/people/cadet/strokes-abc.el,
+;; or just download from:
+;; 
https://web.archive.org/web/20041204163338/http://www.mit.edu/people/cadet/strokes-abc.el
 ;; which is nothing but a file with some helper commands for inserting
 ;; alphanumerics and punctuation.
 
@@ -307,12 +306,6 @@ the corresponding interactive function.")
 
 ;;; Macros...
 
-;; unused
-;; (defmacro strokes-while-inhibiting-garbage-collector (&rest forms)
-;;   "Execute FORMS without interference from the garbage collector."
-;;   `(let ((gc-cons-threshold 134217727))
-;;      ,@forms))
-
 (defsubst strokes-click-p (stroke)
   "Non-nil if STROKE is really click."
   (< (length stroke) 2))
diff --git a/lisp/subr.el b/lisp/subr.el
index c2be26a..40ca934 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1830,12 +1830,13 @@ function, it is changed to a list of functions."
     (unless (member function hook-value)
       (when (stringp function)          ;FIXME: Why?
        (setq function (purecopy function)))
+      ;; All those `equal' tests performed between functions can end up being
+      ;; costly since those functions may be large recursive and even cyclic
+      ;; structures, so we index `hook--depth-alist' with `eq'.  (bug#46326)
       (when (or (get hook 'hook--depth-alist) (not (zerop depth)))
         ;; Note: The main purpose of the above `when' test is to avoid running
         ;; this `setf' before `gv' is loaded during bootstrap.
-        (setf (alist-get function (get hook 'hook--depth-alist)
-                         0 'remove #'equal)
-              depth))
+        (push (cons function depth) (get hook 'hook--depth-alist)))
       (setq hook-value
            (if (< 0 depth)
                (append hook-value (list function))
@@ -1845,8 +1846,8 @@ function, it is changed to a list of functions."
           (setq hook-value
                 (sort (if (< 0 depth) hook-value (copy-sequence hook-value))
                       (lambda (f1 f2)
-                        (< (alist-get f1 depth-alist 0 nil #'equal)
-                           (alist-get f2 depth-alist 0 nil #'equal))))))))
+                        (< (alist-get f1 depth-alist 0 nil #'eq)
+                           (alist-get f2 depth-alist 0 nil #'eq))))))))
     ;; Set the actual variable
     (if local
        (progn
@@ -1907,11 +1908,21 @@ one will be removed."
               (not (and (consp (symbol-value hook))
                         (memq t (symbol-value hook)))))
       (setq local t))
-    (let ((hook-value (if local (symbol-value hook) (default-value hook))))
+    (let ((hook-value (if local (symbol-value hook) (default-value hook)))
+          (old-fun nil))
       ;; Remove the function, for both the list and the non-list cases.
       (if (or (not (listp hook-value)) (eq (car hook-value) 'lambda))
-         (if (equal hook-value function) (setq hook-value nil))
-       (setq hook-value (delete function (copy-sequence hook-value))))
+         (when (equal hook-value function)
+           (setq old-fun hook-value)
+           (setq hook-value nil))
+       (when (setq old-fun (car (member function hook-value)))
+         (setq hook-value (remq old-fun hook-value))))
+      (when old-fun
+        ;; Remove auxiliary depth info to avoid leaks (bug#46414)
+        ;; and to avoid the list growing too long.
+        (let* ((depths (get hook 'hook--depth-alist))
+               (di (assq old-fun depths)))
+          (when di (put hook 'hook--depth-alist (delq di depths)))))
       ;; If the function is on the global hook, we need to shadow it locally
       ;;(when (and local (member function (default-value hook))
       ;;              (not (member (cons 'not function) hook-value)))
@@ -5007,7 +5018,8 @@ See also `with-eval-after-load'."
                      (funcall func)
                    (let ((lfn load-file-name)
                          ;; Don't use letrec, because equal (in
-                         ;; add/remove-hook) would get trapped in a cycle.
+                         ;; add/remove-hook) could get trapped in a cycle
+                         ;; (bug#46326).
                          (fun (make-symbol "eval-after-load-helper")))
                      (fset fun (lambda (file)
                                  (when (equal file lfn)
@@ -5595,8 +5607,8 @@ to deactivate this transient map, regardless of 
KEEP-PRED."
             (internal-pop-keymap map 'overriding-terminal-local-map)
             (remove-hook 'pre-command-hook clearfun)
             (when on-exit (funcall on-exit)))))
-    ;; Don't use letrec, because equal (in add/remove-hook) would get trapped
-    ;; in a cycle.
+    ;; Don't use letrec, because equal (in add/remove-hook) could get trapped
+    ;; in a cycle. (bug#46326)
     (fset clearfun
           (lambda ()
             (with-demoted-errors "set-transient-map PCH: %S"
diff --git a/lisp/svg.el b/lisp/svg.el
index 717c847..05accf4 100644
--- a/lisp/svg.el
+++ b/lisp/svg.el
@@ -41,7 +41,7 @@
 ;; into the buffer:
 ;;
 ;;     (setq svg (svg-create 800 800 :stroke "orange" :stroke-width 5))
-;;     (svg-gradient svg "gradient" 'linear '(0 . "red") '(100 . "blue"))
+;;     (svg-gradient svg "gradient" 'linear '((0 . "red") (100 . "blue")))
 ;;     (save-excursion (goto-char (point-max)) (svg-insert-image svg))
 
 ;; Then add various elements to the structure:
@@ -81,7 +81,7 @@ STOPS is a list of percentage/color pairs."
   (svg--def
    svg
    (apply
-    'dom-node
+    #'dom-node
     (if (eq type 'linear)
        'linearGradient
       'radialGradient)
@@ -358,8 +358,7 @@ This is in contrast to merely setting it to 0."
                     (plist-get command-args :default-relative))))
     (intern (if relative (downcase char) (upcase char)))))
 
-(defun svg--elliptical-arc-coordinates
-    (rx ry x y &rest args)
+(defun svg--elliptical-arc-coordinates (rx ry x y &rest args)
   (list
    rx ry
    (or (plist-get args :x-axis-rotation) 0)
@@ -370,21 +369,19 @@ This is in contrast to merely setting it to 0."
 (defun svg--elliptical-arc-command (coordinates-list &rest args)
   (cons
    (svg--path-command-symbol 'a args)
-   (apply 'append
-          (mapcar
-           (lambda (coordinates)
-             (apply 'svg--elliptical-arc-coordinates
-                    coordinates))
-           coordinates-list))))
+   (mapcan
+    (lambda (coordinates)
+      (apply #'svg--elliptical-arc-coordinates
+             coordinates))
+    coordinates-list)))
 
 (defun svg--moveto-command (coordinates-list &rest args)
   (cons
    (svg--path-command-symbol 'm args)
-   (apply 'append
-          (mapcar
-           (lambda (coordinates)
-             (list (car coordinates) (cdr coordinates)))
-           coordinates-list))))
+   (mapcan
+    (lambda (coordinates)
+      (list (car coordinates) (cdr coordinates)))
+    coordinates-list)))
 
 (defun svg--closepath-command (&rest args)
   (list (svg--path-command-symbol 'z args)))
@@ -392,11 +389,10 @@ This is in contrast to merely setting it to 0."
 (defun svg--lineto-command (coordinates-list &rest args)
   (cons
    (svg--path-command-symbol 'l args)
-   (apply 'append
-          (mapcar
-           (lambda (coordinates)
-             (list (car coordinates) (cdr coordinates)))
-           coordinates-list))))
+   (mapcan
+    (lambda (coordinates)
+      (list (car coordinates) (cdr coordinates)))
+    coordinates-list)))
 
 (defun svg--horizontal-lineto-command (coordinate-list &rest args)
   (cons
@@ -411,24 +407,24 @@ This is in contrast to merely setting it to 0."
 (defun svg--curveto-command (coordinates-list &rest args)
   (cons
    (svg--path-command-symbol 'c args)
-   (apply 'append coordinates-list)))
+   (apply #'append coordinates-list)))
 
 (defun svg--smooth-curveto-command (coordinates-list &rest args)
   (cons
    (svg--path-command-symbol 's args)
-   (apply 'append coordinates-list)))
+   (apply #'append coordinates-list)))
 
 (defun svg--quadratic-bezier-curveto-command (coordinates-list
                                               &rest args)
   (cons
    (svg--path-command-symbol 'q args)
-   (apply 'append coordinates-list)))
+   (apply #'append coordinates-list)))
 
 (defun svg--smooth-quadratic-bezier-curveto-command (coordinates-list
                                                      &rest args)
   (cons
    (svg--path-command-symbol 't args)
-   (apply 'append coordinates-list)))
+   (apply #'append coordinates-list)))
 
 (defun svg--eval-path-command (command default-relative)
   (cl-letf
@@ -450,7 +446,7 @@ This is in contrast to merely setting it to 0."
         #'svg--elliptical-arc-command)
        (extended-command (append command (list :default-relative
                                                default-relative))))
-    (mapconcat 'prin1-to-string (apply extended-command) " ")))
+    (mapconcat #'prin1-to-string (apply extended-command) " ")))
 
 (defun svg-path (svg commands &rest args)
   "Add the outline of a shape to SVG according to COMMANDS.
@@ -459,7 +455,7 @@ modifiers.  If :relative is t, then coordinates are 
relative to
 the last position, or -- initially -- to the origin."
   (let* ((default-relative (plist-get args :relative))
          (stripped-args (svg--plist-delete args :relative))
-         (d (mapconcat 'identity
+         (d (mapconcat #'identity
                        (mapcar
                         (lambda (command)
                           (svg--eval-path-command command
diff --git a/lisp/term/konsole.el b/lisp/term/konsole.el
index e38a5d3..1f65a46 100644
--- a/lisp/term/konsole.el
+++ b/lisp/term/konsole.el
@@ -9,4 +9,4 @@
 
 (provide 'term/konsole)
 
-;; konsole.el ends here
+;;; konsole.el ends here
diff --git a/lisp/term/linux.el b/lisp/term/linux.el
index 35bd3ac..c6d84ab 100644
--- a/lisp/term/linux.el
+++ b/lisp/term/linux.el
@@ -1,4 +1,6 @@
-;; The Linux console handles Latin-1 by default.  -*- lexical-binding:t -*-
+;;; linux.el  -*- lexical-binding:t -*-
+
+;; The Linux console handles Latin-1 by default.
 
 (declare-function gpm-mouse-enable "t-mouse" ())
 
diff --git a/lisp/term/lk201.el b/lisp/term/lk201.el
index 3bcaa2e..c280247 100644
--- a/lisp/term/lk201.el
+++ b/lisp/term/lk201.el
@@ -1,4 +1,4 @@
-;; Define function key sequences for DEC terminals.  -*- lexical-binding: t -*-
+;;; lk201.el --- Define function key sequences for DEC terminals.  -*- 
lexical-binding: t -*-
 
 (defvar lk201-function-map
   (let ((map (make-sparse-keymap)))
diff --git a/lisp/term/screen.el b/lisp/term/screen.el
index 04481e8..9655f41 100644
--- a/lisp/term/screen.el
+++ b/lisp/term/screen.el
@@ -22,4 +22,4 @@ it runs, which can change when the screen session is moved to 
another tty."
 
 (provide 'term/screen)
 
-;; screen.el ends here
+;;; screen.el ends here
diff --git a/lisp/term/st.el b/lisp/term/st.el
index 08432c4..9a1c064 100644
--- a/lisp/term/st.el
+++ b/lisp/term/st.el
@@ -17,4 +17,4 @@
 
 (provide 'term/st)
 
-;; st.el ends here
+;;; st.el ends here
diff --git a/lisp/term/tmux.el b/lisp/term/tmux.el
index aa0c983..4ea6f41 100644
--- a/lisp/term/tmux.el
+++ b/lisp/term/tmux.el
@@ -22,4 +22,4 @@ it runs, which can change when the tmux session is moved to 
another tty."
 
 (provide 'term/tmux)
 
-;; tmux.el ends here
+;;; tmux.el ends here
diff --git a/lisp/term/w32console.el b/lisp/term/w32console.el
index 4a925cd..1a5dc05 100644
--- a/lisp/term/w32console.el
+++ b/lisp/term/w32console.el
@@ -1,4 +1,4 @@
-;;; w32console.el -- Setup w32 console keys and colors.  -*- lexical-binding: 
t; -*-
+;;; w32console.el --- Setup w32 console keys and colors.  -*- lexical-binding: 
t; -*-
 
 ;; Copyright (C) 2007-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index a48b345..8d2715f 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -77,7 +77,7 @@ Detection of repeated words is not implemented in
   "A list of exceptions for duplicated words.
 It should be a list of (LANGUAGE . EXCEPTION-LIST).
 
-LANGUAGE is nil, which means the exceptions apply regardless of
+LANGUAGE can be nil, which means the exceptions apply regardless of
 the current dictionary, or a regular expression matching the
 dictionary name (`ispell-local-dictionary' or
 `ispell-dictionary') for which the exceptions should apply.
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index 8a0436a..4acdc9f 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -1,4 +1,4 @@
-;;; remember --- a mode for quickly jotting down things to remember  -*- 
lexical-binding: t; -*-
+;;; remember.el --- a mode for quickly jotting down things to remember  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1999-2001, 2003-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 67f7319..d5930e8 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -623,7 +623,8 @@ Do \\[describe-key] on the following bindings to discover 
what they do.
   (setq-local syntax-propertize-function #'sgml-syntax-propertize)
   (setq-local syntax-ppss-table sgml-tag-syntax-table)
   (setq-local facemenu-add-face-function 'sgml-mode-facemenu-add-face-function)
-  (setq-local sgml-xml-mode (sgml-xml-guess))
+  (when (sgml-xml-guess)
+    (setq-local sgml-xml-mode t))
   (unless sgml-xml-mode
     (setq-local skeleton-transformation-function sgml-transformation-function))
   ;; This will allow existing comments within declarations to be
diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el
index c52fcfc..8ca0f42 100644
--- a/lisp/thingatpt.el
+++ b/lisp/thingatpt.el
@@ -600,10 +600,14 @@ with angle brackets.")
              (buffer-substring-no-properties
               (car boundary-pair) (cdr boundary-pair))))))
 
-;;  Buffer
+;;  Buffer and region
 
 (put 'buffer 'end-op (lambda () (goto-char (point-max))))
 (put 'buffer 'beginning-op (lambda () (goto-char (point-min))))
+(put 'region 'bounds-of-thing-at-point
+     (lambda ()
+       (when (use-region-p)
+         (cons (region-beginning) (region-end)))))
 
 ;; UUID
 
diff --git a/lisp/time.el b/lisp/time.el
index 7e1d918..fd53f63 100644
--- a/lisp/time.el
+++ b/lisp/time.el
@@ -525,9 +525,16 @@ If the value is t instead of an alist, use the value of
   '((t :inherit font-lock-variable-name-face))
   "Face for time zone label in `world-clock' buffer.")
 
+(defvar world-clock-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "n" #'next-line)
+    (define-key map "p" #'previous-line)
+    map))
+
 (define-derived-mode world-clock-mode special-mode "World clock"
   "Major mode for buffer that displays times in various time zones.
 See `world-clock'."
+  :interactive nil
   (setq-local revert-buffer-function #'world-clock-update)
   (setq show-trailing-whitespace nil))
 
@@ -591,7 +598,9 @@ To turn off the world time display, go to the window and 
type `\\[quit-window]'.
   "Update the `world-clock' buffer."
   (if (get-buffer world-clock-buffer-name)
       (with-current-buffer (get-buffer world-clock-buffer-name)
-        (world-clock-display (time--display-world-list)))
+        (let ((op (point)))
+          (world-clock-display (time--display-world-list))
+          (goto-char op)))
     (world-clock-cancel-timer)))
 
 ;;;###autoload
diff --git a/lisp/transient.el b/lisp/transient.el
new file mode 100644
index 0000000..6e7b5ea
--- /dev/null
+++ b/lisp/transient.el
@@ -0,0 +1,3615 @@
+;;; transient.el --- Transient commands          -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018-2021  Free Software Foundation, Inc.
+
+;; Author: Jonas Bernoulli <jonas@bernoul.li>
+;; Homepage: https://github.com/magit/transient
+;; Package-Requires: ((emacs "25.1"))
+;; Package-Version: 0.3.2
+;; Keywords: bindings
+
+;; 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 this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Taking inspiration from prefix keys and prefix arguments, Transient
+;; implements a similar abstraction involving a prefix command, infix
+;; arguments and suffix commands.  We could call this abstraction a
+;; "transient command", but because it always involves at least two
+;; commands (a prefix and a suffix) we prefer to call it just a
+;; "transient".
+
+;; When the user calls a transient prefix command, then a transient
+;; (temporary) keymap is activated, which binds the transient's infix
+;; and suffix commands, and functions that control the transient state
+;; are added to `pre-command-hook' and `post-command-hook'.  The
+;; available suffix and infix commands and their state are shown in
+;; the echo area until the transient is exited by invoking a suffix
+;; command.
+
+;; Calling an infix command causes its value to be changed, possibly
+;; by reading a new value in the minibuffer.
+
+;; Calling a suffix command usually causes the transient to be exited
+;; but suffix commands can also be configured to not exit the
+;; transient state.
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'eieio)
+(require 'format-spec)
+(require 'seq)
+
+(eval-when-compile
+  (require 'subr-x))
+
+(declare-function info 'info)
+(declare-function Man-find-section 'man)
+(declare-function Man-next-section 'man)
+(declare-function Man-getpage-in-background 'man)
+
+(defvar Man-notify-method)
+
+(define-obsolete-function-alias 'define-transient-command
+  'transient-define-prefix "Transient 0.3.0")
+(define-obsolete-function-alias 'define-suffix-command
+  'transient-define-suffix "Transient 0.3.0")
+(define-obsolete-function-alias 'define-infix-command
+  'transient-define-infix "Transient 0.3.0")
+(define-obsolete-function-alias 'define-infix-argument
+  'transient-define-argument "Transient 0.3.0")
+
+(define-obsolete-variable-alias 'current-transient-prefix
+  'transient-current-prefix "Transient 0.3.0")
+(define-obsolete-variable-alias 'current-transient-command
+  'transient-current-command "Transient 0.3.0")
+(define-obsolete-variable-alias 'current-transient-suffixes
+  'transient-current-suffixes "Transient 0.3.0")
+(define-obsolete-variable-alias 'post-transient-hook
+  'transient-exit-hook "Transient 0.3.0")
+
+(defmacro transient--with-emergency-exit (&rest body)
+  (declare (indent defun))
+  `(condition-case err
+       (let ((debugger #'transient--exit-and-debug))
+         ,(macroexp-progn body))
+     ((debug error)
+      (transient--emergency-exit)
+      (signal (car err) (cdr err)))))
+
+(defun transient--exit-and-debug (&rest args)
+  (transient--emergency-exit)
+  (apply #'debug args))
+
+;;; Options
+
+(defgroup transient nil
+  "Transient commands."
+  :group 'extensions)
+
+(defcustom transient-show-popup t
+  "Whether to show the current transient in a popup buffer.
+
+- If t, then show the popup as soon as a transient prefix command
+  is invoked.
+
+- If nil, then do not show the popup unless the user explicitly
+  requests it, by pressing an incomplete prefix key sequence.
+
+- If a number, then delay displaying the popup and instead show
+  a brief one-line summary.  If zero or negative, then suppress
+  even showing that summary and display the pressed key only.
+
+  Show the popup when the user explicitly requests it by pressing
+  an incomplete prefix key sequence.  Unless zero, then also show
+  the popup after that many seconds of inactivity (using the
+  absolute value)."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type '(choice (const  :tag "instantly" t)
+                 (const  :tag "on demand" nil)
+                 (const  :tag "on demand (no summary)" 0)
+                 (number :tag "after delay" 1)))
+
+(defcustom transient-enable-popup-navigation nil
+  "Whether navigation commands are enabled in the transient popup.
+
+While a transient is active the transient popup buffer is not the
+current buffer, making it necessary to use dedicated commands to
+act on that buffer itself.  If this non-nil, then the following
+features are available:
+
+- \"<up>\" moves the cursor to the previous suffix.
+  \"<down>\" moves the cursor to the next suffix.
+  \"RET\" invokes the suffix the cursor is on.
+- \"<mouse-1>\" invokes the clicked on suffix.
+- \"C-s\" and \"C-r\" start isearch in the popup buffer."
+  :package-version '(transient . "0.2.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-display-buffer-action
+  '(display-buffer-in-side-window
+    (side . bottom)
+    (inhibit-same-window . t))
+  "The action used to display the transient popup buffer.
+
+The transient popup buffer is displayed in a window using
+
+  \(display-buffer buf transient-display-buffer-action)
+
+The value of this option has the form (FUNCTION . ALIST),
+where FUNCTION is a function or a list of functions.  Each such
+function should accept two arguments: a buffer to display and
+an alist of the same form as ALIST.  See `display-buffer' for
+details.
+
+The default is (display-buffer-in-side-window (side . bottom)).
+This displays the window at the bottom of the selected frame.
+Another useful value is (display-buffer-below-selected).  This
+is what `magit-popup' used by default.  For more alternatives
+see info node `(elisp)Display Action Functions'.
+
+It may be possible to display the window in another frame, but
+whether that works in practice depends on the window-manager.
+If the window manager selects the new window (Emacs frame),
+then it doesn't work.
+
+If you change the value of this option, then you might also
+want to change the value of `transient-mode-line-format'."
+  :package-version '(transient . "0.3.0")
+  :group 'transient
+  :type '(cons (choice function (repeat :tag "Functions" function))
+               alist))
+
+(defcustom transient-mode-line-format 'line
+  "The mode-line format for the transient popup buffer.
+
+If nil, then the buffer has no mode-line.  If the buffer is not
+displayed right above the echo area, then this probably is not
+a good value.
+
+If `line' (the default), then the buffer also has no mode-line,
+but a thin line is drawn instead, using the background color of
+the face `transient-separator'.  Termcap frames cannot display
+thin lines and therefore fallback to treating `line' like nil.
+
+Otherwise this can be any mode-line format.
+See `mode-line-format' for details."
+  :package-version '(transient . "0.2.0")
+  :group 'transient
+  :type '(choice (const :tag "hide mode-line" nil)
+                 (const :tag "substitute thin line" line)
+                 (const :tag "name of prefix command"
+                        ("%e" mode-line-front-space
+                         mode-line-buffer-identification))
+                 (sexp  :tag "custom mode-line format")))
+
+(defcustom transient-show-common-commands nil
+  "Whether to show common transient suffixes in the popup buffer.
+
+These commands are always shown after typing the prefix key
+\"C-x\" when a transient command is active.  To toggle the value
+of this variable use \"C-x t\" when a transient is active."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-read-with-initial-input nil
+  "Whether to use the last history element as initial minibuffer input."
+  :package-version '(transient . "0.2.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-highlight-mismatched-keys nil
+  "Whether to highlight keys that do not match their argument.
+
+This only affects infix arguments that represent command-line
+arguments.  When this option is non-nil, then the key binding
+for infix argument are highlighted when only a long argument
+\(e.g. \"--verbose\") is specified but no shor-thand (e.g \"-v\").
+In the rare case that a short-hand is specified but does not
+match the key binding, then it is highlighed differently.
+
+The highlighting is done using using `transient-mismatched-key'
+and `transient-nonstandard-key'."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-substitute-key-function nil
+  "Function used to modify key bindings.
+
+This function is called with one argument, the prefix object,
+and must return a key binding description, either the existing
+key description it finds in the `key' slot, or a substitution.
+
+This is intended to let users replace certain prefix keys.  It
+could also be used to make other substitutions, but that is
+discouraged.
+
+For example, \"=\" is hard to reach using my custom keyboard
+layout, so I substitute \"(\" for that, which is easy to reach
+using a layout optimized for lisp.
+
+  (setq transient-substitute-key-function
+        (lambda (obj)
+          (let ((key (oref obj key)))
+            (if (string-match \"\\\\`\\\\(=\\\\)[a-zA-Z]\" key)
+                (replace-match \"(\" t t key 1)
+              key)))))"
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type '(choice (const :tag "Transform no keys (nil)" nil) function))
+
+(defcustom transient-semantic-coloring nil
+  "Whether to color prefixes and suffixes in Hydra-like fashion.
+This feature is experimental.
+
+If non-nil, then the key binding of each suffix is colorized to
+indicate whether it exits the transient state or not.  The color
+of the prefix is indicated using the line that is drawn when the
+value of `transient-mode-line-format' is `line'.
+
+For more information about how Hydra uses colors see
+https://github.com/abo-abo/hydra#color and
+https://oremacs.com/2015/02/19/hydra-colors-reloaded.";
+  :package-version '(transient . "0.3.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-detect-key-conflicts nil
+  "Whether to detect key binding conflicts.
+
+Conflicts are detected when a transient prefix command is invoked
+and results in an error, which prevents the transient from being
+used."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-force-fixed-pitch nil
+  "Whether to force use of monospaced font in the popup buffer.
+
+Even if you use a proportional font for the `default' face,
+you might still want to use a monospaced font in transient's
+popup buffer.  Setting this option to t causes `default' to
+be remapped to `fixed-pitch' in that buffer."
+  :package-version '(transient . "0.2.0")
+  :group 'transient
+  :type 'boolean)
+
+(defcustom transient-default-level 4
+  "Control what suffix levels are made available by default.
+
+Each suffix command is placed on a level and each prefix command
+has a level, which controls which suffix commands are available.
+Integers between 1 and 7 (inclusive) are valid levels.
+
+The levels of individual transients and/or their individual
+suffixes can be changed individually, by invoking the prefix and
+then pressing \"C-x l\".
+
+The default level for both transients and their suffixes is 4.
+This option only controls the default for transients.  The default
+suffix level is always 4.  The author of a transient should place
+certain suffixes on a higher level if they expect that it won't be
+of use to most users, and they should place very important suffixes
+on a lower level so that they remain available even if the user
+lowers the transient level.
+
+\(Magit currently places nearly all suffixes on level 4 and lower
+levels are not used at all yet.  So for the time being you should
+not set a lower level here and using a higher level might not
+give you as many additional suffixes as you hoped.)"
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type '(choice (const :tag "1 - fewest suffixes" 1)
+                 (const 2)
+                 (const 3)
+                 (const :tag "4 - default" 4)
+                 (const 5)
+                 (const 6)
+                 (const :tag "7 - most suffixes" 7)))
+
+(defcustom transient-levels-file
+  (locate-user-emacs-file (convert-standard-filename "transient/levels.el"))
+  "File used to save levels of transients and their suffixes."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'file)
+
+(defcustom transient-values-file
+  (locate-user-emacs-file (convert-standard-filename "transient/values.el"))
+  "File used to save values of transients."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'file)
+
+(defcustom transient-history-file
+  (locate-user-emacs-file (convert-standard-filename "transient/history.el"))
+  "File used to save history of transients and their infixes."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'file)
+
+(defcustom transient-history-limit 10
+  "Number of history elements to keep when saving to file."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'integer)
+
+(defcustom transient-save-history t
+  "Whether to save history of transient commands when exiting Emacs."
+  :package-version '(transient . "0.1.0")
+  :group 'transient
+  :type 'boolean)
+
+;;; Faces
+
+(defgroup transient-faces nil
+  "Faces used by Transient."
+  :group 'transient)
+
+(defface transient-heading '((t :inherit font-lock-keyword-face))
+  "Face used for headings."
+  :group 'transient-faces)
+
+(defface transient-key '((t :inherit font-lock-builtin-face))
+  "Face used for keys."
+  :group 'transient-faces)
+
+(defface transient-argument '((t :inherit font-lock-warning-face))
+  "Face used for enabled arguments."
+  :group 'transient-faces)
+
+(defface transient-value '((t :inherit font-lock-string-face))
+  "Face used for values."
+  :group 'transient-faces)
+
+(defface transient-inactive-argument '((t :inherit shadow))
+  "Face used for inactive arguments."
+  :group 'transient-faces)
+
+(defface transient-inactive-value '((t :inherit shadow))
+  "Face used for inactive values."
+  :group 'transient-faces)
+
+(defface transient-unreachable '((t :inherit shadow))
+  "Face used for suffixes unreachable from the current prefix sequence."
+  :group 'transient-faces)
+
+(defface transient-active-infix '((t :inherit secondary-selection))
+  "Face used for the infix for which the value is being read."
+  :group 'transient-faces)
+
+(defface transient-unreachable-key '((t :inherit shadow))
+  "Face used for keys unreachable from the current prefix sequence."
+  :group 'transient-faces)
+
+(defface transient-nonstandard-key '((t :underline t))
+  "Face optionally used to highlight keys conflicting with short-argument.
+Also see option `transient-highlight-mismatched-keys'."
+  :group 'transient-faces)
+
+(defface transient-mismatched-key '((t :underline t))
+  "Face optionally used to highlight keys without a short-argument.
+Also see option `transient-highlight-mismatched-keys'."
+  :group 'transient-faces)
+
+(defface transient-inapt-suffix '((t :inherit shadow :italic t))
+  "Face used for suffixes that are inapt at this time."
+  :group 'transient-faces)
+
+(defface transient-enabled-suffix
+  '((t :background "green" :foreground "black" :weight bold))
+  "Face used for enabled levels while editing suffix levels.
+See info node `(transient)Enabling and Disabling Suffixes'."
+  :group 'transient-faces)
+
+(defface transient-disabled-suffix
+  '((t :background "red" :foreground "black" :weight bold))
+  "Face used for disabled levels while editing suffix levels.
+See info node `(transient)Enabling and Disabling Suffixes'."
+  :group 'transient-faces)
+
+(defface transient-separator
+  `((((class color) (background light))
+     ,@(and (>= emacs-major-version 27) '(:extend t))
+     :background "grey80")
+    (((class color) (background  dark))
+     ,@(and (>= emacs-major-version 27) '(:extend t))
+     :background "grey30"))
+  "Face used to draw line below transient popup window.
+This is only used if `transient-mode-line-format' is `line'.
+Only the background color is significant."
+  :group 'transient-faces)
+
+(defgroup transient-color-faces
+  '((transient-semantic-coloring custom-variable))
+  "Faces used by Transient for Hydra-like command coloring.
+These faces are only used if `transient-semantic-coloring'
+\(which see) is non-nil."
+  :group 'transient-faces)
+
+(defface transient-red
+  '((t :inherit transient-key :foreground "red"))
+  "Face used for red prefixes and suffixes."
+  :group 'transient-color-faces)
+
+(defface transient-blue
+  '((t :inherit transient-key :foreground "blue"))
+  "Face used for blue prefixes and suffixes."
+  :group 'transient-color-faces)
+
+(defface transient-amaranth
+  '((t :inherit transient-key :foreground "#E52B50"))
+  "Face used for amaranth prefixes."
+  :group 'transient-color-faces)
+
+(defface transient-pink
+  '((t :inherit transient-key :foreground "#FF6EB4"))
+  "Face used for pink prefixes."
+  :group 'transient-color-faces)
+
+(defface transient-teal
+  '((t :inherit transient-key :foreground "#367588"))
+  "Face used for teal prefixes."
+  :group 'transient-color-faces)
+
+;;; Persistence
+
+(defun transient--read-file-contents (file)
+  (with-demoted-errors "Transient error: %S"
+    (and (file-exists-p file)
+         (with-temp-buffer
+           (insert-file-contents file)
+           (read (current-buffer))))))
+
+(defun transient--pp-to-file (list file)
+  (make-directory (file-name-directory file) t)
+  (setq list (cl-sort (copy-sequence list) #'string< :key #'car))
+  (with-temp-file file
+    (let ((print-level nil)
+          (print-length nil))
+      (pp list (current-buffer)))))
+
+(defvar transient-values
+  (transient--read-file-contents transient-values-file)
+  "Values of transient commands.
+The value of this variable persists between Emacs sessions
+and you usually should not change it manually.")
+
+(defun transient-save-values ()
+  (transient--pp-to-file transient-values transient-values-file))
+
+(defvar transient-levels
+  (transient--read-file-contents transient-levels-file)
+  "Levels of transient commands.
+The value of this variable persists between Emacs sessions
+and you usually should not change it manually.")
+
+(defun transient-save-levels ()
+  (transient--pp-to-file transient-levels transient-levels-file))
+
+(defvar transient-history
+  (transient--read-file-contents transient-history-file)
+  "History of transient commands and infix arguments.
+The value of this variable persists between Emacs sessions
+\(unless `transient-save-history' is nil) and you usually
+should not change it manually.")
+
+(defun transient-save-history ()
+  (setq transient-history
+        (cl-sort (mapcar (pcase-lambda (`(,key . ,val))
+                           (cons key (seq-take (delete-dups val)
+                                               transient-history-limit)))
+                         transient-history)
+                 #'string< :key #'car))
+  (transient--pp-to-file transient-history transient-history-file))
+
+(defun transient-maybe-save-history ()
+  "Save the value of `transient-history'.
+If `transient-save-history' is nil, then do nothing."
+  (when transient-save-history
+    (transient-save-history)))
+
+(unless noninteractive
+  (add-hook 'kill-emacs-hook 'transient-maybe-save-history))
+
+;;; Classes
+;;;; Prefix
+
+(defclass transient-prefix ()
+  ((prototype   :initarg :prototype)
+   (command     :initarg :command)
+   (level       :initarg :level)
+   (variable    :initarg :variable    :initform nil)
+   (init-value  :initarg :init-value)
+   (value) (default-value :initarg :value)
+   (scope       :initarg :scope       :initform nil)
+   (history     :initarg :history     :initform nil)
+   (history-pos :initarg :history-pos :initform 0)
+   (history-key :initarg :history-key :initform nil)
+   (man-page    :initarg :man-page    :initform nil)
+   (info-manual :initarg :info-manual :initform nil)
+   (transient-suffix     :initarg :transient-suffix     :initform nil)
+   (transient-non-suffix :initarg :transient-non-suffix :initform nil)
+   (incompatible         :initarg :incompatible         :initform nil)
+   (suffix-description   :initarg :suffix-description))
+  "Transient prefix command.
+
+Each transient prefix command consists of a command, which is
+stored in a symbol's function slot and an object, which is
+stored in the `transient--prefix' property of the same symbol.
+
+When a transient prefix command is invoked, then a clone of that
+object is stored in the global variable `transient--prefix' and
+the prototype is stored in the clone's `prototype' slot.")
+
+;;;; Suffix
+
+(defclass transient-child ()
+  ((level
+    :initarg :level
+    :initform 1
+    :documentation "Enable if level of prefix is equal or greater.")
+   (if
+    :initarg :if
+    :initform nil
+    :documentation "Enable if predicate returns non-nil.")
+   (if-not
+    :initarg :if-not
+    :initform nil
+    :documentation "Enable if predicate returns nil.")
+   (if-non-nil
+    :initarg :if-non-nil
+    :initform nil
+    :documentation "Enable if variable's value is non-nil.")
+   (if-nil
+    :initarg :if-nil
+    :initform nil
+    :documentation "Enable if variable's value is nil.")
+   (if-mode
+    :initarg :if-mode
+    :initform nil
+    :documentation "Enable if major-mode matches value.")
+   (if-not-mode
+    :initarg :if-not-mode
+    :initform nil
+    :documentation "Enable if major-mode does not match value.")
+   (if-derived
+    :initarg :if-derived
+    :initform nil
+    :documentation "Enable if major-mode derives from value.")
+   (if-not-derived
+    :initarg :if-not-derived
+    :initform nil
+    :documentation "Enable if major-mode does not derive from value."))
+  "Abstract superclass for group and and suffix classes.
+
+It is undefined what happens if more than one `if*' predicate
+slot is non-nil."
+  :abstract t)
+
+(defclass transient-suffix (transient-child)
+  ((key         :initarg :key)
+   (command     :initarg :command)
+   (transient   :initarg :transient)
+   (format      :initarg :format      :initform " %k %d")
+   (description :initarg :description :initform nil)
+   (inapt                             :initform nil)
+   (inapt-if
+    :initarg :inapt-if
+    :initform nil
+    :documentation "Inapt if predicate returns non-nil.")
+   (inapt-if-not
+    :initarg :inapt-if-not
+    :initform nil
+    :documentation "Inapt if predicate returns nil.")
+   (inapt-if-non-nil
+    :initarg :inapt-if-non-nil
+    :initform nil
+    :documentation "Inapt if variable's value is non-nil.")
+   (inapt-if-nil
+    :initarg :inapt-if-nil
+    :initform nil
+    :documentation "Inapt if variable's value is nil.")
+   (inapt-if-mode
+    :initarg :inapt-if-mode
+    :initform nil
+    :documentation "Inapt if major-mode matches value.")
+   (inapt-if-not-mode
+    :initarg :inapt-if-not-mode
+    :initform nil
+    :documentation "Inapt if major-mode does not match value.")
+   (inapt-if-derived
+    :initarg :inapt-if-derived
+    :initform nil
+    :documentation "Inapt if major-mode derives from value.")
+   (inapt-if-not-derived
+    :initarg :inapt-if-not-derived
+    :initform nil
+    :documentation "Inapt if major-mode does not derive from value."))
+  "Superclass for suffix command.")
+
+(defclass transient-infix (transient-suffix)
+  ((transient                         :initform t)
+   (argument    :initarg :argument)
+   (shortarg    :initarg :shortarg)
+   (value                             :initform nil)
+   (init-value  :initarg :init-value)
+   (unsavable   :initarg :unsavable   :initform nil)
+   (multi-value :initarg :multi-value :initform nil)
+   (always-read :initarg :always-read :initform nil)
+   (allow-empty :initarg :allow-empty :initform nil)
+   (history-key :initarg :history-key :initform nil)
+   (reader      :initarg :reader      :initform nil)
+   (prompt      :initarg :prompt      :initform nil)
+   (choices     :initarg :choices     :initform nil)
+   (format                            :initform " %k %d (%v)"))
+  "Transient infix command."
+  :abstract t)
+
+(defclass transient-argument (transient-infix) ()
+  "Abstract superclass for infix arguments."
+  :abstract t)
+
+(defclass transient-switch (transient-argument) ()
+  "Class used for command-line argument that can be turned on and off.")
+
+(defclass transient-option (transient-argument) ()
+  "Class used for command-line argument that can take a value.")
+
+(defclass transient-variable (transient-infix)
+  ((variable    :initarg :variable)
+   (format                            :initform " %k %d %v"))
+  "Abstract superclass for infix commands that set a variable."
+  :abstract t)
+
+(defclass transient-switches (transient-argument)
+  ((argument-format  :initarg :argument-format)
+   (argument-regexp  :initarg :argument-regexp))
+  "Class used for sets of mutually exclusive command-line switches.")
+
+(defclass transient-files (transient-infix) ()
+  "Class used for the \"--\" argument.
+All remaining arguments are treated as files.
+They become the value of this this argument.")
+
+;;;; Group
+
+(defclass transient-group (transient-child)
+  ((suffixes       :initarg :suffixes       :initform nil)
+   (hide           :initarg :hide           :initform nil)
+   (description    :initarg :description    :initform nil)
+   (setup-children :initarg :setup-children)
+   (pad-keys       :initarg :pad-keys))
+  "Abstract superclass of all group classes."
+  :abstract t)
+
+(defclass transient-column (transient-group) ()
+  "Group class that displays each element on a separate line.")
+
+(defclass transient-row (transient-group) ()
+  "Group class that displays all elements on a single line.")
+
+(defclass transient-columns (transient-group) ()
+  "Group class that displays elements organized in columns.
+Direct elements have to be groups whose elements have to be
+commands or string.  Each subgroup represents a column.  This
+class takes care of inserting the subgroups' elements.")
+
+(defclass transient-subgroups (transient-group) ()
+  "Group class that wraps other groups.
+
+Direct elements have to be groups whose elements have to be
+commands or strings.  This group inserts an empty line between
+subgroups.  The subgroups are responsible for displaying their
+elements themselves.")
+
+;;; Define
+
+(defmacro transient-define-prefix (name arglist &rest args)
+  "Define NAME as a transient prefix command.
+
+ARGLIST are the arguments that command takes.
+DOCSTRING is the documentation string and is optional.
+
+These arguments can optionally be followed by key-value pairs.
+Each key has to be a keyword symbol, either `:class' or a keyword
+argument supported by the constructor of that class.  The
+`transient-prefix' class is used if the class is not specified
+explicitly.
+
+GROUPs add key bindings for infix and suffix commands and specify
+how these bindings are presented in the popup buffer.  At least
+one GROUP has to be specified.  See info node `(transient)Binding
+Suffix and Infix Commands'.
+
+The BODY is optional.  If it is omitted, then ARGLIST is also
+ignored and the function definition becomes:
+
+  (lambda ()
+    (interactive)
+    (transient-setup \\='NAME))
+
+If BODY is specified, then it must begin with an `interactive'
+form that matches ARGLIST, and it must call `transient-setup'.
+It may however call that function only when some condition is
+satisfied; that is one of the reason why you might want to use
+an explicit BODY.
+
+All transients have a (possibly nil) value, which is exported
+when suffix commands are called, so that they can consume that
+value.  For some transients it might be necessary to have a sort
+of secondary value, called a scope.  Such a scope would usually
+be set in the commands `interactive' form and has to be passed
+to the setup function:
+
+  (transient-setup \\='NAME nil nil :scope SCOPE)
+
+\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])"
+  (declare (debug (&define name lambda-list
+                           [&optional lambda-doc]
+                           [&rest keywordp sexp]
+                           [&rest vectorp]
+                           [&optional ("interactive" interactive) def-body]))
+           (indent defun)
+           (doc-string 3))
+  (pcase-let ((`(,class ,slots ,suffixes ,docstr ,body)
+               (transient--expand-define-args args)))
+    `(progn
+       (defalias ',name
+         ,(if body
+              `(lambda ,arglist ,@body)
+            `(lambda ()
+               (interactive)
+               (transient-setup ',name))))
+       (put ',name 'interactive-only t)
+       (put ',name 'function-documentation ,docstr)
+       (put ',name 'transient--prefix
+            (,(or class 'transient-prefix) :command ',name ,@slots))
+       (put ',name 'transient--layout
+            ',(cl-mapcan (lambda (s) (transient--parse-child name s))
+                         suffixes)))))
+
+(defmacro transient-define-suffix (name arglist &rest args)
+  "Define NAME as a transient suffix command.
+
+ARGLIST are the arguments that the command takes.
+DOCSTRING is the documentation string and is optional.
+
+These arguments can optionally be followed by key-value pairs.
+Each key has to be a keyword symbol, either `:class' or a
+keyword argument supported by the constructor of that class.
+The `transient-suffix' class is used if the class is not
+specified explicitly.
+
+The BODY must begin with an `interactive' form that matches
+ARGLIST.  The infix arguments are usually accessed by using
+`transient-args' inside `interactive'.
+
+\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... BODY...)"
+  (declare (debug (&define name lambda-list
+                           [&optional lambda-doc]
+                           [&rest keywordp sexp]
+                           ("interactive" interactive)
+                           def-body))
+           (indent defun)
+           (doc-string 3))
+  (pcase-let ((`(,class ,slots ,_ ,docstr ,body)
+               (transient--expand-define-args args)))
+    `(progn
+       (defalias ',name (lambda ,arglist ,@body))
+       (put ',name 'interactive-only t)
+       (put ',name 'function-documentation ,docstr)
+       (put ',name 'transient--suffix
+            (,(or class 'transient-suffix) :command ',name ,@slots)))))
+
+(defmacro transient-define-infix (name _arglist &rest args)
+  "Define NAME as a transient infix command.
+
+ARGLIST is always ignored and reserved for future use.
+DOCSTRING is the documentation string and is optional.
+
+The key-value pairs are mandatory.  All transient infix commands
+are equal to each other (but not eq), so it is meaningless to
+define an infix command without also setting at least `:class'
+and one other keyword (which it is depends on the used class,
+usually `:argument' or `:variable').
+
+Each key has to be a keyword symbol, either `:class' or a keyword
+argument supported by the constructor of that class.  The
+`transient-switch' class is used if the class is not specified
+explicitly.
+
+The function definitions is always:
+
+   (lambda ()
+     (interactive)
+     (let ((obj (transient-suffix-object)))
+       (transient-infix-set obj (transient-infix-read obj)))
+     (transient--show))
+
+`transient-infix-read' and `transient-infix-set' are generic
+functions.  Different infix commands behave differently because
+the concrete methods are different for different infix command
+classes.  In rare case the above command function might not be
+suitable, even if you define your own infix command class.  In
+that case you have to use `transient-suffix-command' to define
+the infix command and use t as the value of the `:transient'
+keyword.
+
+\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)"
+  (declare (debug (&define name lambda-list
+                           [&optional lambda-doc]
+                           [&rest keywordp sexp]))
+           (indent defun)
+           (doc-string 3))
+  (pcase-let ((`(,class ,slots ,_ ,docstr ,_)
+               (transient--expand-define-args args)))
+    `(progn
+       (defalias ',name ,(transient--default-infix-command))
+       (put ',name 'interactive-only t)
+       (put ',name 'function-documentation ,docstr)
+       (put ',name 'transient--suffix
+            (,(or class 'transient-switch) :command ',name ,@slots)))))
+
+(defalias 'transient-define-argument 'define-infix-command
+  "Define NAME as a transient infix command.
+
+Only use this alias to define an infix command that actually
+sets an infix argument.  To define a infix command that, for
+example, sets a variable use `transient-define-infix' instead.
+
+\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)")
+
+(defun transient--expand-define-args (args)
+  (let (class keys suffixes docstr)
+    (when (stringp (car args))
+      (setq docstr (pop args)))
+    (while (keywordp (car args))
+      (let ((k (pop args))
+            (v (pop args)))
+        (if (eq k :class)
+            (setq class v)
+          (push k keys)
+          (push v keys))))
+    (while (let ((arg (car args)))
+             (or (vectorp arg)
+                 (and arg (symbolp arg))))
+      (push (pop args) suffixes))
+    (list (if (eq (car-safe class) 'quote)
+              (cadr class)
+            class)
+          (nreverse keys)
+          (nreverse suffixes)
+          docstr
+          args)))
+
+(defun transient--parse-child (prefix spec)
+  (cl-etypecase spec
+    (symbol  (let ((value (symbol-value spec)))
+               (if (and (listp value)
+                        (or (listp (car value))
+                            (vectorp (car value))))
+                   (cl-mapcan (lambda (s) (transient--parse-child prefix s)) 
value)
+                 (transient--parse-child prefix value))))
+    (vector  (when-let ((c (transient--parse-group  prefix spec))) (list c)))
+    (list    (when-let ((c (transient--parse-suffix prefix spec))) (list c)))
+    (string  (list spec))))
+
+(defun transient--parse-group (prefix spec)
+  (setq spec (append spec nil))
+  (cl-symbol-macrolet
+      ((car (car spec))
+       (pop (pop spec)))
+    (let (level class args)
+      (when (integerp car)
+        (setq level pop))
+      (when (stringp car)
+        (setq args (plist-put args :description pop)))
+      (while (keywordp car)
+        (let ((k pop))
+          (if (eq k :class)
+              (setq class pop)
+            (setq args (plist-put args k pop)))))
+      (vector (or level (oref-default 'transient-child level))
+              (or class
+                  (if (vectorp car)
+                      'transient-columns
+                    'transient-column))
+              args
+              (cl-mapcan (lambda (s) (transient--parse-child prefix s)) 
spec)))))
+
+(defun transient--parse-suffix (prefix spec)
+  (let (level class args)
+    (cl-symbol-macrolet
+        ((car (car spec))
+         (pop (pop spec)))
+      (when (integerp car)
+        (setq level pop))
+      (when (or (stringp car)
+                (vectorp car))
+        (setq args (plist-put args :key pop)))
+      (when (or (stringp car)
+                (eq (car-safe car) 'lambda)
+                (and (symbolp car)
+                     (not (commandp car))
+                     (commandp (cadr spec))))
+        (setq args (plist-put args :description pop)))
+      (cond
+       ((keywordp car)
+        (error "Need command, got %S" car))
+       ((symbolp car)
+        (setq args (plist-put args :command pop)))
+       ((and (commandp car)
+             (not (stringp car)))
+        (let ((cmd pop)
+              (sym (intern (format "transient:%s:%s"
+                                   prefix
+                                   (or (plist-get args :description)
+                                       (plist-get args :key))))))
+          (defalias sym cmd)
+          (setq args (plist-put args :command sym))))
+       ((or (stringp car)
+            (and car (listp car)))
+        (let ((arg pop))
+          (cl-typecase arg
+            (list
+             (setq args (plist-put args :shortarg (car  arg)))
+             (setq args (plist-put args :argument (cadr arg)))
+             (setq arg  (cadr arg)))
+            (string
+             (when-let ((shortarg (transient--derive-shortarg arg)))
+               (setq args (plist-put args :shortarg shortarg)))
+             (setq args (plist-put args :argument arg))))
+          (setq args (plist-put args :command
+                                (intern (format "transient:%s:%s"
+                                                prefix arg))))
+          (cond ((and car (not (keywordp car)))
+                 (setq class 'transient-option)
+                 (setq args (plist-put args :reader pop)))
+                ((not (string-suffix-p "=" arg))
+                 (setq class 'transient-switch))
+                (t
+                 (setq class 'transient-option)))))
+       (t
+        (error "Needed command or argument, got %S" car)))
+      (while (keywordp car)
+        (let ((k pop))
+          (cl-case k
+            (:class (setq class pop))
+            (:level (setq level pop))
+            (t (setq args (plist-put args k pop)))))))
+    (unless (plist-get args :key)
+      (when-let ((shortarg (plist-get args :shortarg)))
+        (setq args (plist-put args :key shortarg))))
+    (list (or level (oref-default 'transient-child level))
+          (or class 'transient-suffix)
+          args)))
+
+(defun transient--default-infix-command ()
+  (cons 'lambda
+        '(()
+          (interactive)
+          (let ((obj (transient-suffix-object)))
+            (transient-infix-set obj (transient-infix-read obj)))
+          (transient--show))))
+
+(defun transient--ensure-infix-command (obj)
+  (let ((cmd (oref obj command)))
+    (unless (or (commandp cmd)
+                (get cmd 'transient--infix-command))
+      (if (or (cl-typep obj 'transient-switch)
+              (cl-typep obj 'transient-option))
+          (put cmd 'transient--infix-command
+               (transient--default-infix-command))
+        ;; This is not an anonymous infix argument.
+        (error "Suffix %s is not defined or autoloaded as a command" cmd)))))
+
+(defun transient--derive-shortarg (arg)
+  (save-match-data
+    (and (string-match "\\`\\(-[a-zA-Z]\\)\\(\\'\\|=\\)" arg)
+         (match-string 1 arg))))
+
+;;; Edit
+
+(defun transient--insert-suffix (prefix loc suffix action)
+  (let* ((suf (cl-etypecase suffix
+                (vector (transient--parse-group  prefix suffix))
+                (list   (transient--parse-suffix prefix suffix))
+                (string suffix)))
+         (mem (transient--layout-member loc prefix))
+         (elt (car mem)))
+    (cond
+     ((not mem)
+      (message "Cannot insert %S into %s; %s not found"
+               suffix prefix loc))
+     ((or (and (vectorp suffix) (not (vectorp elt)))
+          (and (listp   suffix) (vectorp elt))
+          (and (stringp suffix) (vectorp elt)))
+      (message "Cannot place %S into %s at %s; %s"
+               suffix prefix loc
+               "suffixes and groups cannot be siblings"))
+     (t
+      (when (and (listp suffix)
+                 (listp elt))
+        ;; Both suffixes are key bindings; not heading strings.
+        (let ((key (transient--spec-key suf)))
+          (if (equal (transient--kbd key)
+                     (transient--kbd (transient--spec-key elt)))
+              ;; We must keep `mem' until after we have inserted
+              ;; behind it, which `transient-remove-suffix' does
+              ;; not allow us to do.
+              (let ((spred (transient--suffix-predicate suf))
+                    (epred (transient--suffix-predicate elt)))
+                ;; If both suffixes have a predicate and they
+                ;; are not identical, then there is a high
+                ;; probability that we want to keep both.
+                (when (or (not spred)
+                          (not epred)
+                          (equal spred epred))
+                  (setq action 'replace)))
+            (transient-remove-suffix prefix key))))
+      (cl-ecase action
+        (insert  (setcdr mem (cons elt (cdr mem)))
+                 (setcar mem suf))
+        (append  (setcdr mem (cons suf (cdr mem))))
+        (replace (setcar mem suf)))))))
+
+;;;###autoload
+(defun transient-insert-suffix (prefix loc suffix)
+  "Insert a SUFFIX into PREFIX before LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (declare (indent defun))
+  (transient--insert-suffix prefix loc suffix 'insert))
+
+;;;###autoload
+(defun transient-append-suffix (prefix loc suffix)
+  "Insert a SUFFIX into PREFIX after LOC.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (declare (indent defun))
+  (transient--insert-suffix prefix loc suffix 'append))
+
+;;;###autoload
+(defun transient-replace-suffix (prefix loc suffix)
+  "Replace the suffix at LOC in PREFIX with SUFFIX.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (declare (indent defun))
+  (transient--insert-suffix prefix loc suffix 'replace))
+
+;;;###autoload
+(defun transient-remove-suffix (prefix loc)
+  "Remove the suffix or group at LOC in PREFIX.
+PREFIX is a prefix command, a symbol.
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (declare (indent defun))
+  (transient--layout-member loc prefix 'remove))
+
+(defun transient-get-suffix (prefix loc)
+  "Return the suffix or group at LOC in PREFIX.
+PREFIX is a prefix command, a symbol.
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (if-let ((mem (transient--layout-member loc prefix)))
+      (car mem)
+    (error "%s not found in %s" loc prefix)))
+
+(defun transient-suffix-put (prefix loc prop value)
+  "Edit the suffix at LOC in PREFIX, setting PROP to VALUE.
+PREFIX is a prefix command, a symbol.
+SUFFIX is a suffix command or a group specification (of
+  the same forms as expected by `transient-define-prefix').
+LOC is a command, a key vector, a key description (a string
+  as returned by `key-description'), or a coordination list
+  (whose last element may also be a command or key).
+See info node `(transient)Modifying Existing Transients'."
+  (let ((suf (transient-get-suffix prefix loc)))
+    (setf (elt suf 2)
+          (plist-put (elt suf 2) prop value))))
+
+(defun transient--layout-member (loc prefix &optional remove)
+  (let ((val (or (get prefix 'transient--layout)
+                 (error "%s is not a transient command" prefix))))
+    (when (listp loc)
+      (while (integerp (car loc))
+        (let* ((children (if (vectorp val) (aref val 3) val))
+               (mem (transient--nthcdr (pop loc) children)))
+          (if (and remove (not loc))
+              (let ((rest (delq (car mem) children)))
+                (if (vectorp val)
+                    (aset val 3 rest)
+                  (put prefix 'transient--layout rest))
+                (setq val nil))
+            (setq val (if loc (car mem) mem)))))
+      (setq loc (car loc)))
+    (if loc
+        (transient--layout-member-1 (transient--kbd loc) val remove)
+      val)))
+
+(defun transient--layout-member-1 (loc layout remove)
+  (cond ((listp layout)
+         (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove))
+                   layout))
+        ((vectorp (car (aref layout 3)))
+         (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove))
+                   (aref layout 3)))
+        (remove
+         (aset layout 3
+               (delq (car (transient--group-member loc layout))
+                     (aref layout 3)))
+         nil)
+        (t (transient--group-member loc layout))))
+
+(defun transient--group-member (loc group)
+  (cl-member-if (lambda (suffix)
+                  (and (listp suffix)
+                       (let* ((def (nth 2 suffix))
+                              (cmd (plist-get def :command)))
+                         (if (symbolp loc)
+                             (eq cmd loc)
+                           (equal (transient--kbd
+                                   (or (plist-get def :key)
+                                       (transient--command-key cmd)))
+                                  loc)))))
+                (aref group 3)))
+
+(defun transient--kbd (keys)
+  (when (vectorp keys)
+    (setq keys (key-description keys)))
+  (when (stringp keys)
+    (setq keys (kbd keys)))
+  keys)
+
+(defun transient--spec-key (spec)
+  (let ((plist (nth 2 spec)))
+    (or (plist-get plist :key)
+        (transient--command-key
+         (plist-get plist :command)))))
+
+(defun transient--command-key (cmd)
+  (when-let ((obj (get cmd 'transient--suffix)))
+    (cond ((slot-boundp obj 'key)
+           (oref obj key))
+          ((slot-exists-p obj 'shortarg)
+           (if (slot-boundp obj 'shortarg)
+               (oref obj shortarg)
+             (transient--derive-shortarg (oref obj argument)))))))
+
+(defun transient--nthcdr (n list)
+  (nthcdr (if (< n 0) (- (length list) (abs n)) n) list))
+
+;;; Variables
+
+(defvar transient-current-prefix nil
+  "The transient from which this suffix command was invoked.
+This is an object representing that transient, use
+`transient-current-command' to get the respective command.")
+
+(defvar transient-current-command nil
+  "The transient from which this suffix command was invoked.
+This is a symbol representing that transient, use
+`current-transient-object' to get the respective object.")
+
+(defvar transient-current-suffixes nil
+  "The suffixes of the transient from which this suffix command was invoked.
+This is a list of objects.  Usually it is sufficient to instead
+use the function `transient-args', which returns a list of
+values.  In complex cases it might be necessary to use this
+variable instead.")
+
+(defvar transient-exit-hook nil
+  "Hook run after exiting a transient.")
+
+(defvar transient--prefix nil)
+(defvar transient--layout nil)
+(defvar transient--suffixes nil)
+
+(defconst transient--stay t   "Do not exit the transient.")
+(defconst transient--exit nil "Do exit the transient.")
+
+(defvar transient--exitp nil "Whether to exit the transient.")
+(defvar transient--showp nil "Whether the transient is show in a popup 
buffer.")
+(defvar transient--helpp nil "Whether help-mode is active.")
+(defvar transient--editp nil "Whether edit-mode is active.")
+
+(defvar transient--active-infix nil "The active infix awaiting user input.")
+
+(defvar transient--timer nil)
+
+(defvar transient--stack nil)
+
+(defvar transient--buffer-name " *transient*"
+  "Name of the transient buffer.")
+
+(defvar transient--window nil
+  "The window used to display the transient popup.")
+
+(defvar transient--original-window nil
+  "The window that was selected before the transient was invoked.
+Usually it remains selected while the transient is active.")
+
+(define-obsolete-variable-alias 'transient--source-buffer
+  'transient--original-buffer "Transient 0.2.0")
+
+(defvar transient--original-buffer nil
+  "The buffer that was current before the transient was invoked.
+Usually it remains current while the transient is active.")
+
+(defvar transient--debug nil "Whether put debug information into *Messages*.")
+
+(defvar transient--history nil)
+
+(defvar transient--scroll-commands
+  '(transient-scroll-up
+    transient-scroll-down
+    mwheel-scroll
+    scroll-bar-toolkit-scroll))
+
+;;; Identities
+
+(defun transient-suffix-object (&optional command)
+  "Return the object associated with the current suffix command.
+
+Each suffix commands is associated with an object, which holds
+additional information about the suffix, such as its value (in
+the case of an infix command, which is a kind of suffix command).
+
+This function is intended to be called by infix commands, whose
+command definition usually (at least when defined using
+`transient-define-infix') is this:
+
+   (lambda ()
+     (interactive)
+     (let ((obj (transient-suffix-object)))
+       (transient-infix-set obj (transient-infix-read obj)))
+     (transient--show))
+
+\(User input is read outside of `interactive' to prevent the
+command from being added to `command-history'.  See #23.)
+
+Such commands need to be able to access their associated object
+to guide how `transient-infix-read' reads the new value and to
+store the read value.  Other suffix commands (including non-infix
+commands) may also need the object to guide their behavior.
+
+This function attempts to return the object associated with the
+current suffix command even if the suffix command was not invoked
+from a transient.  (For some suffix command that is a valid thing
+to do, for others it is not.)  In that case nil may be returned
+if the command was not defined using one of the macros intended
+to define such commands.
+
+The optional argument COMMAND is intended for internal use.  If
+you are contemplating using it in your own code, then you should
+probably use this instead:
+
+  (get COMMAND 'transient--suffix)"
+  (when command
+    (cl-check-type command command))
+  (if (or transient--prefix
+          transient-current-prefix)
+      (cl-find-if (lambda (obj)
+                    (eq (transient--suffix-command obj)
+                        (or command this-original-command)))
+                  (or transient--suffixes
+                      transient-current-suffixes))
+    (when-let ((obj (get (or command this-command) 'transient--suffix))
+               (obj (clone obj)))
+      (transient-init-scope obj)
+      (transient-init-value obj)
+      obj)))
+
+(defun transient--suffix-command (object)
+  "Return the command represented by OBJECT.
+
+If the value of OBJECT's `command' slot is a command, then return
+that.  Otherwise it is a symbol whose `transient--infix-command'
+property holds an anonymous command, which is returned instead."
+  (cl-check-type object transient-suffix)
+  (let ((sym (oref object command)))
+    (if (commandp sym)
+        sym
+      (get sym 'transient--infix-command))))
+
+(defun transient--suffix-symbol (arg)
+  "Return a symbol representing ARG.
+
+ARG must be a command and/or a symbol.  If it is a symbol,
+then just return it.  Otherwise return the symbol whose
+`transient--infix-command' property's value is ARG."
+  (or (cl-typep arg 'command)
+      (cl-typep arg 'symbol)
+      (signal 'wrong-type-argument `((command symbol) ,arg)))
+  (if (symbolp arg)
+      arg
+    (let* ((obj (transient-suffix-object))
+           (sym (oref obj command)))
+      (if (eq (get sym 'transient--infix-command) arg)
+          sym
+        (catch 'found
+          (mapatoms (lambda (sym)
+                      (when (eq (get sym 'transient--infix-command) arg)
+                        (throw 'found sym)))))))))
+
+;;; Keymaps
+
+(defvar transient-base-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "ESC ESC ESC") 'transient-quit-all)
+    (define-key map (kbd "C-g") 'transient-quit-one)
+    (define-key map (kbd "C-q") 'transient-quit-all)
+    (define-key map (kbd "C-z") 'transient-suspend)
+    (define-key map (kbd "C-v") 'transient-scroll-up)
+    (define-key map (kbd "C-M-v") 'transient-scroll-down)
+    (define-key map [next]      'transient-scroll-up)
+    (define-key map [prior]     'transient-scroll-down)
+    map)
+  "Parent of other keymaps used by Transient.
+
+This is the parent keymap of all the keymaps that are used in
+all transients: `transient-map' (which in turn is the parent
+of the transient-specific keymaps), `transient-edit-map' and
+`transient-sticky-map'.
+
+If you change a binding here, then you might also have to edit
+`transient-sticky-map' and `transient-common-commands'.  While
+the latter isn't a proper transient prefix command, it can be
+edited using the same functions as used for transients.
+
+If you add a new command here, then you must also add a binding
+to `transient-predicate-map'.")
+
+(defvar transient-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map transient-base-map)
+    (define-key map (kbd "C-p") 'universal-argument)
+    (define-key map (kbd "C--") 'negative-argument)
+    (define-key map (kbd "C-t") 'transient-show)
+    (define-key map (kbd "?")   'transient-help)
+    (define-key map (kbd "C-h") 'transient-help)
+    ;; Also bound to "C-x p" and "C-x n" in transient-common-commands.
+    (define-key map (kbd "C-M-p") 'transient-history-prev)
+    (define-key map (kbd "C-M-n") 'transient-history-next)
+    map)
+  "Top-level keymap used by all transients.
+
+If you add a new command here, then you must also add a binding
+to `transient-predicate-map'.  Also see `transient-base-map'.")
+
+(defvar transient-edit-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map transient-base-map)
+    (define-key map (kbd "?")     'transient-help)
+    (define-key map (kbd "C-h")   'transient-help)
+    (define-key map (kbd "C-x l") 'transient-set-level)
+    map)
+  "Keymap that is active while a transient in is in \"edit mode\".")
+
+(defvar transient-sticky-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map transient-base-map)
+    (define-key map (kbd "C-g") 'transient-quit-seq)
+    map)
+  "Keymap that is active while an incomplete key sequence is active.")
+
+(defvar transient--common-command-prefixes '(?\C-x))
+
+(put 'transient-common-commands
+     'transient--layout
+     (cl-mapcan
+      (lambda (s) (transient--parse-child 'transient-common-commands s))
+      '([:hide (lambda ()
+                 (and (not (memq (car transient--redisplay-key)
+                                 transient--common-command-prefixes))
+                      (not transient-show-common-commands)))
+         ["Value commands"
+          ("C-x s  " "Set"            transient-set)
+          ("C-x C-s" "Save"           transient-save)
+          ("C-x p  " "Previous value" transient-history-prev)
+          ("C-x n  " "Next value"     transient-history-next)]
+         ["Sticky commands"
+          ;; Like `transient-sticky-map' except that
+          ;; "C-g" has to be bound to a different command.
+          ("C-g" "Quit prefix or transient" transient-quit-one)
+          ("C-q" "Quit transient stack"     transient-quit-all)
+          ("C-z" "Suspend transient stack"  transient-suspend)]
+         ["Customize"
+          ("C-x t" transient-toggle-common
+           :description (lambda ()
+                          (if transient-show-common-commands
+                              "Hide common commands"
+                            "Show common permanently")))
+          ("C-x l" "Show/hide suffixes" transient-set-level)]])))
+
+(defvar transient-predicate-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [handle-switch-frame]     'transient--do-suspend)
+    (define-key map [transient-suspend]       'transient--do-suspend)
+    (define-key map [transient-help]          'transient--do-stay)
+    (define-key map [transient-set-level]     'transient--do-stay)
+    (define-key map [transient-history-prev]  'transient--do-stay)
+    (define-key map [transient-history-next]  'transient--do-stay)
+    (define-key map [universal-argument]      'transient--do-stay)
+    (define-key map [negative-argument]       'transient--do-stay)
+    (define-key map [digit-argument]          'transient--do-stay)
+    (define-key map [transient-quit-all]      'transient--do-quit-all)
+    (define-key map [transient-quit-one]      'transient--do-quit-one)
+    (define-key map [transient-quit-seq]      'transient--do-stay)
+    (define-key map [transient-show]          'transient--do-stay)
+    (define-key map [transient-update]        'transient--do-stay)
+    (define-key map [transient-toggle-common] 'transient--do-stay)
+    (define-key map [transient-set]           'transient--do-call)
+    (define-key map [transient-save]          'transient--do-call)
+    (define-key map [describe-key-briefly]    'transient--do-stay)
+    (define-key map [describe-key]            'transient--do-stay)
+    (define-key map [transient-scroll-up]     'transient--do-stay)
+    (define-key map [transient-scroll-down]   'transient--do-stay)
+    (define-key map [mwheel-scroll]           'transient--do-stay)
+    (define-key map [scroll-bar-toolkit-scroll]   'transient--do-stay)
+    (define-key map [transient-noop]              'transient--do-noop)
+    (define-key map [transient-mouse-push-button] 'transient--do-move)
+    (define-key map [transient-push-button]       'transient--do-move)
+    (define-key map [transient-backward-button]   'transient--do-move)
+    (define-key map [transient-forward-button]    'transient--do-move)
+    (define-key map [transient-isearch-backward]  'transient--do-move)
+    (define-key map [transient-isearch-forward]   'transient--do-move)
+    map)
+  "Base keymap used to map common commands to their transient behavior.
+
+The \"transient behavior\" of a command controls, among other
+things, whether invoking the command causes the transient to be
+exited or not and whether infix arguments are exported before
+doing so.
+
+Each \"key\" is a command that is common to all transients and
+that is bound in `transient-map', `transient-edit-map',
+`transient-sticky-map' and/or `transient-common-command'.
+
+Each binding is a \"pre-command\", a function that controls the
+transient behavior of the respective command.
+
+For transient commands that are bound in individual transients,
+the transient behavior is specified using the `:transient' slot
+of the corresponding object.")
+
+(defvar transient-popup-navigation-map)
+
+(defvar transient--transient-map nil)
+(defvar transient--predicate-map nil)
+(defvar transient--redisplay-map nil)
+(defvar transient--redisplay-key nil)
+
+(defun transient--push-keymap (map)
+  (transient--debug "   push %s%s" map (if (symbol-value map) "" " VOID"))
+  (with-demoted-errors "transient--push-keymap: %S"
+    (internal-push-keymap (symbol-value map) 'overriding-terminal-local-map)))
+
+(defun transient--pop-keymap (map)
+  (transient--debug "   pop  %s%s" map (if (symbol-value map) "" " VOID"))
+  (with-demoted-errors "transient--pop-keymap: %S"
+    (internal-pop-keymap (symbol-value map) 'overriding-terminal-local-map)))
+
+(defun transient--make-transient-map ()
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map (if transient--editp
+                               transient-edit-map
+                             transient-map))
+    (dolist (obj transient--suffixes)
+      (let ((key (oref obj key)))
+        (when (vectorp key)
+          (setq key (key-description key))
+          (oset obj key key))
+        (when transient-substitute-key-function
+          (setq key (save-match-data
+                      (funcall transient-substitute-key-function obj)))
+          (oset obj key key))
+        (let ((kbd (kbd key))
+              (cmd (transient--suffix-command obj)))
+          (when-let ((conflict (and transient-detect-key-conflicts
+                                    (transient--lookup-key map kbd))))
+            (unless (eq cmd conflict)
+              (error "Cannot bind %S to %s and also %s"
+                     (string-trim key)
+                     cmd conflict)))
+          (define-key map kbd cmd))))
+    (when transient-enable-popup-navigation
+      (setq map
+            (make-composed-keymap (list map transient-popup-navigation-map))))
+    map))
+
+(defun transient--make-predicate-map ()
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map transient-predicate-map)
+    (dolist (obj transient--suffixes)
+      (let* ((cmd (oref obj command))
+             (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix)))
+             (sym (transient--suffix-symbol cmd)))
+        (cond
+         ((oref obj inapt)
+          (define-key map (vector sym) 'transient--do-warn-inapt))
+         ((slot-boundp obj 'transient)
+          (define-key map (vector sym)
+            (let ((do (oref obj transient)))
+              (pcase do
+                (`t (if sub-prefix
+                        'transient--do-replace
+                      'transient--do-stay))
+                (`nil 'transient--do-exit)
+                (_ do)))))
+         ((not (lookup-key transient-predicate-map (vector sym)))
+          (define-key map (vector sym)
+            (if sub-prefix
+                'transient--do-replace
+              (or (oref transient--prefix transient-suffix)
+                  'transient--do-exit)))))))
+    map))
+
+(defun transient--make-redisplay-map ()
+  (setq transient--redisplay-key
+        (cl-case this-command
+          (transient-update
+           (setq transient--showp t)
+           (setq unread-command-events
+                 (listify-key-sequence (this-single-command-raw-keys))))
+          (transient-quit-seq
+           (setq unread-command-events
+                 (butlast (listify-key-sequence
+                           (this-single-command-raw-keys))
+                          2))
+           (butlast transient--redisplay-key))
+          (t nil)))
+  (let ((topmap (make-sparse-keymap))
+        (submap (make-sparse-keymap)))
+    (when transient--redisplay-key
+      (define-key topmap (vconcat transient--redisplay-key) submap)
+      (set-keymap-parent submap transient-sticky-map))
+    (map-keymap-internal
+     (lambda (key def)
+       (when (and (not (eq key ?\e))
+                  (listp def)
+                  (keymapp def))
+         (define-key topmap (vconcat transient--redisplay-key (list key))
+           'transient-update)))
+     (if transient--redisplay-key
+         (lookup-key transient--transient-map (vconcat 
transient--redisplay-key))
+       transient--transient-map))
+    topmap))
+
+;;; Setup
+
+(defun transient-setup (&optional name layout edit &rest params)
+  "Setup the transient specified by NAME.
+
+This function is called by transient prefix commands to setup the
+transient.  In that case NAME is mandatory, LAYOUT and EDIT must
+be nil and PARAMS may be (but usually is not) used to set e.g. the
+\"scope\" of the transient (see `transient-define-prefix').
+
+This function is also called internally in which case LAYOUT and
+EDIT may be non-nil."
+  (transient--debug 'setup)
+  (when (> (minibuffer-depth) 0)
+    (user-error "Cannot invoke transient %s while minibuffer is active" name))
+  (transient--with-emergency-exit
+    (cond
+     ((not name)
+      ;; Switching between regular and edit mode.
+      (transient--pop-keymap 'transient--transient-map)
+      (transient--pop-keymap 'transient--redisplay-map)
+      (setq name (oref transient--prefix command))
+      (setq params (list :scope (oref transient--prefix scope))))
+     (transient--transient-map
+      ;; Invoked as a ":transient-non-suffix 'transient--do-{stay,call}"
+      ;; of an outer prefix.  Unlike the usual `transient--do-replace',
+      ;; these predicates fail to clean up after the outer prefix.
+      (transient--pop-keymap 'transient--transient-map)
+      (transient--pop-keymap 'transient--redisplay-map))
+     ((not (or layout                      ; resuming parent/suspended prefix
+               transient-current-command)) ; entering child prefix
+      (transient--stack-zap))              ; replace suspended prefix, if any
+     (edit
+      ;; Returning from help to edit.
+      (setq transient--editp t)))
+    (transient--init-objects name layout params)
+    (transient--history-init transient--prefix)
+    (setq transient--predicate-map (transient--make-predicate-map))
+    (setq transient--transient-map (transient--make-transient-map))
+    (setq transient--redisplay-map (transient--make-redisplay-map))
+    (setq transient--original-window (selected-window))
+    (setq transient--original-buffer (current-buffer))
+    (transient--redisplay)
+    (transient--init-transient)
+    (transient--suspend-which-key-mode)))
+
+(cl-defgeneric transient-setup-children (group children)
+  "Setup the CHILDREN of GROUP.
+If the value of the `setup-children' slot is non-nil, then call
+that function with CHILDREN as the only argument and return the
+value.  Otherwise return CHILDREN as is."
+  (if (slot-boundp group 'setup-children)
+      (funcall (oref group setup-children) children)
+    children))
+
+(defun transient--init-objects (name layout params)
+  (setq transient--prefix (transient--init-prefix name params))
+  (setq transient--layout (or layout (transient--init-suffixes name)))
+  (setq transient--suffixes (transient--flatten-suffixes transient--layout)))
+
+(defun transient--init-prefix (name &optional params)
+  (let ((obj (let ((proto (get name 'transient--prefix)))
+               (apply #'clone proto
+                      :prototype proto
+                      :level (or (alist-get t (alist-get name 
transient-levels))
+                                 transient-default-level)
+                      params))))
+    (transient-init-value obj)
+    obj))
+
+(defun transient--init-suffixes (name)
+  (let ((levels (alist-get name transient-levels)))
+    (cl-mapcan (lambda (c) (transient--init-child levels c))
+               (append (get name 'transient--layout)
+                       (and (not transient--editp)
+                            (get 'transient-common-commands
+                                 'transient--layout))))))
+
+(defun transient--flatten-suffixes (layout)
+  (cl-labels ((s (def)
+                 (cond
+                  ((stringp def) nil)
+                  ((listp def) (cl-mapcan #'s def))
+                  ((transient-group--eieio-childp def)
+                   (cl-mapcan #'s (oref def suffixes)))
+                  ((transient-suffix--eieio-childp def)
+                   (list def)))))
+    (cl-mapcan #'s layout)))
+
+(defun transient--init-child (levels spec)
+  (cl-etypecase spec
+    (vector  (transient--init-group  levels spec))
+    (list    (transient--init-suffix levels spec))
+    (string  (list spec))))
+
+(defun transient--init-group (levels spec)
+  (pcase-let ((`(,level ,class ,args ,children) (append spec nil)))
+    (when (transient--use-level-p level)
+      (let ((obj (apply class :level level args)))
+        (when (transient--use-suffix-p obj)
+          (when-let ((suffixes
+                      (cl-mapcan (lambda (c) (transient--init-child levels c))
+                                 (transient-setup-children obj children))))
+            (oset obj suffixes suffixes)
+            (list obj)))))))
+
+(defun transient--init-suffix (levels spec)
+  (pcase-let* ((`(,level ,class ,args) spec)
+               (cmd (plist-get args :command))
+               (level (or (alist-get (transient--suffix-symbol cmd) levels)
+                          level)))
+    (let ((fn (and (symbolp cmd)
+                   (symbol-function cmd))))
+      (when (autoloadp fn)
+        (transient--debug "   autoload %s" cmd)
+        (autoload-do-load fn)))
+    (when (transient--use-level-p level)
+      (let ((obj (if-let ((proto (and cmd
+                                      (symbolp cmd)
+                                      (get cmd 'transient--suffix))))
+                     (apply #'clone proto :level level args)
+                   (apply class :level level args))))
+        (transient--init-suffix-key obj)
+        (transient--ensure-infix-command obj)
+        (when (transient--use-suffix-p obj)
+          (if (transient--inapt-suffix-p obj)
+              (oset obj inapt t)
+            (transient-init-scope obj)
+            (transient-init-value obj))
+          (list obj))))))
+
+(cl-defmethod transient--init-suffix-key ((obj transient-suffix))
+  (unless (slot-boundp obj 'key)
+    (error "No key for %s" (oref obj command))))
+
+(cl-defmethod transient--init-suffix-key ((obj transient-argument))
+  (if (transient-switches--eieio-childp obj)
+      (cl-call-next-method obj)
+    (unless (slot-boundp obj 'shortarg)
+      (when-let ((shortarg (transient--derive-shortarg (oref obj argument))))
+        (oset obj shortarg shortarg)))
+    (unless (slot-boundp obj 'key)
+      (if (slot-boundp obj 'shortarg)
+          (oset obj key (oref obj shortarg))
+        (error "No key for %s" (oref obj command))))))
+
+(defun transient--use-level-p (level &optional edit)
+  (or (and transient--editp (not edit))
+      (and (>= level 1)
+           (<= level (oref transient--prefix level)))))
+
+(defun transient--use-suffix-p (obj)
+  (transient--do-suffix-p
+   (oref obj if)
+   (oref obj if-not)
+   (oref obj if-nil)
+   (oref obj if-non-nil)
+   (oref obj if-mode)
+   (oref obj if-not-mode)
+   (oref obj if-derived)
+   (oref obj if-not-derived)
+   t))
+
+(defun transient--inapt-suffix-p (obj)
+  (transient--do-suffix-p
+   (oref obj inapt-if)
+   (oref obj inapt-if-not)
+   (oref obj inapt-if-nil)
+   (oref obj inapt-if-non-nil)
+   (oref obj inapt-if-mode)
+   (oref obj inapt-if-not-mode)
+   (oref obj inapt-if-derived)
+   (oref obj inapt-if-not-derived)
+   nil))
+
+(defun transient--do-suffix-p
+    (if if-not if-nil if-non-nil if-mode if-not-mode if-derived if-not-derived
+        default)
+  (cond
+   (if                  (funcall if))
+   (if-not         (not (funcall if-not)))
+   (if-non-nil          (symbol-value if-non-nil))
+   (if-nil         (not (symbol-value if-nil)))
+   (if-mode             (if (atom if-mode)
+                            (eq major-mode if-mode)
+                          (memq major-mode if-mode)))
+   (if-not-mode    (not (if (atom if-not-mode)
+                            (eq major-mode if-not-mode)
+                          (memq major-mode if-not-mode))))
+   (if-derived          (if (atom if-derived)
+                            (derived-mode-p if-derived)
+                          (apply #'derived-mode-p if-derived)))
+   (if-not-derived (not (if (atom if-not-derived)
+                            (derived-mode-p if-not-derived)
+                          (apply #'derived-mode-p if-not-derived))))
+   (t default)))
+
+(defun transient--suffix-predicate (spec)
+  (let ((plist (nth 2 spec)))
+    (seq-some (lambda (prop)
+                (when-let ((pred (plist-get plist prop)))
+                  (list prop pred)))
+              '( :if :if-not
+                 :if-nil :if-non-nil
+                 :if-mode :if-not-mode
+                 :if-derived :if-not-derived
+                 :inapt-if :inapt-if-not
+                 :inapt-if-nil :inapt-if-non-nil
+                 :inapt-if-mode :inapt-if-not-mode
+                 :inapt-if-derived :inapt-if-not-derived))))
+
+;;; Flow-Control
+
+(defun transient--init-transient ()
+  (transient--debug 'init-transient)
+  (transient--push-keymap 'transient--transient-map)
+  (transient--push-keymap 'transient--redisplay-map)
+  (add-hook 'pre-command-hook      #'transient--pre-command)
+  (add-hook 'minibuffer-setup-hook #'transient--minibuffer-setup)
+  (add-hook 'minibuffer-exit-hook  #'transient--minibuffer-exit)
+  (add-hook 'post-command-hook     #'transient--post-command)
+  (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)
+  (when transient--exitp
+    ;; This prefix command was invoked as the suffix of another.
+    ;; Prevent `transient--post-command' from removing the hooks
+    ;; that we just added.
+    (setq transient--exitp 'replace)))
+
+(defun transient--pre-command ()
+  (transient--debug 'pre-command)
+  (cond
+   ((memq this-command '(transient-update transient-quit-seq))
+    (transient--pop-keymap 'transient--redisplay-map))
+   ((and transient--helpp
+         (not (memq this-command '(transient-quit-one
+                                   transient-quit-all))))
+    (cond
+     ((transient-help)
+      (transient--do-suspend)
+      (setq this-command 'transient-suspend)
+      (transient--pre-exit))
+     ((not (transient--edebug-command-p))
+      (setq this-command 'transient-undefined))))
+   ((and transient--editp
+         (transient-suffix-object)
+         (not (memq this-command '(transient-quit-one
+                                   transient-quit-all
+                                   transient-help))))
+    (setq this-command 'transient-set-level))
+   (t
+    (setq transient--exitp nil)
+    (when (eq (if-let ((fn (transient--get-predicate-for
+                            this-original-command)))
+                  (let ((action (funcall fn)))
+                    (when (eq action transient--exit)
+                      (setq transient--exitp (or transient--exitp t)))
+                    action)
+                (if (let ((keys (this-command-keys-vector)))
+                      (eq (aref keys (1- (length keys))) ?\C-g))
+                    (setq this-command 'transient-noop)
+                  (unless (transient--edebug-command-p)
+                    (setq this-command 'transient-undefined)))
+                transient--stay)
+              transient--exit)
+      (transient--pre-exit)))))
+
+(defun transient--get-predicate-for (cmd)
+  (or (lookup-key transient--predicate-map
+                  (vector (transient--suffix-symbol cmd)))
+      (oref transient--prefix transient-non-suffix)))
+
+(defun transient--pre-exit ()
+  (transient--debug 'pre-exit)
+  (transient--delete-window)
+  (transient--timer-cancel)
+  (transient--pop-keymap 'transient--transient-map)
+  (transient--pop-keymap 'transient--redisplay-map)
+  (remove-hook 'pre-command-hook #'transient--pre-command)
+  (unless transient--showp
+    (let ((message-log-max nil))
+      (message "")))
+  (setq transient--transient-map nil)
+  (setq transient--predicate-map nil)
+  (setq transient--redisplay-map nil)
+  (setq transient--redisplay-key nil)
+  (setq transient--showp nil)
+  (setq transient--helpp nil)
+  (setq transient--editp nil)
+  (setq transient--prefix nil)
+  (setq transient--layout nil)
+  (setq transient--suffixes nil)
+  (setq transient--original-window nil)
+  (setq transient--original-buffer nil)
+  (setq transient--window nil))
+
+(defun transient--delete-window ()
+  (when (window-live-p transient--window)
+    (let ((buf (window-buffer transient--window)))
+      (with-demoted-errors "Error while exiting transient: %S"
+        (delete-window transient--window))
+      (kill-buffer buf))))
+
+(defun transient--export ()
+  (setq transient-current-prefix transient--prefix)
+  (setq transient-current-command (oref transient--prefix command))
+  (setq transient-current-suffixes transient--suffixes)
+  (transient--history-push transient--prefix))
+
+(defun transient--minibuffer-setup ()
+  (transient--debug 'minibuffer-setup)
+  (unless (> (minibuffer-depth) 1)
+    (unless transient--exitp
+      (transient--pop-keymap 'transient--transient-map)
+      (transient--pop-keymap 'transient--redisplay-map)
+      (remove-hook 'pre-command-hook #'transient--pre-command))
+    (remove-hook 'post-command-hook #'transient--post-command)))
+
+(defun transient--minibuffer-exit ()
+  (transient--debug 'minibuffer-exit)
+  (unless (> (minibuffer-depth) 1)
+    (unless transient--exitp
+      (transient--push-keymap 'transient--transient-map)
+      (transient--push-keymap 'transient--redisplay-map)
+      (add-hook 'pre-command-hook #'transient--pre-command))
+    (add-hook 'post-command-hook #'transient--post-command)))
+
+(defun transient--suspend-override (&optional minibuffer-hooks)
+  (transient--debug 'suspend-override)
+  (transient--pop-keymap 'transient--transient-map)
+  (transient--pop-keymap 'transient--redisplay-map)
+  (remove-hook 'pre-command-hook  #'transient--pre-command)
+  (remove-hook 'post-command-hook #'transient--post-command)
+  (when minibuffer-hooks
+    (remove-hook   'minibuffer-setup-hook #'transient--minibuffer-setup)
+    (remove-hook   'minibuffer-exit-hook  #'transient--minibuffer-exit)
+    (advice-remove 'abort-recursive-edit  #'transient--minibuffer-exit)))
+
+(defun transient--resume-override (&optional minibuffer-hooks)
+  (transient--debug 'resume-override)
+  (transient--push-keymap 'transient--transient-map)
+  (transient--push-keymap 'transient--redisplay-map)
+  (add-hook 'pre-command-hook  #'transient--pre-command)
+  (add-hook 'post-command-hook #'transient--post-command)
+  (when minibuffer-hooks
+    (add-hook   'minibuffer-setup-hook #'transient--minibuffer-setup)
+    (add-hook   'minibuffer-exit-hook  #'transient--minibuffer-exit)
+    (advice-add 'abort-recursive-edit :after #'transient--minibuffer-exit)))
+
+(defun transient--post-command ()
+  (transient--debug 'post-command)
+  (if transient--exitp
+      (progn
+        (unless (and (eq transient--exitp 'replace)
+                     (or transient--prefix
+                         ;; The current command could act as a prefix,
+                         ;; but decided not to call `transient-setup'.
+                         (prog1 nil (transient--stack-zap))))
+          (remove-hook   'minibuffer-setup-hook #'transient--minibuffer-setup)
+          (remove-hook   'minibuffer-exit-hook  #'transient--minibuffer-exit)
+          (advice-remove 'abort-recursive-edit  #'transient--minibuffer-exit)
+          (remove-hook   'post-command-hook     #'transient--post-command))
+        (setq transient-current-prefix nil)
+        (setq transient-current-command nil)
+        (setq transient-current-suffixes nil)
+        (let ((resume (and transient--stack
+                           (not (memq transient--exitp '(replace suspend))))))
+          (setq transient--exitp nil)
+          (setq transient--helpp nil)
+          (setq transient--editp nil)
+          (run-hooks 'transient-exit-hook)
+          (when resume
+            (transient--stack-pop))))
+    (transient--pop-keymap 'transient--redisplay-map)
+    (setq transient--redisplay-map (transient--make-redisplay-map))
+    (transient--push-keymap 'transient--redisplay-map)
+    (unless (eq this-command (oref transient--prefix command))
+      (transient--redisplay))))
+
+(defun transient--stack-push ()
+  (transient--debug 'stack-push)
+  (push (list (oref transient--prefix command)
+              transient--layout
+              transient--editp
+              :scope (oref transient--prefix scope))
+        transient--stack))
+
+(defun transient--stack-pop ()
+  (transient--debug 'stack-pop)
+  (and transient--stack
+       (prog1 t (apply #'transient-setup (pop transient--stack)))))
+
+(defun transient--stack-zap ()
+  (transient--debug 'stack-zap)
+  (setq transient--stack nil))
+
+(defun transient--redisplay ()
+  (if (or (eq transient-show-popup t)
+          transient--showp)
+      (unless (memq this-command transient--scroll-commands)
+        (transient--show))
+    (when (and (numberp transient-show-popup)
+               (not (zerop transient-show-popup))
+               (not transient--timer))
+      (transient--timer-start))
+    (transient--show-brief)))
+
+(defun transient--timer-start ()
+  (setq transient--timer
+        (run-at-time (abs transient-show-popup) nil
+                     (lambda ()
+                       (transient--timer-cancel)
+                       (transient--show)
+                       (let ((message-log-max nil))
+                         (message ""))))))
+
+(defun transient--timer-cancel ()
+  (when transient--timer
+    (cancel-timer transient--timer)
+    (setq transient--timer nil)))
+
+(defun transient--debug (arg &rest args)
+  (when transient--debug
+    (if (symbolp arg)
+        (message "-- %-16s (cmd: %s, event: %S, exit: %s)"
+                 arg
+                 (transient--suffix-symbol this-command)
+                 (key-description (this-command-keys-vector))
+                 transient--exitp)
+      (apply #'message arg args))))
+
+(defun transient--emergency-exit ()
+  "Exit the current transient command after an error occurred.
+When no transient is active (i.e. when `transient--prefix') is
+nil, then do nothing."
+  (transient--debug 'emergency-exit)
+  (when transient--prefix
+    (setq transient--stack nil)
+    (setq transient--exitp t)
+    (transient--pre-exit)
+    (transient--post-command)))
+
+;;; Pre-Commands
+
+(defun transient--do-stay ()
+  "Call the command without exporting variables and stay transient."
+  transient--stay)
+
+(defun transient--do-noop ()
+  "Call `transient-noop' and stay transient."
+  (setq this-command 'transient-noop)
+  transient--stay)
+
+(defun transient--do-warn ()
+  "Call `transient-undefined' and stay transient."
+  (setq this-command 'transient-undefined)
+  transient--stay)
+
+(defun transient--do-warn-inapt ()
+  "Call `transient-inapt' and stay transient."
+  (setq this-command 'transient-inapt)
+  transient--stay)
+
+(defun transient--do-call ()
+  "Call the command after exporting variables and stay transient."
+  (transient--export)
+  transient--stay)
+
+(defun transient--do-exit ()
+  "Call the command after exporting variables and exit the transient."
+  (transient--export)
+  (transient--stack-zap)
+  transient--exit)
+
+(defun transient--do-replace ()
+  "Call the transient prefix command, replacing the active transient."
+  (transient--export)
+  (transient--stack-push)
+  (setq transient--exitp 'replace)
+  transient--exit)
+
+(defun transient--do-suspend ()
+  "Suspend the active transient, saving the transient stack."
+  (transient--stack-push)
+  (setq transient--exitp 'suspend)
+  transient--exit)
+
+(defun transient--do-quit-one ()
+  "If active, quit help or edit mode, else exit the active transient."
+  (cond (transient--helpp
+         (setq transient--helpp nil)
+         transient--stay)
+        (transient--editp
+         (setq transient--editp nil)
+         (transient-setup)
+         transient--stay)
+        (t transient--exit)))
+
+(defun transient--do-quit-all ()
+  "Exit all transients without saving the transient stack."
+  (transient--stack-zap)
+  transient--exit)
+
+(defun transient--do-move ()
+  "Call the command if `transient-enable-popup-navigation' is non-nil.
+In that case behave like `transient--do-stay', otherwise similar
+to `transient--do-warn'."
+  (unless transient-enable-popup-navigation
+    (setq this-command 'transient-popup-navigation-help))
+  transient--stay)
+
+(put 'transient--do-stay       'transient-color 'transient-blue)
+(put 'transient--do-noop       'transient-color 'transient-blue)
+(put 'transient--do-warn       'transient-color 'transient-blue)
+(put 'transient--do-warn-inapt 'transient-color 'transient-blue)
+(put 'transient--do-call       'transient-color 'transient-blue)
+(put 'transient--do-exit       'transient-color 'transient-red)
+(put 'transient--do-replace    'transient-color 'transient-red)
+(put 'transient--do-suspend    'transient-color 'transient-red)
+(put 'transient--do-quit-one   'transient-color 'transient-red)
+(put 'transient--do-quit-all   'transient-color 'transient-red)
+(put 'transient--do-move       'transient-color 'transient-blue)
+
+;;; Commands
+
+(defun transient-noop ()
+  "Do nothing at all."
+  (interactive))
+
+(defun transient-undefined ()
+  "Warn the user that the pressed key is not bound to any suffix."
+  (interactive)
+  (transient--invalid "Unbound suffix"))
+
+(defun transient-inapt ()
+  "Warn the user that the invoked command is inapt."
+  (interactive)
+  (transient--invalid "Inapt command"))
+
+(defun transient--invalid (msg)
+  (ding)
+  (message "%s: `%s' (Use `%s' to abort, `%s' for help) [%s]"
+           msg
+           (propertize (key-description (this-single-command-keys))
+                       'face 'font-lock-warning-face)
+           (propertize "C-g" 'face 'transient-key)
+           (propertize "?"   'face 'transient-key)
+           (propertize (symbol-name (transient--suffix-symbol
+                                     this-original-command))
+                       'face 'font-lock-warning-face)))
+
+(defun transient-toggle-common ()
+  "Toggle whether common commands are always shown."
+  (interactive)
+  (setq transient-show-common-commands (not transient-show-common-commands)))
+
+(defun transient-suspend ()
+  "Suspend the current transient.
+It can later be resumed using `transient-resume' while no other
+transient is active."
+  (interactive))
+
+(defun transient-quit-all ()
+  "Exit all transients without saving the transient stack."
+  (interactive))
+
+(defun transient-quit-one ()
+  "Exit the current transients, possibly returning to the previous."
+  (interactive))
+
+(defun transient-quit-seq ()
+  "Abort the current incomplete key sequence."
+  (interactive))
+
+(defun transient-update ()
+  "Redraw the transient's state in the popup buffer."
+  (interactive))
+
+(defun transient-show ()
+  "Show the transient's state in the popup buffer."
+  (interactive)
+  (setq transient--showp t))
+
+(defvar-local transient--restore-winconf nil)
+
+(defvar transient-resume-mode)
+
+(defun transient-help ()
+  "Show help for the active transient or one of its suffixes."
+  (interactive)
+  (if (called-interactively-p 'any)
+      (setq transient--helpp t)
+    (with-demoted-errors "transient-help: %S"
+      (when (lookup-key transient--transient-map
+                        (this-single-command-raw-keys))
+        (setq transient--helpp nil)
+        (let ((winconf (current-window-configuration)))
+          (transient-show-help
+           (if (eq this-original-command 'transient-help)
+               transient--prefix
+             (or (transient-suffix-object)
+                 this-original-command)))
+          (setq transient--restore-winconf winconf))
+        (fit-window-to-buffer nil (frame-height) (window-height))
+        (transient-resume-mode)
+        (message "Type \"q\" to resume transient command.")
+        t))))
+
+(defun transient-set-level (&optional command level)
+  "Set the level of the transient or one of its suffix commands."
+  (interactive
+   (let ((command this-original-command)
+         (prefix (oref transient--prefix command)))
+     (and (or (not (eq command 'transient-set-level))
+              (and transient--editp
+                   (setq command prefix)))
+          (list command
+                (let ((keys (this-single-command-raw-keys)))
+                  (and (lookup-key transient--transient-map keys)
+                       (string-to-number
+                        (let ((transient--active-infix
+                               (transient-suffix-object command)))
+                          (transient--show)
+                          (transient--read-number-N
+                           (format "Set level for `%s': "
+                                   (transient--suffix-symbol command))
+                           nil nil (not (eq command prefix)))))))))))
+  (cond
+   ((not command)
+    (setq transient--editp t)
+    (transient-setup))
+   (level
+    (let* ((prefix (oref transient--prefix command))
+           (alist (alist-get prefix transient-levels))
+           (sym (transient--suffix-symbol command)))
+      (if (eq command prefix)
+          (progn (oset transient--prefix level level)
+                 (setq sym t))
+        (oset (transient-suffix-object command) level level))
+      (setf (alist-get sym alist) level)
+      (setf (alist-get prefix transient-levels) alist))
+    (transient-save-levels))
+   (t
+    (transient-undefined))))
+
+(defun transient-set ()
+  "Save the value of the active transient for this Emacs session."
+  (interactive)
+  (transient-set-value (or transient--prefix transient-current-prefix)))
+
+(defun transient-save ()
+  "Save the value of the active transient persistenly across Emacs sessions."
+  (interactive)
+  (transient-save-value (or transient--prefix transient-current-prefix)))
+
+(defun transient-history-next ()
+  "Switch to the next value used for the active transient."
+  (interactive)
+  (let* ((obj transient--prefix)
+         (pos (1- (oref obj history-pos)))
+         (hst (oref obj history)))
+    (if (< pos 0)
+        (user-error "End of history")
+      (oset obj history-pos pos)
+      (oset obj value (nth pos hst))
+      (mapc #'transient-init-value transient--suffixes))))
+
+(defun transient-history-prev ()
+  "Switch to the previous value used for the active transient."
+  (interactive)
+  (let* ((obj transient--prefix)
+         (pos (1+ (oref obj history-pos)))
+         (hst (oref obj history))
+         (len (length hst)))
+    (if (> pos (1- len))
+        (user-error "End of history")
+      (oset obj history-pos pos)
+      (oset obj value (nth pos hst))
+      (mapc #'transient-init-value transient--suffixes))))
+
+(defun transient-scroll-up (&optional arg)
+  "Scroll text of transient popup window upward ARG lines.
+If ARG is nil scroll near full screen.  This is a wrapper
+around `scroll-up-command' (which see)."
+  (interactive "^P")
+  (with-selected-window transient--window
+    (scroll-up-command arg)))
+
+(defun transient-scroll-down (&optional arg)
+  "Scroll text of transient popup window down ARG lines.
+If ARG is nil scroll near full screen.  This is a wrapper
+around `scroll-down-command' (which see)."
+  (interactive "^P")
+  (with-selected-window transient--window
+    (scroll-down-command arg)))
+
+(defun transient-resume ()
+  "Resume a previously suspended stack of transients."
+  (interactive)
+  (cond (transient--stack
+         (let ((winconf transient--restore-winconf))
+           (kill-local-variable 'transient--restore-winconf)
+           (when transient-resume-mode
+             (transient-resume-mode -1)
+             (quit-window))
+           (when winconf
+             (set-window-configuration winconf)))
+         (transient--stack-pop))
+        (transient-resume-mode
+         (kill-local-variable 'transient--restore-winconf)
+         (transient-resume-mode -1)
+         (quit-window))
+        (t
+         (message "No suspended transient command"))))
+
+;;; Value
+;;;; Init
+
+(cl-defgeneric transient-init-scope (obj)
+  "Set the scope of the suffix object OBJ.
+
+The scope is actually a property of the transient prefix, not of
+individual suffixes.  However it is possible to invoke a suffix
+command directly instead of from a transient.  In that case, if
+the suffix expects a scope, then it has to determine that itself
+and store it in its `scope' slot.
+
+This function is called for all suffix commands, but unless a
+concrete method is implemented this falls through to the default
+implementation, which is a noop.")
+
+(cl-defmethod transient-init-scope ((_   transient-suffix))
+  "Noop." nil)
+
+(cl-defgeneric transient-init-value (_)
+  "Set the initial value of the object OBJ.
+
+This function is called for all prefix and suffix commands.
+
+For suffix commands (including infix argument commands) the
+default implementation is a noop.  Classes derived from the
+abstract `transient-infix' class must implement this function.
+Non-infix suffix commands usually don't have a value."
+  nil)
+
+(cl-defmethod transient-init-value :around ((obj transient-prefix))
+  "If bound, then call OBJ's `init-value' function.
+Otherwise call the primary method according to objects class."
+  (if (slot-boundp obj 'init-value)
+      (funcall (oref obj init-value) obj)
+    (cl-call-next-method obj)))
+
+(cl-defmethod transient-init-value :around ((obj transient-infix))
+  "If bound, then call OBJ's `init-value' function.
+Otherwise call the primary method according to objects class."
+  (if (slot-boundp obj 'init-value)
+      (funcall (oref obj init-value) obj)
+    (cl-call-next-method obj)))
+
+(cl-defmethod transient-init-value ((obj transient-prefix))
+  (if (slot-boundp obj 'value)
+      (oref obj value)
+    (oset obj value
+          (if-let ((saved (assq (oref obj command) transient-values)))
+              (cdr saved)
+            (if-let ((default (and (slot-boundp obj 'default-value)
+                                   (oref obj default-value))))
+                (if (functionp default)
+                    (funcall default)
+                  default)
+              nil)))))
+
+(cl-defmethod transient-init-value ((obj transient-switch))
+  (oset obj value
+        (car (member (oref obj argument)
+                     (oref transient--prefix value)))))
+
+(cl-defmethod transient-init-value ((obj transient-option))
+  (oset obj value
+        (transient--value-match (format "\\`%s\\(.*\\)" (oref obj argument)))))
+
+(cl-defmethod transient-init-value ((obj transient-switches))
+  (oset obj value
+        (transient--value-match (oref obj argument-regexp))))
+
+(defun transient--value-match (re)
+  (when-let ((match (cl-find-if (lambda (v)
+                                  (and (stringp v)
+                                       (string-match re v)))
+                                (oref transient--prefix value))))
+    (match-string 1 match)))
+
+(cl-defmethod transient-init-value ((obj transient-files))
+  (oset obj value
+        (cdr (assoc "--" (oref transient--prefix value)))))
+
+;;;; Read
+
+(cl-defgeneric transient-infix-read (obj)
+  "Determine the new value of the infix object OBJ.
+
+This function merely determines the value; `transient-infix-set'
+is used to actually store the new value in the object.
+
+For most infix classes this is done by reading a value from the
+user using the reader specified by the `reader' slot (using the
+`transient-infix' method described below).
+
+For some infix classes the value is changed without reading
+anything in the minibuffer, i.e. the mere act of invoking the
+infix command determines what the new value should be, based
+on the previous value.")
+
+(cl-defmethod transient-infix-read :around ((obj transient-infix))
+  "Highlight the infix in the popup buffer.
+
+Also arrange for the transient to be exited in case of an error
+because otherwise Emacs would get stuck in an inconsistent state,
+which might make it necessary to kill it from the outside."
+  (let ((transient--active-infix obj))
+    (transient--show))
+  (transient--with-emergency-exit
+    (cl-call-next-method obj)))
+
+(cl-defmethod transient-infix-read ((obj transient-infix))
+  "Read a value while taking care of history.
+
+This method is suitable for a wide variety of infix commands,
+including but not limited to inline arguments and variables.
+
+If you do not use this method for your own infix class, then
+you should likely replicate a lot of the behavior of this
+method.  If you fail to do so, then users might not appreciate
+the lack of history, for example.
+
+Only for very simple classes that toggle or cycle through a very
+limited number of possible values should you replace this with a
+simple method that does not handle history.  (E.g. for a command
+line switch the only possible values are \"use it\" and \"don't use
+it\", in which case it is pointless to preserve history.)"
+  (with-slots (value multi-value always-read allow-empty choices) obj
+    (if (and value
+             (not multi-value)
+             (not always-read)
+             transient--prefix)
+        (oset obj value nil)
+      (let* ((overriding-terminal-local-map nil)
+             (reader (oref obj reader))
+             (prompt (transient-prompt obj))
+             (value (if multi-value (mapconcat #'identity value ",") value))
+             (history-key (or (oref obj history-key)
+                              (oref obj command)))
+             (transient--history (alist-get history-key transient-history))
+             (transient--history (if (or (null value)
+                                         (eq value (car transient--history)))
+                                     transient--history
+                                   (cons value transient--history)))
+             (initial-input (and transient-read-with-initial-input
+                                 (car transient--history)))
+             (history (if initial-input
+                          (cons 'transient--history 1)
+                        'transient--history))
+             (value
+              (cond
+               (reader (funcall reader prompt initial-input history))
+               (multi-value
+                (completing-read-multiple prompt choices nil nil
+                                          initial-input history))
+               (choices
+                (completing-read prompt choices nil t initial-input history))
+               (t (read-string prompt initial-input history)))))
+        (cond ((and (equal value "") (not allow-empty))
+               (setq value nil))
+              ((and (equal value "\"\"") allow-empty)
+               (setq value "")))
+        (when value
+          (when (and (bound-and-true-p ivy-mode)
+                     (stringp (car transient--history)))
+            (set-text-properties 0 (length (car transient--history)) nil
+                                 (car transient--history)))
+          (setf (alist-get history-key transient-history)
+                (delete-dups transient--history)))
+        value))))
+
+(cl-defmethod transient-infix-read ((obj transient-switch))
+  "Toggle the switch on or off."
+  (if (oref obj value) nil (oref obj argument)))
+
+(cl-defmethod transient-infix-read ((obj transient-switches))
+  "Cycle through the mutually exclusive switches.
+The last value is \"don't use any of these switches\"."
+  (let ((choices (mapcar (apply-partially #'format (oref obj argument-format))
+                         (oref obj choices))))
+    (if-let ((value (oref obj value)))
+        (cadr (member value choices))
+      (car choices))))
+
+(cl-defmethod transient-infix-read ((command symbol))
+  "Elsewhere use the reader of the infix command COMMAND.
+Use this if you want to share an infix's history with a regular
+stand-alone command."
+  (cl-letf (((symbol-function #'transient--show) #'ignore))
+    (transient-infix-read (get command 'transient--suffix))))
+
+;;;; Readers
+
+(defun transient-read-file (prompt _initial-input _history)
+  "Read a file."
+  (file-local-name (expand-file-name (read-file-name prompt))))
+
+(defun transient-read-existing-file (prompt _initial-input _history)
+  "Read an existing file."
+  (file-local-name (expand-file-name (read-file-name prompt nil nil t))))
+
+(defun transient-read-directory (prompt _initial-input _history)
+  "Read a directory."
+  (file-local-name (expand-file-name (read-directory-name prompt))))
+
+(defun transient-read-existing-directory (prompt _initial-input _history)
+  "Read an existing directory."
+  (file-local-name (expand-file-name (read-directory-name prompt nil nil t))))
+
+(defun transient-read-number-N0 (prompt initial-input history)
+  "Read a natural number (including zero) and return it as a string."
+  (transient--read-number-N prompt initial-input history t))
+
+(defun transient-read-number-N+ (prompt initial-input history)
+  "Read a natural number (excluding zero) and return it as a string."
+  (transient--read-number-N prompt initial-input history nil))
+
+(defun transient--read-number-N (prompt initial-input history include-zero)
+  (save-match-data
+    (cl-block nil
+      (while t
+        (let ((str (read-from-minibuffer prompt initial-input nil nil 
history)))
+          (cond ((string-equal str "")
+                 (cl-return nil))
+                ((string-match-p (if include-zero
+                                     "\\`\\(0\\|[1-9][0-9]*\\)\\'"
+                                   "\\`[1-9][0-9]*\\'")
+                                 str)
+                 (cl-return str))))
+        (message "Please enter a natural number (%s zero)."
+                 (if include-zero "including" "excluding"))
+        (sit-for 1)))))
+
+(defun transient-read-date (prompt default-time _history)
+  "Read a date using `org-read-date' (which see)."
+  (require 'org)
+  (when (fboundp 'org-read-date)
+    (org-read-date 'with-time nil nil prompt default-time)))
+
+;;;; Prompt
+
+(cl-defgeneric transient-prompt (obj)
+  "Return the prompt to be used to read infix object OBJ's value.")
+
+(cl-defmethod transient-prompt ((obj transient-infix))
+  "Return the prompt to be used to read infix object OBJ's value.
+
+This implementation should be suitable for almost all infix
+commands.
+
+If the value of OBJ's `prompt' slot is non-nil, then it must be
+a string or a function.  If it is a string, then use that.  If
+it is a function, then call that with OBJ as the only argument.
+That function must return a string, which is then used as the
+prompt.
+
+Otherwise, if the value of either the `argument' or `variable'
+slot of OBJ is a string, then base the prompt on that (preferring
+the former), appending either \"=\" (if it appears to be a
+command-line option) or \": \".
+
+Finally fall through to using \"(BUG: no prompt): \" as the
+prompt."
+  (if-let ((prompt (oref obj prompt)))
+      (let ((prompt (if (functionp prompt)
+                        (funcall prompt obj)
+                      prompt)))
+        (if (stringp prompt)
+            prompt
+          "(BUG: no prompt): "))
+    (or (when-let ((arg (and (slot-boundp obj 'argument) (oref obj argument))))
+          (if (and (stringp arg) (string-suffix-p "=" arg))
+              arg
+            (concat arg ": ")))
+        (when-let ((var (and (slot-boundp obj 'variable) (oref obj variable))))
+          (and (stringp var)
+               (concat var ": ")))
+        "(BUG: no prompt): ")))
+
+;;;; Set
+
+(defvar transient--unset-incompatible t)
+
+(cl-defgeneric transient-infix-set (obj value)
+  "Set the value of infix object OBJ to value.")
+
+(cl-defmethod transient-infix-set ((obj transient-infix) value)
+  "Set the value of infix object OBJ to value."
+  (oset obj value value))
+
+(cl-defmethod transient-infix-set :around ((obj transient-argument) value)
+  "Unset incompatible infix arguments."
+  (let ((arg (if (slot-boundp obj 'argument)
+                 (oref obj argument)
+               (oref obj argument-regexp))))
+    (if-let ((sic (and value arg transient--unset-incompatible))
+             (spec (oref transient--prefix incompatible))
+             (incomp (remove arg (cl-find-if (lambda (elt) (member arg elt)) 
spec))))
+        (progn
+          (cl-call-next-method obj value)
+          (dolist (arg incomp)
+            (when-let ((obj (cl-find-if (lambda (obj)
+                                          (and (slot-boundp obj 'argument)
+                                               (equal (oref obj argument) 
arg)))
+                                        transient--suffixes)))
+              (let ((transient--unset-incompatible nil))
+                (transient-infix-set obj nil)))))
+      (cl-call-next-method obj value))))
+
+(cl-defmethod transient-set-value ((obj transient-prefix))
+  (oset (oref obj prototype) value (transient-get-value))
+  (transient--history-push obj))
+
+;;;; Save
+
+(cl-defmethod transient-save-value ((obj transient-prefix))
+  (let ((value (transient-get-value)))
+    (oset (oref obj prototype) value value)
+    (setf (alist-get (oref obj command) transient-values) value)
+    (transient-save-values))
+  (transient--history-push obj))
+
+;;;; Get
+
+(defun transient-args (prefix)
+  "Return the value of the transient prefix command PREFIX.
+If the current command was invoked from the transient prefix
+command PREFIX, then return the active infix arguments.  If
+the current command was not invoked from PREFIX, then return
+the set, saved or default value for PREFIX."
+  (delq nil (mapcar 'transient-infix-value (transient-suffixes prefix))))
+
+(defun transient-suffixes (prefix)
+  "Return the suffix objects of the transient prefix command PREFIX."
+  (if (eq transient-current-command prefix)
+      transient-current-suffixes
+    (let ((transient--prefix (transient--init-prefix prefix)))
+      (transient--flatten-suffixes
+       (transient--init-suffixes prefix)))))
+
+(defun transient-get-value ()
+  (delq nil (mapcar (lambda (obj)
+                      (and (or (not (slot-exists-p obj 'unsavable))
+                               (not (oref obj unsavable)))
+                           (transient-infix-value obj)))
+                    transient-current-suffixes)))
+
+(cl-defgeneric transient-infix-value (obj)
+  "Return the value of the suffix object OBJ.
+
+This function is called by `transient-args' (which see), meaning
+this function is how the value of a transient is determined so
+that the invoked suffix command can use it.
+
+Currently most values are strings, but that is not set in stone.
+Nil is not a value, it means \"no value\".
+
+Usually only infixes have a value, but see the method for
+`transient-suffix'.")
+
+(cl-defmethod transient-infix-value ((_   transient-suffix))
+  "Return nil, which means \"no value\".
+
+Infix arguments contribute the the transient's value while suffix
+commands consume it.  This function is called for suffixes anyway
+because a command that both contributes to the transient's value
+and also consumes it is not completely unconceivable.
+
+If you define such a command, then you must define a derived
+class and implement this function because this default method
+does nothing." nil)
+
+(cl-defmethod transient-infix-value ((obj transient-infix))
+  "Return the value of OBJ's `value' slot."
+  (oref obj value))
+
+(cl-defmethod transient-infix-value ((obj transient-option))
+  "Return (concat ARGUMENT VALUE) or nil.
+
+ARGUMENT and VALUE are the values of the respective slots of OBJ.
+If VALUE is nil, then return nil.  VALUE may be the empty string,
+which is not the same as nil."
+  (when-let ((value (oref obj value)))
+    (concat (oref obj argument) value)))
+
+(cl-defmethod transient-infix-value ((_   transient-variable))
+  "Return nil, which means \"no value\".
+
+Setting the value of a variable is done by, well, setting the
+value of the variable.  I.e. this is a side-effect and does not
+contribute to the value of the transient."
+  nil)
+
+(cl-defmethod transient-infix-value ((obj transient-files))
+  "Return (cons ARGUMENT VALUE) or nil.
+
+ARGUMENT and VALUE are the values of the respective slots of OBJ.
+If VALUE is nil, then return nil.  VALUE may be the empty string,
+which is not the same as nil."
+  (when-let ((value (oref obj value)))
+    (cons (oref obj argument) value)))
+
+;;;; Utilities
+
+(defun transient-arg-value (arg args)
+  "Return the value of ARG as it appears in ARGS.
+
+For a switch return a boolean.  For an option return the value as
+a string, using the empty string for the empty value, or nil if
+the option does not appear in ARGS."
+  (if (string-match-p "=\\'" arg)
+      (save-match-data
+        (when-let ((match (let ((re (format "\\`%s\\(?:=\\(.+\\)\\)?\\'"
+                                            (substring arg 0 -1))))
+                            (cl-find-if (lambda (a)
+                                          (and (stringp a)
+                                               (string-match re a)))
+                                        args))))
+          (or (match-string 1 match) "")))
+    (and (member arg args) t)))
+
+;;; History
+
+(cl-defgeneric transient--history-key (obj)
+  "Return OBJ's history key.
+If the value of the `history-key' slot is non-nil, then return
+that.  Otherwise return the value of the `command' slot."
+  (or (oref obj history-key)
+      (oref obj command)))
+
+(cl-defgeneric transient--history-push (obj)
+  "Push the current value of OBJ to its entry in `transient-history'."
+  (let ((key (transient--history-key obj)))
+    (setf (alist-get key transient-history)
+          (let ((args (transient-get-value)))
+            (cons args (delete args (alist-get key transient-history)))))))
+
+(cl-defgeneric transient--history-init (obj)
+  "Initialize OBJ's `history' slot.
+This is the transient-wide history; many individual infixes also
+have a history of their own.")
+
+(cl-defmethod transient--history-init ((obj transient-prefix))
+  "Initialize OBJ's `history' slot from the variable `transient-history'."
+  (let ((val (oref obj value)))
+    (oset obj history
+          (cons val (delete val (alist-get (transient--history-key obj)
+                                           transient-history))))))
+
+;;; Draw
+
+(defun transient--show-brief ()
+  (let ((message-log-max nil))
+    (if (and transient-show-popup (<= transient-show-popup 0))
+        (message "%s-" (key-description (this-command-keys)))
+      (message
+       "%s- [%s] %s"
+       (key-description (this-command-keys))
+       (oref transient--prefix command)
+       (mapconcat
+        #'identity
+        (sort
+         (cl-mapcan
+          (lambda (suffix)
+            (let ((key (kbd (oref suffix key))))
+              ;; Don't list any common commands.
+              (and (not (memq (oref suffix command)
+                              `(,(lookup-key transient-map key)
+                                ,(lookup-key transient-sticky-map key)
+                                ;; From transient-common-commands:
+                                transient-set
+                                transient-save
+                                transient-history-prev
+                                transient-history-next
+                                transient-quit-one
+                                transient-toggle-common
+                                transient-set-level)))
+                   (list (propertize (oref suffix key) 'face 
'transient-key)))))
+          transient--suffixes)
+         #'string<)
+        (propertize "|" 'face 'transient-unreachable-key))))))
+
+(defun transient--show ()
+  (transient--timer-cancel)
+  (setq transient--showp t)
+  (let ((buf (get-buffer-create transient--buffer-name))
+        (focus nil))
+    (unless (window-live-p transient--window)
+      (setq transient--window
+            (display-buffer buf transient-display-buffer-action)))
+    (with-selected-window transient--window
+      (when transient-enable-popup-navigation
+        (setq focus (button-get (point) 'command)))
+      (erase-buffer)
+      (set-window-hscroll transient--window 0)
+      (set-window-dedicated-p transient--window t)
+      (set-window-parameter transient--window 'no-other-window t)
+      (setq window-size-fixed t)
+      (when (bound-and-true-p tab-line-format)
+        (setq tab-line-format nil))
+      (setq mode-line-format (if (eq transient-mode-line-format 'line)
+                                 nil
+                               transient-mode-line-format))
+      (setq mode-line-buffer-identification
+            (symbol-name (oref transient--prefix command)))
+      (if transient-enable-popup-navigation
+          (setq-local cursor-in-non-selected-windows 'box)
+        (setq cursor-type nil))
+      (setq display-line-numbers nil)
+      (setq show-trailing-whitespace nil)
+      (transient--insert-groups)
+      (when (or transient--helpp transient--editp)
+        (transient--insert-help))
+      (when (and (eq transient-mode-line-format 'line)
+                 window-system)
+        (let ((face
+               (if-let ((f (and (transient--semantic-coloring-p)
+                                (transient--prefix-color transient--prefix))))
+                   `(,@(and (>= emacs-major-version 27) '(:extend t))
+                     :background ,(face-foreground f))
+                 'transient-separator)))
+          (insert (propertize "__" 'face face 'display '(space :height (1))))
+          (insert (propertize "\n" 'face face 'line-height t))))
+      (let ((window-resize-pixelwise t)
+            (window-size-fixed nil))
+        (fit-window-to-buffer nil nil 1))
+      (goto-char (point-min))
+      (when transient-force-fixed-pitch
+        (transient--force-fixed-pitch))
+      (when transient-enable-popup-navigation
+        (transient--goto-button focus)))))
+
+(defun transient--insert-groups ()
+  (let ((groups (cl-mapcan (lambda (group)
+                             (let ((hide (oref group hide)))
+                               (and (not (and (functionp hide)
+                                              (funcall   hide)))
+                                    (list group))))
+                           transient--layout))
+        group)
+    (while (setq group (pop groups))
+      (transient--insert-group group)
+      (when groups
+        (insert ?\n)))))
+
+(cl-defgeneric transient--insert-group (group)
+  "Format GROUP and its elements and insert the result.")
+
+(cl-defmethod transient--insert-group :before ((group transient-group))
+  "Insert GROUP's description, if any."
+  (when-let ((desc (transient-format-description group)))
+    (insert desc ?\n)))
+
+(cl-defmethod transient--insert-group ((group transient-row))
+  (transient--maybe-pad-keys group)
+  (dolist (suffix (oref group suffixes))
+    (insert (transient-format suffix))
+    (insert "   "))
+  (insert ?\n))
+
+(cl-defmethod transient--insert-group ((group transient-column))
+  (transient--maybe-pad-keys group)
+  (dolist (suffix (oref group suffixes))
+    (let ((str (transient-format suffix)))
+      (insert str)
+      (unless (string-match-p ".\n\\'" str)
+        (insert ?\n)))))
+
+(cl-defmethod transient--insert-group ((group transient-columns))
+  (let* ((columns
+          (mapcar
+           (lambda (column)
+             (transient--maybe-pad-keys column group)
+             (let ((rows (mapcar 'transient-format (oref column suffixes))))
+               (when-let ((desc (transient-format-description column)))
+                 (push desc rows))
+               rows))
+           (oref group suffixes)))
+         (rs (apply #'max (mapcar #'length columns)))
+         (cs (length columns))
+         (cw (mapcar (lambda (col) (apply #'max (mapcar #'length col)))
+                     columns))
+         (cc (transient--seq-reductions-from (apply-partially #'+ 3) cw 0)))
+    (dotimes (r rs)
+      (dotimes (c cs)
+        (insert (make-string (- (nth c cc) (current-column)) ?\s))
+        (when-let ((cell (nth r (nth c columns))))
+          (insert cell))
+        (when (= c (1- cs))
+          (insert ?\n))))))
+
+(cl-defmethod transient--insert-group ((group transient-subgroups))
+  (let* ((subgroups (oref group suffixes))
+         (n (length subgroups)))
+    (dotimes (s n)
+      (let ((subgroup (nth s subgroups)))
+        (transient--maybe-pad-keys subgroup group)
+        (transient--insert-group subgroup)
+        (when (< s (1- n))
+          (insert ?\n))))))
+
+(cl-defgeneric transient-format (obj)
+  "Format and return OBJ for display.
+
+When this function is called, then the current buffer is some
+temporary buffer.  If you need the buffer from which the prefix
+command was invoked to be current, then do so by temporarily
+making `transient--original-buffer' current.")
+
+(cl-defmethod transient-format ((arg string))
+  "Return the string ARG after applying the `transient-heading' face."
+  (propertize arg 'face 'transient-heading))
+
+(cl-defmethod transient-format ((_   null))
+  "Return a string containing just the newline character."
+  "\n")
+
+(cl-defmethod transient-format ((arg integer))
+  "Return a string containing just the ARG character."
+  (char-to-string arg))
+
+(cl-defmethod transient-format :around ((obj transient-infix))
+  "When reading user input for this infix, then highlight it."
+  (let ((str (cl-call-next-method obj)))
+    (when (eq obj transient--active-infix)
+      (setq str (concat str "\n"))
+      (add-face-text-property
+       (if (eq this-command 'transient-set-level) 3 0)
+       (length str)
+       'transient-active-infix nil str))
+    str))
+
+(cl-defmethod transient-format :around ((obj transient-suffix))
+  "When edit-mode is enabled, then prepend the level information.
+Optional support for popup buttons is also implemented here."
+  (let ((str (concat
+              (and transient--editp
+                   (let ((level (oref obj level)))
+                     (propertize (format " %s " level)
+                                 'face (if (transient--use-level-p level t)
+                                           'transient-enabled-suffix
+                                         'transient-disabled-suffix))))
+              (cl-call-next-method obj))))
+    (when (oref obj inapt)
+      (set-text-properties 0 (length str)
+                           (list 'face 'transient-inapt-suffix)
+                           str))
+    (if transient-enable-popup-navigation
+        (make-text-button str nil
+                          'type 'transient-button
+                          'command (transient--suffix-command obj))
+      str)))
+
+(cl-defmethod transient-format ((obj transient-infix))
+  "Return a string generated using OBJ's `format'.
+%k is formatted using `transient-format-key'.
+%d is formatted using `transient-format-description'.
+%v is formatted using `transient-format-value'."
+  (format-spec (oref obj format)
+               `((?k . ,(transient-format-key obj))
+                 (?d . ,(transient-format-description obj))
+                 (?v . ,(transient-format-value obj)))))
+
+(cl-defmethod transient-format ((obj transient-suffix))
+  "Return a string generated using OBJ's `format'.
+%k is formatted using `transient-format-key'.
+%d is formatted using `transient-format-description'."
+  (format-spec (oref obj format)
+               `((?k . ,(transient-format-key obj))
+                 (?d . ,(transient-format-description obj)))))
+
+(cl-defgeneric transient-format-key (obj)
+  "Format OBJ's `key' for display and return the result.")
+
+(cl-defmethod transient-format-key ((obj transient-suffix))
+  "Format OBJ's `key' for display and return the result."
+  (let ((key (oref obj key))
+        (cmd (oref obj command)))
+    (if transient--redisplay-key
+        (let ((len (length transient--redisplay-key))
+              (seq (cl-coerce (edmacro-parse-keys key t) 'list)))
+          (cond
+           ((equal (seq-take seq len) transient--redisplay-key)
+            (let ((pre (key-description (vconcat (seq-take seq len))))
+                  (suf (key-description (vconcat (seq-drop seq len)))))
+              (setq pre (replace-regexp-in-string "RET" "C-m" pre t))
+              (setq pre (replace-regexp-in-string "TAB" "C-i" pre t))
+              (setq suf (replace-regexp-in-string "RET" "C-m" suf t))
+              (setq suf (replace-regexp-in-string "TAB" "C-i" suf t))
+              ;; We use e.g. "-k" instead of the more correct "- k",
+              ;; because the former is prettier.  If we did that in
+              ;; the definition, then we want to drop the space that
+              ;; is reinserted above.  False-positives are possible
+              ;; for silly bindings like "-C-c C-c".
+              (unless (string-match-p " " key)
+                (setq pre (replace-regexp-in-string " " "" pre))
+                (setq suf (replace-regexp-in-string " " "" suf)))
+              (concat (propertize pre 'face 'default)
+                      (and (string-prefix-p (concat pre " ") key) " ")
+                      (transient--colorize-key suf cmd)
+                      (save-excursion
+                        (when (string-match " +\\'" key)
+                          (match-string 0 key))))))
+           ((transient--lookup-key transient-sticky-map (kbd key))
+            (transient--colorize-key key cmd))
+           (t
+            (propertize key 'face 'transient-unreachable-key))))
+      (transient--colorize-key key cmd))))
+
+(defun transient--colorize-key (key command)
+  (propertize key 'face
+              (or (and (transient--semantic-coloring-p)
+                       (transient--suffix-color command))
+                  'transient-key)))
+
+(cl-defmethod transient-format-key :around ((obj transient-argument))
+  (let ((key (cl-call-next-method obj)))
+    (cond ((not transient-highlight-mismatched-keys))
+          ((not (slot-boundp obj 'shortarg))
+           (add-face-text-property
+            0 (length key) 'transient-nonstandard-key nil key))
+          ((not (string-equal key (oref obj shortarg)))
+           (add-face-text-property
+            0 (length key) 'transient-mismatched-key nil key)))
+    key))
+
+(cl-defgeneric transient-format-description (obj)
+  "Format OBJ's `description' for display and return the result.")
+
+(cl-defmethod transient-format-description ((obj transient-child))
+  "The `description' slot may be a function, in which case that is
+called inside the correct buffer (see `transient-insert-group')
+and its value is returned to the caller."
+  (when-let ((desc (oref obj description)))
+    (if (functionp desc)
+        (with-current-buffer transient--original-buffer
+          (funcall desc))
+      desc)))
+
+(cl-defmethod transient-format-description ((obj transient-group))
+  "Format the description by calling the next method.  If the result
+doesn't use the `face' property at all, then apply the face
+`transient-heading' to the complete string."
+  (when-let ((desc (cl-call-next-method obj)))
+    (if (text-property-not-all 0 (length desc) 'face nil desc)
+        desc
+      (propertize desc 'face 'transient-heading))))
+
+(cl-defmethod transient-format-description :around ((obj transient-suffix))
+  "Format the description by calling the next method.  If the result
+is nil, then use \"(BUG: no description)\" as the description.
+If the OBJ's `key' is currently unreachable, then apply the face
+`transient-unreachable' to the complete string."
+  (let ((desc (or (cl-call-next-method obj)
+                  (and (slot-boundp transient--prefix 'suffix-description)
+                       (funcall (oref transient--prefix suffix-description)
+                                obj))
+                  (propertize "(BUG: no description)" 'face 'error))))
+    (if (transient--key-unreachable-p obj)
+        (propertize desc 'face 'transient-unreachable)
+      desc)))
+
+(cl-defgeneric transient-format-value (obj)
+  "Format OBJ's value for display and return the result.")
+
+(cl-defmethod transient-format-value ((obj transient-suffix))
+  (propertize (oref obj argument)
+              'face (if (oref obj value)
+                        'transient-argument
+                      'transient-inactive-argument)))
+
+(cl-defmethod transient-format-value ((obj transient-option))
+  (let ((value (oref obj value)))
+    (propertize (concat (oref obj argument)
+                        (if (listp value)
+                            (mapconcat #'identity value ",")
+                          value))
+                'face (if value
+                          'transient-value
+                        'transient-inactive-value))))
+
+(cl-defmethod transient-format-value ((obj transient-switches))
+  (with-slots (value argument-format choices) obj
+    (format (propertize argument-format
+                        'face (if value
+                                  'transient-value
+                                'transient-inactive-value))
+            (concat
+             (propertize "[" 'face 'transient-inactive-value)
+             (mapconcat
+              (lambda (choice)
+                (propertize choice 'face
+                            (if (equal (format argument-format choice) value)
+                                'transient-value
+                              'transient-inactive-value)))
+              choices
+              (propertize "|" 'face 'transient-inactive-value))
+             (propertize "]" 'face 'transient-inactive-value)))))
+
+(cl-defmethod transient-format-value ((obj transient-files))
+  (let ((argument (oref obj argument)))
+    (if-let ((value (oref obj value)))
+        (propertize (concat argument " "
+                            (mapconcat (lambda (f) (format "%S" f))
+                                       (oref obj value) " "))
+                    'face 'transient-argument)
+      (propertize argument 'face 'transient-inactive-argument))))
+
+(defun transient--key-unreachable-p (obj)
+  (and transient--redisplay-key
+       (let ((key (oref obj key)))
+         (not (or (equal (seq-take (cl-coerce (edmacro-parse-keys key t) 'list)
+                                   (length transient--redisplay-key))
+                         transient--redisplay-key)
+                  (transient--lookup-key transient-sticky-map (kbd key)))))))
+
+(defun transient--lookup-key (keymap key)
+  (let ((val (lookup-key keymap key)))
+    (and val (not (integerp val)) val)))
+
+(defun transient--maybe-pad-keys (group &optional parent)
+  (when-let ((pad (if (slot-boundp group 'pad-keys)
+                      (oref group pad-keys)
+                    (and parent
+                         (slot-boundp parent 'pad-keys)
+                         (oref parent pad-keys)))))
+    (let ((width (apply #'max
+                        (cons (if (integerp pad) pad 0)
+                              (mapcar (lambda (suffix)
+                                        (length (oref suffix key)))
+                                      (oref group suffixes))))))
+      (dolist (suffix (oref group suffixes))
+        (oset suffix key
+              (truncate-string-to-width (oref suffix key) width nil ?\s))))))
+
+(defun transient-command-summary-or-name (obj)
+  "Return the summary or name of the command represented by OBJ.
+
+If the command has a doc-string, then return the first line of
+that, else its name.
+
+Intended to be temporarily used as the `:suffix-description' of
+a prefix command, while porting a regular keymap to a transient."
+  (let ((command (transient--suffix-symbol (oref obj command))))
+    (if-let ((doc (documentation command)))
+        (propertize (car (split-string doc "\n")) 'face 'font-lock-doc-face)
+      (propertize (symbol-name command) 'face 'font-lock-function-name-face))))
+
+;;; Help
+
+(cl-defgeneric transient-show-help (obj)
+  "Show help for OBJ's command.")
+
+(cl-defmethod transient-show-help ((obj transient-prefix))
+  "Show the info manual, manpage or command doc-string.
+Show the first one that is specified."
+  (if-let ((manual (oref obj info-manual)))
+      (info manual)
+    (if-let ((manpage (oref obj man-page)))
+        (transient--show-manpage manpage)
+      (transient--describe-function (oref obj command)))))
+
+(cl-defmethod transient-show-help ((_   transient-suffix))
+  "Show the command doc-string."
+  (if (eq this-original-command 'transient-help)
+      (if-let ((manpage (oref transient--prefix man-page)))
+          (transient--show-manpage manpage)
+        (transient--describe-function (oref transient--prefix command)))
+    (transient--describe-function this-original-command)))
+
+(cl-defmethod transient-show-help ((obj transient-infix))
+  "Show the manpage if defined or the command doc-string.
+If the manpage is specified, then try to jump to the correct
+location."
+  (if-let ((manpage (oref transient--prefix man-page)))
+      (transient--show-manpage manpage (ignore-errors (oref obj argument)))
+    (transient--describe-function this-original-command)))
+
+;; `cl-generic-generalizers' doesn't support `command' et al.
+(cl-defmethod transient-show-help (cmd)
+  "Show the command doc-string."
+  (transient--describe-function cmd))
+
+(defun transient--show-manpage (manpage &optional argument)
+  (require 'man)
+  (let* ((Man-notify-method 'meek)
+         (buf (Man-getpage-in-background manpage))
+         (proc (get-buffer-process buf)))
+    (while (and proc (eq (process-status proc) 'run))
+      (accept-process-output proc))
+    (switch-to-buffer buf)
+    (when argument
+      (transient--goto-argument-description argument))))
+
+(defun transient--describe-function (fn)
+  (describe-function fn)
+  (select-window (get-buffer-window (help-buffer))))
+
+(defun transient--goto-argument-description (arg)
+  (goto-char (point-min))
+  (let ((case-fold-search nil)
+        ;; This matches preceding/proceeding options.  Options
+        ;; such as "-a", "-S[<keyid>]", and "--grep=<pattern>"
+        ;; are matched by this regex without the shy group.
+        ;; The ". " in the shy group is for options such as
+        ;; "-m parent-number", and the "-[^[:space:]]+ " is
+        ;; for options such as "--mainline parent-number"
+        (others "-\\(?:. \\|-[^[:space:]]+ \\)?[^[:space:]]+"))
+    (when (re-search-forward
+           (if (equal arg "--")
+               ;; Special case.
+               "^[\t\s]+\\(--\\(?: \\|$\\)\\|\\[--\\]\\)"
+             ;; Should start with whitespace and may have
+             ;; any number of options before and/or after.
+             (format
+              "^[\t\s]+\\(?:%s, \\)*?\\(?1:%s\\)%s\\(?:, %s\\)*$"
+              others
+              ;; Options don't necessarily end in an "="
+              ;; (e.g., "--gpg-sign[=<keyid>]")
+              (string-remove-suffix "=" arg)
+              ;; Simple options don't end in an "=".  Splitting this
+              ;; into 2 cases should make getting false positives
+              ;; less likely.
+              (if (string-suffix-p "=" arg)
+                  ;; "[^[:space:]]*[^.[:space:]]" matches the option
+                  ;; value, which is usually after the option name
+                  ;; and either '=' or '[='.  The value can't end in
+                  ;; a period, as that means it's being used at the
+                  ;; end of a sentence.  The space is for options
+                  ;; such as '--mainline parent-number'.
+                  "\\(?: \\|\\[?=\\)[^[:space:]]*[^.[:space:]]"
+                ;; Either this doesn't match anything (e.g., "-a"),
+                ;; or the option is followed by a value delimited
+                ;; by a "[", "<", or ":".  A space might appear
+                ;; before this value, as in "-f <file>".  The
+                ;; space alternative is for options such as
+                ;; "-m parent-number".
+                "\\(?:\\(?: \\| ?[\\[<:]\\)[^[:space:]]*[^.[:space:]]\\)?")
+              others))
+           nil t)
+      (goto-char (match-beginning 1)))))
+
+(defun transient--insert-help ()
+  (unless (looking-back "\n\n" 2)
+    (insert "\n"))
+  (when transient--helpp
+    (insert
+     (format (propertize "\
+Type a %s to show help for that suffix command, or %s to show manual.
+Type %s to exit help.\n"
+                         'face 'transient-heading)
+             (propertize "<KEY>" 'face 'transient-key)
+             (propertize "?"     'face 'transient-key)
+             (propertize "C-g"   'face 'transient-key))))
+  (when transient--editp
+    (unless transient--helpp
+      (insert
+       (format (propertize "\
+Type a %s to set level for that suffix command.
+Type %s to set what levels are available for this prefix command.\n"
+                           'face 'transient-heading)
+               (propertize "<KEY>"   'face 'transient-key)
+               (propertize "C-x l" 'face 'transient-key))))
+    (with-slots (level) transient--prefix
+      (insert
+       (format (propertize "
+Suffixes on levels %s are available.
+Suffixes on levels %s and %s are unavailable.\n"
+                           'face 'transient-heading)
+               (propertize (format "1-%s" level)
+                           'face 'transient-enabled-suffix)
+               (propertize " 0 "
+                           'face 'transient-disabled-suffix)
+               (propertize (format ">=%s" (1+ level))
+                           'face 'transient-disabled-suffix))))))
+
+(defvar transient-resume-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [remap Man-quit]    'transient-resume)
+    (define-key map [remap Info-exit]   'transient-resume)
+    (define-key map [remap quit-window] 'transient-resume)
+    map)
+  "Keymap for `transient-resume-mode'.
+
+This keymap remaps every command that would usually just quit the
+documentation buffer to `transient-resume', which additionally
+resumes the suspended transient.")
+
+(define-minor-mode transient-resume-mode
+  "Auxiliary minor-mode used to resume a transient after viewing help.")
+
+;;; Compatibility
+;;;; Popup Navigation
+
+(defun transient-popup-navigation-help ()
+  "Inform the user how to enable popup navigation commands."
+  (interactive)
+  (message "This command is only available if `%s' is non-nil"
+           'transient-enable-popup-navigation))
+
+(define-button-type 'transient-button
+  'face nil
+  'action (lambda (button)
+            (let ((command (button-get button 'command)))
+              ;; Yes, I know that this is wrong(tm).
+              ;; Unfortunately it is also necessary.
+              (setq this-original-command command)
+              (call-interactively command))))
+
+(defvar transient-popup-navigation-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "<down-mouse-1>") 'transient-noop)
+    (define-key map (kbd "<mouse-1>") 'transient-mouse-push-button)
+    (define-key map (kbd "RET")       'transient-push-button)
+    (define-key map (kbd "<up>")      'transient-backward-button)
+    (define-key map (kbd "C-p")       'transient-backward-button)
+    (define-key map (kbd "<down>")    'transient-forward-button)
+    (define-key map (kbd "C-n")       'transient-forward-button)
+    (define-key map (kbd "C-r")       'transient-isearch-backward)
+    (define-key map (kbd "C-s")       'transient-isearch-forward)
+    map))
+
+(defun transient-mouse-push-button (&optional pos)
+  "Invoke the suffix the user clicks on."
+  (interactive (list last-command-event))
+  (push-button pos))
+
+(defun transient-push-button ()
+  "Invoke the selected suffix command."
+  (interactive)
+  (with-selected-window transient--window
+    (push-button)))
+
+(defun transient-backward-button (n)
+  "Move to the previous button in the transient popup buffer.
+See `backward-button' for information about N."
+  (interactive "p")
+  (with-selected-window transient--window
+    (backward-button n t)))
+
+(defun transient-forward-button (n)
+  "Move to the next button in the transient popup buffer.
+See `forward-button' for information about N."
+  (interactive "p")
+  (with-selected-window transient--window
+    (forward-button n t)))
+
+(defun transient--goto-button (command)
+  (if (not command)
+      (forward-button 1)
+    (while (and (ignore-errors (forward-button 1))
+                (not (eq (button-get (button-at (point)) 'command) command))))
+    (unless (eq (button-get (button-at (point)) 'command) command)
+      (goto-char (point-min))
+      (forward-button 1))))
+
+;;;; Popup Isearch
+
+(defvar transient--isearch-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map isearch-mode-map)
+    (define-key map [remap isearch-exit]   'transient-isearch-exit)
+    (define-key map [remap isearch-cancel] 'transient-isearch-cancel)
+    (define-key map [remap isearch-abort]  'transient-isearch-abort)
+    map))
+
+(defun transient-isearch-backward (&optional regexp-p)
+  "Do incremental search backward.
+With a prefix argument, do an incremental regular expression
+search instead."
+  (interactive "P")
+  (transient--isearch-setup)
+  (let ((isearch-mode-map transient--isearch-mode-map))
+    (isearch-mode nil regexp-p)))
+
+(defun transient-isearch-forward (&optional regexp-p)
+  "Do incremental search forward.
+With a prefix argument, do an incremental regular expression
+search instead."
+  (interactive "P")
+  (transient--isearch-setup)
+  (let ((isearch-mode-map transient--isearch-mode-map))
+    (isearch-mode t regexp-p)))
+
+(defun transient-isearch-exit ()
+  "Like `isearch-exit' but adapted for `transient'."
+  (interactive)
+  (isearch-exit)
+  (transient--isearch-exit))
+
+(defun transient-isearch-cancel ()
+  "Like `isearch-cancel' but adapted for `transient'."
+  (interactive)
+  (condition-case nil (isearch-cancel) (quit))
+  (transient--isearch-exit))
+
+(defun transient-isearch-abort ()
+  "Like `isearch-abort' but adapted for `transient'."
+  (interactive)
+  (condition-case nil (isearch-abort) (quit))
+  (transient--isearch-exit))
+
+(defun transient--isearch-setup ()
+  (select-window transient--window)
+  (transient--suspend-override))
+
+(defun transient--isearch-exit ()
+  (select-window transient--original-window)
+  (transient--resume-override))
+
+;;;; Hydra Color Emulation
+
+(defun transient--semantic-coloring-p ()
+  (and transient-semantic-coloring
+       (not transient--helpp)
+       (not transient--editp)))
+
+(defun transient--suffix-color (command)
+  (or (get command 'transient-color)
+      (get (transient--get-predicate-for command) 'transient-color)))
+
+(defun transient--prefix-color (command)
+  (let* ((nonsuf (or (oref command transient-non-suffix)
+                     'transient--do-warn))
+         (nonsuf (if (memq nonsuf '(transient--do-noop transient--do-warn))
+                     'disallow
+                   (get nonsuf 'transient-color)))
+         (suffix (if-let ((pred (oref command transient-suffix)))
+                     (get pred 'transient-color)
+                   (if (eq nonsuf 'transient-red)
+                       'transient-red
+                     'transient-blue))))
+    (pcase (list suffix nonsuf)
+      (`(transient-red  disallow)       'transient-amaranth)
+      (`(transient-blue disallow)       'transient-teal)
+      (`(transient-red  transient-red)  'transient-pink)
+      (`(transient-red  transient-blue) 'transient-red)
+      (`(transient-blue transient-blue) 'transient-blue))))
+
+;;;; Edebug
+
+(defun transient--edebug--recursive-edit (fn arg-mode)
+  (transient--debug 'edebug--recursive-edit)
+  (if (not transient--prefix)
+      (funcall fn arg-mode)
+    (transient--suspend-override t)
+    (funcall fn arg-mode)
+    (transient--resume-override t)))
+
+(advice-add 'edebug--recursive-edit :around 'transient--edebug--recursive-edit)
+
+(defun transient--abort-edebug ()
+  (when (bound-and-true-p edebug-active)
+    (transient--emergency-exit)))
+
+(advice-add 'abort-recursive-edit :before 'transient--abort-edebug)
+(advice-add 'top-level :before 'transient--abort-edebug)
+
+(defun transient--edebug-command-p ()
+  (and (bound-and-true-p edebug-active)
+       (or (memq this-command '(top-level abort-recursive-edit))
+           (string-prefix-p "edebug" (symbol-name this-command)))))
+
+;;;; Miscellaneous
+
+(declare-function which-key-mode "which-key" (&optional arg))
+
+(defun transient--suspend-which-key-mode ()
+  (when (bound-and-true-p which-key-mode)
+    (which-key-mode -1)
+    (add-hook 'transient-exit-hook 'transient--resume-which-key-mode)))
+
+(defun transient--resume-which-key-mode ()
+  (unless transient--prefix
+    (which-key-mode 1)
+    (remove-hook 'transient-exit-hook 'transient--resume-which-key-mode)))
+
+(defun transient-bind-q-to-quit ()
+  "Modify some keymaps to bind \"q\" to the appropriate quit command.
+
+\"C-g\" is the default binding for such commands now, but Transient's
+predecessor Magit-Popup used \"q\" instead.  If you would like to get
+that binding back, then call this function in your init file like so:
+
+  (with-eval-after-load \\='transient
+    (transient-bind-q-to-quit))
+
+Individual transients may already bind \"q\" to something else
+and such a binding would shadow the quit binding.  If that is the
+case then \"Q\" is bound to whatever \"q\" would have been bound
+to by setting `transient-substitute-key-function' to a function
+that does that.  Of course \"Q\" may already be bound to something
+else, so that function binds \"M-q\" to that command instead.
+Of course \"M-q\" may already be bound to something else, but
+we stop there."
+  (define-key transient-base-map   "q" 'transient-quit-one)
+  (define-key transient-sticky-map "q" 'transient-quit-seq)
+  (setq transient-substitute-key-function
+        'transient-rebind-quit-commands))
+
+(defun transient-rebind-quit-commands (obj)
+  "See `transient-bind-q-to-quit'."
+  (let ((key (oref obj key)))
+    (cond ((string-equal key "q") "Q")
+          ((string-equal key "Q") "M-q")
+          (t key))))
+
+(defun transient--force-fixed-pitch ()
+  (require 'face-remap)
+  (face-remap-reset-base 'default)
+  (face-remap-add-relative 'default 'fixed-pitch))
+
+;;;; Missing from Emacs
+
+(defun transient--seq-reductions-from (function sequence initial-value)
+  (let ((acc (list initial-value)))
+    (seq-doseq (elt sequence)
+      (push (funcall function (car acc) elt) acc))
+    (nreverse acc)))
+
+(defun transient-plist-to-alist (plist)
+  (let (alist)
+    (while plist
+      (push (cons (let* ((symbol (pop plist))
+                         (name (symbol-name symbol)))
+                    (if (eq (aref name 0) ?:)
+                        (intern (substring name 1))
+                      symbol))
+                  (pop plist))
+            alist))
+    (nreverse alist)))
+
+;;; Font-Lock
+
+(defconst transient-font-lock-keywords
+  (eval-when-compile
+    `((,(concat "("
+                (regexp-opt (list "transient-define-prefix"
+                                  "transient-define-infix"
+                                  "transient-define-argument"
+                                  "transient-define-suffix")
+                            t)
+                "\\_>[ \t'\(]*"
+                "\\(\\(?:\\sw\\|\\s_\\)+\\)?")
+       (1 'font-lock-keyword-face)
+       (2 'font-lock-function-name-face nil t)))))
+
+(font-lock-add-keywords 'emacs-lisp-mode transient-font-lock-keywords)
+
+;;; Auxiliary Classes
+;;;; `transient-lisp-variable'
+
+(defclass transient-lisp-variable (transient-variable)
+  ((reader :initform transient-lisp-variable--reader)
+   (always-read :initform t)
+   (set-value :initarg :set-value :initform set))
+  "[Experimental] Class used for Lisp variables.")
+
+(cl-defmethod transient-init-value ((obj transient-lisp-variable))
+  (oset obj value (symbol-value (oref obj variable))))
+
+(cl-defmethod transient-infix-set ((obj transient-lisp-variable) value)
+  (funcall (oref obj set-value)
+           (oref obj variable)
+           (oset obj value value)))
+
+(cl-defmethod transient-format-description ((obj transient-lisp-variable))
+  (or (oref obj description)
+      (symbol-name (oref obj variable))))
+
+(cl-defmethod transient-format-value ((obj transient-lisp-variable))
+  (propertize (prin1-to-string (oref obj value))
+              'face 'transient-value))
+
+(cl-defmethod transient-prompt ((obj transient-lisp-variable))
+  (format "Set %s: " (oref obj variable)))
+
+(defun transient-lisp-variable--reader (prompt initial-input _history)
+  (read--expression prompt initial-input))
+
+;;; _
+(provide 'transient)
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
+;;; transient.el ends here
diff --git a/lisp/url/url-mailto.el b/lisp/url/url-mailto.el
index c6901d9..29c2780 100644
--- a/lisp/url/url-mailto.el
+++ b/lisp/url/url-mailto.el
@@ -1,4 +1,4 @@
-;;; url-mail.el --- Mail Uniform Resource Locator retrieval code  -*- 
lexical-binding: t; -*-
+;;; url-mailto.el --- Mail Uniform Resource Locator retrieval code  -*- 
lexical-binding: t; -*-
 
 ;; Copyright (C) 1996-1999, 2004-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index 2b477df..87ca542 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -1,4 +1,4 @@
-;;; vc-dispatcher.el -- generic command-dispatcher facility.  -*- 
lexical-binding: t -*-
+;;; vc-dispatcher.el --- generic command-dispatcher facility.  -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
diff --git a/lisp/vc/vc-filewise.el b/lisp/vc/vc-filewise.el
index e1b042a..254e479 100644
--- a/lisp/vc/vc-filewise.el
+++ b/lisp/vc/vc-filewise.el
@@ -82,3 +82,5 @@ If the file is not registered, or the master name is not 
known, return nil."
        nil))))                         ; Not registered
 
 (provide 'vc-filewise)
+
+;;; vc-filewise.el ends here
diff --git a/lisp/wdired.el b/lisp/wdired.el
index ff42d78..35211bc 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -292,28 +292,31 @@ or \\[wdired-abort-changes] to abort changes")))
       (call-interactively (or (if map (lookup-key map (this-command-keys)))
                               #'self-insert-command)))))
 
+(put 'wdired--self-insert 'delete-selection 'delete-selection-uses-region-p)
+
 (defun wdired--before-change-fn (beg end)
-  (save-excursion
-    ;; Make sure to process entire lines.
-    (goto-char end)
-    (setq end (line-end-position))
-    (goto-char beg)
-    (forward-line 0)
-
-    (while (< (point) end)
-      (unless (wdired--line-preprocessed-p)
+  (save-match-data
+    (save-excursion
+      ;; Make sure to process entire lines.
+      (goto-char end)
+      (setq end (line-end-position))
+      (goto-char beg)
+      (forward-line 0)
+
+      (while (< (point) end)
+        (unless (wdired--line-preprocessed-p)
+          (with-silent-modifications
+            (put-text-property (point) (1+ (point)) 'front-sticky t)
+            (wdired--preprocess-files)
+            (when wdired-allow-to-change-permissions
+              (wdired--preprocess-perms))
+            (when (fboundp 'make-symbolic-link)
+              (wdired--preprocess-symlinks))))
+        (forward-line))
+      (when (eobp)
         (with-silent-modifications
-          (put-text-property (point) (1+ (point)) 'front-sticky t)
-          (wdired--preprocess-files)
-          (when wdired-allow-to-change-permissions
-            (wdired--preprocess-perms))
-          (when (fboundp 'make-symbolic-link)
-            (wdired--preprocess-symlinks))))
-      (forward-line))
-    (when (eobp)
-      (with-silent-modifications
-        ;; Is this good enough? Assumes no extra white lines from dired.
-        (put-text-property (1- (point-max)) (point-max) 'read-only t)))))
+          ;; Is this good enough? Assumes no extra white lines from dired.
+          (put-text-property (1- (point-max)) (point-max) 'read-only t))))))
 
 (defun wdired-isearch-filter-read-only (beg end)
   "Skip matches that have a read-only property."
diff --git a/lisp/window.el b/lisp/window.el
index 071761e..06d3e43 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -7411,8 +7411,8 @@ For instance:
 
 Buffer display can be further customized to a very high degree;
 the rest of this docstring explains some of the many
-possibilities, and also see `(emacs)Window Choice' for more
-information.
+possibilities, and also see Info node `(emacs)Window Choice' for
+more information.
 
 BUFFER-OR-NAME must be a buffer or a string naming a live buffer.
 Return the window chosen for displaying that buffer, or nil if no
diff --git a/src/character.h b/src/character.h
index d19e1e2..75351cd 100644
--- a/src/character.h
+++ b/src/character.h
@@ -42,7 +42,7 @@ INLINE_HEADER_BEGIN
                        F9..FF     11111yyy
 
    In each bit pattern, 'x' and 'y' each represent a single bit of the
-   character code payload, and least one 'y' must be a 1 bit.
+   character code payload, and at least one 'y' must be a 1 bit.
    In the 5-byte sequence, the 22-bit payload cannot exceed 3FFF7F.
 */
 
diff --git a/src/frame.c b/src/frame.c
index a20c536..648cc65 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1386,7 +1386,8 @@ do_switch_frame (Lisp_Object frame, int track, int 
for_deletion, Lisp_Object nor
      especially when deleting the initial frame during startup.  */
   CHECK_FRAME (frame);
   f = XFRAME (frame);
-  if (!FRAME_LIVE_P (f))
+  /* Silently ignore dead and tooltip frames (Bug#47207).  */
+  if (!FRAME_LIVE_P (f) || FRAME_TOOLTIP_P (f))
     return Qnil;
   else if (f == sf)
     return frame;
@@ -1510,7 +1511,16 @@ redisplay will display FRAME.
 This function returns FRAME, or nil if FRAME has been deleted.  */)
   (Lisp_Object frame, Lisp_Object norecord)
 {
-  return do_switch_frame (frame, 1, 0, norecord);
+  struct frame *f;
+
+  CHECK_LIVE_FRAME (frame);
+  f = XFRAME (frame);
+
+  if (FRAME_TOOLTIP_P (f))
+    /* Do not select a tooltip frame (Bug#47207).  */
+    error ("Cannot select a tooltip frame");
+  else
+    return do_switch_frame (frame, 1, 0, norecord);
 }
 
 DEFUN ("handle-switch-frame", Fhandle_switch_frame,
@@ -1525,6 +1535,7 @@ necessarily represent user-visible input focus.  */)
   /* Preserve prefix arg that the command loop just cleared.  */
   kset_prefix_arg (current_kboard, Vcurrent_prefix_arg);
   run_hook (Qmouse_leave_buffer_hook);
+
   return do_switch_frame (event, 0, 0, Qnil);
 }
 
diff --git a/src/keyboard.c b/src/keyboard.c
index 9cb37c3..fe5815b 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2121,7 +2121,7 @@ read_char_help_form_unwind (void)
   Lisp_Object window_config = XCAR (help_form_saved_window_configs);
   help_form_saved_window_configs = XCDR (help_form_saved_window_configs);
   if (!NILP (window_config))
-    Fset_window_configuration (window_config, Qnil);
+    Fset_window_configuration (window_config, Qnil, Qnil);
 }
 
 #define STOP_POLLING                                   \
diff --git a/src/keymap.c b/src/keymap.c
index bb26b63..fb8ecea 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -3148,12 +3148,6 @@ syms_of_keymap (void)
               doc: /* Default keymap to use when reading from the minibuffer.  
*/);
   Vminibuffer_local_map = Fmake_sparse_keymap (Qnil);
 
-  DEFVAR_LISP ("minibuffer-local-ns-map", Vminibuffer_local_ns_map,
-              doc: /* Local keymap for the minibuffer when spaces are not 
allowed.  */);
-  Vminibuffer_local_ns_map = Fmake_sparse_keymap (Qnil);
-  Fset_keymap_parent (Vminibuffer_local_ns_map, Vminibuffer_local_map);
-
-
   DEFVAR_LISP ("minor-mode-map-alist", Vminor_mode_map_alist,
               doc: /* Alist of keymaps to use for minor modes.
 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read
diff --git a/src/minibuf.c b/src/minibuf.c
index a3c1b99..c4482d7 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -567,7 +567,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
      in previous recursive minibuffer, but was not set explicitly
      to t for this invocation, so set it to nil in this minibuffer.
      Save the old value now, before we change it.  */
-  specbind (intern ("minibuffer-completing-file-name"),
+  specbind (Qminibuffer_completing_file_name,
            Vminibuffer_completing_file_name);
   if (EQ (Vminibuffer_completing_file_name, Qlambda))
     Vminibuffer_completing_file_name = Qnil;
@@ -660,17 +660,14 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
 
   record_unwind_protect_void (minibuffer_unwind);
   record_unwind_protect (restore_window_configuration,
-                         Fcons (Qt, Fcurrent_window_configuration (Qnil)));
+                        list3 (Fcurrent_window_configuration (Qnil), Qt, Qt));
 
   /* If the minibuffer window is on a different frame, save that
      frame's configuration too.  */
   if (!EQ (mini_frame, selected_frame))
     record_unwind_protect (restore_window_configuration,
-                          Fcons (/* Arrange for the frame later to be
-                                     switched back to the calling
-                                     frame. */
-                                  Qnil,
-                                  Fcurrent_window_configuration (mini_frame)));
+                          list3 (Fcurrent_window_configuration (mini_frame),
+                                 Qnil, Qt));
 
   /* If the minibuffer is on an iconified or invisible frame,
      make it visible now.  */
@@ -728,10 +725,10 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
     Vminibuffer_completing_file_name = Qlambda;
 
   /* If variable is unbound, make it nil.  */
-  histval = find_symbol_value (Vminibuffer_history_variable);
+  histval = find_symbol_value (histvar);
   if (EQ (histval, Qunbound))
     {
-      Fset (Vminibuffer_history_variable, Qnil);
+      Fset (histvar, Qnil);
       histval = Qnil;
     }
 
@@ -753,10 +750,6 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
      not work correctly in minibuffers.  (Bug#5715, etc)  */
   bset_truncate_lines (current_buffer, Qnil);
 
-  /* If appropriate, copy enable-multibyte-characters into the minibuffer.  */
-  if (inherit_input_method)
-    bset_enable_multibyte_characters (current_buffer, enable_multibyte);
-
   /* The current buffer's default directory is usually the right thing
      for our minibuffer here.  However, if you're typing a command at
      a minibuffer-only frame when minibuf_level is zero, then buf IS
@@ -808,9 +801,11 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
     specbind (Qinhibit_modification_hooks, Qt);
     Ferase_buffer ();
 
-    if (!NILP (BVAR (current_buffer, enable_multibyte_characters))
-       && ! STRING_MULTIBYTE (minibuf_prompt))
-      minibuf_prompt = Fstring_make_multibyte (minibuf_prompt);
+    /* If appropriate, copy enable-multibyte-characters into the minibuffer.
+       In any case don't blindly inherit the multibyteness used previously.  */
+    bset_enable_multibyte_characters (current_buffer,
+                                      inherit_input_method ? enable_multibyte
+                                      : Qt);
 
     /* Insert the prompt, record where it ends.  */
     Finsert (1, &minibuf_prompt);
@@ -920,13 +915,13 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, 
Lisp_Object prompt,
              && !EQ (XWINDOW (XFRAME (calling_frame)->minibuffer_window)
                      ->frame,
                      calling_frame))))
-    call2 (intern ("select-frame-set-input-focus"), calling_frame, Qnil);
+    call2 (Qselect_frame_set_input_focus, calling_frame, Qnil);
 
   /* Add the value to the appropriate history list, if any.  This is
      done after the previous buffer has been made current again, in
      case the history variable is buffer-local.  */
   if (! (NILP (Vhistory_add_new_input) || NILP (histstring)))
-    call2 (intern ("add-to-history"), histvar, histstring);
+    call2 (Qadd_to_history, histvar, histstring);
 
   /* If Lisp form desired instead of string, parse it.  */
   if (expflag)
@@ -965,13 +960,13 @@ set_minibuffer_mode (Lisp_Object buf, EMACS_INT depth)
   Fset_buffer (buf);
   if (depth > 0)
     {
-      if (!NILP (Ffboundp (intern ("fundamental-mode"))))
-       call0 (intern ("fundamental-mode"));
+      if (!NILP (Ffboundp (Qminibuffer_mode)))
+       call0 (Qminibuffer_mode);
     }
   else
     {
-      if (!NILP (Ffboundp (intern ("minibuffer-inactive-mode"))))
-       call0 (intern ("minibuffer-inactive-mode"));
+      if (!NILP (Ffboundp (Qminibuffer_inactive_mode)))
+       call0 (Qminibuffer_inactive_mode);
       else
        Fkill_all_local_variables ();
     }
@@ -1071,13 +1066,13 @@ read_minibuf_unwind (void)
            goto found;
        }
     }
-  return; /* expired minibuffer not found.  Maybe we should output an
-            error, here. */
+  exp_MB_frame = Qnil;         /* "Can't happen." */
 
  found:
-  if (!EQ (exp_MB_frame, saved_selected_frame))
+  if (!EQ (exp_MB_frame, saved_selected_frame)
+      && !NILP (exp_MB_frame))
     do_switch_frame (exp_MB_frame, 0, 0, Qt); /* This also sets
-                                            minibuff_window */
+                                            minibuf_window */
 
   /* To keep things predictable, in case it matters, let's be in the
      minibuffer when we reset the relevant variables.  Don't depend on
@@ -1163,7 +1158,7 @@ read_minibuf_unwind (void)
      dead, we may keep displaying this buffer (tho it's inactive), so reset it,
      to make sure we don't leave around bindings and stuff which only
      made sense during the read_minibuf invocation.  */
-  call0 (intern ("minibuffer-inactive-mode"));
+  call0 (Qminibuffer_inactive_mode);
 
   /* We've exited the recursive edit, so switch the current windows
      away from the expired minibuffer window, both in the current
@@ -1187,7 +1182,8 @@ read_minibuf_unwind (void)
     }
 
   /* Restore the selected frame. */
-  if (!EQ (exp_MB_frame, saved_selected_frame))
+  if (!EQ (exp_MB_frame, saved_selected_frame)
+      && !NILP (exp_MB_frame))
     do_switch_frame (saved_selected_frame, 0, 0, Qt);
 }
 
@@ -1202,6 +1198,7 @@ minibuffer_unwind (void)
   Lisp_Object window;
   Lisp_Object entry;
 
+  if (NILP (exp_MB_frame)) return; /* "Can't happen." */
   f = XFRAME (exp_MB_frame);
   window = f->minibuffer_window;
   w = XWINDOW (window);
@@ -1362,30 +1359,6 @@ Fifth arg INHERIT-INPUT-METHOD, if non-nil, means the 
minibuffer inherits
   return unbind_to (count, val);
 }
 
-DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 
1, 3, 0,
-       doc: /* Read a string from the terminal, not allowing blanks.
-Prompt with PROMPT.  Whitespace terminates the input.  If INITIAL is
-non-nil, it should be a string, which is used as initial input, with
-point positioned at the end, so that SPACE will accept the input.
-\(Actually, INITIAL can also be a cons of a string and an integer.
-Such values are treated as in `read-from-minibuffer', but are normally
-not useful in this function.)
-
-Third arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits
-the current input method and the setting of`enable-multibyte-characters'.
-
-If `inhibit-interaction' is non-nil, this function will signal an
-`inhibited-interaction' error.  */)
-  (Lisp_Object prompt, Lisp_Object initial, Lisp_Object inherit_input_method)
-{
-  CHECK_STRING (prompt);
-  barf_if_interaction_inhibited ();
-
-  return read_minibuf (Vminibuffer_local_ns_map, initial, prompt,
-                      0, Qminibuffer_history, make_fixnum (0), Qnil, 0,
-                      !NILP (inherit_input_method));
-}
-
 DEFUN ("read-command", Fread_command, Sread_command, 1, 2, 0,
        doc: /* Read the name of a command and return as a symbol.
 Prompt with PROMPT.  By default, return DEFAULT-VALUE or its first element
@@ -2023,7 +1996,8 @@ HIST, if non-nil, specifies a history list and optionally 
the initial
   (This is the only case in which you should use INITIAL-INPUT instead
   of DEF.)  Positions are counted starting from 1 at the beginning of
   the list.  The variable `history-length' controls the maximum length
-  of a history list.
+  of a history list.  If HIST is the symbol `t', history is not
+  recorded.
 
 DEF, if non-nil, is the default value or the list of default values.
 
@@ -2332,6 +2306,12 @@ syms_of_minibuf (void)
   /* A frame parameter.  */
   DEFSYM (Qminibuffer_exit, "minibuffer-exit");
 
+  DEFSYM (Qminibuffer_mode, "minibuffer-mode");
+  DEFSYM (Qminibuffer_inactive_mode, "minibuffer-inactive-mode");
+  DEFSYM (Qminibuffer_completing_file_name, "minibuffer-completing-file-name");
+  DEFSYM (Qselect_frame_set_input_focus, "select-frame-set-input-focus");
+  DEFSYM (Qadd_to_history, "add-to-history");
+
   DEFVAR_LISP ("read-expression-history", Vread_expression_history,
               doc: /* A history list for arguments that are Lisp expressions 
to evaluate.
 For example, `eval-expression' uses this.  */);
@@ -2512,7 +2492,6 @@ instead. */);
   defsubr (&Sread_variable);
   defsubr (&Sinternal_complete_buffer);
   defsubr (&Sread_buffer);
-  defsubr (&Sread_no_blanks_input);
   defsubr (&Sminibuffer_depth);
   defsubr (&Sminibuffer_prompt);
 
diff --git a/src/w32fns.c b/src/w32fns.c
index 9db367b..c07f32a 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -7434,6 +7434,8 @@ DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
   set_window_buffer (window, tip_buf, false, false);
   w = XWINDOW (window);
   w->pseudo_window_p = true;
+  /* Try to avoid that `other-window' select us (Bug#47207).  */
+  Fset_window_parameter (window, Qno_other_window, Qt);
 
   /* Set up the frame's root window.  Note: The following code does not
      try to size the window or its frame correctly.  Its only purpose is
diff --git a/src/window.c b/src/window.c
index 7c238a3..5134c3d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -504,10 +504,18 @@ select_window (Lisp_Object window, Lisp_Object norecord,
 {
   struct window *w;
   struct frame *sf;
+  Lisp_Object frame;
+  struct frame *f;
 
   CHECK_LIVE_WINDOW (window);
 
   w = XWINDOW (window);
+  frame = WINDOW_FRAME (w);
+  f = XFRAME (frame);
+
+  if (FRAME_TOOLTIP_P (f))
+    /* Do not select a tooltip window (Bug#47207).  */
+    error ("Cannot select a tooltip window");
 
   /* Make the selected window's buffer current.  */
   Fset_buffer (w->contents);
@@ -528,14 +536,14 @@ select_window (Lisp_Object window, Lisp_Object norecord,
     redisplay_other_windows ();
 
   sf = SELECTED_FRAME ();
-  if (XFRAME (WINDOW_FRAME (w)) != sf)
+  if (f != sf)
     {
-      fset_selected_window (XFRAME (WINDOW_FRAME (w)), window);
+      fset_selected_window (f, window);
       /* Use this rather than Fhandle_switch_frame
         so that FRAME_FOCUS_FRAME is moved appropriately as we
         move around in the state where a minibuffer in a separate
         frame is active.  */
-      Fselect_frame (WINDOW_FRAME (w), norecord);
+      Fselect_frame (frame, norecord);
       /* Fselect_frame called us back so we've done all the work already.  */
       eassert (EQ (window, selected_window));
       return window;
@@ -2596,7 +2604,7 @@ candidate_window_p (Lisp_Object window, Lisp_Object 
owindow,
     candidate_p = false;
   else if (MINI_WINDOW_P (w)
            && (EQ (minibuf, Qlambda)
-              || (WINDOWP (minibuf) && !EQ (minibuf, window))))
+              || (WINDOW_LIVE_P (minibuf) && !EQ (minibuf, window))))
     {
       /* If MINIBUF is `lambda' don't consider any mini-windows.
          If it is a window, consider only that one.  */
@@ -2640,7 +2648,8 @@ candidate_window_p (Lisp_Object window, Lisp_Object 
owindow,
     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));
+                   && (EQ (minibuf, Qt)
+                      || !is_minibuffer (0, XWINDOW (all_frames)->contents)));
   else if (FRAMEP (all_frames))
     candidate_p = EQ (all_frames, w->frame);
 
@@ -2659,12 +2668,12 @@ decode_next_window_args (Lisp_Object *window, 
Lisp_Object *minibuf, Lisp_Object
   Lisp_Object miniwin = XFRAME (w->frame)->minibuffer_window;
 
   XSETWINDOW (*window, w);
-  /* MINIBUF nil may or may not include minibuffers.  Decide if it
-     does.  */
-  if (NILP (*minibuf))
-    *minibuf = this_minibuffer_depth (XWINDOW (miniwin)->contents)
-      ? miniwin
-      : Qlambda;
+  /* MINIBUF nil may or may not include minibuffer windows.  Decide if
+     it does.  But first make sure that this frame's minibuffer window
+     is live (Bug#47207).  */
+  if (WINDOW_LIVE_P (miniwin) && NILP (*minibuf))
+    *minibuf = (this_minibuffer_depth (XWINDOW (miniwin)->contents)
+               ? miniwin : Qlambda);
   else if (!EQ (*minibuf, Qt))
     *minibuf = Qlambda;
 
@@ -2675,9 +2684,10 @@ decode_next_window_args (Lisp_Object *window, 
Lisp_Object *minibuf, Lisp_Object
   /* ALL_FRAMES nil doesn't specify which frames to include.  */
   if (NILP (*all_frames))
     *all_frames
-      = (!EQ (*minibuf, Qlambda)
-        ? FRAME_MINIBUF_WINDOW (XFRAME (w->frame))
-        : Qnil);
+      /* Once more make sure that this frame's minibuffer window is live
+        before including it (Bug#47207).  */
+      = ((WINDOW_LIVE_P (miniwin) && !EQ (*minibuf, Qlambda))
+        ? miniwin : Qnil);
   else if (EQ (*all_frames, Qvisible))
     ;
   else if (EQ (*all_frames, make_fixnum (0)))
@@ -6871,19 +6881,22 @@ DEFUN ("window-configuration-frame", 
Fwindow_configuration_frame, Swindow_config
 }
 
 DEFUN ("set-window-configuration", Fset_window_configuration,
-       Sset_window_configuration, 1, 2, 0,
+       Sset_window_configuration, 1, 3, 0,
        doc: /* Set the configuration of windows and buffers as specified by 
CONFIGURATION.
 CONFIGURATION must be a value previously returned
 by `current-window-configuration' (which see).
 
 Normally, this function selects the frame of the CONFIGURATION, but if
 DONT-SET-FRAME is non-nil, it leaves selected the frame which was
-current at the start of the function.
+current at the start of the function.  If DONT-SET-MINIWINDOW is non-nil,
+the mini-window of the frame doesn't get set to the corresponding element
+of CONFIGURATION.
 
 If CONFIGURATION was made from a frame that is now deleted,
 only frame-independent values can be restored.  In this case,
 the return value is nil.  Otherwise the value is t.  */)
-  (Lisp_Object configuration, Lisp_Object dont_set_frame)
+  (Lisp_Object configuration, Lisp_Object dont_set_frame,
+   Lisp_Object dont_set_miniwindow)
 {
   register struct save_window_data *data;
   struct Lisp_Vector *saved_windows;
@@ -7094,8 +7107,10 @@ the return value is nil.  Otherwise the value is t.  */)
                }
            }
 
-         if (BUFFERP (p->buffer) && BUFFER_LIVE_P (XBUFFER (p->buffer)))
-           /* If saved buffer is alive, install it.  */
+         if ((NILP (dont_set_miniwindow) || !MINI_WINDOW_P (w))
+             && BUFFERP (p->buffer) && BUFFER_LIVE_P (XBUFFER (p->buffer)))
+           /* If saved buffer is alive, install it, unless it's a
+              minibuffer we explicitly prohibit.  */
            {
              wset_buffer (w, p->buffer);
              w->start_at_line_beg = !NILP (p->start_at_line_beg);
@@ -7248,9 +7263,11 @@ void
 restore_window_configuration (Lisp_Object configuration)
 {
   if (CONSP (configuration))
-    Fset_window_configuration (XCDR (configuration), XCAR (configuration));
+    Fset_window_configuration (XCAR (configuration),
+                              XCAR (XCDR (configuration)),
+                              XCAR (XCDR (XCDR (configuration))));
   else
-    Fset_window_configuration (configuration, Qnil);
+    Fset_window_configuration (configuration, Qnil, Qnil);
 }
 
 
@@ -8232,6 +8249,7 @@ syms_of_window (void)
   DEFSYM (Qmode_line_format, "mode-line-format");
   DEFSYM (Qheader_line_format, "header-line-format");
   DEFSYM (Qtab_line_format, "tab-line-format");
+  DEFSYM (Qno_other_window, "no-other-window");
 
   DEFVAR_LISP ("temp-buffer-show-function", Vtemp_buffer_show_function,
               doc: /* Non-nil means call as function to display a help buffer.
diff --git a/src/xdisp.c b/src/xdisp.c
index fecf1f6..dd7a4a8 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10064,8 +10064,20 @@ move_it_to (struct it *it, ptrdiff_t to_charpos, int 
to_x, int to_y, int to_vpos
          if ((op & MOVE_TO_POS) != 0
              && (IT_CHARPOS (*it) > to_charpos
                  || (IT_CHARPOS (*it) == to_charpos
+                     /* Consider TO_CHARPOS as REACHED if we are at
+                        EOB that ends in something other than a newline.  */
                      && to_charpos == ZV
-                     && (ZV_BYTE <= 1 || FETCH_BYTE (ZV_BYTE - 1) != '\n'))))
+                     && (ZV_BYTE <= 1 || FETCH_BYTE (ZV_BYTE - 1) != '\n')
+                     /* But if we have a display or an overlay string
+                        at EOB, keep going until we exhaust all the
+                        characters of the string(s).  */
+                     && (it->sp == 0
+                         || (STRINGP (it->string)
+                             && (it->current.overlay_string_index < 0
+                                 || (it->current.overlay_string_index >= 0
+                                     && it->current.overlay_string_index
+                                        >= it->n_overlay_strings - 1))
+                             && IT_STRING_CHARPOS (*it) >= it->end_charpos)))))
            {
              reached = 9;
              goto out;
diff --git a/src/xfns.c b/src/xfns.c
index 0507dc8..f120653 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -7076,6 +7076,8 @@ Text larger than the specified size is clipped.  */)
   set_window_buffer (window, tip_buf, false, false);
   w = XWINDOW (window);
   w->pseudo_window_p = true;
+  /* Try to avoid that `other-window' select us (Bug#47207).  */
+  Fset_window_parameter (window, Qno_other_window, Qt);
 
   /* Set up the frame's root window.  Note: The following code does not
      try to size the window or its frame correctly.  Its only purpose is
diff --git a/test/lisp/autorevert-tests.el b/test/lisp/autorevert-tests.el
index 5f27c2e..3e97e9c 100644
--- a/test/lisp/autorevert-tests.el
+++ b/test/lisp/autorevert-tests.el
@@ -1,4 +1,4 @@
-;;; auto-revert-tests.el --- Tests of auto-revert   -*- lexical-binding: t -*-
+;;; autorevert-tests.el --- Tests of auto-revert   -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/calendar/icalendar-tests.el 
b/test/lisp/calendar/icalendar-tests.el
index 61d3c11..6973f7e 100644
--- a/test/lisp/calendar/icalendar-tests.el
+++ b/test/lisp/calendar/icalendar-tests.el
@@ -1,4 +1,4 @@
-;; icalendar-tests.el --- Test suite for icalendar.el  -*- lexical-binding:t 
-*-
+;;; icalendar-tests.el --- Test suite for icalendar.el  -*- lexical-binding:t 
-*-
 
 ;; Copyright (C) 2005, 2008-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/calendar/parse-time-tests.el 
b/test/lisp/calendar/parse-time-tests.el
index b90fe0b..b706b73 100644
--- a/test/lisp/calendar/parse-time-tests.el
+++ b/test/lisp/calendar/parse-time-tests.el
@@ -1,4 +1,4 @@
-;; parse-time-tests.el --- Test suite for parse-time.el  -*- lexical-binding:t 
-*-
+;;; parse-time-tests.el --- Test suite for parse-time.el  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/cedet/srecode-utest-template.el 
b/test/lisp/cedet/srecode-utest-template.el
index f97ff18..087dcfd 100644
--- a/test/lisp/cedet/srecode-utest-template.el
+++ b/test/lisp/cedet/srecode-utest-template.el
@@ -1,4 +1,4 @@
-;;; srecode/test.el --- SRecode Core Template tests. -*- lexical-binding:t -*-
+;;; srecode-utest-template.el --- SRecode Core Template tests. -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 2008-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/custom-resources/custom--test-theme.el 
b/test/lisp/custom-resources/custom--test-theme.el
index 4ced98a..122bd79 100644
--- a/test/lisp/custom-resources/custom--test-theme.el
+++ b/test/lisp/custom-resources/custom--test-theme.el
@@ -1,4 +1,4 @@
-;;; custom--test-theme.el -- A test theme.  -*- lexical-binding:t -*-
+;;; custom--test-theme.el --- A test theme.  -*- lexical-binding:t -*-
 
 (deftheme custom--test
   "A test theme.")
diff --git a/test/lisp/descr-text-tests.el b/test/lisp/descr-text-tests.el
index 6ba455b..2052dc0 100644
--- a/test/lisp/descr-text-tests.el
+++ b/test/lisp/descr-text-tests.el
@@ -1,4 +1,4 @@
-;;; descr-text-test.el --- ERT tests for descr-text.el -*- lexical-binding: t 
-*-
+;;; descr-text-tests.el --- ERT tests for descr-text.el -*- lexical-binding: t 
-*-
 
 ;; Copyright (C) 2014, 2016-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el 
b/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el
index 285616a..9f9bb73 100644
--- a/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el
+++ b/test/lisp/emacs-lisp/eieio-tests/eieio-test-methodinvoke.el
@@ -1,4 +1,4 @@
-;;; eieio-testsinvoke.el -- eieio tests for method invocation  -*- 
lexical-binding:t -*-
+;;; eieio-test-methodinvoke.el --- eieio tests for method invocation  -*- 
lexical-binding:t -*-
 
 ;; Copyright (C) 2005, 2008, 2010, 2013-2021 Free Software Foundation,
 ;; Inc.
diff --git a/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el 
b/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el
index a47fb80..11ffc11 100644
--- a/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el
+++ b/test/lisp/emacs-lisp/eieio-tests/eieio-tests.el
@@ -1,4 +1,4 @@
-;;; eieio-tests.el -- eieio test routines -*- lexical-binding: t -*-
+;;; eieio-tests.el --- eieio test routines -*- lexical-binding: t -*-
 
 ;; Copyright (C) 1999-2003, 2005-2010, 2012-2021 Free Software
 ;; Foundation, Inc.
diff --git a/test/lisp/eshell/em-hist-tests.el 
b/test/lisp/eshell/em-hist-tests.el
index ec65397..31967a6 100644
--- a/test/lisp/eshell/em-hist-tests.el
+++ b/test/lisp/eshell/em-hist-tests.el
@@ -1,4 +1,4 @@
-;;; tests/em-hist-tests.el --- em-hist test suite  -*- lexical-binding:t -*-
+;;; em-hist-tests.el --- em-hist test suite  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/eshell/em-ls-tests.el b/test/lisp/eshell/em-ls-tests.el
index fc2cd9c..5d1742b 100644
--- a/test/lisp/eshell/em-ls-tests.el
+++ b/test/lisp/eshell/em-ls-tests.el
@@ -1,4 +1,4 @@
-;;; tests/em-ls-tests.el --- em-ls test suite  -*- lexical-binding:t -*-
+;;; em-ls-tests.el --- em-ls test suite  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/eshell/esh-opt-tests.el 
b/test/lisp/eshell/esh-opt-tests.el
index 0c99da6..e2a0ea5 100644
--- a/test/lisp/eshell/esh-opt-tests.el
+++ b/test/lisp/eshell/esh-opt-tests.el
@@ -1,4 +1,4 @@
-;;; tests/esh-opt-tests.el --- esh-opt test suite  -*- lexical-binding:t -*-
+;;; esh-opt-tests.el --- esh-opt test suite  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2018-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el
index 4dac702..4f0cc9b 100644
--- a/test/lisp/eshell/eshell-tests.el
+++ b/test/lisp/eshell/eshell-tests.el
@@ -1,4 +1,4 @@
-;;; tests/eshell-tests.el --- Eshell test suite  -*- lexical-binding:t -*-
+;;; eshell-tests.el --- Eshell test suite  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1999-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/gnus/message-tests.el b/test/lisp/gnus/message-tests.el
index 8650053..36ec8c5 100644
--- a/test/lisp/gnus/message-tests.el
+++ b/test/lisp/gnus/message-tests.el
@@ -1,4 +1,4 @@
-;;; message-mode-tests.el --- Tests for message-mode  -*- lexical-binding: t; 
-*-
+;;; message-tests.el --- Tests for message-mode  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/info-xref-tests.el b/test/lisp/info-xref-tests.el
index 95af21f..ecba861 100644
--- a/test/lisp/info-xref-tests.el
+++ b/test/lisp/info-xref-tests.el
@@ -1,4 +1,4 @@
-;;; info-xref.el --- tests for info-xref.el  -*- lexical-binding:t -*-
+;;; info-xref-tests.el --- tests for info-xref.el  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2013-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/international/ucs-normalize-tests.el 
b/test/lisp/international/ucs-normalize-tests.el
index a2da737..51f4ed3 100644
--- a/test/lisp/international/ucs-normalize-tests.el
+++ b/test/lisp/international/ucs-normalize-tests.el
@@ -1,4 +1,4 @@
-;;; ucs-normalize --- tests for international/ucs-normalize.el -*- 
lexical-binding: t -*-
+;;; ucs-normalize-tests.el --- tests for international/ucs-normalize.el -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index 791e51c..6ab5f57 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -83,7 +83,12 @@
   (let* ((origtable '("A-hello" "A-there"))
          (subvtable (completion-table-subvert origtable "B" "A")))
     (should (equal (try-completion "B-hel" subvtable)
-                   "B-hello"))))
+                   "B-hello"))
+    (should (equal (all-completions "B-hel" subvtable) '("-hello")))
+    (should (test-completion "B-hello" subvtable))
+    (should (equal (completion-boundaries "B-hel" subvtable
+                                          nil "suffix")
+                   '(1 . 6)))))
 
 (ert-deftest completion-table-test-quoting ()
   (let ((process-environment
@@ -131,5 +136,57 @@
   (should (equal (completion-pcm--optimize-pattern '(any "" any))
                  '(any))))
 
+(defun test-completion-all-sorted-completions (base def history-var 
history-list)
+  (with-temp-buffer
+    (insert base)
+    (cl-letf (((symbol-function #'minibufferp) (lambda (&rest _) t)))
+      (let ((completion-styles '(basic))
+            (completion-category-defaults nil)
+            (completion-category-overrides nil)
+            (minibuffer-history-variable history-var)
+            (minibuffer-history history-list)
+            (minibuffer-default def)
+            (minibuffer-completion-table
+             (lambda (str pred action)
+               (pcase action
+                 (`(boundaries . ,_) `(boundaries ,(length base) . 0))
+                 (_ (complete-with-action
+                     action
+                     '("epsilon" "alpha" "gamma" "beta" "delta")
+                     (substring str (length base)) pred))))))
+        (completion-all-sorted-completions)))))
+
+(ert-deftest completion-all-sorted-completions ()
+  ;; No base, disabled history, no default
+  (should (equal (test-completion-all-sorted-completions
+                  "" nil t nil)
+                 `("beta" "alpha" "delta" "gamma" "epsilon" . 0)))
+  ;; No base, disabled history, default string
+  (should (equal (test-completion-all-sorted-completions
+                  "" "gamma" t nil)
+                 `("gamma" "beta" "alpha" "delta" "epsilon" . 0)))
+  ;; No base, empty history, default string
+  (should (equal (test-completion-all-sorted-completions
+                  "" "gamma" 'minibuffer-history nil)
+                 `("gamma" "beta" "alpha" "delta" "epsilon" . 0)))
+  ;; No base, empty history, default list
+  (should (equal (test-completion-all-sorted-completions
+                  "" '("gamma" "zeta") 'minibuffer-history nil)
+                 `("gamma" "beta" "alpha" "delta" "epsilon" . 0)))
+  ;; No base, history, default string
+  (should (equal (test-completion-all-sorted-completions
+                  "" "gamma" 'minibuffer-history '("other" "epsilon" "delta"))
+                 `("gamma" "epsilon" "delta" "beta" "alpha"  . 0)))
+  ;; Base, history, default string
+  (should (equal (test-completion-all-sorted-completions
+                  "base/" "base/gamma" 'minibuffer-history
+                  '("some/alpha" "base/epsilon" "base/delta"))
+                 `("gamma" "epsilon" "delta" "beta" "alpha"  . 5)))
+  ;; Base, history, default string
+  (should (equal (test-completion-all-sorted-completions
+                  "base/" "gamma" 'minibuffer-history
+                  '("some/alpha" "base/epsilon" "base/delta"))
+                 `("epsilon" "delta" "beta" "alpha" "gamma"  . 5))))
+
 (provide 'minibuffer-tests)
 ;;; minibuffer-tests.el ends here
diff --git a/test/lisp/net/nsm-tests.el b/test/lisp/net/nsm-tests.el
index ff45331..1a35ec3 100644
--- a/test/lisp/net/nsm-tests.el
+++ b/test/lisp/net/nsm-tests.el
@@ -1,4 +1,4 @@
-;;; network-stream-tests.el --- tests for network security manager -*- 
lexical-binding: t; -*-
+;;; nsm-tests.el --- tests for network security manager  -*- lexical-binding: 
t; -*-
 
 ;; Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/net/shr-tests.el b/test/lisp/net/shr-tests.el
index a06e31a..ed532af 100644
--- a/test/lisp/net/shr-tests.el
+++ b/test/lisp/net/shr-tests.el
@@ -1,4 +1,4 @@
-;;; network-stream-tests.el --- tests for network processes       -*- 
lexical-binding: t; -*-
+;;; shr-tests.el --- tests for shr.el  -*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/play/cookie1-tests.el b/test/lisp/play/cookie1-tests.el
index d63ecb9..75dea4e 100644
--- a/test/lisp/play/cookie1-tests.el
+++ b/test/lisp/play/cookie1-tests.el
@@ -1,4 +1,4 @@
-;;; fortune-tests.el --- Tests for fortune.el  -*- lexical-binding: t -*-
+;;; cookie1-tests.el --- Tests for cookie1.el  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/progmodes/cperl-mode-tests.el 
b/test/lisp/progmodes/cperl-mode-tests.el
index 14bc48b..9867aa8 100644
--- a/test/lisp/progmodes/cperl-mode-tests.el
+++ b/test/lisp/progmodes/cperl-mode-tests.el
@@ -1,4 +1,4 @@
-;;; cperl-mode-tests --- Test for cperl-mode  -*- lexical-binding: t -*-
+;;; cperl-mode-tests.el --- Test for cperl-mode  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
 
@@ -495,4 +495,33 @@ as that quote like operator."
                          'font-lock-constant-face
                        font-lock-string-face))))))
 
+(ert-deftest cperl-test-hyperactive-electric-else ()
+  "Demonstrate cperl-electric-else behavior.
+If `cperl-electric-keywords' is true, keywords like \"else\" and
+\"continue\" are expanded by a following empty block, with the
+cursor in the appropriate position to write that block.  This,
+however, must not happen when the keyword occurs in a variable
+\"$else\" or \"$continue\"."
+  (skip-unless (eq cperl-test-mode #'cperl-mode))
+  ;; `self-insert-command' takes a second argument only since Emacs 27
+  (skip-unless (not (< emacs-major-version 27)))
+  (with-temp-buffer
+    (setq cperl-electric-keywords t)
+    (cperl-mode)
+    (insert "continue")
+    (self-insert-command 1 ?\ )
+    (indent-region (point-min) (point-max))
+    (goto-char (point-min))
+    ;; cperl-mode creates a block here
+    (should (search-forward-regexp "continue {\n[[:blank:]]+\n}")))
+  (with-temp-buffer
+    (setq cperl-electric-keywords t)
+    (cperl-mode)
+    (insert "$continue")
+    (self-insert-command 1 ?\ )
+    (indent-region (point-min) (point-max))
+    (goto-char (point-min))
+    ;; No block should have been created here
+    (should-not (search-forward-regexp "{" nil t))))
+
 ;;; cperl-mode-tests.el ends here
diff --git a/test/lisp/progmodes/perl-mode-tests.el 
b/test/lisp/progmodes/perl-mode-tests.el
index 9f6800c..f63f8ad 100644
--- a/test/lisp/progmodes/perl-mode-tests.el
+++ b/test/lisp/progmodes/perl-mode-tests.el
@@ -1,4 +1,4 @@
-;;; perl-mode-tests --- Test for perl-mode  -*- lexical-binding: t -*-
+;;; perl-mode-tests.el --- Test for perl-mode  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/progmodes/project-tests.el 
b/test/lisp/progmodes/project-tests.el
index 23e6854..c8c03aa 100644
--- a/test/lisp/progmodes/project-tests.el
+++ b/test/lisp/progmodes/project-tests.el
@@ -27,18 +27,59 @@
 
 (require 'project)
 
+(require 'cl-lib)
 (require 'ert)
+(require 'grep)
+(require 'xref)
+
+(defmacro project-tests--with-temporary-directory (var &rest body)
+  "Create a new temporary directory.
+Bind VAR to the name of the directory, and evaluate BODY.  Delete
+the directory after BODY exits."
+  (declare (debug (symbolp body)) (indent 1))
+  (cl-check-type var symbol)
+  (let ((directory (make-symbol "directory")))
+    `(let ((,directory (make-temp-file "project-tests-" :directory)))
+       (unwind-protect
+           (let ((,var ,directory))
+             ,@body)
+         (delete-directory ,directory :recursive)))))
 
 (ert-deftest project/quoted-directory ()
-  "Check that `project-files' deals with quoted directory
-names (Bug#47799)."
-  (let ((directory (make-temp-file "project-tests-" :directory)))
-    (unwind-protect
-        (let ((project (cons 'transient (file-name-quote directory)))
-              (file (expand-file-name "file" directory)))
-          (make-empty-file file)
-          (should (equal (project-files project)
-                         (list (file-name-quote file)))))
-      (delete-directory directory :recursive))))
+  "Check that `project-files' and `project-find-regexp' deal with
+quoted directory names (Bug#47799)."
+  (skip-unless (executable-find find-program))
+  (skip-unless (executable-find "xargs"))
+  (skip-unless (executable-find "grep"))
+  (project-tests--with-temporary-directory directory
+    (let ((default-directory directory)
+          (project-current-inhibit-prompt t)
+          (project-find-functions nil)
+          (project-list-file
+           (expand-file-name "projects" directory))
+          (project (cons 'transient (file-name-quote directory)))
+          (file (expand-file-name "file" directory)))
+      (add-hook 'project-find-functions (lambda (_dir) project))
+      (should (eq (project-current) project))
+      (write-region "contents" nil file nil nil nil 'excl)
+      (should (equal (project-files project)
+                     (list (file-name-quote file))))
+      (let* ((references nil)
+             (xref-search-program 'grep)
+             (xref-show-xrefs-function
+              (lambda (fetcher _display)
+                (push (funcall fetcher) references))))
+        (project-find-regexp "tent")
+        (pcase references
+          (`((,item))
+           ;; FIXME: Shouldn't `xref-match-item' be a subclass of
+           ;; `xref-item'?
+           (should (cl-typep item '(or xref-item xref-match-item)))
+           (should (file-equal-p
+                    (xref-location-group (xref-item-location item))
+                    file)))
+          (otherwise
+           (ert-fail (format-message "Unexpected references: %S"
+                                     otherwise))))))))
 
 ;;; project-tests.el ends here
diff --git a/test/lisp/progmodes/xref-tests.el 
b/test/lisp/progmodes/xref-tests.el
index c25bbd9..66099dc 100644
--- a/test/lisp/progmodes/xref-tests.el
+++ b/test/lisp/progmodes/xref-tests.el
@@ -156,3 +156,5 @@
                  (cl-every (lambda (e1 e2)
                              (string-match-p e1 e2))
                            expected actual)))))
+
+;;; xref-tests.el ends here
diff --git a/test/lisp/simple-tests.el b/test/lisp/simple-tests.el
index 601eca6..4b153d1 100644
--- a/test/lisp/simple-tests.el
+++ b/test/lisp/simple-tests.el
@@ -1,4 +1,4 @@
-;;; simple-test.el --- Tests for simple.el           -*- lexical-binding: t; 
-*-
+;;; simple-tests.el --- Tests for simple.el           -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/textmodes/fill-tests.el 
b/test/lisp/textmodes/fill-tests.el
index 21efe62..a4c7f44 100644
--- a/test/lisp/textmodes/fill-tests.el
+++ b/test/lisp/textmodes/fill-tests.el
@@ -1,4 +1,4 @@
-;;; fill-test.el --- ERT tests for fill.el -*- lexical-binding: t -*-
+;;; fill-tests.el --- ERT tests for fill.el -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/textmodes/tildify-tests.el 
b/test/lisp/textmodes/tildify-tests.el
index 59c2394..3ee3cd6 100644
--- a/test/lisp/textmodes/tildify-tests.el
+++ b/test/lisp/textmodes/tildify-tests.el
@@ -1,4 +1,4 @@
-;;; tildify-test.el --- ERT tests for tildify.el -*- lexical-binding: t -*-
+;;; tildify-tests.el --- ERT tests for tildify.el -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2014-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/thingatpt-tests.el b/test/lisp/thingatpt-tests.el
index 62a27f0..07eb8bb 100644
--- a/test/lisp/thingatpt-tests.el
+++ b/test/lisp/thingatpt-tests.el
@@ -1,4 +1,4 @@
-;;; thingatpt.el --- tests for thing-at-point.  -*- lexical-binding:t -*-
+;;; thingatpt-tests.el --- tests for thing-at-point.  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2013-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/vc/vc-bzr-tests.el b/test/lisp/vc/vc-bzr-tests.el
index aeab51e..b02dce8 100644
--- a/test/lisp/vc/vc-bzr-tests.el
+++ b/test/lisp/vc/vc-bzr-tests.el
@@ -1,4 +1,4 @@
-;;; vc-bzr.el --- tests for vc/vc-bzr.el  -*- lexical-binding: t -*-
+;;; vc-bzr-tests.el --- tests for vc/vc-bzr.el  -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2011-2021 Free Software Foundation, Inc.
 
diff --git a/test/lisp/xml-tests.el b/test/lisp/xml-tests.el
index cd3e113..b00b58a 100644
--- a/test/lisp/xml-tests.el
+++ b/test/lisp/xml-tests.el
@@ -1,4 +1,4 @@
-;;; xml-parse-tests.el --- Test suite for XML parsing.  -*- lexical-binding:t 
-*-
+;;; xml-tests.el --- Test suite for XML parsing.  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
diff --git a/test/manual/cedet/semantic-tests.el 
b/test/manual/cedet/semantic-tests.el
index 7169c78..1561c18 100644
--- a/test/manual/cedet/semantic-tests.el
+++ b/test/manual/cedet/semantic-tests.el
@@ -1,4 +1,4 @@
-;;; semantic-utest.el --- Miscellaneous Semantic tests.  -*- lexical-binding: 
t; -*-
+;;; semantic-tests.el --- Miscellaneous Semantic tests.  -*- lexical-binding: 
t; -*-
 
 ;; Copyright (C) 2003-2021  Free Software Foundation, Inc.
 
diff --git a/test/manual/image-size-tests.el b/test/manual/image-size-tests.el
index f7c2bf7..44846a7 100644
--- a/test/manual/image-size-tests.el
+++ b/test/manual/image-size-tests.el
@@ -1,4 +1,4 @@
-;;; image-size-tests.el -- tests for image scaling  -*- lexical-binding: t; -*-
+;;; image-size-tests.el --- tests for image scaling  -*- lexical-binding: t; 
-*-
 
 ;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/manual/image-transforms-tests.el 
b/test/manual/image-transforms-tests.el
index 5342b5e..debb74f 100644
--- a/test/manual/image-transforms-tests.el
+++ b/test/manual/image-transforms-tests.el
@@ -1,4 +1,4 @@
-;;; image-transform-tests.el --- Test suite for image transforms.  -*- 
lexical-binding: t -*-
+;;; image-transforms-tests.el --- Test suite for image transforms.  -*- 
lexical-binding: t -*-
 
 ;; Copyright (C) 2019-2021 Free Software Foundation, Inc.
 
diff --git a/test/manual/scroll-tests.el b/test/manual/scroll-tests.el
index 2f40b2b..dd15d54 100644
--- a/test/manual/scroll-tests.el
+++ b/test/manual/scroll-tests.el
@@ -1,4 +1,4 @@
-;;; scroll-tests.el -- tests for scrolling -*- lexical-binding: t -*-
+;;; scroll-tests.el --- tests for scrolling -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/misc/test-custom-noloads.el b/test/misc/test-custom-noloads.el
index 6fa6a6c..5e95e7d 100644
--- a/test/misc/test-custom-noloads.el
+++ b/test/misc/test-custom-noloads.el
@@ -1,4 +1,4 @@
-;;; test-custom-deps.el --- Test custom noloads  -*- lexical-binding:t -*-
+;;; test-custom-noloads.el --- Test custom noloads  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2021 Free Software Foundation, Inc.
 
@@ -42,4 +42,4 @@
   (cus-test-noloads)
   (should-not cus-test-vars-not-cus-loaded))
 
-;;; test-custom-deps.el ends here
+;;; test-custom-noloads.el ends here
diff --git a/test/src/character-tests.el b/test/src/character-tests.el
index 10fc4db..f630b32 100644
--- a/test/src/character-tests.el
+++ b/test/src/character-tests.el
@@ -1,4 +1,4 @@
-;;; character-tests.el -- tests for character.c  -*- lexical-binding:t -*-
+;;; character-tests.el --- tests for character.c  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2021 Free Software Foundation, Inc.
 
diff --git a/test/src/coding-tests.el b/test/src/coding-tests.el
index 0bdcff2..0309b2b 100644
--- a/test/src/coding-tests.el
+++ b/test/src/coding-tests.el
@@ -359,7 +359,7 @@
        (delete-region (point-min) (point))))))
 
 (defun benchmark-decoder ()
-  (let ((gc-cons-threshold 4000000))
+  (let ((gc-cons-threshold (max gc-cons-threshold 4000000)))
     (insert "Without optimization:\n")
     (dolist (files test-file-list)
       (dolist (file (cdr files))
diff --git a/test/src/editfns-tests.el b/test/src/editfns-tests.el
index ea80da4..a731a95 100644
--- a/test/src/editfns-tests.el
+++ b/test/src/editfns-tests.el
@@ -1,4 +1,4 @@
-;;; editfns-tests.el -- tests for editfns.c  -*- lexical-binding:t -*-
+;;; editfns-tests.el --- tests for editfns.c  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
 
diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el
index af5bc2a..0a68d51 100644
--- a/test/src/emacs-module-tests.el
+++ b/test/src/emacs-module-tests.el
@@ -1,4 +1,4 @@
-;;; emacs-module-tests --- Test GNU Emacs modules.  -*- lexical-binding: t; -*-
+;;; emacs-module-tests.el --- Test GNU Emacs modules.  -*- lexical-binding: t; 
-*-
 
 ;; Copyright 2015-2021 Free Software Foundation, Inc.
 
diff --git a/test/src/fileio-tests.el b/test/src/fileio-tests.el
index 7f193d4..b989c97 100644
--- a/test/src/fileio-tests.el
+++ b/test/src/fileio-tests.el
@@ -1,4 +1,4 @@
-;;; unit tests for src/fileio.c      -*- lexical-binding: t; -*-
+;;; fileio-tests.el --- unit tests for src/fileio.c      -*- lexical-binding: 
t; -*-
 
 ;; Copyright 2017-2021 Free Software Foundation, Inc.
 
diff --git a/test/src/thread-tests.el b/test/src/thread-tests.el
index 0e1ca76..fc7bc74 100644
--- a/test/src/thread-tests.el
+++ b/test/src/thread-tests.el
@@ -1,4 +1,4 @@
-;;; threads.el --- tests for threads. -*- lexical-binding: t -*-
+;;; thread-tests.el --- tests for threads. -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2012-2021 Free Software Foundation, Inc.
 
diff --git a/test/src/timefns-tests.el b/test/src/timefns-tests.el
index e55bd1e..0a450a7 100644
--- a/test/src/timefns-tests.el
+++ b/test/src/timefns-tests.el
@@ -1,4 +1,4 @@
-;;; timefns-tests.el -- tests for timefns.c -*- lexical-binding: t -*-
+;;; timefns-tests.el --- tests for timefns.c -*- lexical-binding: t -*-
 
 ;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
 



reply via email to

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